vergissberlin 0.0.5 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (127) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +10 -1
  3. data/bin/vergissberlin +1 -1
  4. data/lib/vergissberlin/version.rb +1 -1
  5. data/test/test_test.rb +7 -0
  6. data/test/utils.rb +37 -0
  7. data/vendor/bundle/bin/rake +23 -0
  8. data/vendor/bundle/bin/vergissberlin +23 -0
  9. data/vendor/bundle/build_info/capistrano_colors-0.5.5.info +1 -0
  10. data/vendor/bundle/build_info/rake-10.0.4.info +1 -0
  11. data/vendor/bundle/gems/capistrano_colors-0.5.5/Manifest +7 -0
  12. data/vendor/bundle/gems/capistrano_colors-0.5.5/README.rdoc +130 -0
  13. data/vendor/bundle/gems/capistrano_colors-0.5.5/Rakefile +1 -0
  14. data/vendor/bundle/gems/capistrano_colors-0.5.5/capistrano_colors.gemspec +33 -0
  15. data/vendor/bundle/gems/capistrano_colors-0.5.5/lib/capistrano_colors/configuration.rb +70 -0
  16. data/vendor/bundle/gems/capistrano_colors-0.5.5/lib/capistrano_colors/logger.rb +72 -0
  17. data/vendor/bundle/gems/capistrano_colors-0.5.5/lib/capistrano_colors.rb +18 -0
  18. data/vendor/bundle/gems/rake-10.0.4/CHANGES +530 -0
  19. data/vendor/bundle/gems/rake-10.0.4/MIT-LICENSE +21 -0
  20. data/vendor/bundle/gems/rake-10.0.4/README.rdoc +187 -0
  21. data/vendor/bundle/gems/rake-10.0.4/Rakefile +375 -0
  22. data/vendor/bundle/gems/rake-10.0.4/TODO +21 -0
  23. data/vendor/bundle/gems/rake-10.0.4/bin/rake +33 -0
  24. data/vendor/bundle/gems/rake-10.0.4/install.rb +90 -0
  25. data/vendor/bundle/gems/rake-10.0.4/lib/rake/alt_system.rb +109 -0
  26. data/vendor/bundle/gems/rake-10.0.4/lib/rake/application.rb +681 -0
  27. data/vendor/bundle/gems/rake-10.0.4/lib/rake/backtrace.rb +19 -0
  28. data/vendor/bundle/gems/rake-10.0.4/lib/rake/clean.rb +32 -0
  29. data/vendor/bundle/gems/rake-10.0.4/lib/rake/cloneable.rb +16 -0
  30. data/vendor/bundle/gems/rake-10.0.4/lib/rake/contrib/compositepublisher.rb +21 -0
  31. data/vendor/bundle/gems/rake-10.0.4/lib/rake/contrib/ftptools.rb +151 -0
  32. data/vendor/bundle/gems/rake-10.0.4/lib/rake/contrib/publisher.rb +73 -0
  33. data/vendor/bundle/gems/rake-10.0.4/lib/rake/contrib/rubyforgepublisher.rb +16 -0
  34. data/vendor/bundle/gems/rake-10.0.4/lib/rake/contrib/sshpublisher.rb +50 -0
  35. data/vendor/bundle/gems/rake-10.0.4/lib/rake/contrib/sys.rb +1 -0
  36. data/vendor/bundle/gems/rake-10.0.4/lib/rake/default_loader.rb +10 -0
  37. data/vendor/bundle/gems/rake-10.0.4/lib/rake/dsl_definition.rb +156 -0
  38. data/vendor/bundle/gems/rake-10.0.4/lib/rake/early_time.rb +18 -0
  39. data/vendor/bundle/gems/rake-10.0.4/lib/rake/ext/core.rb +27 -0
  40. data/vendor/bundle/gems/rake-10.0.4/lib/rake/ext/module.rb +0 -0
  41. data/vendor/bundle/gems/rake-10.0.4/lib/rake/ext/string.rb +168 -0
  42. data/vendor/bundle/gems/rake-10.0.4/lib/rake/ext/time.rb +15 -0
  43. data/vendor/bundle/gems/rake-10.0.4/lib/rake/file_creation_task.rb +24 -0
  44. data/vendor/bundle/gems/rake-10.0.4/lib/rake/file_list.rb +410 -0
  45. data/vendor/bundle/gems/rake-10.0.4/lib/rake/file_task.rb +47 -0
  46. data/vendor/bundle/gems/rake-10.0.4/lib/rake/file_utils.rb +114 -0
  47. data/vendor/bundle/gems/rake-10.0.4/lib/rake/file_utils_ext.rb +143 -0
  48. data/vendor/bundle/gems/rake-10.0.4/lib/rake/gempackagetask.rb +1 -0
  49. data/vendor/bundle/gems/rake-10.0.4/lib/rake/invocation_chain.rb +51 -0
  50. data/vendor/bundle/gems/rake-10.0.4/lib/rake/invocation_exception_mixin.rb +16 -0
  51. data/vendor/bundle/gems/rake-10.0.4/lib/rake/loaders/makefile.rb +40 -0
  52. data/vendor/bundle/gems/rake-10.0.4/lib/rake/multi_task.rb +13 -0
  53. data/vendor/bundle/gems/rake-10.0.4/lib/rake/name_space.rb +25 -0
  54. data/vendor/bundle/gems/rake-10.0.4/lib/rake/packagetask.rb +185 -0
  55. data/vendor/bundle/gems/rake-10.0.4/lib/rake/pathmap.rb +1 -0
  56. data/vendor/bundle/gems/rake-10.0.4/lib/rake/phony.rb +15 -0
  57. data/vendor/bundle/gems/rake-10.0.4/lib/rake/private_reader.rb +20 -0
  58. data/vendor/bundle/gems/rake-10.0.4/lib/rake/promise.rb +99 -0
  59. data/vendor/bundle/gems/rake-10.0.4/lib/rake/pseudo_status.rb +24 -0
  60. data/vendor/bundle/gems/rake-10.0.4/lib/rake/rake_module.rb +37 -0
  61. data/vendor/bundle/gems/rake-10.0.4/lib/rake/rake_test_loader.rb +22 -0
  62. data/vendor/bundle/gems/rake-10.0.4/lib/rake/rdoctask.rb +1 -0
  63. data/vendor/bundle/gems/rake-10.0.4/lib/rake/ruby182_test_unit_fix.rb +25 -0
  64. data/vendor/bundle/gems/rake-10.0.4/lib/rake/rule_recursion_overflow_error.rb +20 -0
  65. data/vendor/bundle/gems/rake-10.0.4/lib/rake/runtest.rb +22 -0
  66. data/vendor/bundle/gems/rake-10.0.4/lib/rake/task.rb +368 -0
  67. data/vendor/bundle/gems/rake-10.0.4/lib/rake/task_argument_error.rb +7 -0
  68. data/vendor/bundle/gems/rake-10.0.4/lib/rake/task_arguments.rb +78 -0
  69. data/vendor/bundle/gems/rake-10.0.4/lib/rake/task_manager.rb +296 -0
  70. data/vendor/bundle/gems/rake-10.0.4/lib/rake/tasklib.rb +22 -0
  71. data/vendor/bundle/gems/rake-10.0.4/lib/rake/testtask.rb +198 -0
  72. data/vendor/bundle/gems/rake-10.0.4/lib/rake/thread_history_display.rb +48 -0
  73. data/vendor/bundle/gems/rake-10.0.4/lib/rake/thread_pool.rb +155 -0
  74. data/vendor/bundle/gems/rake-10.0.4/lib/rake/trace_output.rb +22 -0
  75. data/vendor/bundle/gems/rake-10.0.4/lib/rake/version.rb +13 -0
  76. data/vendor/bundle/gems/rake-10.0.4/lib/rake/win32.rb +55 -0
  77. data/vendor/bundle/gems/rake-10.0.4/lib/rake.rb +71 -0
  78. data/vendor/bundle/gems/rake-10.0.4/test/file_creation.rb +34 -0
  79. data/vendor/bundle/gems/rake-10.0.4/test/helper.rb +562 -0
  80. data/vendor/bundle/gems/rake-10.0.4/test/test_private_reader.rb +42 -0
  81. data/vendor/bundle/gems/rake-10.0.4/test/test_rake.rb +40 -0
  82. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_application.rb +515 -0
  83. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_application_options.rb +455 -0
  84. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_backtrace.rb +89 -0
  85. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_clean.rb +14 -0
  86. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_definitions.rb +80 -0
  87. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_directory_task.rb +57 -0
  88. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_dsl.rb +40 -0
  89. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_early_time.rb +31 -0
  90. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_extension.rb +59 -0
  91. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_file_creation_task.rb +56 -0
  92. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_file_list.rb +628 -0
  93. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_file_list_path_map.rb +8 -0
  94. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_file_task.rb +122 -0
  95. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_file_utils.rb +305 -0
  96. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_ftp_file.rb +59 -0
  97. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_functional.rb +496 -0
  98. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_invocation_chain.rb +52 -0
  99. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_makefile_loader.rb +44 -0
  100. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_multi_task.rb +59 -0
  101. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_name_space.rb +43 -0
  102. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_package_task.rb +79 -0
  103. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_path_map.rb +157 -0
  104. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_path_map_explode.rb +34 -0
  105. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_path_map_partial.rb +18 -0
  106. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_pseudo_status.rb +21 -0
  107. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_rake_test_loader.rb +21 -0
  108. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_reduce_compat.rb +30 -0
  109. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_require.rb +40 -0
  110. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_rules.rb +327 -0
  111. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_task.rb +340 -0
  112. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_task_argument_parsing.rb +103 -0
  113. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_task_arguments.rb +88 -0
  114. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_task_lib.rb +9 -0
  115. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_task_manager.rb +157 -0
  116. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_task_manager_argument_resolution.rb +19 -0
  117. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_task_with_arguments.rb +171 -0
  118. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_test_task.rb +120 -0
  119. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_thread_pool.rb +122 -0
  120. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_top_level_functions.rb +71 -0
  121. data/vendor/bundle/gems/rake-10.0.4/test/test_rake_win32.rb +72 -0
  122. data/vendor/bundle/gems/rake-10.0.4/test/test_thread_history_display.rb +91 -0
  123. data/vendor/bundle/gems/rake-10.0.4/test/test_trace_output.rb +50 -0
  124. data/vendor/bundle/specifications/capistrano_colors-0.5.5.gemspec +32 -0
  125. data/vendor/bundle/specifications/rake-10.0.4.gemspec +35 -0
  126. data/vergissberlin.gemspec +4 -2
  127. metadata +125 -2
