class Akabei::Builder

Attributes

signer[RW]

Public Class Methods

new(opts = {}) click to toggle source
# File lib/akabei/builder.rb, line 14
def initialize(opts = {})
  self.srcdest = opts[:srcdest]
  self.pkgdest = opts[:pkgdest]
  self.logdest = opts[:logdest]
  self.signer = opts[:signer]
end

Public Instance Methods

build_package(dir, chroot_tree) click to toggle source
# File lib/akabei/builder.rb, line 21
def build_package(dir, chroot_tree)
  Dir.mktmpdir do |tmp_pkgdest|
    wrap_dir(:srcdest) do
      wrap_dir(:logdest) do
        tmp_pkgdest = Pathname.new(tmp_pkgdest)
        env = {
          SRCDEST: srcdest.realpath,
          PKGDEST: tmp_pkgdest.realpath,
          LOGDEST: logdest.realpath,
        }
        chroot_tree.makechrootpkg(dir, env)
        gather_packages(tmp_pkgdest)
      end
    end
  end
end
copy_and_sign_package(package_path, dest) click to toggle source
# File lib/akabei/builder.rb, line 47
def copy_and_sign_package(package_path, dest)
  FileUtils.cp(package_path, dest)
  if signer
    signer.detach_sign(dest)
  end
rescue => e
  begin
    dest.unlink
  rescue Errno::ENOENT
  end
  raise e
end
find_source_package(srcpkgdest) click to toggle source
# File lib/akabei/builder.rb, line 105
def find_source_package(srcpkgdest)
  children = srcpkgdest.each_child.to_a
  if children.empty?
    raise Error.new("makepkg --source generated nothing")
  elsif children.size > 1
    raise Error.new("makepkg --source generated multiple files???: #{children.map(&:to_s)}")
  else
    children.first
  end
end
gather_packages(tmp_pkgdest) click to toggle source
# File lib/akabei/builder.rb, line 38
def gather_packages(tmp_pkgdest)
  pkgdest.mkpath
  tmp_pkgdest.each_child.map do |package_path|
    dest = pkgdest.join(package_path.basename)
    copy_and_sign_package(package_path, dest)
    Package.new(dest)
  end
end
makepkg_source(dir, srcdest, srcpkgdest, builddir) click to toggle source
# File lib/akabei/builder.rb, line 96
def makepkg_source(dir, srcdest, srcpkgdest, builddir)
  env = {
    SRCDEST: srcdest.realpath,
    SRCPKGDEST: srcpkgdest.realpath,
    BUILDDIR: builddir.realpath,
  }
  System.system(%w[makepkg --source], chdir: dir, env: env)
end
with_source_package(dir, &block) click to toggle source
# File lib/akabei/builder.rb, line 78
def with_source_package(dir, &block)
  dir = Pathname.new(dir)
  Dir.mktmpdir do |tmp_srcpkgdest|
    tmp_srcpkgdest = Pathname.new(tmp_srcpkgdest)
    Dir.mktmpdir do |builddir|
      builddir = Pathname.new(builddir)
      wrap_dir(:srcdest) do
        makepkg_source(dir, srcdest, tmp_srcpkgdest, builddir)
      end
    end

    srcpkg = find_source_package(tmp_srcpkgdest)
    # Remove symlink created by makepkg
    dir.join(srcpkg.basename).unlink
    block.call(srcpkg)
  end
end
wrap_dir(attr, &block) click to toggle source
# File lib/akabei/builder.rb, line 60
def wrap_dir(attr, &block)
  old_dir = instance_variable_get("@#{attr}")
  if old_dir.nil?
    Dir.mktmpdir do |tmp|
      dir = Pathname.new(tmp)
      instance_variable_set("@#{attr}", dir)
      # Must be world-executable because it is referred from inside chroot.
      dir.chmod(0755)
      block.call
    end
  else
    old_dir.mkpath
    block.call
  end
ensure
  instance_variable_set("@#{attr}", old_dir)
end