summaryrefslogtreecommitdiff
path: root/chef/lib/chef/knife/cookbook_upload.rb
diff options
context:
space:
mode:
authorDaniel DeLeo <dan@opscode.com>2011-04-05 22:40:57 -0700
committerDaniel DeLeo <dan@opscode.com>2011-04-05 22:40:57 -0700
commit28aa5cf384359a04a280a72b171cabacb9d6ea81 (patch)
tree9766b46c04388d33be043c20c7f32f42cefdaeef /chef/lib/chef/knife/cookbook_upload.rb
parentf5dff9b20f680751c016ff1f94e65a98eae1dd2e (diff)
downloadchef-28aa5cf384359a04a280a72b171cabacb9d6ea81.tar.gz
[CHEF-2037] detect broken symlinks in cookbooks and error out
also modernized the output to use the new ui class
Diffstat (limited to 'chef/lib/chef/knife/cookbook_upload.rb')
-rw-r--r--chef/lib/chef/knife/cookbook_upload.rb38
1 files changed, 29 insertions, 9 deletions
diff --git a/chef/lib/chef/knife/cookbook_upload.rb b/chef/lib/chef/knife/cookbook_upload.rb
index 531102024d..e7e8e1dcc0 100644
--- a/chef/lib/chef/knife/cookbook_upload.rb
+++ b/chef/lib/chef/knife/cookbook_upload.rb
@@ -23,6 +23,9 @@ class Chef
class Knife
class CookbookUpload < Knife
+ CHECKSUM = "checksum"
+ MATCH_CHECKSUM = /[0-9a-f]{32,}/
+
deps do
require 'chef/exceptions'
require 'chef/cookbook_loader'
@@ -73,7 +76,7 @@ class Chef
else
if @name_args.empty?
show_usage
- Chef::Log.fatal("You must specify the --all flag or at least one cookbook name")
+ ui.error("You must specify the --all flag or at least one cookbook name")
exit 1
end
@name_args.each do |cookbook_name|
@@ -83,12 +86,13 @@ class Chef
upload(cookbook)
version_constraints_to_update[cookbook_name] = cookbook.version
rescue Exceptions::CookbookNotFoundInRepo => e
- Log.error("Could not find cookbook #{cookbook_name} in your cookbook path, skipping it")
+ ui.error("Could not find cookbook #{cookbook_name} in your cookbook path, skipping it")
Log.debug(e)
end
end
end
+ ui.info "upload complete"
update_version_constraints(version_constraints_to_update) if config[:environment]
end
@@ -117,7 +121,7 @@ class Chef
environment
rescue Net::HTTPServerException => e
if e.response.code.to_s == "404"
- Log.error "The environment #{config[:environment]} does not exist on the server"
+ ui.error "The environment #{config[:environment]} does not exist on the server, aborting."
Log.debug(e)
exit 1
else
@@ -126,22 +130,38 @@ class Chef
end
def upload(cookbook)
- Chef::Log.info("** #{cookbook.name} **")
+ if config[:all]
+ ui.info("** #{cookbook.name} **")
+ else
+ ui.info "Uploading #{cookbook.name}..."
+ end
+ check_for_broken_links(cookbook)
Chef::CookbookUploader.new(cookbook, config[:cookbook_path], :force => config[:force]).upload_cookbook
rescue Net::HTTPServerException => e
case e.response.code
- when "401"
- Log.error "Request failed due to authentication (#{e}), check your client configuration (username, key)"
- Log.debug(e)
- exit 18
when "409"
- Log.error "Version #{cookbook.version} of cookbook #{cookbook.name} is frozen. Use --force to override."
+ ui.error "Version #{cookbook.version} of cookbook #{cookbook.name} is frozen. Use --force to override."
Log.debug(e)
else
raise
end
end
+ # if only you people wouldn't put broken symlinks in your cookbooks in
+ # the first place. ;)
+ def check_for_broken_links(cookbook)
+ broken_files = cookbook.manifest_records_by_path.select do |path, info|
+ info[CHECKSUM].nil? || info[CHECKSUM] !~ MATCH_CHECKSUM
+ end
+ unless broken_files.empty?
+ broken_filenames = Array(broken_files).map {|path, info| path}
+ ui.error "The cookbook #{cookbook.name} has one or more broken files"
+ ui.info "This is probably caused by broken symlinks in the cookbook directory"
+ ui.info "The broken file(s) are: #{broken_filenames.join(' ')}"
+ exit 1
+ end
+ end
+
end
end
end