# HG changeset patch # User Colin McMillen # Date 1146429821 -7200 # Node ID dd4ec4576cc8c72e58921bb35b53ccbd142fdce1 # Parent d821918e3bee7e6599ce680887e14b7646c62e4f 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 d821918e3bee -r dd4ec4576cc8 mercurial/archival.py --- a/mercurial/archival.py Sun Apr 30 21:11:22 2006 +0200 +++ b/mercurial/archival.py Sun Apr 30 22:43:41 2006 +0200 @@ -80,8 +80,13 @@ 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)