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)