mirror of
https://github.com/chromebrew/chromebrew.git
synced 2026-01-08 23:18:10 -05:00
version check: use anitya by default, enable default versions from const.rb in version checks. (#12912)
* version check: use anitya by default, enable default versions from const.rb in version checks. Signed-off-by: Satadru Pramanik <satadru@gmail.com> * Make logic easier to follow. Signed-off-by: Satadru Pramanik <satadru@gmail.com> * Cleanup logic further. Signed-off-by: Satadru Pramanik <satadru@gmail.com> --------- Signed-off-by: Satadru Pramanik <satadru@gmail.com> Co-authored-by: Satadru Pramanik <satadru@gmail.com>
This commit is contained in:
committed by
GitHub
parent
248a0b8d42
commit
4784962fd7
125
lib/const.rb
125
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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user