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


Reply via email to