squared 0.0.12 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +55 -0
- data/README.md +9 -2
- data/README.ruby.md +6 -4
- data/lib/squared/common/class.rb +2 -2
- data/lib/squared/common/format.rb +1 -1
- data/lib/squared/common/system.rb +7 -3
- data/lib/squared/common/utils.rb +6 -2
- data/lib/squared/config.rb +34 -34
- data/lib/squared/version.rb +1 -1
- data/lib/squared/workspace/application.rb +68 -36
- data/lib/squared/workspace/project/base.rb +232 -161
- data/lib/squared/workspace/project/git.rb +115 -61
- data/lib/squared/workspace/project/node.rb +189 -102
- data/lib/squared/workspace/project/python.rb +11 -9
- data/lib/squared/workspace/project/ruby.rb +31 -27
- data/lib/squared/workspace/repo.rb +28 -14
- data/lib/squared/workspace/series.rb +36 -12
- data/lib/squared/workspace.rb +8 -8
- data/squared.gemspec +1 -1
- metadata +3 -2
@@ -4,37 +4,36 @@ module Squared
|
|
4
4
|
module Workspace
|
5
5
|
module Project
|
6
6
|
class Git < Base
|
7
|
-
OPT_PULL = %w[all
|
8
|
-
OPT_FETCH = %w[
|
7
|
+
OPT_PULL = %w[all ff-only autostash prune tags depth=n since=d jobs=n dry-run].freeze
|
8
|
+
OPT_FETCH = %w[prune-tags].concat(OPT_PULL[3..-1]).freeze
|
9
9
|
private_constant :OPT_PULL, :OPT_FETCH
|
10
10
|
|
11
11
|
class << self
|
12
|
-
include
|
12
|
+
include Rake::DSL
|
13
13
|
|
14
14
|
def populate(ws, **)
|
15
15
|
return if ws.series[:pull].empty?
|
16
16
|
|
17
|
-
name = ws.task_name('
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
17
|
+
namespace(name = ws.task_name('git')) do
|
18
|
+
all = ws.task_join(name, 'all')
|
19
|
+
|
20
|
+
desc ws.task_name("#{all}[git?=rebase|stash,depend?]", desc: true)
|
21
|
+
task 'all', [:git, :depend] do |_, args|
|
22
|
+
cmd = case args.git
|
23
|
+
when 'rebase'
|
24
|
+
[ws.task_sync('rebase')]
|
25
|
+
when 'stash'
|
26
|
+
[ws.task_sync('stash'), ws.task_sync('pull')]
|
27
|
+
else
|
28
|
+
[ws.task_sync('pull')]
|
29
|
+
end
|
30
|
+
cmd << ws.task_sync('depend') if args.depend && !ws.series[:depend].empty?
|
31
|
+
cmd << ws.task_sync('build')
|
32
|
+
Common::Utils.task_invoke(*cmd, **ws.invokeargs)
|
23
33
|
end
|
24
|
-
|
25
|
-
|
26
|
-
sync.('rebase')
|
27
|
-
when 'stash'
|
28
|
-
invoke(sync.('stash'), **ws.invokeargs)
|
29
|
-
sync.('pull')
|
30
|
-
else
|
31
|
-
sync.('pull')
|
32
|
-
end]
|
33
|
-
cmd << ws.task_name('build')
|
34
|
-
Common::Utils.task_invoke(*cmd, **ws.invokeargs)
|
34
|
+
ws.series.sync << all
|
35
|
+
ws.series.multiple << all
|
35
36
|
end
|
36
|
-
ws.series.sync << name
|
37
|
-
ws.series.multiple << name
|
38
37
|
end
|
39
38
|
|
40
39
|
def tasks
|
@@ -63,7 +62,8 @@ module Squared
|
|
63
62
|
refs: %i[heads tags].freeze,
|
64
63
|
reset: %i[head soft mixed hard merge keep submodules].freeze,
|
65
64
|
restore: %i[worktree staged overlay].freeze,
|
66
|
-
rev: %i[commit branch].freeze
|
65
|
+
rev: %i[commit branch].freeze,
|
66
|
+
show: %i[oneline pretty format].freeze
|
67
67
|
}.freeze
|
68
68
|
|
69
69
|
def initialize(*, **)
|
@@ -200,6 +200,21 @@ module Squared
|
|
200
200
|
reset(flag, ref: args.ref)
|
201
201
|
end
|
202
202
|
end
|
203
|
+
when :show
|
204
|
+
if flag == :oneline
|
205
|
+
desc format_desc(action, flag, 'object*')
|
206
|
+
task flag, [:object] do |_, args|
|
207
|
+
objs = args.to_a
|
208
|
+
show(objs, pretty: 'oneline', abbrev: true)
|
209
|
+
end
|
210
|
+
else
|
211
|
+
desc format_desc(action, flag, 'format,object*')
|
212
|
+
task flag, [:format, :object] do |_, args|
|
213
|
+
format = guard_params(action, flag, args: args, key: :format)
|
214
|
+
objs = args.to_a[1..-1] || []
|
215
|
+
show(objs, "#{flag}": format)
|
216
|
+
end
|
217
|
+
end
|
203
218
|
end
|
204
219
|
end
|
205
220
|
end
|
@@ -220,7 +235,13 @@ module Squared
|
|
220
235
|
cmd << '--commit'
|
221
236
|
end
|
222
237
|
append_pull opts, OPT_PULL, flag
|
223
|
-
|
238
|
+
sub = if verbose
|
239
|
+
[
|
240
|
+
{ pat: /^(.+)(\|\s+\d+\s+)([^-]*)(-+)(.*)$/, styles: :red, index: 4 },
|
241
|
+
{ pat: /^(.+)(\|\s+\d+\s+)(\++)(-*)(.*)$/, styles: :green, index: 3 }
|
242
|
+
]
|
243
|
+
end
|
244
|
+
source(sync: sync, sub: sub, **threadargs)
|
224
245
|
end
|
225
246
|
|
226
247
|
def rebase
|
@@ -399,17 +420,34 @@ module Squared
|
|
399
420
|
raise_error('commit', 'pathspec', hint: 'missing') if (files = projectmap(files)).empty?
|
400
421
|
"-- #{files.join(' ')}"
|
401
422
|
end
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
423
|
+
origin = nil
|
424
|
+
branch = nil
|
425
|
+
upstream = false
|
426
|
+
source('git fetch --no-tags --quiet', io: true, banner: false)
|
427
|
+
source('git branch -vv --list', io: true, banner: false).first.each do |val|
|
428
|
+
next unless (data = /^\*\s(\S+)\s+(\h+)(?:\s\[(.+?)(?=\]\s)\])?\s/.match(val))
|
429
|
+
|
430
|
+
branch = data[1]
|
431
|
+
sha = data[2]
|
432
|
+
if !data[3]
|
433
|
+
unless (origin = option('repository', prefix: 'git', ignore: false))
|
434
|
+
out = source('git log -n1 --format=%h%d', io: true, stdout: true, banner: false).first
|
435
|
+
if (data = /^#{sha} \(HEAD -> #{Regexp.escape(branch)}, (.+?)\)$/m.match(out))
|
436
|
+
split_escape(data[1]).each do |val|
|
437
|
+
next unless val.end_with?("/#{branch}")
|
438
|
+
|
439
|
+
origin = val[0..val.size - branch.size - 2]
|
440
|
+
break
|
441
|
+
end
|
442
|
+
end
|
443
|
+
end
|
444
|
+
upstream = !origin.nil?
|
445
|
+
elsif (data = Regexp.new("^(.+)/#{Regexp.escape(branch)}$").match(data[3]))
|
446
|
+
origin = data[1]
|
410
447
|
end
|
448
|
+
break
|
411
449
|
end
|
412
|
-
raise_error('commit', 'work tree is not usable') unless
|
450
|
+
raise_error('commit', 'work tree is not usable') unless origin && branch
|
413
451
|
cmd = git_session 'commit'
|
414
452
|
cmd << '--dry-run' if option('dry-run')
|
415
453
|
if amend
|
@@ -424,6 +462,7 @@ module Squared
|
|
424
462
|
end
|
425
463
|
a = ['git add --verbose']
|
426
464
|
b = ['git push']
|
465
|
+
b << '--set-upstream' if upstream
|
427
466
|
if dry_run?
|
428
467
|
a << '--dry-run'
|
429
468
|
b << '--dry-run'
|
@@ -433,7 +472,7 @@ module Squared
|
|
433
472
|
b << @origin << @branch
|
434
473
|
puts if pass
|
435
474
|
source a.join(' ')
|
436
|
-
source
|
475
|
+
source cmd
|
437
476
|
source b.join(' ')
|
438
477
|
end
|
439
478
|
|
@@ -444,16 +483,38 @@ module Squared
|
|
444
483
|
source(stdout: true)
|
445
484
|
end
|
446
485
|
|
486
|
+
def show(objs, pretty: nil, format: nil, abbrev: nil)
|
487
|
+
cmd = git_session 'show'
|
488
|
+
case (flag = pretty&.downcase)
|
489
|
+
when 'oneline', 'short', 'medium', 'full', 'fuller', 'reference', 'email', 'raw'
|
490
|
+
cmd << "--pretty=#{flag}"
|
491
|
+
else
|
492
|
+
if pretty
|
493
|
+
cmd << "--pretty=#{shell_escape("tformat:#{pretty}", quote: true)}"
|
494
|
+
elsif format
|
495
|
+
cmd << "--format=#{shell_escape(format, quote: true)}"
|
496
|
+
end
|
497
|
+
end
|
498
|
+
if (abbrev ||= option('abbrev')) == true
|
499
|
+
cmd << '--abbrev-commit'
|
500
|
+
elsif abbrev.to_i > 0
|
501
|
+
cmd << "--abbrev=#{abbrev}"
|
502
|
+
end
|
503
|
+
append_value objs
|
504
|
+
source(exception: false)
|
505
|
+
end
|
506
|
+
|
447
507
|
private
|
448
508
|
|
449
|
-
def source(cmd = @session, exception: true, io: false, sync: true, stdout: false, stderr: false, banner: true
|
509
|
+
def source(cmd = @session, exception: true, io: false, sync: true, stdout: false, stderr: false, banner: true,
|
510
|
+
sub: nil)
|
450
511
|
cmd = session_done(cmd)
|
451
512
|
log.info cmd
|
452
513
|
banner = format_banner(cmd.gsub(File.join(path, ''), ''), banner: banner)
|
453
|
-
cmd = cmd.sub(/^git\b/, "git --work-tree
|
514
|
+
cmd = cmd.sub(/^git\b/, "git --work-tree=#{shell_quote(path)} --git-dir=#{shell_quote(gitpath)}")
|
454
515
|
begin
|
455
516
|
if io
|
456
|
-
[IO.popen(cmd), banner]
|
517
|
+
[stdout ? `#{cmd}` : IO.popen(cmd), banner]
|
457
518
|
elsif stdin? ? sync : stdout
|
458
519
|
print_item banner
|
459
520
|
ret = `#{cmd}`
|
@@ -469,11 +530,12 @@ module Squared
|
|
469
530
|
require 'open3'
|
470
531
|
if stderr
|
471
532
|
Open3.popen3(cmd) do |_, out, err|
|
472
|
-
ret = write_lines(out, banner: banner, pass: true)
|
533
|
+
ret = write_lines(out, banner: banner, sub: sub, pass: true)
|
473
534
|
if ret == 0
|
474
|
-
write_lines(err, banner: banner)
|
535
|
+
ret = write_lines(err, banner: banner)
|
536
|
+
puts 'Success' if ret == 0 && banner && !stdin?
|
475
537
|
else
|
476
|
-
write_lines(err, loglevel:
|
538
|
+
write_lines(err, loglevel: Logger::DEBUG)
|
477
539
|
end
|
478
540
|
end
|
479
541
|
else
|
@@ -484,15 +546,15 @@ module Squared
|
|
484
546
|
log.error e
|
485
547
|
raise if exception
|
486
548
|
|
487
|
-
warn log_message(
|
549
|
+
warn log_message(Logger::WARN, e) if warning?
|
488
550
|
end
|
489
551
|
end
|
490
552
|
|
491
553
|
def write_lines(data, banner: nil, loglevel: nil, grep: nil, sub: nil, pass: false)
|
492
|
-
grep = Regexp.new(grep == '*' ? '.+' : grep) if grep.is_a?(
|
554
|
+
grep = Regexp.new(grep == '*' ? '.+' : grep) if grep.is_a?(String)
|
493
555
|
sub = nil if stdin?
|
494
556
|
ret = 0
|
495
|
-
|
557
|
+
out = []
|
496
558
|
data.each do |line|
|
497
559
|
next if grep && !line.match?(grep)
|
498
560
|
|
@@ -501,14 +563,14 @@ module Squared
|
|
501
563
|
else
|
502
564
|
sub&.each { |h| line = sub_style(line, **h) }
|
503
565
|
if banner
|
504
|
-
|
566
|
+
out << line
|
505
567
|
else
|
506
568
|
puts line
|
507
569
|
end
|
508
570
|
end
|
509
571
|
ret += 1
|
510
572
|
end
|
511
|
-
print_item banner,
|
573
|
+
print_item banner, out if banner && (ret > 0 || !pass)
|
512
574
|
ret
|
513
575
|
end
|
514
576
|
|
@@ -528,10 +590,10 @@ module Squared
|
|
528
590
|
def append_pull(opts, list, flag = nil)
|
529
591
|
append_submodules flag
|
530
592
|
opts.each do |opt|
|
531
|
-
if list.include?(opt)
|
593
|
+
if list.include?(opt) || opt.match(/^(?:depth|jobs)=\d+$/)
|
532
594
|
@session << "--#{opt}"
|
533
|
-
elsif opt.match(/^
|
534
|
-
@session << "--
|
595
|
+
elsif opt.match(/^since=(.+)$/) && (val = Date.parse($1))
|
596
|
+
@session << "--shallow-since=\"#{val.strftime('%F %T')}\""
|
535
597
|
end
|
536
598
|
end
|
537
599
|
end
|
@@ -554,7 +616,7 @@ module Squared
|
|
554
616
|
end
|
555
617
|
|
556
618
|
def append_message(val)
|
557
|
-
@session << "--message
|
619
|
+
@session << "--message=\"#{double_quote(val)}\"" if val
|
558
620
|
end
|
559
621
|
|
560
622
|
def append_head
|
@@ -577,26 +639,18 @@ module Squared
|
|
577
639
|
end
|
578
640
|
end
|
579
641
|
|
580
|
-
def append_option(list)
|
581
|
-
list.each { |val| @session << "--#{val}" if option(val) }
|
582
|
-
end
|
583
|
-
|
584
642
|
def git_session(*cmd)
|
585
643
|
session('git', *cmd)
|
586
644
|
end
|
587
645
|
|
588
|
-
def gitpath
|
589
|
-
basepath('.git')
|
590
|
-
end
|
591
|
-
|
592
|
-
def push?
|
593
|
-
!@origin.nil? && !@branch.nil?
|
594
|
-
end
|
595
|
-
|
596
646
|
def dry_run?
|
597
647
|
@session.include?('--dry-run')
|
598
648
|
end
|
599
649
|
|
650
|
+
def gitpath
|
651
|
+
basepath('.git')
|
652
|
+
end
|
653
|
+
|
600
654
|
def threadargs
|
601
655
|
{ stderr: true, exception: exception || !workspace.series.multiple? }
|
602
656
|
end
|