diff --git a/mercurial/bundle2.py b/mercurial/bundle2.py --- a/mercurial/bundle2.py +++ b/mercurial/bundle2.py @@ -1836,23 +1836,10 @@ def handlepushkey(op, inpart): kwargs[key] = inpart.params[key] raise error.PushkeyFailed(partid=str(inpart.id), **kwargs) -def _readphaseheads(inpart): - headsbyphase = [[] for i in phases.allphases] - entrysize = phases._fphasesentry.size - while True: - entry = inpart.read(entrysize) - if len(entry) < entrysize: - if entry: - raise error.Abort(_('bad phase-heads bundle part')) - break - phase, node = phases._fphasesentry.unpack(entry) - headsbyphase[phase].append(node) - return headsbyphase - @parthandler('phase-heads') def handlephases(op, inpart): """apply phases from bundle part to repo""" - headsbyphase = _readphaseheads(inpart) + headsbyphase = phases.binarydecode(inpart) phases.updatephases(op.repo.unfiltered(), op.gettransaction(), headsbyphase) op.records.add('phase-heads', {}) diff --git a/mercurial/debugcommands.py b/mercurial/debugcommands.py --- a/mercurial/debugcommands.py +++ b/mercurial/debugcommands.py @@ -310,7 +310,7 @@ def _debugobsmarkers(ui, part, indent=0, def _debugphaseheads(ui, data, indent=0): """display version and markers contained in 'data'""" indent_string = ' ' * indent - headsbyphase = bundle2._readphaseheads(data) + headsbyphase = phases.binarydecode(data) for phase in phases.allphases: for head in headsbyphase[phase]: ui.write(indent_string) diff --git a/mercurial/phases.py b/mercurial/phases.py --- a/mercurial/phases.py +++ b/mercurial/phases.py @@ -169,6 +169,22 @@ def binaryencode(phasemapping): binarydata.append(_fphasesentry.pack(phase, head)) return ''.join(binarydata) +def binarydecode(stream): + """decode a binary stream into a 'phase -> nodes' mapping + + Since phases are integer the mapping is actually a python list.""" + headsbyphase = [[] for i in allphases] + entrysize = _fphasesentry.size + while True: + entry = stream.read(entrysize) + if len(entry) < entrysize: + if entry: + raise error.Abort(_('bad phase-heads stream')) + break + phase, node = _fphasesentry.unpack(entry) + headsbyphase[phase].append(node) + return headsbyphase + def _trackphasechange(data, rev, old, new): """add a phase move the dictionnary