@@ -0,0 +1,21 @@
1
+ = Rake Project -- To Do List
2
+
3
+ Send suggestions for this list to mailto:jim@weirichhouse.org or on
4
+ the rake-devel@rubyforge.org mailing list.
5
+
6
+ === To Do
7
+ * Need a nice API for accessing tasks in namespaces, namespaces in an app, etc.
8
+ * Provide a way to disable -w warning mode.
9
+ * Define a set of default rules that work in the absence of any Rakefile
10
+ * What about cyclic dependencies?
11
+ * Java support utilities
12
+ * Installation support utilities
13
+ * Check out installpkg.rb
14
+ * Autogenerate Dependencies
15
+ * Rules should apply to existing tasks if no actions are defined.
16
+ * How to create multiple package tasks without task name collision?
17
+ * Trap "ln -s" commands that fail and use "cp" instead (SMB mounted
18
+ drives have problems with "ln -s".
19
+
20
+
21
+ (moved DONE list to CHANGES file)
@@ -0,0 +1,33 @@
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
+ begin
26
+ require 'rubygems'
27
+ gem 'rake'
28
+ rescue LoadError
29
+ end
30
+
31
+ require 'rake'
32
+
33
+ Rake.application.run
@@ -0,0 +1,90 @@
1
+ require 'rbconfig'
2
+ require 'find'
3
+ require 'fileutils'
4
+
5
+ include RbConfig
6
+
7
+ $ruby = CONFIG['ruby_install_name']
8
+
9
+ ##
10
+ # Install a binary file. We patch in on the way through to
11
+ # insert a #! line. If this is a Unix install, we name
12
+ # the command (for example) 'rake' and let the shebang line
13
+ # handle running it. Under windows, we add a '.rb' extension
14
+ # and let file associations to their stuff
15
+ #
16
+
17
+ def installBIN(from, opfile)
18
+
19
+ tmp_dir = nil
20
+ for t in [".", "/tmp", "c:/temp", $bindir]
21
+ stat = File.stat(t) rescue next
22
+ if stat.directory? and stat.writable?
23
+ tmp_dir = t
24
+ break
25
+ end
26
+ end
27
+
28
+ fail "Cannot find a temporary directory" unless tmp_dir
29
+ tmp_file = File.join(tmp_dir, "_tmp")
30
+
31
+ File.open(from) do |ip|
32
+ File.open(tmp_file, "w") do |op|
33
+ ruby = File.join($realbindir, $ruby)
34
+ op.puts "#!#{ruby} -w"
35
+ op.write ip.read
36
+ end
37
+ end
38
+
39
+ opfile += ".rb" if CONFIG["target_os"] =~ /mswin/i
40
+ FileUtils.install(tmp_file, File.join($bindir, opfile),
41
+ {:mode => 0755, :verbose => true})
42
+ File.unlink(tmp_file)
43
+ end
44
+
45
+ $sitedir = CONFIG["sitelibdir"]
46
+ unless $sitedir
47
+ version = CONFIG["MAJOR"]+"."+CONFIG["MINOR"]
48
+ $libdir = File.join(CONFIG["libdir"], "ruby", version)
49
+ $sitedir = $:.find {|x| x =~ /site_ruby/}
50
+ if !$sitedir
51
+ $sitedir = File.join($libdir, "site_ruby")
52
+ elsif $sitedir !~ Regexp.quote(version)
53
+ $sitedir = File.join($sitedir, version)
54
+ end
55
+ end
56
+
57
+ $bindir = CONFIG["bindir"]
58
+
59
+ $realbindir = $bindir
60
+
61
+ bindir = CONFIG["bindir"]
62
+ if (destdir = ENV['DESTDIR'])
63
+ $bindir = destdir + $bindir
64
+ $sitedir = destdir + $sitedir
65
+
66
+ FileUtils.mkdir_p($bindir)
67
+ FileUtils.mkdir_p($sitedir)
68
+ end
69
+
70
+ rake_dest = File.join($sitedir, "rake")
71
+ FileUtils.mkdir_p(rake_dest, {:verbose => true})
72
+ File.chmod(0755, rake_dest)
73
+
74
+ # The library files
75
+
76
+ files = Dir.chdir('lib') { Dir['**/*.rb'].sort }
77
+
78
+ for fn in files
79
+ fn_dir = File.dirname(fn)
80
+ target_dir = File.join($sitedir, fn_dir)
81
+ if ! File.exist?(target_dir)
82
+ FileUtils.mkdir_p(target_dir)
83
+ end
84
+ FileUtils.install(File.join('lib', fn), File.join($sitedir, fn),
85
+ {:mode => 0644, :verbose => true})
86
+ end
87
+
88
+ # and the executable
89
+
90
+ installBIN("bin/rake", "rake")
@@ -0,0 +1,109 @@
1
+ #
2
+ # Copyright (c) 2008 James M. Lawrence
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person
5
+ # obtaining a copy of this software and associated documentation files
6
+ # (the "Software"), to deal in the Software without restriction,
7
+ # including without limitation the rights to use, copy, modify, merge,
8
+ # publish, distribute, sublicense, and/or sell copies of the Software,
9
+ # and to permit persons to whom the Software is furnished to do so,
10
+ # subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19
+ # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20
+ # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21
+ # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ # SOFTWARE.
23
+ #
24
+
25
+ require 'rbconfig'
26
+
27
+ #
28
+ # Alternate implementations of system() and backticks `` on Windows
29
+ # for ruby-1.8 and earlier.
30
+ #
31
+ module Rake::AltSystem
32
+ WINDOWS = RbConfig::CONFIG["host_os"] =~
33
+ %r!(msdos|mswin|djgpp|mingw|[Ww]indows)!
34
+
35
+ class << self
36
+ def define_module_function(name, &block)
37
+ define_method(name, &block)
38
+ module_function(name)
39
+ end
40
+ end
41
+
42
+ if WINDOWS and RUBY_VERSION < "1.9.0"
43
+ RUNNABLE_EXTS = %w[com exe bat cmd]
44
+ RUNNABLE_PATTERN = %r!\.(#{RUNNABLE_EXTS.join('|')})\Z!i
45
+
46
+ define_module_function :kernel_system, &Kernel.method(:system)
47
+ define_module_function :kernel_backticks, &Kernel.method(:'`')
48
+
49
+ module_function
50
+
51
+ def repair_command(cmd)
52
+ "call " + (
53
+ if cmd =~ %r!\A\s*\".*?\"!
54
+ # already quoted
55
+ cmd
56
+ elsif match = cmd.match(%r!\A\s*(\S+)!)
57
+ if match[1] =~ %r!/!
58
+ # avoid x/y.bat interpretation as x with option /y
59
+ %Q!"#{match[1]}"! + match.post_match
60
+ else
61
+ # a shell command will fail if quoted
62
+ cmd
63
+ end
64
+ else
65
+ # empty or whitespace
66
+ cmd
67
+ end
68
+ )
69
+ end
70
+
71
+ def find_runnable(file)
72
+ if file =~ RUNNABLE_PATTERN
73
+ file
74
+ else
75
+ RUNNABLE_EXTS.each { |ext|
76
+ if File.exist?(test = "#{file}.#{ext}")
77
+ return test
78
+ end
79
+ }
80
+ nil
81
+ end
82
+ end
83
+
84
+ def system(cmd, *args)
85
+ repaired = (
86
+ if args.empty?
87
+ [repair_command(cmd)]
88
+ elsif runnable = find_runnable(cmd)
89
+ [File.expand_path(runnable), *args]
90
+ else
91
+ # non-existent file
92
+ [cmd, *args]
93
+ end
94
+ )
95
+ kernel_system(*repaired)
96
+ end
97
+
98
+ def backticks(cmd)
99
+ kernel_backticks(repair_command(cmd))
100
+ end
101
+
102
+ define_module_function :'`', &method(:backticks)
103
+ else
104
+ # Non-Windows or ruby-1.9+: same as Kernel versions
105
+ define_module_function :system, &Kernel.method(:system)
106
+ define_module_function :backticks, &Kernel.method(:'`')
107
+ define_module_function :'`', &Kernel.method(:'`')
108
+ end
109
+ end
@@ -0,0 +1,681 @@
1
+ require 'shellwords'
2
+ require 'optparse'
3
+
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'
10
+
11
+ module Rake
12
+
13
+ CommandLineOptionError = Class.new(StandardError)
14
+
15
+ ######################################################################
16
+ # Rake main application object. When invoking +rake+ from the
17
+ # command line, a Rake::Application object is created and run.
18
+ #
19
+ class Application
20
+ include TaskManager
21
+ include TraceOutput
22
+
23
+ # The name of the application (typically 'rake')
24
+ attr_reader :name
25
+
26
+ # The original directory where rake was invoked.
27
+ attr_reader :original_dir
28
+
29
+ # Name of the actual rakefile used.
30
+ attr_reader :rakefile
31
+
32
+ # Number of columns on the terminal
33
+ attr_accessor :terminal_columns
34
+
35
+ # List of the top level task names (task names from the command line).
36
+ attr_reader :top_level_tasks
37
+
38
+ DEFAULT_RAKEFILES = ['rakefile', 'Rakefile', 'rakefile.rb', 'Rakefile.rb'].freeze
39
+
40
+ # Initialize a Rake::Application object.
41
+ def initialize
42
+ super
43
+ @name = 'rake'
44
+ @rakefiles = DEFAULT_RAKEFILES.dup
45
+ @rakefile = nil
46
+ @pending_imports = []
47
+ @imported = []
48
+ @loaders = {}
49
+ @default_loader = Rake::DefaultLoader.new
50
+ @original_dir = Dir.pwd
51
+ @top_level_tasks = []
52
+ add_loader('rb', DefaultLoader.new)
53
+ add_loader('rf', DefaultLoader.new)
54
+ add_loader('rake', DefaultLoader.new)
55
+ @tty_output = STDOUT.tty?
56
+ @terminal_columns = ENV['RAKE_COLUMNS'].to_i
57
+ end
58
+
59
+ # Run the Rake application. The run method performs the following
60
+ # three steps:
61
+ #
62
+ # * Initialize the command line options (+init+).
63
+ # * Define the tasks (+load_rakefile+).
64
+ # * Run the top level tasks (+top_level+).
65
+ #
66
+ # If you wish to build a custom rake command, you should call
67
+ # +init+ on your application. Then define any tasks. Finally,
68
+ # call +top_level+ to run your top level tasks.
69
+ def run
70
+ standard_exception_handling do
71
+ init
72
+ load_rakefile
73
+ top_level
74
+ end
75
+ end
76
+
77
+ # Initialize the command line parameters and app name.
78
+ def init(app_name='rake')
79
+ standard_exception_handling do
80
+ @name = app_name
81
+ handle_options
82
+ collect_tasks
83
+ end
84
+ end
85
+
86
+ # Find the rakefile and then load it and any pending imports.
87
+ def load_rakefile
88
+ standard_exception_handling do
89
+ raw_load_rakefile
90
+ end
91
+ end
92
+
93
+ # Run the top level tasks of a Rake application.
94
+ def top_level
95
+ run_with_threads do
96
+ if options.show_tasks
97
+ display_tasks_and_comments
98
+ elsif options.show_prereqs
99
+ display_prerequisites
100
+ else
101
+ top_level_tasks.each { |task_name| invoke_task(task_name) }
102
+ end
103
+ end
104
+ end
105
+
106
+ # Run the given block with the thread startup and shutdown.
107
+ def run_with_threads
108
+ thread_pool.gather_history if options.job_stats == :history
109
+
110
+ yield
111
+
112
+ thread_pool.join
113
+ if options.job_stats
114
+ stats = thread_pool.statistics
115
+ puts "Maximum active threads: #{stats[:max_active_threads]}"
116
+ puts "Total threads in play: #{stats[:total_threads_in_play]}"
117
+ end
118
+ ThreadHistoryDisplay.new(thread_pool.history).show if options.job_stats == :history
119
+ end
120
+
121
+ # Add a loader to handle imported files ending in the extension
122
+ # +ext+.
123
+ def add_loader(ext, loader)
124
+ ext = ".#{ext}" unless ext =~ /^\./
125
+ @loaders[ext] = loader
126
+ end
127
+
128
+ # Application options from the command line
129
+ def options
130
+ @options ||= OpenStruct.new
131
+ end
132
+
133
+ # Return the thread pool used for multithreaded processing.
134
+ def thread_pool # :nodoc:
135
+ @thread_pool ||= ThreadPool.new(options.thread_pool_size||FIXNUM_MAX)
136
+ end
137
+
138
+ # private ----------------------------------------------------------------
139
+
140
+ def invoke_task(task_string)
141
+ name, args = parse_task_string(task_string)
142
+ t = self[name]
143
+ t.invoke(*args)
144
+ end
145
+
146
+ def parse_task_string(string)
147
+ if string =~ /^([^\[]+)(\[(.*)\])$/
148
+ name = $1
149
+ args = $3.split(/\s*,\s*/)
150
+ else
151
+ name = string
152
+ args = []
153
+ end
154
+ [name, args]
155
+ end
156
+
157
+ # Provide standard exception handling for the given block.
158
+ def standard_exception_handling
159
+ begin
160
+ yield
161
+ rescue SystemExit => ex
162
+ # Exit silently with current status
163
+ raise
164
+ rescue OptionParser::InvalidOption => ex
165
+ $stderr.puts ex.message
166
+ exit(false)
167
+ rescue Exception => ex
168
+ # Exit with error message
169
+ display_error_message(ex)
170
+ exit_because_of_exception(ex)
171
+ end
172
+ end
173
+
174
+ # Exit the program because of an unhandle exception.
175
+ # (may be overridden by subclasses)
176
+ def exit_because_of_exception(ex)
177
+ exit(false)
178
+ end
179
+
180
+ # Display the error message that caused the exception.
181
+ def display_error_message(ex)
182
+ trace "#{name} aborted!"
183
+ trace ex.message
184
+ if options.backtrace
185
+ trace ex.backtrace.join("\n")
186
+ else
187
+ trace Backtrace.collapse(ex.backtrace).join("\n")
188
+ end
189
+ trace "Tasks: #{ex.chain}" if has_chain?(ex)
190
+ trace "(See full trace by running task with --trace)" unless options.backtrace
191
+ end
192
+
193
+ # Warn about deprecated usage.
194
+ #
195
+ # Example:
196
+ # Rake.application.deprecate("import", "Rake.import", caller.first)
197
+ #
198
+ def deprecate(old_usage, new_usage, call_site)
199
+ unless options.ignore_deprecate
200
+ $stderr.puts "WARNING: '#{old_usage}' is deprecated. " +
201
+ "Please use '#{new_usage}' instead.\n" +
202
+ " at #{call_site}"
203
+ end
204
+ end
205
+
206
+ # Does the exception have a task invocation chain?
207
+ def has_chain?(exception)
208
+ exception.respond_to?(:chain) && exception.chain
209
+ end
210
+ private :has_chain?
211
+
212
+ # True if one of the files in RAKEFILES is in the current directory.
213
+ # If a match is found, it is copied into @rakefile.
214
+ def have_rakefile
215
+ @rakefiles.each do |fn|
216
+ if File.exist?(fn)
217
+ others = FileList.glob(fn, File::FNM_CASEFOLD)
218
+ return others.size == 1 ? others.first : fn
219
+ elsif fn == ''
220
+ return fn
221
+ end
222
+ end
223
+ return nil
224
+ end
225
+
226
+ # True if we are outputting to TTY, false otherwise
227
+ def tty_output?
228
+ @tty_output
229
+ end
230
+
231
+ # Override the detected TTY output state (mostly for testing)
232
+ def tty_output=( tty_output_state )
233
+ @tty_output = tty_output_state
234
+ end
235
+
236
+ # We will truncate output if we are outputting to a TTY or if we've been
237
+ # given an explicit column width to honor
238
+ def truncate_output?
239
+ tty_output? || @terminal_columns.nonzero?
240
+ end
241
+
242
+ # Display the tasks and comments.
243
+ def display_tasks_and_comments
244
+ displayable_tasks = tasks.select { |t|
245
+ (options.show_all_tasks || t.comment) && t.name =~ options.show_task_pattern
246
+ }
247
+ case options.show_tasks
248
+ when :tasks
249
+ width = displayable_tasks.collect { |t| t.name_with_args.length }.max || 10
250
+ max_column = truncate_output? ? terminal_width - name.size - width - 7 : nil
251
+
252
+ displayable_tasks.each do |t|
253
+ printf "#{name} %-#{width}s # %s\n",
254
+ t.name_with_args, max_column ? truncate(t.comment, max_column) : t.comment
255
+ end
256
+ when :describe
257
+ displayable_tasks.each do |t|
258
+ puts "#{name} #{t.name_with_args}"
259
+ comment = t.full_comment || ""
260
+ comment.split("\n").each do |line|
261
+ puts " #{line}"
262
+ end
263
+ puts
264
+ end
265
+ when :lines
266
+ displayable_tasks.each do |t|
267
+ t.locations.each do |loc|
268
+ printf "#{name} %-30s %s\n",t.name_with_args, loc
269
+ end
270
+ end
271
+ else
272
+ fail "Unknown show task mode: '#{options.show_tasks}'"
273
+ end
274
+ end
275
+
276
+ def terminal_width
277
+ if @terminal_columns.nonzero?
278
+ result = @terminal_columns
279
+ else
280
+ result = unix? ? dynamic_width : 80
281
+ end
282
+ (result < 10) ? 80 : result
283
+ rescue
284
+ 80
285
+ end
286
+
287
+ # Calculate the dynamic width of the
288
+ def dynamic_width
289
+ @dynamic_width ||= (dynamic_width_stty.nonzero? || dynamic_width_tput)
290
+ end
291
+
292
+ def dynamic_width_stty
293
+ %x{stty size 2>/dev/null}.split[1].to_i
294
+ end
295
+
296
+ def dynamic_width_tput
297
+ %x{tput cols 2>/dev/null}.to_i
298
+ end
299
+
300
+ def unix?
301
+ RbConfig::CONFIG['host_os'] =~ /(aix|darwin|linux|(net|free|open)bsd|cygwin|solaris|irix|hpux)/i
302
+ end
303
+
304
+ def windows?
305
+ Win32.windows?
306
+ end
307
+
308
+ def truncate(string, width)
309
+ if string.nil?
310
+ ""
311
+ elsif string.length <= width
312
+ string
313
+ else
314
+ ( string[0, width-3] || "" ) + "..."
315
+ end
316
+ end
317
+
318
+ # Display the tasks and prerequisites
319
+ def display_prerequisites
320
+ tasks.each do |t|
321
+ puts "#{name} #{t.name}"
322
+ t.prerequisites.each { |pre| puts " #{pre}" }
323
+ end
324
+ end
325
+
326
+ def trace(*strings)
327
+ options.trace_output ||= $stderr
328
+ trace_on(options.trace_output, *strings)
329
+ end
330
+
331
+ def sort_options(options)
332
+ options.sort_by { |opt|
333
+ opt.select { |o| o =~ /^-/ }.map { |o| o.downcase }.sort.reverse
334
+ }
335
+ end
336
+ private :sort_options
337
+
338
+ # A list of all the standard options used in rake, suitable for
339
+ # passing to OptionParser.
340
+ def standard_rake_options
341
+ sort_options(
342
+ [
343
+ ['--all', '-A', "Show all tasks, even uncommented ones",
344
+ lambda { |value|
345
+ options.show_all_tasks = value
346
+ }
347
+ ],
348
+ ['--backtrace=[OUT]', "Enable full backtrace. OUT can be stderr (default) or stdout.",
349
+ lambda { |value|
350
+ options.backtrace = true
351
+ select_trace_output(options, 'backtrace', value)
352
+ }
353
+ ],
354
+ ['--comments', "Show commented tasks only",
355
+ lambda { |value|
356
+ options.show_all_tasks = !value
357
+ }
358
+ ],
359
+ ['--describe', '-D [PATTERN]', "Describe the tasks (matching optional PATTERN), then exit.",
360
+ lambda { |value|
361
+ select_tasks_to_show(options, :describe, value)
362
+ }
363
+ ],
364
+ ['--dry-run', '-n', "Do a dry run without executing actions.",
365
+ lambda { |value|
366
+ Rake.verbose(true)
367
+ Rake.nowrite(true)
368
+ options.dryrun = true
369
+ options.trace = true
370
+ }
371
+ ],
372
+ ['--execute', '-e CODE', "Execute some Ruby code and exit.",
373
+ lambda { |value|
374
+ eval(value)
375
+ exit
376
+ }
377
+ ],
378
+ ['--execute-print', '-p CODE', "Execute some Ruby code, print the result, then exit.",
379
+ lambda { |value|
380
+ puts eval(value)
381
+ exit
382
+ }
383
+ ],
384
+ ['--execute-continue', '-E CODE',
385
+ "Execute some Ruby code, then continue with normal task processing.",
386
+ lambda { |value| eval(value) }
387
+ ],
388
+ ['--jobs', '-j [NUMBER]',
389
+ "Specifies the maximum number of tasks to execute in parallel. (default:2)",
390
+ lambda { |value| options.thread_pool_size = [(value || 2).to_i,2].max }
391
+ ],
392
+ ['--job-stats [LEVEL]',
393
+ "Display job statistics. LEVEL=history displays a complete job list",
394
+ lambda { |value|
395
+ if value =~ /^history/i
396
+ options.job_stats = :history
397
+ else
398
+ options.job_stats = true
399
+ end
400
+ }
401
+ ],
402
+ ['--libdir', '-I LIBDIR', "Include LIBDIR in the search path for required modules.",
403
+ lambda { |value| $:.push(value) }
404
+ ],
405
+ ['--multitask', '-m', "Treat all tasks as multitasks.",
406
+ lambda { |value| options.always_multitask = true }
407
+ ],
408
+ ['--no-search', '--nosearch', '-N', "Do not search parent directories for the Rakefile.",
409
+ lambda { |value| options.nosearch = true }
410
+ ],
411
+ ['--prereqs', '-P', "Display the tasks and dependencies, then exit.",
412
+ lambda { |value| options.show_prereqs = true }
413
+ ],
414
+ ['--quiet', '-q', "Do not log messages to standard output.",
415
+ lambda { |value| Rake.verbose(false) }
416
+ ],
417
+ ['--rakefile', '-f [FILE]', "Use FILE as the rakefile.",
418
+ lambda { |value|
419
+ value ||= ''
420
+ @rakefiles.clear
421
+ @rakefiles << value
422
+ }
423
+ ],
424
+ ['--rakelibdir', '--rakelib', '-R RAKELIBDIR',
425
+ "Auto-import any .rake files in RAKELIBDIR. (default is 'rakelib')",
426
+ lambda { |value| options.rakelib = value.split(File::PATH_SEPARATOR) }
427
+ ],
428
+ ['--require', '-r MODULE', "Require MODULE before executing rakefile.",
429
+ lambda { |value|
430
+ begin
431
+ require value
432
+ rescue LoadError => ex
433
+ begin
434
+ rake_require value
435
+ rescue LoadError
436
+ raise ex
437
+ end
438
+ end
439
+ }
440
+ ],
441
+ ['--rules', "Trace the rules resolution.",
442
+ lambda { |value| options.trace_rules = true }
443
+ ],
444
+ ['--silent', '-s', "Like --quiet, but also suppresses the 'in directory' announcement.",
445
+ lambda { |value|
446
+ Rake.verbose(false)
447
+ options.silent = true
448
+ }
449
+ ],
450
+ ['--suppress-backtrace PATTERN', "Suppress backtrace lines matching regexp PATTERN. Ignored if --trace is on.",
451
+ lambda { |value|
452
+ options.suppress_backtrace_pattern = Regexp.new(value)
453
+ }
454
+ ],
455
+ ['--system', '-g',
456
+ "Using system wide (global) rakefiles (usually '~/.rake/*.rake').",
457
+ lambda { |value| options.load_system = true }
458
+ ],
459
+ ['--no-system', '--nosystem', '-G',
460
+ "Use standard project Rakefile search paths, ignore system wide rakefiles.",
461
+ lambda { |value| options.ignore_system = true }
462
+ ],
463
+ ['--tasks', '-T [PATTERN]', "Display the tasks (matching optional PATTERN) with descriptions, then exit.",
464
+ lambda { |value|
465
+ select_tasks_to_show(options, :tasks, value)
466
+ }
467
+ ],
468
+ ['--trace=[OUT]', '-t', "Turn on invoke/execute tracing, enable full backtrace. OUT can be stderr (default) or stdout.",
469
+ lambda { |value|
470
+ options.trace = true
471
+ options.backtrace = true
472
+ select_trace_output(options, 'trace', value)
473
+ Rake.verbose(true)
474
+ }
475
+ ],
476
+ ['--verbose', '-v', "Log message to standard output.",
477
+ lambda { |value| Rake.verbose(true) }
478
+ ],
479
+ ['--version', '-V', "Display the program version.",
480
+ lambda { |value|
481
+ puts "rake, version #{RAKEVERSION}"
482
+ exit
483
+ }
484
+ ],
485
+ ['--where', '-W [PATTERN]', "Describe the tasks (matching optional PATTERN), then exit.",
486
+ lambda { |value|
487
+ select_tasks_to_show(options, :lines, value)
488
+ options.show_all_tasks = true
489
+ }
490
+ ],
491
+ ['--no-deprecation-warnings', '-X', "Disable the deprecation warnings.",
492
+ lambda { |value|
493
+ options.ignore_deprecate = true
494
+ }
495
+ ],
496
+ ])
497
+ end
498
+
499
+ def select_tasks_to_show(options, show_tasks, value)
500
+ options.show_tasks = show_tasks
501
+ options.show_task_pattern = Regexp.new(value || '')
502
+ Rake::TaskManager.record_task_metadata = true
503
+ end
504
+ private :select_tasks_to_show
505
+
506
+ def select_trace_output(options, trace_option, value)
507
+ value = value.strip unless value.nil?
508
+ case value
509
+ when 'stdout'
510
+ options.trace_output = $stdout
511
+ when 'stderr', nil
512
+ options.trace_output = $stderr
513
+ else
514
+ fail CommandLineOptionError, "Unrecognized --#{trace_option} option '#{value}'"
515
+ end
516
+ end
517
+ private :select_trace_output
518
+
519
+ # Read and handle the command line options.
520
+ def handle_options
521
+ options.rakelib = ['rakelib']
522
+ options.trace_output = $stderr
523
+
524
+ OptionParser.new do |opts|
525
+ opts.banner = "rake [-f rakefile] {options} targets..."
526
+ opts.separator ""
527
+ opts.separator "Options are ..."
528
+
529
+ opts.on_tail("-h", "--help", "-H", "Display this help message.") do
530
+ puts opts
531
+ exit
532
+ end
533
+
534
+ standard_rake_options.each { |args| opts.on(*args) }
535
+ opts.environment('RAKEOPT')
536
+ end.parse!
537
+ end
538
+
539
+ # Similar to the regular Ruby +require+ command, but will check
540
+ # for *.rake files in addition to *.rb files.
541
+ def rake_require(file_name, paths=$LOAD_PATH, loaded=$")
542
+ fn = file_name + ".rake"
543
+ return false if loaded.include?(fn)
544
+ paths.each do |path|
545
+ full_path = File.join(path, fn)
546
+ if File.exist?(full_path)
547
+ Rake.load_rakefile(full_path)
548
+ loaded << fn
549
+ return true
550
+ end
551
+ end
552
+ fail LoadError, "Can't find #{file_name}"
553
+ end
554
+
555
+ def find_rakefile_location
556
+ here = Dir.pwd
557
+ while ! (fn = have_rakefile)
558
+ Dir.chdir("..")
559
+ if Dir.pwd == here || options.nosearch
560
+ return nil
561
+ end
562
+ here = Dir.pwd
563
+ end
564
+ [fn, here]
565
+ ensure
566
+ Dir.chdir(Rake.original_dir)
567
+ end
568
+
569
+ def print_rakefile_directory(location)
570
+ $stderr.puts "(in #{Dir.pwd})" unless
571
+ options.silent or original_dir == location
572
+ end
573
+
574
+ def raw_load_rakefile # :nodoc:
575
+ rakefile, location = find_rakefile_location
576
+ if (! options.ignore_system) &&
577
+ (options.load_system || rakefile.nil?) &&
578
+ system_dir && File.directory?(system_dir)
579
+ print_rakefile_directory(location)
580
+ glob("#{system_dir}/*.rake") do |name|
581
+ add_import name
582
+ end
583
+ else
584
+ fail "No Rakefile found (looking for: #{@rakefiles.join(', ')})" if
585
+ rakefile.nil?
586
+ @rakefile = rakefile
587
+ Dir.chdir(location)
588
+ print_rakefile_directory(location)
589
+ Rake.load_rakefile(File.expand_path(@rakefile)) if @rakefile && @rakefile != ''
590
+ options.rakelib.each do |rlib|
591
+ glob("#{rlib}/*.rake") do |name|
592
+ add_import name
593
+ end
594
+ end
595
+ end
596
+ load_imports
597
+ end
598
+
599
+ def glob(path, &block)
600
+ FileList.glob(path.gsub("\\", '/')).each(&block)
601
+ end
602
+ private :glob
603
+
604
+ # The directory path containing the system wide rakefiles.
605
+ def system_dir
606
+ @system_dir ||=
607
+ begin
608
+ if ENV['RAKE_SYSTEM']
609
+ ENV['RAKE_SYSTEM']
610
+ else
611
+ standard_system_dir
612
+ end
613
+ end
614
+ end
615
+
616
+ # The standard directory containing system wide rake files.
617
+ if Win32.windows?
618
+ def standard_system_dir #:nodoc:
619
+ Win32.win32_system_dir
620
+ end
621
+ else
622
+ def standard_system_dir #:nodoc:
623
+ File.join(File.expand_path('~'), '.rake')
624
+ end
625
+ end
626
+ private :standard_system_dir
627
+
628
+ # Collect the list of tasks on the command line. If no tasks are
629
+ # given, return a list containing only the default task.
630
+ # Environmental assignments are processed at this time as well.
631
+ def collect_tasks
632
+ @top_level_tasks = []
633
+ ARGV.each do |arg|
634
+ if arg =~ /^(\w+)=(.*)$/m
635
+ ENV[$1] = $2
636
+ else
637
+ @top_level_tasks << arg unless arg =~ /^-/
638
+ end
639
+ end
640
+ @top_level_tasks.push(default_task_name) if @top_level_tasks.empty?
641
+ end
642
+
643
+ # Default task name ("default").
644
+ # (May be overridden by subclasses)
645
+ def default_task_name
646
+ "default"
647
+ end
648
+
649
+ # Add a file to the list of files to be imported.
650
+ def add_import(fn)
651
+ @pending_imports << fn
652
+ end
653
+
654
+ # Load the pending list of imported files.
655
+ def load_imports
656
+ while fn = @pending_imports.shift
657
+ next if @imported.member?(fn)
658
+ if fn_task = lookup(fn)
659
+ fn_task.invoke
660
+ end
661
+ ext = File.extname(fn)
662
+ loader = @loaders[ext] || @default_loader
663
+ loader.load(fn)
664
+ @imported << fn
665
+ end
666
+ end
667
+
668
+ def rakefile_location(backtrace=caller)
669
+ backtrace.map { |t| t[/([^:]+):/,1] }
670
+
671
+ re = /^#{@rakefile}$/
672
+ re = /#{re.source}/i if windows?
673
+
674
+ backtrace.find { |str| str =~ re } || ''
675
+ end
676
+
677
+ private
678
+ FIXNUM_MAX = (2**(0.size * 8 - 2) - 1) # :nodoc:
679
+
680
+ end
681
+ end