ratch 0.4.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/COPYING +17 -669
- data/HISTORY +6 -0
- data/MANIFEST +36 -0
- data/METADATA +14 -0
- data/NEWS +7 -0
- data/README +67 -17
- data/bin/ratch +5 -78
- data/demo/tryme-task.ratch +12 -0
- data/demo/tryme1.ratch +6 -0
- data/lib/ratch/core_ext.rb +6 -0
- data/lib/ratch/core_ext/facets.rb +1 -0
- data/lib/ratch/core_ext/filetest.rb +52 -0
- data/lib/ratch/core_ext/object.rb +8 -0
- data/lib/ratch/core_ext/pathname.rb +38 -0
- data/lib/ratch/core_ext/string.rb +44 -0
- data/lib/ratch/{dsl/console.rb → core_ext/to_console.rb} +2 -76
- data/lib/ratch/core_ext/to_list.rb +29 -0
- data/lib/ratch/dsl.rb +494 -49
- data/lib/ratch/index.rb +4 -0
- data/lib/ratch/io.rb +116 -0
- data/lib/ratch/pathglob.rb +73 -0
- data/lib/ratch/plugin.rb +55 -0
- data/lib/ratch/runmode.rb +69 -0
- data/lib/ratch/script.rb +52 -0
- data/lib/ratch/service.rb +33 -0
- data/lib/ratch/task.rb +249 -0
- data/lib/ratch/task2.rb +298 -0
- data/test/README +1 -0
- data/test/test_helper.rb +4 -0
- data/test/test_task.rb +46 -0
- metadata +90 -150
- data/CHANGES +0 -22
- data/TODO +0 -2
- data/bin/lt +0 -56
- data/bin/ludo +0 -14
- data/bin/manifest +0 -451
- data/bin/ratch-find +0 -21
- data/demo/WILMA +0 -1
- data/demo/XR +0 -9
- data/demo/lib/foo/foo.rb +0 -7
- data/demo/p.rb +0 -9
- data/demo/r.rb +0 -6
- data/demo/t.rb +0 -3
- data/demo/task/config.yaml +0 -4
- data/demo/task/one +0 -6
- data/demo/task/simplebuild +0 -15
- data/demo/task/stats +0 -4
- data/demo/task/task +0 -6
- data/demo/task/tryme +0 -10
- data/lib/ratch/dsl/argv.rb +0 -112
- data/lib/ratch/dsl/batch.rb +0 -232
- data/lib/ratch/dsl/build.rb +0 -174
- data/lib/ratch/dsl/email.rb +0 -108
- data/lib/ratch/dsl/file.rb +0 -205
- data/lib/ratch/dsl/meta.rb +0 -125
- data/lib/ratch/dsl/options.rb +0 -98
- data/lib/ratch/dsl/setup.rb +0 -124
- data/lib/ratch/dsl/sign.rb +0 -243
- data/lib/ratch/dsl/stage.rb +0 -147
- data/lib/ratch/dsl/task.rb +0 -139
- data/lib/ratch/dsl/upload.rb +0 -436
- data/lib/ratch/dsl/zip.rb +0 -59
- data/lib/ratch/extra/email.rb +0 -5
- data/lib/ratch/extra/stage.rb +0 -5
- data/lib/ratch/extra/zip.rb +0 -5
- data/lib/ratch/manager.rb +0 -53
- data/lib/ratch/manifest.rb +0 -540
- data/lib/ratch/metadata/information.rb +0 -258
- data/lib/ratch/metadata/package.rb +0 -108
- data/lib/ratch/metadata/project.rb +0 -523
- data/lib/ratch/metadata/release.rb +0 -108
- data/lib/ratch/support/errors.rb +0 -4
- data/lib/ratch/support/filename.rb +0 -18
- data/lib/ratch/support/filetest.rb +0 -29
- data/lib/ratch/toolset/ruby/announce +0 -224
- data/lib/ratch/toolset/ruby/compile +0 -49
- data/lib/ratch/toolset/ruby/install +0 -77
- data/lib/ratch/toolset/ruby/notes +0 -185
- data/lib/ratch/toolset/ruby/pack/gem +0 -93
- data/lib/ratch/toolset/ruby/pack/tgz +0 -46
- data/lib/ratch/toolset/ruby/pack/zip +0 -46
- data/lib/ratch/toolset/ruby/publish +0 -57
- data/lib/ratch/toolset/ruby/release +0 -8
- data/lib/ratch/toolset/ruby/setup +0 -1616
- data/lib/ratch/toolset/ruby/stamp +0 -33
- data/lib/ratch/toolset/ruby/stats +0 -138
- data/lib/ratch/toolset/ruby/test/crosstest +0 -305
- data/lib/ratch/toolset/ruby/test/extest +0 -129
- data/lib/ratch/toolset/ruby/test/isotest +0 -293
- data/lib/ratch/toolset/ruby/test/load +0 -39
- data/lib/ratch/toolset/ruby/test/loadtest +0 -28
- data/lib/ratch/toolset/ruby/test/syntax +0 -29
- data/lib/ratch/toolset/ruby/test/test +0 -26
- data/lib/ratch/toolset/sandbox/query +0 -11
- data/man/ratch.man +0 -73
- data/meta/MANIFEST +0 -130
- data/meta/config.yaml +0 -9
- data/meta/icli.yaml +0 -16
- data/meta/project.yaml +0 -20
- data/meta/ratch.roll +0 -2
- data/meta/xProjectInfo +0 -41
- data/task/clobber/package +0 -10
- data/task/man +0 -14
- data/task/publish +0 -57
- data/task/release +0 -9
- data/task/setup +0 -1616
- data/task/stats +0 -138
data/lib/ratch/dsl/build.rb
DELETED
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
# = TITLE:
|
|
2
|
-
#
|
|
3
|
-
# Build DSL
|
|
4
|
-
#
|
|
5
|
-
# = COPYING:
|
|
6
|
-
#
|
|
7
|
-
# Copyright (c) 2007 Psi T Corp.
|
|
8
|
-
#
|
|
9
|
-
# This file is part of the ProUtils' Ratch program.
|
|
10
|
-
#
|
|
11
|
-
# Ratch is free software: you can redistribute it and/or modify
|
|
12
|
-
# it under the terms of the GNU General Public License as published by
|
|
13
|
-
# the Free Software Foundation, either version 3 of the License, or
|
|
14
|
-
# (at your option) any later version.
|
|
15
|
-
#
|
|
16
|
-
# Ratch is distributed in the hope that it will be useful,
|
|
17
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
18
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
19
|
-
# GNU General Public License for more details.
|
|
20
|
-
#
|
|
21
|
-
# You should have received a copy of the GNU General Public License
|
|
22
|
-
# along with Ratch. If not, see <http://www.gnu.org/licenses/>.
|
|
23
|
-
|
|
24
|
-
module Ratch
|
|
25
|
-
module Dsl
|
|
26
|
-
|
|
27
|
-
module Builds
|
|
28
|
-
|
|
29
|
-
# Define a build target.
|
|
30
|
-
|
|
31
|
-
def file(name, &block)
|
|
32
|
-
name, deps, block = *parse_build_dependencies(name, &block)
|
|
33
|
-
define_file(name, *deps, &block)
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
# Build target(s).
|
|
37
|
-
|
|
38
|
-
def build(path)
|
|
39
|
-
# TODO How to handle more than one matching means of building?
|
|
40
|
-
#warn "More than one build definition matches #{path} using #{means.first}" if means.size > 1
|
|
41
|
-
if build = find_build(path)
|
|
42
|
-
if build.needed_for?(path) || force?
|
|
43
|
-
list, todo = *build_plan(build, path)
|
|
44
|
-
todo.each{|bld, pth| bld.call(pth) } #@builds[name].call }
|
|
45
|
-
build.call(path)
|
|
46
|
-
end
|
|
47
|
-
else
|
|
48
|
-
raise "build not found -- #{path}"
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
private
|
|
53
|
-
|
|
54
|
-
def builds; @builds ||= [] ; end
|
|
55
|
-
|
|
56
|
-
#
|
|
57
|
-
def parse_build_dependencies(name_deps, &block)
|
|
58
|
-
if Hash===name_deps
|
|
59
|
-
name = name_deps.keys[0]
|
|
60
|
-
deps = name_deps.values[0]
|
|
61
|
-
else
|
|
62
|
-
name = name_deps
|
|
63
|
-
deps = []
|
|
64
|
-
end
|
|
65
|
-
[name, deps, block]
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
# Define a file build task.
|
|
69
|
-
|
|
70
|
-
def define_file(name, *depend, &block)
|
|
71
|
-
build = Build.new(name, *depend, &block)
|
|
72
|
-
builds << build
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
#
|
|
76
|
-
|
|
77
|
-
def find_build(path)
|
|
78
|
-
builds.find{ |b| b.match?(path) }
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
# Prepare build plan, checking for circular dependencies.
|
|
82
|
-
|
|
83
|
-
def build_plan(build, path, list=[], todo=[])
|
|
84
|
-
#if list.include?(build)
|
|
85
|
-
# raise "Circular build dependency #{build.name}."
|
|
86
|
-
#end
|
|
87
|
-
|
|
88
|
-
build.needed_paths.each do |npath|
|
|
89
|
-
next if list.include?(npath)
|
|
90
|
-
if nbuild = find_build(npath)
|
|
91
|
-
build_plan(nbuild, npath, list, todo)
|
|
92
|
-
todo << [nbuild, npath]
|
|
93
|
-
else
|
|
94
|
-
list << npath
|
|
95
|
-
end
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
return list, todo
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
# This class encapsulates the build procedure for creating
|
|
104
|
-
# a file (or directory).
|
|
105
|
-
|
|
106
|
-
class Build
|
|
107
|
-
|
|
108
|
-
attr :match
|
|
109
|
-
attr :needs
|
|
110
|
-
attr :action
|
|
111
|
-
|
|
112
|
-
alias_method :name, :match
|
|
113
|
-
|
|
114
|
-
# Create a new build definition.
|
|
115
|
-
|
|
116
|
-
def initialize(match, *needs, &action)
|
|
117
|
-
@match = match
|
|
118
|
-
@needs = needs
|
|
119
|
-
@action = action
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
# Call this build process for the given path.
|
|
123
|
-
|
|
124
|
-
def call(path)
|
|
125
|
-
if needs.empty?
|
|
126
|
-
dated = true
|
|
127
|
-
elsif File.exist?(path)
|
|
128
|
-
mtime = File.mtime(path)
|
|
129
|
-
dated = needs.find do |file|
|
|
130
|
-
!File.exist?(file) || File.mtime(file) > mtime
|
|
131
|
-
end
|
|
132
|
-
else
|
|
133
|
-
dated = true
|
|
134
|
-
end
|
|
135
|
-
action.call(path) if dated
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
# Does a file match this build definition?
|
|
139
|
-
|
|
140
|
-
def match?(path)
|
|
141
|
-
case match
|
|
142
|
-
when String
|
|
143
|
-
File.fnmatch(match, path)
|
|
144
|
-
when Regexp
|
|
145
|
-
match =~ path
|
|
146
|
-
else
|
|
147
|
-
false # ???
|
|
148
|
-
end
|
|
149
|
-
end
|
|
150
|
-
|
|
151
|
-
# Is this build needed to update/create path?
|
|
152
|
-
|
|
153
|
-
def needed_for?(path)
|
|
154
|
-
return true unless File.exist?(path)
|
|
155
|
-
return true if needed_paths.empty? # TODO: if there are no prereqs then the file is always considered needed. Correct?
|
|
156
|
-
mtimes = needed_paths.collect do |f|
|
|
157
|
-
File.exist?(f) ? File.mtime(f) : Time.now
|
|
158
|
-
end
|
|
159
|
-
mtimes.max > File.mtime(path)
|
|
160
|
-
end
|
|
161
|
-
|
|
162
|
-
# Glob expanded needs.
|
|
163
|
-
|
|
164
|
-
def needed_paths
|
|
165
|
-
#exact = needs.select{|n| File.fnmatch?(n,n)} +
|
|
166
|
-
exact = needs.select{|n| n !~ /[\[*?]/ }
|
|
167
|
-
globs = needs.collect{|n| Dir.glob(n)}.flatten
|
|
168
|
-
(exact + globs).uniq
|
|
169
|
-
end
|
|
170
|
-
|
|
171
|
-
end
|
|
172
|
-
|
|
173
|
-
end
|
|
174
|
-
end
|
data/lib/ratch/dsl/email.rb
DELETED
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
# = TITLE:
|
|
2
|
-
#
|
|
3
|
-
# Email DSL
|
|
4
|
-
#
|
|
5
|
-
# = COPYING:
|
|
6
|
-
#
|
|
7
|
-
# Copyright (c) 2007 Psi T Corp.
|
|
8
|
-
#
|
|
9
|
-
# This file is part of the ProUtils' Ratch program.
|
|
10
|
-
#
|
|
11
|
-
# Ratch is free software: you can redistribute it and/or modify
|
|
12
|
-
# it under the terms of the GNU General Public License as published by
|
|
13
|
-
# the Free Software Foundation, either version 3 of the License, or
|
|
14
|
-
# (at your option) any later version.
|
|
15
|
-
#
|
|
16
|
-
# Ratch is distributed in the hope that it will be useful,
|
|
17
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
18
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
19
|
-
# GNU General Public License for more details.
|
|
20
|
-
#
|
|
21
|
-
# You should have received a copy of the GNU General Public License
|
|
22
|
-
# along with Ratch. If not, see <http://www.gnu.org/licenses/>.
|
|
23
|
-
|
|
24
|
-
begin
|
|
25
|
-
require 'facets/net/smtp_tls'
|
|
26
|
-
rescue LoadError
|
|
27
|
-
require 'net/smtp'
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
module Ratch
|
|
31
|
-
module Dsl
|
|
32
|
-
|
|
33
|
-
module Email
|
|
34
|
-
|
|
35
|
-
# Email function to easily send out an email.
|
|
36
|
-
#
|
|
37
|
-
# Settings:
|
|
38
|
-
#
|
|
39
|
-
# subject Subject of email message.
|
|
40
|
-
# from Message FROM address [email].
|
|
41
|
-
# to Email address to send announcemnt.
|
|
42
|
-
# server Email server to route message.
|
|
43
|
-
# port Email server's port.
|
|
44
|
-
# domain Email server's domain name.
|
|
45
|
-
# account Email account name if needed.
|
|
46
|
-
# password Password for login..
|
|
47
|
-
# login Login type: plain, cram_md5 or login [plain].
|
|
48
|
-
# secure Uses TLS security, true or false? [false]
|
|
49
|
-
# message Mesage to send -or-
|
|
50
|
-
# file File that contains message.
|
|
51
|
-
|
|
52
|
-
def email(message, settings)
|
|
53
|
-
settings ||= {}
|
|
54
|
-
settings.rekey
|
|
55
|
-
|
|
56
|
-
server = settings[:server]
|
|
57
|
-
account = settings[:account] || ENV['EMAIL_ACCOUNT']
|
|
58
|
-
passwd = settings[:password] || ENV['EMAIL_PASSWORD']
|
|
59
|
-
login = settings[:login].to_sym
|
|
60
|
-
subject = settings[:subject]
|
|
61
|
-
mail_to = settings[:to] || settings[:mail_to]
|
|
62
|
-
mail_from = settings[:from] || settings[:mail_from]
|
|
63
|
-
secure = settings[:secure]
|
|
64
|
-
domain = settings[:domain] || server
|
|
65
|
-
|
|
66
|
-
port ||= (secure ? 465 : 25)
|
|
67
|
-
account ||= mail_from
|
|
68
|
-
login ||= :plain
|
|
69
|
-
|
|
70
|
-
#mail_to = nil if mail_to.empty?
|
|
71
|
-
|
|
72
|
-
raise ArgumentError, "missing email field -- server" unless server
|
|
73
|
-
raise ArgumentError, "missing email field -- account" unless account
|
|
74
|
-
raise ArgumentError, "missing email field -- subject" unless subject
|
|
75
|
-
raise ArgumentError, "missing email field -- to" unless mail_to
|
|
76
|
-
raise ArgumentError, "missing email field -- from" unless mail_from
|
|
77
|
-
|
|
78
|
-
passwd ||= password(account)
|
|
79
|
-
|
|
80
|
-
mail_to = [mail_to].flatten.compact
|
|
81
|
-
|
|
82
|
-
msg = ""
|
|
83
|
-
msg << "From: #{mail_from}\n"
|
|
84
|
-
msg << "To: #{mail_to.join(';')}\n"
|
|
85
|
-
msg << "Subject: #{subject}\n"
|
|
86
|
-
msg << ""
|
|
87
|
-
msg << message
|
|
88
|
-
|
|
89
|
-
begin
|
|
90
|
-
Net::SMTP.enable_tls if Net::SMTP.respond_to?(:enable_tls) and secure
|
|
91
|
-
Net::SMTP.start(server, port, domain, account, passwd, login) do |s|
|
|
92
|
-
s.send_message( msg, mail_from, mail_to )
|
|
93
|
-
end
|
|
94
|
-
puts "Email sent successfully to #{mail_to.join(';')}."
|
|
95
|
-
return true
|
|
96
|
-
rescue => e
|
|
97
|
-
if trace?
|
|
98
|
-
raise e
|
|
99
|
-
else
|
|
100
|
-
abort "Email delivery failed."
|
|
101
|
-
end
|
|
102
|
-
end
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
end
|
|
108
|
-
end
|
data/lib/ratch/dsl/file.rb
DELETED
|
@@ -1,205 +0,0 @@
|
|
|
1
|
-
# = TITLE:
|
|
2
|
-
#
|
|
3
|
-
# File DSL
|
|
4
|
-
#
|
|
5
|
-
# = COPYING:
|
|
6
|
-
#
|
|
7
|
-
# Copyright (c) 2007 Psi T Corp.
|
|
8
|
-
#
|
|
9
|
-
# This file is part of the ProUtils' Ratch program.
|
|
10
|
-
#
|
|
11
|
-
# Ratch is free software: you can redistribute it and/or modify
|
|
12
|
-
# it under the terms of the GNU General Public License as published by
|
|
13
|
-
# the Free Software Foundation, either version 3 of the License, or
|
|
14
|
-
# (at your option) any later version.
|
|
15
|
-
#
|
|
16
|
-
# Ratch is distributed in the hope that it will be useful,
|
|
17
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
18
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
19
|
-
# GNU General Public License for more details.
|
|
20
|
-
#
|
|
21
|
-
# You should have received a copy of the GNU General Public License
|
|
22
|
-
# along with Ratch. If not, see <http://www.gnu.org/licenses/>.
|
|
23
|
-
|
|
24
|
-
require 'fileutils'
|
|
25
|
-
require 'facets/dir/multiglob'
|
|
26
|
-
require 'ratch/support/filetest'
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
module Ratch
|
|
30
|
-
module Dsl
|
|
31
|
-
|
|
32
|
-
module Filing
|
|
33
|
-
|
|
34
|
-
# Delegate access to FileUtils.
|
|
35
|
-
|
|
36
|
-
def fileutils
|
|
37
|
-
dryrun? ? ::FileUtils::DryRun : ::FileUtils
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
# Add FileUtils Features
|
|
41
|
-
|
|
42
|
-
::FileUtils.private_instance_methods(false).each do |meth|
|
|
43
|
-
next if meth =~ /^fu_/
|
|
44
|
-
module_eval %{
|
|
45
|
-
def #{meth}(*a,&b)
|
|
46
|
-
fileutils.#{meth}(*a,&b)
|
|
47
|
-
end
|
|
48
|
-
}
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
# Add FileTest Features
|
|
52
|
-
|
|
53
|
-
::FileTest.private_instance_methods(false).each do |meth|
|
|
54
|
-
next if meth =~ /^fu_/
|
|
55
|
-
module_eval %{
|
|
56
|
-
def #{meth}(*a,&b)
|
|
57
|
-
FileTest.#{meth}(*a,&b)
|
|
58
|
-
end
|
|
59
|
-
}
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
# Bonus FileUtils features.
|
|
63
|
-
|
|
64
|
-
def cd(*a,&b)
|
|
65
|
-
puts "cd #{a}" if dryrun? or trace?
|
|
66
|
-
fileutils.chdir(*a,&b)
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
# Read file.
|
|
70
|
-
|
|
71
|
-
def file_read(path)
|
|
72
|
-
File.read(path)
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
# Write file.
|
|
76
|
-
|
|
77
|
-
def file_write(path, text)
|
|
78
|
-
if dryrun?
|
|
79
|
-
puts "write #{path}"
|
|
80
|
-
else
|
|
81
|
-
File.open(path, 'w'){ |f| f << text }
|
|
82
|
-
end
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
# Assert that a path exists.
|
|
86
|
-
|
|
87
|
-
def exists?(path)
|
|
88
|
-
paths = Dir.glob(path)
|
|
89
|
-
paths.not_empty?
|
|
90
|
-
end
|
|
91
|
-
alias_method :exist?, :exists? ; module_function :exist?
|
|
92
|
-
alias_method :path?, :exists? ; module_function :path?
|
|
93
|
-
|
|
94
|
-
# Assert that a path exists.
|
|
95
|
-
|
|
96
|
-
def exists!(*paths)
|
|
97
|
-
abort "path not found #{path}" unless paths.any?{|path| exists?(path)}
|
|
98
|
-
end
|
|
99
|
-
alias_method :exist!, :exists! ; module_function :exist!
|
|
100
|
-
alias_method :path!, :exists! ; module_function :path!
|
|
101
|
-
|
|
102
|
-
# Is a given path a regular file? If +path+ is a glob
|
|
103
|
-
# then checks to see if all matches are refular files.
|
|
104
|
-
|
|
105
|
-
def file?(path)
|
|
106
|
-
paths = Dir.glob(path)
|
|
107
|
-
paths.not_empty? && paths.all?{ |f| FileTest.file?(f) }
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
# Assert that a given path is a file.
|
|
111
|
-
|
|
112
|
-
def file!(*paths)
|
|
113
|
-
abort "file not found #{path}" unless paths.any?{|path| file?(path)}
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
# Is a given path a directory? If +path+ is a glob
|
|
117
|
-
# checks to see if all matches are directories.
|
|
118
|
-
|
|
119
|
-
def dir?(path)
|
|
120
|
-
paths = Dir.glob(path)
|
|
121
|
-
paths.not_empty? && paths.all?{ |f| FileTest.directory?(f) }
|
|
122
|
-
end
|
|
123
|
-
alias_method :directory?, :dir? ; module_function :directory?
|
|
124
|
-
|
|
125
|
-
# Assert that a given path is a directory.
|
|
126
|
-
|
|
127
|
-
def dir!(*paths)
|
|
128
|
-
paths.each do |path|
|
|
129
|
-
abort "Directory not found: '#{path}'." unless dir?(path)
|
|
130
|
-
end
|
|
131
|
-
end
|
|
132
|
-
alias_method :directory!, :dir! ; module_function :directory!
|
|
133
|
-
|
|
134
|
-
# # Okay, I'm being a dork, but 'fold' seems like a better word
|
|
135
|
-
# # then 'dir', 'folder', or 'directory'.
|
|
136
|
-
#
|
|
137
|
-
# def fold?(path)
|
|
138
|
-
# paths = Dir.glob(path)
|
|
139
|
-
# paths.not_empty? && paths.all?{ |f| FileTest.directory?(f) }
|
|
140
|
-
# end
|
|
141
|
-
#
|
|
142
|
-
# # Assert that a given path is a fold (ie. a folder).
|
|
143
|
-
#
|
|
144
|
-
# def fold!(*paths)
|
|
145
|
-
# abort "fold not found #{path}" unless paths.any?{|path| fold?(path)}
|
|
146
|
-
# end
|
|
147
|
-
|
|
148
|
-
# Glob files.
|
|
149
|
-
|
|
150
|
-
def glob(*args, &blk)
|
|
151
|
-
Dir.glob(*args, &blk)
|
|
152
|
-
end
|
|
153
|
-
|
|
154
|
-
def multiglob(*args, &blk)
|
|
155
|
-
Dir.multiglob(*args, &blk)
|
|
156
|
-
end
|
|
157
|
-
|
|
158
|
-
def multiglob_r(*args, &blk)
|
|
159
|
-
Dir.multiglob_r(*args, &blk)
|
|
160
|
-
end
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
# # Is a file a task?
|
|
164
|
-
#
|
|
165
|
-
# def task?(path)
|
|
166
|
-
# task = File.dirname($0) + "/#{path}"
|
|
167
|
-
# task.chomp!('!')
|
|
168
|
-
# task if FileTest.file?(task) && FileTest.executable?(task)
|
|
169
|
-
# end
|
|
170
|
-
|
|
171
|
-
# # Is a file a command executable?
|
|
172
|
-
# #
|
|
173
|
-
# # TODO Probably needs to be fixed for Windows.
|
|
174
|
-
#
|
|
175
|
-
# def bin?(path)
|
|
176
|
-
# is_bin = command_paths.any? do |f|
|
|
177
|
-
# FileTest.exist?(File.join(f, path))
|
|
178
|
-
# end
|
|
179
|
-
# is_bin ? File.basename(path) : false
|
|
180
|
-
# end
|
|
181
|
-
#
|
|
182
|
-
# # This is a support method of #bin?
|
|
183
|
-
#
|
|
184
|
-
# def command_paths
|
|
185
|
-
# @command_paths ||= ENV['PATH'].split(/[:;]/)
|
|
186
|
-
# end
|
|
187
|
-
#
|
|
188
|
-
# # TODO Make more robust.
|
|
189
|
-
#
|
|
190
|
-
# UNSAFE = [ '/', '/*', '/**/*' ]
|
|
191
|
-
#
|
|
192
|
-
# # Is a path considered reasonably "safe"?
|
|
193
|
-
#
|
|
194
|
-
# def safe?(path)
|
|
195
|
-
# case path
|
|
196
|
-
# when *UNSAFE
|
|
197
|
-
# return false
|
|
198
|
-
# end
|
|
199
|
-
# true
|
|
200
|
-
# end
|
|
201
|
-
|
|
202
|
-
end
|
|
203
|
-
|
|
204
|
-
end
|
|
205
|
-
end
|