rant 0.5.0 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,57 @@
1
+
2
+ # inspect.rb - Custom inspect method for Rant::FileList instances.
3
+ #
4
+ # Copyright (C) 2005 Stefan Lang <langstefan@gmx.at>
5
+
6
+ module Rant
7
+ class FileList
8
+ # Note that the default Object#inspect implementation is
9
+ # available as +object_inspect+.
10
+ def inspect
11
+ # empirisch ermittelt ;)
12
+ s = "#<#{self.class}:0x%x " % (object_id << 1)
13
+
14
+ s << "glob:" << (glob_dotfiles? ? "all" : "unix") << " "
15
+ if ix = ignore_rx
16
+ is = ix.source.dup
17
+ is.gsub!(/ +/, ' ')
18
+ is.gsub!(/\n/, '\n')
19
+ is.gsub!(/\t/, '\t')
20
+ is[10..-1] = "..." if is.length > 12
21
+ s << "i:#{is} "
22
+ end
23
+
24
+ if @pending
25
+ s << "res:#{@actions.size} "
26
+ end
27
+
28
+ unless @keep.empty?
29
+ s << "keep:#{@keep.size} "
30
+ end
31
+
32
+ s << "entries:#{items.size}"
33
+ if @items.size > 0
34
+ s << "["
35
+ if @items.size == 1
36
+ is = @items.first.dup
37
+ is[15..-1] = "..." if is.length > 16
38
+ is = '"' << is << '"'
39
+ else
40
+ fs = @items.first.dup
41
+ fs[11..-1] = "..." if fs.length > 12
42
+ fs = '"' << fs << '"'
43
+ ls = @items.last.dup
44
+ ls[0..-11] = "..." if ls.length > 12
45
+ ls = '"' << ls << '"'
46
+ if @items.size == 2
47
+ is = "#{fs}, #{ls}"
48
+ else
49
+ is = "#{fs}, ..., #{ls}"
50
+ end
51
+ end
52
+ s << "#{is}]"
53
+ end
54
+ s << ">"
55
+ end
56
+ end # class FileList
57
+ end # module Rant
@@ -0,0 +1,64 @@
1
+
2
+ # std.rb - Additional set of Rant::FileList instance methods.
3
+ #
4
+ # Copyright (C) 2005 Stefan Lang <langstefan@gmx.at>
5
+
6
+ # What should this file be used for:
7
+ #
8
+ # Place <code>import "filelist/std"</code> in an Rantfile to get all
9
+ # functionality as defined after <code>require "rant/filelist"</code>
10
+ # (for use as library). Read doc/filelist.rdoc.
11
+
12
+ require 'rant/import/filelist/inspect'
13
+
14
+ module Rant
15
+ class FileList
16
+ # Remove all entries which contain a directory with the
17
+ # given name.
18
+ # If no argument or +nil+ given, remove all directories.
19
+ #
20
+ # Example:
21
+ # file_list.no_dir "CVS"
22
+ # would remove the following entries from file_list:
23
+ # CVS/
24
+ # src/CVS/lib.c
25
+ # CVS/foo/bar/
26
+ def no_dir(name = nil)
27
+ @actions << [:apply_no_dir, name]
28
+ @pending = true
29
+ self
30
+ end
31
+ def apply_no_dir(name)
32
+ entry = nil
33
+ unless name
34
+ @items.reject! { |entry|
35
+ test(?d, entry) && !@keep[entry]
36
+ }
37
+ return
38
+ end
39
+ elems = nil
40
+ @items.reject! { |entry|
41
+ next if @keep[entry]
42
+ elems = Sys.split_all(entry)
43
+ i = elems.index(name)
44
+ if i
45
+ path = File.join(*elems[0..i])
46
+ test(?d, path)
47
+ else
48
+ false
49
+ end
50
+ }
51
+ end
52
+ private :apply_no_dir
53
+ # Get a new filelist containing only the existing files from
54
+ # this filelist.
55
+ def files
56
+ select { |entry| test ?f, entry }
57
+ end
58
+ # Get a new filelist containing only the existing directories
59
+ # from this filelist.
60
+ def dirs
61
+ select { |entry| test ?d, entry }
62
+ end
63
+ end # class FileList
64
+ end # module Rant
@@ -222,8 +222,12 @@ module Rant
222
222
  end
