rake 0.9.2 → 13.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (170) hide show
  1. checksums.yaml +7 -0
  2. data/CONTRIBUTING.rdoc +43 -0
  3. data/Gemfile +10 -0
  4. data/History.rdoc +2386 -0
  5. data/MIT-LICENSE +1 -1
  6. data/README.rdoc +64 -109
  7. data/Rakefile +22 -386
  8. data/bin/bundle +105 -0
  9. data/bin/console +7 -0
  10. data/bin/rake +20 -23
  11. data/bin/rdoc +29 -0
  12. data/bin/rubocop +29 -0
  13. data/bin/setup +6 -0
  14. data/doc/command_line_usage.rdoc +65 -21
  15. data/doc/glossary.rdoc +40 -49
  16. data/doc/jamis.rb +1 -0
  17. data/doc/rake.1 +156 -0
  18. data/doc/rakefile.rdoc +127 -62
  19. data/exe/rake +27 -0
  20. data/lib/rake.rb +37 -31
  21. data/lib/rake/application.rb +507 -272
  22. data/lib/rake/backtrace.rb +24 -0
  23. data/lib/rake/clean.rb +55 -8
  24. data/lib/rake/cloneable.rb +11 -19
  25. data/lib/rake/cpu_counter.rb +107 -0
  26. data/lib/rake/default_loader.rb +5 -0
  27. data/lib/rake/dsl_definition.rb +74 -46
  28. data/lib/rake/early_time.rb +5 -1
  29. data/lib/rake/ext/core.rb +5 -6
  30. data/lib/rake/ext/string.rb +61 -52
  31. data/lib/rake/file_creation_task.rb +4 -3
  32. data/lib/rake/file_list.rb +81 -49
  33. data/lib/rake/file_task.rb +15 -8
  34. data/lib/rake/file_utils.rb +69 -47
  35. data/lib/rake/file_utils_ext.rb +18 -26
  36. data/lib/rake/invocation_chain.rb +25 -19
  37. data/lib/rake/invocation_exception_mixin.rb +1 -0
  38. data/lib/rake/late_time.rb +18 -0
  39. data/lib/rake/linked_list.rb +112 -0
  40. data/lib/rake/loaders/makefile.rb +23 -9
  41. data/lib/rake/multi_task.rb +4 -6
  42. data/lib/rake/name_space.rb +36 -23
  43. data/lib/rake/packagetask.rb +71 -34
  44. data/lib/rake/phony.rb +16 -0
  45. data/lib/rake/private_reader.rb +21 -0
  46. data/lib/rake/promise.rb +100 -0
  47. data/lib/rake/pseudo_status.rb +8 -2
  48. data/lib/rake/rake_module.rb +41 -3
  49. data/lib/rake/rake_test_loader.rb +21 -7
  50. data/lib/rake/rule_recursion_overflow_error.rb +2 -2
  51. data/lib/rake/scope.rb +43 -0
  52. data/lib/rake/task.rb +186 -79
  53. data/lib/rake/task_argument_error.rb +1 -0
  54. data/lib/rake/task_arguments.rb +50 -15
  55. data/lib/rake/task_manager.rb +89 -65
  56. data/lib/rake/tasklib.rb +2 -12
  57. data/lib/rake/testtask.rb +61 -63
  58. data/lib/rake/thread_history_display.rb +49 -0
  59. data/lib/rake/thread_pool.rb +163 -0
  60. data/lib/rake/trace_output.rb +23 -0
  61. data/lib/rake/version.rb +7 -7
  62. data/lib/rake/win32.rb +14 -18
  63. data/rake.gemspec +43 -0
  64. metadata +82 -221
  65. data/.gemtest +0 -0
  66. data/CHANGES +0 -509
  67. data/RRR +0 -9
  68. data/TODO +0 -20
  69. data/doc/rake.1.gz +0 -0
  70. data/doc/release_notes/rake-0.4.14.rdoc +0 -23
  71. data/doc/release_notes/rake-0.4.15.rdoc +0 -35
  72. data/doc/release_notes/rake-0.5.0.rdoc +0 -53
  73. data/doc/release_notes/rake-0.5.3.rdoc +0 -78
  74. data/doc/release_notes/rake-0.5.4.rdoc +0 -46
  75. data/doc/release_notes/rake-0.6.0.rdoc +0 -141
  76. data/doc/release_notes/rake-0.7.0.rdoc +0 -119
  77. data/doc/release_notes/rake-0.7.1.rdoc +0 -59
  78. data/doc/release_notes/rake-0.7.2.rdoc +0 -121
  79. data/doc/release_notes/rake-0.7.3.rdoc +0 -47
  80. data/doc/release_notes/rake-0.8.0.rdoc +0 -114
  81. data/doc/release_notes/rake-0.8.2.rdoc +0 -165
  82. data/doc/release_notes/rake-0.8.3.rdoc +0 -112
  83. data/doc/release_notes/rake-0.8.4.rdoc +0 -147
  84. data/doc/release_notes/rake-0.8.5.rdoc +0 -53
  85. data/doc/release_notes/rake-0.8.6.rdoc +0 -55
  86. data/doc/release_notes/rake-0.8.7.rdoc +0 -55
  87. data/doc/release_notes/rake-0.9.0.rdoc +0 -112
  88. data/doc/release_notes/rake-0.9.1.rdoc +0 -52
  89. data/doc/release_notes/rake-0.9.2.rdoc +0 -49
  90. data/install.rb +0 -90
  91. data/lib/rake/alt_system.rb +0 -109
  92. data/lib/rake/classic_namespace.rb +0 -9
  93. data/lib/rake/contrib/compositepublisher.rb +0 -21
  94. data/lib/rake/contrib/ftptools.rb +0 -150
  95. data/lib/rake/contrib/publisher.rb +0 -69
  96. data/lib/rake/contrib/rubyforgepublisher.rb +0 -16
  97. data/lib/rake/contrib/sshpublisher.rb +0 -45
  98. data/lib/rake/contrib/sys.rb +0 -191
  99. data/lib/rake/ext/module.rb +0 -39
  100. data/lib/rake/ext/time.rb +0 -14
  101. data/lib/rake/gempackagetask.rb +0 -13
  102. data/lib/rake/pathmap.rb +0 -1
  103. data/lib/rake/rdoctask.rb +0 -230
  104. data/lib/rake/ruby182_test_unit_fix.rb +0 -25
  105. data/lib/rake/runtest.rb +0 -21
  106. data/test/check_expansion.rb +0 -5
  107. data/test/check_no_expansion.rb +0 -5
  108. data/test/data/access/Rakefile +0 -35
  109. data/test/data/chains/Rakefile +0 -15
  110. data/test/data/comments/Rakefile +0 -18
  111. data/test/data/default/Rakefile +0 -17
  112. data/test/data/deprecated_import/Rakefile +0 -1
  113. data/test/data/dryrun/Rakefile +0 -22
  114. data/test/data/extra/Rakefile +0 -1
  115. data/test/data/file_creation_task/Rakefile +0 -31
  116. data/test/data/imports/Rakefile +0 -19
  117. data/test/data/imports/deps.mf +0 -1
  118. data/test/data/multidesc/Rakefile +0 -15
  119. data/test/data/namespace/Rakefile +0 -64
  120. data/test/data/rakelib/test1.rb +0 -4
  121. data/test/data/rbext/rakefile.rb +0 -3
  122. data/test/data/sample.mf +0 -14
  123. data/test/data/statusreturn/Rakefile +0 -6
  124. data/test/data/unittest/Rakefile +0 -1
  125. data/test/data/verbose/Rakefile +0 -34
  126. data/test/file_creation.rb +0 -34
  127. data/test/helper.rb +0 -44
  128. data/test/in_environment.rb +0 -35
  129. data/test/reqfile.rb +0 -3
  130. data/test/reqfile2.rb +0 -3
  131. data/test/shellcommand.rb +0 -3
  132. data/test/test_rake.rb +0 -38
  133. data/test/test_rake_application.rb +0 -364
  134. data/test/test_rake_application_options.rb +0 -382
  135. data/test/test_rake_clean.rb +0 -12
  136. data/test/test_rake_definitions.rb +0 -80
  137. data/test/test_rake_directory_task.rb +0 -55
  138. data/test/test_rake_dsl.rb +0 -73
  139. data/test/test_rake_early_time.rb +0 -31
  140. data/test/test_rake_extension.rb +0 -59
  141. data/test/test_rake_file_creation_task.rb +0 -62
  142. data/test/test_rake_file_list.rb +0 -633
  143. data/test/test_rake_file_list_path_map.rb +0 -8
  144. data/test/test_rake_file_task.rb +0 -104
  145. data/test/test_rake_file_utils.rb +0 -252
  146. data/test/test_rake_ftp_file.rb +0 -59
  147. data/test/test_rake_functional.rb +0 -468
  148. data/test/test_rake_invocation_chain.rb +0 -52
  149. data/test/test_rake_makefile_loader.rb +0 -23
  150. data/test/test_rake_multi_task.rb +0 -51
  151. data/test/test_rake_name_space.rb +0 -43
  152. data/test/test_rake_package_task.rb +0 -78
  153. data/test/test_rake_path_map.rb +0 -157
  154. data/test/test_rake_path_map_explode.rb +0 -31
  155. data/test/test_rake_path_map_partial.rb +0 -18
  156. data/test/test_rake_pseudo_status.rb +0 -20
  157. data/test/test_rake_rdoc_task.rb +0 -81
  158. data/test/test_rake_require.rb +0 -35
  159. data/test/test_rake_rules.rb +0 -346
  160. data/test/test_rake_task.rb +0 -271
  161. data/test/test_rake_task_argument_parsing.rb +0 -116
  162. data/test/test_rake_task_arguments.rb +0 -86
  163. data/test/test_rake_task_lib.rb +0 -9
  164. data/test/test_rake_task_manager.rb +0 -145
  165. data/test/test_rake_task_manager_argument_resolution.rb +0 -36
  166. data/test/test_rake_task_with_arguments.rb +0 -162
  167. data/test/test_rake_test_task.rb +0 -122
  168. data/test/test_rake_top_level_functions.rb +0 -76
  169. data/test/test_rake_win32.rb +0 -83
  170. data/test/test_sys.rb +0 -20
