diff options
author | Ori Bernstein <ori@eigenstate.org> | 2021-06-14 00:00:37 +0000 |
---|---|---|
committer | Ori Bernstein <ori@eigenstate.org> | 2021-06-14 00:00:37 +0000 |
commit | a73a964e51247ed169d322c725a3a18859f109a3 (patch) | |
tree | 3f752d117274d444bda44e85609aeac1acf313f3 /sys/src/cmd/hg/mercurial/changegroup.py | |
parent | e64efe273fcb921a61bf27d33b230c4e64fcd425 (diff) |
python, hg: tow outside the environment.
they've served us well, and can ride off into the sunset.
Diffstat (limited to 'sys/src/cmd/hg/mercurial/changegroup.py')
-rw-r--r-- | sys/src/cmd/hg/mercurial/changegroup.py | 140 |
1 files changed, 0 insertions, 140 deletions
diff --git a/sys/src/cmd/hg/mercurial/changegroup.py b/sys/src/cmd/hg/mercurial/changegroup.py deleted file mode 100644 index a4ada4eb6..000000000 --- a/sys/src/cmd/hg/mercurial/changegroup.py +++ /dev/null @@ -1,140 +0,0 @@ -# changegroup.py - Mercurial changegroup manipulation functions -# -# Copyright 2006 Matt Mackall <mpm@selenic.com> -# -# This software may be used and distributed according to the terms of the -# GNU General Public License version 2, incorporated herein by reference. - -from i18n import _ -import util -import struct, os, bz2, zlib, tempfile - -def getchunk(source): - """get a chunk from a changegroup""" - d = source.read(4) - if not d: - return "" - l = struct.unpack(">l", d)[0] - if l <= 4: - return "" - d = source.read(l - 4) - if len(d) < l - 4: - raise util.Abort(_("premature EOF reading chunk" - " (got %d bytes, expected %d)") - % (len(d), l - 4)) - return d - -def chunkiter(source): - """iterate through the chunks in source""" - while 1: - c = getchunk(source) - if not c: - break - yield c - -def chunkheader(length): - """build a changegroup chunk header""" - return struct.pack(">l", length + 4) - -def closechunk(): - return struct.pack(">l", 0) - -class nocompress(object): - def compress(self, x): - return x - def flush(self): - return "" - -bundletypes = { - "": ("", nocompress), - "HG10UN": ("HG10UN", nocompress), - "HG10BZ": ("HG10", lambda: bz2.BZ2Compressor()), - "HG10GZ": ("HG10GZ", lambda: zlib.compressobj()), -} - -# hgweb uses this list to communicate its preferred type -bundlepriority = ['HG10GZ', 'HG10BZ', 'HG10UN'] - -def writebundle(cg, filename, bundletype): - """Write a bundle file and return its filename. - - Existing files will not be overwritten. - If no filename is specified, a temporary file is created. - bz2 compression can be turned off. - The bundle file will be deleted in case of errors. - """ - - fh = None - cleanup = None - try: - if filename: - fh = open(filename, "wb") - else: - fd, filename = tempfile.mkstemp(prefix="hg-bundle-", suffix=".hg") - fh = os.fdopen(fd, "wb") - cleanup = filename - - header, compressor = bundletypes[bundletype] - fh.write(header) - z = compressor() - - # parse the changegroup data, otherwise we will block - # in case of sshrepo because we don't know the end of the stream - - # an empty chunkiter is the end of the changegroup - # a changegroup has at least 2 chunkiters (changelog and manifest). - # after that, an empty chunkiter is the end of the changegroup - empty = False - count = 0 - while not empty or count <= 2: - empty = True - count += 1 - for chunk in chunkiter(cg): - empty = False - fh.write(z.compress(chunkheader(len(chunk)))) - pos = 0 - while pos < len(chunk): - next = pos + 2**20 - fh.write(z.compress(chunk[pos:next])) - pos = next - fh.write(z.compress(closechunk())) - fh.write(z.flush()) - cleanup = None - return filename - finally: - if fh is not None: - fh.close() - if cleanup is not None: - os.unlink(cleanup) - -def unbundle(header, fh): - if header == 'HG10UN': - return fh - elif not header.startswith('HG'): - # old client with uncompressed bundle - def generator(f): - yield header - for chunk in f: - yield chunk - elif header == 'HG10GZ': - def generator(f): - zd = zlib.decompressobj() - for chunk in f: - yield zd.decompress(chunk) - elif header == 'HG10BZ': - def generator(f): - zd = bz2.BZ2Decompressor() - zd.decompress("BZ") - for chunk in util.filechunkiter(f, 4096): - yield zd.decompress(chunk) - return util.chunkbuffer(generator(fh)) - -def readbundle(fh, fname): - header = fh.read(6) - if not header.startswith('HG'): - raise util.Abort(_('%s: not a Mercurial bundle file') % fname) - if not header.startswith('HG10'): - raise util.Abort(_('%s: unknown bundle version') % fname) - elif header not in bundletypes: - raise util.Abort(_('%s: unknown bundle compression type') % fname) - return unbundle(header, fh) |