[PATCH] Fix revlog-ng interaction with old-http.

Alexis S. L. Carvalho alexis at cecm.usp.br
Thu Apr 27 05:12:40 UTC 2006


# HG changeset patch
# User Alexis S. L. Carvalho <alexis at cecm.usp.br>
# Node ID 7fbab341004280d46700683dfde056c3765f639a
# Parent  d80984b1f7647a88a01ea4bf8eafac203a6968fa
Fix revlog-ng interaction with old-http.

revlog.py wasn't trying to detect the version of a revlog file that
doesn't exist on the filesystem (as is the case with old-http).

Additionally, there was an off-by-one error in httprangereader.read
(ranges in HTTP Range headers are inclusive), making it get more data
than what was asked for.  This made a struct.unpack complain that
"unpack str size does not match format".

Finally, with the two fixes above, test-static-http fails, since
BaseHTTPServer doesn't understand ranges and returns too much data.
Work around that by reading only the specified amount.

diff -r d80984b1f764 -r 7fbab3410042 mercurial/httprangereader.py
--- a/mercurial/httprangereader.py	Wed Apr 26 22:24:25 2006 -0300
+++ b/mercurial/httprangereader.py	Thu Apr 27 01:42:46 2006 -0300
@@ -18,7 +18,8 @@ class httprangereader(object):
         urllib2.install_opener(opener)
         req = urllib2.Request(self.url)
         end = ''
-        if bytes: end = self.pos + bytes
+        if bytes:
+            end = self.pos + bytes - 1
         req.add_header('Range', 'bytes=%d-%s' % (self.pos, end))
         f = urllib2.urlopen(req)
-        return f.read()
+        return f.read(bytes)
diff -r d80984b1f764 -r 7fbab3410042 mercurial/revlog.py
--- a/mercurial/revlog.py	Wed Apr 26 22:24:25 2006 -0300
+++ b/mercurial/revlog.py	Thu Apr 27 01:42:46 2006 -0300
@@ -333,8 +333,8 @@ class revlog(object):
                     and st.st_ctime == oldst.st_ctime):
                     return
                 self.indexstat = st
-                if len(i) > 0:
-                    v = struct.unpack(versionformat, i)[0]
+            if len(i) > 0:
+                v = struct.unpack(versionformat, i)[0]
         flags = v & ~0xFFFF
         fmt = v & 0xFFFF
         if fmt == 0:



More information about the Mercurial mailing list