# File lib/chef/knife/cookbook_upload.rb, line 70
      def run
        config[:cookbook_path] ||= Chef::Config[:cookbook_path]

        assert_environment_valid!
        warn_about_cookbook_shadowing
        version_constraints_to_update = {}
        # Get a list of cookbooks and their versions from the server
        # for checking existence of dependending cookbooks.
        @server_side_cookbooks = Chef::CookbookVersion.list

        if config[:all]
          justify_width = cookbook_repo.cookbook_names.map {|name| name.size}.max.to_i + 2
          cookbook_repo.each do |cookbook_name, cookbook|
            cookbook.freeze_version if config[:freeze]
            upload(cookbook, justify_width)
            version_constraints_to_update[cookbook_name] = cookbook.version
          end
        else
          if @name_args.empty?
            show_usage
            ui.error("You must specify the --all flag or at least one cookbook name")
            exit 1
          end
          justify_width = @name_args.map {|name| name.size }.max.to_i + 2
          @name_args.each do |cookbook_name|
            begin
              cookbook = cookbook_repo[cookbook_name]
              if config[:depends]
                cookbook.metadata.dependencies.each do |dep, versions|
                  @name_args.push dep
                end
              end
              cookbook.freeze_version if config[:freeze]
              upload(cookbook, justify_width)
              version_constraints_to_update[cookbook_name] = cookbook.version
            rescue Exceptions::CookbookNotFoundInRepo => e
              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