class DPL::Provider::Packagecloud

Public Instance Methods

check_auth() click to toggle source
# File lib/dpl/provider/packagecloud.rb, line 6
def check_auth
  setup_auth
  timeout_options = {
    connect_timeout: (options[:connect_timeout] || 60).to_i,
    read_timeout:    (options[:read_timeout] || 60).to_i,
    write_timeout:   (options[:write_timeout] || 180.to_i)
  }
  connection = ::Packagecloud::Connection.new("https", "packagecloud.io", "443", timeout_options)
  begin
    log "Timeout configuration: #{timeout_options.inspect}"
    @client = ::Packagecloud::Client.new(@creds, "travis-ci dpl #{DPL::VERSION}", connection)
  rescue ::Packagecloud::UnauthenticatedException
    error "Could not authenticate to https://packagecloud.io, please check credentials"
  end
end
dist_required?(filename) click to toggle source
# File lib/dpl/provider/packagecloud.rb, line 53
def dist_required?(filename)
  ext = File.extname(filename).gsub!('.','')
  if ext.nil?
    error "filename: #{filename} has no extension!"
  end
  ["rpm", "deb", "dsc", "whl", "egg", "egg-info", "gz", "zip", "tar", "bz2", "z", "tgz"].include?(ext.downcase)
end
error_if_dist_required(filename) click to toggle source
# File lib/dpl/provider/packagecloud.rb, line 61
def error_if_dist_required(filename)
  if dist_required?(filename) && @dist.nil?
    error "Distribution needed for rpm, deb, python, and dsc packages, example --dist='ubuntu/breezy'"
  end
end
get_distro(query) click to toggle source
# File lib/dpl/provider/packagecloud.rb, line 35
def get_distro(query)
  distro = nil
  begin
    distro = @client.find_distribution_id(query)
  rescue ArgumentError => exception
    error "Error: #{exception.message}"
  end
  if distro.nil?
    error "Could not find distribution named #{query}"
  end
  distro
end
get_source_files_for(orig_filename) click to toggle source
# File lib/dpl/provider/packagecloud.rb, line 72
def get_source_files_for(orig_filename)
  source_files = {}
  glob_args = ["**/*"]
  package = ::Packagecloud::Package.new(:file => orig_filename)
  result = @client.package_contents(@repo, package, get_distro(@dist))
  if result.succeeded
    package_contents_files = result.response["files"].map { |x| x["filename"] }
    Dir.chdir(options.fetch(:local_dir, Dir.pwd)) do
      Dir.glob(*glob_args) do |filename|
        unless File.directory?(filename)
          basename = File.basename(filename)
          if package_contents_files.include?(basename)
            log "Found source fragment: #{basename} for #{orig_filename}"
            source_files = source_files.merge({basename => open(filename)})
          end
        end
      end
    end
  else
    error "Error: #{result.response}"
  end
  source_files
end
is_source_package?(filename) click to toggle source
# File lib/dpl/provider/packagecloud.rb, line 67
def is_source_package?(filename)
  ext = File.extname(filename).gsub!('.','')
  ext == 'dsc'
end
is_supported_package?(filename) click to toggle source
# File lib/dpl/provider/packagecloud.rb, line 48
def is_supported_package?(filename)
  ext = File.extname(filename).gsub!('.','')
  ::Packagecloud::SUPPORTED_EXTENSIONS.include?(ext)
end
needs_key?() click to toggle source
# File lib/dpl/provider/packagecloud.rb, line 22
def needs_key?
  false
end
push_app() click to toggle source
# File lib/dpl/provider/packagecloud.rb, line 96
def push_app
  forced = options.fetch(:force, nil)
  packages = []
  glob_args = Array(options.fetch(:package_glob, '**/*'))
  Dir.chdir(options.fetch(:local_dir, Dir.pwd)) do
    Dir.glob(*glob_args) do |filename|
      unless File.directory?(filename)
        if is_supported_package?(filename)
          log "Detected supported package: #{filename}"
          error_if_dist_required(filename)
          if is_source_package?(filename)
            log "Processing source package: #{filename}"
            source_files = get_source_files_for(filename)
            packages << ::Packagecloud::Package.new(:file => filename, :source_files => source_files)
          else
            packages << ::Packagecloud::Package.new(:file => filename)
          end
        end
      end
    end
  end

  packages.each do |package|
    if forced
      log "Deleting package: #{package.filename}"
      distro, distro_release = @dist.split("/")
      result = @client.delete_package(@repo, distro, distro_release, package.filename)
      if result.succeeded
        log "Successfully deleted #{package.filename} on #{@dist}"
      else
        error "Error #{result.response}"
      end
    end
    log "Pushing package: #{package.filename}"
    if dist_required?(package.filename)
      result = @client.put_package(@repo, package, get_distro(@dist))
    else
      result = @client.put_package(@repo, package)
    end

    if result.succeeded
      log "Successfully pushed #{package.filename} to #{@username}/#{@repo}"
    else
      error "Error #{result.response}"
    end
  end
  if packages.empty?
    error "Error: No supported packages found! Perhaps try skip_cleanup: true"
  end
end
setup_auth() click to toggle source
# File lib/dpl/provider/packagecloud.rb, line 26
def setup_auth
  @username = option(:username)
  @token = option(:token)
  @repo = option(:repository)
  @dist = option(:dist) if options[:dist]
  @creds = ::Packagecloud::Credentials.new(@username, @token)
  log "Logging into https://packagecloud.io with #{@username}:#{@token[-4..-1].rjust(20, '*')}"
end