squared 0.5.20 → 0.6.0
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/CHANGELOG.md +87 -157
- data/README.md +104 -72
- data/lib/squared/common/base.rb +1 -22
- data/lib/squared/common/format.rb +40 -34
- data/lib/squared/common/prompt.rb +57 -35
- data/lib/squared/common/shell.rb +71 -56
- data/lib/squared/common/system.rb +69 -36
- data/lib/squared/common/utils.rb +29 -6
- data/lib/squared/config.rb +27 -34
- data/lib/squared/version.rb +1 -1
- data/lib/squared/workspace/application.rb +85 -86
- data/lib/squared/workspace/project/base.rb +538 -394
- data/lib/squared/workspace/project/docker.rb +393 -289
- data/lib/squared/workspace/project/git.rb +350 -339
- data/lib/squared/workspace/project/node.rb +499 -274
- data/lib/squared/workspace/project/python.rb +370 -241
- data/lib/squared/workspace/project/ruby.rb +683 -386
- data/lib/squared/workspace/project/support/class.rb +208 -205
- data/lib/squared/workspace/repo.rb +46 -43
- data/lib/squared/workspace/series.rb +13 -21
- data/lib/squared/workspace/support/base.rb +3 -24
- data/lib/squared/workspace/support/variables.rb +48 -0
- data/lib/squared/workspace/support.rb +1 -1
- data/lib/squared/workspace.rb +4 -6
- metadata +3 -3
- data/lib/squared/workspace/support/data.rb +0 -11
|
@@ -3,16 +3,6 @@
|
|
|
3
3
|
module Squared
|
|
4
4
|
module Workspace
|
|
5
5
|
module Repo
|
|
6
|
-
class << self
|
|
7
|
-
def read_manifest(path)
|
|
8
|
-
require 'rexml/document'
|
|
9
|
-
return unless (file = path + '.repo/manifest.xml').exist?
|
|
10
|
-
|
|
11
|
-
doc = REXML::Document.new(file.read)
|
|
12
|
-
doc.elements['manifest/include'].attributes['name']&.sub('.xml', '')
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
|
|
16
6
|
attr_reader :manifest_url, :manifest
|
|
17
7
|
|
|
18
8
|
def repo(url, manifest = 'latest', run: nil, script: nil, args: nil, dev: nil, prod: nil,
|
|
@@ -25,18 +15,18 @@ module Squared
|
|
|
25
15
|
@root = nil unless path.directory?
|
|
26
16
|
elsif !@root.exist?
|
|
27
17
|
@root.mkpath
|
|
28
|
-
elsif !repo_install?
|
|
29
|
-
@root = nil
|
|
18
|
+
elsif !repo_install? && !repo_confirm
|
|
19
|
+
@root = nil
|
|
30
20
|
end
|
|
21
|
+
raise_error Errno::EEXIST, path.cleanpath, hint: 'REPO_HOME' unless @root
|
|
31
22
|
end
|
|
32
|
-
raise_error("path invalid: #{val}", hint: 'REPO_HOME') unless @root
|
|
33
23
|
path.realdirpath
|
|
34
24
|
elsif (val = env('REPO_ROOT'))
|
|
35
25
|
@root = Pathname.new(val).realdirpath
|
|
36
26
|
if !@root.exist?
|
|
37
27
|
@root.mkpath
|
|
38
|
-
elsif !repo_install?(parent: true)
|
|
39
|
-
raise_error
|
|
28
|
+
elsif !repo_install?(parent: true) && !repo_confirm
|
|
29
|
+
raise_error Errno::EEXIST, @root, hint: 'REPO_ROOT'
|
|
40
30
|
end
|
|
41
31
|
@root.join(main).realdirpath
|
|
42
32
|
elsif repo_install?(parent: true) && (!@home.exist? || @root + main == @home)
|
|
@@ -51,9 +41,13 @@ module Squared
|
|
|
51
41
|
@manifest = manifest
|
|
52
42
|
data = scriptobj
|
|
53
43
|
if repo?
|
|
44
|
+
sc, ru = env('REPO_BUILD', '').split(',', 2).map!(&:strip)
|
|
54
45
|
if script
|
|
55
|
-
|
|
56
|
-
|
|
46
|
+
data[:script] = if sc.to_s.empty?
|
|
47
|
+
script
|
|
48
|
+
else
|
|
49
|
+
data[:env][:script] = true
|
|
50
|
+
case sc
|
|
57
51
|
when 'verbose'
|
|
58
52
|
@verbose = 1
|
|
59
53
|
if script.is_a?(Array)
|
|
@@ -67,20 +61,23 @@ module Squared
|
|
|
67
61
|
@warning = false
|
|
68
62
|
script
|
|
69
63
|
else
|
|
70
|
-
|
|
64
|
+
sc
|
|
71
65
|
end
|
|
72
|
-
|
|
73
|
-
else
|
|
74
|
-
data[:script] = script
|
|
75
|
-
end
|
|
66
|
+
end
|
|
76
67
|
data[:args] = (val = env('REPO_SCRIPT')) ? shell_split(val, join: true) : args
|
|
77
|
-
|
|
78
|
-
data[:run] = val
|
|
79
|
-
data[:env] = true
|
|
68
|
+
data[:global][:script] = true
|
|
80
69
|
else
|
|
81
|
-
|
|
70
|
+
ru ||= sc
|
|
71
|
+
end
|
|
72
|
+
if run
|
|
73
|
+
data[:run] = if ru.to_s.empty?
|
|
74
|
+
run
|
|
75
|
+
else
|
|
76
|
+
data[:env][:run] = true
|
|
77
|
+
ru
|
|
78
|
+
end
|
|
79
|
+
data[:global][:run] = true
|
|
82
80
|
end
|
|
83
|
-
data[:global] = true
|
|
84
81
|
data[:dev] = env_match 'REPO_DEV', dev
|
|
85
82
|
data[:prod] = env_match 'REPO_PROD', prod
|
|
86
83
|
if (val = env('REPO_GROUP'))
|
|
@@ -98,9 +95,8 @@ module Squared
|
|
|
98
95
|
if script
|
|
99
96
|
data[:script] = script
|
|
100
97
|
data[:args] = args
|
|
101
|
-
else
|
|
102
|
-
data[:run] = run
|
|
103
98
|
end
|
|
99
|
+
data[:run] = run if run
|
|
104
100
|
data[:dev] = dev
|
|
105
101
|
data[:prod] = prod
|
|
106
102
|
script_set(data, group: group, ref: ref)
|
|
@@ -115,7 +111,7 @@ module Squared
|
|
|
115
111
|
|
|
116
112
|
namespace task_name('repo') do |ns|
|
|
117
113
|
path = ns.scope.path
|
|
118
|
-
branch = env('REPO_MANIFEST') ||
|
|
114
|
+
branch = env('REPO_MANIFEST') || repo_manifest
|
|
119
115
|
target = branch || manifest
|
|
120
116
|
stage = nil
|
|
121
117
|
opts = %w[force rebase detach submodules fail no-update gc]
|
|
@@ -132,20 +128,20 @@ module Squared
|
|
|
132
128
|
task 'all' do |_, args|
|
|
133
129
|
stage ||= 'all'
|
|
134
130
|
ns['sync'].invoke(*args.to_a)
|
|
135
|
-
next if (
|
|
131
|
+
next if (stage = env('REPO_STAGE')) == '1'
|
|
136
132
|
|
|
137
133
|
@project.select do |_, proj|
|
|
138
134
|
next unless proj.enabled?(proj.workspace.baseref) && proj.global
|
|
139
135
|
|
|
140
136
|
proj.depend(sync: true) if proj.depend?
|
|
141
|
-
next if
|
|
137
|
+
next if stage == '2'
|
|
142
138
|
|
|
143
139
|
proj.build?
|
|
144
140
|
end
|
|
145
141
|
.each_value do |proj|
|
|
146
142
|
proj.build(sync: true)
|
|
147
|
-
next if
|
|
148
|
-
next unless proj.copy? && (proj.dev? ||
|
|
143
|
+
next if stage == '3'
|
|
144
|
+
next unless proj.copy? && (proj.dev? || stage == '4')
|
|
149
145
|
|
|
150
146
|
if (ws = proj.workspace).task_defined?(target = task_join(proj.name, 'copy'))
|
|
151
147
|
task_invoke(target, **ws.invokeargs)
|
|
@@ -158,9 +154,9 @@ module Squared
|
|
|
158
154
|
desc.call("init[manifest?=#{target},groups?,{0}]", target)
|
|
159
155
|
task 'init' do |_, args|
|
|
160
156
|
args = args.to_a
|
|
161
|
-
u = env('
|
|
157
|
+
u = env('REPO_URL') || manifest_url
|
|
162
158
|
m = args.first && !opts.include?(args.first) ? args.shift : target
|
|
163
|
-
g = args.first && !opts.include?(args.first)
|
|
159
|
+
g = (args.shift if args.first && !opts.include?(args.first))
|
|
164
160
|
g = case (val = env('REPO_GROUPS'))
|
|
165
161
|
when '', NilClass
|
|
166
162
|
g
|
|
@@ -224,13 +220,22 @@ module Squared
|
|
|
224
220
|
end
|
|
225
221
|
end
|
|
226
222
|
|
|
223
|
+
def repo_manifest(path = root)
|
|
224
|
+
return unless (file = path + '.repo/manifest.xml').exist?
|
|
225
|
+
|
|
226
|
+
require 'rexml/document'
|
|
227
|
+
doc = REXML::Document.new(file.read)
|
|
228
|
+
doc.elements['manifest/include'].attributes['name']&.sub('.xml', '')
|
|
229
|
+
end
|
|
230
|
+
|
|
227
231
|
def repo_confirm
|
|
228
232
|
return false unless root.directory?
|
|
229
233
|
|
|
230
234
|
path = sub_style(root, styles: theme[:inline])
|
|
231
|
-
@repo_override = Common::Prompt.confirm(
|
|
232
|
-
"#{log_title(:warn)} \"#{path}\" is not empty. Continue with installation?",
|
|
233
|
-
|
|
235
|
+
@repo_override = env('REPO_Y', equals: '1') || Common::Prompt.confirm(
|
|
236
|
+
"#{log_title(:warn)} \"#{path}\" is not empty. Continue with installation?",
|
|
237
|
+
'N',
|
|
238
|
+
timeout: env('REPO_TIMEOUT', 15, ignore: '0')
|
|
234
239
|
)
|
|
235
240
|
end
|
|
236
241
|
|
|
@@ -246,13 +251,11 @@ module Squared
|
|
|
246
251
|
def repo_opts(*args)
|
|
247
252
|
return args unless (n = ARGV.index('--'))
|
|
248
253
|
|
|
249
|
-
ARGV[
|
|
254
|
+
ARGV[n.succ..-1].concat(args)
|
|
250
255
|
end
|
|
251
256
|
|
|
252
257
|
def repo?
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
repo_install? || @repo_override == true
|
|
258
|
+
!manifest_url.nil? && (repo_install? || @repo_override == true)
|
|
256
259
|
end
|
|
257
260
|
|
|
258
261
|
def repo_submodules?(val = false)
|
|
@@ -31,19 +31,15 @@ module Squared
|
|
|
31
31
|
end
|
|
32
32
|
elsif (data = TASK_BATCH[obj])
|
|
33
33
|
args.each { |ref| data.delete(ref) }
|
|
34
|
-
if data.empty?
|
|
35
|
-
TASK_KEYS.delete(obj)
|
|
36
|
-
TASK_BATCH.delete(obj)
|
|
37
|
-
end
|
|
34
|
+
TASK_KEYS.delete(obj) if data.empty?
|
|
38
35
|
end
|
|
39
36
|
end
|
|
40
37
|
|
|
41
38
|
def alias(ref, obj)
|
|
42
39
|
if obj.is_a?(Hash)
|
|
43
40
|
obj.each { |key, val| TASK_ALIAS[key][ref] = val }
|
|
44
|
-
|
|
45
|
-
TASK_ALIAS[obj]
|
|
46
|
-
TASK_ALIAS.delete(obj) if TASK_ALIAS[obj].empty?
|
|
41
|
+
else
|
|
42
|
+
TASK_ALIAS[obj]&.delete(ref)
|
|
47
43
|
end
|
|
48
44
|
end
|
|
49
45
|
|
|
@@ -169,8 +165,6 @@ module Squared
|
|
|
169
165
|
end
|
|
170
166
|
|
|
171
167
|
def alias_get(key)
|
|
172
|
-
return unless TASK_ALIAS.key?(key)
|
|
173
|
-
|
|
174
168
|
TASK_ALIAS[key]
|
|
175
169
|
end
|
|
176
170
|
|
|
@@ -188,14 +182,12 @@ module Squared
|
|
|
188
182
|
end
|
|
189
183
|
|
|
190
184
|
def extend?(obj, key)
|
|
191
|
-
return false unless TASK_EXTEND.
|
|
185
|
+
return false unless (items = TASK_EXTEND[key]) && !(items = items.select { |kind| obj.is_a?(kind) }).empty?
|
|
192
186
|
|
|
193
187
|
meth = :"#{key}?"
|
|
194
188
|
ret = false
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
if kind.method_defined?(meth)
|
|
189
|
+
items.each do |kind|
|
|
190
|
+
if kind.instance_methods.include?(meth)
|
|
199
191
|
out = obj.__send__(meth)
|
|
200
192
|
return true if out == 1
|
|
201
193
|
return out if obj.ref?(kind.ref)
|
|
@@ -207,9 +199,7 @@ module Squared
|
|
|
207
199
|
end
|
|
208
200
|
|
|
209
201
|
def batch?(obj, key)
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
data.keys.any? { |ref| obj.ref?(ref) }
|
|
202
|
+
(data = batch_get(key)) ? data.keys.any? { |ref| obj.ref?(ref) } : false
|
|
213
203
|
end
|
|
214
204
|
|
|
215
205
|
def chain?(val)
|
|
@@ -236,7 +226,7 @@ module Squared
|
|
|
236
226
|
end
|
|
237
227
|
|
|
238
228
|
def exclude?(key, empty = false)
|
|
239
|
-
@exclude.include?(key) || (empty &&
|
|
229
|
+
@exclude.include?(key) || (empty && @data[key].empty?)
|
|
240
230
|
end
|
|
241
231
|
|
|
242
232
|
private
|
|
@@ -248,9 +238,11 @@ module Squared
|
|
|
248
238
|
end
|
|
249
239
|
|
|
250
240
|
def already_invoked?(list, val)
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
241
|
+
if val
|
|
242
|
+
list.include?(val) && !invoked_get(val).nil?
|
|
243
|
+
else
|
|
244
|
+
Rake::Task.tasks.any? { |obj| obj.already_invoked && list.include?(obj.name) }
|
|
245
|
+
end
|
|
254
246
|
end
|
|
255
247
|
end
|
|
256
248
|
|
|
@@ -3,30 +3,9 @@
|
|
|
3
3
|
module Squared
|
|
4
4
|
module Workspace
|
|
5
5
|
module Support
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
def hashlist
|
|
12
|
-
Hash.new { |data, key| data[key] = [] }
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def hashdup(data, pass: {})
|
|
16
|
-
ret = {}
|
|
17
|
-
data.each do |key, val|
|
|
18
|
-
ret[key] = case val
|
|
19
|
-
when Hash
|
|
20
|
-
pass[val] ||= hashdup(val, pass: pass)
|
|
21
|
-
when Proc, Method
|
|
22
|
-
val
|
|
23
|
-
else
|
|
24
|
-
val.dup
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
ret
|
|
28
|
-
end
|
|
29
|
-
end
|
|
6
|
+
RunData = Struct.new('RunData', :run, :block)
|
|
7
|
+
ChainData = Struct.new('ChainData', :action, :step, :with, :before, :after, :sync)
|
|
8
|
+
BannerData = Struct.new('BannerData', :command, :order, :styles, :border)
|
|
30
9
|
end
|
|
31
10
|
end
|
|
32
11
|
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Squared
|
|
4
|
+
module Workspace
|
|
5
|
+
module Support
|
|
6
|
+
module Variables
|
|
7
|
+
private
|
|
8
|
+
|
|
9
|
+
def hashobj
|
|
10
|
+
Hash.new { |data, key| data[key] = {} }
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def hashlist
|
|
14
|
+
Hash.new { |data, key| data[key] = [] }
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def hashdup(data, compact: false, freeze: false, target: {}, pass: {})
|
|
18
|
+
data.each do |key, val|
|
|
19
|
+
next if val.nil? && compact
|
|
20
|
+
|
|
21
|
+
target[key] = case val
|
|
22
|
+
when Hash
|
|
23
|
+
if pass.key?(val)
|
|
24
|
+
pass[val]
|
|
25
|
+
else
|
|
26
|
+
hashdup(val, compact: compact, freeze: freeze, target: pass[val] = {}, pass: pass)
|
|
27
|
+
end
|
|
28
|
+
when Enumerable
|
|
29
|
+
compact ? val.compact : val.dup
|
|
30
|
+
when Proc, Method
|
|
31
|
+
val
|
|
32
|
+
else
|
|
33
|
+
val.dup
|
|
34
|
+
end
|
|
35
|
+
target[key].freeze if freeze && val.frozen?
|
|
36
|
+
end
|
|
37
|
+
target
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
class << Support
|
|
42
|
+
include Variables
|
|
43
|
+
|
|
44
|
+
public(*Variables.private_instance_methods(false))
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
data/lib/squared/workspace.rb
CHANGED
|
@@ -5,14 +5,12 @@ module Squared
|
|
|
5
5
|
class << self
|
|
6
6
|
include Common
|
|
7
7
|
|
|
8
|
-
def resolve(*args
|
|
9
|
-
|
|
10
|
-
ret = args.map do |id|
|
|
8
|
+
def resolve(*args)
|
|
9
|
+
ret = args.map! do |id|
|
|
11
10
|
if id.is_a?(Symbol)
|
|
12
11
|
project id
|
|
13
12
|
else
|
|
14
|
-
|
|
15
|
-
values.find { |proj| proj.path.to_s == File.expand_path(id, base) }
|
|
13
|
+
__get__(:project).find { |_, val| File.expand_path(val.path) == File.expand_path(id, __dir__) }
|
|
16
14
|
end
|
|
17
15
|
end
|
|
18
16
|
ret.size == 1 ? ret.first : ret
|
|
@@ -20,7 +18,7 @@ module Squared
|
|
|
20
18
|
|
|
21
19
|
def expect(name)
|
|
22
20
|
ret = project name
|
|
23
|
-
return ret if ret&.path&.directory?
|
|
21
|
+
return ret if ret&.path&.directory?
|
|
24
22
|
|
|
25
23
|
raise NoMethodError, "project is not initialized (#{name})"
|
|
26
24
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: squared
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.6.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- An Pham
|
|
@@ -101,7 +101,7 @@ files:
|
|
|
101
101
|
- lib/squared/workspace/series.rb
|
|
102
102
|
- lib/squared/workspace/support.rb
|
|
103
103
|
- lib/squared/workspace/support/base.rb
|
|
104
|
-
- lib/squared/workspace/support/
|
|
104
|
+
- lib/squared/workspace/support/variables.rb
|
|
105
105
|
- squared.gemspec
|
|
106
106
|
homepage: https://github.com/anpham6/squared-ruby
|
|
107
107
|
licenses:
|
|
@@ -124,7 +124,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
124
124
|
- !ruby/object:Gem::Version
|
|
125
125
|
version: '0'
|
|
126
126
|
requirements: []
|
|
127
|
-
rubygems_version: 3.
|
|
127
|
+
rubygems_version: 3.7.2
|
|
128
128
|
specification_version: 4
|
|
129
129
|
summary: Rake task generator for managing multi-language workspaces.
|
|
130
130
|
test_files: []
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Squared
|
|
4
|
-
module Workspace
|
|
5
|
-
module Support
|
|
6
|
-
RunData = Struct.new('RunData', :run, :block)
|
|
7
|
-
ChainData = Struct.new('ChainData', :action, :step, :with, :before, :after, :sync)
|
|
8
|
-
BannerData = Struct.new('BannerData', :command, :order, :styles, :border)
|
|
9
|
-
end
|
|
10
|
-
end
|
|
11
|
-
end
|