Patchwork D8372: manifest: remove a final 40-byte assumption from pure-python parser

login
register
mail settings
Submitter phabricator
Date April 14, 2020, 7:19 p.m.
Message ID <cde76a2e47d4d66b95befac0aa0706ca@localhost.localdomain>
Download mbox | patch
Permalink /patch/46114/
State Not Applicable
Headers show

Comments

phabricator - April 14, 2020, 7:19 p.m.
Closed by commit rHG2db2e9e585b3: manifest: remove a final 40-byte assumption from pure-python parser (authored by durin42).
This revision was automatically updated to reflect the committed changes.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D8372?vs=21054&id=21085

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D8372/new/

REVISION DETAIL
  https://phab.mercurial-scm.org/D8372

AFFECTED FILES
  mercurial/manifest.py

CHANGE DETAILS




To: durin42, #hg-reviewers, Alphare, pulkit
Cc: mercurial-devel

Patch

diff --git a/mercurial/manifest.py b/mercurial/manifest.py
--- a/mercurial/manifest.py
+++ b/mercurial/manifest.py
@@ -57,7 +57,12 @@ 
             raise ValueError(b'Manifest lines not in sorted order.')
         prev = l
         f, n = l.split(b'\0')
-        if len(n) > 40:
+        nl = len(n)
+        if 64 < nl:
+            # modern hash, full width
+            yield f, bin(n[:64]), n[64:]
+        if 40 < nl < 45:
+            # legacy hash, always sha1
             yield f, bin(n[:40]), n[40:]
         else:
             yield f, bin(n), b''
@@ -265,9 +270,15 @@ 
         if pos == -1:
             return (data[1], data[2])
         zeropos = data.find(b'\x00', pos)
+        nlpos = data.find(b'\n', zeropos)
         assert 0 <= needle <= len(self.positions)
         assert len(self.extrainfo) == len(self.positions)
-        hashval = unhexlify(data, self.extrainfo[needle], zeropos + 1, 40)
+        hlen = nlpos - zeropos - 1
+        # Hashes sometimes have an extra byte tucked on the end, so
+        # detect that.
+        if hlen % 2:
+            hlen -= 1
+        hashval = unhexlify(data, self.extrainfo[needle], zeropos + 1, hlen)
         flags = self._getflags(data, needle, zeropos)
         return (hashval, flags)