summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore6
-rw-r--r--lib/puppet/provider/vcsrepo/git.rb21
-rw-r--r--spec/acceptance/clone_repo_spec.rb15
-rw-r--r--spec/unit/puppet/provider/vcsrepo/git_spec.rb36
4 files changed, 61 insertions, 17 deletions
diff --git a/.gitignore b/.gitignore
index ddd2d45..44e004c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,3 +2,9 @@ coverage
.DS_Store
.#*
\#*
+Gemfile.lock
+log
+
+#Intellij
+.idea
+*.iml
diff --git a/lib/puppet/provider/vcsrepo/git.rb b/lib/puppet/provider/vcsrepo/git.rb
index fafe4bf..61044e0 100644
--- a/lib/puppet/provider/vcsrepo/git.rb
+++ b/lib/puppet/provider/vcsrepo/git.rb
@@ -79,12 +79,18 @@ Puppet::Type.type(:vcsrepo).provide(:git, :parent => Puppet::Provider::Vcsrepo)
def revision=(desired)
checkout(desired)
- if local_branch_revision?(desired)
+ if local_branch_revision?
# reset instead of pull to avoid merge conflicts. assuming remote is
# authoritative.
# 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}") }
+ at_path {
+ git_with_identity('reset', '--hard', "#{@resource.value(:remote)}/#{desired}")
+ if detached?
+ git_with_identity('checkout', "#{@resource.value(:revision)}")
+ git_with_identity('pull')
+ end
+ }
end
if @resource.value(:ensure) != :bare
update_submodules
@@ -259,7 +265,16 @@ Puppet::Type.type(:vcsrepo).provide(:git, :parent => Puppet::Provider::Vcsrepo)
end
def on_branch?
- at_path { git_with_identity('rev-parse', '--abbrev-ref', 'HEAD').chomp }
+ at_path {
+ matches = git_with_identity('branch', '-a').match /\*\s+(.*)/
+ matches[1] unless matches[1].match /detached/
+ }
+ end
+
+ def detached?
+ at_path {
+ git_with_identity('branch', '-a').match /\*\s+\(detached from.*\)/
+ }
end
def tags
diff --git a/spec/acceptance/clone_repo_spec.rb b/spec/acceptance/clone_repo_spec.rb
index 4e2db19..1797c64 100644
--- a/spec/acceptance/clone_repo_spec.rb
+++ b/spec/acceptance/clone_repo_spec.rb
@@ -184,6 +184,13 @@ describe 'clones a remote repo' do
end
context 'with an owner' do
+ pp = <<-EOS
+ user { 'vagrant':
+ ensure => present,
+ }
+ EOS
+
+ apply_manifest(pp, :catch_failures => true)
it 'clones a repo' do
pp = <<-EOS
vcsrepo { "#{tmpdir}/testrepo_owner":
@@ -206,6 +213,14 @@ describe 'clones a remote repo' do
end
context 'with a group' do
+ pp = <<-EOS
+ group { 'vagrant':
+ ensure => present,
+ }
+ EOS
+
+ apply_manifest(pp, :catch_failures => true)
+
it 'clones a repo' do
pp = <<-EOS
vcsrepo { "/#{tmpdir}/testrepo_group":
diff --git a/spec/unit/puppet/provider/vcsrepo/git_spec.rb b/spec/unit/puppet/provider/vcsrepo/git_spec.rb
index ad6ed08..daec038 100644
--- a/spec/unit/puppet/provider/vcsrepo/git_spec.rb
+++ b/spec/unit/puppet/provider/vcsrepo/git_spec.rb
@@ -1,7 +1,16 @@
require 'spec_helper'
describe Puppet::Type.type(:vcsrepo).provider(:git_provider) do
+ def branch_a_list(include_branch)
+ <<branches
+end
+#{"* master" unless include_branch.nil?}
+#{"* " + include_branch unless !include_branch}
+ remote/origin/master
+ remote/origin/foo
+branches
+ end
let(:resource) { Puppet::Type.type(:vcsrepo).new({
:name => 'test',
:ensure => :present,
@@ -26,7 +35,7 @@ describe Puppet::Type.type(:vcsrepo).provider(:git_provider) do
Dir.expects(:chdir).with('/tmp/test').at_least_once.yields
provider.expects(:git).with('clone', resource.value(:source), resource.value(:path))
provider.expects(:update_submodules)
- provider.expects(:git).with('branch', '-a').returns(resource.value(:revision))
+ provider.expects(:git).with('branch', '-a').returns(branch_a_list(resource.value(:revision)))
provider.expects(:git).with('checkout', '--force', resource.value(:revision))
provider.create
end
@@ -39,7 +48,7 @@ describe Puppet::Type.type(:vcsrepo).provider(:git_provider) do
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('branch', '-a').returns(branch_a_list(resource.value(:revision)))
provider.expects(:git).with('checkout', '--force', resource.value(:revision))
provider.create
end
@@ -53,7 +62,7 @@ describe Puppet::Type.type(:vcsrepo).provider(:git_provider) do
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('branch', '-a').returns(branch_a_list(resource.value(:revision)))
provider.expects(:git).with('checkout', '--force', resource.value(:revision))
provider.create
end
@@ -66,7 +75,7 @@ describe Puppet::Type.type(:vcsrepo).provider(:git_provider) do
Dir.expects(:chdir).with('/tmp/test').at_least_once.yields
provider.expects(:git).with('clone', resource.value(:source), resource.value(:path))
provider.expects(:update_submodules)
- provider.expects(:git).with('branch', '-a').returns(resource.value(:revision))
+ provider.expects(:git).with('branch', '-a').returns(branch_a_list(resource.value(:revision)))
provider.expects(:git).with('checkout', '--force', resource.value(:revision))
provider.create
end
@@ -161,7 +170,7 @@ describe Puppet::Type.type(:vcsrepo).provider(:git_provider) do
provider.destroy
provider.expects(:git).with('clone',resource.value(:source), resource.value(:path))
provider.expects(:update_submodules)
- provider.expects(:git).with('branch', '-a').returns(resource.value(:revision))
+ provider.expects(:git).with('branch', '-a').returns(branch_a_list(resource.value(:revision)))
provider.expects(:git).with('checkout', '--force', resource.value(:revision))
provider.create
end
@@ -261,9 +270,8 @@ describe Puppet::Type.type(:vcsrepo).provider(:git_provider) do
it "should use 'git fetch' and 'git reset'" do
resource[:revision] = 'feature/foo'
provider.expects(:update_submodules)
- provider.expects(:git).with('branch', '-a').returns(resource.value(:revision))
+ provider.expects(:git).with('branch', '-a').at_least_once.returns(branch_a_list(resource.value(:revision)))
provider.expects(:git).with('checkout', '--force', resource.value(:revision))
- provider.expects(:git).with('branch', '-a').returns(resource.value(:revision))
provider.expects(:git).with('reset', '--hard', "origin/#{resource.value(:revision)}")
provider.revision = resource.value(:revision)
end
@@ -272,9 +280,8 @@ describe Puppet::Type.type(:vcsrepo).provider(:git_provider) do
it "should use 'git fetch' and 'git reset'" do
resource[:revision] = 'only/remote'
provider.expects(:update_submodules)
- provider.expects(:git).with('branch', '-a').returns(resource.value(:revision))
+ provider.expects(:git).with('branch', '-a').at_least_once.returns(resource.value(:revision))
provider.expects(:git).with('checkout', '--force', resource.value(:revision))
- provider.expects(:git).with('branch', '-a').returns(resource.value(:revision))
provider.expects(:git).with('reset', '--hard', "origin/#{resource.value(:revision)}")
provider.revision = resource.value(:revision)
end
@@ -282,7 +289,7 @@ describe Puppet::Type.type(:vcsrepo).provider(:git_provider) do
context "when it's a commit or tag" do
it "should use 'git fetch' and 'git reset'" do
resource[:revision] = 'a-commit-or-tag'
- provider.expects(:git).with('branch', '-a').returns(fixture(:git_branch_a))
+ provider.expects(:git).with('branch', '-a').at_least_once.returns(fixture(:git_branch_a))
provider.expects(:git).with('checkout', '--force', resource.value(:revision))
provider.expects(:git).with('branch', '-a').returns(fixture(:git_branch_a))
provider.expects(:git).with('branch', '-a').returns(fixture(:git_branch_a))
@@ -341,7 +348,7 @@ describe Puppet::Type.type(:vcsrepo).provider(:git_provider) do
context "retrieving the current revision" do
before do
expects_chdir
- provider.expects(:git).with('rev-parse', '--abbrev-ref', 'HEAD').returns("foo\n")
+ provider.expects(:git).with('branch','-a').returns("* foo")
end
it "will strip trailing newlines" do
@@ -377,19 +384,20 @@ describe Puppet::Type.type(:vcsrepo).provider(:git_provider) do
end
context 'on master' do
it do
- provider.expects(:git).with('rev-parse', '--abbrev-ref', 'HEAD').returns(fixture(:git_branch_a))
+ provider.expects(:git).with('branch','-a').returns("* master")
provider.latest.should == 'master'
end
end
context 'no branch' do
it do
- provider.expects(:git).with('rev-parse', '--abbrev-ref', 'HEAD').returns(fixture(:git_branch_none))
+ provider.expects(:git).with('branch','-a').returns("* master")
+
provider.latest.should == 'master'
end
end
context 'feature/bar' do
it do
- provider.expects(:git).with('rev-parse', '--abbrev-ref', 'HEAD').returns(fixture(:git_branch_feature_bar))
+ provider.expects(:git).with('branch','-a').returns("* master")
provider.latest.should == 'master'
end
end