legionio 1.4.124 → 1.4.125
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 +7 -0
- data/lib/legion/cli/update_command.rb +55 -14
- data/lib/legion/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d4a06840ad4b9512eabb972bda5a1b4d5881ecb01b5e13c9e14559d587c3f766
|
|
4
|
+
data.tar.gz: ddfec68fad3ed57a7d7e1c62006d5784e923d0ae6f483edf37784b33d85db349
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d7fde033daf8d06e45dbbe5ccbf9774e34b8daeb64514995c80bfd80b9f0223547b5ce899c94e1f6e968cad184790893da1024f2cbcbff3fe727680342032ebb
|
|
7
|
+
data.tar.gz: d2a3c645e9cc6f22d020deb00911452a4ba14adb2719703f09d2e0de90bf4957475276519a8e789a8889dec9e344befcb4e8700d8ad1f47589a38626b91f8c75
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Legion Changelog
|
|
2
2
|
|
|
3
|
+
## [1.4.125] - 2026-03-22
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
- Parallelize update command version checks using RubyGems HTTP API and concurrent-ruby thread pool
|
|
7
|
+
- Skip `gem install` entirely when all gems are already at latest version
|
|
8
|
+
- Only install gems that are actually outdated instead of reinstalling all gems
|
|
9
|
+
|
|
3
10
|
## [1.4.124] - 2026-03-22
|
|
4
11
|
|
|
5
12
|
### Changed
|
|
@@ -3,6 +3,9 @@
|
|
|
3
3
|
require 'English'
|
|
4
4
|
require 'thor'
|
|
5
5
|
require 'rbconfig'
|
|
6
|
+
require 'concurrent'
|
|
7
|
+
require 'net/http'
|
|
8
|
+
require 'json'
|
|
6
9
|
|
|
7
10
|
module Legion
|
|
8
11
|
module CLI
|
|
@@ -72,27 +75,65 @@ module Legion
|
|
|
72
75
|
end
|
|
73
76
|
|
|
74
77
|
def update_gems(gem_names, gem_bin, dry_run: false)
|
|
78
|
+
local_versions = snapshot_versions(gem_names)
|
|
79
|
+
remote_versions = fetch_remote_versions_parallel(gem_names)
|
|
80
|
+
|
|
81
|
+
outdated = gem_names.select do |name|
|
|
82
|
+
remote = remote_versions[name]
|
|
83
|
+
local = local_versions[name]
|
|
84
|
+
remote && local && Gem::Version.new(remote) > Gem::Version.new(local)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
if dry_run
|
|
88
|
+
return gem_names.map do |name|
|
|
89
|
+
local = local_versions[name]
|
|
90
|
+
remote = remote_versions[name]
|
|
91
|
+
needs_update = remote && local && Gem::Version.new(remote) > Gem::Version.new(local)
|
|
92
|
+
{ name: name, from: local, to: remote, status: needs_update ? 'available' : 'current' }
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
return gem_names.map { |name| { name: name, status: 'updated', output: '' } } if outdated.empty?
|
|
97
|
+
|
|
98
|
+
output = `#{gem_bin} install #{outdated.join(' ')} --no-document 2>&1`
|
|
99
|
+
success = $CHILD_STATUS.success?
|
|
75
100
|
gem_names.map do |name|
|
|
76
|
-
if
|
|
77
|
-
remote = fetch_remote_version(name)
|
|
78
|
-
local = begin
|
|
79
|
-
Gem::Specification.find_by_name(name).version.to_s
|
|
80
|
-
rescue Gem::MissingSpecError
|
|
81
|
-
nil
|
|
82
|
-
end
|
|
83
|
-
{ name: name, from: local, to: remote, status: remote && remote != local ? 'available' : 'current' }
|
|
84
|
-
else
|
|
85
|
-
output = `#{gem_bin} install #{name} --no-document 2>&1`
|
|
86
|
-
success = $CHILD_STATUS.success?
|
|
101
|
+
if outdated.include?(name)
|
|
87
102
|
{ name: name, status: success ? 'updated' : 'failed', output: output.strip }
|
|
103
|
+
else
|
|
104
|
+
{ name: name, status: 'updated', output: '' }
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def fetch_remote_versions_parallel(gem_names)
|
|
110
|
+
results = Concurrent::Hash.new
|
|
111
|
+
pool = Concurrent::FixedThreadPool.new([gem_names.size, 24].min)
|
|
112
|
+
latch = Concurrent::CountDownLatch.new(gem_names.size)
|
|
113
|
+
|
|
114
|
+
gem_names.each do |name|
|
|
115
|
+
pool.post do
|
|
116
|
+
version = fetch_remote_version(name)
|
|
117
|
+
results[name] = version if version
|
|
118
|
+
rescue StandardError => e
|
|
119
|
+
Legion::Logging.debug("UpdateCommand#fetch_remote_version #{name}: #{e.message}") if defined?(Legion::Logging)
|
|
120
|
+
ensure
|
|
121
|
+
latch.count_down
|
|
88
122
|
end
|
|
89
123
|
end
|
|
124
|
+
|
|
125
|
+
latch.wait(30)
|
|
126
|
+
pool.shutdown
|
|
127
|
+
results
|
|
90
128
|
end
|
|
91
129
|
|
|
92
130
|
def fetch_remote_version(name)
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
131
|
+
uri = URI("https://rubygems.org/api/v1/versions/#{name}/latest.json")
|
|
132
|
+
response = Net::HTTP.get_response(uri)
|
|
133
|
+
return nil unless response.is_a?(Net::HTTPSuccess)
|
|
134
|
+
|
|
135
|
+
data = ::JSON.parse(response.body)
|
|
136
|
+
data['version']
|
|
96
137
|
end
|
|
97
138
|
|
|
98
139
|
def display_results(out, results, before, after)
|
data/lib/legion/version.rb
CHANGED