7
7
8
8
has_features :bare_repositories , :reference_tracking , :ssh_identity , :multiple_remotes ,
9
9
:user , :depth , :branch , :submodules , :safe_directory , :hooks_allowed ,
10
- :umask , :http_proxy , :tmpdir
10
+ :umask , :http_proxy , :tmpdir , :include_paths
11
11
12
12
def create
13
13
check_force
@@ -19,6 +19,7 @@ def create
19
19
set_mirror if @resource . value ( :ensure ) == :mirror && @resource . value ( :source ) . is_a? ( Hash )
20
20
self . skip_hooks = @resource . value ( :skip_hooks ) unless @resource . value ( :skip_hooks ) . nil?
21
21
22
+ configure_sparse_checkout if @resource . value ( :includes )
22
23
checkout if @resource . value ( :revision )
23
24
update_submodules if !ensure_bare_or_mirror? && @resource . value ( :submodules ) == :true
24
25
@@ -91,6 +92,20 @@ def revision=(desired)
91
92
update_owner_and_excludes
92
93
end
93
94
95
+ def includes
96
+ return nil if bare_exists?
97
+
98
+ at_path do
99
+ return nil unless File . file? ( File . join ( @resource . value ( :path ) , '.git/info/sparse-checkout' ) )
100
+ File . readlines ( File . join ( @resource . value ( :path ) , '.git/info/sparse-checkout' ) ) . map ( &:chomp )
101
+ end
102
+ end
103
+
104
+ def includes = ( desired )
105
+ configure_sparse_checkout
106
+ checkout
107
+ end
108
+
94
109
def bare_exists?
95
110
bare_git_config_exists? && !working_copy_exists?
96
111
end
@@ -407,6 +422,44 @@ def init_repository
407
422
end
408
423
end
409
424
425
+ # @!visibility private
426
+ def configure_sparse_checkout
427
+ raise ( "Cannot set includes on a #{ @resource . value ( :ensure ) } repository" ) if ensure_bare_or_mirror? || bare_exists?
428
+
429
+ git_ver = git_version
430
+ if Gem ::Version . new ( git_ver ) >= Gem ::Version . new ( '2.25.0' )
431
+ # sparse-checkout command was introduced in version 2.25.0.
432
+ at_path do
433
+ args = [ 'sparse-checkout' , 'set' , '--no-cone' ] + @resource . value ( :includes )
434
+ exec_git ( *args )
435
+ end
436
+ else
437
+ at_path do
438
+ exec_git ( 'config' , '--local' , '--bool' , 'core.sparseCheckout' , 'true' ) unless sparse_checkout_configured?
439
+
440
+ # Includes may be an Array or a String
441
+ File . open ( File . join ( @resource . value ( :path ) , '.git/info/sparse-checkout' ) , 'w' ) do |f |
442
+ if @resource . value ( :includes ) . respond_to? ( :each )
443
+ @resource . value ( :includes ) . each { |inc | f . puts inc }
444
+ else
445
+ f . puts @resource . value ( :includes )
446
+ end
447
+ end
448
+ end
449
+ end
450
+ end
451
+
452
+ # @!visibility private
453
+ def sparse_checkout_configured?
454
+ at_path do
455
+ begin
456
+ exec_git ( 'config' , '--get' , '--local' , 'core.sparseCheckout' ) . chomp == 'true'
457
+ rescue Puppet ::ExecutionFailure
458
+ :false
459
+ end
460
+ end
461
+ end
462
+
410
463
# @!visibility private
411
464
def commits?
412
465
at_path do
@@ -493,7 +546,7 @@ def tags
493
546
def set_excludes
494
547
# Excludes may be an Array or a String.
495
548
at_path do
496
- open ( '.git/info/exclude' , 'w' ) do |f |
549
+ File . open ( File . join ( @resource . value ( :path ) , '.git/info/exclude' ) , 'w' ) do |f |
497
550
if @resource . value ( :excludes ) . respond_to? ( :each )
498
551
@resource . value ( :excludes ) . each { |ex | f . puts ex }
499
552
else
0 commit comments