(#11798) Fix git checkout of revisions
authorMatt Robinson <matt@puppetlabs.com>
Thu, 19 Jan 2012 22:40:49 +0000 (14:40 -0800)
committerMatt Robinson <matt@puppetlabs.com>
Thu, 19 Jan 2012 23:20:40 +0000 (15:20 -0800)
The git provider had some problems checking out SHA1s - it couldn't.
And what's worse, it lied about what it was doing saying that it did
checkout the SHA1.

There was also a bug where if you specified a different branch than you
were on, it was doing a `reset --hard` to the specified branch.  For
example, if master was checked out, and you set "revision => stable", it
would `git reset --hard stable` on the master branch instead of just
checking out stable.  Maybe the original author did this to get around
being unable to checkout when you had local changes, but the --force
flag to checkout will fix that.

With this change, you should now be able to specify a branch, tag, or
SHA1 in the revision attribute and have it work.

lib/puppet/provider/vcsrepo/git.rb

index 6cbda67..7fa755d 100644 (file)
@@ -17,7 +17,7 @@ Puppet::Type.type(:vcsrepo).provide(:git, :parent => Puppet::Provider::Vcsrepo)
         if @resource.value(:ensure) == :bare
           notice "Ignoring revision for bare repository"
         else
-          checkout_or_reset
+          checkout
         end
       end
       if @resource.value(:ensure) != :bare
@@ -67,7 +67,7 @@ Puppet::Type.type(:vcsrepo).provide(:git, :parent => Puppet::Provider::Vcsrepo)
   end
 
   def revision=(desired)
-    checkout_or_reset(desired)
+    checkout(desired)
     if local_branch_revision?(desired)
       # reset instead of pull to avoid merge conflicts. assuming remote is
       # authoritative.
@@ -188,13 +188,11 @@ Puppet::Type.type(:vcsrepo).provide(:git, :parent => Puppet::Provider::Vcsrepo)
     false
   end
 
-  def checkout_or_reset(revision = @resource.value(:revision))
-    if local_branch_revision?
-      reset(revision)
-    elsif tag_revision?
-      at_path { git_with_identity('checkout', revision) }
-    elsif remote_branch_revision?
+  def checkout(revision = @resource.value(:revision))
+    if !local_branch_revision? && remote_branch_revision?
       at_path { git_with_identity('checkout', '-b', revision, '--track', "origin/#{revision}") }
+    else
+      at_path { git_with_identity('checkout', '--force', revision) }
     end
   end