Do not reinstall from source on gem upgrades when a built gem is available. — py3_libxml2 → 2.15.1 (#13158)

* Do not reinstall from source on gem upgrades when a built gem is available.

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

* Fix py3_libxml2 build.

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

* Document changes in-line.

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

* libxml2: Package File Update Run on linux/386 container.

* Allow def archive to overwrite output file.

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

* libxml2: Package File Update Run on linux/arm/v7 container.

---------

Signed-off-by: Satadru Pramanik <satadru@gmail.com>
Co-authored-by: chromebrew-actions[bot] <chromebrew-actions[bot]@users.noreply.github.com>
Co-authored-by: satmandu <satmandu@users.noreply.github.com>
This commit is contained in:
Satadru Pramanik, DO, MPH, MEng
2025-10-17 13:37:56 -04:00
committed by GitHub
parent a6683c95a8
commit fc08f3c26c
8 changed files with 68 additions and 73 deletions

View File

@@ -21,6 +21,24 @@ def check_gem_binary_build_needed(ruby_gem_name = nil, ruby_gem_version = nil)
return @build_needed
end
def gem_info(ruby_gem_name = nil)
# @ruby_gem_version comes from the set_vars function.
installed_gem_search = [`gem list --no-update-sources -l -e #{ruby_gem_name}`.chomp.to_s].grep(/#{ruby_gem_name}/)[0]
if installed_gem_search
installed_gem_info = installed_gem_search.delete('()').gsub('default:', '').gsub(',', '').split
@gem_installed_version = installed_gem_info[1]
@gem_outdated = (Gem::Version.new(@ruby_gem_version) > Gem::Version.new(@gem_installed_version))
@gem_latest_version_installed = Gem::Version.new(@ruby_gem_version) <= Gem::Version.new(@gem_installed_version)
else
# If the current gem being installed is not installed this should
# be false. This will also handle cases of the current installed
# gem as per 'gem list' being the same version as the version
# being upgraded to.
@gem_latest_version_installed = false
end
crewlog "@ruby_gem_version: #{@ruby_gem_version} gem_installed_version: #{@gem_installed_version} @gem_outdated: #{@gem_outdated} @gem_latest_version_installed: #{@gem_latest_version_installed}"
end
def set_vars(passed_name = nil, passed_version = nil)
# crewlog "Setting gem variables... name: #{passed_name}, version: #{passed_version}"
# This assumes the package class name starts with 'Ruby_' and
@@ -67,7 +85,12 @@ def set_vars(passed_name = nil, passed_version = nil)
end
def save_gem_filelist(gem_name = nil, gem_filelist_path = nil)
files = `gem install #{gem_name} &>/dev/null ; gem contents #{gem_name}`.chomp.split
crewlog "@gem_latest_version_installed: #{@gem_latest_version_installed}"
files = if @gem_latest_version_installed
`gem contents #{gem_name}`.chomp.split
else
`gem install #{gem_name} &>/dev/null ; gem contents #{gem_name}`.chomp.split
end
exes = files.grep(%r{/exe/|/bin/})
# Gem.bindir should end up being #{CREW_PREFIX}/bin.
exes&.map! { |x| x.gsub(%r{^.*(/exe/|/bin/)}, "#{Gem.bindir}/") }
@@ -97,14 +120,7 @@ class RUBY < Package
set_vars(name, version)
puts "Examining #{@ruby_gem_name} gem...".orange
@gem_filelist_path = File.join(CREW_META_PATH, "#{name}.filelist")
installed_gem_search = [`gem list -l -e #{@ruby_gem_name}`.chomp.to_s].grep(/#{@ruby_gem_name}/)[0]
if installed_gem_search
installed_gem_info = installed_gem_search.delete('()').gsub('default:', '').gsub(',', '').split
@gem_installed_version = installed_gem_info[1]
@gem_outdated = (Gem::Version.new(@ruby_gem_version) > Gem::Version.new(@gem_installed_version))
@gem_latest_version_installed = Gem::Version.new(@ruby_gem_version) <= Gem::Version.new(@gem_installed_version)
crewlog "@ruby_gem_version: #{@ruby_gem_version} @gem_installed_version: #{@gem_installed_version} @gem_outdated: #{@gem_outdated} @gem_latest_version_installed: #{@gem_latest_version_installed}"
end
gem_info(@ruby_gem_name)
# Create a filelist from the gem if the latest gem version is
# installed.
@@ -149,20 +165,7 @@ class RUBY < Package
puts "#{@ruby_gem_name} #{@gem_installed_version} is properly installed.".lightgreen
return
end
installed_gem_search = [`gem list --no-update-sources -l -e #{@ruby_gem_name}`.chomp.to_s].grep(/#{@ruby_gem_name}/)[0]
if installed_gem_search
installed_gem_info = installed_gem_search.delete('()').gsub('default:', '').gsub(',', '').split
@gem_installed_version = installed_gem_info[1]
@gem_outdated = (Gem::Version.new(@ruby_gem_version) > Gem::Version.new(@gem_installed_version))
@gem_latest_version_installed = Gem::Version.new(@ruby_gem_version) <= Gem::Version.new(@gem_installed_version)
crewlog "@ruby_gem_version: #{@ruby_gem_version} @gem_installed_version: #{@gem_installed_version} @gem_outdated: #{@gem_outdated} @gem_latest_version_installed: #{@gem_latest_version_installed}"
else
# If the current gem being installed is not installed this should
# be false. This will also handle cases of the current installed
# gem as per 'gem list' being the same version as the version
# being upgraded to.
@gem_latest_version_installed = false
end
gem_info(@ruby_gem_name)
crewlog "no_compile_needed?: #{no_compile_needed?} @gem_binary_build_needed.blank?: #{@gem_binary_build_needed.blank?}, gem_compile_needed?: #{gem_compile_needed?}"
puts "#{@ruby_gem_name.capitalize} needs a binary gem built!".orange unless @gem_binary_build_needed.blank?
@@ -181,6 +184,8 @@ class RUBY < Package
puts "Installing #{@ruby_gem_name} gem #{@ruby_gem_version}...".orange
Kernel.system "gem install --no-update-sources -N #{@ruby_gem_name} --conservative"
end
# Check gem versions again.
gem_info(@ruby_gem_name)
@gems_needing_cleanup = Array(@gems_needing_cleanup) << @ruby_gem_name unless @gem_latest_version_installed
save_gem_filelist(@ruby_gem_name, @gem_filelist_path)
@ruby_install_extras&.call

View File

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

View File

@@ -13,15 +13,16 @@ require_gem('highline')
# All needed constants & variables should be defined here in case they
# have not yet been loaded or fixup is being run standalone.
CREW_VERBOSE ||= ARGV.intersect?(%w[-v --verbose]) unless defined?(CREW_VERBOSE)
CREW_UNATTENDED ||= ENV.fetch('CREW_UNATTENDED', false) unless defined?(CREW_UNATTENDED)
CREW_VERBOSE ||= ARGV.intersect?(%w[-v --verbose]) unless defined?(CREW_VERBOSE)
CREW_PREFIX ||= '/usr/local'
CREW_LIB_PATH ||= File.join(CREW_PREFIX, 'lib/crew')
CREW_PREFIX ||= '/usr/local'
CREW_LIB_PATH ||= File.join(CREW_PREFIX, 'lib/crew')
CREW_CONFIG_PATH ||= File.join(CREW_PREFIX, 'etc/crew')
CREW_META_PATH ||= File.join(CREW_CONFIG_PATH, 'meta')
CREW_REPO ||= ENV.fetch('CREW_REPO', 'https://github.com/chromebrew/chromebrew.git') unless defined?(CREW_REPO)
CREW_BRANCH ||= ENV.fetch('CREW_BRANCH', 'master') unless defined?(CREW_BRANCH)
CREW_META_PATH ||= File.join(CREW_CONFIG_PATH, 'meta')
CREW_REPO ||= ENV.fetch('CREW_REPO', 'https://github.com/chromebrew/chromebrew.git') unless defined?(CREW_REPO)
CREW_BRANCH ||= ENV.fetch('CREW_BRANCH', 'master') unless defined?(CREW_BRANCH)
load "#{CREW_LIB_PATH}/lib/const.rb"
load "#{CREW_LIB_PATH}/lib/package.rb"
@@ -277,7 +278,7 @@ if File.exist?("#{CREW_PREFIX}/bin/upx") && File.exist?("#{CREW_PREFIX}/bin/patc
# errors on arm.
# Running find twice because it involves less ruby overhead than saving
# the output in memory, and also doing that in ruby is VERY SLOW.
puts 'Please wait while upx is run to uncompress binaries...'.lightblue
puts 'Please wait while upx is run to uncompress binaries...'.lightblue unless CREW_UNATTENDED
Kernel.system "#{CREW_PREFIX}/bin/find #{CREW_PREFIX}/bin -type f -print0 | xargs -0 -P#{CREW_NPROC} -n1 -r bash -c 'header=$(head -c4 ${0}); elfheader='$(printf '\\\177ELF')' ; arheader=\\!\\<ar ; case $header in $elfheader|$arheader) upx -qq -d ${0} ;; esac'", %i[err] => File::NULL, exception: false
unless CREW_GLIBC_INTERPRETER.blank?