223
223
  end
224
224
  }
225
- @pre.flatten!
226
- @pre.compact!
225
+ if @pre.kind_of? Rant::FileList
226
+ @pre.resolve
227
+ else
228
+ @pre.flatten!
229
+ @pre.compact!
230
+ end
227
231
  @pre_resolved = true
228
232
  end
229
233
  end # class Task
@@ -244,6 +244,16 @@ class Rant::Generators::RubyPackage
244
244
  spec = Gem::Specification.new do |s|
245
245
  map_to_gemspec(s)
246
246
  end
247
+
248
+ # fix for YAML bug in Ruby 1.8.3 and 1.8.4 previews
249
+ if RUBY_VERSION == "1.8.3" or
250
+ RUBY_VERSION == "1.8.4" && RUBY_RELEASE_DATE < "2005-12-24"
251
+ def spec.to_yaml(*args, &block)
252
+ yaml = super
253
+ yaml =~ /^---/ ? yaml : "--- #{yaml}"
254
+ end
255
+ end
256
+
247
257
  fn = nil
248
258
  begin
249
259
  fn = Gem::Builder.new(spec).build
@@ -0,0 +1,200 @@
1
+
2
+ # init.rb - Define constants and methods required by all Rant code.
3
+ #
4
+ # Copyright (C) 2005 Stefan Lang <langstefan@gmx.at>
5
+
6
+ require 'rbconfig'
7
+
8
+ unless Process::Status.method_defined?(:success?) # new in 1.8.2
9
+ class Process::Status
10
+ def success?; exitstatus == 0; end
11
+ end
12
+ end
13
+ unless Regexp.respond_to? :union # new in 1.8.1
14
+ def Regexp.union(*patterns)
15
+ # let's hope it comes close to ruby-1.8.1 and upwards...
16
+ return /(?!)/ if patterns.empty?
17
+ Regexp.new(patterns.join("|"))
18
+ end
19
+ end
20
+ if RUBY_VERSION < "1.8.2"
21
+ class Array
22
+ undef_method :flatten, :flatten!
23
+ def flatten
24
+ cp = self.dup
25
+ cp.flatten!
26
+ cp
27
+ end
28
+ def flatten!
29
+ res = []
30
+ flattened = false
31
+ self.each { |e|
32
+ if e.respond_to? :to_ary
33
+ res.concat(e.to_ary)
34
+ flattened = true
35
+ else
36
+ res << e
37
+ end
38
+ }
39
+ if flattened
40
+ replace(res)
41
+ flatten!
42
+ self
43
+ end
44
+ end
45
+ end
46
+ end
47
+
48
+ class String
49
+ def _rant_sub_ext(ext, new_ext = nil)
50
+ if new_ext
51
+ self.sub(/#{Regexp.escape ext}$/, new_ext)
52
+ else
53
+ self.sub(/(\.[^.]*$)|$/, ".#{ext}")
54
+ end
55
+ end
56
+ end
57
+
58
+ module Rant
59
+ VERSION = '0.5.2'
60
+
61
+ @__rant_no_value__ = Object.new.freeze
62
+ def self.__rant_no_value__
63
+ @__rant_no_value__
64
+ end
65
+
66
+ module Env
67
+ OS = ::Config::CONFIG['target']
68
+ RUBY = ::Config::CONFIG['ruby_install_name']
69
+ RUBY_BINDIR = ::Config::CONFIG['bindir']
70
+ RUBY_EXE = File.join(RUBY_BINDIR, RUBY + ::Config::CONFIG["EXEEXT"])
71
+
72
+ @@zip_bin = false
73
+ @@tar_bin = false
74
+
75
+ if OS =~ /mswin/i
76
+ def on_windows?; true; end
77
+ else
78
+ def on_windows?; false; end
79
+ end
80
+
81
+ def have_zip?
82
+ if @@zip_bin == false
83
+ @@zip_bin = find_bin "zip"
84
+ end
85
+ !@@zip_bin.nil?
86
+ end
87
+ def have_tar?
88
+ if @@tar_bin == false
89
+ @@tar_bin = find_bin "tar"
90
+ end
91
+ !@@tar_bin.nil?
92
+ end
93
+ # Get an array with all pathes in the PATH
94
+ # environment variable.
95
+ def pathes
96
+ # Windows doesn't care about case in environment variables,
97
+ # but the ENV hash does!
98
+ path = ENV[on_windows? ? "Path" : "PATH"]
99
+ return [] unless path
100
+ path.split(on_windows? ? ";" : ":")
101
+ end
102
+ # Searches for bin_name on path and returns
103
+ # an absolute path if successfull or nil
104
+ # if an executable called bin_name couldn't be found.
105
+ def find_bin bin_name
106
+ if on_windows?
107
+ bin_name_exe = nil
108
+ if bin_name !~ /\.[^\.]{1,3}$/i
109
+ bin_name_exe = bin_name + ".exe"
110
+ end
111
+ pathes.each { |dir|
112
+ file = File.join(dir, bin_name)
113
+ return file if test(?f, file)
114
+ if bin_name_exe
115
+ file = File.join(dir, bin_name_exe)
116
+ return file if test(?f, file)
117
+ end
118
+ }
119
+ else
120
+ pathes.each { |dir|
121
+ file = File.join(dir, bin_name)
122
+ return file if test(?x, file)
123
+ }
124
+ end
125
+ nil
126
+ end
127
+ # Add quotes to a path and replace File::Separators if necessary.
128
+ def shell_path path
129
+ # TODO: check for more characters when deciding wheter to use
130
+ # quotes.
131
+ if on_windows?
132
+ path = path.tr("/", "\\")
133
+ if path.include? ' '
134
+ '"' + path + '"'
135
+ else
136
+ path
137
+ end
138
+ else
139
+ if path.include? ' '
140
+ "'" + path + "'"
141
+ else
142
+ path
143
+ end
144
+ end
145
+ end
146
+ extend self
147
+ end # module Env
148
+
149
+ module Sys
150
+ # Returns a string that can be used as a valid path argument
151
+ # on the shell respecting portability issues.
152
+ def sp(arg)
153
+ if arg.respond_to? :to_ary
154
+ arg.to_ary.map{ |e| sp e }.join(' ')
155
+ else
156
+ _escaped_path arg
157
+ end
158
+ end
159
+ # Escape special shell characters (currently only spaces).
160
+ # Flattens arrays and returns always a single string.
161
+ def escape(arg)
162
+ if arg.respond_to? :to_ary
163
+ arg.to_ary.map{ |e| escape e }.join(' ')
164
+ else
165
+ _escaped arg
166
+ end
167
+ end
168
+ if Env.on_windows?
169
+ def _escaped_path(path)
170
+ _escaped(path.to_s.tr("/", "\\"))
171
+ end
172
+ def _escaped(arg)
173
+ sarg = arg.to_s
174
+ return sarg unless sarg.include?(" ")
175
+ sarg << "\\" if sarg[-1].chr == "\\"
176
+ "\"#{sarg}\""
177
+ end
178
+ def regular_filename(fn)
179
+ fn.to_str.tr("\\", "/").gsub(%r{/{2,}}, "/")
180
+ end
181
+ else
182
+ def _escaped_path(path)
183
+ path.to_s.gsub(/(?=\s)/, "\\")
184
+ end
185
+ alias _escaped _escaped_path
186
+ def regular_filename(fn)
187
+ fn.to_str.gsub(%r{/{2,}}, "/")
188
+ end
189
+ end
190
+ private :_escaped_path
191
+ private :_escaped
192
+ # Split a path in all elements.
193
+ def split_all(path)
194
+ names = regular_filename(path).split(%r{/})
195
+ names[0] = "/" if names[0] && names[0].empty?
196
+ names
197
+ end
198
+ extend self
199
+ end # module Sys
200
+ end # module Rant
@@ -8,8 +8,8 @@
8
8
  # the GNU LGPL, Lesser General Public License version 2.1.
9
9
 
10
10
  require 'getoptlong'
11
+ require 'rant/init'
11
12
  require 'rant/rantvar'
12
- require 'rant/rantenv'
13
13
  require 'rant/rantsys'
14
14
  require 'rant/node'
15
15
  require 'rant/import/nodes/default' # could be optimized away
@@ -25,111 +25,16 @@ require 'rant/coregen'
25
25
  # this object.
26
26
  Rant::MAIN_OBJECT = self
27
27
 
28
- unless Process::Status.method_defined?(:success?) # new in 1.8.2
29
- class Process::Status
30
- def success?; exitstatus == 0; end
31
- end
32
- end
33
- unless Regexp.respond_to? :union # new in 1.8.1
34
- def Regexp.union(*patterns)
35
- # let's hope it comes close to ruby-1.8.1 and upwards...
36
- return /(?!)/ if patterns.empty?
37
- # i guess the options are lost
38
- Regexp.new(patterns.join("|"))
39
- end
40
- end
41
- if RUBY_VERSION < "1.8.2"
42
- class Array
43
- undef_method :flatten, :flatten!
44
- def flatten
45
- cp = self.dup
46
- cp.flatten!
47
- cp
48
- end
49
- def flatten!
50
- res = []
51
- flattened = false
52
- self.each { |e|
53
- if e.respond_to? :to_ary
54
- res.concat(e.to_ary)
55
- flattened = true
56
- else
57
- res << e
58
- end
59
- }
60
- if flattened
61
- replace(res)
62
- flatten!
63
- self
64
- end
65
- end
66
- end
67
- if RUBY_VERSION < "1.8.1"
68
- module FileUtils
69
- undef_method :fu_list
70
- def fu_list(arg)
71
- arg.respond_to?(:to_ary) ? arg.to_ary : [arg]
72
- end
73
- end
74
- end
75
- end
76
-
77
- class Array
78
-
79
- # Concatenates all elements like #join(' ') but also puts quotes
80
- # around strings that contain a space.
81
- def arglist
82
- warn caller[0]
83
- warn "[WARNING] Use `sys.sp(ary)' in Rantfiles instead of deprecated Array#arglist."
84
- Rant::Sys.sp(self)
85
- end
86
-
87
- def shell_pathes
88
- warn caller[0]
89
- warn "[WARNING] Array#shell_pathes is highly deprecated " +
90
- "and will not come with future (0.5.2 and later) Rant releases."
91
- warn "Use `ary.map { |path| sys.sp path }' in Rantfiles."
92
- map { |path| Rant::Sys.sp(path) }
93
- =begin
94
- entry = nil
95
- if ::Rant::Env.on_windows?
96
- self.collect { |entry|
97
- entry = entry.to_s.tr("/", "\\")
98
- if entry.include? ' '
99
- '"' + entry + '"'
100
- else
101
- entry
102
- end
103
- }
104
- else
105
- self.collect { |entry|
106
- entry = entry.to_s
107
- if entry.include? ' '
108
- "'" + entry + "'"
109
- else
110
- entry
111
- end
112
- }
113
- end
114
- =end
115
- end
116
- end
117
-
118
28
  class String
119
- def sub_ext(ext, new_ext = nil)
120
- if new_ext
121
- self.sub(/#{Regexp.escape ext}$/, new_ext)
122
- else
123
- self.sub(/(\.[^.]*$)|$/, ".#{ext}")
124
- end
125
- end
29
+ alias sub_ext _rant_sub_ext
126
30
  def to_rant_target
127
31
  self
128
32
  end
129
33
  end
130
34
 
35
+ # This module and its methods don't belong to Rant's public API.
36
+ # For (Rant) internal usage only!
131
37
  module Rant::Lib
132
-
133
38
  # Parses one string (elem) as it occurs in the array
134
39
  # which is returned by caller.
135
40
  # E.g.:
@@ -140,21 +45,101 @@ module Rant::Lib
140
45
  # Note: This method splits on the pattern <tt>:(\d+)(:|$)</tt>,
141
46
  # assuming anything before is the filename.
142
47
  def parse_caller_elem(elem)
143
- return { :file => "", :ln => 0 } unless elem
144
- if elem =~ /^(.+):(\d+)(?::|$)/
145
- { :file => $1, :ln => $2.to_i }
48
+ return { :file => "", :ln => 0 } unless elem
49
+ if elem =~ /^(.+):(\d+)(?::|$)/
50
+ { :file => $1, :ln => $2.to_i }
51
+ else
52
+ # should never occur
53
+ $stderr.puts "parse_caller_elem: #{elem.inspect}"
54
+ { :file => elem, :ln => 0 }
55
+ end
56
+
57
+ #parts = elem.split(":")
58
+ #{ :file => parts[0], :ln => parts[1].to_i }
59
+ end
60
+ module_function :parse_caller_elem
61
+ end # module Lib
62
+
63
+ module Rant::Console
64
+ RANT_PREFIX = "rant: "
65
+ ERROR_PREFIX = "[ERROR] "
66
+ WARN_PREFIX = "[WARNING] "
67
+ def msg_prefix
68
+ if defined? @msg_prefix and @msg_prefix
69
+ @msg_prefix
146
70
  else
147
- # should never occur
148
- $stderr.puts "parse_caller_elem: #{elem.inspect}"
149
- { :file => elem, :ln => 0 }
71
+ RANT_PREFIX
150
72
  end
151
-
152
- #parts = elem.split(":")
153
- #{ :file => parts[0], :ln => parts[1].to_i }
154
73
  end
155
- module_function :parse_caller_elem
156
-
157
- end
74
+ def msg(*text)
75
+ pre = msg_prefix
76
+ $stderr.puts "#{pre}#{text.join("\n" + ' ' * pre.length)}"
77
+ end
78
+ def vmsg(importance, *text)
79
+ msg(*text) if verbose >= importance
80
+ end
81
+ def err_msg(*text)
82
+ pre = msg_prefix + ERROR_PREFIX
83
+ $stderr.puts "#{pre}#{text.join("\n" + ' ' * pre.length)}"
84
+ end
85
+ def warn_msg(*text)
86
+ pre = msg_prefix + WARN_PREFIX
87
+ $stderr.puts "#{pre}#{text.join("\n" + ' ' * pre.length)}"
88
+ end
89
+ def ask_yes_no text
90
+ $stderr.print msg_prefix + text + " [y|n] "
91
+ case $stdin.readline
92
+ when /y|yes/i: true
93
+ when /n|no/i: false
94
+ else
95
+ $stderr.puts(' ' * msg_prefix.length +
96
+ "Please answer with `yes' or `no'")
97
+ ask_yes_no text
98
+ end
99
+ end
100
+ def prompt text
101
+ $stderr.print msg_prefix + text
102
+ input = $stdin.readline
103
+ input ? input.chomp : input
104
+ end
105
+ def option_listing opts
106
+ rs = ""
107
+ opts.each { |lopt, *opt_a|
108
+ if opt_a.size == 2
109
+ # no short option
110
+ mode, desc = opt_a
111
+ else
112
+ sopt, mode, desc = opt_a
113
+ end
114
+ next unless desc # "private" option
115
+ optstr = ""
116
+ arg = nil
117
+ if mode != GetoptLong::NO_ARGUMENT
118
+ if desc =~ /(\b[A-Z_]{2,}\b)/
119
+ arg = $1
120
+ end
121
+ end
122
+ if lopt
123
+ optstr << lopt
124
+ if arg
125
+ optstr << " " << arg
126
+ end
127
+ optstr = optstr.ljust(30)
128
+ end
129
+ if sopt
130
+ optstr << " " unless optstr.empty?
131
+ optstr << sopt
132
+ if arg
133
+ optstr << " " << arg
134
+ end
135
+ end
136
+ rs << " #{optstr}\n"
137
+ rs << " #{desc.split("\n").join("\n ")}\n"
138
+ }
139
+ rs
140
+ end
141
+ extend self
142
+ end # module Rant::Console
158
143
 
159
144
  # The methods in this module are the public interface to Rant that can
160
145
  # be used in Rantfiles.
@@ -217,6 +202,7 @@ module RantContext
217
202
  rant.make(*args, &block)
218
203
  end
219
204
 
205
+ =begin
220
206
  # +rac+ stands for "rant compiler"
221
207
  def rac
222
208
  ch = Rant::Lib.parse_caller_elem caller[0]
@@ -224,6 +210,7 @@ module RantContext
224
210
  "Method `rac' is deprecated. Use `rant' instead.")
225
211
  rant
226
212
  end
213
+ =end
227
214
  end # module RantContext
228
215
 
229
216
  class RantAppContext