class Dpkg::S3::Manifest

Manifest is resposible of creating/retrieving and rebuilding the debian Package manifest with standard information required when publishing the packages to a S3 debian repository

Attributes

architecture[RW]
cache_control[RW]
codename[RW]
component[RW]
fail_if_exists[RW]
files[RW]
packages[R]
packages_to_be_upload[R]
skip_package_upload[RW]

Public Class Methods

new() click to toggle source
# File lib/dpkg/s3/manifest.rb, line 21
def initialize
  @packages = []
  @packages_to_be_upload = []
  @component = nil
  @architecture = nil
  @files = {}
  @cache_control = ''
  @fail_if_exists = false
  @skip_package_upload = false
end
parse_packages(str) click to toggle source
# File lib/dpkg/s3/manifest.rb, line 49
def parse_packages(str)
  m = new
  str.split("\n\n").each do |s|
    next if s.chomp.empty?

    m.packages << Dpkg::S3::Package.parse_string(s)
  end
  m
end
retrieve(codename, component, architecture, cache_control, fail_if_exists, skip_upload: false) click to toggle source
# File lib/dpkg/s3/manifest.rb, line 33
def retrieve(codename, component, architecture, cache_control, fail_if_exists, skip_upload: false)
  m = if (s = Dpkg::S3::Utils.s3_read("dists/#{codename}/#{component}/binary-#{architecture}/Packages"))
        parse_packages(s)
      else
        new
      end

  m.codename = codename
  m.component = component
  m.architecture = architecture
  m.cache_control = cache_control
  m.fail_if_exists = fail_if_exists
  m.skip_package_upload = skip_upload
  m
end

Public Instance Methods

add(pkg, preserve_versions, needs_uploading: true) click to toggle source
# File lib/dpkg/s3/manifest.rb, line 60
def add(pkg, preserve_versions, needs_uploading: true)
  if fail_if_exists
    packages.each do |p|
      next unless p.name == pkg.name && \
                  p.full_version == pkg.full_version && \
                  File.basename(p.url_filename(@codename)) == \
                  File.basename(pkg.url_filename(@codename))

      raise AlreadyExistsError,
            "package #{pkg.name}_#{pkg.full_version} already exists " \
            "with filename (#{p.url_filename(@codename)})"
    end
  end
  if preserve_versions
    packages.delete_if { |p| p.name == pkg.name && p.full_version == pkg.full_version }
  else
    packages.delete_if { |p| p.name == pkg.name }
  end
  packages << pkg
  packages_to_be_upload << pkg if needs_uploading
  pkg
end
delete_package(pkg, versions = nil) click to toggle source
# File lib/dpkg/s3/manifest.rb, line 83
def delete_package(pkg, versions = nil)
  new_packages = @packages.select do |p|
    # Include packages we didn't name
    # Also include the packages not matching a specified version
    if p.name != pkg || (!versions.nil? && (p.name == pkg) && !versions.include?(p.version) &&
          !versions.include?("#{p.version}-#{p.iteration}") && !versions.include?(p.full_version))
      p
    end
  end
  deleted = @packages - new_packages
  @packages = new_packages
  deleted
end
generate() click to toggle source
# File lib/dpkg/s3/manifest.rb, line 97
def generate
  @packages.collect { |pkg| pkg.generate(@codename) }.join("\n")
end
hashfile(path) click to toggle source
# File lib/dpkg/s3/manifest.rb, line 136
def hashfile(path)
  {
    size: File.size(path),
    sha1: Digest::SHA1.file(path).hexdigest,
    sha256: Digest::SHA2.file(path).hexdigest,
    md5: Digest::MD5.file(path).hexdigest
  }
end
write_to_s3() { |url_filename| ... } click to toggle source
# File lib/dpkg/s3/manifest.rb, line 101
def write_to_s3
  manifest = generate

  unless skip_package_upload
    # store any packages that need to be stored
    @packages_to_be_upload.each do |pkg|
      yield pkg.url_filename(@codename) if block_given?
      s3_store(pkg.filename, pkg.url_filename(@codename), 'application/x-debian-package', cache_control,
               fail_if_exists: fail_if_exists)
    end
  end

  # generate the Packages file
  pkgs_temp = Tempfile.new('Packages')
  pkgs_temp.write manifest
  pkgs_temp.close
  f = "dists/#{@codename}/#{@component}/binary-#{@architecture}/Packages"
  yield f if block_given?
  s3_store(pkgs_temp.path, f, 'text/plain; charset=utf-8', cache_control)
  @files["#{@component}/binary-#{@architecture}/Packages"] = hashfile(pkgs_temp.path)
  pkgs_temp.unlink

  # generate the Packages.gz file
  gztemp = Tempfile.new('Packages.gz')
  gztemp.close
  Zlib::GzipWriter.open(gztemp.path) { |gz| gz.write manifest }
  f = "dists/#{@codename}/#{@component}/binary-#{@architecture}/Packages.gz"
  yield f if block_given?
  s3_store(gztemp.path, f, 'application/x-gzip', cache_control)
  @files["#{@component}/binary-#{@architecture}/Packages.gz"] = hashfile(gztemp.path)
  gztemp.unlink

  nil
end