data/exe/rake ADDED
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ #--
4
+ # Copyright (c) 2003, 2004, 2005, 2006, 2007 Jim Weirich
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ # of this software and associated documentation files (the "Software"), to
8
+ # deal in the Software without restriction, including without limitation the
9
+ # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10
+ # sell copies of the Software, and to permit persons to whom the Software is
11
+ # furnished to do so, subject to the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be included in
14
+ # all copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
+ # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
22
+ # IN THE SOFTWARE.
23
+ #++
24
+
25
+ require "rake"
26
+
27
+ Rake.application.run
data/lib/rake.rb CHANGED
@@ -1,5 +1,5 @@
1
+ # frozen_string_literal: true
1
2
  #--
2
-
3
3
  # Copyright 2003-2010 by Jim Weirich (jim.weirich@gmail.com)
4
4
  #
5
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -21,44 +21,50 @@
21
21
  # IN THE SOFTWARE.
22
22
  #++
23
23
 
24
- require 'rake/version'
24
+ module Rake; end
25
25
 
26
- RAKEVERSION = Rake::VERSION
26
+ require "rake/version"
27
27
 
28
- require 'rbconfig'
29
- require 'fileutils'
30
- require 'singleton'
31
- require 'monitor'
32
- require 'optparse'
33
- require 'ostruct'
28
+ require "rbconfig"
29
+ require "fileutils"
30
+ require "singleton"
31
+ require "monitor"
32
+ require "optparse"
33
+ require "ostruct"
34
34
 
35
- require 'rake/ext/module'
36
- require 'rake/ext/string'
37
- require 'rake/ext/time'
35
+ require "rake/ext/string"
38
36
 
39
- require 'rake/win32'
37
+ require "rake/win32"
40
38
 
41
- require 'rake/task_argument_error'
42
- require 'rake/rule_recursion_overflow_error'
43
- require 'rake/rake_module'
44
- require 'rake/pseudo_status'
45
- require 'rake/task_arguments'
46
- require 'rake/invocation_chain'
47
- require 'rake/task'
48
- require 'rake/file_task'
49
- require 'rake/file_creation_task'
50
- require 'rake/multi_task'
51
- require 'rake/dsl_definition'
52
- require 'rake/file_utils_ext'
53
- require 'rake/file_list'
54
- require 'rake/default_loader'
55
- require 'rake/early_time'
56
- require 'rake/name_space'
57
- require 'rake/task_manager'
58
- require 'rake/application'
39
+ require "rake/linked_list"
40
+ require "rake/cpu_counter"
41
+ require "rake/scope"
42
+ require "rake/task_argument_error"
43
+ require "rake/rule_recursion_overflow_error"
44
+ require "rake/rake_module"
45
+ require "rake/trace_output"
46
+ require "rake/pseudo_status"
47
+ require "rake/task_arguments"
48
+ require "rake/invocation_chain"
49
+ require "rake/task"
50
+ require "rake/file_task"
51
+ require "rake/file_creation_task"
52
+ require "rake/multi_task"
53
+ require "rake/dsl_definition"
54
+ require "rake/file_utils_ext"
55
+ require "rake/file_list"
56
+ require "rake/default_loader"
57
+ require "rake/early_time"
58
+ require "rake/late_time"
59
+ require "rake/name_space"
60
+ require "rake/task_manager"
61
+ require "rake/application"
62
+ require "rake/backtrace"
59
63
 
