From 28aa5cf384359a04a280a72b171cabacb9d6ea81 Mon Sep 17 00:00:00 2001 From: Daniel DeLeo Date: Tue, 5 Apr 2011 22:40:57 -0700 Subject: [CHEF-2037] detect broken symlinks in cookbooks and error out also modernized the output to use the new ui class --- chef/lib/chef/knife/cookbook_upload.rb | 38 ++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 9 deletions(-) (limited to 'chef/lib/chef/knife/cookbook_upload.rb') 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 -- cgit v1.2.1