mercurial/changegroup.py
author Thomas Arendsen Hein <thomas@intevation.de>
Fri, 30 Jun 2006 21:41:46 +0200
changeset 2543 860e9c83fc59
parent 2470 fe1689273f84
child 3666 025f68f22ae2
permissions -rw-r--r--
Include inttypes.h instead of stdint.h (fixes issue299) Many projects use inttypes.h, too. stdint.h isn't available everywhere, e.g. on some versions of Solaris, while inttypes.h is available everywhere where stdint.h is.

"""
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, incorporated herein by reference.
"""
from i18n import gettext as _
from demandload import *
demandload(globals(), "struct util")

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 genchunk(data):
    """build a changegroup chunk"""
    header = struct.pack(">l", len(data)+ 4)
    return "%s%s" % (header, data)

def closechunk():
    return struct.pack(">l", 0)