Mercurial > hg
comparison hgext/narrow/narrowwirepeer.py @ 42944:c2676b5a9f59
narrow: don't hexify paths and double-hexify known nodes on wire (BC)
It isn't obvious, but wireprototypes.encodelist() is meant only for
binary nodeids. So when we used it for encoding hex nodeids and paths,
the encoded result was surprising and hard to read.
This patch changes the encoding to make the list of paths a
comma-separated list and the list of common nodes to be a
encodelist()-encoded list of binary nodeids (so the result is just
singly-hexified nodeids).
This is clearly a breaking change, but the feature is experimental and
we're not aware of anyone running a server using this command yet.
Differential Revision: https://phab.mercurial-scm.org/D6851
author | Martin von Zweigbergk <martinvonz@google.com> |
---|---|
date | Thu, 12 Sep 2019 21:22:59 -0700 |
parents | a97b12f726e4 |
children | 2372284d9457 |
comparison
equal
deleted
inserted
replaced
42943:5fadf6103790 | 42944:c2676b5a9f59 |
---|---|
11 bundle2, | 11 bundle2, |
12 error, | 12 error, |
13 extensions, | 13 extensions, |
14 hg, | 14 hg, |
15 narrowspec, | 15 narrowspec, |
16 node as nodemod, | |
17 pycompat, | 16 pycompat, |
18 wireprototypes, | 17 wireprototypes, |
19 wireprotov1peer, | 18 wireprotov1peer, |
20 wireprotov1server, | 19 wireprotov1server, |
21 ) | 20 ) |
59 ellipses: whether to send ellipses data or not | 58 ellipses: whether to send ellipses data or not |
60 """ | 59 """ |
61 | 60 |
62 preferuncompressed = False | 61 preferuncompressed = False |
63 try: | 62 try: |
64 oldincludes = wireprototypes.decodelist(oldincludes) | 63 def splitpaths(data): |
65 newincludes = wireprototypes.decodelist(newincludes) | 64 # work around ''.split(',') => [''] |
66 oldexcludes = wireprototypes.decodelist(oldexcludes) | 65 return data.split(b',') if data else [] |
67 newexcludes = wireprototypes.decodelist(newexcludes) | 66 oldincludes = splitpaths(oldincludes) |
67 newincludes = splitpaths(newincludes) | |
68 oldexcludes = splitpaths(oldexcludes) | |
69 newexcludes = splitpaths(newexcludes) | |
68 # validate the patterns | 70 # validate the patterns |
69 narrowspec.validatepatterns(set(oldincludes)) | 71 narrowspec.validatepatterns(set(oldincludes)) |
70 narrowspec.validatepatterns(set(newincludes)) | 72 narrowspec.validatepatterns(set(newincludes)) |
71 narrowspec.validatepatterns(set(oldexcludes)) | 73 narrowspec.validatepatterns(set(oldexcludes)) |
72 narrowspec.validatepatterns(set(newexcludes)) | 74 narrowspec.validatepatterns(set(newexcludes)) |
73 | 75 |
74 common = wireprototypes.decodelist(commonheads) | 76 common = wireprototypes.decodelist(commonheads) |
75 known = wireprototypes.decodelist(known) | 77 known = wireprototypes.decodelist(known) |
76 known = {nodemod.bin(n) for n in known} | |
77 if ellipses == '0': | 78 if ellipses == '0': |
78 ellipses = False | 79 ellipses = False |
79 else: | 80 else: |
80 ellipses = bool(ellipses) | 81 ellipses = bool(ellipses) |
81 cgversion = cgversion | 82 cgversion = cgversion |
104 chunks = bundler.getchunks() | 105 chunks = bundler.getchunks() |
105 return wireprototypes.streamres(gen=chunks, | 106 return wireprototypes.streamres(gen=chunks, |
106 prefer_uncompressed=preferuncompressed) | 107 prefer_uncompressed=preferuncompressed) |
107 | 108 |
108 def peernarrowwiden(remote, **kwargs): | 109 def peernarrowwiden(remote, **kwargs): |
109 for ch in (r'oldincludes', r'newincludes', r'oldexcludes', r'newexcludes', | 110 for ch in (r'commonheads', r'known'): |
110 r'commonheads', r'known'): | |
111 kwargs[ch] = wireprototypes.encodelist(kwargs[ch]) | 111 kwargs[ch] = wireprototypes.encodelist(kwargs[ch]) |
112 | |
113 for ch in (r'oldincludes', r'newincludes', r'oldexcludes', r'newexcludes'): | |
114 kwargs[ch] = b','.join(kwargs[ch]) | |
112 | 115 |
113 kwargs[r'ellipses'] = '%i' % bool(kwargs[r'ellipses']) | 116 kwargs[r'ellipses'] = '%i' % bool(kwargs[r'ellipses']) |
114 f = remote._callcompressable('narrow_widen', **kwargs) | 117 f = remote._callcompressable('narrow_widen', **kwargs) |
115 return bundle2.getunbundler(remote.ui, f) | 118 return bundle2.getunbundler(remote.ui, f) |