squared 0.5.20 → 0.6.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +87 -157
- data/README.md +104 -72
- data/lib/squared/common/base.rb +1 -22
- data/lib/squared/common/format.rb +40 -34
- data/lib/squared/common/prompt.rb +57 -35
- data/lib/squared/common/shell.rb +71 -56
- data/lib/squared/common/system.rb +69 -36
- data/lib/squared/common/utils.rb +29 -6
- data/lib/squared/config.rb +27 -34
- data/lib/squared/version.rb +1 -1
- data/lib/squared/workspace/application.rb +85 -86
- data/lib/squared/workspace/project/base.rb +538 -394
- data/lib/squared/workspace/project/docker.rb +393 -289
- data/lib/squared/workspace/project/git.rb +350 -339
- data/lib/squared/workspace/project/node.rb +499 -274
- data/lib/squared/workspace/project/python.rb +370 -241
- data/lib/squared/workspace/project/ruby.rb +683 -386
- data/lib/squared/workspace/project/support/class.rb +208 -205
- data/lib/squared/workspace/repo.rb +46 -43
- data/lib/squared/workspace/series.rb +13 -21
- data/lib/squared/workspace/support/base.rb +3 -24
- data/lib/squared/workspace/support/variables.rb +48 -0
- data/lib/squared/workspace/support.rb +1 -1
- data/lib/squared/workspace.rb +4 -6
- metadata +3 -3
- data/lib/squared/workspace/support/data.rb +0 -11
|
@@ -5,6 +5,7 @@ module Squared
|
|
|
5
5
|
module Project
|
|
6
6
|
class Ruby < Git
|
|
7
7
|
GEMFILE = %w[Gemfile Gemfile.lock gem.deps.rb gems.rb Isolate].freeze
|
|
8
|
+
GEMNAME = /\A[A-Za-z\d][A-Za-z\d_.-]*\z/.freeze
|
|
8
9
|
DIR_RUBY = (GEMFILE + Rake::Application::DEFAULT_RAKEFILES + ['README.rdoc']).freeze
|
|
9
10
|
OPT_RUBY = {
|
|
10
11
|
ruby: %w[0=im? a c C=pm e=q E=bm F=qm i=bm? I=pm l n p r=bm s S w W=bm? x=pm? d|debug jit rjit verbose
|
|
@@ -12,8 +13,9 @@ module Squared
|
|
|
12
13
|
internal-encoding=b parser=b].freeze,
|
|
13
14
|
rake: %w[A|all B|build-all comments n|dry-run m|multitask P|prereqs q|quiet X|no-deprecation-warnings
|
|
14
15
|
N|no-search G|no-system nosearch nosystem rules s|silent g|system v|verbose backtrace=b?
|
|
15
|
-
D|describe=q? e|execute=q E|execute-continue=q p|execute-print=q job-stats=b? j|jobs=i?
|
|
16
|
-
R|rakelib=p rakelibdir=p r|require=b suppress-backtrace=q T|tasks=q? t|trace=b?
|
|
16
|
+
D|describe=q? e|execute=q E|execute-continue=q p|execute-print=q f|rakefile=p job-stats=b? j|jobs=i?
|
|
17
|
+
I|libdir=p R|rakelib=p rakelibdir=p r|require=b suppress-backtrace=q T|tasks=q? t|trace=b?
|
|
18
|
+
W|where=q?].freeze,
|
|
17
19
|
irb: %w[d f U w E=b I=p r=b W=im? autocomplete colorize echo echo-on-assignment extra-doc-dir inf-ruby-mode
|
|
18
20
|
inspect multiline no-pager noautocomplete nocolorize noecho noecho-on-assignment noinspect
|
|
19
21
|
nomultiline noprompt noscript nosingleline noverbose regexp-completor sample-book-mode script
|
|
@@ -22,54 +24,127 @@ module Squared
|
|
|
22
24
|
}.freeze
|
|
23
25
|
OPT_BUNDLE = {
|
|
24
26
|
common: %w[no-color V|verbose r|retry=i].freeze,
|
|
27
|
+
common_all: %w[all all-platforms path=p].freeze,
|
|
28
|
+
common_git: %w[branch=q git=q path=p ref=q].freeze,
|
|
29
|
+
add: %w[optimistic quiet skip-install strict github=q glob=q g|group=q require=q s|source=q
|
|
30
|
+
v|version=q].freeze,
|
|
31
|
+
binstubs: %w[force standalone shebang=q].freeze,
|
|
32
|
+
cache: %w[frozen no-all no-install no-prune quiet cache-path=p gemfile=p].freeze,
|
|
33
|
+
check: %w[dry-run gemfile=p path=p].freeze,
|
|
34
|
+
clean: %w[dry-run force].freeze,
|
|
35
|
+
config: %w[global local].freeze,
|
|
36
|
+
doctor: %w[quiet gemfile=p].freeze,
|
|
37
|
+
exec: %w[gemfile=p].freeze,
|
|
38
|
+
gem: %w[b|bin git no-exe rubocop ci=b e|edit=p? ext=b github-username=q linter=b t|test=b?].freeze,
|
|
39
|
+
init: %w[gemfile=p gemspec=p].freeze,
|
|
25
40
|
install: %w[frozen no-cache no-prune system binstubs=p? path=p standalone=q? target-rbconfig=p trust-policy=b
|
|
26
41
|
with=q without=q].freeze,
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
42
|
+
install_a: %w[force full-index quiet redownload gemfile=p j|jobs=i].freeze,
|
|
43
|
+
lock: %w[add-checksums conservative full-index local major minor normalize-platforms patch pre print strict
|
|
44
|
+
add-platform=q bundler=b? gemfile=p lockfile=p remove-platform=p update=q?].freeze,
|
|
45
|
+
open: %w[path=p].freeze,
|
|
46
|
+
outdated: %w[filter-major filter-minor filter-patch groups local parseable pre only-explicit strict
|
|
47
|
+
update-strict group=q source=q].freeze,
|
|
48
|
+
platform: %w[ruby].freeze,
|
|
49
|
+
plugin: %w[source=q version=q].freeze,
|
|
50
|
+
remove: %w[install].freeze,
|
|
51
|
+
show: %w[outdated paths].freeze,
|
|
52
|
+
update: %w[all conservative local major minor patch pre ruby strict bundler=b? g|group=q source=q].freeze,
|
|
53
|
+
no: {
|
|
54
|
+
gem: %w[changelog ci coc linter mit test].freeze
|
|
55
|
+
}.freeze
|
|
34
56
|
}.freeze
|
|
35
57
|
OPT_GEM = {
|
|
36
58
|
common: %w[backtrace debug q|quiet no-verbose norc silent V|verbose config-file=p].freeze,
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
s|source=q target-rbconfig=p? P|trust-policy=b without=q].freeze,
|
|
42
|
-
update: %w[system=b?].freeze,
|
|
43
|
-
uninstall: %w[a D I x vendor n|bindir=p i|install-dir=p platform=b v|version=q].freeze,
|
|
44
|
-
outdated: %w[b|both clear-sources l|local r|remote B|bulk-threshold=i p|http-proxy=q? platform=q
|
|
45
|
-
source=q].freeze,
|
|
46
|
-
push: %w[attestation=p host=q p|http-proxy=q? k|key=b otp=b].freeze,
|
|
59
|
+
common_url: %w[B|bulk-threshold=i p|http-proxy=q? s|source=q].freeze,
|
|
60
|
+
common_domain: %w[b|both clear-sources l|local r|remote].freeze,
|
|
61
|
+
common_otp: %w[host=q k|key=b otp=b].freeze,
|
|
62
|
+
common_all: %w[a|all e|exact v|version=q].freeze,
|
|
47
63
|
build: %w[C=p force strict o|output=p platform=q].freeze,
|
|
64
|
+
cert: %w[a|add=p b|build=q C|certificate=p d|days=i l|list=q A|key-algorithm=b K|private-key=p r|remove=q
|
|
65
|
+
R|re-sign s|sign=p].freeze,
|
|
66
|
+
check: %w[a v|version=q].freeze,
|
|
67
|
+
cleanup: %w[n d|dry-run].freeze,
|
|
68
|
+
contents: %w[l all s|spec-dir=p v|version=q].freeze,
|
|
69
|
+
dependency: %w[R pipe platform=q v|version=q].freeze,
|
|
48
70
|
exec: %w[conservative g|gem=b v|version=q].freeze,
|
|
71
|
+
fetch: %w[clear-sources platform=q v|version=q].freeze,
|
|
72
|
+
generate_index: %w[update d|directory=p].freeze,
|
|
73
|
+
info: %w[i I].freeze,
|
|
74
|
+
install: %w[v|version=q].freeze,
|
|
75
|
+
install_a: %w[E f w conservative default development development-all explain ignore-dependencies N|no-document
|
|
76
|
+
vendor n|bindir=p build-root=p document=b? g|file=p? i|install-dir=p platform=q
|
|
77
|
+
target-rbconfig=p? P|trust-policy=b without=b].freeze,
|
|
78
|
+
list: %w[d i I].freeze,
|
|
79
|
+
lock: %w[s].freeze,
|
|
80
|
+
open: %w[e|editor=p v|version=q].freeze,
|
|
81
|
+
outdated: %w[C=p platform=q].freeze,
|
|
82
|
+
owner: %w[a|add=q r|remove=q p|http-proxy=q?].freeze,
|
|
49
83
|
pristine: %w[E all only-executables only-missing-extensions only-plugins n|bindir=p i|install-dir=p skip=b
|
|
50
84
|
v|version=q].freeze,
|
|
85
|
+
push: %w[attestation=p p|http-proxy=q?].freeze,
|
|
86
|
+
rdoc: %w[all v|version=q].freeze,
|
|
87
|
+
rebuild: %w[C=p diff force strict gemspec=p original=p source=q].freeze,
|
|
88
|
+
search: %w[d i I].freeze,
|
|
89
|
+
signin: %w[otp=b host=q].freeze,
|
|
90
|
+
sources: %w[f c|clear-all l|list u|update a|add=q p|http-proxy=q? r|remove=q].freeze,
|
|
91
|
+
specification: %w[all marshal ruby yaml platform=q v|version=q].freeze,
|
|
92
|
+
uninstall: %w[a D I x vendor n|bindir=p i|install-dir=p platform=q v|version=q].freeze,
|
|
93
|
+
unpack: %w[spec target=p P|trust-policy=b v|version=q],
|
|
94
|
+
update: %w[system=b?].freeze,
|
|
95
|
+
which: %w[a g].freeze,
|
|
96
|
+
yank: %w[platform=q v|version=q].freeze,
|
|
51
97
|
no: {
|
|
98
|
+
check: %w[alien doctor dry-run gems].freeze,
|
|
99
|
+
cleanup: %w[check-development user-install].freeze,
|
|
100
|
+
contents: %w[lib-only prefix show-install-dir].freeze,
|
|
101
|
+
dependency: %w[http-proxy reverse-dependencies].freeze,
|
|
102
|
+
exec: %w[prerelease].freeze,
|
|
103
|
+
fetch: %w[http-proxy prerelease suggestions].freeze,
|
|
104
|
+
generate_index: %w[compact modern].freeze,
|
|
105
|
+
info: %w[http-proxy installed prerelease versions].freeze,
|
|
52
106
|
install: %w[env-shebang force format-executable http-proxy lock minimal-deps post-install-message prerelease
|
|
53
107
|
suggestions user-install wrappers].freeze,
|
|
54
|
-
|
|
55
|
-
|
|
108
|
+
list: %w[details http-proxy installed prerelease versions].freeze,
|
|
109
|
+
lock: %w[strict].freeze,
|
|
56
110
|
outdated: %w[http-proxy].freeze,
|
|
111
|
+
owner: %w[http-proxy].freeze,
|
|
112
|
+
pristine: %w[env-shebang extensions].freeze,
|
|
57
113
|
push: %w[http-proxy].freeze,
|
|
58
|
-
|
|
59
|
-
|
|
114
|
+
rdoc: %w[overwrite rdoc ri].freeze,
|
|
115
|
+
search: %w[details http-proxy installed prerelease versions].freeze,
|
|
116
|
+
sources: %w[force http-proxy].freeze,
|
|
117
|
+
specification: %w[prerelease].freeze,
|
|
118
|
+
uninstall: %w[abort-on-dependent all check-development executables force format-executable
|
|
119
|
+
ignore-dependencies user-install].freeze,
|
|
120
|
+
which: %w[all gems-first].freeze
|
|
60
121
|
}.freeze
|
|
61
122
|
}.freeze
|
|
62
|
-
|
|
123
|
+
PASS_RUBY = {
|
|
124
|
+
ruby: %w[I disable enable dump r s].freeze,
|
|
125
|
+
rake: %w[I libdir r require].freeze,
|
|
126
|
+
irb: %w[I r].freeze,
|
|
127
|
+
gem: {
|
|
128
|
+
contents: %w[s spec-dir].freeze,
|
|
129
|
+
dependency: %w[s source].freeze,
|
|
130
|
+
install: %w[document s source without].freeze,
|
|
131
|
+
pristine: %w[skip].freeze
|
|
132
|
+
}.freeze,
|
|
133
|
+
bundle: {
|
|
134
|
+
install: %w[standalone with without].freeze,
|
|
135
|
+
lock: %w[add-platform remove-platform update].freeze,
|
|
136
|
+
update: %w[g group source].freeze
|
|
137
|
+
}.freeze
|
|
138
|
+
}.freeze
|
|
139
|
+
private_constant :GEMFILE, :GEMNAME, :DIR_RUBY, :OPT_RUBY, :OPT_BUNDLE, :OPT_GEM, :PASS_RUBY
|
|
63
140
|
|
|
64
141
|
class << self
|
|
65
|
-
def populate(*); end
|
|
66
|
-
|
|
67
142
|
def tasks
|
|
68
143
|
[:outdated].freeze
|
|
69
144
|
end
|
|
70
145
|
|
|
71
146
|
def bannerargs
|
|
72
|
-
%i[dependfile gemname
|
|
147
|
+
%i[dependfile gemname].freeze
|
|
73
148
|
end
|
|
74
149
|
|
|
75
150
|
def config?(val)
|
|
@@ -80,21 +155,14 @@ module Squared
|
|
|
80
155
|
end
|
|
81
156
|
|
|
82
157
|
subtasks({
|
|
83
|
-
'install' => %i[redownload local prefer-local].freeze,
|
|
84
|
-
'update' => %i[patch minor major all].freeze,
|
|
85
158
|
'outdated' => %i[patch minor major].freeze,
|
|
86
|
-
'gem' => %i[install uninstall update pristine outdated build push exec].freeze,
|
|
87
159
|
'ruby' => %i[file script version].freeze,
|
|
88
|
-
'
|
|
89
|
-
'
|
|
90
|
-
'config' => nil,
|
|
91
|
-
'check' => nil,
|
|
160
|
+
'gem' => %i[install uninstall outdated update pristine build push exec command].freeze,
|
|
161
|
+
'bundle' => %i[install update cache exec config reinstall command].freeze,
|
|
92
162
|
'rake' => nil,
|
|
93
163
|
'irb' => nil
|
|
94
164
|
})
|
|
95
165
|
|
|
96
|
-
attr_reader :gemdir
|
|
97
|
-
|
|
98
166
|
def initialize(*, autodetect: false, gemspec: nil, asdf: 'ruby', **kwargs)
|
|
99
167
|
super
|
|
100
168
|
if @pass.include?(Ruby.ref)
|
|
@@ -111,7 +179,7 @@ module Squared
|
|
|
111
179
|
elsif gemspec
|
|
112
180
|
basepath(gemspec.include?('.') ? gemspec : "#{gemspec}.gemspec")
|
|
113
181
|
end
|
|
114
|
-
return
|
|
182
|
+
return unless rakefile && @output[0].nil? && @copy.nil? && !version && !@autodetect
|
|
115
183
|
|
|
116
184
|
begin
|
|
117
185
|
File.foreach(rakefile) do |line|
|
|
@@ -128,14 +196,6 @@ module Squared
|
|
|
128
196
|
end
|
|
129
197
|
end
|
|
130
198
|
|
|
131
|
-
def gemdir=(val)
|
|
132
|
-
@gemdir = if val.is_a?(Pathname)
|
|
133
|
-
val
|
|
134
|
-
else
|
|
135
|
-
Pathname.new(val).realdirpath rescue nil
|
|
136
|
-
end
|
|
137
|
-
end
|
|
138
|
-
|
|
139
199
|
def ref
|
|
140
200
|
Ruby.ref
|
|
141
201
|
end
|
|
@@ -156,16 +216,15 @@ module Squared
|
|
|
156
216
|
format_desc action, nil, "task+,opts*|#{indexchar}index+|#,pattern*"
|
|
157
217
|
task action, [:command] do |_, args|
|
|
158
218
|
if args.command == '#'
|
|
159
|
-
format_list(raketasks, "rake[#{indexchar}N]", 'tasks', grep: args.extras, from: rakefile,
|
|
160
|
-
each: ->(val) { val[0] + val[1].to_s })
|
|
219
|
+
format_list(raketasks, "rake[#{indexchar}N]", 'tasks', grep: args.extras, from: rakefile, &:join)
|
|
161
220
|
else
|
|
162
|
-
|
|
163
|
-
if
|
|
164
|
-
rake(opts: opts)
|
|
221
|
+
items, opts = args.to_a.partition { |val| indexitem(val) }
|
|
222
|
+
if items.empty?
|
|
223
|
+
rake(banner: true, opts: opts)
|
|
165
224
|
else
|
|
166
225
|
tasks = raketasks
|
|
167
|
-
while (n, pre = indexitem(
|
|
168
|
-
if (item = tasks[n
|
|
226
|
+
while (n, pre = indexitem(items.shift))
|
|
227
|
+
if (item = tasks[n.pred])
|
|
169
228
|
cmd = pre ? "#{pre} #{item.first}" : item.first
|
|
170
229
|
elsif exception
|
|
171
230
|
indexerror n, tasks
|
|
@@ -174,9 +233,9 @@ module Squared
|
|
|
174
233
|
next
|
|
175
234
|
end
|
|
176
235
|
if opts.empty?
|
|
177
|
-
rake
|
|
236
|
+
rake(cmd, banner: true)
|
|
178
237
|
else
|
|
179
|
-
rake(cmd +
|
|
238
|
+
rake(cmd + "[#{opts.join(',')}]", banner: true)
|
|
180
239
|
opts.clear
|
|
181
240
|
end
|
|
182
241
|
end
|
|
@@ -186,42 +245,39 @@ module Squared
|
|
|
186
245
|
when 'irb'
|
|
187
246
|
format_desc action, nil, 'opts*,args*|:'
|
|
188
247
|
task action do |_, args|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
else
|
|
194
|
-
format_desc(action, nil, 'opts*', before: case action
|
|
195
|
-
when 'cache', 'check' then nil
|
|
196
|
-
else 'command+'
|
|
197
|
-
end)
|
|
198
|
-
task action do |_, args|
|
|
199
|
-
bundle(action, *args.to_a)
|
|
248
|
+
opts = args.to_a
|
|
249
|
+
args = Array(opts.delete(':') && readline('Enter file [arguments]', force: false))
|
|
250
|
+
name = gemname if gemlib.any? { |file| exist?(file, "#{gemname}.rb") }
|
|
251
|
+
irb(*args, opts: opts, name: name, verbose: false)
|
|
200
252
|
end
|
|
201
253
|
end
|
|
202
254
|
else
|
|
203
255
|
namespace action do
|
|
204
256
|
flags.each do |flag|
|
|
205
257
|
case action
|
|
206
|
-
when '
|
|
207
|
-
format_desc action, flag, 'opts*'
|
|
258
|
+
when 'outdated'
|
|
259
|
+
format_desc action, flag, 's/elect?,u/pdate?,opts*'
|
|
208
260
|
task flag do |_, args|
|
|
209
261
|
__send__ action, flag, args.to_a
|
|
210
262
|
end
|
|
211
263
|
when 'gem'
|
|
212
264
|
case flag
|
|
213
265
|
when :outdated
|
|
214
|
-
format_desc action, flag, 'major|minor|patch
|
|
266
|
+
format_desc action, flag, 'semver?=major|minor|patch,i/nteractive?,s/elect?,u/pdate?,opts*'
|
|
215
267
|
task flag, [:semver] do |_, args|
|
|
216
|
-
case (
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
268
|
+
opts = case (semver = args.semver)
|
|
269
|
+
when 'major', 'minor', 'patch'
|
|
270
|
+
args.extras
|
|
271
|
+
else
|
|
272
|
+
semver = nil
|
|
273
|
+
args.to_a
|
|
274
|
+
end
|
|
275
|
+
gem(flag, opts: opts, banner: true, filter: {
|
|
276
|
+
semver: semver,
|
|
277
|
+
update: opts.delete('u') || opts.delete('update'),
|
|
278
|
+
interactive: opts.delete('i') || opts.delete('interactive'),
|
|
279
|
+
select: opts.delete('s') || opts.delete('select')
|
|
280
|
+
})
|
|
225
281
|
end
|
|
226
282
|
when :build, :push, :exec, :update
|
|
227
283
|
format_desc(action, flag, 'opts*', after: case flag
|
|
@@ -230,13 +286,60 @@ module Squared
|
|
|
230
286
|
when :update then 'name*'
|
|
231
287
|
end)
|
|
232
288
|
task flag do |_, args|
|
|
233
|
-
gem
|
|
289
|
+
gem(flag, opts: args.to_a, banner: true)
|
|
234
290
|
end
|
|
235
|
-
|
|
291
|
+
when :install, :uninstall, :pristine
|
|
236
292
|
format_desc(action, flag, 'opts*', after: flag == :pristine ? 'name*|name?@version' : 'name*')
|
|
237
293
|
task flag do |_, args|
|
|
238
|
-
|
|
239
|
-
gem
|
|
294
|
+
opts = param_guard(action, flag, args: args.to_a)
|
|
295
|
+
gem(flag, opts: opts, banner: true)
|
|
296
|
+
end
|
|
297
|
+
when :command
|
|
298
|
+
format_desc action, flag, 'command,opts*,args*'
|
|
299
|
+
task flag, [:command] do |_, args|
|
|
300
|
+
command = param_guard(action, flag, key: :command, args: args)
|
|
301
|
+
gem(command.to_sym, opts: args.extras, banner: true)
|
|
302
|
+
end
|
|
303
|
+
end
|
|
304
|
+
when 'bundle'
|
|
305
|
+
case flag
|
|
306
|
+
when :install, :update, :cache, :exec
|
|
307
|
+
format_desc(action, flag, 'opts*', after: case flag
|
|
308
|
+
when :update then 'gems*'
|
|
309
|
+
when :exec then 'command,args*|:'
|
|
310
|
+
end)
|
|
311
|
+
task flag do |_, args|
|
|
312
|
+
bundle(flag, opts: args.to_a, banner: true)
|
|
313
|
+
end
|
|
314
|
+
when :config
|
|
315
|
+
format_desc action, flag, 'list|set|get|unset?,args*'
|
|
316
|
+
task flag do |_, args|
|
|
317
|
+
bundle(flag, *args.to_a, banner: true)
|
|
318
|
+
end
|
|
319
|
+
when :reinstall
|
|
320
|
+
format_desc action, flag, 'f/orce?,opts*'
|
|
321
|
+
task flag do |_, args|
|
|
322
|
+
opts = args.to_a
|
|
323
|
+
opts << 'redownload' if opts.delete('f') || opts.delete('force')
|
|
324
|
+
if (lock = basepath('Gemfile.lock')).exist?
|
|
325
|
+
config = basepath '.bundle', 'config'
|
|
326
|
+
if config.exist? && config.read.match?(/\bBUNDLE_FROZEN:\s+"true"/)
|
|
327
|
+
if opts.include?('redownload')
|
|
328
|
+
run(bundle_output('config unset frozen'), banner: false)
|
|
329
|
+
else
|
|
330
|
+
print_error('Gemfile.lock is frozen', subject: name, hint: flag)
|
|
331
|
+
lock = nil
|
|
332
|
+
end
|
|
333
|
+
end
|
|
334
|
+
lock&.delete
|
|
335
|
+
end
|
|
336
|
+
bundle(:install, opts: opts, banner: true)
|
|
337
|
+
end
|
|
338
|
+
when :command
|
|
339
|
+
format_desc action, flag, 'command,opts*,args*'
|
|
340
|
+
task flag, [:command] do |_, args|
|
|
341
|
+
command = param_guard(action, flag, key: :command, args: args)
|
|
342
|
+
bundle(command.to_sym, opts: args.extras, banner: true)
|
|
240
343
|
end
|
|
241
344
|
end
|
|
242
345
|
when 'ruby'
|
|
@@ -244,35 +347,34 @@ module Squared
|
|
|
244
347
|
when :file
|
|
245
348
|
format_desc action, flag, 'path,opts*,args*'
|
|
246
349
|
task flag, [:rb] do |_, args|
|
|
247
|
-
file = args.rb
|
|
248
350
|
opts = args.extras
|
|
249
|
-
args = if file && !file.include?('*')
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
ruby(flag, opts, file: file
|
|
351
|
+
args = Array(if (file = args.rb) && !file.include?('*')
|
|
352
|
+
ENV['RUBY_ARGS']
|
|
353
|
+
else
|
|
354
|
+
a, b, c = choice_index('Select a file', Dir.glob(file || '*.rb', base: path),
|
|
355
|
+
values: (file ? [] : ['Options']).push('Arguments'),
|
|
356
|
+
force: true, series: true)
|
|
357
|
+
if file
|
|
358
|
+
file = a
|
|
359
|
+
b
|
|
360
|
+
else
|
|
361
|
+
file = a
|
|
362
|
+
opts.concat(OptionPartition.strip(b))
|
|
363
|
+
c
|
|
364
|
+
end
|
|
365
|
+
end)
|
|
366
|
+
ruby(*args, flag: flag, opts: opts, file: file)
|
|
265
367
|
end
|
|
266
368
|
when :script
|
|
267
369
|
format_desc action, flag, 'opts*'
|
|
268
370
|
task flag do |_, args|
|
|
269
|
-
command = ENV['RUBY_E'] || readline('Enter script', force: true, multiline: [
|
|
270
|
-
ruby(flag, args.to_a, command: command)
|
|
371
|
+
command = ENV['RUBY_E'] || readline('Enter script', force: true, multiline: %w[## ;])
|
|
372
|
+
ruby(flag: flag, opts: args.to_a, command: command)
|
|
271
373
|
end
|
|
272
374
|
when :version
|
|
273
375
|
format_desc action, flag
|
|
274
376
|
task flag do
|
|
275
|
-
ruby flag
|
|
377
|
+
ruby(flag: flag)
|
|
276
378
|
end
|
|
277
379
|
end
|
|
278
380
|
end
|
|
@@ -303,9 +405,7 @@ module Squared
|
|
|
303
405
|
end
|
|
304
406
|
end
|
|
305
407
|
|
|
306
|
-
def copy(from: gemlib, into: gemdir, override: false, **kwargs)
|
|
307
|
-
return if @copy == false
|
|
308
|
-
|
|
408
|
+
def copy(from: gemlib, into: @gemdir, override: false, **kwargs)
|
|
309
409
|
glob = kwargs[:include]
|
|
310
410
|
pass = kwargs[:exclude]
|
|
311
411
|
if @copy && !override
|
|
@@ -315,6 +415,8 @@ module Squared
|
|
|
315
415
|
glob = @copy[:include] if @copy.key?(:include)
|
|
316
416
|
pass = @copy[:exclude] if @copy.key?(:exclude)
|
|
317
417
|
into = @copy[:into] if @copy.key?(:into)
|
|
418
|
+
elsif @copy == false
|
|
419
|
+
return
|
|
318
420
|
end
|
|
319
421
|
return unless into
|
|
320
422
|
|
|
@@ -327,11 +429,9 @@ module Squared
|
|
|
327
429
|
b = dest + val
|
|
328
430
|
c = glob[i] || glob.first
|
|
329
431
|
log.info "cp #{a + c} #{b}"
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
on_error e, :copy
|
|
334
|
-
end
|
|
432
|
+
copy_dir(a, b, c, pass: pass, verbose: verbosetype > 0)
|
|
433
|
+
rescue StandardError => e
|
|
434
|
+
on_error e, :copy
|
|
335
435
|
end
|
|
336
436
|
on :last, :copy
|
|
337
437
|
end
|
|
@@ -339,14 +439,21 @@ module Squared
|
|
|
339
439
|
def outdated(flag = nil, opts = [], sync: invoked_sync?('outdated', flag))
|
|
340
440
|
cmd = bundle_output 'outdated'
|
|
341
441
|
if flag
|
|
442
|
+
se = (opts.delete('s') || opts.delete('select')) && !stdin?
|
|
443
|
+
up = opts.delete('u') || opts.delete('update')
|
|
342
444
|
cmd << "--#{flag}"
|
|
343
|
-
|
|
445
|
+
OptionPartition.new(opts, bundleopts(:outdated), cmd, project: self)
|
|
446
|
+
.clear
|
|
344
447
|
end
|
|
345
448
|
log.info cmd.to_s
|
|
346
449
|
on :first, :outdated
|
|
347
450
|
banner = format_banner cmd.to_s
|
|
348
|
-
|
|
451
|
+
items = if sync
|
|
452
|
+
print_item banner
|
|
453
|
+
[] if flag && (se || up)
|
|
454
|
+
end
|
|
349
455
|
pwd_set(from: :outdated) do
|
|
456
|
+
tc = theme[:current]
|
|
350
457
|
start = 0
|
|
351
458
|
found = 0
|
|
352
459
|
major = 0
|
|
@@ -403,26 +510,26 @@ module Squared
|
|
|
403
510
|
end
|
|
404
511
|
end
|
|
405
512
|
end
|
|
513
|
+
name = line[/^\S+/, 0]
|
|
406
514
|
unless styles.empty?
|
|
407
515
|
case styles.first
|
|
408
516
|
when :green
|
|
409
|
-
line = sub_style(line,
|
|
517
|
+
line = sub_style(line, **opt_style(theme[styles.last == :bold ? :major : :active], /^(\S+)(.+)$/))
|
|
410
518
|
found += 1
|
|
411
519
|
when :yellow
|
|
412
520
|
found += 1
|
|
413
521
|
end
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
line = sub_style(line, *colormap(styles), pat: /^((?:\S+\s+){2})(#{Regexp.escape(l)})(.*)$/,
|
|
418
|
-
index: 2)
|
|
522
|
+
l = Regexp.escape(l)
|
|
523
|
+
line = sub_style(line, **opt_style(tc, /^(.+)(#{Regexp.escape(c)})(.+)$/, 2)) if tc
|
|
524
|
+
line = sub_style(line, **opt_style(colormap(styles), /^((?:\S+\s+){2})(#{l})(.*)$/, 2))
|
|
419
525
|
end
|
|
420
526
|
end
|
|
421
|
-
|
|
527
|
+
items&.push([line, name])
|
|
528
|
+
out.call('%2d. %s' % [start, line]) unless se
|
|
422
529
|
elsif line.start_with?('Gem')
|
|
423
530
|
unless stdin?
|
|
424
|
-
sub =
|
|
425
|
-
out.call(print_footer(" # #{line.chomp}", reverse: true, sub:
|
|
531
|
+
sub = [opt_style(theme[:header], /^(.+)(?<!\dm)(Gem|Latest)(.+)$/, 2)] * 2
|
|
532
|
+
out.call(print_footer(" # #{line.chomp}", reverse: true, sub: sub))
|
|
426
533
|
end
|
|
427
534
|
else
|
|
428
535
|
next
|
|
@@ -434,6 +541,15 @@ module Squared
|
|
|
434
541
|
puts buffer
|
|
435
542
|
end
|
|
436
543
|
if found > 0
|
|
544
|
+
if items
|
|
545
|
+
gems = if se
|
|
546
|
+
choice('Select a package', items.map(&:first),
|
|
547
|
+
multiple: true, force: false, index: true, border: true).map! { |n| items[n.pred].last }
|
|
548
|
+
else
|
|
549
|
+
items.map(&:last)
|
|
550
|
+
end
|
|
551
|
+
bundle(:update, *gems, opts: [flag.to_s])
|
|
552
|
+
end
|
|
437
553
|
begin
|
|
438
554
|
if major == 0 && dependfile.read =~ /\b(?:source\s+(["'])((?~\1))\1|remote:\s+(\S+))/
|
|
439
555
|
status = ($2 || $3).chomp('/')
|
|
@@ -442,52 +558,18 @@ module Squared
|
|
|
442
558
|
rescue StandardError => e
|
|
443
559
|
log.debug e
|
|
444
560
|
ensure
|
|
445
|
-
status ||= 'Updates are available'
|
|
561
|
+
status ||= (items ? 'Updates were made' : 'Updates are available')
|
|
446
562
|
end
|
|
447
563
|
puts print_footer(empty_status(status, 'major', major, always: !right), right: right)
|
|
448
|
-
elsif start == 0
|
|
564
|
+
elsif start == 0 && banner
|
|
449
565
|
puts 'No updates were found'
|
|
450
566
|
end
|
|
451
567
|
end
|
|
452
568
|
on :last, :outdated
|
|
453
569
|
end
|
|
454
570
|
|
|
455
|
-
def
|
|
456
|
-
|
|
457
|
-
op = append_bundle opts, OPT_BUNDLE[:install_base] + OPT_BUNDLE[:install] + OPT_BUNDLE[:common]
|
|
458
|
-
if op.arg?('force')
|
|
459
|
-
op.delete('--force')
|
|
460
|
-
if flag != :redownload
|
|
461
|
-
op << '--redownload'
|
|
462
|
-
elsif (lock = basepath('Gemfile.lock')).exist?
|
|
463
|
-
config = basepath '.bundle', 'config'
|
|
464
|
-
lock.delete unless config.exist? && config.read.match?(/\bBUNDLE_FROZEN:\s+"true"/)
|
|
465
|
-
end
|
|
466
|
-
end
|
|
467
|
-
run_rb(from: :install)
|
|
468
|
-
end
|
|
469
|
-
|
|
470
|
-
def update(flag, opts = [])
|
|
471
|
-
bundle_session 'update', "--#{flag}"
|
|
472
|
-
append_bundle(opts, OPT_BUNDLE[:install_base] + OPT_BUNDLE[:update] + OPT_BUNDLE[:common],
|
|
473
|
-
append: flag == :all ? nil : /\A[a-z-]+=/)
|
|
474
|
-
run_rb(from: :update)
|
|
475
|
-
end
|
|
476
|
-
|
|
477
|
-
def ruby(flag, opts = [], file: nil, command: nil, args: nil)
|
|
478
|
-
case flag
|
|
479
|
-
when :file, :script
|
|
480
|
-
op = OptionPartition.new(opts, OPT_RUBY[:ruby], ruby_session, project: self, args: true)
|
|
481
|
-
if command
|
|
482
|
-
op << quote_option('e', command, option: false)
|
|
483
|
-
elsif file
|
|
484
|
-
op.unshift(basepath(file))
|
|
485
|
-
end
|
|
486
|
-
unless op.arg?('e')
|
|
487
|
-
op.push(args) if args
|
|
488
|
-
op.append(delim: true, escape: false, quote: false) unless op.empty?
|
|
489
|
-
end
|
|
490
|
-
when :version
|
|
571
|
+
def ruby(*args, flag: nil, sync: true, banner: verbose?, with: nil, pass: PASS_RUBY[:ruby], **kwargs)
|
|
572
|
+
if flag == :version
|
|
491
573
|
pwd_set do
|
|
492
574
|
out = []
|
|
493
575
|
order = { 'rbenv' => -1, 'rvm' => -1, 'asdf' => -1, 'chruby' => -1 }
|
|
@@ -530,15 +612,14 @@ module Squared
|
|
|
530
612
|
.each do |val|
|
|
531
613
|
next unless val.empty? || File.exist?(val.sub('$HOME', Dir.home))
|
|
532
614
|
|
|
533
|
-
trim = ->(s) { s[
|
|
615
|
+
trim = ->(s) { s[/^\D+\d+\.\d+(?:\.\S+)?/, 0].sub(/^([a-z]+)-/i, '\1 ') }
|
|
534
616
|
ver = '.ruby-version'
|
|
535
617
|
out << trim.call(case (cmd = File.basename(val))
|
|
536
618
|
when 'rvm'
|
|
537
619
|
`rvm current`[/^\S+/, 0]
|
|
538
620
|
when 'rbenv'
|
|
539
|
-
`rbenv version-name
|
|
540
|
-
|
|
541
|
-
end
|
|
621
|
+
name = `rbenv version-name`
|
|
622
|
+
name.match?(SEM_VER) ? "ruby #{name}" : name
|
|
542
623
|
when 'chruby.sh'
|
|
543
624
|
chruby = session_output 'source', val
|
|
544
625
|
`#{chruby.with('ruby --version')}`
|
|
@@ -547,7 +628,7 @@ module Squared
|
|
|
547
628
|
cmd = 'asdf'
|
|
548
629
|
ver = '.tool-versions'
|
|
549
630
|
opt = [@asdf.first]
|
|
550
|
-
opt.unshift('--no-header') unless @@asdf
|
|
631
|
+
opt.unshift('--no-header') unless @@asdf.version == 15
|
|
551
632
|
`asdf current #{opt.join(' ')}`[/^\S+\s+\S+/, 0].sub(/\s+/, ' ')
|
|
552
633
|
else
|
|
553
634
|
ver = nil
|
|
@@ -596,138 +677,199 @@ module Squared
|
|
|
596
677
|
end
|
|
597
678
|
return
|
|
598
679
|
end
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
680
|
+
op = OptionPartition.new(session_opts(with, args: args, kwargs: kwargs, pass: pass), OPT_RUBY[:ruby],
|
|
681
|
+
ruby_session, project: self, args: true)
|
|
682
|
+
if (val = kwargs[:file])
|
|
683
|
+
op.unshift(shell_quote(basepath(val)))
|
|
684
|
+
elsif (val = kwargs[:command])
|
|
685
|
+
op << quote_option('e', val)
|
|
686
|
+
end
|
|
687
|
+
append = lambda do |file|
|
|
688
|
+
op.concat(args)
|
|
689
|
+
unless op.empty?
|
|
690
|
+
op.exist?(add: true) if file
|
|
691
|
+
op.append(delim: true, escape: false, quote: false)
|
|
692
|
+
end
|
|
609
693
|
end
|
|
610
|
-
list = OPT_GEM[flag] + OPT_GEM[:common]
|
|
611
|
-
from = :"gem:#{flag}"
|
|
612
694
|
case flag
|
|
613
|
-
when :
|
|
614
|
-
|
|
695
|
+
when :file
|
|
696
|
+
append.call(false)
|
|
697
|
+
when :script
|
|
698
|
+
op.clear
|
|
699
|
+
else
|
|
700
|
+
append.call(true)
|
|
701
|
+
print_run(op, banner, **kwargs)
|
|
615
702
|
end
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
703
|
+
run_rb(sync: sync, banner: banner, from: flag.is_a?(Symbol) ? :"ruby:#{flag}" : :ruby)
|
|
704
|
+
end
|
|
705
|
+
|
|
706
|
+
def gem(flag, *args, sync: true, banner: verbose?, with: nil, pass: nil, **kwargs)
|
|
707
|
+
flag = flag.to_sym
|
|
708
|
+
if pass.nil?
|
|
709
|
+
pass = case flag
|
|
710
|
+
when :install, :update
|
|
711
|
+
PASS_RUBY[:gem][:install]
|
|
712
|
+
when :dependency, :fetch, :info, :list, :outdated, :search, :specification
|
|
713
|
+
PASS_RUBY[:gem][:dependency]
|
|
714
|
+
else
|
|
715
|
+
PASS_RUBY[:gem].fetch(flag, [])
|
|
716
|
+
end
|
|
623
717
|
end
|
|
624
|
-
|
|
718
|
+
opts = session_opts(with, args: args, kwargs: kwargs, pass: pass)
|
|
625
719
|
case flag
|
|
626
|
-
when :outdated
|
|
720
|
+
when :build, :cert, :generate_index, :mirror, :outdated, :push, :server, :signin, :signout, :sources, :stale
|
|
721
|
+
opts.concat(args)
|
|
722
|
+
end
|
|
723
|
+
op = OptionPartition.new(opts, gemopts(flag), gem_session(flag, *preopts), project: self,
|
|
724
|
+
no: OPT_GEM[:no][flag])
|
|
725
|
+
from = :"gem:#{flag}"
|
|
726
|
+
if flag == :outdated
|
|
727
|
+
op.adjoin(gempwd, start: 0) if gempwd
|
|
627
728
|
op.clear
|
|
628
|
-
cmd =
|
|
729
|
+
cmd = session_done op.target
|
|
629
730
|
log.info cmd
|
|
630
731
|
on :first, from
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
732
|
+
banner = format_banner(cmd)
|
|
733
|
+
print_item banner if sync
|
|
734
|
+
major = [0, 0, 0]
|
|
735
|
+
buffer = []
|
|
736
|
+
filter = kwargs.fetch(:filter, {})
|
|
737
|
+
semver = filter[:semver]
|
|
738
|
+
update = if sync && filter[:select]
|
|
739
|
+
semver ||= 'major'
|
|
740
|
+
items = []
|
|
741
|
+
nil
|
|
742
|
+
elsif sync && filter[:interactive]
|
|
743
|
+
semver ||= 'major'
|
|
744
|
+
ia = true
|
|
745
|
+
[]
|
|
746
|
+
elsif filter[:update]
|
|
747
|
+
semver ||= 'minor'
|
|
748
|
+
[]
|
|
749
|
+
end
|
|
750
|
+
out = ->(val) { sync ? puts(val) : buffer << val }
|
|
636
751
|
pwd_set(pass: !gempwd.nil?, from: from) do
|
|
637
|
-
|
|
752
|
+
rows = [[%w[Gem Current Latest], nil]]
|
|
638
753
|
IO.popen(cmd).each do |line|
|
|
639
754
|
if line =~ /^(\S+) \((\S+) < ([^)]+)\)$/
|
|
640
755
|
cur = semscan $2
|
|
641
756
|
lat = semscan $3
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
757
|
+
rows << [$~.to_a.drop(1), if semmajor?(cur, lat)
|
|
758
|
+
1
|
|
759
|
+
else
|
|
760
|
+
cur[2] == lat[2] ? 3 : 2
|
|
761
|
+
end]
|
|
647
762
|
else
|
|
648
|
-
|
|
763
|
+
out.call(line)
|
|
649
764
|
end
|
|
650
765
|
end
|
|
651
|
-
if
|
|
652
|
-
pad = [
|
|
766
|
+
if rows.size > 1
|
|
767
|
+
pad = [rows.size.to_s.size.succ, 3].max
|
|
653
768
|
d = 0
|
|
654
769
|
e = 0
|
|
655
770
|
f = 0
|
|
656
771
|
j = 0
|
|
657
772
|
queue = nil
|
|
658
|
-
|
|
659
|
-
a, b, c =
|
|
773
|
+
rows.each do |row|
|
|
774
|
+
a, b, c = row.first
|
|
660
775
|
d = a.size if a.size > d
|
|
661
776
|
e = b.size if b.size > e
|
|
662
777
|
f = c.size if c.size > f
|
|
663
778
|
end
|
|
664
|
-
|
|
779
|
+
rows.each_with_index do |row, i|
|
|
665
780
|
next if i == 0 && stdin?
|
|
666
781
|
|
|
667
|
-
a, b, c =
|
|
782
|
+
a, b, c = row.first
|
|
668
783
|
if i == 0
|
|
669
784
|
line = '%-*s %-*s %*s %*s' % [pad, ' #', d, a, e, b, f, c]
|
|
670
785
|
n = line.size
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
786
|
+
queue = if stdin?
|
|
787
|
+
[line, ARG[:BORDER][1] * n]
|
|
788
|
+
else
|
|
789
|
+
2.times do
|
|
790
|
+
line = sub_style(line, **opt_style(theme[:header], /^(.+)(?<!\dm)(#{a}|#{c})(.*)$/, 2))
|
|
791
|
+
end
|
|
792
|
+
[line, sub_style(ARG[:BORDER][1] * n, styles: borderstyle)]
|
|
793
|
+
end
|
|
675
794
|
else
|
|
676
795
|
g = a.ljust(d)
|
|
677
796
|
pat = [/^([^.]+\.)([^.]+\..+)$/, /^([^.]+\.[^.]+\.)(.+)$/]
|
|
678
797
|
pre = b.start_with?('0.')
|
|
679
798
|
latest = [theme[:latest]]
|
|
680
|
-
case
|
|
799
|
+
case row.last
|
|
681
800
|
when 1
|
|
682
|
-
case
|
|
801
|
+
case semver
|
|
683
802
|
when 'major'
|
|
684
|
-
update
|
|
803
|
+
update&.push(a)
|
|
685
804
|
when 'minor', 'patch'
|
|
686
805
|
next
|
|
687
806
|
end
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
807
|
+
unless stdin?
|
|
808
|
+
g = sub_style(g, styles: theme[:major])
|
|
809
|
+
styles = %i[green bold]
|
|
810
|
+
pat = (pat.first if pre)
|
|
811
|
+
latest << :bold
|
|
812
|
+
end
|
|
813
|
+
major[0] += 1
|
|
693
814
|
when 2
|
|
694
|
-
case
|
|
815
|
+
case semver
|
|
695
816
|
when 'major', 'minor'
|
|
696
|
-
update
|
|
817
|
+
update&.push(a)
|
|
697
818
|
when 'patch'
|
|
698
819
|
next
|
|
699
820
|
end
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
821
|
+
unless stdin?
|
|
822
|
+
g = sub_style(g, styles: theme[:active])
|
|
823
|
+
styles = %i[green]
|
|
824
|
+
pat = pre ? pat.last : pat.first
|
|
825
|
+
end
|
|
826
|
+
major[1] += 1
|
|
704
827
|
else
|
|
705
|
-
case
|
|
828
|
+
case semver
|
|
706
829
|
when 'major', 'minor', 'patch'
|
|
707
|
-
update
|
|
830
|
+
update&.push(a)
|
|
831
|
+
end
|
|
832
|
+
unless stdin?
|
|
833
|
+
styles = %i[yellow]
|
|
834
|
+
pat = pat.last
|
|
708
835
|
end
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
836
|
+
major[2] += 1
|
|
837
|
+
end
|
|
838
|
+
b = b.rjust(e)
|
|
839
|
+
h = c.rjust(f)
|
|
840
|
+
unless stdin?
|
|
841
|
+
b = sub_style(b, **opt_style(colormap(styles), pat, 2))
|
|
842
|
+
h = sub_style(h, **opt_style(latest.flatten.compact, pat, 2))
|
|
712
843
|
end
|
|
713
|
-
b = sub_style(b.rjust(e), *colormap(styles), pat: pat, index: 2)
|
|
714
|
-
h = sub_style(c.rjust(f), styles: latest.flatten.compact, pat: pat, index: 2)
|
|
715
844
|
j += 1
|
|
716
845
|
if queue
|
|
717
|
-
|
|
846
|
+
out.call(queue)
|
|
718
847
|
queue = nil
|
|
719
848
|
end
|
|
720
|
-
|
|
721
|
-
|
|
849
|
+
s = '%s %s %s' % [g, b, h]
|
|
850
|
+
if items
|
|
851
|
+
items << [s, a]
|
|
852
|
+
else
|
|
853
|
+
out.call('%*s %s' % [pad, "#{j}.", s])
|
|
854
|
+
end
|
|
855
|
+
update.delete(a) if ia && !confirm_outdated(a, c, row.last, timeout: 0)
|
|
722
856
|
end
|
|
723
857
|
end
|
|
724
858
|
end
|
|
725
859
|
end
|
|
726
|
-
|
|
860
|
+
unless sync
|
|
861
|
+
print_item banner
|
|
862
|
+
puts buffer
|
|
863
|
+
end
|
|
864
|
+
if major.sum == 0
|
|
727
865
|
puts 'No updates were found'
|
|
728
866
|
else
|
|
729
|
-
|
|
730
|
-
|
|
867
|
+
if items
|
|
868
|
+
update = choice('Select a package', items.map(&:first),
|
|
869
|
+
multiple: true, force: false, index: true, border: true).map! { |n| items[n.pred].last }
|
|
870
|
+
end
|
|
871
|
+
if update && !update.empty?
|
|
872
|
+
cmd = gem_output 'update -f'
|
|
731
873
|
option('document', prefix: 'gem', ignore: false) do |val|
|
|
732
874
|
cmd << case val
|
|
733
875
|
when '0', 'false'
|
|
@@ -745,18 +887,40 @@ module Squared
|
|
|
745
887
|
end
|
|
746
888
|
end
|
|
747
889
|
cmd.merge(update)
|
|
748
|
-
run(cmd, banner: false, from: :'gem:update')
|
|
890
|
+
run(cmd, sync: sync, banner: false, from: :'gem:update')
|
|
749
891
|
end
|
|
750
|
-
print_status(major,
|
|
892
|
+
print_status(*major, from: :outdated)
|
|
751
893
|
end
|
|
752
894
|
on :last, from
|
|
753
895
|
return
|
|
896
|
+
end
|
|
897
|
+
case flag
|
|
898
|
+
when :check, :cleanup, :contents, :fetch, :info, :lock, :open, :owner, :pristine, :rdoc, :rebuild, :uninstall,
|
|
899
|
+
:unpack, :update, :yank
|
|
900
|
+
gems = true
|
|
901
|
+
op.concat(args)
|
|
902
|
+
when :dependency, :environment, :list, :search, :specification, :which
|
|
903
|
+
op.concat(args)
|
|
904
|
+
end
|
|
905
|
+
op.each do |opt|
|
|
906
|
+
if gems && !opt.start_with?('-') && !opt.match?(GEMNAME)
|
|
907
|
+
op.errors << opt
|
|
908
|
+
else
|
|
909
|
+
op.found << opt
|
|
910
|
+
end
|
|
911
|
+
end
|
|
912
|
+
op.swap do |a, b|
|
|
913
|
+
return -1 if a.start_with?('-')
|
|
914
|
+
|
|
915
|
+
b.start_with?('-') ? 1 : 0
|
|
916
|
+
end
|
|
917
|
+
case flag
|
|
754
918
|
when :build
|
|
755
919
|
if op.empty?
|
|
756
|
-
raise_error
|
|
920
|
+
raise_error Errno::ENOENT, 'gemspec', hint: project unless gemfile
|
|
757
921
|
op.add_path(gemfile)
|
|
758
922
|
else
|
|
759
|
-
op.
|
|
923
|
+
op.add_first(path: true)
|
|
760
924
|
.clear(pass: false)
|
|
761
925
|
end
|
|
762
926
|
when :push
|
|
@@ -764,41 +928,51 @@ module Squared
|
|
|
764
928
|
file = basepath(if !n && (spec = gemspec)
|
|
765
929
|
"#{spec.name}-#{spec.version}.gem"
|
|
766
930
|
else
|
|
767
|
-
choice_index
|
|
931
|
+
choice_index('Select a file', Dir.glob('*.gem', base: path), force: true)
|
|
768
932
|
end)
|
|
769
933
|
else
|
|
770
|
-
file = op.shift.yield_self { |val| val.include?('.') ? val : "#{val}.gem" }
|
|
771
|
-
raise_error
|
|
934
|
+
file = basepath(op.shift.yield_self { |val| val.include?('.') ? val : "#{val}.gem" })
|
|
935
|
+
raise_error Errno::ENOENT, file, hint: flag unless file.exist?
|
|
936
|
+
raise_error ArgumentError, "unrecognized args: #{op.join(', ')}", hint: flag unless op.empty?
|
|
772
937
|
end
|
|
773
|
-
raise_error('gem not found', hint: file) unless op.exist?(file)
|
|
774
938
|
op.add_path(file)
|
|
775
|
-
run_rb(from: from, interactive:
|
|
776
|
-
return
|
|
939
|
+
return run_rb(from: from, interactive: ['Push', 'N', gemname]) unless with || !banner
|
|
777
940
|
when :exec
|
|
778
941
|
min = if op.arg?('g', 'gem')
|
|
779
942
|
1
|
|
780
|
-
elsif op.empty?
|
|
943
|
+
elsif !op.empty?
|
|
944
|
+
op.add_first
|
|
945
|
+
0
|
|
946
|
+
elsif args.empty?
|
|
781
947
|
op << basic_option('gem', gemname)
|
|
782
948
|
1
|
|
783
949
|
else
|
|
784
|
-
op << op.shift
|
|
785
950
|
0
|
|
786
951
|
end
|
|
952
|
+
op.concat(args)
|
|
787
953
|
if (args = command_args(op.extras, min: min, force: min == 1 && op.empty?))
|
|
788
954
|
op.push(args)
|
|
789
955
|
end
|
|
790
956
|
op.append(quote: false)
|
|
791
957
|
when :update
|
|
792
|
-
|
|
793
|
-
if
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
op.append
|
|
797
|
-
end
|
|
958
|
+
if op.arg?('system')
|
|
959
|
+
op.add_first(quote: false) { |val| val if val.match?(SEM_VER) }
|
|
960
|
+
else
|
|
961
|
+
op.append
|
|
798
962
|
end
|
|
799
|
-
op.clear(errors: true)
|
|
800
963
|
when :install, :uninstall, :pristine
|
|
801
|
-
|
|
964
|
+
if flag == :install
|
|
965
|
+
post = if op.remove(':')
|
|
966
|
+
op.concat(args)
|
|
967
|
+
readline('Enter command [args]', force: true)
|
|
968
|
+
elsif op.empty?
|
|
969
|
+
op.concat(args)
|
|
970
|
+
nil
|
|
971
|
+
elsif !args.empty?
|
|
972
|
+
args.join(' ')
|
|
973
|
+
end
|
|
974
|
+
end
|
|
975
|
+
raise_error ArgumentError, 'missing gem name', hint: flag if op.empty?
|
|
802
976
|
if op.arg?('all')
|
|
803
977
|
if flag == :pristine
|
|
804
978
|
append_repeat 'skip', op.extras
|
|
@@ -807,79 +981,190 @@ module Squared
|
|
|
807
981
|
op.clear
|
|
808
982
|
end
|
|
809
983
|
elsif (n = op.index { |val| val.match?(/(\A|[a-z])@\d/) })
|
|
810
|
-
name = op.
|
|
984
|
+
name = op.remove_at(n)
|
|
811
985
|
pre, ver = if (n = name.index('@')) == 0
|
|
812
986
|
[gemname, name[1..-1]]
|
|
813
987
|
else
|
|
814
|
-
[name[0, n], name[
|
|
988
|
+
[name[0, n], name[n.succ..-1]]
|
|
815
989
|
end
|
|
816
|
-
op.adjoin(pre,
|
|
990
|
+
op.adjoin(pre, shell_option('version', ver))
|
|
817
991
|
.clear
|
|
818
|
-
|
|
992
|
+
end
|
|
993
|
+
if flag == :install
|
|
819
994
|
op.append_any
|
|
820
995
|
else
|
|
821
996
|
op.append
|
|
822
997
|
end
|
|
823
|
-
op
|
|
824
|
-
|
|
825
|
-
else
|
|
998
|
+
op << '--' << post if post
|
|
999
|
+
when :check, :cleanup, :contents, :fetch, :list, :lock, :rdoc
|
|
826
1000
|
op.append
|
|
1001
|
+
when :dependency, :info, :search
|
|
1002
|
+
op.add_first(quote: true, expect: case flag
|
|
1003
|
+
when :dependency, :search then 'no pattern for gem name'
|
|
1004
|
+
else 'missing gem name'
|
|
1005
|
+
end)
|
|
1006
|
+
.clear
|
|
1007
|
+
when :environment
|
|
1008
|
+
unless op.empty?
|
|
1009
|
+
case (action = op.shift)
|
|
1010
|
+
when 'home', 'path', 'user_gemhome', 'version', 'remotesources', 'platform', 'credentials'
|
|
1011
|
+
op << action
|
|
1012
|
+
op.clear
|
|
1013
|
+
else
|
|
1014
|
+
raise_error ArgumentError, "unrecognized arg: #{action}", hint: flag
|
|
1015
|
+
end
|
|
1016
|
+
end
|
|
1017
|
+
when :open, :owner, :unpack, :yank
|
|
1018
|
+
op.add_first(gemname)
|
|
1019
|
+
.clear
|
|
1020
|
+
when :rebuild
|
|
1021
|
+
op.add_first(expect: 'missing gem name')
|
|
1022
|
+
.add_first(expect: 'missing gem version')
|
|
1023
|
+
.clear
|
|
1024
|
+
when :specification
|
|
1025
|
+
op.add_first(expect: 'missing gem name')
|
|
1026
|
+
.add_first
|
|
1027
|
+
.clear
|
|
1028
|
+
when :which
|
|
1029
|
+
op.splice(path: true) { |val| op.exist?(val) }
|
|
1030
|
+
.clear
|
|
1031
|
+
else
|
|
1032
|
+
op.clear
|
|
827
1033
|
end
|
|
828
|
-
|
|
1034
|
+
op.clear(errors: true) if gems
|
|
1035
|
+
print_run(op, banner, **kwargs)
|
|
1036
|
+
run_rb(sync: sync, banner: banner, from: from)
|
|
829
1037
|
end
|
|
830
1038
|
|
|
831
|
-
def bundle(flag, *args)
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
1039
|
+
def bundle(flag, *args, sync: true, banner: verbose?, with: nil, pass: nil, **kwargs)
|
|
1040
|
+
flag = flag.to_sym
|
|
1041
|
+
if pass.nil?
|
|
1042
|
+
pass = case flag
|
|
1043
|
+
when :add, :outdated, :update
|
|
1044
|
+
PASS_RUBY[:bundle][:update]
|
|
1045
|
+
else
|
|
1046
|
+
PASS_RUBY[:bundle].fetch(flag, [])
|
|
1047
|
+
end
|
|
1048
|
+
end
|
|
1049
|
+
opts = session_opts(with, args: args, kwargs: kwargs, pass: pass)
|
|
840
1050
|
case flag
|
|
841
|
-
when
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
option_clear args
|
|
845
|
-
args.clear
|
|
1051
|
+
when :cache, :check, :clean, :doctor, :init, :install, :lock, :pack, :package, :platform
|
|
1052
|
+
pre = true
|
|
1053
|
+
opts.concat(args)
|
|
846
1054
|
end
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
1055
|
+
op = OptionPartition.new(opts, bundleopts(flag), bundle_session(flag),
|
|
1056
|
+
project: self, no: OPT_BUNDLE[:no][flag], args: flag == :exec)
|
|
1057
|
+
op.concat(args) unless pre
|
|
1058
|
+
output = false
|
|
1059
|
+
invalid = ->(a) { raise_error ArgumentError, "unrecognized args: #{a.join(', ')}", hint: flag }
|
|
1060
|
+
case flag
|
|
1061
|
+
when :config
|
|
1062
|
+
if op.empty?
|
|
1063
|
+
op << (val = readline('Enter arguments', force: false))
|
|
1064
|
+
output = val.match?(/(?:un)?set/)
|
|
1065
|
+
else
|
|
1066
|
+
a = op.dup
|
|
1067
|
+
b = op.shift
|
|
1068
|
+
c = op.shift
|
|
1069
|
+
d = op.shift
|
|
1070
|
+
e = op.arg?('global', 'local')
|
|
1071
|
+
op << b
|
|
1072
|
+
getname = -> { op << (c || readline('Enter name', force: true)) }
|
|
1073
|
+
case b
|
|
1074
|
+
when 'list'
|
|
1075
|
+
nil
|
|
1076
|
+
when 'get'
|
|
1077
|
+
getname.call
|
|
1078
|
+
when 'set'
|
|
1079
|
+
if e
|
|
1080
|
+
op << c
|
|
1081
|
+
c = d
|
|
1082
|
+
d = op.shift
|
|
1083
|
+
end
|
|
1084
|
+
getname.call
|
|
1085
|
+
op << (d || readline('Enter value', force: true))
|
|
1086
|
+
output = true
|
|
1087
|
+
when 'unset'
|
|
1088
|
+
if e
|
|
1089
|
+
op << c
|
|
1090
|
+
c = d
|
|
1091
|
+
end
|
|
1092
|
+
getname.call
|
|
1093
|
+
output = true
|
|
1094
|
+
else
|
|
1095
|
+
if b
|
|
1096
|
+
op << b
|
|
1097
|
+
if c
|
|
1098
|
+
op.add_quote(c)
|
|
1099
|
+
output = true
|
|
1100
|
+
end
|
|
1101
|
+
else
|
|
1102
|
+
invalid.call(a)
|
|
1103
|
+
end
|
|
1104
|
+
end
|
|
1105
|
+
op.clear
|
|
1106
|
+
end
|
|
1107
|
+
when :plugin
|
|
1108
|
+
a = op.dup
|
|
1109
|
+
case (b = op.shift)
|
|
1110
|
+
when 'install', 'uninstall', 'help'
|
|
1111
|
+
op.append
|
|
1112
|
+
when 'list'
|
|
1113
|
+
op.clear
|
|
1114
|
+
else
|
|
1115
|
+
invalid.call(a)
|
|
1116
|
+
end
|
|
1117
|
+
op.adjoin(b, with: 'plugin')
|
|
1118
|
+
when :exec
|
|
1119
|
+
if op.empty? || (op.delete(':') && op.append(quote: false))
|
|
1120
|
+
op << readline('Enter arguments', force: true)
|
|
1121
|
+
else
|
|
1122
|
+
op.append(quote: false)
|
|
1123
|
+
end
|
|
1124
|
+
when :binstubs, :outdated, :remove, :update
|
|
1125
|
+
op.append(filter: GEMNAME)
|
|
1126
|
+
.clear(errors: true)
|
|
1127
|
+
when :add, :open, :show
|
|
1128
|
+
op.add_first(expect: 'missing gem name')
|
|
1129
|
+
.clear
|
|
1130
|
+
when :console, :gem
|
|
1131
|
+
op.add_first
|
|
1132
|
+
.clear
|
|
857
1133
|
else
|
|
858
|
-
|
|
1134
|
+
op.clear
|
|
859
1135
|
end
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
run_s(args, banner: false, from: :rake)
|
|
1136
|
+
print_run(op, banner, **kwargs)
|
|
1137
|
+
run(sync: sync, banner: banner, from: :"bundle:#{flag}").tap { |ret| success?(ret, banner, output) }
|
|
863
1138
|
end
|
|
864
1139
|
|
|
865
|
-
def
|
|
1140
|
+
def rake(*args, sync: true, banner: verbose?, with: nil, pass: PASS_RUBY[:rake], **kwargs)
|
|
1141
|
+
opts = session_opts(with, args: args, kwargs: kwargs, pass: pass)
|
|
1142
|
+
op = OptionPartition.new(opts, OPT_RUBY[:rake], rake_session, project: self)
|
|
1143
|
+
op.adjoin(quote_option('f', rakefile)) if rakefile && !op.arg?('f', 'rakefile')
|
|
1144
|
+
op.concat(args)
|
|
1145
|
+
op.append(escape: true)
|
|
1146
|
+
print_run(op, banner, **kwargs)
|
|
1147
|
+
run(op, ({ 'BANNER' => '0' } unless banner), sync: sync, banner: false, from: :rake)
|
|
1148
|
+
end
|
|
1149
|
+
|
|
1150
|
+
def irb(*args, banner: verbose?, with: nil, pass: PASS_RUBY[:irb], **kwargs)
|
|
1151
|
+
opts = session_opts(with, args: args, kwargs: kwargs, pass: pass)
|
|
866
1152
|
op = OptionPartition.new(opts, OPT_RUBY[:irb], session('irb'), project: self, first: [/\.rb$/])
|
|
867
|
-
r =
|
|
868
|
-
r <<
|
|
869
|
-
r
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
end
|
|
877
|
-
run(banner: false)
|
|
1153
|
+
r = []
|
|
1154
|
+
r << 'bundler/setup' unless op.arg?('r')
|
|
1155
|
+
r << kwargs[:name] if kwargs[:name]
|
|
1156
|
+
r.each { |val| op.add_option('r', val, merge: true) }
|
|
1157
|
+
Array(kwargs.fetch(:path, gemlib)).each { |val| op << quote_option('I', val, merge: true) }
|
|
1158
|
+
op.concat(args)
|
|
1159
|
+
op.append(delim: true)
|
|
1160
|
+
print_run(op, banner, **kwargs)
|
|
1161
|
+
run(banner: false, from: :irb)
|
|
878
1162
|
end
|
|
879
1163
|
|
|
880
1164
|
def gemspec
|
|
881
|
-
@gemspec
|
|
882
|
-
|
|
1165
|
+
return @gemspec || nil unless @gemspec.nil?
|
|
1166
|
+
|
|
1167
|
+
@gemspec = gemfile && Gem::Specification.load(gemfile.to_s) rescue false
|
|
883
1168
|
end
|
|
884
1169
|
|
|
885
1170
|
def gemname
|
|
@@ -892,26 +1177,24 @@ module Squared
|
|
|
892
1177
|
|
|
893
1178
|
def copy?
|
|
894
1179
|
return true if @copy.is_a?(Hash) ? copy[:into] : super
|
|
895
|
-
return gemdir? if gemdir
|
|
1180
|
+
return gemdir? if @gemdir
|
|
896
1181
|
|
|
897
1182
|
if version
|
|
898
1183
|
begin
|
|
899
1184
|
case @autodetect
|
|
900
1185
|
when 'rvm'
|
|
901
|
-
|
|
1186
|
+
pwd_set { `rvm info homes` }[/^\s+gem:\s+"(.+)"$/, 1]
|
|
902
1187
|
when 'rbenv'
|
|
903
1188
|
if pwd_set { `rbenv which ruby` } =~ %r{^(.+[\\/]versions[\\/](\d\.\d)\.[^\\/]+)[\\/]bin[\\/]ruby$}
|
|
904
|
-
|
|
1189
|
+
File.join($1, 'lib/ruby/gems', "#{$2}.0")
|
|
905
1190
|
end
|
|
906
1191
|
when 'asdf'
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
ENV['GEM_HOME'] || ENV['GEM_ROOT']
|
|
1192
|
+
pwd_set { `asdf where ruby` }.yield_self do |val|
|
|
1193
|
+
val =~ /(\d\.\d)\.[^.]+$/ && File.join(val, 'lib/ruby/gems', "#{$1}.0")
|
|
1194
|
+
end
|
|
911
1195
|
when /bundler?/
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
end
|
|
1196
|
+
pwd_set { `bundle env` }[/^\s+Gem Home\s+(.+)$/, 1]
|
|
1197
|
+
end.tap { |val| @gemdir = Pathname.new(val) if val }
|
|
915
1198
|
rescue StandardError => e
|
|
916
1199
|
log.debug e
|
|
917
1200
|
end
|
|
@@ -920,35 +1203,35 @@ module Squared
|
|
|
920
1203
|
return false unless @autodetect
|
|
921
1204
|
|
|
922
1205
|
set = lambda do |val, path|
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
log.warn "using version #{val} (given #{version})" if version && version != val
|
|
1206
|
+
if (ver = version) && ver != val
|
|
1207
|
+
log.warn "using version #{val}".subhint("given #{ver}")
|
|
1208
|
+
end
|
|
927
1209
|
self.version = val
|
|
928
|
-
|
|
1210
|
+
@gemdir = Pathname.new(path.strip) + gempath
|
|
929
1211
|
end
|
|
930
1212
|
if version
|
|
931
1213
|
opt = gempwd
|
|
932
1214
|
pwd_set(pass: !opt.nil?) do
|
|
933
1215
|
out = `#{gem_output(opt, 'list --local -d', gemname)}`
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
1216
|
+
next unless out =~ /#{Regexp.escape(gemname)} \(([^)]+)\)/
|
|
1217
|
+
|
|
1218
|
+
split_escape($1)
|
|
1219
|
+
.unshift(version)
|
|
1220
|
+
.uniq
|
|
1221
|
+
.each do |val|
|
|
1222
|
+
next unless out =~ /\(#{Regexp.escape(val)}[^)]*\):([^\n]+)/
|
|
1223
|
+
|
|
1224
|
+
set.call(val, $1)
|
|
1225
|
+
return gemdir? if @gemdir
|
|
1226
|
+
end
|
|
944
1227
|
end
|
|
945
|
-
|
|
1228
|
+
@gemdir = Pathname.new(Gem.dir) + gempath
|
|
946
1229
|
else
|
|
947
1230
|
parse = lambda do |path|
|
|
948
1231
|
next unless path
|
|
949
1232
|
|
|
950
1233
|
lib = Regexp.new(['', 'gems', "#{gemname}-([^#{File::SEPARATOR}]+)", ''].join(File::SEPARATOR))
|
|
951
|
-
if (ver = path[lib, 1]) && (val = path[/\A(.+)#{
|
|
1234
|
+
if (ver = path[lib, 1]) && (val = path[/\A(.+)#{gempath(ver[1])}/, 1])
|
|
952
1235
|
set.call(ver, val)
|
|
953
1236
|
end
|
|
954
1237
|
end
|
|
@@ -956,8 +1239,8 @@ module Squared
|
|
|
956
1239
|
target = RUBY_VERSION.start_with?('2.6') ? RubyVM : $LOAD_PATH
|
|
957
1240
|
parse.call(target.resolve_feature_path(gemname)&.last)
|
|
958
1241
|
end
|
|
959
|
-
|
|
960
|
-
raise_error 'gems
|
|
1242
|
+
unless @gemdir || pwd_set { parse.call(`#{bundle_output('show', gemname)}`) }
|
|
1243
|
+
raise_error Errno::ENOENT, 'gems home'
|
|
961
1244
|
end
|
|
962
1245
|
end
|
|
963
1246
|
rescue StandardError => e
|
|
@@ -970,7 +1253,7 @@ module Squared
|
|
|
970
1253
|
end
|
|
971
1254
|
|
|
972
1255
|
def outdated?
|
|
973
|
-
dependtype > 0
|
|
1256
|
+
dependtype > 0
|
|
974
1257
|
end
|
|
975
1258
|
|
|
976
1259
|
private
|
|
@@ -979,36 +1262,23 @@ module Squared
|
|
|
979
1262
|
run(banner: !@session&.include?('--quiet'), **kwargs)
|
|
980
1263
|
end
|
|
981
1264
|
|
|
982
|
-
def append_bundle(opts, list, target: @session, append: nil)
|
|
983
|
-
op = OptionPartition.new(opts, list, target, project: self)
|
|
984
|
-
if append
|
|
985
|
-
if append.is_a?(Regexp)
|
|
986
|
-
op.each do |opt|
|
|
987
|
-
if opt.match?(append)
|
|
988
|
-
op.errors << opt
|
|
989
|
-
else
|
|
990
|
-
op.found << opt
|
|
991
|
-
end
|
|
992
|
-
end
|
|
993
|
-
op.swap.clear(errors: true)
|
|
994
|
-
end
|
|
995
|
-
op.append(escape: true)
|
|
996
|
-
else
|
|
997
|
-
op.clear
|
|
998
|
-
end
|
|
999
|
-
op
|
|
1000
|
-
end
|
|
1001
|
-
|
|
1002
1265
|
def ruby_session(*cmd, **kwargs)
|
|
1003
1266
|
session('ruby', *preopts, *cmd, **kwargs)
|
|
1004
1267
|
end
|
|
1005
1268
|
|
|
1006
1269
|
def gem_session(*cmd, **kwargs)
|
|
1007
|
-
session('gem', *cmd,
|
|
1270
|
+
ret = session('gem', *cmd, **kwargs)
|
|
1271
|
+
return ret if cmd.empty?
|
|
1272
|
+
|
|
1273
|
+
ret.merge(preopts)
|
|
1008
1274
|
end
|
|
1009
1275
|
|
|
1010
1276
|
def bundle_session(*cmd, **kwargs)
|
|
1011
|
-
session('bundle', *cmd,
|
|
1277
|
+
ret = session('bundle', *cmd, **kwargs)
|
|
1278
|
+
return ret if cmd.empty?
|
|
1279
|
+
|
|
1280
|
+
append_nocolor
|
|
1281
|
+
ret.merge(preopts)
|
|
1012
1282
|
end
|
|
1013
1283
|
|
|
1014
1284
|
def rake_session(*cmd, **kwargs)
|
|
@@ -1032,19 +1302,19 @@ module Squared
|
|
|
1032
1302
|
end
|
|
1033
1303
|
|
|
1034
1304
|
def config_get(key)
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
case
|
|
1305
|
+
ret = if pwd_set { `#{bundle_output('config get --parseable', key)}` } =~ /\A([^=]+)=(.*)\z/ && $1 == key
|
|
1306
|
+
$2.chomp
|
|
1307
|
+
end
|
|
1308
|
+
case ret
|
|
1039
1309
|
when 'true'
|
|
1040
1310
|
true
|
|
1041
1311
|
when '', '[]'
|
|
1042
1312
|
nil
|
|
1043
1313
|
else
|
|
1044
|
-
if
|
|
1045
|
-
$1.split(', :').map { |val| ((val.delete_prefix!('"') && val.delete_suffix!('"')) || val).to_sym }
|
|
1314
|
+
if ret =~ /\A\[:(.+)\]\z/
|
|
1315
|
+
$1.split(', :').map! { |val| ((val.delete_prefix!('"') && val.delete_suffix!('"')) || val).to_sym }
|
|
1046
1316
|
else
|
|
1047
|
-
|
|
1317
|
+
ret || false
|
|
1048
1318
|
end
|
|
1049
1319
|
end
|
|
1050
1320
|
end
|
|
@@ -1054,7 +1324,7 @@ module Squared
|
|
|
1054
1324
|
end
|
|
1055
1325
|
|
|
1056
1326
|
def preopts
|
|
1057
|
-
|
|
1327
|
+
verbose? && !session_arg?('quiet') ? ['--verbose'] : []
|
|
1058
1328
|
end
|
|
1059
1329
|
|
|
1060
1330
|
def variables
|
|
@@ -1062,11 +1332,10 @@ module Squared
|
|
|
1062
1332
|
end
|
|
1063
1333
|
|
|
1064
1334
|
def rakefile
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
@rakefile || nil
|
|
1335
|
+
return @rakefile || nil unless @rakefile.nil?
|
|
1336
|
+
|
|
1337
|
+
file = Rake::Application::DEFAULT_RAKEFILES.find { |val| exist?(val) }
|
|
1338
|
+
@rakefile = file ? basepath(file) : false
|
|
1070
1339
|
end
|
|
1071
1340
|
|
|
1072
1341
|
def rakepwd
|
|
@@ -1088,6 +1357,38 @@ module Squared
|
|
|
1088
1357
|
end
|
|
1089
1358
|
end
|
|
1090
1359
|
|
|
1360
|
+
def bundleopts(*args)
|
|
1361
|
+
case args.first
|
|
1362
|
+
when :install, :update
|
|
1363
|
+
args << :install_a
|
|
1364
|
+
when :add, :plugin
|
|
1365
|
+
args << :common_git
|
|
1366
|
+
when :binstubs, :cache
|
|
1367
|
+
args << :common_all
|
|
1368
|
+
end
|
|
1369
|
+
OPT_BUNDLE[:common] + args.flat_map { |name| OPT_BUNDLE.fetch(name, []) }
|
|
1370
|
+
end
|
|
1371
|
+
|
|
1372
|
+
def gemopts(*args)
|
|
1373
|
+
case args.first
|
|
1374
|
+
when :install, :update
|
|
1375
|
+
args << :common_url << :common_domain << :install_a
|
|
1376
|
+
when :dependency, :info, :outdated, :search, :specification
|
|
1377
|
+
args << :common_url << :common_domain
|
|
1378
|
+
when :fetch, :list
|
|
1379
|
+
args << :common_url
|
|
1380
|
+
when :owner, :push, :yank
|
|
1381
|
+
args << :common_otp
|
|
1382
|
+
when :package, :pack
|
|
1383
|
+
args << :cache
|
|
1384
|
+
end
|
|
1385
|
+
case args.first
|
|
1386
|
+
when :info, :list, :search
|
|
1387
|
+
args << :common_all
|
|
1388
|
+
end
|
|
1389
|
+
OPT_GEM[:common] + args.flat_map { |name| OPT_GEM.fetch(name, []) }
|
|
1390
|
+
end
|
|
1391
|
+
|
|
1091
1392
|
def gempwd
|
|
1092
1393
|
return unless !pwd? && semgte?(Gem::VERSION, '3.4.2')
|
|
1093
1394
|
|
|
@@ -1095,33 +1396,29 @@ module Squared
|
|
|
1095
1396
|
end
|
|
1096
1397
|
|
|
1097
1398
|
def gemfile
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
@gemfile || nil
|
|
1399
|
+
return @gemfile || nil unless @gemfile.nil?
|
|
1400
|
+
|
|
1401
|
+
@gemfile = [project, name].map! { |val| basepath("#{val}.gemspec") }
|
|
1402
|
+
.concat(path.glob('*.gemspec'))
|
|
1403
|
+
.find(&:exist?) || false
|
|
1104
1404
|
end
|
|
1105
1405
|
|
|
1106
1406
|
def gemlib
|
|
1107
|
-
@gemlib ||=
|
|
1407
|
+
@gemlib ||= begin
|
|
1408
|
+
lib = Set.new(['lib'])
|
|
1108
1409
|
if (spec = gemspec)
|
|
1109
1410
|
lib.merge(spec.require_paths || [])
|
|
1110
1411
|
end
|
|
1111
|
-
lib.select { |file|
|
|
1412
|
+
lib.select { |file| exist?(file) }
|
|
1112
1413
|
end
|
|
1113
1414
|
end
|
|
1114
1415
|
|
|
1115
|
-
def gempath(val = version
|
|
1116
|
-
|
|
1117
|
-
ret += '.gemspec' if dir == 'specifications'
|
|
1118
|
-
ret
|
|
1416
|
+
def gempath(val = version)
|
|
1417
|
+
File.join('gems', "#{gemname}-#{val}")
|
|
1119
1418
|
end
|
|
1120
1419
|
|
|
1121
1420
|
def gemdir?
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
gemdir.exist? && !gemdir.empty?
|
|
1421
|
+
!@gemdir.nil? && @gemdir.exist? && !@gemdir.empty?
|
|
1125
1422
|
end
|
|
1126
1423
|
end
|
|
1127
1424
|
|