craigmarksmith-rake 0.8.3.100

Sign up to get free protection for your applications and to get access to all the features.
Files changed (104) hide show
  1. data/CHANGES +427 -0
  2. data/MIT-LICENSE +21 -0
  3. data/README +196 -0
  4. data/Rakefile +416 -0
  5. data/TODO +20 -0
  6. data/bin/rake +31 -0
  7. data/doc/command_line_usage.rdoc +102 -0
  8. data/doc/example/Rakefile1 +38 -0
  9. data/doc/example/Rakefile2 +35 -0
  10. data/doc/example/a.c +6 -0
  11. data/doc/example/b.c +6 -0
  12. data/doc/example/main.c +11 -0
  13. data/doc/glossary.rdoc +51 -0
  14. data/doc/jamis.rb +591 -0
  15. data/doc/proto_rake.rdoc +127 -0
  16. data/doc/rake.1.gz +0 -0
  17. data/doc/rakefile.rdoc +534 -0
  18. data/doc/rational.rdoc +151 -0
  19. data/doc/release_notes/rake-0.4.14.rdoc +23 -0
  20. data/doc/release_notes/rake-0.4.15.rdoc +35 -0
  21. data/doc/release_notes/rake-0.5.0.rdoc +53 -0
  22. data/doc/release_notes/rake-0.5.3.rdoc +78 -0
  23. data/doc/release_notes/rake-0.5.4.rdoc +46 -0
  24. data/doc/release_notes/rake-0.6.0.rdoc +141 -0
  25. data/doc/release_notes/rake-0.7.0.rdoc +119 -0
  26. data/doc/release_notes/rake-0.7.1.rdoc +59 -0
  27. data/doc/release_notes/rake-0.7.2.rdoc +121 -0
  28. data/doc/release_notes/rake-0.7.3.rdoc +47 -0
  29. data/doc/release_notes/rake-0.8.0.rdoc +114 -0
  30. data/doc/release_notes/rake-0.8.2.rdoc +165 -0
  31. data/doc/release_notes/rake-0.8.3.rdoc +112 -0
  32. data/doc/release_notes/rake-0.8.4.rdoc +147 -0
  33. data/install.rb +88 -0
  34. data/lib/rake/classic_namespace.rb +8 -0
  35. data/lib/rake/clean.rb +33 -0
  36. data/lib/rake/contrib/compositepublisher.rb +24 -0
  37. data/lib/rake/contrib/ftptools.rb +153 -0
  38. data/lib/rake/contrib/publisher.rb +75 -0
  39. data/lib/rake/contrib/rubyforgepublisher.rb +18 -0
  40. data/lib/rake/contrib/sshpublisher.rb +47 -0
  41. data/lib/rake/contrib/sys.rb +209 -0
  42. data/lib/rake/gempackagetask.rb +97 -0
  43. data/lib/rake/loaders/makefile.rb +42 -0
  44. data/lib/rake/packagetask.rb +184 -0
  45. data/lib/rake/rake_test_loader.rb +5 -0
  46. data/lib/rake/rdoctask.rb +209 -0
  47. data/lib/rake/ruby182_test_unit_fix.rb +23 -0
  48. data/lib/rake/runtest.rb +23 -0
  49. data/lib/rake/tasklib.rb +23 -0
  50. data/lib/rake/testtask.rb +161 -0
  51. data/lib/rake/win32.rb +55 -0
  52. data/lib/rake.rb +2519 -0
  53. data/test/capture_stdout.rb +26 -0
  54. data/test/check_expansion.rb +5 -0
  55. data/test/contrib/test_sys.rb +47 -0
  56. data/test/data/chains/Rakefile +15 -0
  57. data/test/data/default/Rakefile +19 -0
  58. data/test/data/dryrun/Rakefile +22 -0
  59. data/test/data/file_creation_task/Rakefile +33 -0
  60. data/test/data/imports/Rakefile +19 -0
  61. data/test/data/imports/deps.mf +1 -0
  62. data/test/data/multidesc/Rakefile +17 -0
  63. data/test/data/namespace/Rakefile +57 -0
  64. data/test/data/rakelib/test1.rb +3 -0
  65. data/test/data/rbext/rakefile.rb +3 -0
  66. data/test/data/sample.mf +14 -0
  67. data/test/data/statusreturn/Rakefile +8 -0
  68. data/test/data/unittest/Rakefile +1 -0
  69. data/test/filecreation.rb +32 -0
  70. data/test/functional.rb +15 -0
  71. data/test/in_environment.rb +30 -0
  72. data/test/rake_test_setup.rb +24 -0
  73. data/test/reqfile.rb +3 -0
  74. data/test/reqfile2.rb +3 -0
  75. data/test/session_functional.rb +339 -0
  76. data/test/shellcommand.rb +3 -0
  77. data/test/test_application.rb +690 -0
  78. data/test/test_clean.rb +14 -0
  79. data/test/test_definitions.rb +85 -0
  80. data/test/test_earlytime.rb +35 -0
  81. data/test/test_extension.rb +63 -0
  82. data/test/test_file_creation_task.rb +62 -0
  83. data/test/test_file_task.rb +143 -0
  84. data/test/test_filelist.rb +623 -0
  85. data/test/test_fileutils.rb +251 -0
  86. data/test/test_ftp.rb +59 -0
  87. data/test/test_invocation_chain.rb +81 -0
  88. data/test/test_makefile_loader.rb +26 -0
  89. data/test/test_multitask.rb +45 -0
  90. data/test/test_namespace.rb +55 -0
  91. data/test/test_package_task.rb +118 -0
  92. data/test/test_pathmap.rb +210 -0
  93. data/test/test_rake.rb +41 -0
  94. data/test/test_rdoc_task.rb +88 -0
  95. data/test/test_require.rb +35 -0
  96. data/test/test_rules.rb +349 -0
  97. data/test/test_task_arguments.rb +89 -0
  98. data/test/test_task_manager.rb +173 -0
  99. data/test/test_tasklib.rb +12 -0
  100. data/test/test_tasks.rb +374 -0
  101. data/test/test_test_task.rb +77 -0
  102. data/test/test_top_level_functions.rb +86 -0
  103. data/test/test_win32.rb +72 -0
  104. metadata +186 -0
