commit:     b24a484ab190af9c9b96b9ef01837aded845fb54
Author:     Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Mon Nov 18 01:32:38 2019 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Mon Nov 18 01:41:27 2019 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=b24a484a

dblink: add quickpkg method

Bug: https://bugs.gentoo.org/699986
Signed-off-by: Zac Medico <zmedico <AT> gentoo.org>

 bin/quickpkg                 | 34 ++++--------------------------
 lib/portage/dbapi/vartree.py | 50 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 54 insertions(+), 30 deletions(-)

diff --git a/bin/quickpkg b/bin/quickpkg
index c28a3e382..df8c1a8e8 100755
--- a/bin/quickpkg
+++ b/bin/quickpkg
@@ -10,7 +10,6 @@ import math
 import signal
 import subprocess
 import sys
-import tarfile
 
 from os import path as osp
 if osp.isfile(osp.join(osp.dirname(osp.dirname(osp.realpath(__file__))), 
".portage_not_installed")):
@@ -23,10 +22,8 @@ from portage.dbapi.dep_expand import dep_expand
 from portage.dep import Atom, use_reduce
 from portage.exception import (AmbiguousPackageName, InvalidAtom, InvalidData,
        InvalidDependString, PackageSetNotFound, PermissionDenied)
-from portage.util import ConfigProtect, ensure_dirs, shlex_split, varexpand, 
_xattr
+from portage.util import ensure_dirs, shlex_split, varexpand, _xattr
 xattr = _xattr.xattr
-from portage.dbapi.vartree import dblink, tar_contents
-from portage.checksum import perform_md5
 from portage._sets import load_default_config, SETPREFIX
 from portage.process import find_binary
 from portage.util.compression_probe import _compressors
@@ -35,13 +32,11 @@ from portage.util._eventloop.global_event_loop import 
global_event_loop
 
 def quickpkg_atom(options, infos, arg, eout):
        settings = portage.settings
-       root = portage.settings['ROOT']
        eroot = portage.settings['EROOT']
        trees = portage.db[eroot]
        vartree = trees["vartree"]
        vardb = vartree.dbapi
        bintree = trees["bintree"]
-       xattrs = 'xattr' in settings.features
 
        include_config = options.include_config == "y"
        include_unmodified_config = options.include_unmodified_config == "y"
@@ -104,26 +99,6 @@ def quickpkg_atom(options, infos, arg, eout):
                                eout.ewarn("%s: it might not be legal to 
redistribute this." % cpv)
                        eout.ebegin("Building package for %s" % cpv)
                        pkgs_for_arg += 1
-                       contents = dblnk.getcontents()
-                       protect = None
-                       if not include_config:
-                               confprot = ConfigProtect(eroot,
-                                       
shlex_split(settings.get("CONFIG_PROTECT", "")),
-                                       
shlex_split(settings.get("CONFIG_PROTECT_MASK", "")),
-                                       case_insensitive=("case-insensitive-fs"
-                                       in settings.features))
-                               def protect(filename):
-                                       if not confprot.isprotected(filename):
-                                               return False
-                                       if include_unmodified_config:
-                                               file_data = contents[filename]
-                                               if file_data[0] == "obj":
-                                                       orig_md5 = 
file_data[2].lower()
-                                                       cur_md5 = 
perform_md5(filename, calc_prelink=1)
-                                                       if orig_md5 == cur_md5:
-                                                               return False
-                                       excluded_config_files.append(filename)
-                                       return True
                        existing_metadata = dict(zip(fix_metadata_keys,
                                vardb.aux_get(cpv, fix_metadata_keys)))
                        category, pf = portage.catsplit(cpv)
@@ -167,10 +142,9 @@ def quickpkg_atom(options, infos, arg, eout):
                        cmd = [x for x in cmd if x != ""]
                        with open(binpkg_tmpfile, "wb") as fobj:
                                proc = subprocess.Popen(cmd, 
stdin=subprocess.PIPE, stdout=fobj)
-                               # The tarfile module will write pax headers 
holding the
-                               # xattrs only if PAX_FORMAT is specified here.
-                               with 
tarfile.open(mode="w|",format=tarfile.PAX_FORMAT if xattrs else 
tarfile.DEFAULT_FORMAT, fileobj=proc.stdin) as tar:
-                                       tar_contents(contents, root, tar, 
protect=protect, xattrs=xattrs)
+                               excluded_config_files = 
dblnk.quickpkg(proc.stdin,
+                                       include_config=include_config,
+                                       
include_unmodified_config=include_unmodified_config)
                                proc.stdin.close()
                                if proc.wait() != os.EX_OK:
                                        eout.eend(1)

diff --git a/lib/portage/dbapi/vartree.py b/lib/portage/dbapi/vartree.py
index fa1e1523c..603d58015 100644
--- a/lib/portage/dbapi/vartree.py
+++ b/lib/portage/dbapi/vartree.py
@@ -1883,6 +1883,56 @@ class dblink(object):
                self.contentscache = pkgfiles
                return pkgfiles
 
+       def quickpkg(self, output_file, include_config=False, 
include_unmodified_config=False):
+               """
+               Create a tar file appropriate for use by quickpkg.
+
+               @param output_file: Write binary tar stream to file.
+               @type output_file: file
+               @param include_config: Include all files protected by 
CONFIG_PROTECT
+                       (as a security precaution, default is False).
+               @type include_config: bool
+               @param include_config: Include files protected by 
CONFIG_PROTECT that
+                       have not been modified since installation (as a 
security precaution,
+                       default is False).
+               @type include_config: bool
+               @rtype: list
+               @return: Paths of protected configuration files which have been 
omitted.
+               """
+               settings = self.settings
+               cpv = self.mycpv
+               xattrs = 'xattr' in settings.features
+               contents = self.getcontents()
+               excluded_config_files = []
+               protect = None
+
+               if not include_config:
+                       confprot = ConfigProtect(settings['EROOT'],
+                               
portage.util.shlex_split(settings.get('CONFIG_PROTECT', '')),
+                               
portage.util.shlex_split(settings.get('CONFIG_PROTECT_MASK', '')),
+                               case_insensitive=('case-insensitive-fs' in 
settings.features))
+
+                       def protect(filename):
+                               if not confprot.isprotected(filename):
+                                       return False
+                               if include_unmodified_config:
+                                       file_data = contents[filename]
+                                       if file_data[0] == 'obj':
+                                               orig_md5 = file_data[2].lower()
+                                               cur_md5 = perform_md5(filename, 
calc_prelink=1)
+                                               if orig_md5 == cur_md5:
+                                                       return False
+                               excluded_config_files.append(filename)
+                               return True
+
+               # The tarfile module will write pax headers holding the
+               # xattrs only if PAX_FORMAT is specified here.
+               with tarfile.open(fileobj=output_file, mode='w|',
+                       format=tarfile.PAX_FORMAT if xattrs else 
tarfile.DEFAULT_FORMAT) as tar:
+                       tar_contents(contents, settings['ROOT'], tar, 
protect=protect, xattrs=xattrs)
+
+               return excluded_config_files
+
        def _prune_plib_registry(self, unmerge=False,
                needed=None, preserve_paths=None):
                # remove preserved libraries that don't have any consumers left

Reply via email to