This includes a _compat_upgrade.binpkg_compression script that the ebuild can call in pkg_preinst in order to maintain a backward-compatible bzip2 default when appropriate, ensuring that binary package consumers are not caught off guard.
Bug: https://bugs.gentoo.org/715108 Signed-off-by: Zac Medico <zmed...@gentoo.org> --- .travis.yml | 4 ++ cnf/make.globals | 5 ++- .../_compat_upgrade/binpkg_compression.py | 40 +++++++++++++++++++ .../tests/resolver/ResolverPlayground.py | 1 + man/make.conf.5 | 4 +- 5 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 lib/portage/_compat_upgrade/binpkg_compression.py diff --git a/.travis.yml b/.travis.yml index 9269d4034..2132c8c87 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,4 @@ +dist: bionic language: python python: - 2.7 @@ -8,6 +9,9 @@ python: - pypy3 # command to install dependencies +before_install: + # Use "dist: bionic" to get a zstd with --long support. + - sudo apt-get -y install zstd install: - pip install tox diff --git a/cnf/make.globals b/cnf/make.globals index 4a59dbe3c..dd3f28f70 100644 --- a/cnf/make.globals +++ b/cnf/make.globals @@ -34,8 +34,9 @@ RPMDIR="/var/cache/rpm" # Temporary build directory PORTAGE_TMPDIR="/var/tmp" -# The compression used for binary packages. Defaults to zstd when USE=zstd is enabled. -BINPKG_COMPRESS="bzip2" +# The compression used for binary packages. Defaults to zstd except for +# existing installs where bzip2 is used for backward compatibility. +BINPKG_COMPRESS="zstd" # Fetching command (3 tries, passive ftp for firewall compatibility) FETCHCOMMAND="wget -t 3 -T 60 --passive-ftp -O \"\${DISTDIR}/\${FILE}\" \"\${URI}\"" diff --git a/lib/portage/_compat_upgrade/binpkg_compression.py b/lib/portage/_compat_upgrade/binpkg_compression.py new file mode 100644 index 000000000..0f5704733 --- /dev/null +++ b/lib/portage/_compat_upgrade/binpkg_compression.py @@ -0,0 +1,40 @@ +# Copyright 2020 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +import re + +import portage +from portage import os +from portage.const import GLOBAL_CONFIG_PATH + +COMPAT_BINPKG_COMPRESS = 'bzip2' + + +def main(): + """ + If the current installation is still configured to use the old + default BINPKG_COMPRESS=bzip2 setting, then patch make.globals + inside ${ED} to maintain backward compatibility, ensuring that + binary package consumers are not caught off guard. This is + intended to be called from the ebuild as follows: + + pkg_preinst() { + python_setup + env -u BINPKG_COMPRESS + PYTHONPATH="${D%/}$(python_get_sitedir)${PYTHONPATH:+:${PYTHONPATH}}" \ + "${PYTHON}" -m portage._compat_upgrade.binpkg_compression || die + } + """ + if portage.settings.get('BINPKG_COMPRESS', COMPAT_BINPKG_COMPRESS) == COMPAT_BINPKG_COMPRESS: + config_path = os.path.join(os.environ['ED'], GLOBAL_CONFIG_PATH.lstrip(os.sep), 'make.globals') + with open(config_path) as f: + content = f.read() + compat_setting = 'BINPKG_COMPRESS="{}"'.format(COMPAT_BINPKG_COMPRESS) + portage.output.EOutput().einfo('Setting make.globals default {} for backward compatibility'.format(compat_setting)) + content = re.sub('^BINPKG_COMPRESS=.*$', compat_setting, content, flags=re.MULTILINE) + with open(config_path, 'wt') as f: + f.write(content) + + +if __name__ == '__main__': + main() diff --git a/lib/portage/tests/resolver/ResolverPlayground.py b/lib/portage/tests/resolver/ResolverPlayground.py index 98831e000..de80a0cc1 100644 --- a/lib/portage/tests/resolver/ResolverPlayground.py +++ b/lib/portage/tests/resolver/ResolverPlayground.py @@ -112,6 +112,7 @@ class ResolverPlayground(object): "uname", "uniq", "xargs", + "zstd", ) # Exclude internal wrappers from PATH lookup. orig_path = os.environ['PATH'] diff --git a/man/make.conf.5 b/man/make.conf.5 index f82fed65a..a3bd662ae 100644 --- a/man/make.conf.5 +++ b/man/make.conf.5 @@ -1,4 +1,4 @@ -.TH "MAKE.CONF" "5" "Nov 2019" "Portage VERSION" "Portage" +.TH "MAKE.CONF" "5" "May 2020" "Portage VERSION" "Portage" .SH "NAME" make.conf \- custom settings for Portage .SH "SYNOPSIS" @@ -115,7 +115,7 @@ This variable is used to determine the compression used for \fIbinary packages\fR. Supported settings and compression algorithms are: bzip2, gzip, lz4, lzip, lzop, xz, zstd. .br -Defaults to "bzip2". +Defaults to "zstd". .br .I Example: .nf -- 2.25.3