squared 0.0.10 → 0.0.12
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.ruby.md +98 -26
- data/lib/squared/app.rb +10 -0
- data/lib/squared/common/base.rb +12 -16
- data/lib/squared/common/class.rb +26 -1
- data/lib/squared/common/format.rb +79 -24
- data/lib/squared/common/prompt.rb +36 -0
- data/lib/squared/common/shell.rb +4 -3
- data/lib/squared/common/system.rb +15 -47
- data/lib/squared/common/utils.rb +51 -16
- data/lib/squared/common.rb +1 -4
- data/lib/squared/config.rb +48 -43
- data/lib/squared/version.rb +1 -1
- data/lib/squared/workspace/application.rb +245 -125
- data/lib/squared/workspace/project/base.rb +448 -188
- data/lib/squared/workspace/project/git.rb +97 -113
- data/lib/squared/workspace/project/node.rb +217 -109
- data/lib/squared/workspace/project/python.rb +37 -34
- data/lib/squared/workspace/project/ruby.rb +137 -100
- data/lib/squared/workspace/project.rb +0 -3
- data/lib/squared/workspace/repo.rb +32 -18
- data/lib/squared/workspace/series.rb +82 -53
- data/lib/squared/workspace.rb +6 -5
- data/lib/squared.rb +1 -11
- metadata +4 -3
- data/lib/squared/common/task.rb +0 -24
@@ -12,58 +12,63 @@ 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
|
+
name = ws.task_name('all')
|
17
18
|
desc ws.task_name('all[git?=rebase|stash]', desc: true)
|
18
|
-
task
|
19
|
+
task name, [:git] do |_, args|
|
19
20
|
sync = lambda do |key|
|
20
21
|
key = ws.task_name(key)
|
21
|
-
ws.task_defined?(ret =
|
22
|
+
ws.task_defined?(ret = ws.task_join(key, 'sync')) ? ret : key
|
22
23
|
end
|
23
24
|
cmd = [case args.git
|
24
25
|
when 'rebase'
|
25
26
|
sync.('rebase')
|
26
27
|
when 'stash'
|
27
|
-
invoke(sync.('stash'),
|
28
|
+
invoke(sync.('stash'), **ws.invokeargs)
|
28
29
|
sync.('pull')
|
29
30
|
else
|
30
31
|
sync.('pull')
|
31
32
|
end]
|
32
|
-
cmd << ws.task_name(
|
33
|
-
Common::
|
33
|
+
cmd << ws.task_name('build')
|
34
|
+
Common::Utils.task_invoke(*cmd, **ws.invokeargs)
|
34
35
|
end
|
36
|
+
ws.series.sync << name
|
37
|
+
ws.series.multiple << name
|
35
38
|
end
|
36
39
|
|
37
40
|
def tasks
|
38
41
|
%i[pull rebase fetch stash status].freeze
|
39
42
|
end
|
40
43
|
|
41
|
-
def
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
44
|
+
def batchargs
|
45
|
+
[ref, { 'pull-s': %i[stash pull], 'rebase-s': %i[stash rebase] }]
|
46
|
+
end
|
47
|
+
|
48
|
+
def config?(val)
|
49
|
+
return false unless (val = as_path(val))
|
50
|
+
|
51
|
+
val.join('.git').directory?
|
47
52
|
end
|
48
53
|
end
|
49
54
|
|
50
55
|
@@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]
|
56
|
+
checkout: %i[branch detach force merge].freeze,
|
57
|
+
commit: %i[add amend amend-orig all no-all].freeze,
|
58
|
+
diff: %i[head cached branch files].freeze,
|
59
|
+
fetch: %i[all submodules unshallow].freeze,
|
60
|
+
files: %i[cached modified deleted others].freeze,
|
61
|
+
pull: %i[head rebase no-rebase commit no-commit submodules].freeze,
|
62
|
+
stash: %i[push pop apply list clear].freeze,
|
63
|
+
refs: %i[heads tags].freeze,
|
64
|
+
reset: %i[head soft mixed hard merge keep submodules].freeze,
|
65
|
+
restore: %i[worktree staged overlay].freeze,
|
66
|
+
rev: %i[commit branch].freeze
|
62
67
|
}.freeze
|
63
68
|
|
64
69
|
def initialize(*, **)
|
65
70
|
super
|
66
|
-
initialize_ref(Git.ref) if
|
71
|
+
initialize_ref(Git.ref) if gitpath.exist?
|
67
72
|
end
|
68
73
|
|
69
74
|
def ref
|
@@ -93,8 +98,7 @@ module Squared
|
|
93
98
|
else
|
94
99
|
desc format_desc(action, flag, 'pathspec+')
|
95
100
|
task flag, [:pathspec] do |_, args|
|
96
|
-
files = args.to_a
|
97
|
-
guard_params(action, flag, args: files)
|
101
|
+
files = guard_params(action, flag, args: args.to_a)
|
98
102
|
__send__(action, flag, files)
|
99
103
|
end
|
100
104
|
end
|
@@ -126,11 +130,7 @@ module Squared
|
|
126
130
|
desc format_desc(action, flag, 'index?=0,pathspec*')
|
127
131
|
task flag, [:pathspec] do |_, args|
|
128
132
|
files = args.to_a
|
129
|
-
diff(flag, files, index:
|
130
|
-
files.shift.to_i
|
131
|
-
else
|
132
|
-
0
|
133
|
-
end)
|
133
|
+
diff(flag, files, index: /^\d+$/.match?(files[0]) && !option('index') ? files.shift.to_i : 0)
|
134
134
|
end
|
135
135
|
when :cached
|
136
136
|
desc format_desc(action, flag, 'pathspec*')
|
@@ -140,15 +140,15 @@ module Squared
|
|
140
140
|
when :branch
|
141
141
|
desc format_desc(action, flag, 'name,pathspec*')
|
142
142
|
task flag, [:name, :pathspec] do |_, args|
|
143
|
-
guard_params(action, flag, args: args, key: :name)
|
144
|
-
diff(flag, args.to_a[1..-1], branch:
|
143
|
+
branch = guard_params(action, flag, args: args, key: :name)
|
144
|
+
diff(flag, args.to_a[1..-1] || [], branch: branch)
|
145
145
|
end
|
146
146
|
when :files
|
147
147
|
desc format_desc(action, flag, 'path1,path2')
|
148
148
|
task flag, [:path1, :path2] do |_, args|
|
149
|
-
guard_params(action, flag, args: args, key: :path1)
|
150
|
-
guard_params(action, flag, args: args, key: :path2)
|
151
|
-
diff(flag, [
|
149
|
+
path1 = guard_params(action, flag, args: args, key: :path1)
|
150
|
+
path2 = guard_params(action, flag, args: args, key: :path2)
|
151
|
+
diff(flag, [path1, path2])
|
152
152
|
end
|
153
153
|
end
|
154
154
|
when :checkout
|
@@ -156,7 +156,7 @@ module Squared
|
|
156
156
|
when :branch
|
157
157
|
desc format_desc(action, flag, 'name,create?=b|B,commit?,detach?=d')
|
158
158
|
task flag, [:name, :create, :commit, :detach] do |_, args|
|
159
|
-
guard_params(action, flag, args: args, key: :name)
|
159
|
+
branch = guard_params(action, flag, args: args, key: :name)
|
160
160
|
create = args.create
|
161
161
|
if args.commit == 'd'
|
162
162
|
detach = 'd'
|
@@ -174,7 +174,7 @@ module Squared
|
|
174
174
|
commit = args.commit
|
175
175
|
end
|
176
176
|
guard_params(action, flag, args: { create: create }, key: :create, pat: /^b$/i) if create
|
177
|
-
checkout(flag, branch:
|
177
|
+
checkout(flag, branch: branch, create: create, commit: commit, detach: detach)
|
178
178
|
end
|
179
179
|
when :detach
|
180
180
|
desc format_desc(action, flag, 'branch/commit?')
|
@@ -189,10 +189,9 @@ module Squared
|
|
189
189
|
end
|
190
190
|
when :reset
|
191
191
|
if flag == :head
|
192
|
-
desc format_desc(action, flag, 'ref
|
192
|
+
desc format_desc(action, flag, 'ref,pathspec+')
|
193
193
|
task flag, [:ref, :pathspec] do |_, args|
|
194
|
-
files = args.to_a[1..-1]
|
195
|
-
guard_params(action, flag, args: files)
|
194
|
+
files = guard_params(action, flag, args: args.to_a[1..-1] || [])
|
196
195
|
reset(flag, files, ref: args.ref)
|
197
196
|
end
|
198
197
|
else
|
@@ -210,18 +209,18 @@ module Squared
|
|
210
209
|
|
211
210
|
def pull(flag = nil, sync: invoked_sync?('pull', flag), opts: [])
|
212
211
|
cmd = git_session 'pull'
|
213
|
-
if flag == :'no-rebase'
|
212
|
+
if flag == :'no-rebase' || option('rebase', equals: '0')
|
214
213
|
cmd << '--no-rebase'
|
215
|
-
elsif flag == :rebase ||
|
214
|
+
elsif flag == :rebase || option('rebase')
|
216
215
|
cmd << '--rebase'
|
217
216
|
end
|
218
|
-
if flag == :'no-commit'
|
217
|
+
if flag == :'no-commit' || option('commit', equals: '0')
|
219
218
|
cmd << '--no-commit'
|
220
|
-
elsif flag == :commit ||
|
219
|
+
elsif flag == :commit || option('commit')
|
221
220
|
cmd << '--commit'
|
222
221
|
end
|
223
222
|
append_pull opts, OPT_PULL, flag
|
224
|
-
source(sync: sync, **
|
223
|
+
source(sync: sync, **threadargs)
|
225
224
|
end
|
226
225
|
|
227
226
|
def rebase
|
@@ -230,28 +229,28 @@ module Squared
|
|
230
229
|
|
231
230
|
def fetch(flag = nil, opts: [])
|
232
231
|
cmd = git_session 'fetch'
|
233
|
-
cmd << '--all' if flag == :all ||
|
232
|
+
cmd << '--all' if flag == :all || option('all')
|
234
233
|
append_pull opts, OPT_FETCH, flag
|
235
|
-
source(sync: invoked_sync?('fetch', flag), **
|
234
|
+
source(sync: invoked_sync?('fetch', flag), **threadargs)
|
236
235
|
end
|
237
236
|
|
238
237
|
def stash(flag = nil, files = [], commit: nil)
|
239
|
-
cmd = git_session 'stash',
|
238
|
+
cmd = git_session 'stash', flag || 'push'
|
240
239
|
case flag
|
241
240
|
when :apply, :pop
|
242
|
-
cmd << '--index' if
|
241
|
+
cmd << '--index' if option('index')
|
243
242
|
cmd << commit
|
244
243
|
else
|
245
244
|
append_option %w[all staged include-untracked].freeze
|
246
|
-
append_message
|
245
|
+
append_message option('message', 'm', ignore: false)
|
247
246
|
append_pathspec files
|
248
247
|
end
|
249
|
-
source(sync: invoked_sync?('stash', flag), **
|
248
|
+
source(sync: invoked_sync?('stash', flag), **threadargs)
|
250
249
|
end
|
251
250
|
|
252
251
|
def status
|
253
|
-
cmd = git_session 'status',
|
254
|
-
if (val =
|
252
|
+
cmd = git_session 'status', option('long') ? '--long' : '--short'
|
253
|
+
if (val = option('ignore-submodules', ignore: false))
|
255
254
|
cmd << "--ignore-submodules=#{case val
|
256
255
|
when '0', 'none'
|
257
256
|
'none'
|
@@ -269,15 +268,15 @@ module Squared
|
|
269
268
|
print_item banner
|
270
269
|
banner = nil
|
271
270
|
end
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
271
|
+
ret = write_lines(out, banner: banner, sub: if verbose
|
272
|
+
[
|
273
|
+
{ pat: /^(.)([A-Z])(.+)$/, styles: :red, index: 2 },
|
274
|
+
{ pat: /^([A-Z])(.+)$/, styles: :green },
|
275
|
+
{ pat: /^(\?\?)(.+)$/, styles: :red },
|
276
|
+
{ pat: /^(## )(.+)(\.{3})(.+)$/,
|
277
|
+
styles: [nil, :green, nil, :red], index: -1 }
|
278
|
+
]
|
279
|
+
end)
|
281
280
|
list_result(ret, 'files', action: 'modified')
|
282
281
|
end
|
283
282
|
|
@@ -294,7 +293,7 @@ module Squared
|
|
294
293
|
append_submodules flag
|
295
294
|
else
|
296
295
|
cmd << '--mixed'
|
297
|
-
cmd << '--no-refresh' if
|
296
|
+
cmd << '--no-refresh' if option('refresh', equals: '0')
|
298
297
|
end
|
299
298
|
append_commit ref
|
300
299
|
end
|
@@ -305,10 +304,10 @@ module Squared
|
|
305
304
|
cmd = git_session 'checkout'
|
306
305
|
case flag
|
307
306
|
when :branch
|
308
|
-
cmd << '--detach' if detach == 'd' ||
|
307
|
+
cmd << '--detach' if detach == 'd' || option('detach')
|
309
308
|
if create
|
310
309
|
cmd << "-#{create}" << branch
|
311
|
-
if (val =
|
310
|
+
if (val = option('start-point'))
|
312
311
|
cmd << val
|
313
312
|
end
|
314
313
|
else
|
@@ -362,32 +361,32 @@ module Squared
|
|
362
361
|
sha = nil
|
363
362
|
end
|
364
363
|
end
|
365
|
-
if (val =
|
364
|
+
if (val = option('unified')).to_i > 0
|
366
365
|
cmd << "--unified=#{val}"
|
367
366
|
end
|
368
367
|
append_nocolor
|
369
368
|
case flag
|
370
369
|
when :cached
|
371
370
|
cmd << '--cached'
|
372
|
-
cmd << '--merge-base' if
|
371
|
+
cmd << '--merge-base' if option('merge-base')
|
373
372
|
when :branch
|
374
373
|
cmd << branch
|
375
374
|
when :files
|
376
375
|
cmd << '--no-index'
|
377
376
|
else
|
378
|
-
if (val =
|
377
|
+
if (val = option('index')) || index > 0
|
379
378
|
cmd << "HEAD~#{val || index}"
|
380
|
-
elsif sha &&
|
379
|
+
elsif sha && option('merge-base')
|
381
380
|
cmd << '--merge-base'
|
382
381
|
end
|
383
382
|
end
|
384
383
|
cmd << sha
|
385
|
-
append_pathspec(files,
|
384
|
+
append_pathspec(files, parent: flag == :files)
|
386
385
|
source(exception: cmd.include?('--exit-code'))
|
387
386
|
end
|
388
387
|
|
389
388
|
def commit(flag, files = [], message: nil, pass: false)
|
390
|
-
message ||=
|
389
|
+
message ||= option('message', 'm', prefix: 'git', ignore: false)
|
391
390
|
amend = flag.to_s.start_with?('amend')
|
392
391
|
if !message && !amend
|
393
392
|
return if pass
|
@@ -397,8 +396,7 @@ module Squared
|
|
397
396
|
pathspec = if flag == :all || (amend && files.size == 1 && files.first == '*')
|
398
397
|
'--all'
|
399
398
|
else
|
400
|
-
files =
|
401
|
-
raise_error('commit', 'pathspec', hint: 'missing') if files.empty?
|
399
|
+
raise_error('commit', 'pathspec', hint: 'missing') if (files = projectmap(files)).empty?
|
402
400
|
"-- #{files.join(' ')}"
|
403
401
|
end
|
404
402
|
unless push?
|
@@ -413,7 +411,7 @@ module Squared
|
|
413
411
|
end
|
414
412
|
raise_error('commit', 'work tree is not usable') unless push?
|
415
413
|
cmd = git_session 'commit'
|
416
|
-
cmd << '--dry-run' if
|
414
|
+
cmd << '--dry-run' if option('dry-run')
|
417
415
|
if amend
|
418
416
|
cmd << '--amend'
|
419
417
|
else
|
@@ -421,7 +419,7 @@ module Squared
|
|
421
419
|
end
|
422
420
|
if message
|
423
421
|
append_message message
|
424
|
-
elsif flag == :'amend-orig' ||
|
422
|
+
elsif flag == :'amend-orig' || option('no-edit')
|
425
423
|
cmd << '--no-edit'
|
426
424
|
end
|
427
425
|
a = ['git add --verbose']
|
@@ -448,11 +446,11 @@ module Squared
|
|
448
446
|
|
449
447
|
private
|
450
448
|
|
451
|
-
def source(cmd = @session, exception: true,
|
452
|
-
cmd =
|
449
|
+
def source(cmd = @session, exception: true, io: false, sync: true, stdout: false, stderr: false, banner: true)
|
450
|
+
cmd = session_done(cmd)
|
453
451
|
log.info cmd
|
454
|
-
banner = format_banner(cmd.gsub(File.join(path, ''), ''), banner: banner
|
455
|
-
cmd = cmd.sub(/^git\b/, "git --work-tree #{shell_quote(path)} --git-dir #{shell_quote(
|
452
|
+
banner = format_banner(cmd.gsub(File.join(path, ''), ''), banner: banner)
|
453
|
+
cmd = cmd.sub(/^git\b/, "git --work-tree #{shell_quote(path)} --git-dir #{shell_quote(gitpath)}")
|
456
454
|
begin
|
457
455
|
if io
|
458
456
|
[IO.popen(cmd), banner]
|
@@ -527,11 +525,6 @@ module Squared
|
|
527
525
|
end
|
528
526
|
end
|
529
527
|
|
530
|
-
def source_path(files, pass: false)
|
531
|
-
files = files.select { |val| source_path?(val) } unless pass
|
532
|
-
files.map { |val| val == '.' ? '.' : shell_quote(base_path(val.strip)) }
|
533
|
-
end
|
534
|
-
|
535
528
|
def append_pull(opts, list, flag = nil)
|
536
529
|
append_submodules flag
|
537
530
|
opts.each do |opt|
|
@@ -545,18 +538,18 @@ module Squared
|
|
545
538
|
|
546
539
|
def append_commit(val)
|
547
540
|
val = val.to_s.strip
|
548
|
-
val.empty? ? 'HEAD' : val
|
541
|
+
@session << (val.empty? ? 'HEAD' : val)
|
549
542
|
end
|
550
543
|
|
551
|
-
def append_pathspec(files = [], expect: false,
|
552
|
-
if files.empty? && (val =
|
544
|
+
def append_pathspec(files = [], expect: false, parent: false)
|
545
|
+
if files.empty? && (val = option('pathspec'))
|
553
546
|
files = split_escape(val)
|
554
547
|
end
|
555
|
-
files =
|
548
|
+
files = projectmap(files, parent: parent)
|
556
549
|
if !files.empty?
|
557
550
|
@session << "-- #{files.join(' ')}"
|
558
551
|
elsif expect
|
559
|
-
raise_error(
|
552
|
+
raise_error(parent ? 'pathspec not present' : 'pathspec not within worktree', hint: 'invalid')
|
560
553
|
end
|
561
554
|
end
|
562
555
|
|
@@ -565,50 +558,35 @@ module Squared
|
|
565
558
|
end
|
566
559
|
|
567
560
|
def append_head
|
568
|
-
@session << (
|
561
|
+
@session << (option('head') || option('tree-ish'))
|
569
562
|
end
|
570
563
|
|
571
564
|
def append_ours
|
572
|
-
if
|
565
|
+
if option('ours')
|
573
566
|
@session << '--ours'
|
574
|
-
elsif
|
567
|
+
elsif option('theirs')
|
575
568
|
@session << '--theirs'
|
576
569
|
end
|
577
570
|
end
|
578
571
|
|
579
572
|
def append_submodules(flag = nil)
|
580
|
-
if
|
573
|
+
if option('recurse-submodules', equals: '0')
|
581
574
|
@session << '--no-recurse-submodules'
|
582
|
-
elsif flag == :submodules ||
|
575
|
+
elsif flag == :submodules || option('recurse-submodules')
|
583
576
|
@session << '--recurse-submodules'
|
584
577
|
end
|
585
578
|
end
|
586
579
|
|
587
580
|
def append_option(list)
|
588
|
-
list.each { |val| @session << "--#{val}" if
|
589
|
-
end
|
590
|
-
|
591
|
-
def git_option(*args, equals: nil, zero: true)
|
592
|
-
for val in args
|
593
|
-
break if (ret = ENV["GIT_#{val.gsub(/\W/, '_').upcase}"])
|
594
|
-
end
|
595
|
-
if !equals.nil?
|
596
|
-
ret == equals.to_s
|
597
|
-
elsif !ret.nil? && !ret.empty? && !(ret == '0' && zero)
|
598
|
-
ret
|
599
|
-
end
|
581
|
+
list.each { |val| @session << "--#{val}" if option(val) }
|
600
582
|
end
|
601
583
|
|
602
584
|
def git_session(*cmd)
|
603
585
|
session('git', *cmd)
|
604
586
|
end
|
605
587
|
|
606
|
-
def
|
607
|
-
|
608
|
-
end
|
609
|
-
|
610
|
-
def gitdir
|
611
|
-
base_path('.git')
|
588
|
+
def gitpath
|
589
|
+
basepath('.git')
|
612
590
|
end
|
613
591
|
|
614
592
|
def push?
|
@@ -618,7 +596,13 @@ module Squared
|
|
618
596
|
def dry_run?
|
619
597
|
@session.include?('--dry-run')
|
620
598
|
end
|
599
|
+
|
600
|
+
def threadargs
|
601
|
+
{ stderr: true, exception: exception || !workspace.series.multiple? }
|
602
|
+
end
|
621
603
|
end
|
604
|
+
|
605
|
+
Application.implement Git
|
622
606
|
end
|
623
607
|
end
|
624
608
|
end
|