knife-essentials 0.8.1 → 0.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/chef/knife/delete_essentials.rb +3 -3
- data/lib/chef/knife/deps_essentials.rb +19 -9
- data/lib/chef/knife/diff_essentials.rb +2 -2
- data/lib/chef/knife/download_essentials.rb +2 -2
- data/lib/chef/knife/list_essentials.rb +61 -29
- data/lib/chef/knife/raw_essentials.rb +5 -5
- data/lib/chef/knife/show_essentials.rb +4 -4
- data/lib/chef/knife/upload_essentials.rb +2 -2
- data/lib/chef_fs/file_system.rb +27 -27
- data/lib/chef_fs/file_system/base_fs_object.rb +6 -1
- data/lib/chef_fs/file_system/chef_repository_file_system_cookbooks_dir.rb +37 -0
- data/lib/chef_fs/file_system/chef_repository_file_system_entry.rb +28 -43
- data/lib/chef_fs/file_system/chef_repository_file_system_root_dir.rb +6 -1
- data/lib/chef_fs/knife.rb +8 -3
- data/lib/chef_fs/version.rb +1 -1
- data/spec/chef_fs/file_system_spec.rb +2 -2
- data/spec/integration/chef_repository_file_system_spec.rb +650 -0
- data/spec/integration/deps_spec.rb +314 -0
- data/spec/integration/list_spec.rb +315 -0
- data/spec/support/integration_helper.rb +95 -0
- data/spec/support/knife_support.rb +92 -0
- data/spec/support/stickywicket.pem +27 -0
- metadata +26 -3
@@ -3,7 +3,7 @@ require 'chef_fs/file_system'
|
|
3
3
|
|
4
4
|
class Chef
|
5
5
|
class Knife
|
6
|
-
remove_const(:Delete) if const_defined?(:Delete) # override Chef's version
|
6
|
+
remove_const(:Delete) if const_defined?(:Delete) && Delete.name == 'Chef::Knife::Delete' # override Chef's version
|
7
7
|
class Delete < ::ChefFS::Knife
|
8
8
|
ChefFS = ::ChefFS
|
9
9
|
banner "knife delete [PATTERN1 ... PATTERNn]"
|
@@ -67,9 +67,9 @@ class Chef
|
|
67
67
|
end
|
68
68
|
end
|
69
69
|
if deleted_any
|
70
|
-
|
70
|
+
output("Deleted #{format_path(results[0].path)}")
|
71
71
|
else
|
72
|
-
|
72
|
+
ui.error "#{format_path(results[0].path)}: No such file or directory"
|
73
73
|
end
|
74
74
|
end
|
75
75
|
end
|
@@ -3,7 +3,7 @@ require 'chef_fs/file_system'
|
|
3
3
|
|
4
4
|
class Chef
|
5
5
|
class Knife
|
6
|
-
remove_const(:Deps) if const_defined?(:Deps) # override Chef's version
|
6
|
+
remove_const(:Deps) if const_defined?(:Deps) && Deps.name == 'Chef::Knife::Deps' # override Chef's version
|
7
7
|
class Deps < ::ChefFS::Knife
|
8
8
|
ChefFS = ::ChefFS
|
9
9
|
banner "knife deps PATTERN1 [PATTERNn]"
|
@@ -23,9 +23,11 @@ class Chef
|
|
23
23
|
:boolean => true,
|
24
24
|
:description => "List dependencies on the server instead of the local filesystem"
|
25
25
|
|
26
|
+
attr_accessor :exit_code
|
27
|
+
|
26
28
|
def run
|
27
|
-
if config[:
|
28
|
-
|
29
|
+
if config[:recurse] == false && !config[:tree]
|
30
|
+
ui.error "--no-recurse requires --tree"
|
29
31
|
exit(1)
|
30
32
|
end
|
31
33
|
config[:recurse] = true if config[:recurse].nil?
|
@@ -41,6 +43,7 @@ class Chef
|
|
41
43
|
end
|
42
44
|
end
|
43
45
|
end
|
46
|
+
exit exit_code if exit_code
|
44
47
|
end
|
45
48
|
|
46
49
|
def print_flattened_dependencies(entry, dependencies)
|
@@ -50,14 +53,14 @@ class Chef
|
|
50
53
|
child_entry = ChefFS::FileSystem.resolve_path(@root, child)
|
51
54
|
print_flattened_dependencies(child_entry, dependencies)
|
52
55
|
end
|
53
|
-
|
56
|
+
output format_path(entry.path)
|
54
57
|
end
|
55
58
|
end
|
56
59
|
|
57
60
|
def print_dependencies_tree(entry, dependencies, printed = {}, depth = 0)
|
58
61
|
dependencies[entry.path] = get_dependencies(entry) if !dependencies[entry.path]
|
59
|
-
|
60
|
-
if !printed[entry.path] && (config[:recurse] || depth
|
62
|
+
output "#{' '*depth}#{format_path(entry.path)}"
|
63
|
+
if !printed[entry.path] && (config[:recurse] || depth == 0)
|
61
64
|
printed[entry.path] = true
|
62
65
|
dependencies[entry.path].each do |child|
|
63
66
|
child_entry = ChefFS::FileSystem.resolve_path(@root, child)
|
@@ -70,18 +73,25 @@ class Chef
|
|
70
73
|
begin
|
71
74
|
object = entry.chef_object
|
72
75
|
rescue ChefFS::FileSystem::NotFoundError
|
73
|
-
|
76
|
+
ui.error "#{format_path(entry.path)}: No such file or directory"
|
77
|
+
self.exit_code = 2
|
74
78
|
return []
|
75
79
|
end
|
76
80
|
if !object
|
77
|
-
|
81
|
+
# If it's not a Chef object, it has no deps
|
78
82
|
return []
|
79
83
|
end
|
80
84
|
|
81
85
|
if object.is_a?(Chef::CookbookVersion)
|
82
86
|
return object.metadata.dependencies.keys.map { |cookbook| "/cookbooks/#{cookbook}"}
|
83
87
|
elsif object.is_a?(Chef::Node)
|
84
|
-
|
88
|
+
result = []
|
89
|
+
# /environments/_default.json is an annoying dependency, since you
|
90
|
+
# can't upload it anyway
|
91
|
+
if object.chef_environment != '_default'
|
92
|
+
result << "/environments/#{object.chef_environment}.json"
|
93
|
+
end
|
94
|
+
return result + dependencies_from_runlist(object.run_list)
|
85
95
|
elsif object.is_a?(Chef::Role)
|
86
96
|
result = []
|
87
97
|
object.env_run_lists.each_pair do |env,run_list|
|
@@ -3,7 +3,7 @@ require 'chef_fs/command_line'
|
|
3
3
|
|
4
4
|
class Chef
|
5
5
|
class Knife
|
6
|
-
remove_const(:Diff) if const_defined?(:Diff) # override Chef's version
|
6
|
+
remove_const(:Diff) if const_defined?(:Diff) && Diff.name == 'Chef::Knife::Diff' # override Chef's version
|
7
7
|
class Diff < ::ChefFS::Knife
|
8
8
|
ChefFS = ::ChefFS
|
9
9
|
banner "knife diff PATTERNS"
|
@@ -38,7 +38,7 @@ class Chef
|
|
38
38
|
# Get the matches (recursively)
|
39
39
|
patterns.each do |pattern|
|
40
40
|
ChefFS::CommandLine.diff(pattern, chef_fs, local_fs, config[:recurse] ? nil : 1, output_mode) do |diff|
|
41
|
-
|
41
|
+
output diff
|
42
42
|
end
|
43
43
|
end
|
44
44
|
end
|
@@ -3,7 +3,7 @@ require 'chef_fs/command_line'
|
|
3
3
|
|
4
4
|
class Chef
|
5
5
|
class Knife
|
6
|
-
remove_const(:Download) if const_defined?(:Download) # override Chef's version
|
6
|
+
remove_const(:Download) if const_defined?(:Download) && Download.name == 'Chef::Knife::Download' # override Chef's version
|
7
7
|
class Download < ::ChefFS::Knife
|
8
8
|
ChefFS = ::ChefFS
|
9
9
|
banner "knife download PATTERNS"
|
@@ -43,7 +43,7 @@ class Chef
|
|
43
43
|
end
|
44
44
|
|
45
45
|
pattern_args.each do |pattern|
|
46
|
-
ChefFS::FileSystem.copy_to(pattern, chef_fs, local_fs, config[:recurse] ? nil : 1, config)
|
46
|
+
ChefFS::FileSystem.copy_to(pattern, chef_fs, local_fs, config[:recurse] ? nil : 1, config, ui)
|
47
47
|
end
|
48
48
|
end
|
49
49
|
end
|
@@ -3,7 +3,7 @@ require 'chef_fs/file_system'
|
|
3
3
|
|
4
4
|
class Chef
|
5
5
|
class Knife
|
6
|
-
remove_const(:List) if const_defined?(:List) # override Chef's version
|
6
|
+
remove_const(:List) if const_defined?(:List) && List.name == 'Chef::Knife::List' # override Chef's version
|
7
7
|
class List < ::ChefFS::Knife
|
8
8
|
ChefFS = ::ChefFS
|
9
9
|
banner "knife list [-dR] [PATTERN1 ... PATTERNn]"
|
@@ -13,15 +13,29 @@ class Chef
|
|
13
13
|
option :recursive,
|
14
14
|
:short => '-R',
|
15
15
|
:boolean => true,
|
16
|
-
:description => "List directories recursively
|
16
|
+
:description => "List directories recursively"
|
17
17
|
option :bare_directories,
|
18
18
|
:short => '-d',
|
19
19
|
:boolean => true,
|
20
|
-
:description => "When directories match the pattern, do not show the directories' children
|
20
|
+
:description => "When directories match the pattern, do not show the directories' children"
|
21
21
|
option :local,
|
22
22
|
:long => '--local',
|
23
23
|
:boolean => true,
|
24
24
|
:description => "List local directory instead of remote"
|
25
|
+
option :flat,
|
26
|
+
:long => '--flat',
|
27
|
+
:boolean => true,
|
28
|
+
:description => "Show a list of filenames rather than the prettified ls-like output normally produced"
|
29
|
+
option :one_column,
|
30
|
+
:short => '-1',
|
31
|
+
:boolean => true,
|
32
|
+
:description => "Show only one column of results"
|
33
|
+
option :trailing_slashes,
|
34
|
+
:short => '-p',
|
35
|
+
:boolean => true,
|
36
|
+
:description => "Show trailing slashes after directories"
|
37
|
+
|
38
|
+
attr_accessor :exit_code
|
25
39
|
|
26
40
|
def run
|
27
41
|
patterns = name_args.length == 0 ? [""] : name_args
|
@@ -36,11 +50,19 @@ class Chef
|
|
36
50
|
elsif result.exists?
|
37
51
|
results << result
|
38
52
|
elsif pattern.exact_path
|
39
|
-
|
53
|
+
ui.error "#{format_path(result.path)}: No such file or directory"
|
54
|
+
self.exit_code = 1
|
40
55
|
end
|
41
56
|
end
|
42
57
|
end
|
43
58
|
|
59
|
+
if config[:flat]
|
60
|
+
dir_results.each do |result, children|
|
61
|
+
results += children
|
62
|
+
end
|
63
|
+
dir_results = []
|
64
|
+
end
|
65
|
+
|
44
66
|
results = results.sort_by { |result| result.path }
|
45
67
|
dir_results = dir_results.sort_by { |result| result[0].path }
|
46
68
|
|
@@ -50,18 +72,25 @@ class Chef
|
|
50
72
|
end
|
51
73
|
|
52
74
|
print_result_paths results
|
75
|
+
printed_something = results.length > 0
|
53
76
|
dir_results.each do |result, children|
|
54
|
-
|
55
|
-
|
56
|
-
|
77
|
+
if printed_something
|
78
|
+
output ""
|
79
|
+
else
|
80
|
+
printed_something = true
|
81
|
+
end
|
82
|
+
output "#{format_path(result.path)}:"
|
83
|
+
print_results(children.map { |result| maybe_add_slash(result.name, result.dir?) }.sort, "")
|
57
84
|
end
|
85
|
+
|
86
|
+
exit self.exit_code if self.exit_code
|
58
87
|
end
|
59
88
|
|
60
89
|
def add_dir_result(result)
|
61
90
|
begin
|
62
91
|
children = result.children.sort_by { |child| child.name }
|
63
92
|
rescue ChefFS::FileSystem::NotFoundError
|
64
|
-
|
93
|
+
ui.error "#{format_path(result.path)}: No such file or directory"
|
65
94
|
return []
|
66
95
|
end
|
67
96
|
|
@@ -76,38 +105,41 @@ class Chef
|
|
76
105
|
result
|
77
106
|
end
|
78
107
|
|
79
|
-
def list_dirs_recursive(children)
|
80
|
-
results = children.select { |child| child.dir? }.to_a
|
81
|
-
results.each do |child|
|
82
|
-
results += list_dirs_recursive(child.children)
|
83
|
-
end
|
84
|
-
results
|
85
|
-
end
|
86
|
-
|
87
108
|
def print_result_paths(results, indent = "")
|
88
|
-
print_results(results.map { |result| format_path(result.path) }, indent)
|
109
|
+
print_results(results.map { |result| maybe_add_slash(format_path(result.path), result.dir?) }, indent)
|
89
110
|
end
|
90
111
|
|
91
112
|
def print_results(results, indent)
|
92
113
|
return if results.length == 0
|
93
114
|
|
94
115
|
print_space = results.map { |result| result.length }.max + 2
|
95
|
-
|
96
|
-
|
97
|
-
|
116
|
+
if config[:one_column] || !stdout.isatty
|
117
|
+
columns = 0
|
118
|
+
else
|
119
|
+
# TODO: tput cols is not cross platform
|
120
|
+
columns = Integer(`tput cols`)
|
121
|
+
end
|
122
|
+
current_line = ''
|
98
123
|
results.each do |result|
|
99
|
-
if
|
100
|
-
|
101
|
-
|
124
|
+
if current_line.length > 0 && current_line.length + print_space > columns
|
125
|
+
output current_line.rstrip
|
126
|
+
current_line = ''
|
102
127
|
end
|
103
|
-
if
|
104
|
-
|
105
|
-
current_column += indent.length
|
128
|
+
if current_line.length == 0
|
129
|
+
current_line << indent
|
106
130
|
end
|
107
|
-
|
108
|
-
|
131
|
+
current_line << result
|
132
|
+
current_line << (' ' * (print_space - result.length))
|
133
|
+
end
|
134
|
+
output current_line.rstrip if current_line.length > 0
|
135
|
+
end
|
136
|
+
|
137
|
+
def maybe_add_slash(path, is_dir)
|
138
|
+
if config[:trailing_slashes] && is_dir
|
139
|
+
"#{path}/"
|
140
|
+
else
|
141
|
+
path
|
109
142
|
end
|
110
|
-
puts ""
|
111
143
|
end
|
112
144
|
end
|
113
145
|
end
|
@@ -2,7 +2,7 @@ require 'json'
|
|
2
2
|
|
3
3
|
class Chef
|
4
4
|
class Knife
|
5
|
-
remove_const(:Raw) if const_defined?(:Raw) # override Chef's version
|
5
|
+
remove_const(:Raw) if const_defined?(:Raw) && Raw.name == 'Chef::Knife::Raw' # override Chef's version
|
6
6
|
class Raw < Chef::Knife
|
7
7
|
ChefFS = ::ChefFS
|
8
8
|
banner "knife raw REQUEST_PATH"
|
@@ -11,13 +11,13 @@ class Chef
|
|
11
11
|
:long => '--method METHOD',
|
12
12
|
:short => '-m METHOD',
|
13
13
|
:default => "GET",
|
14
|
-
:description => "Request method (GET, POST, PUT or DELETE)"
|
14
|
+
:description => "Request method (GET, POST, PUT or DELETE). Default: GET"
|
15
15
|
|
16
16
|
option :pretty,
|
17
17
|
:long => '--[no-]pretty',
|
18
18
|
:boolean => true,
|
19
19
|
:default => true,
|
20
|
-
:description => "Pretty-print JSON output"
|
20
|
+
:description => "Pretty-print JSON output. Default: true"
|
21
21
|
|
22
22
|
option :input,
|
23
23
|
:long => '--input FILE',
|
@@ -41,7 +41,7 @@ class Chef
|
|
41
41
|
data = IO.read(config[:input])
|
42
42
|
end
|
43
43
|
chef_rest = Chef::REST.new(Chef::Config[:chef_server_url])
|
44
|
-
|
44
|
+
output api_request(chef_rest, config[:method].to_sym, chef_rest.create_url(name_args[0]), {}, data)
|
45
45
|
end
|
46
46
|
|
47
47
|
ACCEPT_ENCODING = "Accept-Encoding".freeze
|
@@ -87,7 +87,7 @@ class Chef
|
|
87
87
|
msg << (exception["error"].respond_to?(:join) ? exception["error"].join(", ") : exception["error"].to_s)
|
88
88
|
Chef::Log.info(msg)
|
89
89
|
end
|
90
|
-
|
90
|
+
output response.body
|
91
91
|
response.error!
|
92
92
|
end
|
93
93
|
end
|
@@ -3,7 +3,7 @@ require 'chef_fs/file_system'
|
|
3
3
|
|
4
4
|
class Chef
|
5
5
|
class Knife
|
6
|
-
remove_const(:Show) if const_defined?(:Show) # override Chef's version
|
6
|
+
remove_const(:Show) if const_defined?(:Show) && Show.name == 'Chef::Knife::Show' # override Chef's version
|
7
7
|
class Show < ::ChefFS::Knife
|
8
8
|
ChefFS = ::ChefFS
|
9
9
|
banner "knife show [PATTERN1 ... PATTERNn]"
|
@@ -20,14 +20,14 @@ class Chef
|
|
20
20
|
pattern_args.each do |pattern|
|
21
21
|
ChefFS::FileSystem.list(config[:local] ? local_fs : chef_fs, pattern) do |result|
|
22
22
|
if result.dir?
|
23
|
-
|
23
|
+
ui.error "#{result.path_for_printing}: is a directory" if pattern.exact_path
|
24
24
|
else
|
25
25
|
begin
|
26
26
|
value = result.read
|
27
|
-
|
27
|
+
output "#{result.path_for_printing}:"
|
28
28
|
output(format_for_display(value))
|
29
29
|
rescue ChefFS::FileSystem::NotFoundError
|
30
|
-
|
30
|
+
ui.error "#{result.path_for_printing}: No such file or directory"
|
31
31
|
end
|
32
32
|
end
|
33
33
|
end
|
@@ -3,7 +3,7 @@ require 'chef_fs/command_line'
|
|
3
3
|
|
4
4
|
class Chef
|
5
5
|
class Knife
|
6
|
-
remove_const(:Upload) if const_defined?(:Upload) # override Chef's version
|
6
|
+
remove_const(:Upload) if const_defined?(:Upload) && Upload.name == 'Chef::Knife::Upload' # override Chef's version
|
7
7
|
class Upload < ::ChefFS::Knife
|
8
8
|
ChefFS = ::ChefFS
|
9
9
|
banner "knife upload PATTERNS"
|
@@ -43,7 +43,7 @@ class Chef
|
|
43
43
|
end
|
44
44
|
|
45
45
|
pattern_args.each do |pattern|
|
46
|
-
ChefFS::FileSystem.copy_to(pattern, local_fs, chef_fs, config[:recurse] ? nil : 1, config)
|
46
|
+
ChefFS::FileSystem.copy_to(pattern, local_fs, chef_fs, config[:recurse] ? nil : 1, config, ui)
|
47
47
|
end
|
48
48
|
end
|
49
49
|
end
|
data/lib/chef_fs/file_system.rb
CHANGED
@@ -34,7 +34,7 @@ module ChefFS
|
|
34
34
|
block.call(entry)
|
35
35
|
end
|
36
36
|
|
37
|
-
if
|
37
|
+
if pattern.could_match_children?(entry.path)
|
38
38
|
# If it's possible that our children could match, descend in and add matches.
|
39
39
|
exact_child_name = pattern.exact_child_name_under(entry.path)
|
40
40
|
|
@@ -47,7 +47,7 @@ module ChefFS
|
|
47
47
|
end
|
48
48
|
|
49
49
|
# Otherwise, go through all children and find any matches
|
50
|
-
|
50
|
+
elsif entry.dir?
|
51
51
|
entry.children.each do |child|
|
52
52
|
list(child, pattern, &block)
|
53
53
|
end
|
@@ -112,15 +112,15 @@ module ChefFS
|
|
112
112
|
# puts message
|
113
113
|
# end
|
114
114
|
#
|
115
|
-
def self.copy_to(pattern, src_root, dest_root, recurse_depth, options)
|
115
|
+
def self.copy_to(pattern, src_root, dest_root, recurse_depth, options, ui)
|
116
116
|
found_result = false
|
117
117
|
list_pairs(pattern, src_root, dest_root) do |src, dest|
|
118
118
|
found_result = true
|
119
|
-
new_dest_parent = get_or_create_parent(dest, options)
|
120
|
-
copy_entries(src, dest, new_dest_parent, recurse_depth, options)
|
119
|
+
new_dest_parent = get_or_create_parent(dest, options, ui)
|
120
|
+
copy_entries(src, dest, new_dest_parent, recurse_depth, options, ui)
|
121
121
|
end
|
122
122
|
if !found_result && pattern.exact_path
|
123
|
-
|
123
|
+
ui.error "#{pattern}: No such file or directory on remote or local"
|
124
124
|
end
|
125
125
|
end
|
126
126
|
|
@@ -215,7 +215,7 @@ module ChefFS
|
|
215
215
|
private
|
216
216
|
|
217
217
|
# Copy two entries (could be files or dirs)
|
218
|
-
def self.copy_entries(src_entry, dest_entry, new_dest_parent, recurse_depth, options)
|
218
|
+
def self.copy_entries(src_entry, dest_entry, new_dest_parent, recurse_depth, options, ui)
|
219
219
|
# A NOTE about this algorithm:
|
220
220
|
# There are cases where this algorithm does too many network requests.
|
221
221
|
# knife upload with a specific filename will first check if the file
|
@@ -232,10 +232,10 @@ module ChefFS
|
|
232
232
|
# If we would not have uploaded it, we will not purge it.
|
233
233
|
if src_entry.parent.can_have_child?(dest_entry.name, dest_entry.dir?)
|
234
234
|
if options[:dry_run]
|
235
|
-
|
235
|
+
ui.output "Would delete #{dest_entry.path_for_printing}"
|
236
236
|
else
|
237
237
|
dest_entry.delete(true)
|
238
|
-
|
238
|
+
ui.output "Deleted extra entry #{dest_entry.path_for_printing} (purge is on)"
|
239
239
|
end
|
240
240
|
else
|
241
241
|
Chef::Log.info("Not deleting extra entry #{dest_entry.path_for_printing} (purge is off)")
|
@@ -247,35 +247,35 @@ module ChefFS
|
|
247
247
|
# If the entry can do a copy directly from filesystem, do that.
|
248
248
|
if new_dest_parent.respond_to?(:create_child_from)
|
249
249
|
if options[:dry_run]
|
250
|
-
|
250
|
+
ui.output "Would create #{dest_entry.path_for_printing}"
|
251
251
|
else
|
252
252
|
new_dest_parent.create_child_from(src_entry)
|
253
|
-
|
253
|
+
ui.output "Created #{dest_entry.path_for_printing}"
|
254
254
|
end
|
255
255
|
return
|
256
256
|
end
|
257
257
|
|
258
258
|
if src_entry.dir?
|
259
259
|
if options[:dry_run]
|
260
|
-
|
260
|
+
ui.output "Would create #{dest_entry.path_for_printing}"
|
261
261
|
new_dest_dir = new_dest_parent.child(src_entry.name)
|
262
262
|
else
|
263
263
|
new_dest_dir = new_dest_parent.create_child(src_entry.name, nil)
|
264
|
-
|
264
|
+
ui.output "Created #{dest_entry.path_for_printing}/"
|
265
265
|
end
|
266
266
|
# Directory creation is recursive.
|
267
267
|
if recurse_depth != 0
|
268
268
|
src_entry.children.each do |src_child|
|
269
269
|
new_dest_child = new_dest_dir.child(src_child.name)
|
270
|
-
copy_entries(src_child, new_dest_child, new_dest_dir, recurse_depth ? recurse_depth - 1 : recurse_depth, options)
|
270
|
+
copy_entries(src_child, new_dest_child, new_dest_dir, recurse_depth ? recurse_depth - 1 : recurse_depth, options, ui)
|
271
271
|
end
|
272
272
|
end
|
273
273
|
else
|
274
274
|
if options[:dry_run]
|
275
|
-
|
275
|
+
ui.output "Would create #{dest_entry.path_for_printing}"
|
276
276
|
else
|
277
277
|
new_dest_parent.create_child(src_entry.name, src_entry.read)
|
278
|
-
|
278
|
+
ui.output "Created #{dest_entry.path_for_printing}"
|
279
279
|
end
|
280
280
|
end
|
281
281
|
end
|
@@ -287,10 +287,10 @@ module ChefFS
|
|
287
287
|
if dest_entry.respond_to?(:copy_from)
|
288
288
|
if options[:force] || compare(src_entry, dest_entry)[0] == false
|
289
289
|
if options[:dry_run]
|
290
|
-
|
290
|
+
ui.output "Would update #{dest_entry.path_for_printing}"
|
291
291
|
else
|
292
292
|
dest_entry.copy_from(src_entry)
|
293
|
-
|
293
|
+
ui.output "Updated #{dest_entry.path_for_printing}"
|
294
294
|
end
|
295
295
|
end
|
296
296
|
return
|
@@ -302,17 +302,17 @@ module ChefFS
|
|
302
302
|
# If both are directories, recurse into their children
|
303
303
|
if recurse_depth != 0
|
304
304
|
child_pairs(src_entry, dest_entry).each do |src_child, dest_child|
|
305
|
-
copy_entries(src_child, dest_child, dest_entry, recurse_depth ? recurse_depth - 1 : recurse_depth, options)
|
305
|
+
copy_entries(src_child, dest_child, dest_entry, recurse_depth ? recurse_depth - 1 : recurse_depth, options, ui)
|
306
306
|
end
|
307
307
|
end
|
308
308
|
else
|
309
309
|
# If they are different types.
|
310
|
-
|
310
|
+
ui.error("File #{dest_entry.path_for_printing} is a directory while file #{dest_entry.path_for_printing} is a regular file\n")
|
311
311
|
return
|
312
312
|
end
|
313
313
|
else
|
314
314
|
if dest_entry.dir?
|
315
|
-
|
315
|
+
ui.error("File #{dest_entry.path_for_printing} is a directory while file #{dest_entry.path_for_printing} is a regular file\n")
|
316
316
|
return
|
317
317
|
else
|
318
318
|
|
@@ -326,11 +326,11 @@ module ChefFS
|
|
326
326
|
end
|
327
327
|
if should_copy
|
328
328
|
if options[:dry_run]
|
329
|
-
|
329
|
+
ui.output "Would update #{dest_entry.path_for_printing}"
|
330
330
|
else
|
331
331
|
src_value = src_entry.read if src_value.nil?
|
332
332
|
dest_entry.write(src_value)
|
333
|
-
|
333
|
+
ui.output "Updated #{dest_entry.path_for_printing}"
|
334
334
|
end
|
335
335
|
end
|
336
336
|
end
|
@@ -338,15 +338,15 @@ module ChefFS
|
|
338
338
|
end
|
339
339
|
end
|
340
340
|
|
341
|
-
def self.get_or_create_parent(entry, options)
|
341
|
+
def self.get_or_create_parent(entry, options, ui)
|
342
342
|
parent = entry.parent
|
343
343
|
if parent && !parent.exists?
|
344
|
-
parent_parent = get_or_create_parent(entry.parent, options)
|
344
|
+
parent_parent = get_or_create_parent(entry.parent, options, ui)
|
345
345
|
if options[:dry_run]
|
346
|
-
|
346
|
+
ui.output "Would create #{parent.path_for_printing}"
|
347
347
|
else
|
348
348
|
parent = parent_parent.create_child(parent.name, true)
|
349
|
-
|
349
|
+
ui.output "Created #{parent.path_for_printing}"
|
350
350
|
end
|
351
351
|
end
|
352
352
|
return parent
|