Merge pull request #257 from alexmv/master
authorDavid Schmitt <david.schmitt@puppetlabs.com>
Tue, 1 Sep 2015 10:24:18 +0000 (11:24 +0100)
committerDavid Schmitt <david.schmitt@puppetlabs.com>
Tue, 1 Sep 2015 10:24:18 +0000 (11:24 +0100)
Explitly unset SSH_AUTH_SOCK; it is preferred to the -i flag

.sync.yml
.travis.yml
CHANGELOG.md
examples/git/shallow-clone-with-just-one-commit.pp [new file with mode: 0644]
lib/puppet/provider/vcsrepo/git.rb
metadata.json
spec/acceptance/create_repo_spec.rb
spec/acceptance/modules_1800_spec.rb [new file with mode: 0644]
spec/acceptance/modules_2326_spec.rb [new file with mode: 0644]
spec/unit/puppet/provider/vcsrepo/git_spec.rb

index 02c6c83..f4b637c 100644 (file)
--- a/.sync.yml
+++ b/.sync.yml
@@ -1,11 +1,5 @@
 ---
 .travis.yml:
-  script: "\"bundle exec rake spec SPEC_OPTS='--format documentation'\""
-  extras:
-  - rvm: 1.8.7
-    env: PUPPET_GEM_VERSION="~> 2.7.0" FACTER_GEM_VERSION="~> 1.6.0"
-  - rvm: 1.8.7
-    env: PUPPET_GEM_VERSION="~> 2.7.0" FACTER_GEM_VERSION="~> 1.7.0"
 Rakefile:
   unmanaged: true
 spec/spec_helper.rb:
index 727f6e7..1155a2d 100644 (file)
@@ -16,10 +16,6 @@ matrix:
     env: PUPPET_GEM_VERSION="~> 3.0" FUTURE_PARSER="yes"
   - rvm: 2.1.6
     env: PUPPET_GEM_VERSION="~> 4.0" STRICT_VARIABLES="yes"
-  - rvm: 1.8.7
-    env: PUPPET_GEM_VERSION="~> 2.7.0" FACTER_GEM_VERSION="~> 1.6.0"
-  - rvm: 1.8.7
-    env: PUPPET_GEM_VERSION="~> 2.7.0" FACTER_GEM_VERSION="~> 1.7.0"
   allow_failures:
     - rvm: 2.1.6
       env: PUPPET_GEM_VERSION="~> 4.0" STRICT_VARIABLES="yes"
index ad10e97..7d1060c 100644 (file)
@@ -1,6 +1,16 @@
 # Change Log
 All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/).
 
+## [1.3.1] - 2015-07-28 Supported Release
+###Summary
+This release includes a number of bugfixes along with some test updates.
+
+### Fixed
+- Fix for detached HEAD on git 2.4+
+- Git provider doesn't ignore revision property when depth is used (MODULES-2131)
+- Test fixes
+- Check if submodules == true before calling update_submodules
+
 ## [1.3.0] - 2015-05-19 Supported Release
 ### Summary
 This release adds git provider remote handling, svn conflict resolution, and fixes the git provider when /tmp is mounted noexec.
@@ -125,6 +135,7 @@ our many contributors for all of these fixes!
 - CVS:
  - Documented the "module" attribute.
 
+[1.3.1]: https://github.com/puppetlabs/puppetlabs-vcsrepo/compare/1.3.0...1.3.1
 [1.3.0]: https://github.com/puppetlabs/puppetlabs-vcsrepo/compare/1.2.0...1.3.0
 [1.2.0]: https://github.com/puppetlabs/puppetlabs-vcsrepo/compare/1.1.0...1.2.0
 [1.1.0]: https://github.com/puppetlabs/puppetlabs-vcsrepo/compare/1.0.2...1.1.0
diff --git a/examples/git/shallow-clone-with-just-one-commit.pp b/examples/git/shallow-clone-with-just-one-commit.pp
new file mode 100644 (file)
index 0000000..cd5a05d
--- /dev/null
@@ -0,0 +1,7 @@
+vcsrepo { '/tmp/git':
+    ensure   => 'present',
+    provider => 'git',
+    source   => 'https://github.com/git/git.git',
+    branch   => 'v2.2.0',
+    depth    => 1,
+}
index 7e921a9..3b20a83 100644 (file)
@@ -3,7 +3,9 @@ require File.join(File.dirname(__FILE__), '..', 'vcsrepo')
 Puppet::Type.type(:vcsrepo).provide(:git, :parent => Puppet::Provider::Vcsrepo) do
   desc "Supports Git repositories"
 
