squared 0.0.5 → 0.0.6
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.ruby.md +3 -2
- data/lib/squared/common/base.rb +91 -0
- data/lib/squared/common/format.rb +14 -5
- data/lib/squared/common/shell.rb +7 -7
- data/lib/squared/common/system.rb +4 -1
- data/lib/squared/common/task.rb +5 -1
- data/lib/squared/common.rb +1 -78
- data/lib/squared/config.rb +7 -7
- data/lib/squared/version.rb +1 -1
- data/lib/squared/workspace/application.rb +306 -0
- data/lib/squared/{repo → workspace}/project/base.rb +47 -41
- data/lib/squared/{repo → workspace}/project/git.rb +71 -53
- data/lib/squared/{repo → workspace}/project/node.rb +17 -18
- data/lib/squared/{repo → workspace}/project/python.rb +3 -3
- data/lib/squared/{repo → workspace}/project/ruby.rb +7 -8
- data/lib/squared/{repo → workspace}/project.rb +1 -1
- data/lib/squared/workspace/repo.rb +201 -0
- data/lib/squared/workspace/series.rb +125 -0
- data/lib/squared/{repo.rb → workspace.rb} +6 -3
- data/lib/squared.rb +9 -8
- metadata +13 -10
- data/lib/squared/repo/workspace.rb +0 -552
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Squared
|
|
4
|
+
module Workspace
|
|
5
|
+
module Repo
|
|
6
|
+
include Common
|
|
7
|
+
include Format
|
|
8
|
+
include System
|
|
9
|
+
include Task
|
|
10
|
+
|
|
11
|
+
attr_accessor :warning
|
|
12
|
+
|
|
13
|
+
def repo(url, manifest = 'latest', run: nil, dev: nil, prod: nil)
|
|
14
|
+
@home = if (val = env('REPO_HOME'))
|
|
15
|
+
home = Pathname.new(val)
|
|
16
|
+
if @main == home.basename.to_s
|
|
17
|
+
@root = home.parent
|
|
18
|
+
if home.exist?
|
|
19
|
+
@root = nil unless home.directory?
|
|
20
|
+
elsif !@root.exist?
|
|
21
|
+
@root.mkpath
|
|
22
|
+
elsif !install?
|
|
23
|
+
@root = nil unless confirm_install
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
raise_error('REPO_HOME', val, hint: 'invalid') unless @root
|
|
27
|
+
|
|
28
|
+
home.realdirpath
|
|
29
|
+
elsif (val = env('REPO_ROOT'))
|
|
30
|
+
@root = Pathname.new(val).realdirpath
|
|
31
|
+
if !@root.exist?
|
|
32
|
+
@root.mkpath
|
|
33
|
+
elsif !install?
|
|
34
|
+
raise_error('REPO_ROOT', val, hint: 'exist') unless confirm_install
|
|
35
|
+
end
|
|
36
|
+
@root.join(@main).realdirpath
|
|
37
|
+
else
|
|
38
|
+
install?(pwd = Pathname.pwd) ? pwd.join(@main) : pwd
|
|
39
|
+
end
|
|
40
|
+
@root = @home.parent
|
|
41
|
+
@manifest_url = url
|
|
42
|
+
@manifest = manifest
|
|
43
|
+
if repo?
|
|
44
|
+
@script[:build] = case (val = env('REPO_BUILD'))
|
|
45
|
+
when 'verbose'
|
|
46
|
+
@verbose = true
|
|
47
|
+
"#{run}:verbose" if run
|
|
48
|
+
when 'silent'
|
|
49
|
+
@verbose = false
|
|
50
|
+
@warning = false
|
|
51
|
+
run
|
|
52
|
+
else
|
|
53
|
+
val || run
|
|
54
|
+
end
|
|
55
|
+
@script[:dev] = bool_match(env('REPO_DEV'), dev)
|
|
56
|
+
@script[:prod] = bool_match(env('REPO_PROD'), prod)
|
|
57
|
+
@warning = case env('REPO_WARN')
|
|
58
|
+
when '0'
|
|
59
|
+
false
|
|
60
|
+
when '1'
|
|
61
|
+
true
|
|
62
|
+
else
|
|
63
|
+
!empty?(@root)
|
|
64
|
+
end
|
|
65
|
+
@extensions << :__repo__
|
|
66
|
+
else
|
|
67
|
+
@script[:build] = run
|
|
68
|
+
@script[:dev] = dev
|
|
69
|
+
@script[:prod] = prod
|
|
70
|
+
end
|
|
71
|
+
self
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
protected
|
|
75
|
+
|
|
76
|
+
def repo?
|
|
77
|
+
!@manifest_url.nil? && (install? || !!@override)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def empty?(dir)
|
|
81
|
+
dir.empty? || (dir.children.size == 1 && dir.join(dir.children.first).to_s == __FILE__)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
private
|
|
85
|
+
|
|
86
|
+
def __repo__(**kwargs)
|
|
87
|
+
kwargs.delete(:parallel) if env('REPO_SYNC', ignore: '0')
|
|
88
|
+
|
|
89
|
+
branch = env('REPO_MANIFEST') || read_manifest
|
|
90
|
+
target = branch || @manifest
|
|
91
|
+
stage = nil
|
|
92
|
+
failfast = true
|
|
93
|
+
cmd = []
|
|
94
|
+
newline = ARGV.index { |val| val.start_with?('repo:') }.to_i > 0
|
|
95
|
+
parse_opts = lambda do |args|
|
|
96
|
+
collect_args(args, :opts).each do |val|
|
|
97
|
+
case val
|
|
98
|
+
when 'no-fail'
|
|
99
|
+
failfast = false
|
|
100
|
+
when 'force'
|
|
101
|
+
cmd << '--force-checkout'
|
|
102
|
+
when 'rebase'
|
|
103
|
+
cmd << '--rebase'
|
|
104
|
+
when 'detach'
|
|
105
|
+
cmd << '--detach'
|
|
106
|
+
when 'gc'
|
|
107
|
+
cmd << '--auto-gc'
|
|
108
|
+
when 'no-update'
|
|
109
|
+
cmd << '--no-manifest-update'
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
status = lambda do |val, alt = nil|
|
|
114
|
+
ver = branch || alt
|
|
115
|
+
ver ? message('repo', val.sub('{0}', 'opts*=force,rebase,detach,gc,no-update,no-fail'), ver) : 'inactive'
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
namespace 'repo' do |repo|
|
|
119
|
+
desc status.('all[{0}]')
|
|
120
|
+
task 'all', [:opts] do |_, args|
|
|
121
|
+
parse_opts.(args)
|
|
122
|
+
stage ||= 'all'
|
|
123
|
+
repo['sync'].invoke
|
|
124
|
+
@project.select do |_, proj|
|
|
125
|
+
if proj.enabled?
|
|
126
|
+
proj.depend
|
|
127
|
+
proj.build?
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
.each_value { |proj| proj.has?(:dev) ? proj.refresh : proj.build }
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
desc status.("init[manifest?=#{target},{0}]", target)
|
|
134
|
+
task 'init', [:manifest, :opts] do |_, args|
|
|
135
|
+
parse_opts.(args)
|
|
136
|
+
stage = 'init'
|
|
137
|
+
puts if newline
|
|
138
|
+
system("repo init -u #{@manifest_url} -m #{args.manifest || target}.xml", chdir: root)
|
|
139
|
+
repo['all'].invoke
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
desc status.('sync[{0}]')
|
|
143
|
+
task 'sync', [:opts] do |_, args|
|
|
144
|
+
raise_error('repo is not initialized', 'rake repo:init', kind: LoadError) unless branch || stage == 'init'
|
|
145
|
+
|
|
146
|
+
parse_opts.(args)
|
|
147
|
+
cmd << "-j#{ENV.fetch('REPO_JOBS', ::Rake::CpuCounter.count)}"
|
|
148
|
+
cmd << '--fail-fast' if failfast
|
|
149
|
+
puts if newline && stage != 'init'
|
|
150
|
+
begin
|
|
151
|
+
shell("repo sync #{cmd.join(' ')}", chdir: root, exception: failfast)
|
|
152
|
+
rescue StandardError => e
|
|
153
|
+
emphasize(e, title: "rake stash repo:#{stage || 'sync'}")
|
|
154
|
+
raise
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def read_manifest
|
|
161
|
+
require 'rexml/document'
|
|
162
|
+
return unless (file = root_path('.repo/manifest.xml')).exist?
|
|
163
|
+
|
|
164
|
+
doc = REXML::Document.new(file.read)
|
|
165
|
+
doc.elements['manifest/include'].attributes['name']&.sub('.xml', '')
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def confirm_install
|
|
169
|
+
return false unless @root.directory?
|
|
170
|
+
|
|
171
|
+
@override = confirm(
|
|
172
|
+
"#{log_title(:warn)} \"#{sub_style(@root, :bold)}\" is not empty. Continue with installation? [y/N] ",
|
|
173
|
+
default: 'N',
|
|
174
|
+
timeout: env('REPO_TIMEOUT', ignore: '0', default: 15)
|
|
175
|
+
)
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def bool_match(val, pat)
|
|
179
|
+
case val
|
|
180
|
+
when nil, ''
|
|
181
|
+
pat
|
|
182
|
+
when '0'
|
|
183
|
+
false
|
|
184
|
+
when '1'
|
|
185
|
+
true
|
|
186
|
+
else
|
|
187
|
+
Regexp.new(val)
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
def install?(dir = @root)
|
|
192
|
+
return true if empty?(dir) || dir.join('.repo').directory?
|
|
193
|
+
return false unless dir == root && env('REPO_HOME').nil? && !env('REPO_ROOT').nil?
|
|
194
|
+
|
|
195
|
+
root.children.none? { |path| path.directory? && path.basename.to_s[0] != '.' && path.to_s != home.to_s }
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
Application.include Repo
|
|
200
|
+
end
|
|
201
|
+
end
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'forwardable'
|
|
4
|
+
|
|
5
|
+
module Squared
|
|
6
|
+
module Workspace
|
|
7
|
+
class Series
|
|
8
|
+
include ::Rake::DSL
|
|
9
|
+
extend Forwardable
|
|
10
|
+
|
|
11
|
+
attr_reader :workspace, :sync, :multiple, :parallel
|
|
12
|
+
|
|
13
|
+
def_delegators :@data, :[], :each, :each_key, :keys, :fetch, :to_a, :to_s, :inspect, :merge!, :key?, :has_key?
|
|
14
|
+
|
|
15
|
+
def initialize(tasks, workspace, keys: Workspace::Application::WORKSPACE_KEYS)
|
|
16
|
+
if tasks.is_a?(Array)
|
|
17
|
+
@data = {}
|
|
18
|
+
tasks.each { |key| __set__ key }
|
|
19
|
+
else
|
|
20
|
+
@data = tasks.dup
|
|
21
|
+
end
|
|
22
|
+
@workspace = workspace
|
|
23
|
+
@keys = keys
|
|
24
|
+
@sync = []
|
|
25
|
+
@multiple = []
|
|
26
|
+
@parallel = []
|
|
27
|
+
@session = {
|
|
28
|
+
group: {},
|
|
29
|
+
parent: {},
|
|
30
|
+
id: []
|
|
31
|
+
}
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def __set__(key)
|
|
35
|
+
self[key.to_sym] ||= []
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def populate(proj)
|
|
39
|
+
return unless @session
|
|
40
|
+
|
|
41
|
+
group, parent, id = @session.values
|
|
42
|
+
each do |key, items|
|
|
43
|
+
target = "#{proj.name}:#{key}"
|
|
44
|
+
if @keys.include?(key)
|
|
45
|
+
next unless proj.has?(key) || (target = workspace.task_base?(key, target))
|
|
46
|
+
else
|
|
47
|
+
next unless workspace.task_include?(proj, key)
|
|
48
|
+
end
|
|
49
|
+
if (g = proj.group)
|
|
50
|
+
id << g
|
|
51
|
+
(group[:"#{key}:#{g}"] ||= []).push(target)
|
|
52
|
+
else
|
|
53
|
+
items << target
|
|
54
|
+
end
|
|
55
|
+
next unless (b = find_base(proj)) && (name = b.to_sym.to_s) != g
|
|
56
|
+
|
|
57
|
+
id << name
|
|
58
|
+
(parent[:"#{key}:#{name}"] ||= []).push(target)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def method_missing(key, *)
|
|
63
|
+
self[key]
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def finalize!(thread = [])
|
|
67
|
+
thread.map!(&:to_s)
|
|
68
|
+
group, parent, id = @session.values
|
|
69
|
+
merge!(parent) if id.uniq.size > 1
|
|
70
|
+
merge!(group)
|
|
71
|
+
each do |key, items|
|
|
72
|
+
next if items.empty?
|
|
73
|
+
|
|
74
|
+
key = key.to_s
|
|
75
|
+
if items.size > 1
|
|
76
|
+
multiple << key
|
|
77
|
+
if thread.include?(key) || (key.include?(':') && thread.include?(key.split(':').first.to_sym))
|
|
78
|
+
desc "#{key} (thread)"
|
|
79
|
+
multitask key => items
|
|
80
|
+
parallel << key
|
|
81
|
+
|
|
82
|
+
desc "#{key} (sync)"
|
|
83
|
+
task "#{key}:sync": items
|
|
84
|
+
sync << "#{key}:sync"
|
|
85
|
+
multiple << "#{key}:sync"
|
|
86
|
+
next
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
desc key
|
|
91
|
+
task key => items
|
|
92
|
+
end
|
|
93
|
+
@session = nil
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def has?(key)
|
|
97
|
+
!key.nil? && key?(key = key.to_sym) && !self[key].empty?
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def multiple?(val = nil)
|
|
101
|
+
already_invoked?(multiple, val)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def sync?(val = nil)
|
|
105
|
+
already_invoked?(sync, val)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def parallel?(val = nil)
|
|
109
|
+
already_invoked?(parallel, val)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def respond_to_missing?(key, *)
|
|
113
|
+
key?(key)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
private
|
|
117
|
+
|
|
118
|
+
def already_invoked?(list, val)
|
|
119
|
+
return list.include?(val) && invoked?(val) if val
|
|
120
|
+
|
|
121
|
+
::Rake::Task.tasks.any? { |item| item.already_invoked && list.include?(item.name) }
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require_relative 'common'
|
|
4
|
+
|
|
3
5
|
module Squared
|
|
4
|
-
module
|
|
6
|
+
module Workspace
|
|
5
7
|
class << self
|
|
6
8
|
def resolve(*args)
|
|
7
9
|
ret = args.map do |id|
|
|
@@ -35,5 +37,6 @@ module Squared
|
|
|
35
37
|
end
|
|
36
38
|
end
|
|
37
39
|
|
|
38
|
-
require_relative '
|
|
39
|
-
require_relative '
|
|
40
|
+
require_relative 'workspace/application'
|
|
41
|
+
require_relative 'workspace/series'
|
|
42
|
+
require_relative 'workspace/project'
|
data/lib/squared.rb
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require_relative 'squared/version'
|
|
4
|
-
require_relative 'squared/
|
|
5
|
-
require_relative 'squared/repo'
|
|
6
|
-
require_relative 'squared/config'
|
|
4
|
+
require_relative 'squared/workspace'
|
|
7
5
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
6
|
+
Workspace = Squared::Workspace
|
|
7
|
+
Project = Squared::Workspace::Project
|
|
8
|
+
|
|
9
|
+
Workspace::Application.implement(
|
|
10
|
+
Project::Git,
|
|
11
|
+
Project::Node,
|
|
12
|
+
Project::Python,
|
|
13
|
+
Project::Ruby
|
|
13
14
|
)
|
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.6
|
|
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-
|
|
11
|
+
date: 2024-11-10 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rake
|
|
@@ -50,21 +50,24 @@ files:
|
|
|
50
50
|
- README.ruby.md
|
|
51
51
|
- lib/squared.rb
|
|
52
52
|
- lib/squared/common.rb
|
|
53
|
+
- lib/squared/common/base.rb
|
|
53
54
|
- lib/squared/common/class.rb
|
|
54
55
|
- lib/squared/common/format.rb
|
|
55
56
|
- lib/squared/common/shell.rb
|
|
56
57
|
- lib/squared/common/system.rb
|
|
57
58
|
- lib/squared/common/task.rb
|
|
58
59
|
- lib/squared/config.rb
|
|
59
|
-
- lib/squared/repo.rb
|
|
60
|
-
- lib/squared/repo/project.rb
|
|
61
|
-
- lib/squared/repo/project/base.rb
|
|
62
|
-
- lib/squared/repo/project/git.rb
|
|
63
|
-
- lib/squared/repo/project/node.rb
|
|
64
|
-
- lib/squared/repo/project/python.rb
|
|
65
|
-
- lib/squared/repo/project/ruby.rb
|
|
66
|
-
- lib/squared/repo/workspace.rb
|
|
67
60
|
- lib/squared/version.rb
|
|
61
|
+
- lib/squared/workspace.rb
|
|
62
|
+
- lib/squared/workspace/application.rb
|
|
63
|
+
- lib/squared/workspace/project.rb
|
|
64
|
+
- lib/squared/workspace/project/base.rb
|
|
65
|
+
- lib/squared/workspace/project/git.rb
|
|
66
|
+
- lib/squared/workspace/project/node.rb
|
|
67
|
+
- lib/squared/workspace/project/python.rb
|
|
68
|
+
- lib/squared/workspace/project/ruby.rb
|
|
69
|
+
- lib/squared/workspace/repo.rb
|
|
70
|
+
- lib/squared/workspace/series.rb
|
|
68
71
|
- squared.gemspec
|
|
69
72
|
homepage: https://github.com/anpham6/squared
|
|
70
73
|
licenses:
|