Fix issue with overmatching gem names. (#10603)

* Fix issue with overmatching gem names.

Use regex to only match the exact gem name.

Also adjust underscores to dashes if the gem
package name doesn't match a gem name.

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

* Show package names when showing update status.

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

* Update installer to record pre-installed gems.

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

* Handle gem version lists sometimes not being sorted.

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

---------

Signed-off-by: Satadru Pramanik <satadru@gmail.com>
This commit is contained in:
Satadru Pramanik, DO, MPH, MEng
2024-10-13 15:09:59 -04:00
committed by GitHub
parent f4b7d38e1a
commit c06b30fa1c
5 changed files with 44 additions and 14 deletions

View File

@@ -1,6 +1,9 @@
---
name: Rubocop
on: workflow_call
permissions:
contents: read
pull-requests: write
jobs:
rubocop:
runs-on: ubuntu-latest

View File

@@ -168,8 +168,6 @@ echo_out 'Set up the local package repo...'
# Download the chromebrew repository.
curl -L --progress-bar https://github.com/"${OWNER}"/"${REPO}"/tarball/"${BRANCH}" | tar -xz --strip-components=1 -C "${CREW_LIB_PATH}"
# Disable ruby updates until late in the install.
sed -i -e "s/depends_on 'default_gems'/# depends_on 'default_gems'/" -e "s/depends_on 'bundled_gems'/# depends_on 'bundled_gems'/" -e "s/^ version.*$/ version '1.0'/" "${CREW_LIB_PATH}/packages/core.rb"
BOOTSTRAP_PACKAGES='lz4 zlib xzutils zstd crew_mvdir ruby git ca_certificates libyaml openssl'
@@ -270,7 +268,7 @@ function extract_install () {
function update_device_json () {
cd "${CREW_CONFIG_PATH}"
echo_intra "Adding new information on ${1} to device.json..."
echo_intra "Adding new information on ${1} ${2} to device.json..."
new_info=$(jq --arg name "$1" --arg version "$2" --arg sha256 "$3" '.installed_packages |= . + [{"name": $name, "version": $version, "sha256": $sha256}]' device.json)
cat <<< "${new_info}" > device.json
}
@@ -338,6 +336,18 @@ gem sources -u
gem update --no-update-sources -N --system
gem cleanup
# Mark packages as installed for pre-installed gems.
mapfile -t installed_gems < <(gem list | awk -F ' \(' '{print $1, $2}' | sed -e 's/default://' -e 's/)//' -e 's/,//' | awk '{print $1, $2}')
for i in "${!installed_gems[@]}"
do
j="${installed_gems[$i]}"
gem_package="${j% *}"
crew_gem_package="ruby_${gem_package//-/_}"
gem_version="${j#* }"
gem contents "${gem_package}" > "${CREW_META_PATH}/${crew_gem_package}.filelist"
update_device_json "ruby_${gem_package//-/_}" "${gem_version}" ""
done
echo_info "Installing essential ruby gems...\n"
BOOTSTRAP_GEMS='activesupport concurrent-ruby highline ptools'
# shellcheck disable=SC2086
@@ -394,9 +404,7 @@ else
# Set mtimes of files to when the file was committed.
git-restore-mtime -sq 2>/dev/null
# Try to efficiently update installed gems before installing the
# Chromebrew gem package updates.
crew update && yes | crew upgrade
OWNER=${OWNER} REPO=${REPO} crew update
fi
echo -e "${RESET}"

View File

@@ -1,4 +1,5 @@
require 'color'
require 'gem_compact_index_client'
require 'package'
require 'package_utils'
@@ -53,9 +54,16 @@ def set_vars(passed_name = nil, passed_version = nil)
end
end)
end
gem_test = $gems.grep(/#{name.gsub(/^ruby_/, '')}/).first
if $gems.blank?
puts 'Populating gem information using compact index client...'.lightgreen
$gems ||= BasicCompactIndexClient.new.gems
puts 'Done populating gem information.'.lightgreen
end
gem_test = $gems.grep(/#{"^#{passed_name.gsub(/^ruby_/, '')}\\s.*$"}/).first.blank? ? $gems.grep(/#{"^#{passed_name.gsub(/^ruby_/, '').gsub('_', '-')}\\s.*$"}/).first : $gems.grep(/#{"^#{passed_name.gsub(/^ruby_/, '')}\\s.*$"}/).first
gem_test_name = gem_test.split.first
gem_test_version = gem_test.split[1].split(',').last
gem_test_versions = gem_test.split[1].split(',')
gem_test_versions.delete_if { |i| i.include?('beta') }
gem_test_version = gem_test_versions.max
@gem_name = gem_test_name.blank? ? Gem::SpecFetcher.fetcher.suggest_gems_from_name(passed_name.gsub(/^ruby_/, '')).first : gem_test_name
@remote_gem_ver = gem_test_name.blank? ? Gem.latest_version_for(@gem_name).to_s : gem_test_version
@gem_ver = passed_version.split('-').first.to_s
@@ -106,6 +114,7 @@ class RUBY < Package
end
def self.install
@gem_latest_version_installed = Kernel.system "gem search --no-update-sources -l -i \"^#{@gem_name}\$\" -v #{@gem_ver}", %i[out err] => File::NULL
gem_anyversion_installed = Kernel.system "gem search --no-update-sources -l -i \"^#{@gem_name}\$\"", %i[out err] => File::NULL
crewlog "install: @gem_name: #{@gem_name}, @gem_ver: #{@gem_ver}, !@gem_latest_version_installed && gem_anyversion_installed: #{!@gem_latest_version_installed && gem_anyversion_installed}, @gem_latest_version_installed: #{@gem_latest_version_installed} && @remote_gem_ver.to_s: #{Gem::Version.new(@remote_gem_ver.to_s)} == Gem::Version.new(@gem_ver): #{Gem::Version.new(@gem_ver)} && File.file?(@gem_filelist_path): #{File.file?(@gem_filelist_path)}"
crewlog "no_compile_needed?: #{no_compile_needed?} @gem_binary_build_needed.blank?: #{@gem_binary_build_needed.blank?}, gem_compile_needed?: #{gem_compile_needed?}"

View File

@@ -3,7 +3,7 @@
require 'etc'
OLD_CREW_VERSION ||= defined?(CREW_VERSION) ? CREW_VERSION : '1.0'
CREW_VERSION ||= '1.54.5' unless defined?(CREW_VERSION) && CREW_VERSION == OLD_CREW_VERSION
CREW_VERSION ||= '1.54.6' unless defined?(CREW_VERSION) && CREW_VERSION == OLD_CREW_VERSION
# Kernel architecture.
KERN_ARCH ||= Etc.uname[:machine]

View File

@@ -5,6 +5,7 @@
# tools/update_ruby_gem_packages.rb
require_relative '../lib/color'
require_relative '../lib/const'
require_relative '../lib/gem_compact_index_client'
def require_gem(gem_name_and_require = nil, require_override = nil)
# Allow only loading gems when needed.
return if gem_name_and_require.nil?
@@ -27,6 +28,8 @@ end
require_gem('activesupport', 'active_support/core_ext/object/blank')
require_gem 'concurrent-ruby'
gems ||= BasicCompactIndexClient.new.gems
pool = Concurrent::ThreadPoolExecutor.new(
min_threads: 1,
max_threads: CREW_NPROC.to_i + 1,
@@ -38,11 +41,18 @@ 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_test = package.gsub(%r{^packages/ruby_}, '').gsub(/.rb$/, '')
gem_version = Gem.latest_version_for(gem_name_test).to_s
gem_version = Gem.latest_version_for(gem_name_test.gsub!('_', '-')).to_s if gem_version.empty?
gem_name = gem_name_test
puts "[#{(index + 1).to_s.rjust(numlength)}/#{total_files_to_check}] Checking rubygems for updates to #{gem_name}...".orange
untested_package_name = package.gsub(%r{^packages/ruby_}, '').gsub(/.rb$/, '')
gem_test = gems.grep(/#{"^#{untested_package_name}\\s.*$"}/).first.blank? ? gems.grep(/#{"^#{untested_package_name.gsub('_', '-')}\\s.*$"}/).first : gems.grep(/#{"^#{untested_package_name}\\s.*$"}/).first
gem_test_name = gem_test.split.first
puts "#{untested_package_name} versions for #{gem_test_name} are #{gem_test.split[1].split(',')}" if CREW_VERBOSE
gem_test_versions = gem_test.split[1].split(',')
gem_test_versions.delete_if { |i| i.include?('beta') }
gem_test_version = gem_test_versions.max
puts "#{untested_package_name} is #{gem_test_name} version #{gem_test_version}".lightpurple if CREW_VERBOSE
gem_name = gem_test_name.blank? ? Gem::SpecFetcher.fetcher.suggest_gems_from_name(untested_package_name).first : gem_test_name
gem_version = gem_test_name.blank? ? Gem.latest_version_for(untested_package_name).to_s : gem_test_version
puts "[#{(index + 1).to_s.rjust(numlength)}/#{total_files_to_check}] Checking rubygems for updates to #{gem_name} in #{package}...".orange
pkg_version = `sed -n -e 's/^\ \ version //p' #{package}`.chomp.delete("'").delete('"').gsub(/-\#{CREW_RUBY_VER}/, '').split('-').first
next package if gem_version.blank?
if Gem::Version.new(gem_version) > Gem::Version.new(pkg_version)