3
# Archive::Tar::Minitar
4
# http://rubyforge.org/projects/ruwiki/
5
# Copyright 2004 - 2005 Austin Ziegler
6
# Based on work by Mauricio Julio Fernandez Pradier
8
# This program is free software. It may be redistributed and/or modified
9
# under the terms of the GPL version 2 (or later) or Ruby's licence.
11
# $Id: README,v 1.2 2004/09/22 17:47:43 austin Exp $
13
# Create a .tar package using Archive::Tar::Minitar.
15
class Rake::MinitarTask
16
# The name of the package.
18
# The version of the package.
19
attr_accessor :version
20
# The directory used to store the package files (default is 'pkg').
21
attr_accessor :package_dir
22
# List of files to be included in the package.
23
attr_accessor :package_files
24
# The name of the target directory. If this is set, the directory will be
25
# transformed internally.
26
attr_accessor :target_dir
27
# The release date as a Time object. If this is unset, the file's current
28
# time will be used. Otherwise, it will be set to a particular time.
29
attr_accessor :release_date
30
# A Proc object to transform the data. It will be provided the data and
32
attr_accessor :data_transform
34
# Create a MinitarTask with the given name and version.
35
def initialize(name = nil, version = nil)
37
yield self if block_given?
38
define if block_given? and name
41
# Initialization that bypasses the +yield self+ and +define+ step.
42
def init(name, version)
45
@package_files = Rake::FileList.new
49
# Create the tasks defined by this task library.
51
fail "Version required (or :noversion)" unless @version
52
@version = nil if :noversion == @version
54
package = "package_#@name".to_sym
55
repackage = "repackage_#@name".to_sym
56
clobber = "clobber_package_#@name".to_sym
58
desc("Build the #@name package")
61
desc("Force a rebuild of the #@name package")
62
task(repackage => [ clobber, package ])
64
desc("Remove #@name package")
65
task(clobber) { rm_r package_dir rescue nil }
67
task :clobber => [ clobber ]
69
task :package => [ package_file ]
70
file package_file => [ package_dir_path ] + @package_files do
71
current = /^#{File.basename(Dir.pwd)}/
73
files = @package_files.map { |file|
74
name = file.gsub(current, target_dir) if target_dir
75
mtime = release_date || File.stat(file).mtime
77
if File.directory?(file)
78
{ :name => name, :mode => 0755, :dir => true, :mtime => mtime }
80
mode = if dd =~ %r{bin/}
85
data = File.open(file, "rb") { |ff| ff.read }
86
data_transform[name, data] if data_transform
87
{ :name => name, :mode => mode, :data => data,
88
:size => data.size, :mtime => mtime }
92
Zlib::GzipWriter.open(package_file) do |tgz|
93
Archive::Tar::Minitar::Writer.open(tgz) do |tar|
96
tar.mkdir(entry[:name], entry)
98
tar.add_file_simple(entry[:name], entry) { |writer|
99
writer.write(entry[:data])
108
directory package_dir
110
file package_dir_path => @package_files do
111
mkdir_p package_dir rescue nil
112
@package_files.each do |fn|
113
name = File.join(package_dir_path, fn)
114
dirname = File.dirname(name)
115
mkdir_p(dirname) unless File.exist?(dirname)
116
if File.directory?(name)
128
"#{File.join(package_dir, package_name)}.tar.gz"
133
"#{@name}-#{@version}"
140
"#{package_dir}/#{package_name}"