summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.sync.yml6
-rw-r--r--.travis.yml4
-rw-r--r--CHANGELOG.md11
-rw-r--r--examples/git/shallow-clone-with-just-one-commit.pp7
-rw-r--r--lib/puppet/provider/vcsrepo/git.rb35
-rw-r--r--metadata.json12
-rw-r--r--spec/acceptance/create_repo_spec.rb16
-rw-r--r--spec/acceptance/modules_1800_spec.rb41
-rw-r--r--spec/acceptance/modules_2326_spec.rb69
-rw-r--r--spec/unit/puppet/provider/vcsrepo/git_spec.rb10
10 files changed, 187 insertions, 24 deletions
diff --git a/.sync.yml b/.sync.yml
index 02c6c83..f4b637c 100644
--- 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:
diff --git a/.travis.yml b/.travis.yml
index 727f6e7..1155a2d 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -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"
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ad10e97..7d1060c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -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
index 0000000..cd5a05d
--- /dev/null
+++ b/examples/git/shallow-clone-with-just-one-commit.pp
@@ -0,0 +1,7 @@
+vcsrepo { '/tmp/git':
+ ensure => 'present',
+ provider => 'git',
+ source => 'https://github.com/git/git.git',
+ branch => 'v2.2.0',
+ depth => 1,
+}
diff --git a/lib/puppet/provider/vcsrepo/git.rb b/lib/puppet/provider/vcsrepo/git.rb
index 7e921a9..3b20a83 100644
--- a/lib/puppet/provider/vcsrepo/git.rb
+++ b/lib/puppet/provider/vcsrepo/git.rb
@@ -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
diff --git a/metadata.json b/metadata.json
index ef74e86..1552840 100644
--- a/metadata.json
+++ b/metadata.json
@@ -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",
@@ -67,14 +70,11 @@
"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": [
-
]
}
diff --git a/spec/acceptance/create_repo_spec.rb b/spec/acceptance/create_repo_spec.rb
index db0cd29..53a93c9 100644
--- a/spec/acceptance/create_repo_spec.rb
+++ b/spec/acceptance/create_repo_spec.rb
@@ -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
index 0000000..12415e8
--- /dev/null
+++ b/spec/acceptance/modules_1800_spec.rb
@@ -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
index 0000000..601c6ff
--- /dev/null
+++ b/spec/acceptance/modules_2326_spec.rb
@@ -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
diff --git a/spec/unit/puppet/provider/vcsrepo/git_spec.rb b/spec/unit/puppet/provider/vcsrepo/git_spec.rb
index a240b50..87113fa 100644
--- a/spec/unit/puppet/provider/vcsrepo/git_spec.rb
+++ b/spec/unit/puppet/provider/vcsrepo/git_spec.rb
@@ -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