Skip to content

Commit 247f8ec

Browse files
committed
extlibs.rb: Extract ExtLibs#process
For the case using this script as a library. - `ExtLibs#process` reads and processes an extlibs file. - `ExtLibs#process_under` processes all extlibs files under the given directory. - `Extlibs.run` parses `ARGV` and lets an instance process the directories.
1 parent 9112cf4 commit 247f8ec

File tree

1 file changed

+78
-66
lines changed

1 file changed

+78
-66
lines changed

tool/extlibs.rb

+78-66
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ def expand(str)
2222
end
2323

2424
class ExtLibs
25-
def initialize
25+
def initialize(mode = :all, cache_dir: nil)
26+
@mode = mode
27+
@cache_dir = cache_dir
2628
@colorize = Colorize.new
2729
end
2830

@@ -160,7 +162,78 @@ def do_command(mode, dest, url, cache_dir, chksums)
160162
extracted
161163
end
162164

163-
def run(argv)
165+
def process(list)
166+
mode = @mode
167+
cache_dir = @cache_dir
168+
after_extract = (mode == :all or mode == :patch)
169+
success = true
170+
if $VERBOSE
171+
$stdout.puts "downloading for #{list}"
172+
$stdout.flush
173+
end
174+
vars = Vars.new
175+
extracted = false
176+
dest = File.dirname(list)
177+
url = chksums = nil
178+
IO.foreach(list) do |line|
179+
line.sub!(/\s*#.*/, '')
180+
if /^(\w+)\s*=\s*(.*)/ =~ line
181+
vars[$1] = vars.expand($2)
182+
next
183+
end
184+
if chksums
185+
chksums.concat(line.split)
186+
elsif /^\t/ =~ line
187+
if extracted and after_extract
188+
patch, *args = line.split.map {|s| vars.expand(s)}
189+
do_patch(dest, patch, args)
190+
end
191+
next
192+
elsif /^!\s*(?:chdir:\s*([^|\s]+)\|\s*)?(.*)/ =~ line
193+
if extracted and after_extract
194+
command = vars.expand($2.strip)
195+
chdir = $1 and chdir = vars.expand(chdir)
196+
do_exec(command, chdir, dest)
197+
end
198+
next
199+
elsif /->/ =~ line
200+
if extracted and after_extract
201+
link, file = $`.strip, $'.strip
202+
do_link(vars.expand(link), vars.expand(file), dest)
203+
end
204+
next
205+
else
206+
url, *chksums = line.split(' ')
207+
end
208+
if chksums.last == '\\'
209+
chksums.pop
210+
next
211+
end
212+
unless url
213+
chksums = nil
214+
next
215+
end
216+
url = vars.expand(url)
217+
begin
218+
extracted = do_command(mode, dest, url, cache_dir, chksums)
219+
rescue => e
220+
warn e.full_message
221+
success = false
222+
end
223+
url = chksums = nil
224+
end
225+
success
226+
end
227+
228+
def process_under(dir)
229+
success = true
230+
Dir.glob("#{dir}/**/extlibs") do |list|
231+
success &= process(list)
232+
end
233+
success
234+
end
235+
236+
def self.run(argv)
164237
cache_dir = nil
165238
mode = :all
166239
until argv.empty?
@@ -190,71 +263,10 @@ def run(argv)
190263
argv.shift
191264
end
192265

193-
success = true
194-
argv.each do |dir|
195-
Dir.glob("#{dir}/**/extlibs") do |list|
196-
if $VERBOSE
197-
$stdout.puts "downloading for #{list}"
198-
$stdout.flush
199-
end
200-
vars = Vars.new
201-
extracted = false
202-
dest = File.dirname(list)
203-
url = chksums = nil
204-
IO.foreach(list) do |line|
205-
line.sub!(/\s*#.*/, '')
206-
if /^(\w+)\s*=\s*(.*)/ =~ line
207-
vars[$1] = vars.expand($2)
208-
next
209-
end
210-
if chksums
211-
chksums.concat(line.split)
212-
elsif /^\t/ =~ line
213-
if extracted and (mode == :all or mode == :patch)
214-
patch, *args = line.split.map {|s| vars.expand(s)}
215-
do_patch(dest, patch, args)
216-
end
217-
next
218-
elsif /^!\s*(?:chdir:\s*([^|\s]+)\|\s*)?(.*)/ =~ line
219-
if extracted and (mode == :all or mode == :patch)
220-
command = vars.expand($2.strip)
221-
chdir = $1 and chdir = vars.expand(chdir)
222-
do_exec(command, chdir, dest)
223-
end
224-
next
225-
elsif /->/ =~ line
226-
if extracted and (mode == :all or mode == :patch)
227-
link, file = $`.strip, $'.strip
228-
do_link(vars.expand(link), vars.expand(file), dest)
229-
end
230-
next
231-
else
232-
url, *chksums = line.split(' ')
233-
end
234-
if chksums.last == '\\'
235-
chksums.pop
236-
next
237-
end
238-
unless url
239-
chksums = nil
240-
next
241-
end
242-
url = vars.expand(url)
243-
begin
244-
extracted = do_command(mode, dest, url, cache_dir, chksums)
245-
rescue => e
246-
warn e.full_message
247-
success = false
248-
end
249-
url = chksums = nil
250-
end
251-
end
266+
extlibs = new(mode, cache_dir: cache_dir)
267+
argv.inject(true) do |success, dir|
268+
success & extlibs.process_under(dir)
252269
end
253-
success
254-
end
255-
256-
def self.run(argv)
257-
self.new.run(argv)
258270
end
259271
end
260272

0 commit comments

Comments
 (0)