make_gem.rb   [plain text]


#!/usr/bin/env ruby

require 'optparse'
require 'ostruct'
require 'tmpdir'
require 'fileutils'

options = OpenStruct.new
options.output_dir = File.expand_path(Dir.pwd)

opts = OptionParser.new do |opts|
  opts.banner += " DIRECTORIES"
  opts.on("-oDIRECTORY", "--output-dir=DIRECTORY",
          "Output generated gem to DIRECTORY",
          "[#{options.output_dir}]") do |dir|
    options.output_dir = File.expand_path(dir)
  end

  opts.separator ""

  opts.on("-h", "--help", "Show this message") do
    puts opts
    exit
  end
end

target_dirs = opts.parse!(ARGV)
if target_dirs.empty?
  puts opts
  exit 1
end

target_dirs.each do |dir|
  next unless File.basename(dir) == "ruby"
  base_dir = File.expand_path(dir)
  $LOAD_PATH.unshift(File.join(base_dir, "ext"))
  $LOAD_PATH.unshift(File.join(base_dir, "lib"))
end

require 'svn/core'


archive_dir = File.join(Dir.tmpdir, "svn-ruby-gem-#{Process.pid}")
FileUtils.mkdir(archive_dir)
at_exit {FileUtils.rm_rf(archive_dir)}

target_dirs.each do |dir|
  FileUtils.cp_r(dir, archive_dir)
end


generated_gem_file = nil
Dir.chdir(archive_dir) do
  require 'rubygems'
  Gem.manage_gems

  spec = Gem::Specification.new do |s|
    s.name = "subversion"
    s.date = Time.now
    s.version = Svn::Core::VER_NUM
    s.summary = "The Ruby bindings for Subversion."
    s.email = "dev@subversion.tigris.org"
    s.homepage = "http://subversion.tigris.org/"
    s.description = s.summary
    s.authors = ["Kouhei Sutou"]
    s.files = Dir.glob(File.join("**", "*")).delete_if {|x| /\.gem$/i =~ x}
    s.require_paths = ["ruby/ext", "ruby/lib"]
    s.platform = Gem::Platform::WIN32
    s.required_ruby_version = '>= 1.8.2'
  end

  generated_gem_file = File.expand_path(Gem::Builder.new(spec).build)
end

gem_file = File.join(options.output_dir, File.basename(generated_gem_file))
FileUtils.mv(generated_gem_file, gem_file)