Files
chromebrew/tools/update_ruby_gem_packages.rb
Satadru Pramanik, DO, MPH, MEng 24cda80f45 Add gem binary build functionality and also refactor upload to use regex in lieu of sed (#10494)
* Add initial plumbing for ruby gem-compiler use.

Signed-off-by: Satadru Pramanik <satadru@gmail.com>

* Add binary gem building to ruby buildsystem.

Signed-off-by: Satadru Pramanik <satadru@gmail.com>

* Refactor upload to avoid sed.

Signed-off-by: Satadru Pramanik <satadru@gmail.com>

* Add gem binary build plumbing to crew.

Signed-off-by: Satadru Pramanik <satadru@gmail.com>

* Add binary_compression to gems.

Signed-off-by: Satadru Pramanik <satadru@gmail.com>

* Add ruby gem binaries.

Signed-off-by: Satadru Pramanik <satadru@gmail.com>

* Move ruby_ruby_libversion to core.

Signed-off-by: Satadru Pramanik <satadru@gmail.com>

* Ruby gem update check should account for local versions.

Signed-off-by: Satadru Pramanik <satadru@gmail.com>

* Remove unused update_sha256 function.

Signed-off-by: Satadru Pramanik <satadru@gmail.com>

* Add no_compile_needed to ruby_rubocop.rb

Signed-off-by: Satadru Pramanik <satadru@gmail.com>

* Remove ruby_gem_compiler from buildessential.

Signed-off-by: Satadru Pramanik <satadru@gmail.com>

---------

Signed-off-by: Satadru Pramanik <satadru@gmail.com>
2024-09-19 11:52:39 -05:00

60 lines
2.5 KiB
Ruby
Executable File

#!/usr/bin/env ruby
# update_ruby_gem_packages version 1.3 (for Chromebrew)
# Author: Satadru Pramanik (satmandu) satadru at gmail dot com
# Usage in root of cloned chromebrew repo:
# tools/update_ruby_gem_packages.rb
require_relative '../lib/color'
require_relative '../lib/const'
def require_gem(gem_name_and_require = nil, require_override = nil)
# Allow only loading gems when needed.
return if gem_name_and_require.nil?
gem_name = gem_name_and_require.split('/')[0]
begin
gem gem_name
rescue LoadError
puts " -> install #{gem_name} gem".orange
Gem.install(gem_name)
gem gem_name
end
requires = if require_override.nil?
gem_name_and_require.split('/')[1].nil? ? gem_name_and_require.split('/')[0] : gem_name_and_require
else
require_override
end
require requires
end
require_gem('activesupport', 'active_support/core_ext/object/blank')
require_gem 'concurrent-ruby'
ruby_ver_string = "-ruby-#{RUBY_VERSION.slice(/(?:.*(?=\.))/)}"
pool = Concurrent::ThreadPoolExecutor.new(
min_threads: 1,
max_threads: CREW_NPROC.to_i + 1,
max_queue: 0, # unbounded work queue
fallback_policy: :caller_runs
)
relevant_gem_packages = Dir['packages/ruby_*.rb']
total_files_to_check = relevant_gem_packages.length
numlength = total_files_to_check.to_s.length
relevant_gem_packages.each_with_index do |package, index|
pool.post do
gem_name = package.gsub('.rb', '').sub('ruby_', '').gsub('_', '-').gsub('packages/', '')
puts "[#{(index + 1).to_s.rjust(numlength)}/#{total_files_to_check}] Checking rubygems for updates to #{gem_name}...".orange
pkg_version = `sed -n -e 's/^\ \ version //p' #{package}`.chomp.delete("'").delete('"').gsub(ruby_ver_string, '').split('-').first
gem_version = Gem.latest_spec_for(gem_name).version.to_s
next package if gem_version.blank?
if Gem::Version.new(gem_version) > Gem::Version.new(pkg_version)
puts "Updating #{gem_name} from #{pkg_version} to #{gem_version}".lightblue
system "sed -i \"s,^\ \ version\ .*,\ \ version '#{gem_version}-ruby-#{RUBY_VERSION.slice(/(?:.*(?=\.))/)}',\" #{package}"
end
relevant_gem_packages.delete(package)
end
end
pool.shutdown
pool.wait_for_termination
puts "Done checking for updates to #{total_files_to_check} ruby gems.\r".orange
return if relevant_gem_packages.blank?
puts "Updated version#{relevant_gem_packages.length > 1 ? 's were' : ' was'} could not be found for: #{relevant_gem_packages.map { |i| i.gsub('.rb', '').sub('ruby_', '').gsub('_', '-').gsub('packages/', '') }.join(' ')}".orange