mercurial/changegroup.py
author Alexis S. L. Carvalho <alexis@cecm.usp.br>
Sun, 14 May 2006 18:22:12 -0300
changeset 2289 854954fd410a
parent 1997 802e8a029d99
child 2470 fe1689273f84
permissions -rw-r--r--
Fix revlog.parseindex parseindex could fail if read returns too little data in the right moment (e.g. when there's still leftover data from the previous iteration and read returns less than "s" bytes).

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