~db-keen/tanzanite/rat

« back to all changes in this revision

Viewing changes to lib/rake/contrib/minitartask.rb

  • Committer: austin
  • Date: 2007-02-05 03:24:13 UTC
  • Revision ID: svn-v4:8b90d6ed-dc11-0410-98dd-e2d1db709ad4:rat/spikes/2006-05-13:45
Reorganizing the RAT project.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#! /usr/bin/env ruby
 
2
#--
 
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
 
7
#
 
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.
 
10
 
11
# $Id: README,v 1.2 2004/09/22 17:47:43 austin Exp $
 
12
 
 
13
# Create a .tar package using Archive::Tar::Minitar.
 
14
#
 
15
class Rake::MinitarTask
 
16
  # The name of the package.
 
17
  attr_accessor :name
 
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
 
31
  # the new filename.
 
32
  attr_accessor :data_transform
 
33
 
 
34
  # Create a MinitarTask with the given name and version. 
 
35
  def initialize(name = nil, version = nil)
 
36
    init(name, version)
 
37
    yield self if block_given?
 
38
    define if block_given? and name
 
39
  end
 
40
 
 
41
  # Initialization that bypasses the +yield self+ and +define+ step.
 
42
  def init(name, version)
 
43
    @name           = name
 
44
    @version        = version
 
45
    @package_files  = Rake::FileList.new
 
46
    @package_dir    = 'pkg'
 
47
  end
 
48
 
 
49
  # Create the tasks defined by this task library.
 
50
  def define
 
51
    fail "Version required (or :noversion)" unless @version
 
52
    @version = nil if :noversion == @version
 
53
 
 
54
    package   = "package_#@name".to_sym
 
55
    repackage = "repackage_#@name".to_sym
 
56
    clobber   = "clobber_package_#@name".to_sym
 
57
 
 
58
    desc("Build the #@name package")
 
59
    task(package)
 
60
 
 
61
    desc("Force a rebuild of the #@name package")
 
62
    task(repackage => [ clobber, package ])
 
63
 
 
64
    desc("Remove #@name package")
 
65
    task(clobber) { rm_r package_dir rescue nil }
 
66
 
 
67
    task :clobber => [ clobber ]
 
68
 
 
69
    task :package => [ package_file ]
 
70
    file package_file => [ package_dir_path ] + @package_files do
 
71
      current = /^#{File.basename(Dir.pwd)}/
 
72
      chdir(package_dir) do
 
73
        files = @package_files.map { |file|
 
74
          name  = file.gsub(current, target_dir) if target_dir
 
75
          mtime = release_date || File.stat(file).mtime
 
76
 
 
77
          if File.directory?(file)
 
78
            { :name => name, :mode => 0755, :dir => true, :mtime => mtime }
 
79
          else
 
80
            mode = if dd =~ %r{bin/}
 
81
              0755
 
82
            else
 
83
              0644
 
84
            end
 
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 }
 
89
          end
 
90
        }
 
91
 
 
92
        Zlib::GzipWriter.open(package_file) do |tgz|
 
93
          Archive::Tar::Minitar::Writer.open(tgz) do |tar|
 
94
            files.each do |entry|
 
95
              if entry[:dir]
 
96
                tar.mkdir(entry[:name], entry)
 
97
              else
 
98
                tar.add_file_simple(entry[:name], entry) { |writer|
 
99
                  writer.write(entry[:data])
 
100
                }
 
101
              end
 
102
            end
 
103
          end
 
104
        end
 
105
      end
 
106
    end
 
107
 
 
108
    directory package_dir
 
109
 
 
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)
 
117
          mkdir_p(name)
 
118
        else
 
119
          rm_f    name
 
120
          safe_ln fn, name
 
121
        end
 
122
      end
 
123
    end
 
124
    self
 
125
  end
 
126
 
 
127
  def package_file
 
128
    "#{File.join(package_dir, package_name)}.tar.gz"
 
129
  end
 
130
 
 
131
  def package_name
 
132
    if @version
 
133
      "#{@name}-#{@version}"
 
134
    else
 
135
      @name
 
136
    end
 
137
  end
 
138
 
 
139
  def package_dir_path
 
140
    "#{package_dir}/#{package_name}"
 
141
  end
 
142
end