60
64
  $trace = false
61
65
 
66
+ # :stopdoc:
67
+ #
62
68
  # Some top level Constants.
63
69
 
64
70
  FileList = Rake::FileList
@@ -1,17 +1,24 @@
1
- require 'shellwords'
2
- require 'optparse'
1
+ # frozen_string_literal: true
2
+ require "optparse"
3
3
 
4
- require 'rake/task_manager'
5
- require 'rake/win32'
4
+ require "rake/task_manager"
5
+ require "rake/file_list"
6
+ require "rake/thread_pool"
7
+ require "rake/thread_history_display"
8
+ require "rake/trace_output"
9
+ require "rake/win32"
6
10
 
7
11
  module Rake
8
12
 
9
- ######################################################################
13
+ CommandLineOptionError = Class.new(StandardError)
14
+
15
+ ##
10
16
  # Rake main application object. When invoking +rake+ from the
11
17
  # command line, a Rake::Application object is created and run.
12
- #
18
+
13
19
  class Application
14
20
  include TaskManager
21
+ include TraceOutput
15
22
 
16
23
  # The name of the application (typically 'rake')
17
24
  attr_reader :name
@@ -22,15 +29,26 @@ module Rake
22
29
  # Name of the actual rakefile used.
23
30
  attr_reader :rakefile
24
31
 
32
+ # Number of columns on the terminal
33
+ attr_accessor :terminal_columns
34
+
25
35
  # List of the top level task names (task names from the command line).
26
36
  attr_reader :top_level_tasks
27
37
 
28
- DEFAULT_RAKEFILES = ['rakefile', 'Rakefile', 'rakefile.rb', 'Rakefile.rb'].freeze
38
+ # Override the detected TTY output state (mostly for testing)
39
+ attr_writer :tty_output
40
+
41
+ DEFAULT_RAKEFILES = [
42
+ "rakefile",
43
+ "Rakefile",
44
+ "rakefile.rb",
45
+ "Rakefile.rb"
46
+ ].freeze
29
47
 
30
48
  # Initialize a Rake::Application object.
31
49
  def initialize
32
50
  super
33
- @name = 'rake'
51
+ @name = "rake"
34
52
  @rakefiles = DEFAULT_RAKEFILES.dup
35
53
  @rakefile = nil
36
54
  @pending_imports = []
@@ -39,10 +57,13 @@ module Rake
39
57
  @default_loader = Rake::DefaultLoader.new
40
58
  @original_dir = Dir.pwd
41
59
  @top_level_tasks = []
42
- add_loader('rb', DefaultLoader.new)
43
- add_loader('rf', DefaultLoader.new)
44
- add_loader('rake', DefaultLoader.new)
60
+ add_loader("rb", DefaultLoader.new)
61
+ add_loader("rf", DefaultLoader.new)
62
+ add_loader("rake", DefaultLoader.new)
45
63
  @tty_output = STDOUT.tty?
64
+ @terminal_columns = ENV["RAKE_COLUMNS"].to_i
65
+
66
+ set_default_options
46
67
  end
47
68
 
48
69
  # Run the Rake application. The run method performs the following
@@ -50,25 +71,30 @@ module Rake
50
71
  #
51
72
  # * Initialize the command line options (+init+).
52
73
  # * Define the tasks (+load_rakefile+).
53
- # * Run the top level tasks (+run_tasks+).
74
+ # * Run the top level tasks (+top_level+).
54
75
  #
55
76
  # If you wish to build a custom rake command, you should call
56
77
  # +init+ on your application. Then define any tasks. Finally,
57
78
  # call +top_level+ to run your top level tasks.
58
- def run
79
+ def run(argv = ARGV)
59
80
  standard_exception_handling do
60
- init
81
+ init "rake", argv
61
82
  load_rakefile
62
83
  top_level
63
84
  end
64
85
  end
65
86
 
66
87
  # Initialize the command line parameters and app name.
67
- def init(app_name='rake')
88
+ def init(app_name="rake", argv = ARGV)
68
89
  standard_exception_handling do
69
90
  @name = app_name
70
- handle_options
71
- collect_tasks
91
+ begin
92
+ args = handle_options argv
93
+ rescue ArgumentError
94
+ # Backward compatibility for capistrano
95
+ args = handle_options
96
+ end
97
+ collect_command_line_tasks(args)
72
98
  end
73
99
  end
74
100
 
@@ -81,7 +107,7 @@ module Rake
81
107
 
82
108
  # Run the top level tasks of a Rake application.
83
109
  def top_level
84
- standard_exception_handling do
110
+ run_with_threads do
85
111
  if options.show_tasks
86
112
  display_tasks_and_comments
87
113
  elsif options.show_prereqs
@@ -92,6 +118,22 @@ module Rake
92
118
  end
93
119
  end
94
120
 
121
+ # Run the given block with the thread startup and shutdown.
122
+ def run_with_threads
123
+ thread_pool.gather_history if options.job_stats == :history
124
+
125
+ yield
126
+
127
+ thread_pool.join
128
+ if options.job_stats
129
+ stats = thread_pool.statistics
130
+ puts "Maximum active threads: #{stats[:max_active_threads]} + main"
131
+ puts "Total threads in play: #{stats[:total_threads_in_play]} + main"
132
+ end
133
+ ThreadHistoryDisplay.new(thread_pool.history).show if
134
+ options.job_stats == :history
135
+ end
136
+
95
137
  # Add a loader to handle imported files ending in the extension
96
138
  # +ext+.
97
139
  def add_loader(ext, loader)
@@ -104,53 +146,108 @@ module Rake
104
146
  @options ||= OpenStruct.new
105
147
  end
106
148
 
107
- # private ----------------------------------------------------------------
149
+ # Return the thread pool used for multithreaded processing.
150
+ def thread_pool # :nodoc:
151
+ @thread_pool ||= ThreadPool.new(options.thread_pool_size || Rake.suggested_thread_count-1)
152
+ end
153
+
154
+ # internal ----------------------------------------------------------------
108
155
 
109
- def invoke_task(task_string)
156
+ # Invokes a task with arguments that are extracted from +task_string+
157
+ def invoke_task(task_string) # :nodoc:
110
158
  name, args = parse_task_string(task_string)
111
159
  t = self[name]
112
160
  t.invoke(*args)
113
161
  end
114
162
 
