1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
|
begin
require "rubygems/package_task"
rescue LoadError
# rake/gempackagetask will go away some day
require "rake/gempackagetask"
Gem::PackageTask = Rake::GemPackageTask
end
##
# Package plugin for hoe.
#
# === Tasks Provided:
#
# install_gem:: Install the package as a gem.
# prerelease:: Hook for pre-release actions like sanity checks.
# postrelease:: Hook for post-release actions like release announcements.
# release:: Package and upload the release.
module Hoe::Package
##
# Optional: Should package create a tarball? [default: true]
attr_accessor :need_tar
##
# Optional: Should package create a zipfile? [default: false]
attr_accessor :need_zip
##
# Initialize variables for plugin.
def initialize_package
self.need_tar ||= false
self.need_zip ||= false
end
##
# Define tasks for plugin.
def define_package_tasks
prerelease_version
Gem::PackageTask.new spec do |pkg|
pkg.need_tar = @need_tar
pkg.need_zip = @need_zip
end
desc "Install the package as a gem. (opt. NOSUDO=1)"
task :install_gem => [:clean, :package, :check_extra_deps] do
install_gem Dir["pkg/*.gem"].first
end
desc "Package and upload; Requires VERSION=x.y.z (optional PRE=a.1)"
task :release => [:prerelease, :release_to, :postrelease]
# no doco, invisible hook
task :prerelease do
abort "Fix your version before you release" if spec.version =~ /borked/
end
# no doco, invisible hook
task :release_to
# no doco, invisible hook
task :postrelease
desc "Sanity checks for release"
task :release_sanity do
v = ENV["VERSION"] or abort "Must supply VERSION=x.y.z"
pre = ENV["PRERELEASE"] || ENV["PRE"]
v += ".#{pre}" if pre
abort "Versions don't match #{v} vs #{version}" if v != version
end
end
##
# Returns the path used for packaging. Convenience method for those
# that need to write a package hook.
def pkg_path
"pkg/#{spec.full_name}"
end
##
# Install the named gem.
def install_gem name, version = nil, rdoc = true
should_not_sudo = Hoe::WINDOZE || ENV["NOSUDO"] || File.writable?(Gem.dir)
null_dev = Hoe::WINDOZE ? "> NUL 2>&1" : "> /dev/null 2>&1"
gem_cmd = Gem.default_exec_format % "gem"
sudo = "sudo " unless should_not_sudo
local = "--local" unless version
version = "--version '#{version}'" if version
cmd = "#{sudo}#{gem_cmd} install #{local} #{name} #{version}"
cmd += " --no-document" unless rdoc
cmd += " #{null_dev}" unless Rake.application.options.trace
puts cmd if Rake.application.options.trace
result = system cmd
Gem::Specification.reset
result
end
def prerelease_version # :nodoc:
pre = ENV["PRERELEASE"] || ENV["PRE"]
return unless pre
spec.version = "#{spec.version}.#{pre}"
abort "ERROR: You should format PRE like pre or alpha.1 or something" if
(Gem::VERSION < "1.4" and pre !~ /^[a-z]+(\.\d+)?$/) or
(Gem::VERSION >= "1.4" and pre !~ /^[a-z]+(\.?\d+)?$/)
end
end
|