From 35cc856ee0ce03858a39210525b9893ca061f079 Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Wed, 19 Dec 2012 18:50:17 -0500 Subject: equery: make more ROOT aware This at least fixes: belongs check depends files list size URL: https://bugs.gentoo.org/160815 Signed-off-by: Mike Frysinger Signed-off-by: Paul Varner --- pym/gentoolkit/equery/check.py | 17 +++++++++-------- pym/gentoolkit/package.py | 35 ++++++++++++++++++++++------------- 2 files changed, 31 insertions(+), 21 deletions(-) (limited to 'pym') diff --git a/pym/gentoolkit/equery/check.py b/pym/gentoolkit/equery/check.py index 84be634..e903355 100644 --- a/pym/gentoolkit/equery/check.py +++ b/pym/gentoolkit/equery/check.py @@ -105,26 +105,27 @@ class VerifyContents(object): for cfile in files: n_checked += 1 ftype = files[cfile][0] - if not os.path.exists(cfile): + real_cfile = os.environ.get('ROOT', '') + cfile + if not os.path.exists(real_cfile): errs.append("%s does not exist" % cfile) continue elif ftype == "dir": - if not os.path.isdir(cfile): + if not os.path.isdir(real_cfile): err = "%(cfile)s exists, but is not a directory" errs.append(err % locals()) continue elif ftype == "obj": - obj_errs = self._verify_obj(files, cfile, errs) + obj_errs = self._verify_obj(files, cfile, real_cfile, errs) if len(obj_errs) > len(errs): errs = obj_errs[:] continue elif ftype == "sym": target = files[cfile][2].strip() - if not os.path.islink(cfile): + if not os.path.islink(real_cfile): err = "%(cfile)s exists, but is not a symlink" errs.append(err % locals()) continue - tgt = os.readlink(cfile) + tgt = os.readlink(real_cfile) if tgt != target: err = "%(cfile)s does not point to %(target)s" errs.append(err % locals()) @@ -137,14 +138,14 @@ class VerifyContents(object): return n_passed, n_checked, errs - def _verify_obj(self, files, cfile, errs): + def _verify_obj(self, files, cfile, real_cfile, errs): """Verify the MD5 sum and/or mtime and return any errors.""" obj_errs = errs[:] if self.check_sums: md5sum = files[cfile][2] try: - cur_checksum = checksum.perform_md5(cfile, calc_prelink=1) + cur_checksum = checksum.perform_md5(real_cfile, calc_prelink=1) except IOError: err = "Insufficient permissions to read %(cfile)s" obj_errs.append(err % locals()) @@ -155,7 +156,7 @@ class VerifyContents(object): return obj_errs if self.check_timestamps: mtime = int(files[cfile][1]) - st_mtime = int(os.lstat(cfile).st_mtime) + st_mtime = int(os.lstat(real_cfile).st_mtime) if st_mtime != mtime: err = ( "%(cfile)s has wrong mtime (is %(st_mtime)d, should be " diff --git a/pym/gentoolkit/package.py b/pym/gentoolkit/package.py index e324399..2a103de 100644 --- a/pym/gentoolkit/package.py +++ b/pym/gentoolkit/package.py @@ -58,16 +58,14 @@ from gentoolkit.eprefix import EPREFIX # Settings # ======= -if EPREFIX: - default_settings = portage.config(local_config=True, eprefix=EPREFIX) - default_settings.lock() - nolocal_settings = portage.config(local_config=False, eprefix=EPREFIX) - nolocal_settings.lock() -else: - default_settings = portage.config(local_config=True) - default_settings.lock() - nolocal_settings = portage.config(local_config=False) - nolocal_settings.lock() +def _NewPortageConfig(local_config): + ret = portage.config(local_config=local_config, + eprefix=EPREFIX if EPREFIX else None, + target_root=os.environ.get('ROOT', None)) + ret.lock() + return ret +default_settings = _NewPortageConfig(local_config=True) +nolocal_settings = _NewPortageConfig(local_config=False) # ======= # Classes @@ -350,14 +348,25 @@ class Package(CPV): iuse, final_flags = get_flags(self.cpv, final_setting=True) return final_flags - def parsed_contents(self): + def parsed_contents(self, prefix_root=False): """Returns the parsed CONTENTS file. @rtype: dict @return: {'/full/path/to/obj': ['type', 'timestamp', 'md5sum'], ...} """ - return self.dblink.getcontents() + contents = self.dblink.getcontents() + + # Portage will automatically prepend ROOT. Undo that. + if not prefix_root: + myroot = self._settings["ROOT"] + if myroot != '/': + ret = {} + for key, val in self.dblink.getcontents().iteritems(): + ret['/' + os.path.relpath(key, myroot)] = val + contents = ret + + return contents def size(self): """Estimates the installed size of the contents of this package. @@ -368,7 +377,7 @@ class Package(CPV): seen = set() size = n_files = n_uncounted = 0 - for path in self.parsed_contents(): + for path in self.parsed_contents(prefix_root=True): try: st = os.lstat(path) except OSError: -- cgit v1.2.3