115
- def parse_task_string(string)
116
- if string =~ /^([^\[]+)(\[(.*)\])$/
117
- name = $1
118
- args = $3.split(/\s*,\s*/)
119
- else
120
- name = string
121
- args = []
122
- end
123
- [name, args]
163
+ def parse_task_string(string) # :nodoc:
164
+ /^([^\[]+)(?:\[(.*)\])$/ =~ string.to_s
165
+
166
+ name = $1
167
+ remaining_args = $2
168
+
169
+ return string, [] unless name
170
+ return name, [] if remaining_args.empty?
171
+
172
+ args = []
173
+
174
+ begin
175
+ /\s*((?:[^\\,]|\\.)*?)\s*(?:,\s*(.*))?$/ =~ remaining_args
176
+
177
+ remaining_args = $2
178
+ args << $1.gsub(/\\(.)/, '\1')
179
+ end while remaining_args
180
+
181
+ return name, args
124
182
  end
125
183
 
126
184
  # Provide standard exception handling for the given block.
127
- def standard_exception_handling
128
- begin
129
- yield
130
- rescue SystemExit => ex
131
- # Exit silently with current status
132
- raise
133
- rescue OptionParser::InvalidOption => ex
134
- $stderr.puts ex.message
135
- exit(false)
136
- rescue Exception => ex
137
- # Exit with error message
138
- display_error_message(ex)
139
- exit(false)
140
- end
185
+ def standard_exception_handling # :nodoc:
186
+ yield
187
+ rescue SystemExit
188
+ # Exit silently with current status
189
+ raise
190
+ rescue OptionParser::InvalidOption => ex
191
+ $stderr.puts ex.message
192
+ exit(false)
193
+ rescue Exception => ex
194
+ # Exit with error message
195
+ display_error_message(ex)
196
+ exit_because_of_exception(ex)
197
+ end
198
+
199
+ # Exit the program because of an unhandled exception.
200
+ # (may be overridden by subclasses)
201
+ def exit_because_of_exception(ex) # :nodoc:
202
+ exit(false)
141
203
  end
142
204
 
143
205
  # Display the error message that caused the exception.
144
- def display_error_message(ex)
145
- $stderr.puts "#{name} aborted!"
146
- $stderr.puts ex.message
147
- if options.trace
148
- $stderr.puts ex.backtrace.join("\n")
206
+ def display_error_message(ex) # :nodoc:
207
+ trace "#{name} aborted!"
208
+ display_exception_details(ex)
209
+ trace "Tasks: #{ex.chain}" if has_chain?(ex)
210
+ trace "(See full trace by running task with --trace)" unless
211
+ options.backtrace
212
+ end
213
+
214
+ def display_exception_details(ex) # :nodoc:
215
+ display_exception_details_seen << ex
216
+
217
+ display_exception_message_details(ex)
218
+ display_exception_backtrace(ex)
219
+ display_cause_details(ex.cause) if has_cause?(ex)
220
+ end
221
+
222
+ def display_cause_details(ex) # :nodoc:
223
+ return if display_exception_details_seen.include? ex
224
+
225
+ trace "\nCaused by:"
226
+ display_exception_details(ex)
227
+ end
228
+
229
+ def display_exception_details_seen # :nodoc:
230
+ Thread.current[:rake_display_exception_details_seen] ||= []
231
+ end
232
+
233
+ def has_cause?(ex) # :nodoc:
234
+ ex.respond_to?(:cause) && ex.cause
235
+ end
236
+
237
+ def display_exception_message_details(ex) # :nodoc:
238
+ if ex.instance_of?(RuntimeError)
239
+ trace ex.message
240
+ else
241
+ trace "#{ex.class.name}: #{ex.message}"
242
+ end
243
+ end
244
+
245
+ def display_exception_backtrace(ex) # :nodoc:
246
+ if options.backtrace
247
+ trace ex.backtrace.join("\n")
149
248
  else
150
- $stderr.puts rakefile_location(ex.backtrace)
249
+ trace Backtrace.collapse(ex.backtrace).join("\n")
151
250
  end
152
- $stderr.puts "Tasks: #{ex.chain}" if has_chain?(ex)
153
- $stderr.puts "(See full trace by running task with --trace)" unless options.trace
154
251
  end
155
252
 
156
253
  # Warn about deprecated usage.
@@ -158,27 +255,28 @@ module Rake
158
255
  # Example:
159
256
  # Rake.application.deprecate("import", "Rake.import", caller.first)
160
257
  #
161
- def deprecate(old_usage, new_usage, call_site)
162
- return if options.ignore_deprecate
163
- $stderr.puts "WARNING: '#{old_usage}' is deprecated. " +
164
- "Please use '#{new_usage}' instead.\n" +
165
- " at #{call_site}"
258
+ def deprecate(old_usage, new_usage, call_site) # :nodoc:
259
+ unless options.ignore_deprecate
260
+ $stderr.puts "WARNING: '#{old_usage}' is deprecated. " +
261
+ "Please use '#{new_usage}' instead.\n" +
262
+ " at #{call_site}"
263
+ end
166
264
  end
167
265
 
168
266
  # Does the exception have a task invocation chain?
169
- def has_chain?(exception)
267
+ def has_chain?(exception) # :nodoc:
170
268
  exception.respond_to?(:chain) && exception.chain
171
269
  end
172
270
  private :has_chain?
173
271
 
174
272
  # True if one of the files in RAKEFILES is in the current directory.
175
273
  # If a match is found, it is copied into @rakefile.
176
- def have_rakefile
274
+ def have_rakefile # :nodoc:
177
275
  @rakefiles.each do |fn|
178
276
  if File.exist?(fn)
179
- others = Dir.glob(fn, File::FNM_CASEFOLD)
277
+ others = FileList.glob(fn, File::FNM_CASEFOLD)
180
278
  return others.size == 1 ? others.first : fn
181
- elsif fn == ''
279
+ elsif fn == ""
182
280
  return fn
183
281
  end
184
282
  end
@@ -186,38 +284,41 @@ module Rake
186
284
  end
187
285
 
188
286
  # True if we are outputting to TTY, false otherwise
189
- def tty_output?
287
+ def tty_output? # :nodoc:
190
288
  @tty_output
191
289
  end
192
290
 
193
- # Override the detected TTY output state (mostly for testing)
194
- def tty_output=( tty_output_state )
195
- @tty_output = tty_output_state
196
- end
197
-
198
291
  # We will truncate output if we are outputting to a TTY or if we've been
199
292
  # given an explicit column width to honor
200
- def truncate_output?
201
- tty_output? || ENV['RAKE_COLUMNS']
293
+ def truncate_output? # :nodoc:
294
+ tty_output? || @terminal_columns.nonzero?
202
295
  end
203
296
 
204
297
  # Display the tasks and comments.
205
- def display_tasks_and_comments
298
+ def display_tasks_and_comments # :nodoc:
206
299
  displayable_tasks = tasks.select { |t|
207
- t.comment && t.name =~ options.show_task_pattern
300
+ (options.show_all_tasks || t.comment) &&
301
+ t.name =~ options.show_task_pattern
208
302
  }
209
303
  case options.show_tasks
210
304
  when :tasks
211
- width = displayable_tasks.collect { |t| t.name_with_args.length }.max || 10
212
- max_column = truncate_output? ? terminal_width - name.size - width - 7 : nil
305
+ width = displayable_tasks.map { |t| t.name_with_args.length }.max || 10
306
+ if truncate_output?
307
+ max_column = terminal_width - name.size - width - 7
308
+ else
309
+ max_column = nil
310
+ end
311
+
213
312
  displayable_tasks.each do |t|
214
- printf "#{name} %-#{width}s # %s\n",
215
- t.name_with_args, max_column ? truncate(t.comment, max_column) : t.comment
313
+ printf("#{name} %-#{width}s # %s\n",
314
+ t.name_with_args,
315
+ max_column ? truncate(t.comment, max_column) : t.comment)
216
316
  end
217
317
  when :describe
218
318
  displayable_tasks.each do |t|
219
319
  puts "#{name} #{t.name_with_args}"
220
- t.full_comment.split("\n").each do |line|
320
+ comment = t.full_comment || ""
321
+ comment.split("\n").each do |line|
221
322
  puts " #{line}"
222
323
  end
223
324
  puts
@@ -225,7 +326,7 @@ module Rake
225
326
  when :lines
226
327
  displayable_tasks.each do |t|
227
328
  t.locations.each do |loc|
228
- printf "#{name} %-30s %s\n",t.name_with_args, loc
329
+ printf "#{name} %-30s %s\n", t.name_with_args, loc
229
330
  end
230
331
  end
231
332
  else
@@ -233,9 +334,9 @@ module Rake
233
334
  end
234
335
  end
235
336
 
236
- def terminal_width
237
- if ENV['RAKE_COLUMNS']
238
- result = ENV['RAKE_COLUMNS'].to_i
337
+ def terminal_width # :nodoc:
338
+ if @terminal_columns.nonzero?
339
+ result = @terminal_columns
239
340
  else
240
341
  result = unix? ? dynamic_width : 80
241
342
  end
@@ -245,179 +346,299 @@ module Rake
245
346
  end
246
347
 
247
348
  # Calculate the dynamic width of the
248
- def dynamic_width
349
+ def dynamic_width # :nodoc:
249
350
  @dynamic_width ||= (dynamic_width_stty.nonzero? || dynamic_width_tput)
250
351
  end
251
352
 
252
- def dynamic_width_stty
353
+ def dynamic_width_stty # :nodoc:
253
354
  %x{stty size 2>/dev/null}.split[1].to_i
254
355
  end
255
356
 
256
- def dynamic_width_tput
357
+ def dynamic_width_tput # :nodoc:
257
358
  %x{tput cols 2>/dev/null}.to_i
258
359
  end
259
360
 
260
- def unix?
261
- RbConfig::CONFIG['host_os'] =~ /(aix|darwin|linux|(net|free|open)bsd|cygwin|solaris|irix|hpux)/i
361
+ def unix? # :nodoc:
362
+ RbConfig::CONFIG["host_os"] =~
363
+ /(aix|darwin|linux|(net|free|open)bsd|cygwin|solaris|irix|hpux)/i
262
364
  end
263
365
 
264
- def windows?
366
+ def windows? # :nodoc:
265
367
  Win32.windows?
266
368
  end
267
369
 
268
- def truncate(string, width)
269
- if string.length <= width
370
+ def truncate(string, width) # :nodoc:
371
+ if string.nil?
372
+ ""
373
+ elsif string.length <= width
270
374
  string
271
375
  else
272
- ( string[0, width-3] || "" ) + "..."
376
+ (string[0, width - 3] || "") + "..."
273
377
  end
274
378
  end
275
379
 
276
380
  # Display the tasks and prerequisites
277
- def display_prerequisites
381
+ def display_prerequisites # :nodoc:
278
382
  tasks.each do |t|
279
383
  puts "#{name} #{t.name}"
280
384
  t.prerequisites.each { |pre| puts " #{pre}" }
281
385
  end
282
386
  end
283
387
 
388
+ def trace(*strings) # :nodoc:
389
+ options.trace_output ||= $stderr
390
+ trace_on(options.trace_output, *strings)
391
+ end
392
+
393
+ def sort_options(options) # :nodoc:
394
+ options.sort_by { |opt|
395
+ opt.select { |o| o.is_a?(String) && o =~ /^-/ }.map(&:downcase).sort.reverse
396
+ }
397
+ end
398
+ private :sort_options
399
+
284
400
  # A list of all the standard options used in rake, suitable for
285
401
  # passing to OptionParser.
286
- def standard_rake_options
287
- [
288
- ['--classic-namespace', '-C', "Put Task and FileTask in the top level namespace",
289
- lambda { |value|
290
- require 'rake/classic_namespace'
291
- options.classic_namespace = true
292
- }
293
- ],
294
- ['--describe', '-D [PATTERN]', "Describe the tasks (matching optional PATTERN), then exit.",
295
- lambda { |value|
296
- options.show_tasks = :describe
297
- options.show_task_pattern = Regexp.new(value || '')
298
- TaskManager.record_task_metadata = true
299
- }
300
- ],
301
- ['--dry-run', '-n', "Do a dry run without executing actions.",
302
- lambda { |value|
303
- Rake.verbose(true)
304
- Rake.nowrite(true)
305
- options.dryrun = true
306
- options.trace = true
307
- }
308
- ],
309
- ['--execute', '-e CODE', "Execute some Ruby code and exit.",
310
- lambda { |value|
311
- eval(value)
312
- exit
313
- }
314
- ],
315
- ['--execute-print', '-p CODE', "Execute some Ruby code, print the result, then exit.",
316
- lambda { |value|
317
- puts eval(value)
318
- exit
319
- }
320
- ],
321
- ['--execute-continue', '-E CODE',
322
- "Execute some Ruby code, then continue with normal task processing.",
323
- lambda { |value| eval(value) }
324
- ],
325
- ['--libdir', '-I LIBDIR', "Include LIBDIR in the search path for required modules.",
326
- lambda { |value| $:.push(value) }
327
- ],
328
- ['--no-search', '--nosearch', '-N', "Do not search parent directories for the Rakefile.",
329
- lambda { |value| options.nosearch = true }
330
- ],
331
- ['--prereqs', '-P', "Display the tasks and dependencies, then exit.",
332
- lambda { |value| options.show_prereqs = true }
333
- ],
334
- ['--quiet', '-q', "Do not log messages to standard output.",
335
- lambda { |value| Rake.verbose(false) }
336
- ],
337
- ['--rakefile', '-f [FILE]', "Use FILE as the rakefile.",
338
- lambda { |value|
339
- value ||= ''
340
- @rakefiles.clear
341
- @rakefiles << value
342
- }
343
- ],
344
- ['--rakelibdir', '--rakelib', '-R RAKELIBDIR',
345
- "Auto-import any .rake files in RAKELIBDIR. (default is 'rakelib')",
346
- lambda { |value| options.rakelib = value.split(':') }
347
- ],
348
- ['--require', '-r MODULE', "Require MODULE before executing rakefile.",
349
- lambda { |value|
350
- begin
351
- require value
352
- rescue LoadError => ex
402
+ def standard_rake_options # :nodoc:
403
+ sort_options(
404
+ [
405
+ ["--all", "-A",
406
+ "Show all tasks, even uncommented ones (in combination with -T or -D)",
407
+ lambda { |value|
408
+ options.show_all_tasks = value
409
+ }
410
+ ],
411
+ ["--backtrace=[OUT]",
412
+ "Enable full backtrace. OUT can be stderr (default) or stdout.",
413
+ lambda { |value|
414
+ options.backtrace = true
415
+ select_trace_output(options, "backtrace", value)
416
+ }
417
+ ],
418
+ ["--build-all", "-B",
419
+ "Build all prerequisites, including those which are up-to-date.",
420
+ lambda { |value|
421
+ options.build_all = true
422
+ }
423
+ ],
424
+ ["--comments",
425
+ "Show commented tasks only",
426
+ lambda { |value|
427
+ options.show_all_tasks = !value
428
+ }
429
+ ],
430
+ ["--describe", "-D [PATTERN]",
431
+ "Describe the tasks (matching optional PATTERN), then exit.",
432
+ lambda { |value|
433
+ select_tasks_to_show(options, :describe, value)
434
+ }
435
+ ],
436
+ ["--dry-run", "-n",
437
+ "Do a dry run without executing actions.",
438
+ lambda { |value|
439
+ Rake.verbose(true)
440
+ Rake.nowrite(true)
441
+ options.dryrun = true
442
+ options.trace = true
443
+ }
444
+ ],
445
+ ["--execute", "-e CODE",
446
+ "Execute some Ruby code and exit.",
447
+ lambda { |value|
448
+ eval(value)
449
+ exit
450
+ }
451
+ ],
452
+ ["--execute-print", "-p CODE",
453
+ "Execute some Ruby code, print the result, then exit.",
454
+ lambda { |value|
455
+ puts eval(value)
456
+ exit
457
+ }
458
+ ],
459
+ ["--execute-continue", "-E CODE",
460
+ "Execute some Ruby code, " +
461
+ "then continue with normal task processing.",
462
+ lambda { |value| eval(value) }
463
+ ],
464
+ ["--jobs", "-j [NUMBER]",
465
+ "Specifies the maximum number of tasks to execute in parallel. " +
466
+ "(default is number of CPU cores + 4)",
467
+ lambda { |value|
468
+ if value.nil? || value == ""
469
+ value = Float::INFINITY
470
+ elsif value =~ /^\d+$/
471
+ value = value.to_i
472
+ else
473
+ value = Rake.suggested_thread_count
474
+ end
475
+ value = 1 if value < 1
476
+ options.thread_pool_size = value - 1
477
+ }
478
+ ],
479
+ ["--job-stats [LEVEL]",
480
+ "Display job statistics. " +
481
+ "LEVEL=history displays a complete job list",
482
+ lambda { |value|
483
+ if value =~ /^history/i
484
+ options.job_stats = :history
485
+ else
486
+ options.job_stats = true
487
+ end
488
+ }
489
+ ],
490
+ ["--libdir", "-I LIBDIR",
491
+ "Include LIBDIR in the search path for required modules.",
492
+ lambda { |value| $:.push(value) }
493
+ ],
494
+ ["--multitask", "-m",
495
+ "Treat all tasks as multitasks.",
496
+ lambda { |value| options.always_multitask = true }
497
+ ],
498
+ ["--no-search", "--nosearch",
499
+ "-N", "Do not search parent directories for the Rakefile.",
500
+ lambda { |value| options.nosearch = true }
501
+ ],
502
+ ["--prereqs", "-P",
503
+ "Display the tasks and dependencies, then exit.",
504
+ lambda { |value| options.show_prereqs = true }
505
+ ],
506
+ ["--quiet", "-q",
507
+ "Do not log messages to standard output.",
508
+ lambda { |value| Rake.verbose(false) }
509
+ ],
510
+ ["--rakefile", "-f [FILENAME]",
511
+ "Use FILENAME as the rakefile to search for.",
512
+ lambda { |value|
513
+ value ||= ""
514
+ @rakefiles.clear
515
+ @rakefiles << value
516
+ }
517
+ ],
518
+ ["--rakelibdir", "--rakelib", "-R RAKELIBDIR",
519
+ "Auto-import any .rake files in RAKELIBDIR. " +
520
+ "(default is 'rakelib')",
521
+ lambda { |value|
522
+ options.rakelib = value.split(File::PATH_SEPARATOR)
523
+ }
524
+ ],
525
+ ["--require", "-r MODULE",
526
+ "Require MODULE before executing rakefile.",
527
+ lambda { |value|
353
528
  begin
354
- rake_require value
355
- rescue LoadError
356
- raise ex
529
+ require value
530
+ rescue LoadError => ex
531
+ begin
532
+ rake_require value
533
+ rescue LoadError
534
+ raise ex
535
+ end
357
536
  end
358
- end
359
- }
360
- ],
361
- ['--rules', "Trace the rules resolution.",
362
- lambda { |value| options.trace_rules = true }
363
- ],
364
- ['--silent', '-s', "Like --quiet, but also suppresses the 'in directory' announcement.",
365
- lambda { |value|
366
- Rake.verbose(false)
367
- options.silent = true
368
- }
369
- ],
370
- ['--system', '-g',
371
- "Using system wide (global) rakefiles (usually '~/.rake/*.rake').",
372
- lambda { |value| options.load_system = true }
373
- ],
374
- ['--no-system', '--nosystem', '-G',
375
- "Use standard project Rakefile search paths, ignore system wide rakefiles.",
376
- lambda { |value| options.ignore_system = true }
377
- ],
378
- ['--tasks', '-T [PATTERN]', "Display the tasks (matching optional PATTERN) with descriptions, then exit.",
379
- lambda { |value|
380
- options.show_tasks = :tasks
381
- options.show_task_pattern = Regexp.new(value || '')
382
- Rake::TaskManager.record_task_metadata = true
383
- }
384
- ],
385
- ['--trace', '-t', "Turn on invoke/execute tracing, enable full backtrace.",
386
- lambda { |value|
387
- options.trace = true
388
- Rake.verbose(true)
389
- }
390
- ],
391
- ['--verbose', '-v', "Log message to standard output.",
392
- lambda { |value| Rake.verbose(true) }
393
- ],
394
- ['--version', '-V', "Display the program version.",
395
- lambda { |value|
396
- puts "rake, version #{RAKEVERSION}"
397
- exit
398
- }
399
- ],
400
- ['--where', '-W [PATTERN]', "Describe the tasks (matching optional PATTERN), then exit.",
401
- lambda { |value|
402
- options.show_tasks = :lines
403
- options.show_task_pattern = Regexp.new(value || '')
404
- Rake::TaskManager.record_task_metadata = true
405
- }
406
- ],
407
- ['--no-deprecation-warnings', '-X', "Disable the deprecation warnings.",
408
- lambda { |value|
409
- options.ignore_deprecate = true
410
- }
411
- ],
412
- ]
413
- end
414
-
415
- # Read and handle the command line options.
416
- def handle_options
417
- options.rakelib = ['rakelib']
537
+ }
538
+ ],
539
+ ["--rules",
540
+ "Trace the rules resolution.",
541
+ lambda { |value| options.trace_rules = true }
542
+ ],
543
+ ["--silent", "-s",
544
+ "Like --quiet, but also suppresses the " +
545
+ "'in directory' announcement.",
546
+ lambda { |value|
547
+ Rake.verbose(false)
548
+ options.silent = true
549
+ }
550
+ ],
551
+ ["--suppress-backtrace PATTERN",
552
+ "Suppress backtrace lines matching regexp PATTERN. " +
553
+ "Ignored if --trace is on.",
554
+ lambda { |value|
555
+ options.suppress_backtrace_pattern = Regexp.new(value)
556
+ }
557
+ ],
558
+ ["--system", "-g",
559
+ "Using system wide (global) rakefiles " +
560
+ "(usually '~/.rake/*.rake').",
561
+ lambda { |value| options.load_system = true }
562
+ ],
563
+ ["--no-system", "--nosystem", "-G",
564
+ "Use standard project Rakefile search paths, " +
565
+ "ignore system wide rakefiles.",
566
+ lambda { |value| options.ignore_system = true }
567
+ ],
568
+ ["--tasks", "-T [PATTERN]",
569
+ "Display the tasks (matching optional PATTERN) " +
570
+ "with descriptions, then exit. " +
571
+ "-AT combination displays all of tasks contained no description.",
572
+ lambda { |value|
573
+ select_tasks_to_show(options, :tasks, value)
574
+ }
575
+ ],
576
+ ["--trace=[OUT]", "-t",
577
+ "Turn on invoke/execute tracing, enable full backtrace. " +
578
+ "OUT can be stderr (default) or stdout.",
579
+ lambda { |value|
580
+ options.trace = true
581
+ options.backtrace = true
582
+ select_trace_output(options, "trace", value)
583
+ Rake.verbose(true)
584
+ }
585
+ ],
586
+ ["--verbose", "-v",
587
+ "Log message to standard output.",
588
+ lambda { |value| Rake.verbose(true) }
589
+ ],
590
+ ["--version", "-V",
591
+ "Display the program version.",
592
+ lambda { |value|
593
+ puts "rake, version #{Rake::VERSION}"
594
+ exit
595
+ }
596
+ ],
597
+ ["--where", "-W [PATTERN]",
598
+ "Describe the tasks (matching optional PATTERN), then exit.",
599
+ lambda { |value|
600
+ select_tasks_to_show(options, :lines, value)
601
+ options.show_all_tasks = true
602
+ }
603
+ ],
604
+ ["--no-deprecation-warnings", "-X",
605
+ "Disable the deprecation warnings.",
606
+ lambda { |value|
607
+ options.ignore_deprecate = true
608
+ }
609
+ ],
610
+ ])
611
+ end
612
+
613
+ def select_tasks_to_show(options, show_tasks, value) # :nodoc:
614
+ options.show_tasks = show_tasks
615
+ options.show_task_pattern = Regexp.new(value || "")
616
+ Rake::TaskManager.record_task_metadata = true
617
+ end
618
+ private :select_tasks_to_show
619
+
620
+ def select_trace_output(options, trace_option, value) # :nodoc:
621
+ value = value.strip unless value.nil?
622
+ case value
623
+ when "stdout"
624
+ options.trace_output = $stdout
625
+ when "stderr", nil
626
+ options.trace_output = $stderr
627
+ else
628
+ fail CommandLineOptionError,
629
+ "Unrecognized --#{trace_option} option '#{value}'"
630
+ end
631
+ end
632
+ private :select_trace_output
633
+
634
+ # Read and handle the command line options. Returns the command line
635
+ # arguments that we didn't understand, which should (in theory) be just
636
+ # task names and env vars.
637
+ def handle_options(argv) # :nodoc:
638
+ set_default_options
418
639
 
419
640
  OptionParser.new do |opts|
420
- opts.banner = "rake [-f rakefile] {options} targets..."
641
+ opts.banner = "#{Rake.application.name} [-f rakefile] {options} targets..."
421
642
  opts.separator ""
422
643
  opts.separator "Options are ..."
423
644
 
@@ -427,23 +648,13 @@ module Rake
427
648
  end
428
649
 
429
650
  standard_rake_options.each { |args| opts.on(*args) }
430
- opts.environment('RAKEOPT')
431
- end.parse!
432
-
433
- # If class namespaces are requested, set the global options
434
- # according to the values in the options structure.
435
- if options.classic_namespace
436
- $show_tasks = options.show_tasks
437
- $show_prereqs = options.show_prereqs
438
- $trace = options.trace
439
- $dryrun = options.dryrun
440
- $silent = options.silent
441
- end
651
+ opts.environment("RAKEOPT")
652
+ end.parse(argv)
442
653
  end
443
654
 
444
655
  # Similar to the regular Ruby +require+ command, but will check
445
656
  # for *.rake files in addition to *.rb files.
446
- def rake_require(file_name, paths=$LOAD_PATH, loaded=$")
657
+ def rake_require(file_name, paths=$LOAD_PATH, loaded=$") # :nodoc:
447
658
  fn = file_name + ".rake"
448
659
  return false if loaded.include?(fn)
449
660
  paths.each do |path|
@@ -457,13 +668,11 @@ module Rake
457
668
  fail LoadError, "Can't find #{file_name}"
458
669
  end
459
670
 
460
- def find_rakefile_location
671
+ def find_rakefile_location # :nodoc:
461
672
  here = Dir.pwd
462
- while ! (fn = have_rakefile)
673
+ until (fn = have_rakefile)
463
674
  Dir.chdir("..")
464
- if Dir.pwd == here || options.nosearch
465
- return nil
466
- end
675
+ return nil if Dir.pwd == here || options.nosearch
467
676
  here = Dir.pwd
468
677
  end
469
678
  [fn, here]
@@ -471,14 +680,14 @@ module Rake
471
680
  Dir.chdir(Rake.original_dir)
472
681
  end
473
682
 
474
- def print_rakefile_directory(location)
683
+ def print_rakefile_directory(location) # :nodoc:
475
684
  $stderr.puts "(in #{Dir.pwd})" unless
476
685
  options.silent or original_dir == location
477
686
  end
478
687
 
479
688
  def raw_load_rakefile # :nodoc:
480
689
  rakefile, location = find_rakefile_location
481
- if (! options.ignore_system) &&
690
+ if (!options.ignore_system) &&
482
691
  (options.load_system || rakefile.nil?) &&
483
692
  system_dir && File.directory?(system_dir)
484
693
  print_rakefile_directory(location)
@@ -491,8 +700,8 @@ module Rake
491
700
  @rakefile = rakefile
492
701
  Dir.chdir(location)
493
702
  print_rakefile_directory(location)
494
- $rakefile = @rakefile if options.classic_namespace
495
- Rake.load_rakefile(File.expand_path(@rakefile)) if @rakefile && @rakefile != ''
703
+ Rake.load_rakefile(File.expand_path(@rakefile)) if
704
+ @rakefile && @rakefile != ""
496
705
  options.rakelib.each do |rlib|
497
706
  glob("#{rlib}/*.rake") do |name|
498
707
  add_import name
@@ -502,17 +711,17 @@ module Rake
502
711
  load_imports
503
712
  end
504
713
 
505
- def glob(path, &block)
506
- Dir[path.gsub("\\", '/')].each(&block)
714
+ def glob(path, &block) # :nodoc:
715
+ FileList.glob(path.tr("\\", "/")).each(&block)
507
716
  end
508
717
  private :glob
509
718
 
510
719
  # The directory path containing the system wide rakefiles.
511
- def system_dir
720
+ def system_dir # :nodoc:
512
721
  @system_dir ||=
513
722
  begin
514
- if ENV['RAKE_SYSTEM']
515
- ENV['RAKE_SYSTEM']
723
+ if ENV["RAKE_SYSTEM"]
724
+ ENV["RAKE_SYSTEM"]
516
725
  else
517
726
  standard_system_dir
518
727
  end
@@ -526,7 +735,7 @@ module Rake
526
735
  end
527
736
  else
528
737
  def standard_system_dir #:nodoc:
529
- File.join(File.expand_path('~'), '.rake')
738
+ File.join(File.expand_path("~"), ".rake")
530
739
  end
531
740
  end
532
741
  private :standard_system_dir
@@ -534,56 +743,82 @@ module Rake
534
743
  # Collect the list of tasks on the command line. If no tasks are
535
744
  # given, return a list containing only the default task.
536
745
  # Environmental assignments are processed at this time as well.
537
- def collect_tasks
746
+ #
747
+ # `args` is the list of arguments to peruse to get the list of tasks.
748
+ # It should be the command line that was given to rake, less any
749
+ # recognised command-line options, which OptionParser.parse will
750
+ # have taken care of already.
751
+ def collect_command_line_tasks(args) # :nodoc:
538
752
  @top_level_tasks = []
539
- ARGV.each do |arg|
540
- if arg =~ /^(\w+)=(.*)$/
753
+ args.each do |arg|
754
+ if arg =~ /^(\w+)=(.*)$/m
541
755
  ENV[$1] = $2
542
756
  else
543
757
  @top_level_tasks << arg unless arg =~ /^-/
544
758
  end
545
759
  end
546
- @top_level_tasks.push("default") if @top_level_tasks.size == 0
760
+ @top_level_tasks.push(default_task_name) if @top_level_tasks.empty?
761
+ end
762
+
763
+ # Default task name ("default").
764
+ # (May be overridden by subclasses)
765
+ def default_task_name # :nodoc:
766
+ "default"
547
767
  end
548
768
 
549
769
  # Add a file to the list of files to be imported.
550
- def add_import(fn)
770
+ def add_import(fn) # :nodoc:
551
771
  @pending_imports << fn
552
772
  end
553
773
 
554
774
  # Load the pending list of imported files.
555
- def load_imports
775
+ def load_imports # :nodoc:
556
776
  while fn = @pending_imports.shift
557
777
  next if @imported.member?(fn)
558
- if fn_task = lookup(fn)
559
- fn_task.invoke
560
- end
778
+ fn_task = lookup(fn) and fn_task.invoke
561
779
  ext = File.extname(fn)
562
780
  loader = @loaders[ext] || @default_loader
563
781
  loader.load(fn)
782
+ if fn_task = lookup(fn) and fn_task.needed?
783
+ fn_task.reenable
784
+ fn_task.invoke
785
+ loader.load(fn)
786
+ end
564
787
  @imported << fn
565
788
  end
566
789
  end
567
790
 
568
- # Warn about deprecated use of top level constant names.
569
- def const_warning(const_name)
570
- @const_warning ||= false
571
- if ! @const_warning
572
- $stderr.puts %{WARNING: Deprecated reference to top-level constant '#{const_name}' } +
573
- %{found at: #{rakefile_location}} # '
574
- $stderr.puts %{ Use --classic-namespace on rake command}
575
- $stderr.puts %{ or 'require "rake/classic_namespace"' in Rakefile}
576
- end
577
- @const_warning = true
578
- end
579
-
580
- def rakefile_location backtrace = caller
581
- backtrace.map { |t| t[/([^:]+):/,1] }
791
+ def rakefile_location(backtrace=caller) # :nodoc:
792
+ backtrace.map { |t| t[/([^:]+):/, 1] }
582
793
 
583
794
  re = /^#{@rakefile}$/
584
795
  re = /#{re.source}/i if windows?
585
796
 
586
- backtrace.find { |str| str =~ re } || ''
797
+ backtrace.find { |str| str =~ re } || ""
798
+ end
799
+
800
+ def set_default_options # :nodoc:
801
+ options.always_multitask = false
802
+ options.backtrace = false
803
+ options.build_all = false
804
+ options.dryrun = false
805
+ options.ignore_deprecate = false
806
+ options.ignore_system = false
807
+ options.job_stats = false
808
+ options.load_system = false
809
+ options.nosearch = false
810
+ options.rakelib = %w[rakelib]
811
+ options.show_all_tasks = false
812
+ options.show_prereqs = false
813
+ options.show_task_pattern = nil
814
+ options.show_tasks = nil
815
+ options.silent = false
816
+ options.suppress_backtrace_pattern = nil
817
+ options.thread_pool_size = Rake.suggested_thread_count
818
+ options.trace = false
819
+ options.trace_output = $stderr
820
+ options.trace_rules = false
587
821
  end
822
+
588
823
  end
589
824
  end