Add the option to shallow clones with git
authorFelipe Reyes <freyes@tty.cl>
Thu, 2 Jan 2014 21:13:40 +0000 (18:13 -0300)
committerFelipe Reyes <freyes@tty.cl>
Tue, 7 Jan 2014 19:03:29 +0000 (16:03 -0300)
The new parameter used to indicate that you want a shallow clone is `:depth`

lib/puppet/provider/vcsrepo/git.rb
lib/puppet/type/vcsrepo.rb
spec/unit/puppet/provider/vcsrepo/git_spec.rb

index d488271..af38a59 100644 (file)
@@ -6,7 +6,7 @@ Puppet::Type.type(:vcsrepo).provide(:git, :parent => Puppet::Provider::Vcsrepo)
   ##TODO modify the commands below so that the su - is included
   optional_commands :git => 'git',
                     :su  => 'su'
-  has_features :bare_repositories, :reference_tracking, :ssh_identity, :multiple_remotes, :user
+  has_features :bare_repositories, :reference_tracking, :ssh_identity, :multiple_remotes, :user, :depth
 
   def create
     if !@resource.value(:source)
@@ -131,6 +131,9 @@ Puppet::Type.type(:vcsrepo).provide(:git, :parent => Puppet::Provider::Vcsrepo)
   def clone_repository(source, path)
     check_force
     args = ['clone']
+    if @resource.value(:depth) and @resource.value(:depth).to_i > 0
+      args.push('--depth', @resource.value(:depth).to_s)
+    end
     if @resource.value(:ensure) == :bare
       args << '--bare'
     end
index ad90ced..1dab2b9 100644 (file)
@@ -37,6 +37,9 @@ Puppet::Type.newtype(:vcsrepo) do
   feature :cvs_rsh,
           "The provider understands the CVS_RSH environment variable"
 
+  feature :depth,
+          "The provider can do shallow clones"
+
   ensurable do
     attr_accessor :latest
 
@@ -191,6 +194,10 @@ Puppet::Type.newtype(:vcsrepo) do
     desc "The value to be used for the CVS_RSH environment variable."
   end
 
+  newparam :depth, :required_features => [:depth] do
+    desc "The value to be used to do a shallow clone."
+  end
+
   autorequire(:package) do
     ['git', 'git-core']
   end
index 554645b..c40388f 100644 (file)
@@ -31,6 +31,20 @@ describe Puppet::Type.type(:vcsrepo).provider(:git_provider) do
       end
     end
 
+    context "with shallow clone enable" do
+      it "should execute 'git clone --depth 1'" do
+        resource[:revision] = 'only/remote'
+        resource[:depth] = 1
+        Dir.expects(:chdir).with('/').at_least_once.yields
+        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('checkout', '--force', resource.value(:revision))
+        provider.create
+      end
+    end
+
     context "with a revision that is not a remote branch" do
       it "should execute 'git clone' and 'git reset --hard'" do
         resource[:revision] = 'a-commit-or-tag'