squared 0.0.1 → 0.0.2
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/README.md +5 -5
- data/README.ruby.md +51 -16
- data/lib/squared/common/class.rb +6 -0
- data/lib/squared/common/format.rb +63 -23
- data/lib/squared/common/shell.rb +9 -1
- data/lib/squared/common/system.rb +4 -0
- data/lib/squared/common.rb +22 -15
- data/lib/squared/config.rb +37 -25
- data/lib/squared/repo/project/base.rb +166 -94
- data/lib/squared/repo/project/git.rb +138 -51
- data/lib/squared/repo/project/node.rb +207 -123
- data/lib/squared/repo/project/python.rb +48 -29
- data/lib/squared/repo/project/ruby.rb +71 -62
- data/lib/squared/repo/project.rb +0 -30
- data/lib/squared/repo/workspace.rb +165 -117
- data/lib/squared/repo.rb +2 -2
- data/lib/squared/version.rb +1 -1
- metadata +2 -2
@@ -3,8 +3,7 @@
|
|
3
3
|
module Squared
|
4
4
|
module Repo
|
5
5
|
class Workspace
|
6
|
-
include Common
|
7
|
-
include Format
|
6
|
+
include Common::Format
|
8
7
|
include System
|
9
8
|
include Task
|
10
9
|
include ::Rake::DSL
|
@@ -16,6 +15,7 @@ module Squared
|
|
16
15
|
outdated: [],
|
17
16
|
refresh: [],
|
18
17
|
doc: [],
|
18
|
+
test: [],
|
19
19
|
clean: []
|
20
20
|
}
|
21
21
|
TASK_BASE = {}
|
@@ -42,20 +42,19 @@ module Squared
|
|
42
42
|
project_kind.find { |proj| proj.is_a?(path) } if path
|
43
43
|
end
|
44
44
|
|
45
|
+
def to_s
|
46
|
+
/[^:]+$/.match(super.to_s)[0]
|
47
|
+
end
|
48
|
+
|
45
49
|
attr_reader :project_kind
|
46
50
|
end
|
47
51
|
|
48
52
|
@project_kind = []
|
49
53
|
|
50
54
|
attr_reader :main, :root, :home, :series
|
51
|
-
attr_accessor :
|
55
|
+
attr_accessor :manifest, :manifest_url, :exception, :styles, :pipe, :verbose
|
52
56
|
|
53
57
|
def initialize(main)
|
54
|
-
prompt = lambda do |path|
|
55
|
-
return false unless path.directory?
|
56
|
-
|
57
|
-
confirm "#{log_title(:warn)} \"#{sub_style(path, :bold)}\" is not empty. Continue with installation? [y/N] "
|
58
|
-
end
|
59
58
|
@main = main.to_s
|
60
59
|
@home = if (val = env('REPO_HOME'))
|
61
60
|
home = Pathname.new(val)
|
@@ -66,7 +65,7 @@ module Squared
|
|
66
65
|
elsif !@root.exist?
|
67
66
|
@root.mkpath
|
68
67
|
elsif !empty?(@root)
|
69
|
-
if
|
68
|
+
if repo_prompt(@root)
|
70
69
|
@override = true
|
71
70
|
else
|
72
71
|
@root = nil
|
@@ -81,7 +80,7 @@ module Squared
|
|
81
80
|
if !@root.exist?
|
82
81
|
@root.mkpath
|
83
82
|
elsif !empty?(@root)
|
84
|
-
raise ArgumentError, message('REPO_ROOT', val, hint: 'exist') unless
|
83
|
+
raise ArgumentError, message('REPO_ROOT', val, hint: 'exist') unless repo_prompt(@root)
|
85
84
|
|
86
85
|
@override = true
|
87
86
|
end
|
@@ -93,58 +92,34 @@ module Squared
|
|
93
92
|
@series = TASK_NAME.dup
|
94
93
|
@styles = {}
|
95
94
|
@project = {}
|
95
|
+
@script = {
|
96
|
+
group: {},
|
97
|
+
ref: {},
|
98
|
+
build: nil,
|
99
|
+
dev: nil,
|
100
|
+
prod: nil
|
101
|
+
}
|
96
102
|
@exception = !env('PIPE_FAIL', ignore: '0').nil?
|
97
103
|
@pipe = !env('PIPE_OUT', ignore: '0').nil?
|
98
|
-
@verbose =
|
104
|
+
@verbose = !@pipe
|
99
105
|
end
|
100
106
|
|
101
|
-
def
|
102
|
-
|
103
|
-
|
104
|
-
self
|
105
|
-
end
|
106
|
-
|
107
|
-
def run(script, **kwargs)
|
108
|
-
@script = case (val = env('REPO_BUILD'))
|
109
|
-
when 'verbose'
|
110
|
-
"#{script}:verbose"
|
111
|
-
when 'silent'
|
112
|
-
@verbose = false
|
113
|
-
script
|
114
|
-
else
|
115
|
-
val || script
|
116
|
-
end
|
117
|
-
@dev = bool_match(env('REPO_DEV'), kwargs[:dev])
|
118
|
-
@prod = bool_match(env('REPO_PROD'), kwargs[:prod])
|
119
|
-
self
|
120
|
-
end
|
107
|
+
def build(**kwargs)
|
108
|
+
default = kwargs[:default]
|
109
|
+
parallel = env('REPO_SYNC', ignore: '0') ? [] : (kwargs[:parallel] || []).map!(&:to_sym)
|
121
110
|
|
122
|
-
def add(name, dir = nil, **kwargs)
|
123
|
-
path = (dir || name).to_s
|
124
|
-
ref = kwargs[:ref]
|
125
|
-
project = if !ref.is_a?(::Class)
|
126
|
-
Workspace.find(path: root_path(path), ref: ref)
|
127
|
-
elsif ref < Project::Base
|
128
|
-
ref
|
129
|
-
end
|
130
|
-
instance = (project || Project::Base).new(name, path, self, **kwargs)
|
131
|
-
@project[n = name.to_sym] = instance
|
132
|
-
get(:project)[n] = instance
|
133
|
-
self
|
134
|
-
end
|
135
|
-
|
136
|
-
def build(default: nil, parallel: [])
|
137
111
|
group = {}
|
138
112
|
parent = {}
|
139
|
-
incl =
|
113
|
+
incl = []
|
140
114
|
@project.each do |name, proj|
|
141
115
|
next unless proj.enabled?
|
142
116
|
|
143
|
-
|
117
|
+
series.each do |key, items|
|
144
118
|
target = "#{name}:#{key}"
|
145
119
|
case key
|
146
|
-
when :build, :refresh, :depend, :outdated, :doc, :
|
147
|
-
|
120
|
+
when :build, :refresh, :depend, :copy, :outdated, :doc, :test, :clean
|
121
|
+
valid = proj.has?(key) || ::Rake::Task.task_defined?(target)
|
122
|
+
next unless valid || (key == :refresh && series[:build].include?(target = "#{name}:build"))
|
148
123
|
else
|
149
124
|
next unless task_defined?(proj, key)
|
150
125
|
end
|
@@ -156,19 +131,20 @@ module Squared
|
|
156
131
|
end
|
157
132
|
next unless (base = find_base(proj))
|
158
133
|
|
159
|
-
id = base.to_sym.to_s
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
(parent[:"#{key}:#{id}"] ||= []).push(target)
|
134
|
+
unless (id = base.to_sym.to_s) == proj.group
|
135
|
+
incl << id
|
136
|
+
(parent[:"#{key}:#{id}"] ||= []).push(target)
|
137
|
+
end
|
164
138
|
end
|
165
|
-
proj.populate
|
139
|
+
proj.populate(**kwargs)
|
166
140
|
end
|
167
|
-
|
168
|
-
|
169
|
-
if
|
141
|
+
series.merge!(parent) if incl.uniq.size > 1
|
142
|
+
series.merge!(group)
|
143
|
+
series[:refresh].clear if series[:refresh].all? { |target| target.to_s.end_with?(':build') }
|
144
|
+
|
145
|
+
if manifest_url && (empty?(root) || @override)
|
170
146
|
branch = env('REPO_MANIFEST') || read_manifest
|
171
|
-
target = branch ||
|
147
|
+
target = branch || manifest
|
172
148
|
stage = nil
|
173
149
|
failfast = true
|
174
150
|
cmd = []
|
@@ -217,7 +193,7 @@ module Squared
|
|
217
193
|
parse_opts.(args)
|
218
194
|
stage = :init
|
219
195
|
puts if newline
|
220
|
-
system("repo init -u #{
|
196
|
+
system("repo init -u #{manifest_url} -m #{args.manifest || target}.xml", chdir: root)
|
221
197
|
repo[:all].invoke
|
222
198
|
end
|
223
199
|
|
@@ -230,48 +206,36 @@ module Squared
|
|
230
206
|
cmd << '--fail-fast' if failfast
|
231
207
|
puts if newline && stage != :init
|
232
208
|
begin
|
233
|
-
shell("repo sync #{cmd.join(' ')}", chdir:
|
209
|
+
shell("repo sync #{cmd.join(' ')}", chdir: root, exception: failfast)
|
234
210
|
rescue StandardError => e
|
235
|
-
emphasize(e, title: "rake stash repo:#{stage ||
|
211
|
+
emphasize(e, title: "rake stash repo:#{stage || 'sync'}")
|
236
212
|
raise
|
237
213
|
end
|
238
214
|
end
|
239
215
|
end
|
240
216
|
end
|
241
|
-
return unless enabled?
|
242
|
-
|
243
|
-
multi = env('REPO_SYNC', ignore: '0') ? [] : parallel.map(&:to_sym)
|
244
|
-
output = dev? ? :refresh : :build
|
245
|
-
|
246
|
-
task default: default || output
|
247
|
-
|
248
|
-
desc 'all[git?=rebase|stash]'
|
249
|
-
task :all, [:git] do |_, args|
|
250
|
-
sync = ->(key) { multi.include?(key) ? :"#{key}:sync" : key }
|
251
|
-
pull = case args.git
|
252
|
-
when 'rebase'
|
253
|
-
sync.(:rebase)
|
254
|
-
when 'stash'
|
255
|
-
invoke sync.(:stash)
|
256
|
-
sync.(:pull)
|
257
|
-
else
|
258
|
-
sync.(:pull)
|
259
|
-
end
|
260
|
-
invoke(pull, exception: @exception)
|
261
|
-
invoke(output, exception: @exception)
|
262
|
-
end
|
263
217
|
|
264
|
-
|
265
|
-
|
218
|
+
Workspace.project_kind.each { |obj| obj.populate(self, **kwargs) }
|
219
|
+
|
220
|
+
if !series[:build].empty?
|
221
|
+
init = [:depend, dev? && !series[:refresh].empty? ? :refresh : :build]
|
266
222
|
|
267
|
-
|
223
|
+
task default: default || init[1]
|
224
|
+
|
225
|
+
desc 'init'
|
226
|
+
task init: init
|
227
|
+
elsif default && !series[default].empty?
|
228
|
+
task default: default
|
229
|
+
end
|
230
|
+
|
231
|
+
series.each do |key, items|
|
268
232
|
next if items.empty?
|
269
233
|
|
270
|
-
unless (valid =
|
234
|
+
unless (valid = parallel.include?(key))
|
271
235
|
group = key.to_s
|
272
|
-
valid =
|
236
|
+
valid = parallel.include?(group.split(':').first.to_sym) if group.include?(':')
|
273
237
|
end
|
274
|
-
if valid
|
238
|
+
if valid && items.size > 1
|
275
239
|
desc "#{key} (thread)"
|
276
240
|
multitask key => items
|
277
241
|
|
@@ -282,20 +246,77 @@ module Squared
|
|
282
246
|
task key => items
|
283
247
|
end
|
284
248
|
end
|
249
|
+
|
250
|
+
yield self if block_given?
|
251
|
+
end
|
252
|
+
|
253
|
+
def repo(url, manifest = 'latest')
|
254
|
+
@manifest_url = url
|
255
|
+
@manifest = manifest
|
256
|
+
self
|
257
|
+
end
|
258
|
+
|
259
|
+
def run(script, group: nil, ref: nil, **kwargs)
|
260
|
+
if group || ref
|
261
|
+
script_command :run, script, group, ref
|
262
|
+
else
|
263
|
+
@script[:build] = case (val = env('REPO_BUILD'))
|
264
|
+
when 'verbose'
|
265
|
+
"#{script}:verbose"
|
266
|
+
when 'silent'
|
267
|
+
@verbose = false
|
268
|
+
script
|
269
|
+
else
|
270
|
+
val || script
|
271
|
+
end
|
272
|
+
@script[:dev] = bool_match(env('REPO_DEV'), kwargs[:dev])
|
273
|
+
@script[:prod] = bool_match(env('REPO_PROD'), kwargs[:prod])
|
274
|
+
self
|
275
|
+
end
|
276
|
+
end
|
277
|
+
|
278
|
+
def depend(script, group: nil, ref: nil)
|
279
|
+
script_command :depend, script, group, ref
|
280
|
+
end
|
281
|
+
|
282
|
+
def clean(script, group: nil, ref: nil)
|
283
|
+
script_command :clean, script, group, ref
|
285
284
|
end
|
286
285
|
|
287
|
-
def
|
288
|
-
|
286
|
+
def doc(script, group: nil, ref: nil)
|
287
|
+
script_command :doc, script, group, ref
|
288
|
+
end
|
289
|
+
|
290
|
+
def test(script, group: nil, ref: nil)
|
291
|
+
script_command :test, script, group, ref
|
292
|
+
end
|
293
|
+
|
294
|
+
def add(name, dir = nil, **kwargs)
|
295
|
+
path = (dir || name).to_s
|
296
|
+
ref = kwargs[:ref]
|
297
|
+
project = if !ref.is_a?(::Class)
|
298
|
+
Workspace.find(path: root_path(path), ref: ref)
|
299
|
+
elsif ref < Project::Base
|
300
|
+
ref
|
301
|
+
end
|
302
|
+
instance = (project || Project::Base).new(name, path, self, **kwargs)
|
303
|
+
@project[n = name.to_sym] = instance
|
304
|
+
get!(:project)[n] = instance
|
289
305
|
self
|
290
306
|
end
|
291
307
|
|
292
|
-
def
|
293
|
-
|
308
|
+
def compose(name, &blk)
|
309
|
+
namespace(name, &blk)
|
310
|
+
self
|
311
|
+
end
|
312
|
+
|
313
|
+
def apply(&blk)
|
314
|
+
instance_eval(&blk)
|
294
315
|
self
|
295
316
|
end
|
296
317
|
|
297
318
|
def style(name, *args)
|
298
|
-
set = ->(k, v) {
|
319
|
+
set = ->(k, v) { styles[k.to_sym] = check_style(v, empty: false) }
|
299
320
|
if name.is_a?(Hash)
|
300
321
|
name.each { |k, v| set.(k, v || args.flatten) }
|
301
322
|
else
|
@@ -304,8 +325,16 @@ module Squared
|
|
304
325
|
self
|
305
326
|
end
|
306
327
|
|
328
|
+
def script(group: nil, ref: nil)
|
329
|
+
if group || ref
|
330
|
+
(group && @script[:group][group.to_sym]) || (ref && @script[:ref][ref.to_sym])
|
331
|
+
else
|
332
|
+
@script[:build]
|
333
|
+
end
|
334
|
+
end
|
335
|
+
|
307
336
|
def env(key, equals: nil, ignore: nil)
|
308
|
-
ret = ENV.fetch("#{key}_#{
|
337
|
+
ret = ENV.fetch("#{key}_#{main.gsub(/[^\w]/, '_').upcase}", ENV[key]).to_s
|
309
338
|
return ret == equals.to_s if equals
|
310
339
|
|
311
340
|
ret.empty? || as_a(ignore).any? { |val| ret == val.to_s } ? nil : ret
|
@@ -321,11 +350,11 @@ module Squared
|
|
321
350
|
end
|
322
351
|
|
323
352
|
def root_path(*args)
|
324
|
-
|
353
|
+
root.join(*args)
|
325
354
|
end
|
326
355
|
|
327
356
|
def home_path(*args)
|
328
|
-
|
357
|
+
home.join(*args)
|
329
358
|
end
|
330
359
|
|
331
360
|
def find_base(obj)
|
@@ -345,19 +374,23 @@ module Squared
|
|
345
374
|
end
|
346
375
|
end
|
347
376
|
|
377
|
+
def to_s
|
378
|
+
root.to_s
|
379
|
+
end
|
380
|
+
|
381
|
+
def inspect
|
382
|
+
"#<#{self.class}: #{main} => #{self}>"
|
383
|
+
end
|
384
|
+
|
348
385
|
def empty?(dir)
|
349
386
|
return true if dir.empty? || dir.join('.repo').directory?
|
350
387
|
return true if dir.children.size == 1 && dir.join(dir.children.first).to_s == __FILE__
|
351
388
|
|
352
|
-
dir ==
|
353
|
-
path.directory? && !path.basename.to_s.start_with?('.') && path.to_s !=
|
389
|
+
dir == root && !env('REPO_ROOT').nil? && root.children.none? do |path|
|
390
|
+
path.directory? && !path.basename.to_s.start_with?('.') && path.to_s != home.to_s
|
354
391
|
end
|
355
392
|
end
|
356
393
|
|
357
|
-
def enabled?
|
358
|
-
!@series[:build].empty? || !@series[:doc].empty?
|
359
|
-
end
|
360
|
-
|
361
394
|
def multitask?
|
362
395
|
::Rake::Task.tasks.any? do |item|
|
363
396
|
next unless item.already_invoked
|
@@ -370,18 +403,14 @@ module Squared
|
|
370
403
|
obj.is_a?(TASK_BASE[key])
|
371
404
|
end
|
372
405
|
|
373
|
-
def dev?(pat
|
374
|
-
with?(
|
406
|
+
def dev?(script: nil, pat: nil, global: nil)
|
407
|
+
with?(:dev, script: script, pat: pat, global: (pat.nil? && global.nil?) || global)
|
375
408
|
end
|
376
409
|
|
377
|
-
def prod?(pat
|
378
|
-
return false if @dev == true || !@prod
|
410
|
+
def prod?(script: nil, pat: nil, global: false)
|
411
|
+
return false if global && (@script[:dev] == true || !@script[:prod])
|
379
412
|
|
380
|
-
with?(
|
381
|
-
end
|
382
|
-
|
383
|
-
def pipe?
|
384
|
-
@pipe
|
413
|
+
with?(:prod, script: script, pat: pat, global: global)
|
385
414
|
end
|
386
415
|
|
387
416
|
protected
|
@@ -414,11 +443,30 @@ module Squared
|
|
414
443
|
|
415
444
|
private
|
416
445
|
|
417
|
-
def
|
418
|
-
|
446
|
+
def script_command(task, val, group, ref)
|
447
|
+
if group
|
448
|
+
label = :group
|
449
|
+
items = as_a(group)
|
450
|
+
else
|
451
|
+
label = :ref
|
452
|
+
items = as_a(ref)
|
453
|
+
end
|
454
|
+
items.each { |name| (@script[label][name.to_sym] ||= {})[task] = val }
|
455
|
+
self
|
456
|
+
end
|
457
|
+
|
458
|
+
def repo_prompt(path)
|
459
|
+
return false unless path.directory?
|
460
|
+
|
461
|
+
confirm "#{log_title(:warn)} \"#{sub_style(path, :bold)}\" is not empty. Continue with installation? [y/N] "
|
462
|
+
end
|
463
|
+
|
464
|
+
def with?(state, script: nil, pat: nil, global: false)
|
465
|
+
pat = @script[state] if pat.nil? && global
|
419
466
|
return pat == true unless pat.is_a?(::Regexp)
|
467
|
+
return false if !script && !global
|
420
468
|
|
421
|
-
pat.match?(script || @script)
|
469
|
+
pat.match?(script || @script[:build])
|
422
470
|
end
|
423
471
|
end
|
424
472
|
end
|
data/lib/squared/repo.rb
CHANGED
@@ -9,7 +9,7 @@ module Squared
|
|
9
9
|
project id
|
10
10
|
else
|
11
11
|
(id = Pathname.new(id).realdirpath.to_s) rescue nil if id.is_a?(::String)
|
12
|
-
get(:project).find { |_, val| val.path.to_s == id.to_s }
|
12
|
+
get!(:project).find { |_, val| val.path.to_s == id.to_s }
|
13
13
|
end
|
14
14
|
end
|
15
15
|
ret.size == 1 ? ret.first : ret
|
@@ -29,7 +29,7 @@ module Squared
|
|
29
29
|
private
|
30
30
|
|
31
31
|
def project(name)
|
32
|
-
get(:project)[name.to_sym]
|
32
|
+
get!(:project)[name.to_sym]
|
33
33
|
end
|
34
34
|
end
|
35
35
|
end
|
data/lib/squared/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: squared
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- An Pham
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-11-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|