squared 0.0.6 → 0.0.8
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 +48 -13
- data/lib/squared/common/base.rb +22 -16
- data/lib/squared/common/class.rb +5 -1
- data/lib/squared/common/format.rb +48 -45
- data/lib/squared/common/shell.rb +3 -3
- data/lib/squared/common/system.rb +35 -3
- data/lib/squared/common/task.rb +3 -11
- data/lib/squared/config.rb +21 -18
- data/lib/squared/version.rb +1 -1
- data/lib/squared/workspace/application.rb +136 -128
- data/lib/squared/workspace/project/base.rb +131 -72
- data/lib/squared/workspace/project/git.rb +73 -73
- data/lib/squared/workspace/project/node.rb +88 -63
- data/lib/squared/workspace/project/python.rb +48 -33
- data/lib/squared/workspace/project/ruby.rb +196 -64
- data/lib/squared/workspace/project.rb +4 -0
- data/lib/squared/workspace/repo.rb +41 -28
- data/lib/squared/workspace/series.rb +54 -43
- data/lib/squared/workspace.rb +11 -3
- data/squared.gemspec +1 -0
- metadata +16 -2
@@ -4,31 +4,33 @@ module Squared
|
|
4
4
|
module Workspace
|
5
5
|
module Project
|
6
6
|
class Git < Base
|
7
|
-
include Format
|
8
|
-
|
9
|
-
REF = :git
|
10
7
|
OPT_PULL = %w[all tags prune ff-only autostash dry-run].freeze
|
11
8
|
OPT_FETCH = %w[tags prune prune-tags depth=n dry-run].freeze
|
12
|
-
private_constant :
|
9
|
+
private_constant :OPT_PULL, :OPT_FETCH
|
13
10
|
|
14
11
|
class << self
|
15
|
-
|
12
|
+
include ::Rake::DSL
|
13
|
+
|
14
|
+
def populate(workspace, **)
|
16
15
|
return if workspace.series.pull.empty?
|
17
16
|
|
18
17
|
desc 'all[git?=rebase|stash]'
|
19
18
|
task 'all', [:git] do |_, args|
|
20
|
-
|
19
|
+
exception = workspace.exception
|
20
|
+
warning = workspace.warning
|
21
|
+
sync = ->(key) { workspace.task_defined?(s = "#{key}:sync") ? s : key }
|
21
22
|
pull = case args.git
|
22
23
|
when 'rebase'
|
23
|
-
sync.(
|
24
|
+
sync.('rebase')
|
24
25
|
when 'stash'
|
25
|
-
invoke
|
26
|
-
sync.(
|
26
|
+
invoke(sync.('stash'), exception: exception, warning: warning)
|
27
|
+
sync.('pull')
|
27
28
|
else
|
28
|
-
sync.(
|
29
|
+
sync.('pull')
|
29
30
|
end
|
30
|
-
invoke(pull, exception:
|
31
|
-
invoke(workspace.dev? ? :refresh : :build,
|
31
|
+
Common::Task.invoke(pull, exception: exception, warning: warning)
|
32
|
+
Common::Task.invoke(workspace.dev? && workspace.series.has?(:refresh) ? :refresh : :build,
|
33
|
+
exception: exception, warning: warning)
|
32
34
|
end
|
33
35
|
end
|
34
36
|
|
@@ -45,7 +47,7 @@ module Squared
|
|
45
47
|
end
|
46
48
|
end
|
47
49
|
|
48
|
-
@@tasks[
|
50
|
+
@@tasks[ref] = {
|
49
51
|
checkout: %i[branch detach force merge],
|
50
52
|
commit: %i[add amend amend-orig all no-all],
|
51
53
|
diff: %i[head cached branch files],
|
@@ -59,26 +61,29 @@ module Squared
|
|
59
61
|
rev: %i[commit branch]
|
60
62
|
}.freeze
|
61
63
|
|
64
|
+
def initialize(*, **)
|
65
|
+
super
|
66
|
+
initialize_ref(Git.ref)
|
67
|
+
end
|
68
|
+
|
62
69
|
def populate(*)
|
63
70
|
super
|
64
|
-
return unless gitdir.exist?
|
71
|
+
return unless gitdir.exist? && ref?(Git.ref)
|
65
72
|
|
66
73
|
namespace name do
|
67
|
-
@@tasks[
|
74
|
+
@@tasks[Git.ref].each do |action, flags|
|
68
75
|
namespace action do
|
69
76
|
flags.each do |flag|
|
70
77
|
case action
|
71
78
|
when :pull
|
72
79
|
desc format_desc(action, flag, OPT_PULL)
|
73
80
|
task flag, [:opts] do |_, args|
|
74
|
-
|
75
|
-
pull(flag, opts: opts)
|
81
|
+
pull(flag, opts: args.to_a)
|
76
82
|
end
|
77
83
|
when :fetch
|
78
84
|
desc format_desc(action, flag, OPT_FETCH)
|
79
85
|
task flag, [:opts] do |_, args|
|
80
|
-
|
81
|
-
fetch(flag, opts: opts)
|
86
|
+
fetch(flag, opts: args.to_a)
|
82
87
|
end
|
83
88
|
when :commit, :restore
|
84
89
|
if flag == :all
|
@@ -89,15 +94,16 @@ module Squared
|
|
89
94
|
else
|
90
95
|
desc format_desc(action, flag, 'pathspec+')
|
91
96
|
task flag, [:pathspec] do |_, args|
|
92
|
-
|
93
|
-
|
97
|
+
files = args.to_a
|
98
|
+
guard_params(action, flag, args: files)
|
99
|
+
__send__(action, flag, files)
|
94
100
|
end
|
95
101
|
end
|
96
102
|
when :stash
|
97
103
|
if flag == :push
|
98
104
|
desc format_desc(action, flag, 'pathspec*')
|
99
105
|
task flag, [:pathspec] do |_, args|
|
100
|
-
stash(flag,
|
106
|
+
stash(flag, args.to_a)
|
101
107
|
end
|
102
108
|
else
|
103
109
|
desc format_desc(action, flag, 'commit?')
|
@@ -120,20 +126,20 @@ module Squared
|
|
120
126
|
when :head
|
121
127
|
desc format_desc(action, flag, 'index?=0,pathspec*')
|
122
128
|
task flag, [:pathspec] do |_, args|
|
123
|
-
files =
|
124
|
-
index = /^\d+$/.match?(files.first) && !
|
129
|
+
files = args.to_a
|
130
|
+
index = /^\d+$/.match?(files.first) && !git_option('index') ? files.shift.to_i : 0
|
125
131
|
diff(flag, files, index: index)
|
126
132
|
end
|
127
133
|
when :cached
|
128
134
|
desc format_desc(action, flag, 'pathspec*')
|
129
135
|
task flag, [:pathspec] do |_, args|
|
130
|
-
diff(flag,
|
136
|
+
diff(flag, args.to_a)
|
131
137
|
end
|
132
138
|
when :branch
|
133
139
|
desc format_desc(action, flag, 'name,pathspec*')
|
134
140
|
task flag, [:name, :pathspec] do |_, args|
|
135
141
|
guard_params(action, flag, args: args, key: :name)
|
136
|
-
diff(flag,
|
142
|
+
diff(flag, args.to_a[1..-1], branch: args.name)
|
137
143
|
end
|
138
144
|
when :files
|
139
145
|
desc format_desc(action, flag, 'path1,path2')
|
@@ -165,7 +171,7 @@ module Squared
|
|
165
171
|
detach = args.detach
|
166
172
|
commit = args.commit
|
167
173
|
end
|
168
|
-
guard_params(
|
174
|
+
guard_params(action, flag, args: { create: create }, key: :create, pat: /^b$/i) if create
|
169
175
|
checkout(flag, branch: args.name, create: create, commit: commit, detach: detach)
|
170
176
|
end
|
171
177
|
when :detach
|
@@ -176,15 +182,14 @@ module Squared
|
|
176
182
|
else
|
177
183
|
desc format_desc(action, flag, 'pathspec*')
|
178
184
|
task flag, [:pathspec] do |_, args|
|
179
|
-
checkout(flag,
|
185
|
+
checkout(flag, args.to_a)
|
180
186
|
end
|
181
187
|
end
|
182
188
|
when :reset
|
183
189
|
if flag == :head
|
184
190
|
desc format_desc(action, flag, 'ref?=HEAD,pathspec+')
|
185
191
|
task flag, [:ref, :pathspec] do |_, args|
|
186
|
-
|
187
|
-
reset(flag, collect_args(args, :pathspec), ref: args.ref)
|
192
|
+
reset(flag, args.to_a[1..-1], ref: args.ref)
|
188
193
|
end
|
189
194
|
else
|
190
195
|
desc format_desc(action, flag, 'ref?=HEAD')
|
@@ -203,12 +208,12 @@ module Squared
|
|
203
208
|
cmd = git_session 'pull'
|
204
209
|
if flag == :'no-rebase'
|
205
210
|
cmd << '--no-rebase'
|
206
|
-
elsif flag == :rebase ||
|
211
|
+
elsif flag == :rebase || git_option('rebase')
|
207
212
|
cmd << '--rebase'
|
208
213
|
end
|
209
214
|
if flag == :'no-commit'
|
210
215
|
cmd << '--no-commit'
|
211
|
-
elsif flag == :commit ||
|
216
|
+
elsif flag == :commit || git_option('commit')
|
212
217
|
cmd << '--commit'
|
213
218
|
end
|
214
219
|
append_pull opts, OPT_PULL, flag
|
@@ -221,28 +226,28 @@ module Squared
|
|
221
226
|
|
222
227
|
def fetch(flag = nil, opts: [])
|
223
228
|
cmd = git_session 'fetch'
|
224
|
-
cmd << '--all' if flag == :all ||
|
229
|
+
cmd << '--all' if flag == :all || git_option('all')
|
225
230
|
append_pull opts, OPT_FETCH, flag
|
226
231
|
source(sync: invoked_sync?('fetch', flag), stderr: true, exception: !workspace.series.multiple?)
|
227
232
|
end
|
228
233
|
|
229
|
-
def stash(flag =
|
230
|
-
cmd = git_session 'stash', flag.to_s
|
234
|
+
def stash(flag = nil, files = [], commit: nil)
|
235
|
+
cmd = git_session 'stash', (flag || 'push').to_s
|
231
236
|
case flag
|
232
237
|
when :apply, :pop
|
233
|
-
cmd << '--index' if
|
238
|
+
cmd << '--index' if git_option('index')
|
234
239
|
cmd << commit
|
235
240
|
else
|
236
241
|
append_option %w[all staged include-untracked]
|
237
|
-
append_message
|
242
|
+
append_message git_option('message', 'm', zero: false)
|
238
243
|
append_pathspec files
|
239
244
|
end
|
240
245
|
source(sync: invoked_sync?('stash', flag), exception: workspace.exception)
|
241
246
|
end
|
242
247
|
|
243
248
|
def status
|
244
|
-
cmd = git_session 'status',
|
245
|
-
if (val =
|
249
|
+
cmd = git_session 'status', git_option('long') ? '--long' : '--short'
|
250
|
+
if (val = git_option('ignore-submodules'))
|
246
251
|
cmd << "--ignore-submodules=#{case val
|
247
252
|
when '0', 'none'
|
248
253
|
'none'
|
@@ -272,6 +277,7 @@ module Squared
|
|
272
277
|
def reset(flag, files = [], ref: nil)
|
273
278
|
cmd = git_session 'reset'
|
274
279
|
if flag == :head
|
280
|
+
guard_params('reset', flag, args: files)
|
275
281
|
append_commit ref
|
276
282
|
append_pathspec files
|
277
283
|
else
|
@@ -282,7 +288,7 @@ module Squared
|
|
282
288
|
append_submodules flag
|
283
289
|
else
|
284
290
|
cmd << '--mixed'
|
285
|
-
cmd << '--no-refresh' if
|
291
|
+
cmd << '--no-refresh' if git_option('refresh', equals: '0')
|
286
292
|
end
|
287
293
|
append_commit ref
|
288
294
|
end
|
@@ -293,10 +299,10 @@ module Squared
|
|
293
299
|
cmd = git_session 'checkout'
|
294
300
|
case flag
|
295
301
|
when :branch
|
296
|
-
cmd << '--detach' if detach == 'd' ||
|
302
|
+
cmd << '--detach' if detach == 'd' || git_option('detach')
|
297
303
|
if create
|
298
304
|
cmd << "-#{create}" << branch
|
299
|
-
if (val =
|
305
|
+
if (val = git_option('start-point'))
|
300
306
|
cmd << val
|
301
307
|
end
|
302
308
|
else
|
@@ -351,22 +357,22 @@ module Squared
|
|
351
357
|
sha = nil
|
352
358
|
end
|
353
359
|
end
|
354
|
-
if (val =
|
360
|
+
if (val = git_option('unified')).to_i > 0
|
355
361
|
cmd << "--unified=#{val}"
|
356
362
|
end
|
357
363
|
append_nocolor
|
358
364
|
case flag
|
359
365
|
when :cached
|
360
366
|
cmd << '--cached'
|
361
|
-
cmd << '--merge-base' if
|
367
|
+
cmd << '--merge-base' if git_option('merge-base')
|
362
368
|
when :branch
|
363
369
|
cmd << branch
|
364
370
|
when :files
|
365
371
|
cmd << '--no-index'
|
366
372
|
else
|
367
|
-
if (val =
|
373
|
+
if (val = git_option('index')) || index > 0
|
368
374
|
cmd << "HEAD~#{val || index}"
|
369
|
-
elsif sha &&
|
375
|
+
elsif sha && git_option('merge-base')
|
370
376
|
cmd << '--merge-base'
|
371
377
|
end
|
372
378
|
end
|
@@ -376,7 +382,7 @@ module Squared
|
|
376
382
|
end
|
377
383
|
|
378
384
|
def commit(flag, files = [], message: nil, pass: false)
|
379
|
-
message ||=
|
385
|
+
message ||= git_option('message', 'm', zero: false)
|
380
386
|
amend = flag.to_s.start_with?('amend')
|
381
387
|
if !message && !amend
|
382
388
|
return if pass
|
@@ -391,7 +397,7 @@ module Squared
|
|
391
397
|
"-- #{files.join(' ')}"
|
392
398
|
end
|
393
399
|
if !push?
|
394
|
-
source('git branch -vv --list', io: true, banner: false)
|
400
|
+
source('git branch -vv --list', io: true, banner: false).first.each do |val|
|
395
401
|
origin = %r{^\* [^\[]+(?<= )\[([\w.-/]+?)/([\w.-]+)\] }.match(val)
|
396
402
|
next unless origin
|
397
403
|
|
@@ -403,7 +409,7 @@ module Squared
|
|
403
409
|
raise_error('commit', 'work tree is not usable') unless push?
|
404
410
|
|
405
411
|
cmd = git_session 'commit'
|
406
|
-
cmd << '--dry-run' if
|
412
|
+
cmd << '--dry-run' if git_option('dry-run')
|
407
413
|
if amend
|
408
414
|
cmd << '--amend'
|
409
415
|
else
|
@@ -411,7 +417,7 @@ module Squared
|
|
411
417
|
end
|
412
418
|
if message
|
413
419
|
append_message message
|
414
|
-
elsif flag == :'amend-orig' ||
|
420
|
+
elsif flag == :'amend-orig' || git_option('no-edit')
|
415
421
|
cmd << '--no-edit'
|
416
422
|
end
|
417
423
|
a = ['git add --verbose']
|
@@ -440,14 +446,14 @@ module Squared
|
|
440
446
|
source(stdout: true)
|
441
447
|
end
|
442
448
|
|
443
|
-
|
449
|
+
private
|
444
450
|
|
445
451
|
def source(cmd = @session, exception: true, banner: true, io: false, sync: true, stdout: false, stderr: false)
|
446
452
|
cmd = close_session(cmd)
|
447
453
|
log.info cmd
|
454
|
+
banner = format_banner(cmd.gsub(File.join(path, ''), ''), banner: banner, multiple: true)
|
455
|
+
cmd = cmd.sub(/^git\b/, "git --work-tree #{shell_quote(path)} --git-dir #{shell_quote(gitdir)}")
|
448
456
|
begin
|
449
|
-
banner = format_banner(cmd.gsub(File.join(path, ''), ''), banner: banner, multiple: true)
|
450
|
-
cmd = cmd.sub(/^git\b/, "git --work-tree #{shell_quote(path)} --git-dir #{shell_quote(gitdir)}")
|
451
457
|
if io
|
452
458
|
[IO.popen(cmd), banner]
|
453
459
|
elsif pipe? ? sync : stdout
|
@@ -480,7 +486,7 @@ module Squared
|
|
480
486
|
log.error e
|
481
487
|
raise if exception
|
482
488
|
|
483
|
-
warn e
|
489
|
+
warn e if workspace.warning
|
484
490
|
end
|
485
491
|
end
|
486
492
|
|
@@ -526,14 +532,6 @@ module Squared
|
|
526
532
|
files.map { |val| val == '.' ? '.' : shell_quote(base_path(val.strip)) }
|
527
533
|
end
|
528
534
|
|
529
|
-
def source_path?(val)
|
530
|
-
return val.to_s.start_with?(File.join(path, '').to_s) if Pathname.new(val).absolute?
|
531
|
-
|
532
|
-
!val.match?(%r{^\.\.[/\\]})
|
533
|
-
end
|
534
|
-
|
535
|
-
private
|
536
|
-
|
537
535
|
def append_pull(opts, list, flag = nil)
|
538
536
|
append_submodules flag
|
539
537
|
opts.each do |opt|
|
@@ -551,7 +549,7 @@ module Squared
|
|
551
549
|
end
|
552
550
|
|
553
551
|
def append_pathspec(files = [], expect: false, pass: false)
|
554
|
-
if files.empty? && (val =
|
552
|
+
if files.empty? && (val = git_option('pathspec'))
|
555
553
|
files = split_escape(val)
|
556
554
|
end
|
557
555
|
files = source_path(files, pass: pass)
|
@@ -567,30 +565,30 @@ module Squared
|
|
567
565
|
end
|
568
566
|
|
569
567
|
def append_head
|
570
|
-
@session << (
|
568
|
+
@session << (git_option('head') || git_option('tree-ish'))
|
571
569
|
end
|
572
570
|
|
573
571
|
def append_ours
|
574
|
-
if
|
572
|
+
if git_option('ours')
|
575
573
|
@session << '--ours'
|
576
|
-
elsif
|
574
|
+
elsif git_option('theirs')
|
577
575
|
@session << '--theirs'
|
578
576
|
end
|
579
577
|
end
|
580
578
|
|
581
579
|
def append_submodules(flag = nil)
|
582
|
-
if
|
580
|
+
if git_option('recurse-submodules', equals: '0')
|
583
581
|
@session << '--no-recurse-submodules'
|
584
|
-
elsif flag == :submodules ||
|
582
|
+
elsif flag == :submodules || git_option('recurse-submodules')
|
585
583
|
@session << '--recurse-submodules'
|
586
584
|
end
|
587
585
|
end
|
588
586
|
|
589
587
|
def append_option(list)
|
590
|
-
list.each { |val| @session << "--#{val}" if
|
588
|
+
list.each { |val| @session << "--#{val}" if git_option(val) }
|
591
589
|
end
|
592
590
|
|
593
|
-
def
|
591
|
+
def git_option(*args, equals: nil, zero: true)
|
594
592
|
for val in args
|
595
593
|
break if (ret = ENV["GIT_#{val.gsub(/\W/, '_').upcase}"])
|
596
594
|
end
|
@@ -606,11 +604,13 @@ module Squared
|
|
606
604
|
end
|
607
605
|
|
608
606
|
def gitdir
|
609
|
-
|
607
|
+
base_path('.git')
|
610
608
|
end
|
611
609
|
|
612
|
-
def
|
613
|
-
|
610
|
+
def source_path?(val)
|
611
|
+
return val.to_s.start_with?(File.join(path, '').to_s) if Pathname.new(val).absolute?
|
612
|
+
|
613
|
+
!val.match?(%r{^\.\.[/\\]})
|
614
614
|
end
|
615
615
|
|
616
616
|
def push?
|