diff --git a/lib/const.rb b/lib/const.rb index 1bda0e13a..a4e646829 100644 --- a/lib/const.rb +++ b/lib/const.rb @@ -4,7 +4,7 @@ require 'etc' require 'open3' OLD_CREW_VERSION ||= defined?(CREW_VERSION) ? CREW_VERSION : '1.0' -CREW_VERSION ||= '1.66.8' unless defined?(CREW_VERSION) && CREW_VERSION == OLD_CREW_VERSION +CREW_VERSION ||= '1.66.9' unless defined?(CREW_VERSION) && CREW_VERSION == OLD_CREW_VERSION # Kernel architecture. KERN_ARCH ||= Etc.uname[:machine] @@ -178,58 +178,6 @@ unless defined?(CHROMEOS_RELEASE) end end -# Some packges need manual adjustments of URLS for different versions. -unless defined?(CREW_UPDATER_EXCLUDED_PKGS) - CREW_UPDATER_EXCLUDED_PKGS = Set[ - { pkg_name: 'glibc', comments: 'Requires manual update.' }, - { pkg_name: 'pkg_config', comments: 'Upstream is abandoned.' }, - { pkg_name: 'linuxheaders', comments: 'Requires manual update.' }, - { pkg_name: 'py3_ldapdomaindump', comments: 'Build is broken.' }, - { pkg_name: 'ruby', comments: 'i686 needs building with GCC 14.' }, - { pkg_name: 'xdg_base', comments: 'Internal Chromebrew Package.' } - ].to_h { |h| [h[:pkg_name], h[:comments]] } -end -CREW_AUTOMATIC_VERSION_UPDATE_EXCLUSION_REGEX = "(#{CREW_UPDATER_EXCLUDED_PKGS.keys.map { |p| "^#{p}$" }.join('|')})" unless defined?(CREW_AUTOMATIC_VERSION_UPDATE_EXCLUSION_REGEX) - -# Some packages have different names in anitya. -unless defined?(CREW_ANITYA_PACKAGE_NAME_MAPPINGS) - CREW_ANITYA_PACKAGE_NAME_MAPPINGS = Set[ - { pkg_name: 'asdf', anitya_pkg: 'asdf-vm', comments: '' }, - { pkg_name: 'cf', anitya_pkg: 'cf', comments: 'Prefer to GitHub' }, - { pkg_name: 'cups', anitya_pkg: 'cups', comments: 'Prefer to GitHub' }, - { pkg_name: 'cvs', anitya_pkg: 'cvs-stable', comments: '' }, - { pkg_name: 'doxygen', anitya_pkg: 'doxygen', comments: '' }, - { pkg_name: 'gnu_time', anitya_pkg: 'time', comments: '' }, - { pkg_name: 'go_tools', anitya_pkg: 'golang-x-tools', comments: '' }, - { pkg_name: 'gtk4', anitya_pkg: 'gtk', comments: '' }, - { pkg_name: 'gvim', anitya_pkg: 'vim', comments: '' }, - { pkg_name: 'libgedit_amtk', anitya_pkg: 'libgedit-amtk', comments: 'Prefer to GitHub' }, - { pkg_name: 'libgedit_gtksourceview', anitya_pkg: 'libgedit-gtksourceview', comments: 'Prefer to GitHub' }, - { pkg_name: 'libnghttp3', anitya_pkg: 'nghttp3', comments: '' }, - { pkg_name: 'libngtcp2', anitya_pkg: 'ngtcp2', comments: '' }, - { pkg_name: 'libssp', anitya_pkg: 'gcc', comments: '' }, - { pkg_name: 'libunbound', anitya_pkg: 'unbound', comments: '' }, - { pkg_name: 'linux_pam', anitya_pkg: 'pam', comments: '' }, - { pkg_name: 'mold', anitya_pkg: 'mold', comments: 'Prefer to GitHub' }, - { pkg_name: 'nnn', anitya_pkg: 'nnn', comments: 'Prefer to GitHub' }, - { pkg_name: 'openssl', anitya_pkg: 'openssl', comments: 'Prefer to GitHub' }, - { pkg_name: 'pcre2', anitya_pkg: 'pcre2', comments: 'Prefer to GitHub' }, - { pkg_name: 'pkg_7_zip', anitya_pkg: '7zip~stable', comments: 'Prefer to GitHub' }, - { pkg_name: 'py3_atspi', anitya_pkg: 'pyatspi', comments: '' }, - { pkg_name: 'python3', anitya_pkg: 'python', comments: '' }, - { pkg_name: 'rdfind', anitya_pkg: 'rdfind', comments: 'Prefer to GitHub' }, - { pkg_name: 'signal_desktop', anitya_pkg: 'signal', comments: '' }, - { pkg_name: 'tepl_6', anitya_pkg: 'libgedit-tepl', comments: '' }, - { pkg_name: 'upx', anitya_pkg: 'upx', comments: 'Prefer to GitHub' }, - { pkg_name: 'vim_runtime', anitya_pkg: 'vim', comments: '' }, - { pkg_name: 'webkitgtk_6', anitya_pkg: 'webkitgtk~stable', comments: '' }, - { pkg_name: 'xauth', anitya_pkg: 'xorg-x11-xauth', comments: '' }, - { pkg_name: 'yad', anitya_pkg: 'yad', comments: 'Prefer to GitHub' }, - { pkg_name: 'zimg', anitya_pkg: 'zimg', comments: 'Prefer to GitHub' }, - { pkg_name: 'zoneinfo', anitya_pkg: 'tzdata', comments: '' } - ].to_h { |h| [h[:pkg_name], h[:anitya_pkg]] } -end - # If CREW_DISABLE_MVDIR environment variable exists and is equal to 1 use rsync/tar to install files in lieu of crew-mvdir. CREW_DISABLE_MVDIR ||= ENV.fetch('CREW_DISABLE_MVDIR', false) unless defined?(CREW_DISABLE_MVDIR) @@ -388,16 +336,77 @@ PY3_BUILD_OPTIONS ||= '--wheel --no-isolation' PY3_INSTALLER_OPTIONS ||= "--destdir=#{CREW_DEST_DIR} --compile-bytecode 2 dist/*.whl" PY3_PIP_RETRIES ||= ENV.fetch('PY3_PIP_RETRIES', '5') unless defined?(PY3_PIP_RETRIES) -CREW_GCC_VER ||= Kernel.system('which gcc', %i[out err] => File::NULL) ? "gcc#{`gcc -dumpversion`.chomp}" : 'gcc15' unless defined?(CREW_GCC_VER) -CREW_ICU_VER ||= Kernel.system('which uconv', %i[out err] => File::NULL) ? "icu#{`uconv --version`.chomp.split[3]}" : 'icu77.1' unless defined?(CREW_ICU_VER) -CREW_LLVM_VER ||= Kernel.system('which llvm-config', %i[out err] => File::NULL) ? "llvm#{`llvm-config --version`.chomp.split('.')[0]}" : 'llvm21' unless defined?(CREW_LLVM_VER) -CREW_PERL_VER ||= Kernel.system('which perl', %i[out err] => File::NULL) ? "perl#{`perl --version|xargs|cut -d\\( -f2|cut -d\\) -f1|cut -dv -f2`.chomp.sub(/\.\d+$/, '')}" : 'perl5.42' unless defined?(CREW_PERL_VER) -CREW_PY_VER ||= Kernel.system("#{CREW_PREFIX}/bin/python3 --version", %i[out err] => File::NULL) ? "py#{`python3 -c "print('.'.join(__import__('platform').python_version_tuple()[:2]))"`.chomp}" : 'py3.13' unless defined?(CREW_PY_VER) +# Defaults for the current versions used in version checking, in case +# we are checking versions from outside Chromebrew, such as in CI. +crew_gcc_ver_default = '15' +crew_icu_ver_default = '77.1' +crew_llvm_ver_default = '21' +crew_perl_ver_default = '5.42' +crew_py_ver_default = '3.13' +CREW_GCC_VER ||= Kernel.system('which gcc', %i[out err] => File::NULL) ? "gcc#{`gcc -dumpversion`.chomp}" : "gcc#{crew_gcc_ver_default}" unless defined?(CREW_GCC_VER) +CREW_ICU_VER ||= Kernel.system('which uconv', %i[out err] => File::NULL) ? "icu#{`uconv --version`.chomp.split[3]}" : "icu#{crew_icu_ver_default}" unless defined?(CREW_ICU_VER) +CREW_LLVM_VER ||= Kernel.system('which llvm-config', %i[out err] => File::NULL) ? "llvm#{`llvm-config --version`.chomp.split('.')[0]}" : "llvm#{crew_llvm_ver_default}" unless defined?(CREW_LLVM_VER) +CREW_PERL_VER ||= Kernel.system('which perl', %i[out err] => File::NULL) ? "perl#{`perl --version|xargs|cut -d\\( -f2|cut -d\\) -f1|cut -dv -f2`.chomp.sub(/\.\d+$/, '')}" : "perl#{crew_perl_ver_default}" unless defined?(CREW_PERL_VER) +CREW_PY_VER ||= Kernel.system("#{CREW_PREFIX}/bin/python3 --version", %i[out err] => File::NULL) ? "py#{`python3 -c "print('.'.join(__import__('platform').python_version_tuple()[:2]))"`.chomp}" : "py#{crew_py_ver_default}" unless defined?(CREW_PY_VER) CREW_RUBY_VER ||= "ruby#{RUBY_VERSION.slice(/(?:.*(?=\.))/)}" unless defined?(CREW_RUBY_VER) @buildsystems = ['Package'] Dir.glob("#{CREW_LIB_PATH}/lib/buildsystems/*.rb") { |file| @buildsystems << File.foreach(file, encoding: Encoding::UTF_8).grep(/^class/).to_s.split[1] } CREW_VALID_BUILDSYSTEMS ||= @buildsystems.sort! +# Some packges need manual adjustments of URLS for different versions. +unless defined?(CREW_UPDATER_EXCLUDED_PKGS) + CREW_UPDATER_EXCLUDED_PKGS = Set[ + { pkg_name: 'glibc', comments: 'Requires manual update.' }, + { pkg_name: 'pkg_config', comments: 'Upstream is abandoned.' }, + { pkg_name: 'linuxheaders', comments: 'Requires manual update.' }, + { pkg_name: 'py3_ldapdomaindump', comments: 'Build is broken.' }, + { pkg_name: 'ruby', comments: 'i686 needs building with GCC 14.' }, + { pkg_name: 'xdg_base', comments: 'Internal Chromebrew Package.' } + ].to_h { |h| [h[:pkg_name], h[:comments]] } +end +CREW_AUTOMATIC_VERSION_UPDATE_EXCLUSION_REGEX = "(#{CREW_UPDATER_EXCLUDED_PKGS.keys.map { |p| "^#{p}$" }.join('|')})" unless defined?(CREW_AUTOMATIC_VERSION_UPDATE_EXCLUSION_REGEX) + +# Some packages have different names in anitya. +unless defined?(CREW_ANITYA_PACKAGE_NAME_MAPPINGS) + CREW_ANITYA_PACKAGE_NAME_MAPPINGS = Set[ + { pkg_name: 'asdf', anitya_pkg: 'asdf-vm', comments: '' }, + { pkg_name: 'cf', anitya_pkg: 'cf', comments: 'Prefer to GitHub' }, + { pkg_name: 'cups', anitya_pkg: 'cups', comments: 'Prefer to GitHub' }, + { pkg_name: 'cvs', anitya_pkg: 'cvs-stable', comments: '' }, + { pkg_name: 'doxygen', anitya_pkg: 'doxygen', comments: '' }, + { pkg_name: 'gcc_build', anitya_pkg: 'gcc', comments: '' }, + { pkg_name: 'gnu_time', anitya_pkg: 'time', comments: '' }, + { pkg_name: 'go_tools', anitya_pkg: 'golang-x-tools', comments: '' }, + { pkg_name: 'gtk4', anitya_pkg: 'gtk', comments: '' }, + { pkg_name: 'gvim', anitya_pkg: 'vim', comments: '' }, + { pkg_name: 'libgedit_amtk', anitya_pkg: 'libgedit-amtk', comments: 'Prefer to GitHub' }, + { pkg_name: 'libgedit_gtksourceview', anitya_pkg: 'libgedit-gtksourceview', comments: 'Prefer to GitHub' }, + { pkg_name: 'libnghttp3', anitya_pkg: 'nghttp3', comments: '' }, + { pkg_name: 'libngtcp2', anitya_pkg: 'ngtcp2', comments: '' }, + { pkg_name: 'libssp', anitya_pkg: 'gcc', comments: '' }, + { pkg_name: 'libunbound', anitya_pkg: 'unbound', comments: '' }, + { pkg_name: 'linux_pam', anitya_pkg: 'pam', comments: '' }, + { pkg_name: "llvm#{crew_llvm_ver_default}_build", anitya_pkg: 'llvm', comments: '' }, + { pkg_name: 'mold', anitya_pkg: 'mold', comments: 'Prefer to GitHub' }, + { pkg_name: 'nnn', anitya_pkg: 'nnn', comments: 'Prefer to GitHub' }, + { pkg_name: 'openssl', anitya_pkg: 'openssl', comments: 'Prefer to GitHub' }, + { pkg_name: 'pcre2', anitya_pkg: 'pcre2', comments: 'Prefer to GitHub' }, + { pkg_name: 'pkg_7_zip', anitya_pkg: '7zip~stable', comments: 'Prefer to GitHub' }, + { pkg_name: 'py3_atspi', anitya_pkg: 'pyatspi', comments: '' }, + { pkg_name: 'python3', anitya_pkg: 'python', comments: '' }, + { pkg_name: 'rdfind', anitya_pkg: 'rdfind', comments: 'Prefer to GitHub' }, + { pkg_name: 'signal_desktop', anitya_pkg: 'signal', comments: '' }, + { pkg_name: 'tepl_6', anitya_pkg: 'libgedit-tepl', comments: '' }, + { pkg_name: 'upx', anitya_pkg: 'upx', comments: 'Prefer to GitHub' }, + { pkg_name: 'vim_runtime', anitya_pkg: 'vim', comments: '' }, + { pkg_name: 'webkitgtk_6', anitya_pkg: 'webkitgtk~stable', comments: '' }, + { pkg_name: 'xauth', anitya_pkg: 'xorg-x11-xauth', comments: '' }, + { pkg_name: 'yad', anitya_pkg: 'yad', comments: 'Prefer to GitHub' }, + { pkg_name: 'zimg', anitya_pkg: 'zimg', comments: 'Prefer to GitHub' }, + { pkg_name: 'zoneinfo', anitya_pkg: 'tzdata', comments: '' } + ].to_h { |h| [h[:pkg_name], h[:anitya_pkg]] } +end + CREW_LICENSE ||= <<~LICENSESTRING Copyright (C) 2013-2025 Chromebrew Authors diff --git a/tools/version.rb b/tools/version.rb index b071d6d21..b51434445 100755 --- a/tools/version.rb +++ b/tools/version.rb @@ -1,5 +1,5 @@ #!/usr/bin/env ruby -# version.rb version 2.9 (for Chromebrew) +# version.rb version 3.0 (for Chromebrew) OPTIONS = %w[-h --help -j --json -u --update-package-files -v --verbose] @@ -48,9 +48,30 @@ versions_updated = {} versions = [] def get_version(name, homepage, source) - # Determine if the source is a GitHub repository, but skip if there - # is an anitya name mapping. - unless source.nil? || %w[Pip].include?(@pkg.superclass.to_s) || CREW_ANITYA_PACKAGE_NAME_MAPPINGS.keys.find_index { |i| i == name } + anitya_name_mapping_idx = CREW_ANITYA_PACKAGE_NAME_MAPPINGS.keys.find_index { |i| i == name } + anitya_name = name.gsub(/\Apy\d_|\Aperl_|\Aruby_/, '').tr('_', '-') + anitya_name = CREW_ANITYA_PACKAGE_NAME_MAPPINGS.values[anitya_name_mapping_idx] unless anitya_name_mapping_idx.nil? + anitya_id = get_anitya_id(anitya_name, homepage) + puts "anitya_name: #{anitya_name} anitya_id: #{anitya_id}" if VERBOSE + if anitya_id&.nonzero? + # Get the latest stable version of the package from anitya. + json = JSON.parse(Net::HTTP.get(URI("https://release-monitoring.org/api/v2/versions/?project_id=#{anitya_id}"))) + return if json['stable_versions'].nil? + return json['stable_versions'][0] + elsif source.nil? || %w[Pip].include?(@pkg.superclass.to_s) + return + else + # If anitya has failed, check if the source is a GitHub repository + # as a fallback. + # Note that we only check releases on GitHub since semantic + # version ordering isn't easy to get from tags. + # You can get the last numeric tag using: + # git -c 'versionsort.suffix=-' \ + # ls-remote --exit-code --refs --sort='version:refname' --tags https://github.com/#{repo} '*.*.*' \ + # | tail --lines=1 \ + # | cut --delimiter='/' --fields=3 + # However, since that does miss text tags, better to just use + # anitya first. if source.is_a?(Hash) source_arch = (@pkg.source_url.keys.map &:to_s).first source = @pkg.source_url[source_arch.to_sym] @@ -62,15 +83,6 @@ def get_version(name, homepage, source) unless url_parts.count < 3 repo = "#{url_parts[1]}/#{url_parts[2].gsub(/.git\z/, '')}" puts "GitHub Repo is #{repo}" if VERBOSE - # Note that we only check releases on GitHub since semantic - # version ordering isn't easy to get from tags. - # You can get the last numeric tag using: - # git -c 'versionsort.suffix=-' \ - # ls-remote --exit-code --refs --sort='version:refname' --tags https://github.com/#{repo} '*.*.*' \ - # | tail --lines=1 \ - # | cut --delimiter='/' --fields=3 - # However, since that does miss text tags, better to just punt - # to ANITYA if releases do not exist. if File.which('gh') # This allows us to only get non-pre-release versions from # GitHub if such releases exist. @@ -82,17 +94,6 @@ def get_version(name, homepage, source) end end end - anitya_name_mapping_idx = CREW_ANITYA_PACKAGE_NAME_MAPPINGS.keys.find_index { |i| i == name } - anitya_name = name.gsub(/\Apy\d_|\Aperl_|\Aruby_/, '').tr('_', '-') - anitya_name = CREW_ANITYA_PACKAGE_NAME_MAPPINGS.values[anitya_name_mapping_idx] unless anitya_name_mapping_idx.nil? - anitya_id = get_anitya_id(anitya_name, homepage) - puts "anitya_name: #{anitya_name} anitya_id: #{anitya_id}" if VERBOSE - # If we weren't able to get an Anitya ID, return early here to save time and headaches - return if anitya_id.nil? - # Get the latest stable version of the package - json = JSON.parse(Net::HTTP.get(URI("https://release-monitoring.org/api/v2/versions/?project_id=#{anitya_id}"))) - return if json['stable_versions'].nil? - return json['stable_versions'][0] end def get_anitya_id(name, homepage)