MODULES-2125 - Allow revision to be passed without source
authorMorgan Haskel <morgan@puppetlabs.com>
Thu, 13 Aug 2015 23:02:22 +0000 (16:02 -0700)
committerMorgan Haskel <morgan@puppetlabs.com>
Fri, 14 Aug 2015 22:32:10 +0000 (15:32 -0700)
Will also work with empty repositories.

lib/puppet/provider/vcsrepo/git.rb
spec/acceptance/create_repo_spec.rb
spec/unit/puppet/provider/vcsrepo/git_spec.rb

index f13802b..7617b13 100644 (file)
@@ -76,7 +76,11 @@ Puppet::Type.type(:vcsrepo).provide(:git, :parent => Puppet::Provider::Vcsrepo)
       #updated and authoritative.
       #TODO might be worthwhile to have an allow_local_changes param to decide
       #whether to reset or pull when we're ensuring latest.
-      at_path { git_with_identity('reset', '--hard', "#{@resource.value(:remote)}/#{desired}") }
+      if @resource.value(:source)
+        at_path { git_with_identity('reset', '--hard', "#{@resource.value(:remote)}/#{desired}") }
+      else
+        at_path { git_with_identity('reset', '--hard', "#{desired}") }
+      end
     end
     #TODO Would this ever reach here if it is bare?
     if @resource.value(:ensure) != :bare && @resource.value(:submodules) == :true
@@ -392,7 +396,17 @@ Puppet::Type.type(:vcsrepo).provide(:git, :parent => Puppet::Provider::Vcsrepo)
   # @return [String] Returns the tag/branch of the current repo if it's up to
   #                  date; otherwise returns the sha of the requested revision.
   def get_revision(rev = 'HEAD')
-    update_references
+    if @resource.value(:source)
+      update_references
+    else
+      status = at_path { git_with_identity('status')}
+      is_it_new = status =~ /Initial commit/
+      if is_it_new
+        status =~ /On branch (.*)/
+        branch = $1
+        return branch
+      end
+    end
     current = at_path { git_with_identity('rev-parse', rev).strip }
     if @resource.value(:revision)
       if tag_revision?
index db0cd29..53a93c9 100644 (file)
@@ -30,6 +30,22 @@ describe 'create a repo' do
     end
   end
 
+  context 'no source but revision provided' do
+    it 'should not fail (MODULES-2125)' do
+      pp = <<-EOS
+      vcsrepo { "#{tmpdir}/testrepo_blank_with_revision_repo":
+        ensure   => present,
+        provider => git,
+        revision => 'master'
+      }
+      EOS
+
+      # Run it twice and test for idempotency
+      apply_manifest(pp, :catch_failures => true)
+      apply_manifest(pp, :catch_changes => true)
+    end
+  end
+
   context 'bare repo' do
     it 'creates a bare repo' do
       pp = <<-EOS
index a240b50..87113fa 100644 (file)
@@ -206,7 +206,7 @@ branches
     before do
       expects_chdir('/tmp/test')
       resource[:revision] = 'currentsha'
-      resource.delete(:source)
+      resource[:source] = 'http://example.com'
       provider.stubs(:git).with('config', 'remote.origin.url').returns('')
       provider.stubs(:git).with('fetch', 'origin') # FIXME
       provider.stubs(:git).with('fetch', '--tags', 'origin')
@@ -272,6 +272,14 @@ branches
       end
     end
 
+    context "when there's no source" do
+      it 'should return the revision' do
+        resource.delete(:source)
+        provider.expects(:git).with('status')
+        provider.expects(:git).with('rev-parse', resource.value(:revision)).returns('currentsha')
+        expect(provider.revision).to eq(resource.value(:revision))
+      end
+    end
   end
 
   context "setting the revision property" do