(#11798) Fix git checkout of revisions

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.
This commit is contained in:
Matt Robinson 2012-01-19 14:40:49 -08:00
parent c3dabc322b
commit b931190b32

View File

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