[PATCH 2 of 2] bundle2: add support for changegroup2
sune.foldager at me.com
sune.foldager at me.com
Tue Sep 2 10:46:50 UTC 2014
I accidentally included a commented-out print-statement in the delta parent function below.
Pierre-Yves wanted bundle2 to be able to include both cg1 and cg2, but I don’t see why we need that; this change will break existing bundle2 anyway, so people who use it will need to update both ends in all cases. Pierre-Yves, what do you think?
-Sune
On 02/09/2014, at 12:43, Sune Foldager <sune.foldager at me.com> wrote:
> # HG changeset patch
> # User Sune Foldager <cryo at cyanite.org>
> # Date 1409654405 -7200
> # Tue Sep 02 12:40:05 2014 +0200
> # Node ID 67ef070167adfe202310ac0a3783df82b813ee38
> # Parent 6e8fe07ad948009f64ea7f199d1c3e3ca22b92c4
> bundle2: add support for changegroup2
>
> Changegroup format 2 includes the delta parent for each chunk so we can create
> more efficient changegroups when using generaldelta.
>
> diff -r 6e8fe07ad948 -r 67ef070167ad mercurial/bundle2.py
> --- a/mercurial/bundle2.py Tue Sep 02 12:11:36 2014 +0200
> +++ b/mercurial/bundle2.py Tue Sep 02 12:40:05 2014 +0200
> @@ -820,7 +820,7 @@
> # we need to make sure we trigger the creation of a transaction object used
> # for the whole processing scope.
> op.gettransaction()
> - cg = changegroup.cg1unpacker(inpart, 'UN')
> + cg = changegroup.cg2unpacker(inpart, 'UN')
> ret = changegroup.addchangegroup(op.repo, cg, 'bundle2', 'bundle2')
> op.records.add('changegroup', {'return': ret})
> if op.reply is not None:
> diff -r 6e8fe07ad948 -r 67ef070167ad mercurial/changegroup.py
> --- a/mercurial/changegroup.py Tue Sep 02 12:11:36 2014 +0200
> +++ b/mercurial/changegroup.py Tue Sep 02 12:40:05 2014 +0200
> @@ -13,6 +13,7 @@
> import discovery, error, phases, branchmap
>
> _CHANGEGROUPV1_DELTA_HEADER = "20s20s20s20s"
> +_CHANGEGROUPV2_DELTA_HEADER = "20s20s20s20s20s"
>
> def readexactly(stream, n):
> '''read n bytes from stream.read and abort if less was available'''
> @@ -215,6 +216,15 @@
> pos = next
> yield closechunk()
>
> +class cg2unpacker(cg1unpacker):
> + deltaheader = _CHANGEGROUPV2_DELTA_HEADER
> + deltaheadersize = struct.calcsize(deltaheader)
> +
> + def _deltaheader(self, headertuple, prevnode):
> + node, p1, p2, deltabase, cs = headertuple
> + return node, p1, p2, deltabase, cs
> +
> +
> class headerlessfixup(object):
> def __init__(self, fh, h):
> self._h = h
> @@ -410,10 +420,13 @@
> reorder=reorder):
> yield chunk
>
> + def deltaparent(self, revlog, rev, p1, p2, prev):
> + return prev
> +
> def revchunk(self, revlog, rev, prev, linknode):
> node = revlog.node(rev)
> p1, p2 = revlog.parentrevs(rev)
> - base = prev
> + base = self.deltaparent(revlog, rev, p1, p2, prev)
>
> prefix = ''
> if base == nullrev:
> @@ -433,6 +446,28 @@
> # do nothing with basenode, it is implicitly the previous one in HG10
> return struct.pack(self.deltaheader, node, p1n, p2n, linknode)
>
> +class cg2packer(cg1packer):
> +
> + deltaheader = _CHANGEGROUPV2_DELTA_HEADER
> +
> + def group(self, nodelist, revlog, lookup, units=None, reorder=None):
> + if (revlog._generaldelta and reorder is not True):
> + reorder = False
> + return cg1packer.group(self, nodelist, revlog, lookup,
> + units=units, reorder=reorder)
> +
> + def deltaparent(self, revlog, rev, p1, p2, prev):
> + dp = revlog.deltaparent(rev)
> + #print 'rev %d dp %d p1 %d p2 %d prev %d' % (rev, dp, p1, p2, prev)
> + # avoid storing full revisions; pick prev in those cases
> + # also pick prev when we can't be sure remote has dp
> + if dp == nullrev or (dp != p1 and dp != p2 and dp != prev):
> + return prev
> + return dp
> +
> + def builddeltaheader(self, node, p1n, p2n, basenode, linknode):
> + return struct.pack(self.deltaheader, node, p1n, p2n, basenode, linknode)
> +
> def _changegroupinfo(repo, nodes, source):
> if repo.ui.verbose or source == 'bundle':
> repo.ui.status(_("%d changesets found\n") % len(nodes))
> @@ -524,6 +559,24 @@
> outgoing = _computeoutgoing(repo, heads, common)
> return getlocalchangegroup(repo, source, outgoing, bundlecaps=bundlecaps)
>
> +def getlocalchangegroup2(repo, source, outgoing, bundlecaps=None):
> + if not outgoing.missing:
> + return None
> + bundler = cg2packer(repo, bundlecaps)
> + repo = repo.unfiltered()
> + commonrevs = outgoing.common
> + csets = outgoing.missing
> + heads = outgoing.missingheads
> + heads.sort()
> + fastpathlinkrev = repo.filtername is None and heads == sorted(repo.heads())
> + repo.hook('preoutgoing', throw=True, source=source)
> + _changegroupinfo(repo, csets, source)
> + return bundler.generate(commonrevs, csets, fastpathlinkrev, source)
> +
> +def getchangegroup2(repo, source, heads=None, common=None, bundlecaps=None):
> + outgoing = _computeoutgoing(repo, heads, common)
> + return getlocalchangegroup2(repo, source, outgoing, bundlecaps=bundlecaps)
> +
> def changegroup(repo, basenodes, source):
> # to avoid a race we use changegroupsubset() (issue1320)
> return changegroupsubset(repo, basenodes, repo.heads(), source)
> diff -r 6e8fe07ad948 -r 67ef070167ad mercurial/exchange.py
> --- a/mercurial/exchange.py Tue Sep 02 12:11:36 2014 +0200
> +++ b/mercurial/exchange.py Tue Sep 02 12:40:05 2014 +0200
> @@ -401,8 +401,8 @@
> pushop.outgoing)
> if not pushop.force:
> bundler.newpart('B2X:CHECK:HEADS', data=iter(pushop.remoteheads))
> - cg = changegroup.getlocalchangegroup(pushop.repo, 'push', pushop.outgoing)
> - cgpart = bundler.newpart('B2X:CHANGEGROUP', data=cg.getchunks())
> + cg = changegroup.getlocalchangegroup2(pushop.repo, 'push', pushop.outgoing)
> + cgpart = bundler.newpart('B2X:CHANGEGROUP', data=cg)
> def handlereply(op):
> """extract addchangroup returns from server reply"""
> cgreplies = op.records.getreplies(cgpart.id)
> @@ -976,28 +976,27 @@
> The implementation is at a very early stage and will get massive rework
> when the API of bundle is refined.
> """
> - cg = None
> - if kwargs.get('cg', True):
> - # build changegroup bundle here.
> - cg = changegroup.getchangegroup(repo, source, heads=heads,
> - common=common, bundlecaps=bundlecaps)
> - elif 'HG2X' not in bundlecaps:
> - raise ValueError(_('request for bundle10 must include changegroup'))
> if bundlecaps is None or 'HG2X' not in bundlecaps:
> if kwargs:
> raise ValueError(_('unsupported getbundle arguments: %s')
> % ', '.join(sorted(kwargs.keys())))
> - return cg
> + return changegroup.getchangegroup(repo, source, heads=heads,
> + common=common, bundlecaps=bundlecaps)
> +
> # very crude first implementation,
> # the bundle API will change and the generation will be done lazily.
> + cg = None
> b2caps = {}
> for bcaps in bundlecaps:
> if bcaps.startswith('bundle2='):
> blob = urllib.unquote(bcaps[len('bundle2='):])
> b2caps.update(bundle2.decodecaps(blob))
> bundler = bundle2.bundle20(repo.ui, b2caps)
> - if cg:
> - bundler.newpart('b2x:changegroup', data=cg.getchunks())
> + if kwargs.get('cg', True):
> + cg = changegroup.getchangegroup2(repo, source, heads=heads,
> + common=common, bundlecaps=bundlecaps)
> + if cg:
> + bundler.newpart('b2x:changegroup', data=cg)
> listkeys = kwargs.get('listkeys', ())
> for namespace in listkeys:
> part = bundler.newpart('b2x:listkeys')
> diff -r 6e8fe07ad948 -r 67ef070167ad tests/test-bundle2.t
> --- a/tests/test-bundle2.t Tue Sep 02 12:11:36 2014 +0200
> +++ b/tests/test-bundle2.t Tue Sep 02 12:40:05 2014 +0200
> @@ -106,8 +106,8 @@
>> headmissing = [c.node() for c in repo.set('heads(%ld)', revs)]
>> headcommon = [c.node() for c in repo.set('parents(%ld) - %ld', revs, revs)]
>> outgoing = discovery.outgoing(repo.changelog, headcommon, headmissing)
> - > cg = changegroup.getlocalchangegroup(repo, 'test:bundle2', outgoing, None)
> - > bundler.newpart('b2x:changegroup', data=cg.getchunks())
> + > cg = changegroup.getlocalchangegroup2(repo, 'test:bundle2', outgoing, None)
> + > bundler.newpart('b2x:changegroup', data=cg)
>>
>> if opts['parts']:
>> bundler.newpart('test:empty')
> @@ -719,26 +719,26 @@
> end of bundle
>
> $ cat ../rev.hg2
> - HG2X\x00\x00\x00\x16\x0fb2x:changegroup\x00\x00\x00\x00\x00\x00\x00\x00\x06\x13\x00\x00\x00\xa42\xafv\x86\xd4\x03\xcfE\xb5\xd9_-p\xce\xbe\xa5\x87\xac\x80j_\xdd\xd9\x89W\xc8\xa5JMCm\xfe\x1d\xa9\xd8\x7f!\xa1\xb9{\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002\xafv\x86\xd4\x03\xcfE\xb5\xd9_-p\xce\xbe\xa5\x87\xac\x80j\x00\x00\x00\x00\x00\x00\x00)\x00\x00\x00)6e1f4c47ecb533ffd0c8e52cdc88afb6cd39e20c (esc)
> + HG2X\x00\x00\x00\x16\x0fb2x:changegroup\x00\x00\x00\x00\x00\x00\x00\x00\x06\xef\x00\x00\x00\xb82\xafv\x86\xd4\x03\xcfE\xb5\xd9_-p\xce\xbe\xa5\x87\xac\x80j_\xdd\xd9\x89W\xc8\xa5JMCm\xfe\x1d\xa9\xd8\x7f!\xa1\xb9{\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00_\xdd\xd9\x89W\xc8\xa5JMCm\xfe\x1d\xa9\xd8\x7f!\xa1\xb9{2\xafv\x86\xd4\x03\xcfE\xb5\xd9_-p\xce\xbe\xa5\x87\xac\x80j\x00\x00\x00\x00\x00\x00\x00)\x00\x00\x00)6e1f4c47ecb533ffd0c8e52cdc88afb6cd39e20c (esc)
> \x00\x00\x00f\x00\x00\x00h\x00\x00\x00\x02D (esc)
> - \x00\x00\x00i\x00\x00\x00j\x00\x00\x00\x01D\x00\x00\x00\xa4\x95 \xee\xa7\x81\xbc\xca\x16\xc1\xe1Z\xcc\x0b\xa1C5\xa0\xe8\xe5\xba\xcd\x01\x0b\x8c\xd9\x98\xf3\x98\x1aZ\x81\x15\xf9O\x8d\xa4\xabP`\x89\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95 \xee\xa7\x81\xbc\xca\x16\xc1\xe1Z\xcc\x0b\xa1C5\xa0\xe8\xe5\xba\x00\x00\x00\x00\x00\x00\x00)\x00\x00\x00)4dece9c826f69490507b98c6383a3009b295837d (esc)
> + \x00\x00\x00i\x00\x00\x00j\x00\x00\x00\x01D\x00\x00\x00\xb8\x95 \xee\xa7\x81\xbc\xca\x16\xc1\xe1Z\xcc\x0b\xa1C5\xa0\xe8\xe5\xba\xcd\x01\x0b\x8c\xd9\x98\xf3\x98\x1aZ\x81\x15\xf9O\x8d\xa4\xabP`\x89\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002\xafv\x86\xd4\x03\xcfE\xb5\xd9_-p\xce\xbe\xa5\x87\xac\x80j\x95 \xee\xa7\x81\xbc\xca\x16\xc1\xe1Z\xcc\x0b\xa1C5\xa0\xe8\xe5\xba\x00\x00\x00\x00\x00\x00\x00)\x00\x00\x00)4dece9c826f69490507b98c6383a3009b295837d (esc)
> \x00\x00\x00f\x00\x00\x00h\x00\x00\x00\x02E (esc)
> - \x00\x00\x00i\x00\x00\x00j\x00\x00\x00\x01E\x00\x00\x00\xa2\xee\xa17Fy\x9a\x9e\x0b\xfd\x88\xf2\x9d<.\x9d\xc98\x9fRO$\xb68|\x8c\x8c\xae7\x17\x88\x80\xf3\xfa\x95\xde\xd3\xcb\x1c\xf7\x85\x95 \xee\xa7\x81\xbc\xca\x16\xc1\xe1Z\xcc\x0b\xa1C5\xa0\xe8\xe5\xba\xee\xa17Fy\x9a\x9e\x0b\xfd\x88\xf2\x9d<.\x9d\xc98\x9fRO\x00\x00\x00\x00\x00\x00\x00)\x00\x00\x00)365b93d57fdf4814e2b5911d6bacff2b12014441 (esc)
> - \x00\x00\x00f\x00\x00\x00h\x00\x00\x00\x00\x00\x00\x00i\x00\x00\x00j\x00\x00\x00\x01G\x00\x00\x00\xa4\x02\xdeB\x19n\xbe\xe4.\xf2\x84\xb6x (esc)
> - \x87\xcd\xc9n\x8e\xaa\xb6$\xb68|\x8c\x8c\xae7\x17\x88\x80\xf3\xfa\x95\xde\xd3\xcb\x1c\xf7\x85\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xdeB\x19n\xbe\xe4.\xf2\x84\xb6x (esc)
> + \x00\x00\x00i\x00\x00\x00j\x00\x00\x00\x01E\x00\x00\x00\xb6\xee\xa17Fy\x9a\x9e\x0b\xfd\x88\xf2\x9d<.\x9d\xc98\x9fRO$\xb68|\x8c\x8c\xae7\x17\x88\x80\xf3\xfa\x95\xde\xd3\xcb\x1c\xf7\x85\x95 \xee\xa7\x81\xbc\xca\x16\xc1\xe1Z\xcc\x0b\xa1C5\xa0\xe8\xe5\xba$\xb68|\x8c\x8c\xae7\x17\x88\x80\xf3\xfa\x95\xde\xd3\xcb\x1c\xf7\x85\xee\xa17Fy\x9a\x9e\x0b\xfd\x88\xf2\x9d<.\x9d\xc98\x9fRO\x00\x00\x00\x00\x00\x00\x00)\x00\x00\x00)365b93d57fdf4814e2b5911d6bacff2b12014441 (esc)
> + \x00\x00\x00f\x00\x00\x00h\x00\x00\x00\x00\x00\x00\x00i\x00\x00\x00j\x00\x00\x00\x01G\x00\x00\x00\xb8\x02\xdeB\x19n\xbe\xe4.\xf2\x84\xb6x (esc)
> + \x87\xcd\xc9n\x8e\xaa\xb6$\xb68|\x8c\x8c\xae7\x17\x88\x80\xf3\xfa\x95\xde\xd3\xcb\x1c\xf7\x85\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xee\xa17Fy\x9a\x9e\x0b\xfd\x88\xf2\x9d<.\x9d\xc98\x9fRO\x02\xdeB\x19n\xbe\xe4.\xf2\x84\xb6x (esc)
> \x87\xcd\xc9n\x8e\xaa\xb6\x00\x00\x00\x00\x00\x00\x00)\x00\x00\x00)8bee48edc7318541fc0013ee41b089276a8c24bf (esc)
> \x00\x00\x00f\x00\x00\x00f\x00\x00\x00\x02H (esc)
> - \x00\x00\x00g\x00\x00\x00h\x00\x00\x00\x01H\x00\x00\x00\x00\x00\x00\x00\x8bn\x1fLG\xec\xb53\xff\xd0\xc8\xe5,\xdc\x88\xaf\xb6\xcd9\xe2\x0cf\xa5\xa0\x18\x17\xfd\xf5#\x9c'8\x02\xb5\xb7a\x8d\x05\x1c\x89\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002\xafv\x86\xd4\x03\xcfE\xb5\xd9_-p\xce\xbe\xa5\x87\xac\x80j\x00\x00\x00\x81\x00\x00\x00\x81\x00\x00\x00+D\x00c3f1ca2924c16a19b0656a84900e504e5b0aec2d (esc)
> - \x00\x00\x00\x8bM\xec\xe9\xc8&\xf6\x94\x90P{\x98\xc68:0 \xb2\x95\x83}\x00}\x8c\x9d\x88\x84\x13%\xf5\xc6\xb0cq\xb3[N\x8a+\x1a\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95 \xee\xa7\x81\xbc\xca\x16\xc1\xe1Z\xcc\x0b\xa1C5\xa0\xe8\xe5\xba\x00\x00\x00+\x00\x00\x00\xac\x00\x00\x00+E\x009c6fd0350a6c0d0c49d4a9c5017cf07043f54e58 (esc)
> - \x00\x00\x00\x8b6[\x93\xd5\x7f\xdfH\x14\xe2\xb5\x91\x1dk\xac\xff+\x12\x01DA(\xa5\x84\xc6^\xf1!\xf8\x9e\xb6j\xb7\xd0\xbc\x15=\x80\x99\xe7\xceM\xec\xe9\xc8&\xf6\x94\x90P{\x98\xc68:0 \xb2\x95\x83}\xee\xa17Fy\x9a\x9e\x0b\xfd\x88\xf2\x9d<.\x9d\xc98\x9fRO\x00\x00\x00V\x00\x00\x00V\x00\x00\x00+F\x0022bfcfd62a21a3287edbd4d656218d0f525ed76a (esc)
> - \x00\x00\x00\x97\x8b\xeeH\xed\xc71\x85A\xfc\x00\x13\xeeA\xb0\x89'j\x8c$\xbf(\xa5\x84\xc6^\xf1!\xf8\x9e\xb6j\xb7\xd0\xbc\x15=\x80\x99\xe7\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xdeB\x19n\xbe\xe4.\xf2\x84\xb6x (esc)
> + \x00\x00\x00g\x00\x00\x00h\x00\x00\x00\x01H\x00\x00\x00\x00\x00\x00\x00\x9fn\x1fLG\xec\xb53\xff\xd0\xc8\xe5,\xdc\x88\xaf\xb6\xcd9\xe2\x0cf\xa5\xa0\x18\x17\xfd\xf5#\x9c'8\x02\xb5\xb7a\x8d\x05\x1c\x89\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00f\xa5\xa0\x18\x17\xfd\xf5#\x9c'8\x02\xb5\xb7a\x8d\x05\x1c\x89\xe42\xafv\x86\xd4\x03\xcfE\xb5\xd9_-p\xce\xbe\xa5\x87\xac\x80j\x00\x00\x00\x81\x00\x00\x00\x81\x00\x00\x00+D\x00c3f1ca2924c16a19b0656a84900e504e5b0aec2d (esc)
> + \x00\x00\x00\x9fM\xec\xe9\xc8&\xf6\x94\x90P{\x98\xc68:0 \xb2\x95\x83}\x00}\x8c\x9d\x88\x84\x13%\xf5\xc6\xb0cq\xb3[N\x8a+\x1a\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00n\x1fLG\xec\xb53\xff\xd0\xc8\xe5,\xdc\x88\xaf\xb6\xcd9\xe2\x0c\x95 \xee\xa7\x81\xbc\xca\x16\xc1\xe1Z\xcc\x0b\xa1C5\xa0\xe8\xe5\xba\x00\x00\x00+\x00\x00\x00\xac\x00\x00\x00+E\x009c6fd0350a6c0d0c49d4a9c5017cf07043f54e58 (esc)
> + \x00\x00\x00\x9f6[\x93\xd5\x7f\xdfH\x14\xe2\xb5\x91\x1dk\xac\xff+\x12\x01DA(\xa5\x84\xc6^\xf1!\xf8\x9e\xb6j\xb7\xd0\xbc\x15=\x80\x99\xe7\xceM\xec\xe9\xc8&\xf6\x94\x90P{\x98\xc68:0 \xb2\x95\x83}(\xa5\x84\xc6^\xf1!\xf8\x9e\xb6j\xb7\xd0\xbc\x15=\x80\x99\xe7\xce\xee\xa17Fy\x9a\x9e\x0b\xfd\x88\xf2\x9d<.\x9d\xc98\x9fRO\x00\x00\x00+\x00\x00\x00+\x00\x00\x00+E\x009c6fd0350a6c0d0c49d4a9c5017cf07043f54e58 (esc)
> + \x00\x00\x00\xab\x8b\xeeH\xed\xc71\x85A\xfc\x00\x13\xeeA\xb0\x89'j\x8c$\xbf(\xa5\x84\xc6^\xf1!\xf8\x9e\xb6j\xb7\xd0\xbc\x15=\x80\x99\xe7\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x006[\x93\xd5\x7f\xdfH\x14\xe2\xb5\x91\x1dk\xac\xff+\x12\x01DA\x02\xdeB\x19n\xbe\xe4.\xf2\x84\xb6x (esc)
> \x87\xcd\xc9n\x8e\xaa\xb6\x00\x00\x00+\x00\x00\x00V\x00\x00\x00\x00\x00\x00\x00\x81\x00\x00\x00\x81\x00\x00\x00+H\x008500189e74a9e0475e822093bc7db0d631aeb0b4 (esc)
> - \x00\x00\x00\x00\x00\x00\x00\x05D\x00\x00\x00b\xc3\xf1\xca)$\xc1j\x19\xb0ej\x84\x90\x0ePN[ (esc)
> - \xec-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002\xafv\x86\xd4\x03\xcfE\xb5\xd9_-p\xce\xbe\xa5\x87\xac\x80j\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02D (esc)
> - \x00\x00\x00\x00\x00\x00\x00\x05E\x00\x00\x00b\x9co\xd05 (esc)
> + \x00\x00\x00\x00\x00\x00\x00\x05D\x00\x00\x00v\xc3\xf1\xca)$\xc1j\x19\xb0ej\x84\x90\x0ePN[ (esc)
> + \xec-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002\xafv\x86\xd4\x03\xcfE\xb5\xd9_-p\xce\xbe\xa5\x87\xac\x80j\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02D (esc)
> + \x00\x00\x00\x00\x00\x00\x00\x05E\x00\x00\x00v\x9co\xd05 (esc)
> l\r (no-eol) (esc)
> - \x0cI\xd4\xa9\xc5\x01|\xf0pC\xf5NX\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95 \xee\xa7\x81\xbc\xca\x16\xc1\xe1Z\xcc\x0b\xa1C5\xa0\xe8\xe5\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02E (esc)
> - \x00\x00\x00\x00\x00\x00\x00\x05H\x00\x00\x00b\x85\x00\x18\x9et\xa9\xe0G^\x82 \x93\xbc}\xb0\xd61\xae\xb0\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xdeB\x19n\xbe\xe4.\xf2\x84\xb6x (esc)
> + \x0cI\xd4\xa9\xc5\x01|\xf0pC\xf5NX\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95 \xee\xa7\x81\xbc\xca\x16\xc1\xe1Z\xcc\x0b\xa1C5\xa0\xe8\xe5\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02E (esc)
> + \x00\x00\x00\x00\x00\x00\x00\x05H\x00\x00\x00v\x85\x00\x18\x9et\xa9\xe0G^\x82 \x93\xbc}\xb0\xd61\xae\xb0\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xdeB\x19n\xbe\xe4.\xf2\x84\xb6x (esc)
> \x87\xcd\xc9n\x8e\xaa\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02H (esc)
> \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 (no-eol) (esc)
>
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
More information about the Mercurial-devel
mailing list