[Rake-devel] [PATCH] Add PGP Signing to PackageTask and GemPackageTask
Paul Duncan
pabs at pablotron.org
Tue Dec 12 22:06:41 EST 2006
Attached is a patch against the trunk that adds basic PGP signing
support (via GnuPG) to PackageTask. It adds an accessor attribute
named "need_pgp_signature". If set, PackageTask and GemPackageTask add
additional file tasks which use GnuPG (http://gnupg.org/) to create
detached PGP signatures of each package file type (.tgz, .tar.gz, .zip,
and .gem).
If that sounds like a bunch of technobabble, don't panic! It's actually
really easy to use. Say you've got the following task:
Rake::GemPackageTask.new(gem_spec) do |pkg|
pkg.need_tar_gz = true
end
To add PGP signing support, you'd make it look like so:
Rake::GemPackageTask.new(gem_spec) do |pkg|
pkg.need_tar_gz = true
pkg.need_pgp_signature = true
end
If you'd like, you can also change the PGP program and/or signature file
extension to something else. Here's an example:
Rake::GemPackageTask.new(gem_spec) do |pkg|
pkg.need_tar_gz = true
# create pgp signatures for package files
pkg.need_pgp_signature = true
# use gpg2 and don't ASCII-armor the signature file
pkg.pgp_command = 'gpg2 -b'
# set the PGP signature extension to .sig
pkg.pgp_file_extension = 'sig'
end
Personally, I like this feature and find it incredibly useful, although
I could be persuaded by the argument that it doesn't really belong in
PackageTask. So, at the moment I'm just tossing this out for
discussion, with the not-so-secret hope of sneaking it in under the
radar and into an actual release ;-).
Anyway, the patch is attached. If you've got a munge-happy email
client, it's also available online at the following URL:
http://pablotron.org/files/rake-20061212-pkg_pgp_sign.diff
These changes also work just fine under Rake 0.7.1, although the patch
doesn't apply cleanly due to minor whitespace differences in 0.7.1. If
you're interested in trying out this patch without upgrading to the
development version of Rake, a patch against 0.7.1 is available here:
http://pablotron.org/files/rake-0.7.1-pkg_pgp_sign.diff
The PGP signatures for both files can be found here:
http://pablotron.org/files/rake-20061212-pkg_pgp_sign.diff.asc
http://pablotron.org/files/rake-0.7.1-pkg_pgp_sign.diff.asc
Happy raking...
--
Paul Duncan <pabs at pablotron.org> OpenPGP Key ID: 0x82C29562
http://www.pablotron.org/ http://www.paulduncan.org/
-------------- next part --------------
Index: lib/rake/packagetask.rb
===================================================================
--- lib/rake/packagetask.rb (revision 577)
+++ lib/rake/packagetask.rb (working copy)
@@ -68,6 +68,15 @@
# List of files to be included in the package.
attr_accessor :package_files
+ # True if a detached, ASCII-armored signature of each package file should be produced (default is false).
+ attr_accessor :need_pgp_signature
+
+ # Command to create detached OpenPGP signature files (default is 'gpg -ba').
+ attr_accessor :pgp_command
+
+ # Extension for detached OpenPGP signature files (default is 'asc').
+ attr_accessor :pgp_file_extension
+
# Create a Package Task with the given name and version.
def initialize(name=nil, version=nil)
init(name, version)
@@ -85,6 +94,11 @@
@need_tar_gz = false
@need_tar_bz2 = false
@need_zip = false
+
+ # pgp defaults (set to use GnuPG by default)
+ @need_pgp_signature = false
+ @pgp_command = 'gpg -ba'
+ @pgp_file_extension = 'asc'
end
# Create the tasks defined by this task library.
@@ -117,6 +131,8 @@
sh %{tar #{flag}cvf #{file} #{package_name}}
end
end
+
+ pgp_task_for(file) if @need_pgp_signature
end
end
@@ -126,6 +142,8 @@
chdir(package_dir) do
sh %{zip -r #{zip_file} #{package_name}}
end
+
+ pgp_task_for(zip_file) if @need_pgp_signature
end
end
@@ -148,6 +166,18 @@
self
end
+ def pgp_task_for(src_file)
+ src_path = "#@package_dir/#{src_file}"
+ sig_path = "#{src_path}.#@pgp_file_extension"
+
+ task :package => [sig_path]
+ file sig_path => [src_path] do
+ chdir(@package_dir) do
+ sh %{#@pgp_command #{src_file}}
+ end
+ end
+ end
+
def package_name
@version ? "#{@name}-#{@version}" : @name
end
Index: lib/rake/gempackagetask.rb
===================================================================
--- lib/rake/gempackagetask.rb (revision 577)
+++ lib/rake/gempackagetask.rb (working copy)
@@ -86,6 +86,8 @@
}
}
end
+
+ pgp_task_for(gem_file) if @need_pgp_signature
end
def gem_file
-------------- next part --------------
diff -ur rake-0.7.1/lib/rake/gempackagetask.rb rake-0.7.1-pgp_sign/lib/rake/gempackagetask.rb
--- rake-0.7.1/lib/rake/gempackagetask.rb 2006-12-12 21:48:03.000000000 -0500
+++ rake-0.7.1-pgp_sign/lib/rake/gempackagetask.rb 2006-12-12 21:40:04.000000000 -0500
@@ -86,6 +86,8 @@
}
}
end
+
+ pgp_task_for(gem_file) if @need_pgp_signature
end
def gem_file
diff -ur rake-0.7.1/lib/rake/packagetask.rb rake-0.7.1-pgp_sign/lib/rake/packagetask.rb
--- rake-0.7.1/lib/rake/packagetask.rb 2006-12-12 21:48:03.000000000 -0500
+++ rake-0.7.1-pgp_sign/lib/rake/packagetask.rb 2006-12-12 21:46:38.000000000 -0500
@@ -68,6 +68,15 @@
# List of files to be included in the package.
attr_accessor :package_files
+ # True if a detached, ASCII-armored signature of each package file should be produced (default is false).
+ attr_accessor :need_pgp_signature
+
+ # Command to create detached OpenPGP signature files (default is 'gpg -ba').
+ attr_accessor :pgp_command
+
+ # Extension for detached OpenPGP signature files (default is 'asc').
+ attr_accessor :pgp_file_extension
+
# Create a Package Task with the given name and version.
def initialize(name=nil, version=nil)
init(name, version)
@@ -85,6 +94,11 @@
@need_tar_gz = false
@need_tar_bz2 = false
@need_zip = false
+
+ # pgp defaults (set to use GnuPG by default)
+ @need_pgp_signature = false
+ @pgp_command = 'gpg -ba'
+ @pgp_file_extension = 'asc'
end
# Create the tasks defined by this task library.
@@ -117,6 +131,8 @@
sh %{tar #{flag}cvf #{file} #{package_name}}
end
end
+
+ pgp_task_file(file) if @need_pgp_signature
end
end
@@ -127,6 +143,8 @@
sh %{zip -r #{zip_file} #{package_name}}
end
end
+
+ pgp_task_file(file) if @need_pgp_signature
end
directory package_dir
@@ -148,6 +166,18 @@
self
end
+ def pgp_task_for(src_file)
+ src_path = "#@package_dir/#{src_file}"
+ sig_path = "#{src_path}.#@pgp_file_extension"
+
+ task :package => [sig_path]
+ file sig_path => [src_path] do
+ chdir(@package_dir) do
+ sh %{#@pgp_command #{src_file}}
+ end
+ end
+ end
+
def package_name
@version ? "#{@name}-#{@version}" : @name
end
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
Url : http://rubyforge.org/pipermail/rake-devel/attachments/20061212/d170dec6/attachment.bin
More information about the Rake-devel
mailing list