require 'reap/task' begin require 'rubygems' rescue # no rubygems end # # Package Task # # This task allows on to create standard .zip, .tgz, or .tbz # packages, plus create gem distributions. # class Reap::PackageTask < Reap::Task section_name :package attr_accessor :dir, :name, :version, :package_name, :author, :email, :summary, :project, :homepage, :include, :exclude, :zip, :gzip, :bzip2, :gem, :gem_platform, :gem_autorequire, :gem_dependencies, :requirements, :executables def init @dir = section['dir'] || 'pkg' @name = section['name'] || master['name'] @version = section['version'] || master['version'] || '0.0.1' @package_name = @name + '-' + @version @author = section['author'] || master['author'] @email = section['email'] || master['email'] @summary = section['summary'] || master['summary'] @project = section['project'] || master['rubyforge']['project'] @homepage = section['homepage'] || master['homepage'] || master['rubyforge']['homepage'] @include = section['include'] || DEFAULT_INCLUDE @exclude = MUST_EXCLUDE + section['exclude'] @zip = section['zip'].nil? ? true : section['zip'] @gzip = section['gzip'].nil? ? true : section['zip'] @bzip2 = section['bzip2'].nil? ? true : section['zip'] @gem = section['gem'].nil? ? true : section['gem'] # gem specific if defined?(Gem) if section['platform'] @gem_platform = ::Gem.const_get(section['platform']) else @gem_platform = ::Gem::Platform::RUBY end @gem_autorequire = section['autorequire'] @gem_dependencies = section['dependencies'] || [] @requirements = section['requirements'] || [] @executables = section['executables'] || [] end end def define desc "build .tgz, .tbz (.bzip2), .zip and/or .gem packages *" task :package do run_package end end private def run_package # create package image if FileTest.directory?(@dir) print "Directory '#{@dir}' already exists. Clobber? [y/N] " until inp = $stdin.gets[0,1] ; sleep 1 ; end if (inp || 'y').downcase == 'y' puts "Removing old directory '#{File.expand_path(@dir)}'..." trash_dir = ".trash/#{File.basename(@dir)}" FileUtils.mkdir_p(".trash") unless FileTest.directory?(".trash") FileUtils.rm_r(trash_dir) if FileTest.exists?(trash_dir) FileUtils.mv(@dir, trash_dir) else puts "Reap package task canceled." exit 0 end end package_dir_path = "#{@dir}/#{@package_name}" package_files = FileList.new package_files.include(*@include) package_files.exclude(*@exclude) if @exclude and not @exclude.empty? FileUtils.mkdir_p @dir #rescue nil package_files.each do |fn| f = File.join(package_dir_path, fn) fdir = File.dirname(f) FileUtils.mkdir_p(fdir) if not File.exist?(fdir) if File.directory?(fn) FileUtils.mkdir_p(f) else FileUtils.rm_f(f) FileUtils.safe_ln(fn, f) end end # create standard package files FileUtils.chdir(@dir) do # tar bzip2 for unix if @bzip2 puts "\nReap is shelling out work to tar and bzip2..." sh %{tar --bzip2 -cvf #{@package_name}.tbz #{@package_name}} end # tar gzip for unix if @gzip puts "\nReap is shelling out work to tar and gzip..." sh %{tar --gzip -cvf #{@package_name}.tgz #{@package_name}} end # zip for windows if @zip puts "\nReap is shelling out work to zip..." sh %{zip -r #{@package_name}.zip #{@package_name}} end puts end # create gem package run_gem if defined?(Gem) and @gem return true end def run_gem spec = Gem::Specification.new { |s| s.name = @name s.version = @version @gem_dependencies.each{ |d,v| if v s.add_dependency(d, v) else s.add_dependency(d) end } s.platform = @gem_platform s.summary = @summary s.requirements = @requirements # s.files = Dir.glob("lib/**/*").delete_if {|item| item.include?("CVS")} # s.files.concat Dir.glob("bin/**/*").delete_if {|item| item.include?("CVS")} package_files = FileList.new package_files.include(*@include) package_files.exclude(*@exclude) if @exclude and not @exclude.empty? s.files = package_files.to_a s.require_path = 'lib' s.autorequire = @gem_autorequire if @gem_autorequire s.author = @author s.email = @email s.rubyforge_project = @project s.homepage = @homepage s.executables = @executables s.bindir = "bin" } puts "Reap is shelling out work to the Gem Package Manager..." Gem.manage_gems Gem::Builder.new(spec).build sh %{mv ./*.gem #{@dir}/} end end