From 01fd3354ea2c9a1e49a02fef3f17ec7be59aafba Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Mon, 10 Apr 2006 03:37:11 +0000 Subject: Remove db and mysettings from Manifest and replace them with a mapping object that provides access to fetch lists for each cpv. svn path=/main/trunk/; revision=3111 --- bin/repoman | 5 +++-- pym/portage.py | 26 +++++++++++++++++++++++--- pym/portage_manifest.py | 11 +++++------ 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/bin/repoman b/bin/repoman index ac5166027..d502d8589 100755 --- a/bin/repoman +++ b/bin/repoman @@ -795,8 +795,9 @@ for x in scanlist: fails["CVS/Entries.IO_error"].append(checkdir+"/files/CVS/Entries") continue - mf = Manifest(checkdir, db=portage.db["/"]["porttree"].dbapi, - mysettings=repoman_settings, repoman_settings["DISTDIR"]) + mf = Manifest(checkdir, + portage.FetchlistDict(checkdir, repoman_settings), + repoman_settings["DISTDIR"]) mydigests=mf.getTypeDigests("DIST") myfiles_all = [] diff --git a/pym/portage.py b/pym/portage.py index 727b99ae5..b4cbf607f 100644 --- a/pym/portage.py +++ b/pym/portage.py @@ -30,6 +30,7 @@ try: import commands from time import sleep from random import shuffle + import UserDict except ImportError, e: sys.stderr.write("\n\n") sys.stderr.write("!!! Failed to complete python imports. These are internal modules for\n") @@ -2073,7 +2074,7 @@ def digestgen(myarchives,mysettings,db=None,overwrite=1,manifestonly=0): db = portagetree().dbapi global settings - mf = Manifest(mysettings["O"], db, mysettings, mysettings["DISTDIR"]) + mf = Manifest(mysettings["O"], FetchlistDict(mysettings["O"], mysettings), mysettings["DISTDIR"]) mf.create(assumeDistfileHashes=True) for f in myarchives: # the whole type evaluation is only for the case that myarchives isn't a @@ -2111,7 +2112,7 @@ def digestParseFile(myfilename,mysettings=None,db=None): if mysettings is None: mysettings = config(clone=settings) - mf = Manifest(pkgdir, db, mysettings, mysettings["DISTDIR"]) + mf = Manifest(pkgdir, FetchlistDict(pkgdir, mysettings), mysettings["DISTDIR"]) return mf.getDigests() @@ -2165,7 +2166,7 @@ def digestcheck(myfiles, mysettings, strict=0, justmanifest=0, db=None): pkgdir = mysettings["O"] if db is None: db = portagetree().dbapi - mf = Manifest(pkgdir, db, mysettings, mysettings["DISTDIR"]) + mf = Manifest(pkgdir, FetchlistDict(pkgdir, mysettings), mysettings["DISTDIR"]) try: if strict: print ">>> checking ebuild checksums", @@ -6342,6 +6343,25 @@ class dblink: "Is this a regular package (does it have a CATEGORY file? A dblink can be virtual *and* regular)" return os.path.exists(self.dbdir+"/CATEGORY") +class FetchlistDict(UserDict.DictMixin): + def __init__(self, pkgdir, settings): + self.pkgdir = pkgdir + self.cp = os.sep.join(pkgdir.split(os.sep)[-2:]) + self.settings = settings + self.db = portagetree().dbapi + porttree = os.path.dirname(os.path.dirname(pkgdir)) + porttree_key = os.path.normpath(os.path.realpath(porttree)).strip(os.sep) + # This ensures that the fetchlist comes from the correct portage tree. + for t in self.db.porttrees: + if os.path.normpath(os.path.realpath(t)).strip(os.sep) != porttree_key: + self.db.porttrees.remove(t) + def __getitem__(self, pkg_key): + return self.db.getfetchlist(pkg_key, mysettings=self.settings, all=True)[1] + def has_key(self, pkg_key): + return self.db.cpv_exists(pkg_key) + def keys(self): + return self.db.cp_list(self.cp) + def cleanup_pkgmerge(mypkg,origdir): shutil.rmtree(settings["PORTAGE_TMPDIR"]+"/binpkgs/"+mypkg) if os.path.exists(settings["PORTAGE_TMPDIR"]+"/portage/"+mypkg+"/temp/environment"): diff --git a/pym/portage_manifest.py b/pym/portage_manifest.py index fff9983aa..df9c3d4a4 100644 --- a/pym/portage_manifest.py +++ b/pym/portage_manifest.py @@ -26,8 +26,8 @@ def manifest2MiscfileFilter(filename): return not (filename in ["CVS", ".svn", "files", "Manifest"] or filename.endswith(".ebuild")) class Manifest(object): - def __init__(self, pkgdir, db, mysettings, distdir, manifest1_compat=True, from_scratch=False): - """ create new Manifest instance for package in pkgdir, using db and mysettings for metadata lookups, + def __init__(self, pkgdir, fetchlist_dict, distdir, manifest1_compat=True, from_scratch=False): + """ create new Manifest instance for package in pkgdir and add compability entries for old portage versions if manifest1_compat == True. Do not parse Manifest file if from_scratch == True (only for internal use) """ self.pkgdir = pkgdir.rstrip(os.sep) + os.sep @@ -42,8 +42,7 @@ class Manifest(object): if not from_scratch: self._read() self.compat = manifest1_compat - self.db = db - self.mysettings = mysettings + self.fetchlist_dict = fetchlist_dict self.distdir = distdir def guessType(self, filename): @@ -286,7 +285,7 @@ class Manifest(object): distfilehashes = self.fhashdict["DIST"] else: distfilehashes = {} - self.__init__(self.pkgdir, self.db, self.mysettings, self.distdir, from_scratch=True) + self.__init__(self.pkgdir, self.fetchlist_dict, self.distdir, from_scratch=True) for pkgdir, pkgdir_dirs, pkgdir_files in os.walk(self.pkgdir): break for f in pkgdir_files: @@ -364,7 +363,7 @@ class Manifest(object): def _getCpvDistfiles(self, cpv): """ Get a list of all DIST files associated to the given cpv """ - return self.db.getfetchlist(cpv, mysettings=self.mysettings, all=True)[1] + return self.fetchlist_dict[cpv] def updateFileHashes(self, ftype, fname, checkExisting=True, ignoreMissing=True, reuseExisting=False): """ Regenerate hashes for the given file """ -- cgit v1.2.3-1-g7c22