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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3db5a8b610ff7bc9ec798dc24cf75a7374121e5002d32368131f2df7790acddd
4
- data.tar.gz: e2948df19a71be0c678a11b654f4a0bdd254c1e2316ca589916ea7abb098fb30
3
+ metadata.gz: d4a06840ad4b9512eabb972bda5a1b4d5881ecb01b5e13c9e14559d587c3f766
4
+ data.tar.gz: ddfec68fad3ed57a7d7e1c62006d5784e923d0ae6f483edf37784b33d85db349
5
5
  SHA512:
6
- metadata.gz: 3ec51426ef6265bdb17f27fd2346663f96f279a53318f7076ab3965e5ba022650e516e05fbe5506b79ad058d87733f43336b07392a59752da390e5f45f74b486
7
- data.tar.gz: 62ba954af037cbbb80a13ecd936f036962f0b93208f2d8f1c24822d89928d616204415d73130d58d1aa70cc385fd82c16b7bde84ce61b0ff1e7e0c37471f86a0
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 dry_run
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
- output = `gem search ^#{name}$ --remote --no-verbose 2>/dev/null`.strip
94
- match = output.match(/#{Regexp.escape(name)}\s+\(([^)]+)\)/)
95
- match ? match[1] : nil
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)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Legion
4
- VERSION = '1.4.124'
4
+ VERSION = '1.4.125'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: legionio
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.124
4
+ version: 1.4.125
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esity