squared 0.7.4 → 0.7.6
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +124 -59
- data/README.md +11 -4
- data/lib/squared/common/base.rb +1 -0
- data/lib/squared/common/prompt.rb +1 -1
- data/lib/squared/common/shell.rb +10 -10
- data/lib/squared/common/system.rb +2 -1
- data/lib/squared/version.rb +1 -1
- data/lib/squared/workspace/application.rb +9 -6
- data/lib/squared/workspace/project/base.rb +28 -21
- data/lib/squared/workspace/project/docker.rb +21 -21
- data/lib/squared/workspace/project/git.rb +158 -125
- data/lib/squared/workspace/project/node.rb +154 -64
- data/lib/squared/workspace/project/python.rb +52 -24
- data/lib/squared/workspace/project/ruby.rb +69 -40
- data/lib/squared/workspace/project/support/optionpartition.rb +72 -34
- data/lib/squared/workspace/project/support/utils.rb +4 -6
- data/lib/squared/workspace/repo.rb +5 -4
- metadata +2 -2
|
@@ -578,9 +578,6 @@ module Squared
|
|
|
578
578
|
if s && (%w[system latest].include?(s) || SEM_VER.match?(s) || s.start_with?(/(path|ref):/))
|
|
579
579
|
rbvm = exist?(ver.last) && !exist?(ver.first)
|
|
580
580
|
case vmname
|
|
581
|
-
when nil
|
|
582
|
-
print_error('no version manager detected', subject: name)
|
|
583
|
-
next
|
|
584
581
|
when 'asdf'
|
|
585
582
|
unless rbvm
|
|
586
583
|
asdf(:set, **{ name: args.name, version: s, banner: verbose? }.compact)
|
|
@@ -596,24 +593,25 @@ module Squared
|
|
|
596
593
|
run(banner: verbose?)
|
|
597
594
|
next
|
|
598
595
|
end
|
|
596
|
+
when nil
|
|
597
|
+
print_error('no version manager detected', subject: name)
|
|
598
|
+
next
|
|
599
599
|
end
|
|
600
600
|
File.write(basepath(ver.last), "#{s}\n") if SEM_VER.match?(s)
|
|
601
601
|
next
|
|
602
602
|
end
|
|
603
603
|
pwd_set do
|
|
604
604
|
out = []
|
|
605
|
-
tool = args.name || (
|
|
606
|
-
trim = ->(
|
|
607
|
-
|
|
605
|
+
tool = args.name || (s && !SEM_VER.match?(s) ? s : 'ruby')
|
|
606
|
+
trim = ->(val) { val[/^\D+\d+\.\d+(?:\.\S+)?/, 0].sub(/^([a-z]+)-/i, '\1 ') }
|
|
607
|
+
vm, bin = vmname(bin: true)
|
|
608
|
+
out << trim.call(case vm
|
|
608
609
|
when 'rvm'
|
|
609
|
-
ver.shift
|
|
610
610
|
`rvm current`[/^\S+/, 0]
|
|
611
611
|
when 'rbenv'
|
|
612
|
-
ver.shift
|
|
613
612
|
name = `rbenv version-name`
|
|
614
613
|
(name =~ SEM_VER) == 0 ? "ruby #{name}" : name
|
|
615
614
|
when 'chruby'
|
|
616
|
-
ver.shift
|
|
617
615
|
chruby = session_output 'source', bin
|
|
618
616
|
`#{chruby.with('ruby --version')}`
|
|
619
617
|
when 'mise'
|
|
@@ -673,26 +671,53 @@ module Squared
|
|
|
673
671
|
log.debug e
|
|
674
672
|
end
|
|
675
673
|
if ver
|
|
676
|
-
|
|
674
|
+
if vm == 'mise'
|
|
675
|
+
ver = mise + ver
|
|
676
|
+
pat = /^\s*#{tool}\s*=\s*\[?(.+?)\]?\s*$/
|
|
677
|
+
elsif vm != 'asdf'
|
|
678
|
+
ver.shift
|
|
679
|
+
end
|
|
680
|
+
append = ->(file, hint) { out << message("found #{file}", hint: hint) }
|
|
677
681
|
catch :found do
|
|
678
682
|
path.ascend do |dir|
|
|
679
|
-
ver.
|
|
680
|
-
dir
|
|
681
|
-
file = File.read(dir)
|
|
683
|
+
ver.select { |val| dir.join(val).exist? }.each do |val|
|
|
684
|
+
file = dir + val
|
|
682
685
|
hint = if val.include?('mise')
|
|
683
|
-
|
|
684
|
-
line&.gsub(/["']/, '')
|
|
686
|
+
file.read[pat, 1]&.gsub(/["']/, '')
|
|
685
687
|
else
|
|
686
|
-
file.
|
|
688
|
+
file.read
|
|
689
|
+
.lines
|
|
687
690
|
.map { |line| line.sub(/#.*$/, '').strip }
|
|
688
691
|
.reject(&:empty?)
|
|
692
|
+
.yield_self do |data|
|
|
693
|
+
target = data.find { |line| line.include?(tool) }
|
|
694
|
+
target ? [target] : data
|
|
695
|
+
end
|
|
689
696
|
.join(', ')
|
|
690
697
|
end
|
|
691
|
-
|
|
692
|
-
|
|
698
|
+
append.call(file, hint)
|
|
699
|
+
if hint&.include?(out.first[/^(?:(?:j|truffle)?ruby|#{tool}) ([\d.]+)/, 1])
|
|
700
|
+
throw :found
|
|
701
|
+
end
|
|
693
702
|
rescue
|
|
694
703
|
nil
|
|
695
704
|
end
|
|
705
|
+
file = case vm
|
|
706
|
+
when 'rbenv'
|
|
707
|
+
'.rbenv/version'
|
|
708
|
+
when 'rvm'
|
|
709
|
+
'.rvm/config/default'
|
|
710
|
+
when 'mise'
|
|
711
|
+
'.config/mise/config.toml'
|
|
712
|
+
else
|
|
713
|
+
next
|
|
714
|
+
end
|
|
715
|
+
if File.exist?(file = dir.join(file))
|
|
716
|
+
hint = out.first.split(' ', 2).last
|
|
717
|
+
pat ||= SEM_VER
|
|
718
|
+
append.call(file, file.read[/^(.*(?:#{Regexp.escape(hint)}|#{pat}).*)$/, 1])
|
|
719
|
+
throw :found
|
|
720
|
+
end
|
|
696
721
|
end
|
|
697
722
|
end
|
|
698
723
|
end
|
|
@@ -714,7 +739,7 @@ module Squared
|
|
|
714
739
|
when 'mise'
|
|
715
740
|
cmd = session('mise', 'reshim', args.name || 'ruby')
|
|
716
741
|
else
|
|
717
|
-
print_error('not supported by version manager', subject: args.name)
|
|
742
|
+
print_error('reshim not supported by version manager', subject: args.name)
|
|
718
743
|
end
|
|
719
744
|
success?(run(banner: verbose?), verbose?) if cmd
|
|
720
745
|
end
|
|
@@ -821,7 +846,7 @@ module Squared
|
|
|
821
846
|
elsif se || ia || up
|
|
822
847
|
items = []
|
|
823
848
|
end
|
|
824
|
-
OptionPartition.new(opts, bundleopts(:outdated), cmd << "--#{flag}", project: self)
|
|
849
|
+
OptionPartition.new(opts, bundleopts(:outdated), cmd << "--#{flag}", project: self, strict: strict?)
|
|
825
850
|
.clear
|
|
826
851
|
elsif (up = option('u', 'update', prefix: 'bundle'))
|
|
827
852
|
flag = case up
|
|
@@ -892,7 +917,7 @@ module Squared
|
|
|
892
917
|
when '~>'
|
|
893
918
|
if c < v && cur[0] == val[0] && !semmajor?(cur, val)
|
|
894
919
|
styles[0] = :yellow
|
|
895
|
-
else
|
|
920
|
+
else
|
|
896
921
|
styles[1] = semmajor?(val, lat) ? :underline : :bold
|
|
897
922
|
end
|
|
898
923
|
end
|
|
@@ -982,8 +1007,8 @@ module Squared
|
|
|
982
1007
|
from = symjoin 'ruby', flag
|
|
983
1008
|
end
|
|
984
1009
|
opts = session_opts(with, args: args, kwargs: kwargs, pass: pass)
|
|
985
|
-
op = OptionPartition.new(opts, OPT_RUBY[:ruby], ruby_session, project: self,
|
|
986
|
-
stdin: true)
|
|
1010
|
+
op = OptionPartition.new(opts, OPT_RUBY[:ruby], ruby_session, project: self, strict: strict?,
|
|
1011
|
+
multiple: [/^-e/], args: true, stdin: true)
|
|
987
1012
|
if kwargs[:command]
|
|
988
1013
|
op << quote_option('e', kwargs[:command])
|
|
989
1014
|
elsif kwargs[:file]
|
|
@@ -1026,7 +1051,7 @@ module Squared
|
|
|
1026
1051
|
opts.concat(args)
|
|
1027
1052
|
end
|
|
1028
1053
|
op = OptionPartition.new(opts, gemopts(flag), gem_session(flag),
|
|
1029
|
-
project: self, no: OPT_GEM[:no][flag == :update ? :install : flag])
|
|
1054
|
+
project: self, strict: strict?, no: OPT_GEM[:no][flag == :update ? :install : flag])
|
|
1030
1055
|
from = symjoin 'gem', flag
|
|
1031
1056
|
if flag == :outdated
|
|
1032
1057
|
op.adjoin(gempwd, start: 0) if gempwd
|
|
@@ -1380,7 +1405,7 @@ module Squared
|
|
|
1380
1405
|
end
|
|
1381
1406
|
opts = session_opts(with, args: args, kwargs: kwargs, pass: pass)
|
|
1382
1407
|
invalid = ->(a) { raise_error ArgumentError, "unrecognized args: #{a.join(', ')}", hint: flag }
|
|
1383
|
-
cmd = bundle_session
|
|
1408
|
+
cmd = bundle_session flag
|
|
1384
1409
|
case flag
|
|
1385
1410
|
when :cache, :check, :clean, :init, :install, :lock, :pack, :package, :platform
|
|
1386
1411
|
pre = true
|
|
@@ -1426,7 +1451,8 @@ module Squared
|
|
|
1426
1451
|
flag
|
|
1427
1452
|
end),
|
|
1428
1453
|
cmd,
|
|
1429
|
-
project: self, no: OPT_BUNDLE[:no][flag],
|
|
1454
|
+
project: self, strict: strict?, no: OPT_BUNDLE[:no][flag],
|
|
1455
|
+
args: flag == :exec || flag == :config)
|
|
1430
1456
|
op.concat(args) unless pre
|
|
1431
1457
|
output = false
|
|
1432
1458
|
case flag
|
|
@@ -1437,7 +1463,7 @@ module Squared
|
|
|
1437
1463
|
a = op.dup
|
|
1438
1464
|
b, c = op.slice!(0, 2)
|
|
1439
1465
|
d = op.arg?('global', 'local')
|
|
1440
|
-
getname = -> { op <<
|
|
1466
|
+
getname = -> { b ? op << b : op.readline('Enter name') }
|
|
1441
1467
|
case pre
|
|
1442
1468
|
when 'get'
|
|
1443
1469
|
getname.call
|
|
@@ -1448,7 +1474,7 @@ module Squared
|
|
|
1448
1474
|
c = op.shift
|
|
1449
1475
|
end
|
|
1450
1476
|
getname.call
|
|
1451
|
-
op <<
|
|
1477
|
+
c ? op << c : op.readline('Enter value', quote: true)
|
|
1452
1478
|
output = true
|
|
1453
1479
|
when 'unset'
|
|
1454
1480
|
if d
|
|
@@ -1472,9 +1498,8 @@ module Squared
|
|
|
1472
1498
|
end
|
|
1473
1499
|
op.clear
|
|
1474
1500
|
else
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
output = val.start_with?('set', 'unset')
|
|
1501
|
+
output = op.readline('Enter arguments', 'list')
|
|
1502
|
+
.start_with?('set', 'unset')
|
|
1478
1503
|
end
|
|
1479
1504
|
when :plugin
|
|
1480
1505
|
case plu
|
|
@@ -1485,7 +1510,7 @@ module Squared
|
|
|
1485
1510
|
end
|
|
1486
1511
|
when :exec
|
|
1487
1512
|
if op.empty? || (op.remove(':') && op.append(quote: false))
|
|
1488
|
-
op
|
|
1513
|
+
op.readline('Enter arguments')
|
|
1489
1514
|
else
|
|
1490
1515
|
op.append(quote: false)
|
|
1491
1516
|
end
|
|
@@ -1509,7 +1534,7 @@ module Squared
|
|
|
1509
1534
|
|
|
1510
1535
|
def rake(*args, sync: true, banner: verbose?, with: nil, pass: PASS_RUBY[:rake], **kwargs)
|
|
1511
1536
|
opts = session_opts(with, args: args, kwargs: kwargs, pass: pass)
|
|
1512
|
-
op = OptionPartition.new(opts, OPT_RUBY[:rake], rake_session, project: self)
|
|
1537
|
+
op = OptionPartition.new(opts, OPT_RUBY[:rake], rake_session, project: self, strict: strict?)
|
|
1513
1538
|
op.adjoin(quote_option('f', rakefile)) if rakefile && !op.arg?('f', 'rakefile')
|
|
1514
1539
|
op.concat(args)
|
|
1515
1540
|
op.append(escape: true)
|
|
@@ -1535,11 +1560,11 @@ module Squared
|
|
|
1535
1560
|
break if val == '--'
|
|
1536
1561
|
next unless exist?(val, type: 'f')
|
|
1537
1562
|
|
|
1538
|
-
args[index] = shell_quote
|
|
1563
|
+
args[index] = shell_quote basepath(val)
|
|
1539
1564
|
cmd.merge(args.slice!(0, index + 1))
|
|
1540
1565
|
break
|
|
1541
1566
|
end
|
|
1542
|
-
op = OptionPartition.new(opts, OPT_RUBY[:rdbg], cmd, project: self, first: [/\.rb$/])
|
|
1567
|
+
op = OptionPartition.new(opts, OPT_RUBY[:rdbg], cmd, project: self, strict: strict?, first: [/\.rb$/])
|
|
1543
1568
|
op.concat(args)
|
|
1544
1569
|
op.append(quote: false, delim: true)
|
|
1545
1570
|
print_run(op, banner, **kwargs)
|
|
@@ -1555,7 +1580,7 @@ module Squared
|
|
|
1555
1580
|
end
|
|
1556
1581
|
opts = session_opts(with, args: args, kwargs: kwargs, pass: pass)
|
|
1557
1582
|
cmd, opts = rbs_session(opts: opts)
|
|
1558
|
-
op = OptionPartition.new(opts, [], cmd << flag, project: self)
|
|
1583
|
+
op = OptionPartition.new(opts, [], cmd << flag, project: self, strict: strict?)
|
|
1559
1584
|
case flag
|
|
1560
1585
|
when :prototype
|
|
1561
1586
|
sig = args.shift
|
|
@@ -1598,7 +1623,7 @@ module Squared
|
|
|
1598
1623
|
|
|
1599
1624
|
def rubocop(*args, sync: true, banner: verbose?, with: nil, pass: PASS_RUBY[:rubocop], **kwargs)
|
|
1600
1625
|
opts = session_opts(with, args: args, kwargs: kwargs, pass: pass)
|
|
1601
|
-
op = OptionPartition.new(opts, OPT_RUBY[:rubocop], session('rubocop'), project: self,
|
|
1626
|
+
op = OptionPartition.new(opts, OPT_RUBY[:rubocop], session('rubocop'), project: self, strict: strict?,
|
|
1602
1627
|
no: OPT_RUBY[:no][:rubocop])
|
|
1603
1628
|
if @rubocopfile && !op.arg?('c', 'config') && !rootpath('.rubocop.yml', ascend: true).exist?
|
|
1604
1629
|
op.add_path(@rubocopfile, option: 'c')
|
|
@@ -1620,6 +1645,9 @@ module Squared
|
|
|
1620
1645
|
|
|
1621
1646
|
def serve(root, *, bind: nil, port: 3000, **kwargs)
|
|
1622
1647
|
require 'webrick'
|
|
1648
|
+
rescue LoadError => e
|
|
1649
|
+
print_error(e, pass: true)
|
|
1650
|
+
else
|
|
1623
1651
|
config = kwargs.merge({ DocumentRoot: root })
|
|
1624
1652
|
config[:BindAddress] = bind if bind
|
|
1625
1653
|
config[:Port] = port if port
|
|
@@ -1773,7 +1801,7 @@ module Squared
|
|
|
1773
1801
|
parse.call(target.resolve_feature_path(gemname)&.last)
|
|
1774
1802
|
end
|
|
1775
1803
|
unless gemdir || pwd_set { parse.call(`#{bundle_output('show', gemname)}`) }
|
|
1776
|
-
|
|
1804
|
+
raise Errno::ENOENT, 'gems home'
|
|
1777
1805
|
end
|
|
1778
1806
|
end
|
|
1779
1807
|
rescue => e
|
|
@@ -1792,7 +1820,8 @@ module Squared
|
|
|
1792
1820
|
private
|
|
1793
1821
|
|
|
1794
1822
|
def run_repl(*args, opts:, banner:, from:, delim: true, **kwargs)
|
|
1795
|
-
op = OptionPartition.new(opts, OPT_RUBY[from], session(from), project: self,
|
|
1823
|
+
op = OptionPartition.new(opts, OPT_RUBY[from], session(from), project: self, strict: strict?,
|
|
1824
|
+
first: [/\.rb$/])
|
|
1796
1825
|
r = []
|
|
1797
1826
|
r << 'bundler/setup' if !op.arg?('r') && bundle_load
|
|
1798
1827
|
r.concat(Array(kwargs[:name])) if kwargs[:name]
|
|
@@ -1825,7 +1854,7 @@ module Squared
|
|
|
1825
1854
|
def rbs_session(*cmd, opts: nil)
|
|
1826
1855
|
return session('rbs', *cmd) unless opts
|
|
1827
1856
|
|
|
1828
|
-
op = OptionPartition.new(opts, OPT_RUBY[:rbs], project: self)
|
|
1857
|
+
op = OptionPartition.new(opts, OPT_RUBY[:rbs], project: self, strict: strict?)
|
|
1829
1858
|
[session('rbs', *op.to_a, *cmd), op.extras]
|
|
1830
1859
|
end
|
|
1831
1860
|
|
|
@@ -65,14 +65,14 @@ module Squared
|
|
|
65
65
|
ret
|
|
66
66
|
end
|
|
67
67
|
|
|
68
|
-
def clear(target, opts, pass: true, styles: nil, **kwargs)
|
|
68
|
+
def clear(target, opts, pass: true, strict: false, styles: nil, **kwargs)
|
|
69
69
|
return if opts.empty?
|
|
70
70
|
|
|
71
71
|
kwargs[:subject] ||= target.first.stripext
|
|
72
72
|
kwargs[:hint] ||= 'unrecognized'
|
|
73
73
|
append(target, opts, delim: true) if kwargs.delete(:append)
|
|
74
74
|
warn log_warn(opts.join(', '), pass: true, **kwargs)
|
|
75
|
-
exit 1 unless pass || confirm("Run? [#{sub_style(target, styles)}]", 'N')
|
|
75
|
+
exit 1 unless !strict && (pass || confirm("Run? [#{sub_style(target, styles)}]", 'N'))
|
|
76
76
|
end
|
|
77
77
|
|
|
78
78
|
def delete_key(target, *args, value: false, reverse: false, count: -1)
|
|
@@ -195,10 +195,12 @@ module Squared
|
|
|
195
195
|
def_delegator :@extras, :find_all, :detect_all
|
|
196
196
|
def_delegator :@extras, :find_index, :detect_index
|
|
197
197
|
|
|
198
|
-
def initialize(opts, list, target = JoinSet.new, project: nil, path: nil, sep: '=', **kwargs,
|
|
198
|
+
def initialize(opts, list, target = JoinSet.new, project: nil, path: nil, strict: false, sep: '=', **kwargs,
|
|
199
|
+
&blk)
|
|
199
200
|
@target = target.is_a?(Set) ? target : target.to_set
|
|
200
201
|
@project = project
|
|
201
202
|
@path = path || project&.path
|
|
203
|
+
@strict = strict
|
|
202
204
|
@sep = sep
|
|
203
205
|
@errors = []
|
|
204
206
|
@found = []
|
|
@@ -242,42 +244,51 @@ module Squared
|
|
|
242
244
|
end
|
|
243
245
|
if (n = val.index('='))
|
|
244
246
|
flag = val[0, n]
|
|
247
|
+
enum = flag.split(':')
|
|
248
|
+
mod = if enum.size > 1
|
|
249
|
+
pre = enum.shift
|
|
250
|
+
enum.map { |s| "#{pre}:#{s}" }
|
|
251
|
+
else
|
|
252
|
+
[flag]
|
|
253
|
+
end
|
|
245
254
|
case val[n.succ]
|
|
246
255
|
when 'e'
|
|
247
|
-
e
|
|
256
|
+
e.concat(mod)
|
|
248
257
|
when 'b'
|
|
249
|
-
b
|
|
258
|
+
b.concat(mod)
|
|
250
259
|
when 'm'
|
|
251
|
-
m
|
|
260
|
+
m.concat(mod)
|
|
252
261
|
when 'q'
|
|
253
|
-
qq
|
|
254
|
-
q
|
|
262
|
+
qq.concat(mod) if val[n + 2] == 'q'
|
|
263
|
+
q.concat(mod)
|
|
255
264
|
when 'p'
|
|
256
|
-
p
|
|
265
|
+
p.concat(mod)
|
|
257
266
|
when 'i'
|
|
258
|
-
i
|
|
267
|
+
i.concat(mod)
|
|
259
268
|
when 'f'
|
|
260
|
-
f
|
|
269
|
+
f.concat(mod)
|
|
261
270
|
when 'n'
|
|
262
|
-
si
|
|
271
|
+
si.concat(mod)
|
|
263
272
|
when 'v'
|
|
264
|
-
@values
|
|
273
|
+
@values.concat(mod.map { |s| Regexp.escape(s) })
|
|
265
274
|
when '!'
|
|
266
|
-
bl
|
|
275
|
+
bl.concat(mod)
|
|
267
276
|
when '+'
|
|
268
|
-
ml
|
|
269
|
-
bare
|
|
277
|
+
ml.concat(mod)
|
|
278
|
+
bare.concat(mod)
|
|
270
279
|
else
|
|
271
280
|
next
|
|
272
281
|
end
|
|
273
|
-
m
|
|
274
|
-
bare
|
|
275
|
-
val = flag
|
|
282
|
+
m.concat(mod) if val[n + 2] == 'm'
|
|
283
|
+
bare.concat(mod) if val.end_with?('?')
|
|
276
284
|
else
|
|
277
285
|
bare << val
|
|
286
|
+
mod = [val]
|
|
287
|
+
end
|
|
288
|
+
mod.each do |key|
|
|
289
|
+
sw[key] = op1 if op1
|
|
290
|
+
se[key] = op2 if op2
|
|
278
291
|
end
|
|
279
|
-
sw[val] = op1 if op1
|
|
280
|
-
se[val] = op2 if op2
|
|
281
292
|
end
|
|
282
293
|
no = (no || []).map { |val| (n = val.index('=')) ? val[0, n] : val }
|
|
283
294
|
bare.concat(no)
|
|
@@ -337,14 +348,18 @@ module Squared
|
|
|
337
348
|
if opt =~ OPT_VALUE
|
|
338
349
|
key = $1
|
|
339
350
|
val = $2
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
351
|
+
has = lambda do |a|
|
|
352
|
+
return true if a.include?(key)
|
|
353
|
+
return false unless (k = a.find { |s| s.end_with?(':*') })
|
|
354
|
+
|
|
355
|
+
key.start_with?(k.chomp('*')) && !key.end_with?(':')
|
|
356
|
+
end
|
|
357
|
+
kwargs = { sep: se[key] || sep, merge: has.call(m), switch: sw[key] }
|
|
358
|
+
if has.call(e) || (has.call(bl) && %w[true false].include?(val))
|
|
344
359
|
add shell_option(key, val, **kwargs)
|
|
345
|
-
elsif
|
|
346
|
-
add quote_option(key, val, double:
|
|
347
|
-
elsif
|
|
360
|
+
elsif has.call(q)
|
|
361
|
+
add quote_option(key, val, double: has.call(qq), **kwargs)
|
|
362
|
+
elsif has.call(p)
|
|
348
363
|
if val.match?(/\A(["']).+\1\z/)
|
|
349
364
|
add shell_option(key, val, escape: false, **kwargs)
|
|
350
365
|
elsif path
|
|
@@ -352,7 +367,7 @@ module Squared
|
|
|
352
367
|
else
|
|
353
368
|
push opt
|
|
354
369
|
end
|
|
355
|
-
elsif
|
|
370
|
+
elsif kwargs[:merge] || has.call(b) || numcheck.call(key, val) || se[key] || sw[key]
|
|
356
371
|
add basic_option(key, val, **kwargs)
|
|
357
372
|
else
|
|
358
373
|
push opt
|
|
@@ -380,8 +395,8 @@ module Squared
|
|
|
380
395
|
self
|
|
381
396
|
end
|
|
382
397
|
|
|
383
|
-
def append(*args, **kwargs, &blk)
|
|
384
|
-
args = extras if args.empty?
|
|
398
|
+
def append(*args, clear: false, **kwargs, &blk)
|
|
399
|
+
args = clear ? extras.dup.tap { extras.clear } : extras if args.empty?
|
|
385
400
|
pass = kwargs[:pass] ||= []
|
|
386
401
|
OptionPartition.append(target, *args, **kwargs, &blk)
|
|
387
402
|
errors.concat(pass)
|
|
@@ -459,15 +474,15 @@ module Squared
|
|
|
459
474
|
list.reject { |val| ignore.include?(s = nameonly(val)) || any?(OptionPartition.send(:matchopt, s)) }
|
|
460
475
|
end
|
|
461
476
|
|
|
462
|
-
def clear(opts = nil, errors: false, **kwargs)
|
|
477
|
+
def clear(opts = nil, errors: false, strict: @strict, **kwargs)
|
|
463
478
|
styles = project.theme[:inline] if project
|
|
464
479
|
if errors
|
|
465
|
-
OptionPartition.clear(target, @errors, styles: styles, **kwargs)
|
|
480
|
+
OptionPartition.clear(target, @errors, strict: strict, styles: styles, **kwargs)
|
|
466
481
|
@errors.clear
|
|
467
482
|
return self unless opts
|
|
468
483
|
end
|
|
469
484
|
opts ||= extras
|
|
470
|
-
OptionPartition.clear(target, opts - found, styles: styles, **kwargs)
|
|
485
|
+
OptionPartition.clear(target, opts - found, strict: strict, styles: styles, **kwargs)
|
|
471
486
|
opts.clear
|
|
472
487
|
self
|
|
473
488
|
end
|
|
@@ -641,6 +656,29 @@ module Squared
|
|
|
641
656
|
self
|
|
642
657
|
end
|
|
643
658
|
|
|
659
|
+
def readline(msg, fallback = nil, option: nil, quote: false, force: true, double: false)
|
|
660
|
+
begin
|
|
661
|
+
require 'readline' unless defined?(Readline)
|
|
662
|
+
ret = Readline.readline("#{msg}#{force ? ':' : '?'} ", false).strip
|
|
663
|
+
rescue LoadError
|
|
664
|
+
raise unless (ret = fallback) || !force
|
|
665
|
+
rescue Interrupt
|
|
666
|
+
exit(force ? 1 : 0)
|
|
667
|
+
else
|
|
668
|
+
exit 1 if ret.empty? && !(ret = fallback) && force
|
|
669
|
+
end
|
|
670
|
+
return unless ret
|
|
671
|
+
|
|
672
|
+
if option
|
|
673
|
+
add quote_option(option, ret, double: double)
|
|
674
|
+
elsif quote
|
|
675
|
+
add shell_quote(ret, option: false, double: double)
|
|
676
|
+
else
|
|
677
|
+
add ret
|
|
678
|
+
end
|
|
679
|
+
ret
|
|
680
|
+
end
|
|
681
|
+
|
|
644
682
|
def reset(errors: false)
|
|
645
683
|
extras.clear
|
|
646
684
|
found.clear
|
|
@@ -8,12 +8,10 @@ module Squared
|
|
|
8
8
|
private
|
|
9
9
|
|
|
10
10
|
def rand_s(size)
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
(0...size).map { rand(97..122).chr }.join
|
|
16
|
-
end
|
|
11
|
+
require 'random/formatter'
|
|
12
|
+
Random.new.alphanumeric(size)
|
|
13
|
+
rescue LoadError
|
|
14
|
+
(0...size).map { rand(97..122).chr }.join
|
|
17
15
|
end
|
|
18
16
|
|
|
19
17
|
def merge_list(target, list)
|
|
@@ -47,8 +47,8 @@ module Squared
|
|
|
47
47
|
envargs = name ? { suffix: name.upcase, strict: true } : {}
|
|
48
48
|
data = scriptobj
|
|
49
49
|
if repo?
|
|
50
|
-
env('REPO_GROUP', **envargs) { |
|
|
51
|
-
env('REPO_REF', **envargs) { |
|
|
50
|
+
env('REPO_GROUP', **envargs) { |s| group = split_escape(s) }
|
|
51
|
+
env('REPO_REF', **envargs) { |s| ref = split_escape(s) }
|
|
52
52
|
data[:dev] = env_match('REPO_DEV', dev, **envargs)
|
|
53
53
|
data[:prod] = env_match('REPO_PROD', prod, **envargs)
|
|
54
54
|
@warning = env_match('REPO_WARN', @warning && !root?(@root, pass: ['.repo'])) != false unless name
|
|
@@ -76,7 +76,7 @@ module Squared
|
|
|
76
76
|
sc
|
|
77
77
|
end
|
|
78
78
|
end
|
|
79
|
-
data[:args] = env('REPO_SCRIPT', **envargs) { |
|
|
79
|
+
data[:args] = env('REPO_SCRIPT', **envargs) { |s| shell_split(s, join: true) } || args
|
|
80
80
|
global[:script] = true
|
|
81
81
|
else
|
|
82
82
|
ru ||= sc
|
|
@@ -207,7 +207,8 @@ module Squared
|
|
|
207
207
|
opts = if stage == 'init'
|
|
208
208
|
[]
|
|
209
209
|
else
|
|
210
|
-
|
|
210
|
+
raise 'repo not initialized' unless branch
|
|
211
|
+
|
|
211
212
|
repo_opts
|
|
212
213
|
end
|
|
213
214
|
args.to_a.each do |val|
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: squared
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.7.
|
|
4
|
+
version: 0.7.6
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- An Pham
|
|
@@ -125,7 +125,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
125
125
|
- !ruby/object:Gem::Version
|
|
126
126
|
version: '0'
|
|
127
127
|
requirements: []
|
|
128
|
-
rubygems_version: 4.0.
|
|
128
|
+
rubygems_version: 4.0.11
|
|
129
129
|
specification_version: 4
|
|
130
130
|
summary: Rake task generator for managing multi-language workspaces.
|
|
131
131
|
test_files: []
|