-  commands :git => 'git'
+  has_command(:git, 'git') do
+    environment({ 'HOME' => ENV['HOME'] })
+  end
 
   has_features :bare_repositories, :reference_tracking, :ssh_identity, :multiple_remotes, :user, :depth, :branch, :submodules
 
@@ -45,7 +47,11 @@ Puppet::Type.type(:vcsrepo).provide(:git, :parent => Puppet::Provider::Vcsrepo)
   #
   # @return [String] Returns the target sha/tag/branch
   def latest
-    @resource.value(:revision)
+    if not @resource.value(:revision) and branch = on_branch?
+      return branch
+    else
+      return @resource.value(:revision)
+    end
   end
 
   # Get the current revision of the repo (tag/branch/sha)
@@ -72,7 +78,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
@@ -103,7 +113,7 @@ Puppet::Type.type(:vcsrepo).provide(:git, :parent => Puppet::Provider::Vcsrepo)
 
   def working_copy_exists?
     if @resource.value(:source) and File.exists?(File.join(@resource.value(:path), '.git', 'config'))
-      File.readlines(File.join(@resource.value(:path), '.git', 'config')).grep(/#{default_url}/).any?
+      File.readlines(File.join(@resource.value(:path), '.git', 'config')).grep(/#{Regexp.escape(default_url)}/).any?
     else
       File.directory?(File.join(@resource.value(:path), '.git'))
     end
@@ -281,7 +291,7 @@ Puppet::Type.type(:vcsrepo).provide(:git, :parent => Puppet::Provider::Vcsrepo)
   # handle upstream branch changes
   # @!visibility private
   def checkout(revision = @resource.value(:revision))
-    if !local_branch_revision? && remote_branch_revision?
+    if !local_branch_revision?(revision) && remote_branch_revision?(revision)
       #non-locally existant branches (perhaps switching to a branch that has never been checked out)
       at_path { git_with_identity('checkout', '--force', '-b', revision, '--track', "#{@resource.value(:remote)}/#{revision}") }
     else
@@ -388,7 +398,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?
@@ -440,7 +460,8 @@ Puppet::Type.type(:vcsrepo).provide(:git, :parent => Puppet::Provider::Vcsrepo)
         return ret
       end
     elsif @resource.value(:user) and @resource.value(:user) != Facter['id'].value
-      Puppet::Util::Execution.execute("git #{args.join(' ')}", :uid => @resource.value(:user), :failonfail => true)
+      env = Etc.getpwnam(@resource.value(:user))
+      Puppet::Util::Execution.execute("git #{args.join(' ')}", :uid => @resource.value(:user), :failonfail => true, :custom_environment => {'HOME' => env['dir']})
     else
       git(*args)
     end
index ef74e86..1552840 100644 (file)
@@ -1,12 +1,15 @@
 {
   "name": "puppetlabs-vcsrepo",
-  "version": "1.3.0",
+  "version": "1.3.1",
   "author": "Puppet Labs",
   "summary": "Puppet module providing a type to manage repositories from various version control systems",
   "license": "GPLv2",
   "source": "https://github.com/puppetlabs/puppetlabs-vcsrepo",
   "project_page": "https://github.com/puppetlabs/puppetlabs-vcsrepo",
   "issues_url": "https://tickets.puppetlabs.com/browse/MODULES",
+  "dependencies": [
+  
+  ],
   "operatingsystem_support": [
     {
       "operatingsystem": "RedHat",
   "requirements": [
     {
       "name": "pe",
-      "version_requirement": "3.x"
+      "version_requirement": ">= 3.0.0 < 2015.3.0"
     },
     {
       "name": "puppet",
-      "version_requirement": "3.x"
+      "version_requirement": ">= 3.0.0 < 5.0.0"
     }
-  ],
-  "dependencies": [
-  
   ]
 }
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
diff --git a/spec/acceptance/modules_1800_spec.rb b/spec/acceptance/modules_1800_spec.rb
new file mode 100644 (file)
index 0000000..12415e8
--- /dev/null
@@ -0,0 +1,41 @@
+require 'spec_helper_acceptance'
+
+tmpdir = default.tmpdir('vcsrepo')
+
+describe 'clones a remote repo' do
+  before(:all) do
+    my_root = File.expand_path(File.join(File.dirname(__FILE__), '..'))
+    shell("mkdir -p #{tmpdir}") # win test
+  end
+
+  after(:all) do
+    shell("rm -rf #{tmpdir}/vcsrepo")
+  end
+
+  context 'ensure latest with no revision' do
+    it 'clones from default remote' do
+      pp = <<-EOS
+      vcsrepo { "#{tmpdir}/vcsrepo":
+          ensure   => present,
+          provider => git,
+          source   => "https://github.com/puppetlabs/puppetlabs-vcsrepo.git",
+      }
+      EOS
+
+      apply_manifest(pp, :catch_failures => true)
+      shell("cd #{tmpdir}/vcsrepo; /usr/bin/git reset --hard HEAD~2")
+    end
+
+    it 'updates' do
+      pp = <<-EOS
+      vcsrepo { "#{tmpdir}/vcsrepo":
+          ensure   => latest,
+          provider => git,
+          source   => "https://github.com/puppetlabs/puppetlabs-vcsrepo.git",
+      }
+      EOS
+
+      apply_manifest(pp, :catch_failures => true)
+    end
+  end
+end
diff --git a/spec/acceptance/modules_2326_spec.rb b/spec/acceptance/modules_2326_spec.rb
new file mode 100644 (file)
index 0000000..601c6ff
--- /dev/null
@@ -0,0 +1,69 @@
+require 'spec_helper_acceptance'
+
+tmpdir = default.tmpdir('vcsrepo')
+
+describe 'clones with special characters' do
+
+  before(:all) do
+    my_root = File.expand_path(File.join(File.dirname(__FILE__), '..'))
+    shell("mkdir -p #{tmpdir}") # win test
+    scp_to(default, "#{my_root}/acceptance/files/create_git_repo.sh", tmpdir)
+    shell("cd #{tmpdir} && ./create_git_repo.sh")
+  end
+
+  after(:all) do
+    shell("rm -rf #{tmpdir}/testrepo.git")
+  end
+
+  context 'as a user with ssh' do
+    before(:all) do
+      # create user
+      pp = <<-EOS
+        group { 'testuser-ssh':
+          ensure => present,
+        }
+        user { 'testuser-ssh':
+          ensure     => present,
+          groups     => 'testuser-ssh',
+          managehome => true,
+        }
+      EOS
+      apply_manifest(pp, :catch_failures => true)
+
+      # create ssh keys
+      shell('mkdir -p /home/testuser-ssh/.ssh')
+      shell('echo -e \'y\n\'|ssh-keygen -q -t rsa -f /home/testuser-ssh/.ssh/id_rsa -N ""')
+
+      # copy public key to authorized_keys
+      shell('cat /home/testuser-ssh/.ssh/id_rsa.pub > /home/testuser-ssh/.ssh/authorized_keys')
+      shell('echo -e "Host localhost\n\tStrictHostKeyChecking no\n" > /home/testuser-ssh/.ssh/config')
+      shell('chown -R testuser-ssh:testuser-ssh /home/testuser-ssh/.ssh')
+      shell("chown testuser-ssh:testuser-ssh #{tmpdir}")
+    end
+
+    it 'applies the manifest' do
+      pp = <<-EOS
+        vcsrepo { "#{tmpdir}/testrepo_user_ssh":
+          ensure   => present,
+          provider => git,
+          source   => "git+ssh://testuser-ssh@localhost#{tmpdir}/testrepo.git",
+          user     => 'testuser-ssh',
+        }
+      EOS
+
+      # Run it twice and test for idempotency
+      apply_manifest(pp, :catch_failures => true)
+      apply_manifest(pp, :catch_changes => true)
+    end
+
+    after(:all) do
+      pp = <<-EOS
+        user { 'testuser-ssh':
+          ensure     => absent,
+          managehome => true,
+        }
+      EOS
+      apply_manifest(pp, :catch_failures => true)
+    end
+  end
+end
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