diff --git a/.github/workflows/Rubocop.yml b/.github/workflows/Rubocop.yml index 9dff1f862..5fcbbc3e6 100644 --- a/.github/workflows/Rubocop.yml +++ b/.github/workflows/Rubocop.yml @@ -1,6 +1,9 @@ --- name: Rubocop on: workflow_call +permissions: + contents: read + pull-requests: write jobs: rubocop: runs-on: ubuntu-latest diff --git a/install.sh b/install.sh index 46c418da5..bc3c4350d 100755 --- a/install.sh +++ b/install.sh @@ -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}" diff --git a/lib/buildsystems/ruby.rb b/lib/buildsystems/ruby.rb index 425bf7ced..54a4eb8d9 100644 --- a/lib/buildsystems/ruby.rb +++ b/lib/buildsystems/ruby.rb @@ -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?}" diff --git a/lib/const.rb b/lib/const.rb index e1bad3c15..afdaabdf3 100644 --- a/lib/const.rb +++ b/lib/const.rb @@ -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] diff --git a/tools/update_ruby_gem_packages.rb b/tools/update_ruby_gem_packages.rb index 97ae92eb6..2f5994777 100755 --- a/tools/update_ruby_gem_packages.rb +++ b/tools/update_ruby_gem_packages.rb @@ -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)