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
@@ -12,25 +12,25 @@ module Squared
|
|
12
12
|
include ::Rake::DSL
|
13
13
|
|
14
14
|
def populate(ws, **)
|
15
|
-
return if ws.series
|
15
|
+
return if ws.series[:pull].empty?
|
16
16
|
|
17
17
|
desc ws.task_name('all[git?=rebase|stash]', desc: true)
|
18
18
|
task ws.task_name('all'), [:git] do |_, args|
|
19
19
|
sync = lambda do |key|
|
20
20
|
key = ws.task_name(key)
|
21
|
-
ws.task_defined?(ret =
|
21
|
+
ws.task_defined?(ret = ws.task_join(key, 'sync')) ? ret : key
|
22
22
|
end
|
23
23
|
cmd = [case args.git
|
24
24
|
when 'rebase'
|
25
25
|
sync.('rebase')
|
26
26
|
when 'stash'
|
27
|
-
invoke(sync.('stash'),
|
27
|
+
invoke(sync.('stash'), **ws.invokeargs)
|
28
28
|
sync.('pull')
|
29
29
|
else
|
30
30
|
sync.('pull')
|
31
31
|
end]
|
32
|
-
cmd << ws.task_name(
|
33
|
-
Common::Task.invoke(cmd,
|
32
|
+
cmd << ws.task_name('build')
|
33
|
+
Common::Task.invoke(cmd, **ws.invokeargs)
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
@@ -38,32 +38,34 @@ module Squared
|
|
38
38
|
%i[pull rebase fetch stash status].freeze
|
39
39
|
end
|
40
40
|
|
41
|
-
def
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
41
|
+
def batchargs
|
42
|
+
[ref, { 'pull-s': %i[stash pull], 'rebase-s': %i[stash rebase] }]
|
43
|
+
end
|
44
|
+
|
45
|
+
def config?(val)
|
46
|
+
return false unless (val = as_path(val))
|
47
|
+
|
48
|
+
val.join('.git').directory?
|
47
49
|
end
|
48
50
|
end
|
49
51
|
|
50
52
|
@@tasks[ref] = {
|
51
|
-
checkout: %i[branch detach force merge],
|
52
|
-
commit: %i[add amend amend-orig all no-all],
|
53
|
-
diff: %i[head cached branch files],
|
54
|
-
fetch: %i[all submodules unshallow],
|
55
|
-
files: %i[cached modified deleted others],
|
56
|
-
pull: %i[head rebase no-rebase commit no-commit submodules],
|
57
|
-
stash: %i[push pop apply list clear],
|
58
|
-
refs: %i[heads tags],
|
59
|
-
reset: %i[head soft mixed hard merge keep submodules],
|
60
|
-
restore: %i[worktree staged overlay],
|
61
|
-
rev: %i[commit branch]
|
53
|
+
checkout: %i[branch detach force merge].freeze,
|
54
|
+
commit: %i[add amend amend-orig all no-all].freeze,
|
55
|
+
diff: %i[head cached branch files].freeze,
|
56
|
+
fetch: %i[all submodules unshallow].freeze,
|
57
|
+
files: %i[cached modified deleted others].freeze,
|
58
|
+
pull: %i[head rebase no-rebase commit no-commit submodules].freeze,
|
59
|
+
stash: %i[push pop apply list clear].freeze,
|
60
|
+
refs: %i[heads tags].freeze,
|
61
|
+
reset: %i[head soft mixed hard merge keep submodules].freeze,
|
62
|
+
restore: %i[worktree staged overlay].freeze,
|
63
|
+
rev: %i[commit branch].freeze
|
62
64
|
}.freeze
|
63
65
|
|
64
66
|
def initialize(*, **)
|
65
67
|
super
|
66
|
-
initialize_ref(Git.ref)
|
68
|
+
initialize_ref(Git.ref) if git_path.exist?
|
67
69
|
end
|
68
70
|
|
69
71
|
def ref
|
@@ -72,22 +74,17 @@ module Squared
|
|
72
74
|
|
73
75
|
def populate(*)
|
74
76
|
super
|
75
|
-
return unless
|
77
|
+
return unless ref?(Git.ref)
|
76
78
|
|
77
79
|
namespace name do
|
78
80
|
@@tasks[Git.ref].each do |action, flags|
|
79
81
|
namespace action do
|
80
82
|
flags.each do |flag|
|
81
83
|
case action
|
82
|
-
when :pull
|
83
|
-
desc format_desc(action, flag, OPT_PULL)
|
84
|
-
task flag, [:opts] do |_, args|
|
85
|
-
pull(flag, opts: args.to_a)
|
86
|
-
end
|
87
|
-
when :fetch
|
88
|
-
desc format_desc(action, flag, OPT_FETCH)
|
84
|
+
when :pull, :fetch
|
85
|
+
desc format_desc(action, flag, flag == :pull ? OPT_PULL : OPT_FETCH)
|
89
86
|
task flag, [:opts] do |_, args|
|
90
|
-
|
87
|
+
__send__(action, flag, opts: args.to_a)
|
91
88
|
end
|
92
89
|
when :commit, :restore
|
93
90
|
if flag == :all
|
@@ -131,8 +128,7 @@ module Squared
|
|
131
128
|
desc format_desc(action, flag, 'index?=0,pathspec*')
|
132
129
|
task flag, [:pathspec] do |_, args|
|
133
130
|
files = args.to_a
|
134
|
-
index
|
135
|
-
diff(flag, files, index: index)
|
131
|
+
diff(flag, files, index: /^\d+$/.match?(files[0]) && !option('index') ? files.shift.to_i : 0)
|
136
132
|
end
|
137
133
|
when :cached
|
138
134
|
desc format_desc(action, flag, 'pathspec*')
|
@@ -193,7 +189,9 @@ module Squared
|
|
193
189
|
if flag == :head
|
194
190
|
desc format_desc(action, flag, 'ref?=HEAD,pathspec+')
|
195
191
|
task flag, [:ref, :pathspec] do |_, args|
|
196
|
-
|
192
|
+
files = args.to_a[1..-1]
|
193
|
+
guard_params(action, flag, args: files)
|
194
|
+
reset(flag, files, ref: args.ref)
|
197
195
|
end
|
198
196
|
else
|
199
197
|
desc format_desc(action, flag, 'ref?=HEAD')
|
@@ -210,18 +208,18 @@ module Squared
|
|
210
208
|
|
211
209
|
def pull(flag = nil, sync: invoked_sync?('pull', flag), opts: [])
|
212
210
|
cmd = git_session 'pull'
|
213
|
-
if flag == :'no-rebase'
|
211
|
+
if flag == :'no-rebase' || option('rebase', equals: '0')
|
214
212
|
cmd << '--no-rebase'
|
215
|
-
elsif flag == :rebase ||
|
213
|
+
elsif flag == :rebase || option('rebase')
|
216
214
|
cmd << '--rebase'
|
217
215
|
end
|
218
|
-
if flag == :'no-commit'
|
216
|
+
if flag == :'no-commit' || option('commit', equals: '0')
|
219
217
|
cmd << '--no-commit'
|
220
|
-
elsif flag == :commit ||
|
218
|
+
elsif flag == :commit || option('commit')
|
221
219
|
cmd << '--commit'
|
222
220
|
end
|
223
221
|
append_pull opts, OPT_PULL, flag
|
224
|
-
source(sync: sync,
|
222
|
+
source(sync: sync, **threadargs)
|
225
223
|
end
|
226
224
|
|
227
225
|
def rebase
|
@@ -230,28 +228,28 @@ module Squared
|
|
230
228
|
|
231
229
|
def fetch(flag = nil, opts: [])
|
232
230
|
cmd = git_session 'fetch'
|
233
|
-
cmd << '--all' if flag == :all ||
|
231
|
+
cmd << '--all' if flag == :all || option('all')
|
234
232
|
append_pull opts, OPT_FETCH, flag
|
235
|
-
source(sync: invoked_sync?('fetch', flag),
|
233
|
+
source(sync: invoked_sync?('fetch', flag), **threadargs)
|
236
234
|
end
|
237
235
|
|
238
236
|
def stash(flag = nil, files = [], commit: nil)
|
239
237
|
cmd = git_session 'stash', (flag || 'push').to_s
|
240
238
|
case flag
|
241
239
|
when :apply, :pop
|
242
|
-
cmd << '--index' if
|
240
|
+
cmd << '--index' if option('index')
|
243
241
|
cmd << commit
|
244
242
|
else
|
245
|
-
append_option %w[all staged include-untracked]
|
246
|
-
append_message
|
243
|
+
append_option %w[all staged include-untracked].freeze
|
244
|
+
append_message option('message', 'm', ignore: false)
|
247
245
|
append_pathspec files
|
248
246
|
end
|
249
|
-
source(sync: invoked_sync?('stash', flag),
|
247
|
+
source(sync: invoked_sync?('stash', flag), **threadargs)
|
250
248
|
end
|
251
249
|
|
252
250
|
def status
|
253
|
-
cmd = git_session 'status',
|
254
|
-
if (val =
|
251
|
+
cmd = git_session 'status', option('long') ? '--long' : '--short'
|
252
|
+
if (val = option('ignore-submodules', ignore: false))
|
255
253
|
cmd << "--ignore-submodules=#{case val
|
256
254
|
when '0', 'none'
|
257
255
|
'none'
|
@@ -265,11 +263,11 @@ module Squared
|
|
265
263
|
end
|
266
264
|
append_pathspec
|
267
265
|
out, banner = source(io: true)
|
268
|
-
if
|
266
|
+
if invoked_sync?('status')
|
269
267
|
print_item banner
|
270
268
|
banner = nil
|
271
269
|
end
|
272
|
-
sub = if verbose
|
270
|
+
sub = if verbose
|
273
271
|
[
|
274
272
|
{ pat: /^(.)([A-Z])(.+)$/, styles: :red, index: 2 },
|
275
273
|
{ pat: /^([A-Z])(.+)$/, styles: :green },
|
@@ -284,7 +282,6 @@ module Squared
|
|
284
282
|
def reset(flag, files = [], ref: nil)
|
285
283
|
cmd = git_session 'reset'
|
286
284
|
if flag == :head
|
287
|
-
guard_params('reset', flag, args: files)
|
288
285
|
append_commit ref
|
289
286
|
append_pathspec files
|
290
287
|
else
|
@@ -295,7 +292,7 @@ module Squared
|
|
295
292
|
append_submodules flag
|
296
293
|
else
|
297
294
|
cmd << '--mixed'
|
298
|
-
cmd << '--no-refresh' if
|
295
|
+
cmd << '--no-refresh' if option('refresh', equals: '0')
|
299
296
|
end
|
300
297
|
append_commit ref
|
301
298
|
end
|
@@ -306,10 +303,10 @@ module Squared
|
|
306
303
|
cmd = git_session 'checkout'
|
307
304
|
case flag
|
308
305
|
when :branch
|
309
|
-
cmd << '--detach' if detach == 'd' ||
|
306
|
+
cmd << '--detach' if detach == 'd' || option('detach')
|
310
307
|
if create
|
311
308
|
cmd << "-#{create}" << branch
|
312
|
-
if (val =
|
309
|
+
if (val = option('start-point'))
|
313
310
|
cmd << val
|
314
311
|
end
|
315
312
|
else
|
@@ -328,12 +325,11 @@ module Squared
|
|
328
325
|
end
|
329
326
|
|
330
327
|
def rev(flag, ref: nil, size: nil)
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
git_session 'rev-parse', opt
|
328
|
+
git_session 'rev-parse', if flag == :branch
|
329
|
+
'--abbrev-ref'
|
330
|
+
else
|
331
|
+
(n = size.to_i) > 0 ? "--short=#{[n, 5].max}" : '--verify'
|
332
|
+
end
|
337
333
|
append_commit ref
|
338
334
|
source
|
339
335
|
end
|
@@ -364,22 +360,22 @@ module Squared
|
|
364
360
|
sha = nil
|
365
361
|
end
|
366
362
|
end
|
367
|
-
if (val =
|
363
|
+
if (val = option('unified')).to_i > 0
|
368
364
|
cmd << "--unified=#{val}"
|
369
365
|
end
|
370
366
|
append_nocolor
|
371
367
|
case flag
|
372
368
|
when :cached
|
373
369
|
cmd << '--cached'
|
374
|
-
cmd << '--merge-base' if
|
370
|
+
cmd << '--merge-base' if option('merge-base')
|
375
371
|
when :branch
|
376
372
|
cmd << branch
|
377
373
|
when :files
|
378
374
|
cmd << '--no-index'
|
379
375
|
else
|
380
|
-
if (val =
|
376
|
+
if (val = option('index')) || index > 0
|
381
377
|
cmd << "HEAD~#{val || index}"
|
382
|
-
elsif sha &&
|
378
|
+
elsif sha && option('merge-base')
|
383
379
|
cmd << '--merge-base'
|
384
380
|
end
|
385
381
|
end
|
@@ -389,7 +385,7 @@ module Squared
|
|
389
385
|
end
|
390
386
|
|
391
387
|
def commit(flag, files = [], message: nil, pass: false)
|
392
|
-
message ||=
|
388
|
+
message ||= option('message', 'm', prefix: 'git', ignore: false)
|
393
389
|
amend = flag.to_s.start_with?('amend')
|
394
390
|
if !message && !amend
|
395
391
|
return if pass
|
@@ -403,7 +399,7 @@ module Squared
|
|
403
399
|
raise_error('commit', 'pathspec', hint: 'missing') if files.empty?
|
404
400
|
"-- #{files.join(' ')}"
|
405
401
|
end
|
406
|
-
|
402
|
+
unless push?
|
407
403
|
source('git branch -vv --list', io: true, banner: false).first.each do |val|
|
408
404
|
origin = %r{^\* [^\[]+(?<= )\[([\w.-/]+?)/([\w.-]+)\] }.match(val)
|
409
405
|
next unless origin
|
@@ -414,9 +410,8 @@ module Squared
|
|
414
410
|
end
|
415
411
|
end
|
416
412
|
raise_error('commit', 'work tree is not usable') unless push?
|
417
|
-
|
418
413
|
cmd = git_session 'commit'
|
419
|
-
cmd << '--dry-run' if
|
414
|
+
cmd << '--dry-run' if option('dry-run')
|
420
415
|
if amend
|
421
416
|
cmd << '--amend'
|
422
417
|
else
|
@@ -424,7 +419,7 @@ module Squared
|
|
424
419
|
end
|
425
420
|
if message
|
426
421
|
append_message message
|
427
|
-
elsif flag == :'amend-orig' ||
|
422
|
+
elsif flag == :'amend-orig' || option('no-edit')
|
428
423
|
cmd << '--no-edit'
|
429
424
|
end
|
430
425
|
a = ['git add --verbose']
|
@@ -443,11 +438,7 @@ module Squared
|
|
443
438
|
end
|
444
439
|
|
445
440
|
def restore(flag, files)
|
446
|
-
|
447
|
-
case flag
|
448
|
-
when :worktree, :staged, :overlay
|
449
|
-
cmd << "--#{flag}"
|
450
|
-
end
|
441
|
+
git_session 'restore', "--#{flag}"
|
451
442
|
append_ours
|
452
443
|
append_pathspec(files, expect: true)
|
453
444
|
source(stdout: true)
|
@@ -455,20 +446,21 @@ module Squared
|
|
455
446
|
|
456
447
|
private
|
457
448
|
|
458
|
-
def source(cmd = @session, exception: true,
|
459
|
-
|
449
|
+
def source(cmd = @session, exception: true, io: false, sync: true, stdout: false, stderr: false,
|
450
|
+
banner: ARG[:BANNER])
|
451
|
+
cmd = session_done(cmd)
|
460
452
|
log.info cmd
|
461
453
|
banner = format_banner(cmd.gsub(File.join(path, ''), ''), banner: banner, multiple: true)
|
462
|
-
cmd = cmd.sub(/^git\b/, "git --work-tree #{shell_quote(path)} --git-dir #{shell_quote(
|
454
|
+
cmd = cmd.sub(/^git\b/, "git --work-tree #{shell_quote(path)} --git-dir #{shell_quote(git_path)}")
|
463
455
|
begin
|
464
456
|
if io
|
465
457
|
[IO.popen(cmd), banner]
|
466
|
-
elsif
|
458
|
+
elsif stdin? ? sync : stdout
|
467
459
|
print_item banner
|
468
460
|
ret = `#{cmd}`
|
469
461
|
if !ret.empty?
|
470
462
|
puts ret
|
471
|
-
elsif banner && stdout && !
|
463
|
+
elsif banner && stdout && !stdin?
|
472
464
|
puts 'Success'
|
473
465
|
end
|
474
466
|
elsif sync || (!exception && !stderr)
|
@@ -482,7 +474,7 @@ module Squared
|
|
482
474
|
if ret == 0
|
483
475
|
write_lines(err, banner: banner)
|
484
476
|
else
|
485
|
-
write_lines(err, loglevel: Logger::DEBUG)
|
477
|
+
write_lines(err, loglevel: ::Logger::DEBUG)
|
486
478
|
end
|
487
479
|
end
|
488
480
|
else
|
@@ -493,16 +485,16 @@ module Squared
|
|
493
485
|
log.error e
|
494
486
|
raise if exception
|
495
487
|
|
496
|
-
warn e if
|
488
|
+
warn log_message(::Logger::WARN, e) if warning?
|
497
489
|
end
|
498
490
|
end
|
499
491
|
|
500
|
-
def write_lines(
|
492
|
+
def write_lines(data, banner: nil, loglevel: nil, grep: nil, sub: nil, pass: false)
|
501
493
|
grep = Regexp.new(grep == '*' ? '.+' : grep) if grep.is_a?(::String)
|
502
|
-
sub = nil if
|
503
|
-
|
494
|
+
sub = nil if stdin?
|
495
|
+
ret = 0
|
504
496
|
lines = []
|
505
|
-
|
497
|
+
data.each do |line|
|
506
498
|
next if grep && !line.match?(grep)
|
507
499
|
|
508
500
|
if loglevel
|
@@ -515,14 +507,14 @@ module Squared
|
|
515
507
|
puts line
|
516
508
|
end
|
517
509
|
end
|
518
|
-
|
510
|
+
ret += 1
|
519
511
|
end
|
520
|
-
print_item banner, lines if banner && (
|
521
|
-
|
512
|
+
print_item banner, lines if banner && (ret > 0 || !pass)
|
513
|
+
ret
|
522
514
|
end
|
523
515
|
|
524
516
|
def list_result(size, type, action: 'found', grep: nil)
|
525
|
-
return unless verbose
|
517
|
+
return unless verbose
|
526
518
|
|
527
519
|
if size > 0
|
528
520
|
styles = theme.fetch(:banner, []).reject { |s| s.to_s.end_with?('!') }
|
@@ -556,7 +548,7 @@ module Squared
|
|
556
548
|
end
|
557
549
|
|
558
550
|
def append_pathspec(files = [], expect: false, pass: false)
|
559
|
-
if files.empty? && (val =
|
551
|
+
if files.empty? && (val = option('pathspec'))
|
560
552
|
files = split_escape(val)
|
561
553
|
end
|
562
554
|
files = source_path(files, pass: pass)
|
@@ -572,54 +564,37 @@ module Squared
|
|
572
564
|
end
|
573
565
|
|
574
566
|
def append_head
|
575
|
-
@session << (
|
567
|
+
@session << (option('head') || option('tree-ish'))
|
576
568
|
end
|
577
569
|
|
578
570
|
def append_ours
|
579
|
-
if
|
571
|
+
if option('ours')
|
580
572
|
@session << '--ours'
|
581
|
-
elsif
|
573
|
+
elsif option('theirs')
|
582
574
|
@session << '--theirs'
|
583
575
|
end
|
584
576
|
end
|
585
577
|
|
586
578
|
def append_submodules(flag = nil)
|
587
|
-
if
|
579
|
+
if option('recurse-submodules', equals: '0')
|
588
580
|
@session << '--no-recurse-submodules'
|
589
|
-
elsif flag == :submodules ||
|
581
|
+
elsif flag == :submodules || option('recurse-submodules')
|
590
582
|
@session << '--recurse-submodules'
|
591
583
|
end
|
592
584
|
end
|
593
585
|
|
594
586
|
def append_option(list)
|
595
|
-
list.each { |val| @session << "--#{val}" if
|
596
|
-
end
|
597
|
-
|
598
|
-
def git_option(*args, equals: nil, zero: true)
|
599
|
-
for val in args
|
600
|
-
break if (ret = ENV["GIT_#{val.gsub(/\W/, '_').upcase}"])
|
601
|
-
end
|
602
|
-
if !equals.nil?
|
603
|
-
ret == equals.to_s
|
604
|
-
elsif !ret.nil? && !ret.empty? && !(ret == '0' && zero)
|
605
|
-
ret
|
606
|
-
end
|
587
|
+
list.each { |val| @session << "--#{val}" if option(val) }
|
607
588
|
end
|
608
589
|
|
609
590
|
def git_session(*cmd)
|
610
591
|
session('git', *cmd)
|
611
592
|
end
|
612
593
|
|
613
|
-
def
|
594
|
+
def git_path
|
614
595
|
base_path('.git')
|
615
596
|
end
|
616
597
|
|
617
|
-
def source_path?(val)
|
618
|
-
return val.to_s.start_with?(File.join(path, '').to_s) if Pathname.new(val).absolute?
|
619
|
-
|
620
|
-
!val.match?(%r{^\.\.[/\\]})
|
621
|
-
end
|
622
|
-
|
623
598
|
def push?
|
624
599
|
!@origin.nil? && !@branch.nil?
|
625
600
|
end
|
@@ -627,7 +602,13 @@ module Squared
|
|
627
602
|
def dry_run?
|
628
603
|
@session.include?('--dry-run')
|
629
604
|
end
|
605
|
+
|
606
|
+
def threadargs
|
607
|
+
{ stderr: true, exception: !workspace.series.multiple? }
|
608
|
+
end
|
630
609
|
end
|
610
|
+
|
611
|
+
Application.implement Git
|
631
612
|
end
|
632
613
|
end
|
633
614
|
end
|