summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pym/portage_checksum.py2
-rw-r--r--pym/portage_manifest.py46
2 files changed, 35 insertions, 13 deletions
diff --git a/pym/portage_checksum.py b/pym/portage_checksum.py
index 38a064aa2..30f221532 100644
--- a/pym/portage_checksum.py
+++ b/pym/portage_checksum.py
@@ -94,6 +94,8 @@ def verify_all(filename, mydict, calc_prelink=0, strict=0):
if mydict["size"] != mysize:
return False,("Filesize does not match recorded size", mysize, mydict["size"])
except OSError, e:
+ if e.errno == errno.ENOENT:
+ raise portage_exception.FileNotFound(filename)
return False, (str(e), None, None)
for x in mydict.keys():
if x == "size":
diff --git a/pym/portage_manifest.py b/pym/portage_manifest.py
index 073f7de56..b50d389ed 100644
--- a/pym/portage_manifest.py
+++ b/pym/portage_manifest.py
@@ -3,8 +3,9 @@
# $Header: $
import errno, os, sets
+from itertools import imap
-import portage, portage_exception, portage_versions, portage_const
+import portage_exception, portage_versions, portage_const
from portage_checksum import *
from portage_exception import *
from portage_util import write_atomic
@@ -29,7 +30,7 @@ class Manifest(object):
""" create new Manifest instance for package in pkgdir, using db and mysettings for metadata lookups,
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+os.sep
+ self.pkgdir = pkgdir.rstrip(os.sep) + os.sep
self.fhashdict = {}
self.hashes = portage_const.MANIFEST2_HASH_FUNCTIONS[:]
self.hashes.append("size")
@@ -79,9 +80,11 @@ class Manifest(object):
def _readDigests(self):
""" Parse old style digest files for this Manifest instance """
mycontent = ""
- for d in portage.listdir(os.path.join(self.pkgdir, "files"), filesonly=True, recursive=False):
+ for d in os.listdir(os.path.join(self.pkgdir, "files")):
if d.startswith("digest-"):
- mycontent += open(os.path.join(self.pkgdir, "files", d), "r").read()
+ f = open(os.path.join(self.pkgdir, "files", d), "r")
+ mycontent += f.read()
+ f.close()
return mycontent
def _read(self):
@@ -124,7 +127,7 @@ class Manifest(object):
def _writeDigests(self, force=False):
""" Create old style digest files for this Manifest instance """
- cpvlist = [os.path.join(self.pkgdir.rstrip(os.sep).split(os.sep)[-2], x[:-7]) for x in portage.listdir(self.pkgdir) if x.endswith(".ebuild")]
+ cpvlist = [os.path.join(self._pkgdir_category(), x[:-7]) for x in os.listdir(self.pkgdir) if x.endswith(".ebuild")]
rval = []
try:
os.makedirs(os.path.join(self.pkgdir, "files"))
@@ -134,7 +137,7 @@ class Manifest(object):
else:
raise
for cpv in cpvlist:
- dname = os.path.join(self.pkgdir, "files", "digest-"+portage.catsplit(cpv)[1])
+ dname = os.path.join(self.pkgdir, "files", "digest-%s" % self._catsplit(cpv)[1])
distlist = self._getCpvDistfiles(cpv)
update_digest = True
if not force:
@@ -287,7 +290,9 @@ class Manifest(object):
else:
distfilehashes = {}
self.__init__(self.pkgdir, self.db, self.mysettings, from_scratch=True)
- for f in portage.listdir(self.pkgdir, filesonly=True, recursive=False):
+ for pkgdir, pkgdir_dirs, pkgdir_files in os.walk(self.pkgdir):
+ break
+ for f in pkgdir_files:
if f.endswith(".ebuild"):
mytype = "EBUILD"
elif manifest2MiscfileFilter(f):
@@ -295,11 +300,18 @@ class Manifest(object):
else:
continue
self.fhashdict[mytype][f] = perform_multiple_checksums(self.pkgdir+f, self.hashes)
- for f in portage.listdir(self.pkgdir+"files", filesonly=True, recursive=True):
+ recursive_files = []
+ cut_len = len(os.path.join(self.pkgdir, "files") + os.sep)
+ for parentdir, dirs, files in os.walk(os.path.join(self.pkgdir, "files")):
+ for f in files:
+ full_path = os.path.join(parentdir, f)
+ recursive_files.append(full_path[cut_len:])
+ for f in recursive_files:
if not manifest2AuxfileFilter(f):
continue
- self.fhashdict["AUX"][f] = perform_multiple_checksums(self.pkgdir+"files"+os.sep+f, self.hashes)
- cpvlist = [os.path.join(self.pkgdir.rstrip(os.sep).split(os.sep)[-2], x[:-7]) for x in portage.listdir(self.pkgdir) if x.endswith(".ebuild")]
+ self.fhashdict["AUX"][f] = perform_multiple_checksums(
+ os.path.join(self.pkgdir, "files", f.lstrip(os.sep)), self.hashes)
+ cpvlist = [os.path.join(self._pkgdir_category(), x[:-7]) for x in os.listdir(self.pkgdir) if x.endswith(".ebuild")]
distlist = []
for cpv in cpvlist:
distlist.extend(self._getCpvDistfiles(cpv))
@@ -311,7 +323,10 @@ class Manifest(object):
self.fhashdict["DIST"][f] = distfilehashes[f]
else:
raise FileNotFound(fname)
-
+
+ def _pkgdir_category(self):
+ return self.pkgdir.rstrip(os.sep).split(os.sep)[-2]
+
def _getAbsname(self, ftype, fname):
if ftype == "DIST":
absname = os.path.join(self.distdir, fname)
@@ -343,7 +358,7 @@ class Manifest(object):
self.checkTypeHashes("AUX", ignoreMissingFiles=False)
if checkMiscfiles:
self.checkTypeHashes("MISC", ignoreMissingFiles=False)
- ebuildname = portage.catsplit(cpv)[1]+".ebuild"
+ ebuildname = "%s.ebuild" % self._catsplit(cpv)[1]
self.checkFileHashes("EBUILD", ebuildname, ignoreMissing=False)
if checkDistfiles:
if onlyDistfiles:
@@ -384,7 +399,7 @@ class Manifest(object):
files)."""
self.updateTypeHashes("AUX", ignoreMissingFiles=ignoreMissingFiles)
self.updateTypeHashes("MISC", ignoreMissingFiles=ignoreMissingFiles)
- ebuildname = portage.catsplit(cpv)[1]+".ebuild"
+ ebuildname = "%s.ebuild" % self._catsplit(cpv)[1]
self.updateFileHashes("EBUILD", ebuildname, ignoreMissingFiles=ignoreMissingFiles)
for f in self._getCpvDistfiles(cpv):
self.updateFileHashes("DIST", f, ignoreMissingFiles=ignoreMissingFiles)
@@ -423,3 +438,8 @@ class Manifest(object):
elif len(mysplit) > 4 and mysplit[0] in portage_const.MANIFEST2_IDENTIFIERS and ((len(mysplit) - 3) % 2) == 0 and not 2 in rVal:
rVal.append(2)
return rVal
+
+ def _catsplit(self, pkg_key):
+ """Split a category and package, returning a list of [cat, pkg].
+ This is compatible with portage.catsplit()"""
+ return pkg_key.split("/", 1)