@@ -0,0 +1,8 @@
1
+ # The following classes used to be in the top level namespace.
2
+ # Loading this file enables compatibility with older Rakefile that
3
+ # referenced Task from the top level.
4
+
5
+ Task = Rake::Task
6
+ FileTask = Rake::FileTask
7
+ FileCreationTask = Rake::FileCreationTask
8
+ RakeApp = Rake::Application
data/lib/rake/clean.rb ADDED
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # The 'rake/clean' file defines two file lists (CLEAN and CLOBBER) and
4
+ # two rake tasks (:clean and :clobber).
5
+ #
6
+ # [:clean] Clean up the project by deleting scratch files and backup
7
+ # files. Add files to the CLEAN file list to have the :clean
8
+ # target handle them.
9
+ #
10
+ # [:clobber] Clobber all generated and non-source files in a project.
11
+ # The task depends on :clean, so all the clean files will
12
+ # be deleted as well as files in the CLOBBER file list.
13
+ # The intent of this task is to return a project to its
14
+ # pristine, just unpacked state.
15
+
16
+ require 'rake'
17
+
18
+ CLEAN = Rake::FileList["**/*~", "**/*.bak", "**/core"]
19
+ CLEAN.clear_exclude.exclude { |fn|
20
+ fn.pathmap("%f") == 'core' && File.directory?(fn)
21
+ }
22
+
23
+ desc "Remove any temporary products."
24
+ task :clean do
25
+ CLEAN.each { |fn| rm_r fn rescue nil }
26
+ end
27
+
28
+ CLOBBER = Rake::FileList.new
29
+
30
+ desc "Remove any generated file."
31
+ task :clobber => [:clean] do
32
+ CLOBBER.each { |fn| rm_r fn rescue nil }
33
+ end
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ module Rake
4
+
5
+ # Manage several publishers as a single entity.
6
+ class CompositePublisher
7
+ def initialize
8
+ @publishers = []
9
+ end
10
+
11
+ # Add a publisher to the composite.
12
+ def add(pub)
13
+ @publishers << pub
14
+ end
15
+
16
+ # Upload all the individual publishers.
17
+ def upload
18
+ @publishers.each { |p| p.upload }
19
+ end
20
+ end
21
+
22
+ end
23
+
24
+
@@ -0,0 +1,153 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # = Tools for FTP uploading.
4
+ #
5
+ # This file is still under development and is not released for general
6
+ # use.
7
+
8
+ require 'date'
9
+ require 'net/ftp'
10
+
11
+ module Rake # :nodoc:
12
+
13
+ ####################################################################
14
+ # <b>Note:</b> <em> Not released for general use.</em>
15
+ class FtpFile
16
+ attr_reader :name, :size, :owner, :group, :time
17
+
18
+ def self.date
19
+ @date_class ||= Date
20
+ end
21
+
22
+ def self.time
23
+ @time_class ||= Time
24
+ end
25
+
26
+ def initialize(path, entry)
27
+ @path = path
28
+ @mode, line, @owner, @group, size, d1, d2, d3, @name = entry.split(' ')
29
+ @size = size.to_i
30
+ @time = determine_time(d1, d2, d3)
31
+ end
32
+
33
+ def path
34
+ File.join(@path, @name)
35
+ end
36
+
37
+ def directory?
38
+ @mode[0] == ?d
39
+ end
40
+
41
+ def mode
42
+ parse_mode(@mode)
43
+ end
44
+
45
+ def symlink?
46
+ @mode[0] == ?l
47
+ end
48
+
49
+ private # --------------------------------------------------------
50
+
51
+ def parse_mode(m)
52
+ result = 0
53
+ (1..9).each do |i|
54
+ result = 2*result + ((m[i]==?-) ? 0 : 1)
55
+ end
56
+ result
57
+ end
58
+
59
+ def determine_time(d1, d2, d3)
60
+ now = self.class.time.now
61
+ if /:/ =~ d3
62
+ h, m = d3.split(':')
63
+ result = Time.parse("#{d1} #{d2} #{now.year} #{d3}")
64
+ if result > now
65
+ result = Time.parse("#{d1} #{d2} #{now.year-1} #{d3}")
66
+ end
67
+ else
68
+ result = Time.parse("#{d1} #{d2} #{d3}")
69
+ end
70
+ result
71
+ # elements = ParseDate.parsedate("#{d1} #{d2} #{d3}")
72
+ # if elements[0].nil?
73
+ # today = self.class.date.today
74
+ # if elements[1] > today.month
75
+ # elements[0] = today.year - 1
76
+ # else
77
+ # elements[0] = today.year
78
+ # end
79
+ # end
80
+ # elements = elements.collect { |el| el.nil? ? 0 : el }
81
+ # Time.mktime(*elements[0,7])
82
+ end
83
+ end
84
+
85
+ ####################################################################
86
+ # Manage the uploading of files to an FTP account.
87
+ class FtpUploader
88
+
89
+ # Log uploads to standard output when true.
90
+ attr_accessor :verbose
91
+
92
+ class << FtpUploader
93
+ # Create an uploader and pass it to the given block as +up+.
94
+ # When the block is complete, close the uploader.
95
+ def connect(path, host, account, password)
96
+ up = self.new(path, host, account, password)
97
+ begin
98
+ yield(up)
99
+ ensure
100
+ up.close
101
+ end
102
+ end
103
+ end
104
+
105
+ # Create an FTP uploader targetting the directory +path+ on +host+
106
+ # using the given account and password. +path+ will be the root
107
+ # path of the uploader.
108
+ def initialize(path, host, account, password)
109
+ @created = Hash.new
110
+ @path = path
111
+ @ftp = Net::FTP.new(host, account, password)
112
+ makedirs(@path)
113
+ @ftp.chdir(@path)
114
+ end
115
+
116
+ # Create the directory +path+ in the uploader root path.
117
+ def makedirs(path)
118
+ route = []
119
+ File.split(path).each do |dir|
120
+ route << dir
121
+ current_dir = File.join(route)
122
+ if @created[current_dir].nil?
123
+ @created[current_dir] = true
124
+ puts "Creating Directory #{current_dir}" if @verbose
125
+ @ftp.mkdir(current_dir) rescue nil
126
+ end
127
+ end
128
+ end
129
+
130
+ # Upload all files matching +wildcard+ to the uploader's root
131
+ # path.
132
+ def upload_files(wildcard)
133
+ Dir[wildcard].each do |fn|
134
+ upload(fn)
135
+ end
136
+ end
137
+
138
+ # Close the uploader.
139
+ def close
140
+ @ftp.close
141
+ end
142
+
143
+ private # --------------------------------------------------------
144
+
145
+ # Upload a single file to the uploader's root path.
146
+ def upload(file)
147
+ puts "Uploading #{file}" if @verbose
148
+ dir = File.dirname(file)
149
+ makedirs(dir)
150
+ @ftp.putbinaryfile(file, file) unless File.directory?(file)
151
+ end
152
+ end
153
+ end
@@ -0,0 +1,75 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # Copyright 2003, 2004, 2005, 2006, 2007, 2008 by Jim Weirich (jim@weirichhouse.org)
4
+ # All rights reserved.
5
+
6
+ # Permission is granted for use, copying, modification, distribution,
7
+ # and distribution of modified versions of this work as long as the
8
+ # above copyright notice is included.
9
+
10
+ # Configuration information about an upload host system.
11
+ # * name :: Name of host system.
12
+ # * webdir :: Base directory for the web information for the
13
+ # application. The application name (APP) is appended to
14
+ # this directory before using.
15
+ # * pkgdir :: Directory on the host system where packages can be
16
+ # placed.
17
+ HostInfo = Struct.new(:name, :webdir, :pkgdir)
18
+
19
+ # Manage several publishers as a single entity.
20
+ class CompositePublisher
21
+ def initialize
22
+ @publishers = []
23
+ end
24
+
25
+ # Add a publisher to the composite.
26
+ def add(pub)
27
+ @publishers << pub
28
+ end
29
+
30
+ # Upload all the individual publishers.
31
+ def upload
32
+ @publishers.each { |p| p.upload }
33
+ end
34
+ end
35
+
36
+ # Publish an entire directory to an existing remote directory using
37
+ # SSH.
38
+ class SshDirPublisher
39
+ def initialize(host, remote_dir, local_dir)
40
+ @host = host
41
+ @remote_dir = remote_dir
42
+ @local_dir = local_dir
43
+ end
44
+
45
+ def upload
46
+ run %{scp -rq #{@local_dir}/* #{@host}:#{@remote_dir}}
47
+ end
48
+ end
49
+
50
+ # Publish an entire directory to a fresh remote directory using SSH.
51
+ class SshFreshDirPublisher < SshDirPublisher
52
+ def upload
53
+ run %{ssh #{@host} rm -rf #{@remote_dir}} rescue nil
54
+ run %{ssh #{@host} mkdir #{@remote_dir}}
55
+ super
56
+ end
57
+ end
58
+
59
+ # Publish a list of files to an existing remote directory.
60
+ class SshFilePublisher
61
+ # Create a publisher using the give host information.
62
+ def initialize(host, remote_dir, local_dir, *files)
63
+ @host = host
64
+ @remote_dir = remote_dir
65
+ @local_dir = local_dir
66
+ @files = files
67
+ end
68
+
69
+ # Upload the local directory to the remote directory.
70
+ def upload
71
+ @files.each do |fn|
72
+ run %{scp -q #{@local_dir}/#{fn} #{@host}:#{@remote_dir}}
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rake/contrib/sshpublisher'
4
+
5
+ module Rake
6
+
7
+ class RubyForgePublisher < SshDirPublisher
8
+ attr_reader :project, :proj_id, :user
9
+
10
+ def initialize(projname, user)
11
+ super(
12
+ "#{user}@rubyforge.org",
13
+ "/var/www/gforge-projects/#{projname}",
14
+ "html")
15
+ end
16
+ end
17
+
18
+ end
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rake/contrib/compositepublisher'
4
+
5
+ module Rake
6
+
7
+ # Publish an entire directory to an existing remote directory using
8
+ # SSH.
9
+ class SshDirPublisher
10
+ def initialize(host, remote_dir, local_dir)
11
+ @host = host
12
+ @remote_dir = remote_dir
13
+ @local_dir = local_dir
14
+ end
15
+
16
+ def upload
17
+ sh %{scp -rq #{@local_dir}/* #{@host}:#{@remote_dir}}
18
+ end
19
+ end
20
+
21
+ # Publish an entire directory to a fresh remote directory using SSH.
22
+ class SshFreshDirPublisher < SshDirPublisher
23
+ def upload
24
+ sh %{ssh #{@host} rm -rf #{@remote_dir}} rescue nil
25
+ sh %{ssh #{@host} mkdir #{@remote_dir}}
26
+ super
27
+ end
28
+ end
29
+
30
+ # Publish a list of files to an existing remote directory.
31
+ class SshFilePublisher
32
+ # Create a publisher using the give host information.
33
+ def initialize(host, remote_dir, local_dir, *files)
34
+ @host = host
35
+ @remote_dir = remote_dir
36
+ @local_dir = local_dir
37
+ @files = files
38
+ end
39
+
40
+ # Upload the local directory to the remote directory.
41
+ def upload
42
+ @files.each do |fn|
43
+ sh %{scp -q #{@local_dir}/#{fn} #{@host}:#{@remote_dir}}
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,209 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ #--
4
+ # Copyright 2003, 2004, 2005, 2006, 2007, 2008 by Jim Weirich (jim@weirichhouse.org)
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining
7
+ # a copy of this software and associated documentation files (the
8
+ # "Software"), to deal in the Software without restriction, including
9
+ # without limitation the rights to use, copy, modify, merge, publish,
10
+ # distribute, sublicense, and/or sell copies of the Software, and to
11
+ # permit persons to whom the Software is furnished to do so, subject to
12
+ # the following conditions:
13
+ #
14
+ # The above copyright notice and this permission notice shall be
15
+ # included in all copies or substantial portions of the Software.
16
+ #
17
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
+ #++
25
+ #
26
+ begin
27
+ require 'ftools'
28
+ rescue LoadError
29
+ end
30
+ require 'rbconfig'
31
+
32
+ ######################################################################
33
+ # Sys provides a number of file manipulation tools for the convenience
34
+ # of writing Rakefiles. All commands in this module will announce
35
+ # their activity on standard output if the $verbose flag is set
36
+ # ($verbose = true is the default). You can control this by globally
37
+ # setting $verbose or by using the +verbose+ and +quiet+ methods.
38
+ #
39
+ # Sys has been deprecated in favor of the FileUtils module available
40
+ # in Ruby 1.8.
41
+ #
42
+ module Sys
43
+ RUBY = Config::CONFIG['ruby_install_name']
44
+
45
+ # Install all the files matching +wildcard+ into the +dest_dir+
46
+ # directory. The permission mode is set to +mode+.
47
+ def install(wildcard, dest_dir, mode)
48
+ Dir[wildcard].each do |fn|
49
+ File.install(fn, dest_dir, mode, $verbose)
50
+ end
51
+ end
52
+
53
+ # Run the system command +cmd+.
54
+ def run(cmd)
55
+ log cmd
56
+ system(cmd) or fail "Command Failed: [#{cmd}]"
57
+ end
58
+
59
+ # Run a Ruby interpreter with the given arguments.
60
+ def ruby(*args)
61
+ run "#{RUBY} #{args.join(' ')}"
62
+ end
63
+
64
+ # Copy a single file from +file_name+ to +dest_file+.
65
+ def copy(file_name, dest_file)
66
+ log "Copying file #{file_name} to #{dest_file}"
67
+ File.copy(file_name, dest_file)
68
+ end
69
+
70
+ # Copy all files matching +wildcard+ into the directory +dest_dir+.
71
+ def copy_files(wildcard, dest_dir)
72
+ for_matching_files(wildcard, dest_dir) { |from, to| copy(from, to) }
73
+ end
74
+
75
+ # Link +file_name+ to +dest_file+.
76
+ def link(file_name, dest_file)
77
+ log "Linking file #{file_name} to #{dest_file}"
78
+ File.link(file_name, dest_file)
79
+ end
80
+
81
+ # Link all files matching +wildcard+ into the directory +dest_dir+.
82
+ def link_files(wildcard, dest_dir)
83
+ for_matching_files(wildcard, dest_dir) { |from, to| link(from, to) }
84
+ end
85
+
86
+ # Symlink +file_name+ to +dest_file+.
87
+ def symlink(file_name, dest_file)
88
+ log "Symlinking file #{file_name} to #{dest_file}"
89
+ File.symlink(file_name, dest_file)
90
+ end
91
+
92
+ # Symlink all files matching +wildcard+ into the directory +dest_dir+.
93
+ def symlink_files(wildcard, dest_dir)
94
+ for_matching_files(wildcard, dest_dir) { |from, to| link(from, to) }
95
+ end
96
+
97
+ # Remove all files matching +wildcard+. If a matching file is a
98
+ # directory, it must be empty to be removed. used +delete_all+ to
99
+ # recursively delete directories.
100
+ def delete(*wildcards)
101
+ wildcards.each do |wildcard|
102
+ Dir[wildcard].each do |fn|
103
+ if File.directory?(fn)
104
+ log "Deleting directory #{fn}"
105
+ Dir.delete(fn)
106
+ else
107
+ log "Deleting file #{fn}"
108
+ File.delete(fn)
109
+ end
110
+ end
111
+ end
112
+ end
113
+
114
+ # Recursively delete all files and directories matching +wildcard+.
115
+ def delete_all(*wildcards)
116
+ wildcards.each do |wildcard|
117
+ Dir[wildcard].each do |fn|
118
+ next if ! File.exist?(fn)
119
+ if File.directory?(fn)
120
+ Dir["#{fn}/*"].each do |subfn|
121
+ next if subfn=='.' || subfn=='..'
122
+ delete_all(subfn)
123
+ end
124
+ log "Deleting directory #{fn}"
125
+ Dir.delete(fn)
126
+ else
127
+ log "Deleting file #{fn}"
128
+ File.delete(fn)
129
+ end
130
+ end
131
+ end
132
+ end
133
+
134
+ # Make the directories given in +dirs+.
135
+ def makedirs(*dirs)
136
+ dirs.each do |fn|
137
+ log "Making directory #{fn}"
138
+ File.makedirs(fn)
139
+ end
140
+ end
141
+
142
+ # Make +dir+ the current working directory for the duration of
143
+ # executing the given block.
144
+ def indir(dir)
145
+ olddir = Dir.pwd
146
+ Dir.chdir(dir)
147
+ yield
148
+ ensure
149
+ Dir.chdir(olddir)
150
+ end
151
+
152
+ # Split a file path into individual directory names.
153
+ #
154
+ # For example:
155
+ # split_all("a/b/c") => ['a', 'b', 'c']
156
+ def split_all(path)
157
+ head, tail = File.split(path)
158
+ return [tail] if head == '.' || tail == '/'
159
+ return [head, tail] if head == '/'
160
+ return split_all(head) + [tail]
161
+ end
162
+
163
+ # Write a message to standard out if $verbose is enabled.
164
+ def log(msg)
165
+ print " " if $trace && $verbose
166
+ puts msg if $verbose
167
+ end
168
+
169
+ # Perform a block with $verbose disabled.
170
+ def quiet(&block)
171
+ with_verbose(false, &block)
172
+ end
173
+
174
+ # Perform a block with $verbose enabled.
175
+ def verbose(&block)
176
+ with_verbose(true, &block)
177
+ end
178
+
179
+ # Perform a block with each file matching a set of wildcards.
180
+ def for_files(*wildcards)
181
+ wildcards.each do |wildcard|
182
+ Dir[wildcard].each do |fn|
183
+ yield(fn)
184
+ end
185
+ end
186
+ end
187
+
188
+ extend(self)
189
+
190
+ private # ----------------------------------------------------------
191
+
192
+ def for_matching_files(wildcard, dest_dir)
193
+ Dir[wildcard].each do |fn|
194
+ dest_file = File.join(dest_dir, fn)
195
+ parent = File.dirname(dest_file)
196
+ makedirs(parent) if ! File.directory?(parent)
197
+ yield(fn, dest_file)
198
+ end
199
+ end
200
+
201
+ def with_verbose(v)
202
+ oldverbose = $verbose
203
+ $verbose = v
204
+ yield
205
+ ensure
206
+ $verbose = oldverbose
207
+ end
208
+
209
+ end