class DownloadCommand

Public Class Methods

new(args) click to toggle source
# File lib/commands/download_command.rb, line 18
def initialize(args)
  @config = args[:config]
  @networking = args[:networking]
  @api = args[:api]
  @platforms = args[:platforms]
end
new_with_defaults(options) click to toggle source
# File lib/commands/download_command.rb, line 4
def self.new_with_defaults(options)
  shell = ShellWrapper.new
  config = Configuration.new(shell)
  networking = Networking.new(config, options[:is_retry_enabled])
  api = API.new(shell, config, networking, options)

  DownloadCommand.new(
    config: config,
    networking: networking,
    api: api,
    platforms: options[:platforms],
  )
end

Public Instance Methods

run() click to toggle source
# File lib/commands/download_command.rb, line 25
def run
  @config.ensure_shell_commands
  @api.verify_server_version

  pool = Concurrent::FixedThreadPool.new(THREAD_POOL_SIZE)

  @mutex = Mutex.new
  @number_of_downloaded_archives = 0
  @number_of_skipped_archives = 0
  @total_archive_size = 0
  errors = Concurrent::Array.new

  for carthage_dependency in @config.carthage_resolved_dependencies
    pool.post(carthage_dependency) do |carthage_dependency|
      begin
        download(carthage_dependency)
      rescue => e
        errors << e
      end
    end
  end

  pool.shutdown
  pool.wait_for_termination

  if errors.count > 0
    raise MultipleErrorsError.new(errors)
  else
    puts "Downloaded and extracted #{@number_of_downloaded_archives} archives " +
           "(#{format_file_size(@total_archive_size)}), " +
           "skipped #{@number_of_skipped_archives} archives."
  end
end

Private Instance Methods

download(carthage_dependency) click to toggle source
# File lib/commands/download_command.rb, line 61
def download(carthage_dependency)
  local_version_file = if File.exist?(carthage_dependency.version_filepath)
      carthage_dependency.new_version_file
    else
      nil
    end

  if !local_version_file.nil? && @api.version_file_matches_server?(carthage_dependency, local_version_file, @platforms)
    $LOG.debug("Version file #{local_version_file.path} matches server version, skipping download")
    @mutex.synchronize do
      @number_of_skipped_archives += local_version_file.number_of_frameworks
    end
    return
  end

  version_file = @networking.download_version_file(carthage_dependency, @platforms)
  raise AppError.new, "Version file #{carthage_dependency.version_filename} is not present on the server, please run `carthagerc upload` first" if version_file.nil?

  version_file.frameworks_by_platform.each do |platform, framework_names|
    for framework_name in framework_names
      archive_size = @api.download_and_unpack_archive(carthage_dependency, framework_name, platform)
      @mutex.synchronize do
        @number_of_downloaded_archives += 1
        @total_archive_size += archive_size
      end
    end
  end
  version_file.move_to_build_dir
end