diff options
-rw-r--r-- | pym/portage/dbapi/vartree.py | 30 |
1 files changed, 19 insertions, 11 deletions
diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py index d931c5ddf..cb2fe28ba 100644 --- a/pym/portage/dbapi/vartree.py +++ b/pym/portage/dbapi/vartree.py @@ -632,7 +632,7 @@ class vardbapi(dbapi): mydir_mtime = long(mydir_stat.st_mtime) pkg_data = self._aux_cache["packages"].get(mycpv) pull_me = cache_these.union(wants) - mydata = {} + mydata = {"_mtime_" : mydir_mtime} cache_valid = False cache_incomplete = False cache_mtime = None @@ -656,7 +656,8 @@ class vardbapi(dbapi): if pull_me: # pull any needed data and cache it aux_keys = list(pull_me) - for k, v in izip(aux_keys, self._aux_get(mycpv, aux_keys)): + for k, v in izip(aux_keys, + self._aux_get(mycpv, aux_keys, st=mydir_stat)): mydata[k] = v if not cache_valid or cache_these.difference(metadata): cache_data = {} @@ -668,18 +669,25 @@ class vardbapi(dbapi): self._aux_cache["modified"].add(mycpv) return [mydata[x] for x in wants] - def _aux_get(self, mycpv, wants): + def _aux_get(self, mycpv, wants, st=None): mydir = self.getpath(mycpv) - try: - if not stat.S_ISDIR(os.stat(mydir).st_mode): - raise KeyError(mycpv) - except OSError, e: - if e.errno == errno.ENOENT: - raise KeyError(mycpv) - del e - raise + if st is None: + try: + st = os.stat(mydir) + except OSError, e: + if e.errno == errno.ENOENT: + raise KeyError(mycpv) + elif e.errno == PermissionDenied.errno: + raise PermissionDenied(mydir) + else: + raise + if not stat.S_ISDIR(st.st_mode): + raise KeyError(mycpv) results = [] for x in wants: + if x == "_mtime_": + results.append(st.st_mtime) + continue try: myf = open(os.path.join(mydir, x), "r") try: |