squared 0.0.9 → 0.0.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -6
- data/README.ruby.md +145 -47
- data/lib/squared/app.rb +10 -0
- data/lib/squared/common/base.rb +17 -15
- data/lib/squared/common/class.rb +20 -3
- data/lib/squared/common/format.rb +104 -46
- data/lib/squared/common/prompt.rb +38 -0
- data/lib/squared/common/shell.rb +16 -7
- data/lib/squared/common/system.rb +8 -38
- data/lib/squared/common/task.rb +3 -2
- data/lib/squared/common/utils.rb +69 -0
- data/lib/squared/common.rb +2 -0
- data/lib/squared/config.rb +31 -26
- data/lib/squared/version.rb +1 -1
- data/lib/squared/workspace/application.rb +285 -137
- data/lib/squared/workspace/project/base.rb +459 -178
- data/lib/squared/workspace/project/git.rb +95 -114
- data/lib/squared/workspace/project/node.rb +306 -160
- data/lib/squared/workspace/project/python.rb +45 -19
- data/lib/squared/workspace/project/ruby.rb +156 -127
- data/lib/squared/workspace/project.rb +0 -3
- data/lib/squared/workspace/repo.rb +100 -93
- data/lib/squared/workspace/series.rb +82 -52
- data/lib/squared/workspace.rb +5 -4
- data/lib/squared.rb +1 -11
- metadata +5 -2
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'json'
|
3
4
|
require 'date'
|
4
5
|
require 'logger'
|
5
6
|
|
@@ -12,12 +13,18 @@ module Squared
|
|
12
13
|
include System
|
13
14
|
include Shell
|
14
15
|
include Task
|
16
|
+
include Utils
|
15
17
|
include ::Rake::DSL
|
16
18
|
|
17
|
-
SEM_VER = /(\d+)(?:(\.)(\d+))?(?:(\.)(\d+))?/.freeze
|
19
|
+
SEM_VER = /(\d+)(?:(\.)(\d+))?(?:(\.)(\d+)(\S+)?)?/.freeze
|
20
|
+
|
21
|
+
VAR_SET = %i[parent global envname theme run script env depend doc test copy clean].freeze
|
22
|
+
private_constant :VAR_SET
|
18
23
|
|
19
24
|
class << self
|
20
25
|
def populate(*); end
|
26
|
+
def batchargs(*); end
|
27
|
+
def aliasargs(*); end
|
21
28
|
|
22
29
|
def tasks
|
23
30
|
[].freeze
|
@@ -39,42 +46,106 @@ module Squared
|
|
39
46
|
def to_s
|
40
47
|
super.to_s.match(/[^:]+$/)[0]
|
41
48
|
end
|
49
|
+
|
50
|
+
def config?(*)
|
51
|
+
false
|
52
|
+
end
|
42
53
|
end
|
43
54
|
|
44
55
|
@@print_order = 0
|
45
56
|
@@tasks = {}
|
46
57
|
|
47
|
-
attr_reader :name, :project, :workspace, :
|
58
|
+
attr_reader :name, :project, :workspace, :path, :exception, :pipe, :verbose, :theme, :group, :parent
|
48
59
|
|
49
|
-
def initialize(
|
50
|
-
@name = name.to_s
|
60
|
+
def initialize(workspace, path, name, *, group: nil, pass: nil, exclude: nil, common: ARG[:COMMON], **kwargs)
|
51
61
|
@path = path
|
52
|
-
@project = @path.basename.to_s
|
53
62
|
@workspace = workspace
|
54
|
-
@
|
63
|
+
@name = name.to_s.freeze
|
64
|
+
@project = @path.basename.to_s.freeze
|
65
|
+
@group = group&.to_s.freeze
|
55
66
|
@depend = kwargs[:depend]
|
56
67
|
@doc = kwargs[:doc]
|
57
68
|
@test = kwargs[:test]
|
58
|
-
@output = [kwargs[:run], nil]
|
59
69
|
@copy = kwargs[:copy]
|
60
70
|
@clean = kwargs[:clean]
|
61
|
-
@
|
71
|
+
@exception = kwargs.key?(:exception) ? env_bool(kwargs[:exception]) : workspace.exception
|
72
|
+
@pipe = kwargs.key?(:pipe) ? env_pipe(kwargs[:pipe]) : workspace.pipe
|
73
|
+
@verbose = kwargs.key?(:verbose) ? kwargs[:verbose] : workspace.verbose
|
74
|
+
@theme = if !@verbose
|
62
75
|
{}
|
63
|
-
elsif
|
76
|
+
elsif common
|
64
77
|
workspace.theme
|
65
78
|
else
|
66
79
|
__get__(:theme)[:project][to_sym] ||= {}
|
67
80
|
end
|
81
|
+
@output = []
|
68
82
|
@ref = []
|
69
|
-
@
|
83
|
+
@children = []
|
84
|
+
@pass = (pass ? as_a(pass, :to_sym) : []).freeze
|
85
|
+
@exclude = (exclude ? as_a(exclude, :to_sym) : []).freeze
|
86
|
+
@envname = @name.gsub(/[^\w]+/, '_').upcase.freeze
|
87
|
+
@desc = (@name.include?(':') ? @name.split(':').join(ARG[:SPACE]) : @name).freeze
|
88
|
+
@parent = nil
|
89
|
+
@global = false
|
90
|
+
run_set(kwargs[:run], kwargs[:env], opts: kwargs.fetch(:opts, true))
|
70
91
|
initialize_ref(Base.ref)
|
92
|
+
end
|
93
|
+
|
94
|
+
def initialize_ref(ref)
|
95
|
+
@ref << ref unless @exclude.include?(ref)
|
96
|
+
end
|
97
|
+
|
98
|
+
def initialize_build(ref, **kwargs)
|
99
|
+
initialize_ref(ref)
|
100
|
+
if (@script = @workspace.script_get(group: @group, ref: ref))
|
101
|
+
if @script[:log] && !kwargs.key?(:log)
|
102
|
+
kwargs[:log] = @script[:log]
|
103
|
+
@log = nil
|
104
|
+
end
|
105
|
+
@depend = @script[:depend] if @depend.nil?
|
106
|
+
@doc = @script[:doc] if @doc.nil?
|
107
|
+
@test = @script[:test] if @test.nil?
|
108
|
+
@clean = @script[:clean] if @clean.nil?
|
109
|
+
@exclude = @script[:exclude] if @exclude.empty? && @script.key?(:exclude)
|
110
|
+
end
|
71
111
|
initialize_logger(**kwargs)
|
112
|
+
return if @output[0] == false
|
113
|
+
|
114
|
+
data = @workspace.script_find(*@ref, @group)
|
115
|
+
if @output[0].nil?
|
116
|
+
if (scr = data[:script])
|
117
|
+
@global = true
|
118
|
+
script_set(scr, prod: kwargs[:prod])
|
119
|
+
elsif (run = data[:run])
|
120
|
+
@global = true
|
121
|
+
run_set run
|
122
|
+
end
|
123
|
+
unless data[:env]
|
124
|
+
if (scr = kwargs[:script])
|
125
|
+
@global = false
|
126
|
+
script_set scr
|
127
|
+
elsif @script && !data[:global]
|
128
|
+
if (scr = @script[:script])
|
129
|
+
@global = false
|
130
|
+
script_set scr
|
131
|
+
elsif (run = @script[:run])
|
132
|
+
@global = false
|
133
|
+
run_set run
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
elsif data[:env] && data[:run]
|
138
|
+
@global = true
|
139
|
+
run_set data[:run]
|
140
|
+
end
|
72
141
|
end
|
73
142
|
|
74
143
|
def initialize_logger(log: nil, **)
|
144
|
+
return if @log
|
145
|
+
|
75
146
|
log = log.is_a?(::Hash) ? log.dup : { file: log }
|
76
|
-
|
77
|
-
file = case
|
147
|
+
unless (file = env('LOG_FILE'))
|
148
|
+
file = case env('LOG_AUTO')
|
78
149
|
when 'y', 'year'
|
79
150
|
"#{@name}-#{Date.today.year}.log"
|
80
151
|
when 'm', 'month'
|
@@ -85,53 +156,51 @@ module Squared
|
|
85
156
|
end
|
86
157
|
if file ||= log[:file]
|
87
158
|
file = Date.today.strftime(file)
|
88
|
-
file = (dir = env('LOG_DIR')) ?
|
159
|
+
file = (dir = env('LOG_DIR')) ? @workspace.home.join(dir, file) : @workspace.home.join(file)
|
89
160
|
begin
|
90
161
|
file = file.realdirpath
|
91
162
|
rescue StandardError => e
|
92
|
-
raise if @
|
163
|
+
raise if @exception
|
93
164
|
|
94
165
|
file = nil
|
95
|
-
warn e if
|
166
|
+
warn log_message(::Logger::WARN, e) if warning?
|
96
167
|
end
|
97
168
|
end
|
98
|
-
log[:progname]
|
99
|
-
|
169
|
+
log[:progname] ||= @name
|
170
|
+
if (val = env('LOG_LEVEL', ignore: false))
|
171
|
+
log[:level] = val
|
172
|
+
end
|
100
173
|
log.delete(:file)
|
101
174
|
@log = [file, log]
|
102
175
|
end
|
103
176
|
|
104
|
-
def
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
177
|
+
def initialize_env(dev: nil, prod: nil, **)
|
178
|
+
pre = "BUILD_#{@envname}"
|
179
|
+
@dev = env_match("#{pre}_DEV", dev)
|
180
|
+
@prod = env_match("#{pre}_PROD", prod)
|
181
|
+
cmd = @output[0]
|
182
|
+
unless cmd == false || cmd.is_a?(::Array) || (val = env('BUILD', suffix: 'OPTS')).nil?
|
183
|
+
@output[cmd ? 1 : 3] = shell_split(val, join: true)
|
110
184
|
end
|
111
|
-
@
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
185
|
+
unless @output[2] == false || (val = env('BUILD', suffix: 'ENV')).nil?
|
186
|
+
begin
|
187
|
+
data = JSON.parse(val)
|
188
|
+
raise_error('invalid JSON object', val, hint: "#{prefix}_ENV") unless data.is_a?(::Hash)
|
189
|
+
@output[2] = data
|
190
|
+
rescue StandardError => e
|
191
|
+
log.warn e
|
192
|
+
end
|
118
193
|
end
|
119
|
-
|
120
|
-
|
121
|
-
def initialize_script(ref, **)
|
122
|
-
initialize_ref(ref)
|
123
|
-
return unless (script = workspace.script(group: group, ref: ref))
|
124
|
-
|
125
|
-
@depend = script[:depend] if @depend.nil?
|
126
|
-
@doc = script[:doc] if @doc.nil?
|
127
|
-
@test = script[:test] if @test.nil?
|
128
|
-
@clean = script[:clean] if @clean.nil?
|
129
|
-
@exclude = script[:exclude] if @exclude.empty? && script.key?(:exclude)
|
130
|
-
@script = script
|
131
|
-
end
|
194
|
+
return unless (val = env('BUILD', strict: true))
|
132
195
|
|
133
|
-
|
134
|
-
|
196
|
+
@global = false
|
197
|
+
if val == '0'
|
198
|
+
@output = [false]
|
199
|
+
elsif script?
|
200
|
+
script_set val
|
201
|
+
else
|
202
|
+
run_set val
|
203
|
+
end
|
135
204
|
end
|
136
205
|
|
137
206
|
def ref
|
@@ -139,80 +208,114 @@ module Squared
|
|
139
208
|
end
|
140
209
|
|
141
210
|
def populate(*)
|
142
|
-
valid = ref?(Base.ref)
|
143
|
-
series = workspace.series
|
144
|
-
|
145
211
|
namespace name do
|
146
|
-
series.each_key do |key|
|
147
|
-
next unless
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
212
|
+
workspace.series.each_key do |key|
|
213
|
+
next unless workspace.task_include?(self, key)
|
214
|
+
|
215
|
+
alt = workspace.series.name_get(key)
|
216
|
+
unless workspace.task_defined?(name, alt)
|
217
|
+
desc message(@desc, alt)
|
218
|
+
task alt do
|
219
|
+
__send__(key)
|
220
|
+
end
|
152
221
|
end
|
222
|
+
next if (items = @children.select { |item| workspace.task_include?(item, key) }).empty?
|
223
|
+
|
224
|
+
desc message(@desc, alt, 'workspace')
|
225
|
+
task task_join(alt, 'workspace') => items.map { |item| task_join(item.name, alt) }
|
153
226
|
end
|
154
227
|
end
|
155
228
|
end
|
156
229
|
|
157
|
-
def
|
230
|
+
def with(**kwargs, &blk)
|
231
|
+
@withargs = kwargs.empty? ? nil : kwargs
|
232
|
+
if block_given?
|
233
|
+
instance_eval(&blk)
|
234
|
+
@withargs = nil
|
235
|
+
end
|
236
|
+
self
|
237
|
+
end
|
238
|
+
|
239
|
+
def add(path, name = nil, **kwargs, &blk)
|
240
|
+
if path.is_a?(::String) && (data = %r{^(.+)[\\/]\*+$}.match(path))
|
241
|
+
path = base_path(data[1]).children.select(&:directory?)
|
242
|
+
end
|
243
|
+
if path.is_a?(::Array)
|
244
|
+
name = @name if name == true
|
245
|
+
path.each { |val| add(val, name && task_join(name, File.basename(val)), **kwargs, &blk) }
|
246
|
+
return self
|
247
|
+
elsif !source_path?(path = base_path(path))
|
248
|
+
return self
|
249
|
+
elsif !name.is_a?(::String) && !name.is_a?(::Symbol)
|
250
|
+
name = nil
|
251
|
+
end
|
252
|
+
if @withargs
|
253
|
+
data = @withargs.dup
|
254
|
+
data.merge!(kwargs)
|
255
|
+
kwargs = data
|
256
|
+
end
|
257
|
+
kwargs[:group] = group unless kwargs.key?(:group)
|
258
|
+
kwargs[:ref] = ref unless kwargs.key?(:ref)
|
259
|
+
parent = self
|
260
|
+
proj = nil
|
261
|
+
workspace.add(path, name || path.basename, **kwargs) do
|
262
|
+
variable_set :parent, parent
|
263
|
+
proj = self
|
264
|
+
end
|
265
|
+
@children << proj
|
266
|
+
proj.instance_eval(&blk) if block_given?
|
267
|
+
self
|
268
|
+
end
|
269
|
+
|
270
|
+
def build(*args, sync: invoked_sync?('build'), **)
|
158
271
|
if args.empty?
|
159
|
-
cmd, opts = @output
|
160
|
-
|
272
|
+
cmd, opts, var, flags = @output
|
273
|
+
banner = verbose == 1
|
161
274
|
else
|
162
275
|
cmd = args.shift
|
163
|
-
opts =
|
276
|
+
opts = args.map { |val| shell_quote(val, force: false) }.join(' ')
|
277
|
+
banner = verbose
|
164
278
|
end
|
165
279
|
if cmd
|
166
|
-
|
280
|
+
case opts
|
281
|
+
when ::String
|
167
282
|
cmd = "#{cmd} #{opts}"
|
168
|
-
|
283
|
+
when ::Array
|
169
284
|
cmd = cmd.join(' && ')
|
285
|
+
else
|
286
|
+
cmd = [cmd, compose(opts, script: false)].compact.join(' ') unless opts == false || !respond_to?(:compose)
|
170
287
|
end
|
171
|
-
banner = verbose?
|
172
288
|
else
|
173
289
|
return unless respond_to?(:compose)
|
174
290
|
|
175
|
-
cmd = compose(opts)
|
176
|
-
banner = env('REPO_BUILD') == 'verbose'
|
177
|
-
end
|
178
|
-
run(cmd, banner: banner, sync: sync)
|
179
|
-
end
|
180
|
-
|
181
|
-
def refresh(*)
|
182
|
-
build(sync: invoked_sync?('depend'))
|
183
|
-
key = "#{name}:copy"
|
184
|
-
if workspace.task_defined?(key)
|
185
|
-
invoke(key, exception: workspace.exception, warning: workspace.warning)
|
186
|
-
else
|
187
|
-
copy
|
291
|
+
cmd = compose(opts, flags, script: true)
|
188
292
|
end
|
293
|
+
run(cmd, var, banner: banner, sync: sync)
|
189
294
|
end
|
190
295
|
|
191
|
-
def depend(
|
192
|
-
run(@depend, sync:
|
296
|
+
def depend(*, sync: invoked_sync?('depend'), **)
|
297
|
+
run(@depend, sync: sync) if @depend
|
193
298
|
end
|
194
299
|
|
195
|
-
def copy(
|
196
|
-
run_s(@copy, sync:
|
300
|
+
def copy(*, sync: invoked_sync?('copy'), **)
|
301
|
+
run_s(@copy, sync: sync) if @copy
|
197
302
|
end
|
198
303
|
|
199
|
-
def doc
|
200
|
-
build(@doc, sync:
|
304
|
+
def doc(*, sync: invoked_sync?('doc'), **)
|
305
|
+
build(@doc, sync: sync) if @doc
|
201
306
|
end
|
202
307
|
|
203
|
-
def test
|
204
|
-
build(@test, sync:
|
308
|
+
def test(*, sync: invoked_sync?('test'), **)
|
309
|
+
build(@test, sync: sync) if @test
|
205
310
|
end
|
206
311
|
|
207
|
-
def clean
|
208
|
-
|
209
|
-
|
210
|
-
if @clean.is_a?(::String)
|
312
|
+
def clean(*)
|
313
|
+
case @clean
|
314
|
+
when ::String
|
211
315
|
run_s(@clean, sync: invoked_sync?('clean'))
|
212
|
-
|
213
|
-
@clean.each do |val|
|
214
|
-
val = val.to_s
|
215
|
-
if val =~ %r{[\\/]$}
|
316
|
+
when ::Enumerable
|
317
|
+
as_a(@clean).each do |val|
|
318
|
+
if (val = val.to_s) =~ %r{[\\/]$}
|
216
319
|
dir = Pathname.new(val)
|
217
320
|
dir = base_path(dir) unless dir.absolute?
|
218
321
|
next unless dir.directory?
|
@@ -239,10 +342,52 @@ module Squared
|
|
239
342
|
@log = Logger.new(enabled? ? @log[0] : nil, **@log[1])
|
240
343
|
end
|
241
344
|
|
242
|
-
def base_path(*args)
|
243
|
-
path.join(*args)
|
345
|
+
def base_path(*args, ascend: nil)
|
346
|
+
ret = path.join(*args)
|
347
|
+
return ret unless ascend && !ret.exist?
|
348
|
+
|
349
|
+
path.parent.ascend.each do |dir|
|
350
|
+
target = dir.join(*args)
|
351
|
+
return target if target.exist?
|
352
|
+
break if (ascend.is_a?(String) && dir.join(ascend).exist?) || workspace.root == dir || parent&.path == dir
|
353
|
+
end
|
354
|
+
ret
|
244
355
|
end
|
245
356
|
|
357
|
+
def color(val)
|
358
|
+
ret = theme[val]
|
359
|
+
ret && !ret.empty? ? ret : [val]
|
360
|
+
end
|
361
|
+
|
362
|
+
def variable_set(key, *val, **kwargs)
|
363
|
+
if variables.include?(key)
|
364
|
+
case key
|
365
|
+
when :run
|
366
|
+
run_set(*val, **kwargs)
|
367
|
+
when :script
|
368
|
+
script_set(*val, **kwargs)
|
369
|
+
when :env
|
370
|
+
run_set(output[0], *val, **kwargs)
|
371
|
+
when :parent
|
372
|
+
@parent = val if (val = val.first).is_a?(Project::Base)
|
373
|
+
else
|
374
|
+
instance_variable_set :"@#{key}", val.first
|
375
|
+
end
|
376
|
+
else
|
377
|
+
log.warn "variable_set: @#{key} (private)"
|
378
|
+
end
|
379
|
+
end
|
380
|
+
|
381
|
+
def variables
|
382
|
+
VAR_SET
|
383
|
+
end
|
384
|
+
|
385
|
+
def allref
|
386
|
+
@ref.reverse_each
|
387
|
+
end
|
388
|
+
|
389
|
+
def version(*); end
|
390
|
+
|
246
391
|
def inspect
|
247
392
|
"#<#{self.class}: #{name} => #{self}>"
|
248
393
|
end
|
@@ -255,12 +400,16 @@ module Squared
|
|
255
400
|
name.to_sym
|
256
401
|
end
|
257
402
|
|
258
|
-
def enabled?
|
403
|
+
def enabled?(ref = nil)
|
404
|
+
return false if ref && !ref?(ref)
|
405
|
+
|
259
406
|
path.directory? && !path.empty?
|
260
407
|
end
|
261
408
|
|
262
|
-
def has?(
|
263
|
-
|
409
|
+
def has?(meth, ref = nil)
|
410
|
+
return false if ref && !ref?(ref)
|
411
|
+
|
412
|
+
respond_to?(meth = :"#{meth}?") && __send__(meth)
|
264
413
|
end
|
265
414
|
|
266
415
|
def ref?(val)
|
@@ -268,15 +417,19 @@ module Squared
|
|
268
417
|
end
|
269
418
|
|
270
419
|
def build?
|
271
|
-
!!@output[0]
|
420
|
+
!!@output[0] || script?
|
272
421
|
end
|
273
422
|
|
274
|
-
def
|
275
|
-
|
423
|
+
def script?
|
424
|
+
@output[0].nil? && !!@output[1] && respond_to?(:compose)
|
276
425
|
end
|
277
426
|
|
278
427
|
def depend?
|
279
|
-
|
428
|
+
!!@depend
|
429
|
+
end
|
430
|
+
|
431
|
+
def copy?
|
432
|
+
runnable?(@copy) || workspace.task_defined?(name, 'copy')
|
280
433
|
end
|
281
434
|
|
282
435
|
def doc?
|
@@ -287,34 +440,40 @@ module Squared
|
|
287
440
|
!!@test
|
288
441
|
end
|
289
442
|
|
290
|
-
def copy?
|
291
|
-
@copy.is_a?(::String)
|
292
|
-
end
|
293
|
-
|
294
443
|
def clean?
|
295
|
-
|
444
|
+
runnable?(@clean) || workspace.task_defined?(name, 'clean')
|
296
445
|
end
|
297
446
|
|
298
447
|
def dev?
|
299
|
-
|
448
|
+
@dev != false && workspace.dev?(pat: @dev, **scriptargs)
|
449
|
+
end
|
450
|
+
|
451
|
+
def prod?
|
452
|
+
@prod != false && workspace.prod?(pat: @prod, **scriptargs)
|
300
453
|
end
|
301
454
|
|
302
455
|
private
|
303
456
|
|
304
|
-
def
|
457
|
+
def puts(*args)
|
458
|
+
puts_oe(*args, pipe: pipe)
|
459
|
+
end
|
460
|
+
|
461
|
+
def run(cmd = @session, var = nil, exception: @exception, sync: true, req: nil, banner: ARG[:BANNER], **)
|
305
462
|
if req && !base_path(req).exist?
|
306
463
|
log.warn "#{req} (not found)"
|
307
464
|
return
|
308
465
|
end
|
309
|
-
cmd =
|
466
|
+
cmd = session_done(cmd)
|
310
467
|
log.info cmd
|
311
468
|
begin
|
312
469
|
if cmd =~ /^\S+:(\S+:?)+$/ && workspace.task_defined?(cmd)
|
313
470
|
print_item if sync
|
314
|
-
|
471
|
+
log.warn "ENV was discarded: #{var}" if var
|
472
|
+
invoke(cmd, exception: exception, warning: warning?)
|
315
473
|
else
|
316
474
|
print_item format_banner(cmd, banner: banner) if sync
|
317
|
-
|
475
|
+
args = var.is_a?(::Hash) ? [var, cmd] : [cmd]
|
476
|
+
shell(*args, chdir: path, exception: exception)
|
318
477
|
end
|
319
478
|
rescue StandardError => e
|
320
479
|
log.error e
|
@@ -322,42 +481,57 @@ module Squared
|
|
322
481
|
end
|
323
482
|
end
|
324
483
|
|
325
|
-
def run_s(cmd, **kwargs)
|
326
|
-
run(
|
484
|
+
def run_s(*cmd, env: nil, **kwargs)
|
485
|
+
cmd.each { |val| run(val, env, banner: !!verbose, **kwargs) }
|
327
486
|
end
|
328
487
|
|
329
|
-
def
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
ret =
|
488
|
+
def run_task(key)
|
489
|
+
return false unless workspace.task_defined?(key)
|
490
|
+
|
491
|
+
invoke(key, **workspace.invokeargs)
|
492
|
+
true
|
493
|
+
end
|
494
|
+
|
495
|
+
def env(key, default = nil, suffix: nil, equals: nil, ignore: nil, strict: false)
|
496
|
+
a = "#{key}_#{@envname}"
|
497
|
+
ret = if suffix
|
498
|
+
ENV.fetch("#{a}_#{suffix}", '')
|
499
|
+
else
|
500
|
+
ignore = ['0'].freeze if ignore.nil? && !strict
|
501
|
+
ENV[a] || (strict ? '' : ENV.fetch(key, ''))
|
502
|
+
end
|
339
503
|
return ret == equals.to_s unless equals.nil?
|
340
504
|
|
341
|
-
ret.empty? || as_a(ignore).any? { |val| ret == val.to_s } ? default : ret
|
505
|
+
ret.empty? || (ignore && as_a(ignore).any? { |val| ret == val.to_s }) ? default : ret
|
342
506
|
end
|
343
507
|
|
344
|
-
def session(*cmd,
|
345
|
-
if (val =
|
508
|
+
def session(*cmd, prefix: cmd.first)
|
509
|
+
if (val = env("#{prefix.upcase}_OPTIONS"))
|
346
510
|
split_escape(val).each { |opt| cmd << fill_option(opt) }
|
347
511
|
end
|
348
512
|
@session = JoinSet.new(cmd)
|
349
513
|
end
|
350
514
|
|
351
|
-
def
|
352
|
-
return cmd unless cmd.respond_to?(:done)
|
515
|
+
def session_done(cmd)
|
516
|
+
return cmd.to_s unless cmd.respond_to?(:done)
|
353
517
|
|
354
|
-
raise_error('
|
518
|
+
raise_error('no args were added', hint: cmd.first || name) unless cmd.size > 1
|
355
519
|
@session = nil if cmd == @session
|
356
520
|
cmd.done
|
357
521
|
end
|
358
522
|
|
523
|
+
def option(*args, prefix: @session&.first, **kwargs)
|
524
|
+
if prefix
|
525
|
+
args.each do |val|
|
526
|
+
ret = env("#{prefix}_#{val.gsub(/\W/, '_')}".upcase, **kwargs)
|
527
|
+
return ret if ret
|
528
|
+
end
|
529
|
+
end
|
530
|
+
nil
|
531
|
+
end
|
532
|
+
|
359
533
|
def print_item(*val)
|
360
|
-
puts unless @@print_order == 0 ||
|
534
|
+
puts unless @@print_order == 0 || stdin?
|
361
535
|
@@print_order += 1
|
362
536
|
puts val unless val.empty? || (val.size == 1 && val.first.nil?)
|
363
537
|
end
|
@@ -387,41 +561,64 @@ module Squared
|
|
387
561
|
out.join("\n")
|
388
562
|
end
|
389
563
|
|
390
|
-
def print_footer(*lines, sub: nil,
|
564
|
+
def print_footer(*lines, sub: nil, reverse: false, right: false, **kwargs)
|
565
|
+
border = kwargs.key?(:border) ? kwargs[:border] : borderstyle
|
391
566
|
n = Project.max_width(lines)
|
392
567
|
sub = as_a(sub)
|
393
568
|
lines.map! do |val|
|
394
|
-
s = val.ljust(n)
|
569
|
+
s = right ? val.rjust(n) : val.ljust(n)
|
395
570
|
sub.each { |h| s = sub_style(s, **h) }
|
396
571
|
s
|
397
572
|
end
|
398
|
-
ret = [sub_style('-' * n, styles: border), *lines]
|
573
|
+
ret = [sub_style('-' * n, styles: border || theme[:border]), *lines]
|
399
574
|
ret.reverse! if reverse
|
400
575
|
ret.join("\n")
|
401
576
|
end
|
402
577
|
|
403
|
-
def format_desc(action, flag, opts = nil, req:
|
578
|
+
def format_desc(action, flag, opts = nil, req: nil, arg: 'opts*')
|
404
579
|
opts = "#{arg}=#{opts.join(',')}" if opts.is_a?(::Array)
|
405
|
-
|
580
|
+
val = [@desc]
|
581
|
+
if flag
|
582
|
+
val << action
|
583
|
+
else
|
406
584
|
flag = action
|
407
|
-
action = ''
|
408
585
|
end
|
409
|
-
req = opts ? "#{req}," : "[#{req}]"
|
410
|
-
|
586
|
+
req = opts ? "#{req}," : "[#{req}]" if req
|
587
|
+
val << (opts ? "#{flag}[#{req}#{opts}]" : "#{flag}#{req}")
|
588
|
+
message(*val)
|
411
589
|
end
|
412
590
|
|
413
|
-
def format_banner(cmd, banner:
|
591
|
+
def format_banner(cmd, banner: ARG[:BANNER], multiple: false)
|
414
592
|
return unless banner
|
415
593
|
|
416
|
-
if (data = workspace.
|
594
|
+
if (data = workspace.banner_get(*@ref, group: group))
|
417
595
|
client = true
|
418
596
|
else
|
419
597
|
data = { command: true, order: %i[path], styles: theme[:banner], border: theme[:border] }
|
420
598
|
end
|
421
|
-
if verbose
|
599
|
+
if verbose
|
422
600
|
out = []
|
423
601
|
out << cmd.sub(/^\S+/, &:upcase) if data[:command]
|
424
|
-
data[:order].each
|
602
|
+
data[:order].each do |val|
|
603
|
+
if val.is_a?(::Array)
|
604
|
+
s = ' '
|
605
|
+
found = false
|
606
|
+
val = val.map do |meth|
|
607
|
+
if meth.is_a?(::String)
|
608
|
+
s = ''
|
609
|
+
meth
|
610
|
+
elsif respond_to?(meth)
|
611
|
+
found = true
|
612
|
+
__send__(meth)
|
613
|
+
end
|
614
|
+
end
|
615
|
+
val = val.compact.join(s)
|
616
|
+
next unless found && !val.empty?
|
617
|
+
elsif (val = __send__(val)).nil?
|
618
|
+
next
|
619
|
+
end
|
620
|
+
out << val.to_s
|
621
|
+
end
|
425
622
|
print_banner(*out, styles: data[:styles], border: data[:border], client: client)
|
426
623
|
elsif multiple && workspace.series.multiple?
|
427
624
|
"## #{__send__(data[:order].first || :path)} ##"
|
@@ -432,8 +629,20 @@ module Squared
|
|
432
629
|
"#{msg}#{!always && (!obj || obj == 0 || obj.to_s.empty?) ? '' : message(hint: message(title, obj.to_s))}"
|
433
630
|
end
|
434
631
|
|
435
|
-
def
|
436
|
-
@session << (
|
632
|
+
def append_repeat(flag, opts)
|
633
|
+
opts.each { |val| @session << "--#{flag}=#{shell_escape(val, quote: true)}" }
|
634
|
+
end
|
635
|
+
|
636
|
+
def append_value(opts)
|
637
|
+
opts.each { |val| @session << val }
|
638
|
+
end
|
639
|
+
|
640
|
+
def append_nocolor(flag = nil)
|
641
|
+
@session << '--no-color' if flag || !ARG[:COLOR] || stdin?
|
642
|
+
end
|
643
|
+
|
644
|
+
def task_join(*val)
|
645
|
+
val.join(':')
|
437
646
|
end
|
438
647
|
|
439
648
|
def guard_params(action, flag, args: nil, key: nil, pat: nil)
|
@@ -450,22 +659,11 @@ module Squared
|
|
450
659
|
end
|
451
660
|
end
|
452
661
|
|
453
|
-
def store_pwd(done = nil)
|
454
|
-
if @pwd
|
455
|
-
Dir.chdir(@pwd)
|
456
|
-
@pwd = nil
|
457
|
-
elsif !done && Dir.pwd != path.to_s
|
458
|
-
@pwd = Dir.pwd
|
459
|
-
Dir.chdir(path)
|
460
|
-
@pwd
|
461
|
-
end
|
462
|
-
end
|
463
|
-
|
464
662
|
def semver(val)
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
663
|
+
return val if val[3]
|
664
|
+
|
665
|
+
val[3] = '.'
|
666
|
+
val[4] = '0'
|
469
667
|
unless val[1]
|
470
668
|
val[1] = '.'
|
471
669
|
val[2] = '0'
|
@@ -474,39 +672,122 @@ module Squared
|
|
474
672
|
end
|
475
673
|
|
476
674
|
def semmajor(cur, want)
|
477
|
-
cur[0] == '0' && want[0] == '0' ? cur[2] != want[2] : cur[0] != want[0]
|
675
|
+
(cur[0] == '0' && want[0] == '0' ? cur[2] != want[2] : cur[0] != want[0]) && !want[5]
|
478
676
|
end
|
479
677
|
|
480
|
-
def
|
481
|
-
|
678
|
+
def semscan(val)
|
679
|
+
val.scan(SEM_VER).first
|
482
680
|
end
|
483
681
|
|
484
|
-
def
|
485
|
-
|
486
|
-
|
682
|
+
def pwd_set(done = nil, &blk)
|
683
|
+
pwd = Pathname.pwd
|
684
|
+
if block_given?
|
685
|
+
if path == pwd
|
686
|
+
instance_eval(&blk)
|
687
|
+
else
|
688
|
+
Dir.chdir(path)
|
689
|
+
instance_eval(&blk)
|
690
|
+
Dir.chdir(pwd)
|
691
|
+
end
|
692
|
+
elsif @pwd == pwd
|
693
|
+
@pwd = nil
|
694
|
+
pwd unless done
|
695
|
+
elsif @pwd
|
696
|
+
return unless path == pwd
|
487
697
|
|
488
|
-
|
489
|
-
|
490
|
-
|
698
|
+
Dir.chdir(@pwd)
|
699
|
+
@pwd = nil
|
700
|
+
elsif !done && path != pwd
|
701
|
+
@pwd = pwd
|
702
|
+
Dir.chdir(path)
|
703
|
+
@pwd
|
704
|
+
end
|
705
|
+
end
|
491
706
|
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
707
|
+
def run_set(cmd, val = nil, opts: nil, **)
|
708
|
+
unless @output[1] == false && !@output[0].nil?
|
709
|
+
if opts == false
|
710
|
+
@output[1] = false
|
711
|
+
elsif opts && opts != true
|
712
|
+
@output[1] = opts
|
497
713
|
end
|
498
714
|
end
|
499
|
-
|
500
|
-
|
501
|
-
|
715
|
+
unless @output[2] == false
|
716
|
+
if val.is_a?(::Hash)
|
717
|
+
@output[2] = val
|
718
|
+
elsif val == false
|
719
|
+
@output[2] = false
|
720
|
+
end
|
721
|
+
end
|
722
|
+
@output[0] = cmd
|
723
|
+
end
|
724
|
+
|
725
|
+
def script_set(cmd, prod: nil, **)
|
726
|
+
return if @output[1] == false && @output[0].nil?
|
727
|
+
|
728
|
+
@output[0] = nil
|
729
|
+
@output[1] = if @global && cmd.is_a?(::Array)
|
730
|
+
cmd[prod == true ? 1 : 0]
|
731
|
+
else
|
732
|
+
cmd
|
733
|
+
end
|
734
|
+
end
|
735
|
+
|
736
|
+
def source_path?(val)
|
737
|
+
Pathname.new(val).absolute? ? val.to_s.start_with?(File.join(path, '')) : !val.to_s.match?(%r{^\.\.[/\\]})
|
738
|
+
end
|
739
|
+
|
740
|
+
def runnable?(val)
|
741
|
+
case val
|
742
|
+
when ::String
|
743
|
+
true
|
744
|
+
when ::Enumerable
|
745
|
+
!val.is_a?(::Hash)
|
746
|
+
else
|
747
|
+
false
|
748
|
+
end
|
749
|
+
end
|
750
|
+
|
751
|
+
def from_sync?(*val)
|
752
|
+
if invoked?(key = task_join(*val))
|
753
|
+
!workspace.task_defined?(key, 'sync')
|
754
|
+
elsif workspace.series.sync?(task_join(key, 'sync'))
|
755
|
+
true
|
502
756
|
end
|
503
|
-
|
504
|
-
|
505
|
-
|
757
|
+
end
|
758
|
+
|
759
|
+
def invoked_sync?(action, val = nil)
|
760
|
+
return true if !val.nil? || from_sync?(ac = workspace.task_name(action))
|
761
|
+
|
762
|
+
return val if group && !(val = from_sync?(ac, group)).nil?
|
763
|
+
return val if (base = workspace.find_base(self)) && !(val = from_sync?(ac, base.ref)).nil?
|
764
|
+
|
765
|
+
return true if invoked?(name, ac) && (!invoked?(ac) || !workspace.task_defined?(ac, 'sync'))
|
766
|
+
|
767
|
+
val = workspace.series.name_get(action)
|
768
|
+
val == action ? false : invoked_sync?(val)
|
769
|
+
end
|
770
|
+
|
771
|
+
def stdin?
|
772
|
+
pipe == 0
|
773
|
+
end
|
774
|
+
|
775
|
+
def warning?
|
776
|
+
workspace.warning
|
777
|
+
end
|
778
|
+
|
779
|
+
def borderstyle
|
780
|
+
if (data = workspace.banner_get(*@ref, group: group))
|
781
|
+
data[:border]
|
506
782
|
end
|
507
|
-
|
783
|
+
end
|
784
|
+
|
785
|
+
def scriptargs
|
786
|
+
{ target: script? ? @output[1] : @output[0], ref: ref, group: group, global: @global }
|
508
787
|
end
|
509
788
|
end
|
789
|
+
|
790
|
+
Application.base_project = Base
|
510
791
|
end
|
511
792
|
end
|
512
793
|
end
|