commit:     5ac2a8f08101501d0416ad9d79e277c363cea85e
Author:     Kenneth Raplee <kenrap <AT> kennethraplee <DOT> com>
AuthorDate: Sat Apr  2 01:29:10 2022 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Mon Apr  4 19:04:43 2022 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=5ac2a8f0

Enhance the update hash methods for simplification

Signed-off-by: Kenneth Raplee <kenrap <AT> kennethraplee.com>
Signed-off-by: Sam James <sam <AT> gentoo.org>

 lib/portage/manifest.py | 85 +++++++++++++++++++++++++++----------------------
 1 file changed, 47 insertions(+), 38 deletions(-)

diff --git a/lib/portage/manifest.py b/lib/portage/manifest.py
index 4dca536e4..655eabf68 100644
--- a/lib/portage/manifest.py
+++ b/lib/portage/manifest.py
@@ -718,63 +718,72 @@ class Manifest:
         total_bytes = sum(int(self.fhashdict["DIST"][f]["size"]) for f in 
fetchlist)
         return total_bytes
 
-    def updateFileHashes(
-        self, ftype, fname, checkExisting=True, ignoreMissing=True, 
reuseExisting=False
+    def updateAllFileHashes(
+        self, ftype, fnames, checkExisting=True, ignoreMissing=True, 
reuseExisting=False
     ):
-        """Regenerate hashes for the given file"""
-        if checkExisting:
-            self.checkFileHashes(ftype, fname, ignoreMissing=ignoreMissing)
-        if not ignoreMissing and fname not in self.fhashdict[ftype]:
-            raise FileNotInManifestException(fname)
-        if fname not in self.fhashdict[ftype]:
-            self.fhashdict[ftype][fname] = {}
-        myhashkeys = list(self.hashes)
-        if reuseExisting:
-            for k in [h for h in self.fhashdict[ftype][fname] if h in 
myhashkeys]:
-                myhashkeys.remove(k)
-        myhashes = perform_multiple_checksums(
-            self._getAbsname(ftype, fname), myhashkeys
-        )
-        self.fhashdict[ftype][fname].update(myhashes)
+        """Regenerate hashes from a list of files"""
+        for fname in fnames:
+            if checkExisting:
+                self.checkFileHashes(ftype, fname, ignoreMissing=ignoreMissing)
+            if not ignoreMissing and fname not in self.fhashdict[ftype]:
+                raise FileNotInManifestException(fname)
+            if fname not in self.fhashdict[ftype]:
+                self.fhashdict[ftype][fname] = {}
+            myhashkeys = self.hashes
+            if reuseExisting:
+                myhashkeys = 
myhashkeys.difference(self.fhashdict[ftype][fname])
+            myhashes = perform_multiple_checksums(
+                self._getAbsname(ftype, fname), myhashkeys
+            )
+            self.fhashdict[ftype][fname].update(myhashes)
 
-    def updateTypeHashes(self, idtype, checkExisting=False, 
ignoreMissingFiles=True):
-        """Regenerate all hashes for all files of the given type"""
-        for fname in self.fhashdict[idtype]:
-            self.updateFileHashes(idtype, fname, checkExisting)
+    def updateAllTypeHashes(
+        self, idtypes, checkExisting=False, ignoreMissingFiles=True
+    ):
+        """Regenerate all hashes for all files from a list of types"""
+        for idtype in idtypes:
+            self.updateAllFileHashes(
+                ftype=idtype, fnames=self.fhashdict[idtype], 
checkExisting=checkExisting
+            )
 
     def updateAllHashes(self, checkExisting=False, ignoreMissingFiles=True):
         """Regenerate all hashes for all files in this Manifest."""
-        for idtype in MANIFEST2_IDENTIFIERS:
-            self.updateTypeHashes(
-                idtype,
-                checkExisting=checkExisting,
-                ignoreMissingFiles=ignoreMissingFiles,
-            )
+        self.updateTypeHashes(
+            idtypes=MANIFEST2_IDENTIFIERS,
+            checkExisting=checkExisting,
+            ignoreMissingFiles=ignoreMissingFiles,
+        )
 
     def updateCpvHashes(self, cpv, ignoreMissingFiles=True):
         """Regenerate all hashes associated to the given cpv (includes all AUX 
and MISC
         files)."""
-        self.updateTypeHashes("AUX", ignoreMissingFiles=ignoreMissingFiles)
-        self.updateTypeHashes("MISC", ignoreMissingFiles=ignoreMissingFiles)
-        ebuildname = "%s.ebuild" % self._catsplit(cpv)[1]
-        self.updateFileHashes(
-            "EBUILD", ebuildname, ignoreMissingFiles=ignoreMissingFiles
+        self.updateAllTypeHashes(
+            idtypes=("AUX", "MISC"),
+            ignoreMissingFiles=ignoreMissingFiles,
+        )
+        self.updateAllFileHashes(
+            ftype="EBUILD",
+            fnames=(f"{self._catsplit(cpv)[1]}.ebuild",),
+            ignoreMissingFiles=ignoreMissingFiles,
+        )
+        self.updateAllFileHashes(
+            ftype="DIST",
+            fnames=self._getCpvDistfiles(cpv),
+            ignoreMissingFiles=ignoreMissingFiles,
         )
-        for f in self._getCpvDistfiles(cpv):
-            self.updateFileHashes("DIST", f, 
ignoreMissingFiles=ignoreMissingFiles)
 
     def updateHashesGuessType(self, fname, *args, **kwargs):
         """Regenerate hashes for the given file (guesses the type and then
         calls updateFileHashes)."""
         mytype = self.guessType(fname)
-        if mytype == "AUX":
-            fname = fname[len("files" + os.sep) :]
-        elif mytype is None:
+        if mytype is None:
             return
+        elif mytype == "AUX":
+            fname = fname[len(f"files{os.sep}") :]
         myrealtype = self.findFile(fname)
         if myrealtype is not None:
             mytype = myrealtype
-        return self.updateFileHashes(mytype, fname, *args, **kwargs)
+        return self.updateAllFileHashes(ftype=mytype, fnames=(fname,), *args, 
**kwargs)
 
     def getFileData(self, ftype, fname, key):
         """Return the value of a specific (type,filename,key) triple, mainly 
useful

Reply via email to