@@ -5,15 +5,20 @@ module Puppet::Parser::Functions
55
66 The following values will pass:
77
8- $my_path = " C:/Program Files (x86)/Puppet Labs/Puppet"
8+ $my_path = ' C:/Program Files (x86)/Puppet Labs/Puppet'
99 validate_absolute_path($my_path)
10- $my_path2 = " /var/lib/puppet"
10+ $my_path2 = ' /var/lib/puppet'
1111 validate_absolute_path($my_path2)
12-
12+ $my_path3 = ['C:/Program Files (x86)/Puppet Labs/Puppet','C:/Program Files/Puppet Labs/Puppet']
13+ validate_absolute_path($my_path3)
14+ $my_path4 = ['/var/lib/puppet','/usr/share/puppet']
15+ validate_absolute_path($my_path4)
1316
1417 The following values will fail, causing compilation to abort:
1518
1619 validate_absolute_path(true)
20+ validate_absolute_path('../var/lib/puppet')
21+ validate_absolute_path('var/lib/puppet')
1722 validate_absolute_path([ 'var/lib/puppet', '/var/foo' ])
1823 validate_absolute_path([ '/var/lib/puppet', 'var/foo' ])
1924 $undefined = undef
@@ -28,28 +33,36 @@ module Puppet::Parser::Functions
2833 end
2934
3035 args . each do |arg |
31- # This logic was borrowed from
32- # [lib/puppet/file_serving/base.rb](https://github.com/puppetlabs/puppet/blob/master/lib/puppet/file_serving/base.rb)
33-
34- # Puppet 2.7 and beyond will have Puppet::Util.absolute_path? Fall back to a back-ported implementation otherwise.
35- if Puppet ::Util . respond_to? ( :absolute_path? ) then
36- unless Puppet ::Util . absolute_path? ( arg , :posix ) or Puppet ::Util . absolute_path? ( arg , :windows )
37- raise Puppet ::ParseError , ( "#{ arg . inspect } is not an absolute path." )
36+ # put arg to candidate var to be able to replace it
37+ candidates = arg
38+ # if arg is just a string with a path to test, convert it to an array
39+ # to avoid test code duplication
40+ unless arg . is_a? ( Array ) then
41+ candidates = Array . new ( 1 , arg )
42+ end
43+ # iterate over all pathes within the candidates array
44+ candidates . each do |path |
45+ # This logic was borrowed from
46+ # [lib/puppet/file_serving/base.rb](https://github.com/puppetlabs/puppet/blob/master/lib/puppet/file_serving/base.rb)
47+ # Puppet 2.7 and beyond will have Puppet::Util.absolute_path? Fall back to a back-ported implementation otherwise.
48+ if Puppet ::Util . respond_to? ( :absolute_path? ) then
49+ unless Puppet ::Util . absolute_path? ( path , :posix ) or Puppet ::Util . absolute_path? ( path , :windows )
50+ raise Puppet ::ParseError , ( "#{ path . inspect } is not an absolute path." )
51+ end
52+ else
53+ # This code back-ported from 2.7.x's lib/puppet/util.rb Puppet::Util.absolute_path?
54+ # Determine in a platform-specific way whether a path is absolute. This
55+ # defaults to the local platform if none is specified.
56+ # Escape once for the string literal, and once for the regex.
57+ slash = '[\\\\/]'
58+ name = '[^\\\\/]+'
59+ regexes = {
60+ :windows => %r!^(([A-Z]:#{ slash } )|(#{ slash } #{ slash } #{ name } #{ slash } #{ name } )|(#{ slash } #{ slash } \? #{ slash } #{ name } ))!i ,
61+ :posix => %r!^/! ,
62+ }
63+ rval = ( !!( path =~ regexes [ :posix ] ) ) || ( !!( path =~ regexes [ :windows ] ) )
64+ rval or raise Puppet ::ParseError , ( "#{ path . inspect } is not an absolute path." )
3865 end
39- else
40- # This code back-ported from 2.7.x's lib/puppet/util.rb Puppet::Util.absolute_path?
41- # Determine in a platform-specific way whether a path is absolute. This
42- # defaults to the local platform if none is specified.
43- # Escape once for the string literal, and once for the regex.
44- slash = '[\\\\/]'
45- name = '[^\\\\/]+'
46- regexes = {
47- :windows => %r!^(([A-Z]:#{ slash } )|(#{ slash } #{ slash } #{ name } #{ slash } #{ name } )|(#{ slash } #{ slash } \? #{ slash } #{ name } ))!i ,
48- :posix => %r!^/! ,
49- }
50-
51- rval = ( !!( arg =~ regexes [ :posix ] ) ) || ( !!( arg =~ regexes [ :windows ] ) )
52- rval or raise Puppet ::ParseError , ( "#{ arg . inspect } is not an absolute path." )
5366 end
5467 end
5568 end
0 commit comments