[PATCH] More proper check to see if zip dest needs to be wrapped in tellable

Colin McMillen mcmillen at cs.cmu.edu
Sun Apr 30 19:57:40 UTC 2006


Sorry for the spam; I realized just moments too late that the
catch-all exception handler in the previous patch was probably a Bad
Idea. Here's a better attempt (patch is against crew tip, BTW):

# HG changeset patch
# User Colin McMillen <mcmillen at cs.cmu.edu>
# Node ID 32ee65b2c80fdaa23ec9e38eb365c60423185bde
# Parent  cbd458228a960291994219d905367af4e4fe64c1
Proper check to see if zip dest needs to be wrapped in tellable

From hgweb, calling archival.zipit fails with the error message
"Illegal seek". This happens because sys.stdout.tell() throws an
exception:

Traceback (most recent call last):
  File "/usr/lib/python2.4/site-packages/mercurial/archival.py", line 99, in addfile
    self.z.writestr(i, data)
  File "/usr/lib/python2.4/zipfile.py", line 468, in writestr
    zinfo.header_offset = self.fp.tell()    # Start of header bytes

Checking whether hasattr(dest, 'tell') is insufficient, because
sys.stdout has a tell() method; you just can't call it.

This patch instead determines whether a fileobj is tellable by trying
to tell(), wrapping the fileobj if an exception is generated.

diff -r cbd458228a96 -r 32ee65b2c80f mercurial/archival.py
--- a/mercurial/archival.py     Sun Apr 30 19:30:59 2006 +0200
+++ b/mercurial/archival.py     Sun Apr 30 15:54:26 2006 -0400
@@ -80,8 +80,13 @@ class zipit:

     def __init__(self, dest, prefix, compress=True):
         self.prefix = tidyprefix(dest, prefix, ('.zip',))
-        if not isinstance(dest, str) and not hasattr(dest, 'tell'):
-            dest = tellable(dest)
+        if not isinstance(dest, str):
+            try:
+                dest.tell()
+            except AttributeError:
+                dest = tellable(dest)
+            except IOError:
+                dest = tellable(dest)
         self.z = zipfile.ZipFile(dest, 'w',
                                  compress and zipfile.ZIP_DEFLATED or
                                  zipfile.ZIP_STORED)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 191 bytes
Desc: Digital signature
URL: <http://lists.mercurial-scm.org/pipermail/mercurial/attachments/20060430/ce696ddd/attachment-0001.asc>


More information about the Mercurial mailing list