Make dblink invalidate the vardbapi caches for each merge and unmerge. Don't use...
authorZac Medico <zmedico@gentoo.org>
Sun, 8 Jul 2007 16:36:58 +0000 (16:36 -0000)
committerZac Medico <zmedico@gentoo.org>
Sun, 8 Jul 2007 16:36:58 +0000 (16:36 -0000)
svn path=/main/trunk/; revision=7203

pym/portage/dbapi/vartree.py

index 2df2f841f3895a9bdaf2713ef75c6374cf4634bb..03db114b14dadf7832bc29e0e4104d82075eb333 100644 (file)
@@ -342,12 +342,17 @@ class vardbapi(dbapi):
                        cpc = self.cpcache[mycp]
                        if cpc[0] == mystat:
                                return cpc[1]
-               list = listdir(self.getpath(mysplit[0]), EmptyOnError=1)
+               try:
+                       dir_list = os.listdir(self.getpath(mysplit[0]))
+               except EnvironmentError, e:
+                       from portage.exception import PermissionDenied
+                       if e.errno == PermissionDenied.errno:
+                               raise PermissionDenied(e)
+                       del e
+                       dir_list = []
 
-               if (list is None):
-                       return []
                returnme = []
-               for x in list:
+               for x in dir_list:
                        if x.startswith("."):
                                continue
                        if x[0] == '-':
@@ -892,7 +897,7 @@ class dblink(object):
                if not os.path.exists(self.dbdir):
                        return
                try:
-                       for x in listdir(self.dbdir):
+                       for x in os.listdir(self.dbdir):
                                os.unlink(self.dbdir+"/"+x)
                        os.rmdir(self.dbdir)
                except OSError, e:
@@ -904,6 +909,12 @@ class dblink(object):
                        print
                        sys.exit(1)
 
+               # Due to mtime granularity, mtime checks do not always properly
+               # invalidate vardbapi caches.
+               self.vartree.dbapi.mtdircache.pop(self.cat, None)
+               self.vartree.dbapi.matchcache.pop(self.cat, None)
+               self.vartree.dbapi.cpcache.pop(self.mysplit[0], None)
+
        def clearcontents(self):
                """
                For a given db entry (self), erase the CONTENTS values.
@@ -1792,6 +1803,11 @@ class dblink(object):
                self.dbdir = self.dbpkgdir
                self.delete()
                _movefile(self.dbtmpdir, self.dbpkgdir, mysettings=self.settings)
+               # Due to mtime granularity, mtime checks do not always properly
+               # invalidate vardbapi caches.
+               self.vartree.dbapi.mtdircache.pop(self.cat, None)
+               self.vartree.dbapi.matchcache.pop(self.cat, None)
+               self.vartree.dbapi.cpcache.pop(self.mysplit[0], None)
                contents = self.getcontents()
 
                #write out our collection of md5sums