class RepoMate::Metafile

Class that can create and delete all metafiles like Packages, Packages.gz, Release and Release.gpg

Public Class Methods

new() click to toggle source

Init

# File lib/repomate/metafile.rb, line 16
def initialize
  @repository = Repository.new
end

Public Instance Methods

all() click to toggle source

Returns a list of all existing metafiles as array

# File lib/repomate/metafile.rb, line 21
def all
  rootdir  = Cfg.rootdir
  dirlist  = ["#{rootdir}/*/*", "#{rootdir}/*/*/*/*"]
  filelist = ["Packages", "Packages.gz", "Release", "Release.gpg" ]
  files = []

  dirlist.each do |dirs|
    Dir.glob(dirs).each do |dir|
      filelist.each do |file|
        fullname = File.join(dir, file)
        files << fullname if File.exists? fullname
      end
    end
  end
  return files
end
create() click to toggle source

Creates all metafiles

# File lib/repomate/metafile.rb, line 44
def create
  puts "Creating Metafiles..."
  
  destroy
  create_packages

  if Cfg.gpg
    if Cfg.gpg_password.nil? || Cfg.gpg_email.nil?
      puts "Configure password and email for GPG!"
      exit 1
    else
      create_release
    end
  end
end
create_packages() click to toggle source

Create Packages* files

# File lib/repomate/metafile.rb, line 61
def create_packages
  source_category = "dists"

  packages_template = ERB.new File.new(File.join(File.dirname(__FILE__), "templates/packages.erb")).read, nil, "%"
  
  Architecture.dataset(source_category).each do |entry|
    
    source  = Architecture.new(entry[:architecture], entry[:component], entry[:suitename], source_category)
    source.files.each do |fullname|
      package = Package.new(fullname, entry[:suitename], entry[:component])

      checksums = package.load_checksums

      packagesfile = File.join(entry[:fullpath], "Packages")
      size         = File.size(fullname)
      path         = File.join("dists", entry[:suitename], entry[:component], entry[:architecture_dir], package.newbasename)

      File.open(packagesfile, 'a') do |file|
        package.controlfile.each { |key, value| file.puts "#{key}: #{value}" unless value.to_s.empty? }
        file.puts packages_template.result(binding)
      end
      raise "Could not gzip" unless system "gzip -9 -c #{packagesfile} > #{packagesfile}.gz"
    end
  end
end
create_release() click to toggle source

Create Release* files

# File lib/repomate/metafile.rb, line 88
def create_release
  source_category = "dists"
  suites          = []
  archrelease_template  = ERB.new File.new(File.join(File.dirname(__FILE__), "templates/archrelease.erb")).read, nil, "%"
  suiterelease_template = ERB.new File.new(File.join(File.dirname(__FILE__), "templates/suiterelease.erb")).read, nil, "%"

  now = Time.new.strftime("%a, %d %b %Y %H:%M:%S %Z")

  Architecture.dataset(source_category).each do |entry|
    releasefile = File.join(entry[:fullpath], "Release")

    suites << entry[:suitename] unless suites.include?(entry[:suitename])

    File.open(releasefile, 'w') { |file| file.puts archrelease_template.result(binding) }
  end

  suites.each do |suite|
    architecture = []
    component    = []

    Architecture.dataset(source_category).each do |entry|
      if entry[:suitename].eql?(suite)
        architecture << entry[:architecture] unless architecture.include?(entry[:architecture])
        component << entry[:component] unless component.include?(entry[:component])
      end
    end

    releasefile = File.join(Cfg.rootdir, source_category, suite, "Release")
    File.open(releasefile, 'w') { |file| file.puts suiterelease_template.result(binding).gsub(/^\s+\n|^\n|^\s{3}/, '') }
    
    begin
      sign(releasefile)
    rescue
      destroy
      create_packages
      puts "GPG email/password incorrect or gpg is not installed!"
      return
    end
  end
end
destroy() click to toggle source

Deletes all existing metafiles

# File lib/repomate/metafile.rb, line 39
def destroy
  all.each { |file| FileUtils.rm_f(file) }
end
sign(file) click to toggle source

Sign a file

# File lib/repomate/metafile.rb, line 130
def sign(file)
  crypto = GPGME::Crypto.new :password => Cfg.gpg_password
  outfile = "#{file}.gpg"
  output = File.open(outfile, 'w')
  crypto.sign File.open(file, 'r'), :symmetric => false, :output => output, :signer => Cfg.gpg_email, :mode => GPGME::SIG_MODE_DETACH
end