| From 35cc856ee0ce03858a39210525b9893ca061f079 Mon Sep 17 00:00:00 2001 |
| From: Mike Frysinger <vapier@gentoo.org> |
| Date: Wed, 19 Dec 2012 18:50:17 -0500 |
| Subject: [PATCH] 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 <vapier@gentoo.org> |
| Signed-off-by: Paul Varner <fuzzyray@gentoo.org> |
| --- |
| pym/gentoolkit/equery/check.py | 17 +++++++++-------- |
| pym/gentoolkit/package.py | 35 ++++++++++++++++++++++------------- |
| 2 files changed, 31 insertions(+), 21 deletions(-) |
| |
| 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 f in self.parsed_contents(): |
| + for f in self.parsed_contents(prefix_root=True): |
| try: |
| st = os.lstat(path) |
| except OSError: |
| -- |
| 1.8.1.2 |
| |