summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.travis.yml4
-rw-r--r--lib/puppet/provider/vcsrepo/git.rb20
-rw-r--r--lib/puppet/provider/vcsrepo/svn.rb6
-rw-r--r--lib/puppet/type/vcsrepo.rb7
-rw-r--r--spec/unit/puppet/provider/vcsrepo/git_spec.rb45
5 files changed, 69 insertions, 13 deletions
diff --git a/.travis.yml b/.travis.yml
index 1c5e71b..ed1b75c 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -29,3 +29,7 @@ matrix:
env: PUPPET_GEM_VERSION="~> 2.7.0"
notifications:
email: false
+# Temporary workaround for broken Rubygems on Travis
+before_install:
+ - gem update --system 2.1.11
+ - gem --version
diff --git a/lib/puppet/provider/vcsrepo/git.rb b/lib/puppet/provider/vcsrepo/git.rb
index 442ea61..c96095b 100644
--- a/lib/puppet/provider/vcsrepo/git.rb
+++ b/lib/puppet/provider/vcsrepo/git.rb
@@ -6,7 +6,7 @@ Puppet::Type.type(:vcsrepo).provide(:git, :parent => Puppet::Provider::Vcsrepo)
##TODO modify the commands below so that the su - is included
optional_commands :git => 'git',
:su => 'su'
- has_features :bare_repositories, :reference_tracking, :ssh_identity, :multiple_remotes, :user
+ has_features :bare_repositories, :reference_tracking, :ssh_identity, :multiple_remotes, :user, :depth
def create
if !@resource.value(:source)
@@ -39,12 +39,10 @@ Puppet::Type.type(:vcsrepo).provide(:git, :parent => Puppet::Provider::Vcsrepo)
def latest
branch = on_branch?
- if branch == 'master'
- return get_revision("#{@resource.value(:remote)}/HEAD")
- elsif branch == '(no branch)'
+ if !branch
return get_revision('HEAD')
else
- return get_revision("#{@resource.value(:remote)}/%s" % branch)
+ return get_revision("#{@resource.value(:remote)}/#{branch}")
end
end
@@ -107,10 +105,10 @@ Puppet::Type.type(:vcsrepo).provide(:git, :parent => Puppet::Provider::Vcsrepo)
end
def update_remote_origin_url
- current = git_with_identity('config', 'remote.origin.url')
+ current = git_with_identity('config', "remote.#{@resource.value(:remote)}.url")
unless @resource.value(:source).nil?
if current.nil? or current.strip != @resource.value(:source)
- git_with_identity('config', 'remote.origin.url', @resource.value(:source))
+ git_with_identity('config', "remote.#{@resource.value(:remote)}.url", @resource.value(:source))
end
end
end
@@ -133,9 +131,15 @@ Puppet::Type.type(:vcsrepo).provide(:git, :parent => Puppet::Provider::Vcsrepo)
def clone_repository(source, path)
check_force
args = ['clone']
+ if @resource.value(:depth) and @resource.value(:depth).to_i > 0
+ args.push('--depth', @resource.value(:depth).to_s)
+ end
if @resource.value(:ensure) == :bare
args << '--bare'
end
+ if @resource.value(:remote) != 'origin'
+ args.push('--origin', @resource.value(:remote))
+ end
if !File.exist?(File.join(@resource.value(:path), '.git'))
args.push(source, path)
Dir.chdir("/") do
@@ -255,7 +259,7 @@ Puppet::Type.type(:vcsrepo).provide(:git, :parent => Puppet::Provider::Vcsrepo)
end
def on_branch?
- at_path { git_with_identity('branch', '-a') }.split(/\n/).grep(/\*/).first.to_s.gsub('*', '').strip
+ at_path { git_with_identity('rev-parse', '--abbrev-ref', 'HEAD').chomp }
end
def tags
diff --git a/lib/puppet/provider/vcsrepo/svn.rb b/lib/puppet/provider/vcsrepo/svn.rb
index e0d5b21..7856acd 100644
--- a/lib/puppet/provider/vcsrepo/svn.rb
+++ b/lib/puppet/provider/vcsrepo/svn.rb
@@ -24,8 +24,10 @@ Puppet::Type.type(:vcsrepo).provide(:svn, :parent => Puppet::Provider::Vcsrepo)
if File.directory?(@resource.value(:path))
# :path is an svn checkout
return true if File.directory?(File.join(@resource.value(:path), '.svn'))
- # :path is an svn server
- return true if svnlook('uuid', @resource.value(:path))
+ if File.directory?(File.join(@resource.value(:path), 'format'))
+ # :path is an svn server
+ return true if svnlook('uuid', @resource.value(:path))
+ end
end
false
end
diff --git a/lib/puppet/type/vcsrepo.rb b/lib/puppet/type/vcsrepo.rb
index ad90ced..1dab2b9 100644
--- a/lib/puppet/type/vcsrepo.rb
+++ b/lib/puppet/type/vcsrepo.rb
@@ -37,6 +37,9 @@ Puppet::Type.newtype(:vcsrepo) do
feature :cvs_rsh,
"The provider understands the CVS_RSH environment variable"
+ feature :depth,
+ "The provider can do shallow clones"
+
ensurable do
attr_accessor :latest
@@ -191,6 +194,10 @@ Puppet::Type.newtype(:vcsrepo) do
desc "The value to be used for the CVS_RSH environment variable."
end
+ newparam :depth, :required_features => [:depth] do
+ desc "The value to be used to do a shallow clone."
+ end
+
autorequire(:package) do
['git', 'git-core']
end
diff --git a/spec/unit/puppet/provider/vcsrepo/git_spec.rb b/spec/unit/puppet/provider/vcsrepo/git_spec.rb
index 15fee53..96c4f19 100644
--- a/spec/unit/puppet/provider/vcsrepo/git_spec.rb
+++ b/spec/unit/puppet/provider/vcsrepo/git_spec.rb
@@ -31,6 +31,33 @@ describe Puppet::Type.type(:vcsrepo).provider(:git_provider) do
end
end
+ context "with a remote not named 'origin'" do
+ it "should execute 'git clone --origin not_origin" do
+ resource[:remote] = 'not_origin'
+ Dir.expects(:chdir).with('/').at_least_once.yields
+ Dir.expects(:chdir).with('/tmp/test').at_least_once.yields
+ provider.expects(:git).with('clone', '--origin', 'not_origin', resource.value(:source), resource.value(:path))
+ provider.expects(:update_submodules)
+ provider.expects(:git).with('branch', '-a').returns(resource.value(:revision))
+ provider.expects(:git).with('checkout', '--force', resource.value(:revision))
+ provider.create
+ end
+ end
+
+ context "with shallow clone enable" do
+ it "should execute 'git clone --depth 1'" do
+ resource[:revision] = 'only/remote'
+ resource[:depth] = 1
+ Dir.expects(:chdir).with('/').at_least_once.yields
+ Dir.expects(:chdir).with('/tmp/test').at_least_once.yields
+ provider.expects(:git).with('clone', '--depth', '1', resource.value(:source), resource.value(:path))
+ provider.expects(:update_submodules)
+ provider.expects(:git).with('branch', '-a').returns(resource.value(:revision))
+ provider.expects(:git).with('checkout', '--force', resource.value(:revision))
+ provider.create
+ end
+ end
+
context "with a revision that is not a remote branch" do
it "should execute 'git clone' and 'git reset --hard'" do
resource[:revision] = 'a-commit-or-tag'
@@ -296,6 +323,18 @@ describe Puppet::Type.type(:vcsrepo).provider(:git_provider) do
end
end
+ context "retrieving the current revision" do
+ before do
+ expects_chdir
+ provider.expects(:git).with('rev-parse', '--abbrev-ref', 'HEAD').returns("foo\n")
+ end
+
+ it "will strip trailing newlines" do
+ provider.expects(:get_revision).with('origin/foo')
+ provider.latest
+ end
+ end
+
describe 'latest?' do
before do
expects_chdir('/tmp/test')
@@ -323,19 +362,19 @@ describe Puppet::Type.type(:vcsrepo).provider(:git_provider) do
end
context 'on master' do
it do
- provider.expects(:git).with('branch', '-a').returns(fixture(:git_branch_a))
+ provider.expects(:git).with('rev-parse', '--abbrev-ref', 'HEAD').returns(fixture(:git_branch_a))
provider.latest.should == 'master'
end
end
context 'no branch' do
it do
- provider.expects(:git).with('branch', '-a').returns(fixture(:git_branch_none))
+ provider.expects(:git).with('rev-parse', '--abbrev-ref', 'HEAD').returns(fixture(:git_branch_none))
provider.latest.should == 'master'
end
end
context 'feature/bar' do
it do
- provider.expects(:git).with('branch', '-a').returns(fixture(:git_branch_feature_bar))
+ provider.expects(:git).with('rev-parse', '--abbrev-ref', 'HEAD').returns(fixture(:git_branch_feature_bar))
provider.latest.should == 'master'
end
end