class Packagit::Executable

Constants

RELEASES_DIR

Public Class Methods

new(argv) click to toggle source
# File lib/packagit/executable.rb, line 13
def initialize(argv)
  pwd = Pathname.new(Dir.pwd)
  @config = pwd.join(".packagit")
  version = "undefined"
  if @config.exist?
    if @specification = Packagit::Specification.load(@config)
      version = @specification.version
    end
  end
  @options = {
    checksums: true,
    releases: pwd.join(RELEASES_DIR, version),
    packagers: pwd.join("packagers"),
    tmp: pwd.join("tmp", "packagit")
  }
  optparse = OptionParser.new do |opts|
    opts.banner = "Usage: packagit [options]"
    opts.on('-s', '--[no-]checksums', "Compute check sums (default: #{@options[:checksums]})") do |cs|
      @options[:checksums] = cs
    end
    opts.on('-b', '--builds BUILD[,...]', 'Select builds') do |builds|
      @options[:builds] ||= []
      @options[:builds] += builds.split(/[\,[[:space:]]]+/)
    end
    opts.on('-p', '--packagers PATH', "Define packagers directory (default: #{@options[:packagers]})") do |path|
      @options[:packagers] = Pathname.new(File.expand_path(path))
    end
    opts.on('-r', '--releases PATH', "Define releases directory  (default: #{@options[:releases]})") do |path|
      @options[:releases] = Pathname.new(File.expand_path(path))
    end
    opts.on('-t', '--tmp PATH', "Define temporary directory (default: #{@options[:tmp]})") do |path|
      @options[:tmp] = Pathname.new(path).expand_path
    end
    opts.on('-h', '--help', 'Display this screen') do
      puts opts
      exit
    end
  end
  optparse.parse!

  unless @specification
    puts "Need a config file (.packagit)"
    exit(1)
  end

  unless @builds = @options.delete(:builds)
    @builds ||= []
    if @options[:packagers].exist?
      Dir.chdir(@options[:packagers]) do
        @builds += Dir.glob("*")
      end
    end
  end
  @builds.sort!
end

Public Instance Methods

invoke!() click to toggle source
# File lib/packagit/executable.rb, line 69
def invoke!
  exit(0) if @builds.empty?

  FileUtils.rm_rf(@options[:tmp])

  # Prepare a clean export of the files
  reference = @options[:tmp].join("reference")
  FileUtils.mkdir_p(reference)

  for file in @specification.files
    source = Pathname.new(file).expand_path
    dest = reference.join(file)
    FileUtils.mkdir_p(dest.dirname)
    FileUtils.cp(source, dest) unless source.directory?
  end

  FileUtils.rm_rf(@options[:releases])
  
  # Launch builds
  STDOUT.sync = true
  now = Time.now
  builds_dir = @options[:tmp].join("builds") 
  for build in @builds
    print "Build #{build}... "
    build_dir = builds_dir.join(build)
    FileUtils.mkdir_p(build_dir.dirname)
    FileUtils.cp_r(reference, build_dir)
    script = @options[:packagers].join(build).join("build")
    release = @options[:releases].join(build)
    FileUtils.mkdir_p(release)
    command   = "BUILD_APP=#{@specification.name}"
    command << " BUILD_VERSION=#{@specification.version}"
    command << " BUILD_DIR=#{build_dir}"
    command << " BUILD_TYPE=#{build}"
    command << " BUILD_LOG=#{builds_dir.join(build + '.log')}"
    command << " BUILD_RELEASE=#{release}"
    command << " #{script} > source.log"
    if script.exist?
      puts command
      `#{command}`
    else
      puts "No script! (#{command})"
    end
    unless release.exist?
      File.write(@options[:releases].join(build, ".placeholder"), "#{@specification.name} #{@specification.version} #{build}")
    end
  end

  if @options[:checksums]
    Dir.chdir(@options[:releases]) do
      files = `find . -type f`.split(/\s+/)
      for algo in %w(sha256 sha1 md5)
        command = "#{algo}sum #{files.join(' ')} > " + @options[:releases].join("#{algo.upcase}SUMS").to_s
        puts command
        system(command)
      end
    end
  end
  
end