##// END OF EJS Templates
discovery: add a devel.discovery.exchange-heads...
marmoute -
r47034:6ee9bd69 default
parent child Browse files
Show More
@@ -1,2576 +1,2583 b''
1 # configitems.py - centralized declaration of configuration option
1 # configitems.py - centralized declaration of configuration option
2 #
2 #
3 # Copyright 2017 Pierre-Yves David <pierre-yves.david@octobus.net>
3 # Copyright 2017 Pierre-Yves David <pierre-yves.david@octobus.net>
4 #
4 #
5 # This software may be used and distributed according to the terms of the
5 # This software may be used and distributed according to the terms of the
6 # GNU General Public License version 2 or any later version.
6 # GNU General Public License version 2 or any later version.
7
7
8 from __future__ import absolute_import
8 from __future__ import absolute_import
9
9
10 import functools
10 import functools
11 import re
11 import re
12
12
13 from . import (
13 from . import (
14 encoding,
14 encoding,
15 error,
15 error,
16 )
16 )
17
17
18
18
19 def loadconfigtable(ui, extname, configtable):
19 def loadconfigtable(ui, extname, configtable):
20 """update config item known to the ui with the extension ones"""
20 """update config item known to the ui with the extension ones"""
21 for section, items in sorted(configtable.items()):
21 for section, items in sorted(configtable.items()):
22 knownitems = ui._knownconfig.setdefault(section, itemregister())
22 knownitems = ui._knownconfig.setdefault(section, itemregister())
23 knownkeys = set(knownitems)
23 knownkeys = set(knownitems)
24 newkeys = set(items)
24 newkeys = set(items)
25 for key in sorted(knownkeys & newkeys):
25 for key in sorted(knownkeys & newkeys):
26 msg = b"extension '%s' overwrite config item '%s.%s'"
26 msg = b"extension '%s' overwrite config item '%s.%s'"
27 msg %= (extname, section, key)
27 msg %= (extname, section, key)
28 ui.develwarn(msg, config=b'warn-config')
28 ui.develwarn(msg, config=b'warn-config')
29
29
30 knownitems.update(items)
30 knownitems.update(items)
31
31
32
32
33 class configitem(object):
33 class configitem(object):
34 """represent a known config item
34 """represent a known config item
35
35
36 :section: the official config section where to find this item,
36 :section: the official config section where to find this item,
37 :name: the official name within the section,
37 :name: the official name within the section,
38 :default: default value for this item,
38 :default: default value for this item,
39 :alias: optional list of tuples as alternatives,
39 :alias: optional list of tuples as alternatives,
40 :generic: this is a generic definition, match name using regular expression.
40 :generic: this is a generic definition, match name using regular expression.
41 """
41 """
42
42
43 def __init__(
43 def __init__(
44 self,
44 self,
45 section,
45 section,
46 name,
46 name,
47 default=None,
47 default=None,
48 alias=(),
48 alias=(),
49 generic=False,
49 generic=False,
50 priority=0,
50 priority=0,
51 experimental=False,
51 experimental=False,
52 ):
52 ):
53 self.section = section
53 self.section = section
54 self.name = name
54 self.name = name
55 self.default = default
55 self.default = default
56 self.alias = list(alias)
56 self.alias = list(alias)
57 self.generic = generic
57 self.generic = generic
58 self.priority = priority
58 self.priority = priority
59 self.experimental = experimental
59 self.experimental = experimental
60 self._re = None
60 self._re = None
61 if generic:
61 if generic:
62 self._re = re.compile(self.name)
62 self._re = re.compile(self.name)
63
63
64
64
65 class itemregister(dict):
65 class itemregister(dict):
66 """A specialized dictionary that can handle wild-card selection"""
66 """A specialized dictionary that can handle wild-card selection"""
67
67
68 def __init__(self):
68 def __init__(self):
69 super(itemregister, self).__init__()
69 super(itemregister, self).__init__()
70 self._generics = set()
70 self._generics = set()
71
71
72 def update(self, other):
72 def update(self, other):
73 super(itemregister, self).update(other)
73 super(itemregister, self).update(other)
74 self._generics.update(other._generics)
74 self._generics.update(other._generics)
75
75
76 def __setitem__(self, key, item):
76 def __setitem__(self, key, item):
77 super(itemregister, self).__setitem__(key, item)
77 super(itemregister, self).__setitem__(key, item)
78 if item.generic:
78 if item.generic:
79 self._generics.add(item)
79 self._generics.add(item)
80
80
81 def get(self, key):
81 def get(self, key):
82 baseitem = super(itemregister, self).get(key)
82 baseitem = super(itemregister, self).get(key)
83 if baseitem is not None and not baseitem.generic:
83 if baseitem is not None and not baseitem.generic:
84 return baseitem
84 return baseitem
85
85
86 # search for a matching generic item
86 # search for a matching generic item
87 generics = sorted(self._generics, key=(lambda x: (x.priority, x.name)))
87 generics = sorted(self._generics, key=(lambda x: (x.priority, x.name)))
88 for item in generics:
88 for item in generics:
89 # we use 'match' instead of 'search' to make the matching simpler
89 # we use 'match' instead of 'search' to make the matching simpler
90 # for people unfamiliar with regular expression. Having the match
90 # for people unfamiliar with regular expression. Having the match
91 # rooted to the start of the string will produce less surprising
91 # rooted to the start of the string will produce less surprising
92 # result for user writing simple regex for sub-attribute.
92 # result for user writing simple regex for sub-attribute.
93 #
93 #
94 # For example using "color\..*" match produces an unsurprising
94 # For example using "color\..*" match produces an unsurprising
95 # result, while using search could suddenly match apparently
95 # result, while using search could suddenly match apparently
96 # unrelated configuration that happens to contains "color."
96 # unrelated configuration that happens to contains "color."
97 # anywhere. This is a tradeoff where we favor requiring ".*" on
97 # anywhere. This is a tradeoff where we favor requiring ".*" on
98 # some match to avoid the need to prefix most pattern with "^".
98 # some match to avoid the need to prefix most pattern with "^".
99 # The "^" seems more error prone.
99 # The "^" seems more error prone.
100 if item._re.match(key):
100 if item._re.match(key):
101 return item
101 return item
102
102
103 return None
103 return None
104
104
105
105
106 coreitems = {}
106 coreitems = {}
107
107
108
108
109 def _register(configtable, *args, **kwargs):
109 def _register(configtable, *args, **kwargs):
110 item = configitem(*args, **kwargs)
110 item = configitem(*args, **kwargs)
111 section = configtable.setdefault(item.section, itemregister())
111 section = configtable.setdefault(item.section, itemregister())
112 if item.name in section:
112 if item.name in section:
113 msg = b"duplicated config item registration for '%s.%s'"
113 msg = b"duplicated config item registration for '%s.%s'"
114 raise error.ProgrammingError(msg % (item.section, item.name))
114 raise error.ProgrammingError(msg % (item.section, item.name))
115 section[item.name] = item
115 section[item.name] = item
116
116
117
117
118 # special value for case where the default is derived from other values
118 # special value for case where the default is derived from other values
119 dynamicdefault = object()
119 dynamicdefault = object()
120
120
121 # Registering actual config items
121 # Registering actual config items
122
122
123
123
124 def getitemregister(configtable):
124 def getitemregister(configtable):
125 f = functools.partial(_register, configtable)
125 f = functools.partial(_register, configtable)
126 # export pseudo enum as configitem.*
126 # export pseudo enum as configitem.*
127 f.dynamicdefault = dynamicdefault
127 f.dynamicdefault = dynamicdefault
128 return f
128 return f
129
129
130
130
131 coreconfigitem = getitemregister(coreitems)
131 coreconfigitem = getitemregister(coreitems)
132
132
133
133
134 def _registerdiffopts(section, configprefix=b''):
134 def _registerdiffopts(section, configprefix=b''):
135 coreconfigitem(
135 coreconfigitem(
136 section,
136 section,
137 configprefix + b'nodates',
137 configprefix + b'nodates',
138 default=False,
138 default=False,
139 )
139 )
140 coreconfigitem(
140 coreconfigitem(
141 section,
141 section,
142 configprefix + b'showfunc',
142 configprefix + b'showfunc',
143 default=False,
143 default=False,
144 )
144 )
145 coreconfigitem(
145 coreconfigitem(
146 section,
146 section,
147 configprefix + b'unified',
147 configprefix + b'unified',
148 default=None,
148 default=None,
149 )
149 )
150 coreconfigitem(
150 coreconfigitem(
151 section,
151 section,
152 configprefix + b'git',
152 configprefix + b'git',
153 default=False,
153 default=False,
154 )
154 )
155 coreconfigitem(
155 coreconfigitem(
156 section,
156 section,
157 configprefix + b'ignorews',
157 configprefix + b'ignorews',
158 default=False,
158 default=False,
159 )
159 )
160 coreconfigitem(
160 coreconfigitem(
161 section,
161 section,
162 configprefix + b'ignorewsamount',
162 configprefix + b'ignorewsamount',
163 default=False,
163 default=False,
164 )
164 )
165 coreconfigitem(
165 coreconfigitem(
166 section,
166 section,
167 configprefix + b'ignoreblanklines',
167 configprefix + b'ignoreblanklines',
168 default=False,
168 default=False,
169 )
169 )
170 coreconfigitem(
170 coreconfigitem(
171 section,
171 section,
172 configprefix + b'ignorewseol',
172 configprefix + b'ignorewseol',
173 default=False,
173 default=False,
174 )
174 )
175 coreconfigitem(
175 coreconfigitem(
176 section,
176 section,
177 configprefix + b'nobinary',
177 configprefix + b'nobinary',
178 default=False,
178 default=False,
179 )
179 )
180 coreconfigitem(
180 coreconfigitem(
181 section,
181 section,
182 configprefix + b'noprefix',
182 configprefix + b'noprefix',
183 default=False,
183 default=False,
184 )
184 )
185 coreconfigitem(
185 coreconfigitem(
186 section,
186 section,
187 configprefix + b'word-diff',
187 configprefix + b'word-diff',
188 default=False,
188 default=False,
189 )
189 )
190
190
191
191
192 coreconfigitem(
192 coreconfigitem(
193 b'alias',
193 b'alias',
194 b'.*',
194 b'.*',
195 default=dynamicdefault,
195 default=dynamicdefault,
196 generic=True,
196 generic=True,
197 )
197 )
198 coreconfigitem(
198 coreconfigitem(
199 b'auth',
199 b'auth',
200 b'cookiefile',
200 b'cookiefile',
201 default=None,
201 default=None,
202 )
202 )
203 _registerdiffopts(section=b'annotate')
203 _registerdiffopts(section=b'annotate')
204 # bookmarks.pushing: internal hack for discovery
204 # bookmarks.pushing: internal hack for discovery
205 coreconfigitem(
205 coreconfigitem(
206 b'bookmarks',
206 b'bookmarks',
207 b'pushing',
207 b'pushing',
208 default=list,
208 default=list,
209 )
209 )
210 # bundle.mainreporoot: internal hack for bundlerepo
210 # bundle.mainreporoot: internal hack for bundlerepo
211 coreconfigitem(
211 coreconfigitem(
212 b'bundle',
212 b'bundle',
213 b'mainreporoot',
213 b'mainreporoot',
214 default=b'',
214 default=b'',
215 )
215 )
216 coreconfigitem(
216 coreconfigitem(
217 b'censor',
217 b'censor',
218 b'policy',
218 b'policy',
219 default=b'abort',
219 default=b'abort',
220 experimental=True,
220 experimental=True,
221 )
221 )
222 coreconfigitem(
222 coreconfigitem(
223 b'chgserver',
223 b'chgserver',
224 b'idletimeout',
224 b'idletimeout',
225 default=3600,
225 default=3600,
226 )
226 )
227 coreconfigitem(
227 coreconfigitem(
228 b'chgserver',
228 b'chgserver',
229 b'skiphash',
229 b'skiphash',
230 default=False,
230 default=False,
231 )
231 )
232 coreconfigitem(
232 coreconfigitem(
233 b'cmdserver',
233 b'cmdserver',
234 b'log',
234 b'log',
235 default=None,
235 default=None,
236 )
236 )
237 coreconfigitem(
237 coreconfigitem(
238 b'cmdserver',
238 b'cmdserver',
239 b'max-log-files',
239 b'max-log-files',
240 default=7,
240 default=7,
241 )
241 )
242 coreconfigitem(
242 coreconfigitem(
243 b'cmdserver',
243 b'cmdserver',
244 b'max-log-size',
244 b'max-log-size',
245 default=b'1 MB',
245 default=b'1 MB',
246 )
246 )
247 coreconfigitem(
247 coreconfigitem(
248 b'cmdserver',
248 b'cmdserver',
249 b'max-repo-cache',
249 b'max-repo-cache',
250 default=0,
250 default=0,
251 experimental=True,
251 experimental=True,
252 )
252 )
253 coreconfigitem(
253 coreconfigitem(
254 b'cmdserver',
254 b'cmdserver',
255 b'message-encodings',
255 b'message-encodings',
256 default=list,
256 default=list,
257 )
257 )
258 coreconfigitem(
258 coreconfigitem(
259 b'cmdserver',
259 b'cmdserver',
260 b'track-log',
260 b'track-log',
261 default=lambda: [b'chgserver', b'cmdserver', b'repocache'],
261 default=lambda: [b'chgserver', b'cmdserver', b'repocache'],
262 )
262 )
263 coreconfigitem(
263 coreconfigitem(
264 b'cmdserver',
264 b'cmdserver',
265 b'shutdown-on-interrupt',
265 b'shutdown-on-interrupt',
266 default=True,
266 default=True,
267 )
267 )
268 coreconfigitem(
268 coreconfigitem(
269 b'color',
269 b'color',
270 b'.*',
270 b'.*',
271 default=None,
271 default=None,
272 generic=True,
272 generic=True,
273 )
273 )
274 coreconfigitem(
274 coreconfigitem(
275 b'color',
275 b'color',
276 b'mode',
276 b'mode',
277 default=b'auto',
277 default=b'auto',
278 )
278 )
279 coreconfigitem(
279 coreconfigitem(
280 b'color',
280 b'color',
281 b'pagermode',
281 b'pagermode',
282 default=dynamicdefault,
282 default=dynamicdefault,
283 )
283 )
284 coreconfigitem(
284 coreconfigitem(
285 b'command-templates',
285 b'command-templates',
286 b'graphnode',
286 b'graphnode',
287 default=None,
287 default=None,
288 alias=[(b'ui', b'graphnodetemplate')],
288 alias=[(b'ui', b'graphnodetemplate')],
289 )
289 )
290 coreconfigitem(
290 coreconfigitem(
291 b'command-templates',
291 b'command-templates',
292 b'log',
292 b'log',
293 default=None,
293 default=None,
294 alias=[(b'ui', b'logtemplate')],
294 alias=[(b'ui', b'logtemplate')],
295 )
295 )
296 coreconfigitem(
296 coreconfigitem(
297 b'command-templates',
297 b'command-templates',
298 b'mergemarker',
298 b'mergemarker',
299 default=(
299 default=(
300 b'{node|short} '
300 b'{node|short} '
301 b'{ifeq(tags, "tip", "", '
301 b'{ifeq(tags, "tip", "", '
302 b'ifeq(tags, "", "", "{tags} "))}'
302 b'ifeq(tags, "", "", "{tags} "))}'
303 b'{if(bookmarks, "{bookmarks} ")}'
303 b'{if(bookmarks, "{bookmarks} ")}'
304 b'{ifeq(branch, "default", "", "{branch} ")}'
304 b'{ifeq(branch, "default", "", "{branch} ")}'
305 b'- {author|user}: {desc|firstline}'
305 b'- {author|user}: {desc|firstline}'
306 ),
306 ),
307 alias=[(b'ui', b'mergemarkertemplate')],
307 alias=[(b'ui', b'mergemarkertemplate')],
308 )
308 )
309 coreconfigitem(
309 coreconfigitem(
310 b'command-templates',
310 b'command-templates',
311 b'pre-merge-tool-output',
311 b'pre-merge-tool-output',
312 default=None,
312 default=None,
313 alias=[(b'ui', b'pre-merge-tool-output-template')],
313 alias=[(b'ui', b'pre-merge-tool-output-template')],
314 )
314 )
315 coreconfigitem(
315 coreconfigitem(
316 b'command-templates',
316 b'command-templates',
317 b'oneline-summary',
317 b'oneline-summary',
318 default=None,
318 default=None,
319 )
319 )
320 coreconfigitem(
320 coreconfigitem(
321 b'command-templates',
321 b'command-templates',
322 b'oneline-summary.*',
322 b'oneline-summary.*',
323 default=dynamicdefault,
323 default=dynamicdefault,
324 generic=True,
324 generic=True,
325 )
325 )
326 _registerdiffopts(section=b'commands', configprefix=b'commit.interactive.')
326 _registerdiffopts(section=b'commands', configprefix=b'commit.interactive.')
327 coreconfigitem(
327 coreconfigitem(
328 b'commands',
328 b'commands',
329 b'commit.post-status',
329 b'commit.post-status',
330 default=False,
330 default=False,
331 )
331 )
332 coreconfigitem(
332 coreconfigitem(
333 b'commands',
333 b'commands',
334 b'grep.all-files',
334 b'grep.all-files',
335 default=False,
335 default=False,
336 experimental=True,
336 experimental=True,
337 )
337 )
338 coreconfigitem(
338 coreconfigitem(
339 b'commands',
339 b'commands',
340 b'merge.require-rev',
340 b'merge.require-rev',
341 default=False,
341 default=False,
342 )
342 )
343 coreconfigitem(
343 coreconfigitem(
344 b'commands',
344 b'commands',
345 b'push.require-revs',
345 b'push.require-revs',
346 default=False,
346 default=False,
347 )
347 )
348 coreconfigitem(
348 coreconfigitem(
349 b'commands',
349 b'commands',
350 b'resolve.confirm',
350 b'resolve.confirm',
351 default=False,
351 default=False,
352 )
352 )
353 coreconfigitem(
353 coreconfigitem(
354 b'commands',
354 b'commands',
355 b'resolve.explicit-re-merge',
355 b'resolve.explicit-re-merge',
356 default=False,
356 default=False,
357 )
357 )
358 coreconfigitem(
358 coreconfigitem(
359 b'commands',
359 b'commands',
360 b'resolve.mark-check',
360 b'resolve.mark-check',
361 default=b'none',
361 default=b'none',
362 )
362 )
363 _registerdiffopts(section=b'commands', configprefix=b'revert.interactive.')
363 _registerdiffopts(section=b'commands', configprefix=b'revert.interactive.')
364 coreconfigitem(
364 coreconfigitem(
365 b'commands',
365 b'commands',
366 b'show.aliasprefix',
366 b'show.aliasprefix',
367 default=list,
367 default=list,
368 )
368 )
369 coreconfigitem(
369 coreconfigitem(
370 b'commands',
370 b'commands',
371 b'status.relative',
371 b'status.relative',
372 default=False,
372 default=False,
373 )
373 )
374 coreconfigitem(
374 coreconfigitem(
375 b'commands',
375 b'commands',
376 b'status.skipstates',
376 b'status.skipstates',
377 default=[],
377 default=[],
378 experimental=True,
378 experimental=True,
379 )
379 )
380 coreconfigitem(
380 coreconfigitem(
381 b'commands',
381 b'commands',
382 b'status.terse',
382 b'status.terse',
383 default=b'',
383 default=b'',
384 )
384 )
385 coreconfigitem(
385 coreconfigitem(
386 b'commands',
386 b'commands',
387 b'status.verbose',
387 b'status.verbose',
388 default=False,
388 default=False,
389 )
389 )
390 coreconfigitem(
390 coreconfigitem(
391 b'commands',
391 b'commands',
392 b'update.check',
392 b'update.check',
393 default=None,
393 default=None,
394 )
394 )
395 coreconfigitem(
395 coreconfigitem(
396 b'commands',
396 b'commands',
397 b'update.requiredest',
397 b'update.requiredest',
398 default=False,
398 default=False,
399 )
399 )
400 coreconfigitem(
400 coreconfigitem(
401 b'committemplate',
401 b'committemplate',
402 b'.*',
402 b'.*',
403 default=None,
403 default=None,
404 generic=True,
404 generic=True,
405 )
405 )
406 coreconfigitem(
406 coreconfigitem(
407 b'convert',
407 b'convert',
408 b'bzr.saverev',
408 b'bzr.saverev',
409 default=True,
409 default=True,
410 )
410 )
411 coreconfigitem(
411 coreconfigitem(
412 b'convert',
412 b'convert',
413 b'cvsps.cache',
413 b'cvsps.cache',
414 default=True,
414 default=True,
415 )
415 )
416 coreconfigitem(
416 coreconfigitem(
417 b'convert',
417 b'convert',
418 b'cvsps.fuzz',
418 b'cvsps.fuzz',
419 default=60,
419 default=60,
420 )
420 )
421 coreconfigitem(
421 coreconfigitem(
422 b'convert',
422 b'convert',
423 b'cvsps.logencoding',
423 b'cvsps.logencoding',
424 default=None,
424 default=None,
425 )
425 )
426 coreconfigitem(
426 coreconfigitem(
427 b'convert',
427 b'convert',
428 b'cvsps.mergefrom',
428 b'cvsps.mergefrom',
429 default=None,
429 default=None,
430 )
430 )
431 coreconfigitem(
431 coreconfigitem(
432 b'convert',
432 b'convert',
433 b'cvsps.mergeto',
433 b'cvsps.mergeto',
434 default=None,
434 default=None,
435 )
435 )
436 coreconfigitem(
436 coreconfigitem(
437 b'convert',
437 b'convert',
438 b'git.committeractions',
438 b'git.committeractions',
439 default=lambda: [b'messagedifferent'],
439 default=lambda: [b'messagedifferent'],
440 )
440 )
441 coreconfigitem(
441 coreconfigitem(
442 b'convert',
442 b'convert',
443 b'git.extrakeys',
443 b'git.extrakeys',
444 default=list,
444 default=list,
445 )
445 )
446 coreconfigitem(
446 coreconfigitem(
447 b'convert',
447 b'convert',
448 b'git.findcopiesharder',
448 b'git.findcopiesharder',
449 default=False,
449 default=False,
450 )
450 )
451 coreconfigitem(
451 coreconfigitem(
452 b'convert',
452 b'convert',
453 b'git.remoteprefix',
453 b'git.remoteprefix',
454 default=b'remote',
454 default=b'remote',
455 )
455 )
456 coreconfigitem(
456 coreconfigitem(
457 b'convert',
457 b'convert',
458 b'git.renamelimit',
458 b'git.renamelimit',
459 default=400,
459 default=400,
460 )
460 )
461 coreconfigitem(
461 coreconfigitem(
462 b'convert',
462 b'convert',
463 b'git.saverev',
463 b'git.saverev',
464 default=True,
464 default=True,
465 )
465 )
466 coreconfigitem(
466 coreconfigitem(
467 b'convert',
467 b'convert',
468 b'git.similarity',
468 b'git.similarity',
469 default=50,
469 default=50,
470 )
470 )
471 coreconfigitem(
471 coreconfigitem(
472 b'convert',
472 b'convert',
473 b'git.skipsubmodules',
473 b'git.skipsubmodules',
474 default=False,
474 default=False,
475 )
475 )
476 coreconfigitem(
476 coreconfigitem(
477 b'convert',
477 b'convert',
478 b'hg.clonebranches',
478 b'hg.clonebranches',
479 default=False,
479 default=False,
480 )
480 )
481 coreconfigitem(
481 coreconfigitem(
482 b'convert',
482 b'convert',
483 b'hg.ignoreerrors',
483 b'hg.ignoreerrors',
484 default=False,
484 default=False,
485 )
485 )
486 coreconfigitem(
486 coreconfigitem(
487 b'convert',
487 b'convert',
488 b'hg.preserve-hash',
488 b'hg.preserve-hash',
489 default=False,
489 default=False,
490 )
490 )
491 coreconfigitem(
491 coreconfigitem(
492 b'convert',
492 b'convert',
493 b'hg.revs',
493 b'hg.revs',
494 default=None,
494 default=None,
495 )
495 )
496 coreconfigitem(
496 coreconfigitem(
497 b'convert',
497 b'convert',
498 b'hg.saverev',
498 b'hg.saverev',
499 default=False,
499 default=False,
500 )
500 )
501 coreconfigitem(
501 coreconfigitem(
502 b'convert',
502 b'convert',
503 b'hg.sourcename',
503 b'hg.sourcename',
504 default=None,
504 default=None,
505 )
505 )
506 coreconfigitem(
506 coreconfigitem(
507 b'convert',
507 b'convert',
508 b'hg.startrev',
508 b'hg.startrev',
509 default=None,
509 default=None,
510 )
510 )
511 coreconfigitem(
511 coreconfigitem(
512 b'convert',
512 b'convert',
513 b'hg.tagsbranch',
513 b'hg.tagsbranch',
514 default=b'default',
514 default=b'default',
515 )
515 )
516 coreconfigitem(
516 coreconfigitem(
517 b'convert',
517 b'convert',
518 b'hg.usebranchnames',
518 b'hg.usebranchnames',
519 default=True,
519 default=True,
520 )
520 )
521 coreconfigitem(
521 coreconfigitem(
522 b'convert',
522 b'convert',
523 b'ignoreancestorcheck',
523 b'ignoreancestorcheck',
524 default=False,
524 default=False,
525 experimental=True,
525 experimental=True,
526 )
526 )
527 coreconfigitem(
527 coreconfigitem(
528 b'convert',
528 b'convert',
529 b'localtimezone',
529 b'localtimezone',
530 default=False,
530 default=False,
531 )
531 )
532 coreconfigitem(
532 coreconfigitem(
533 b'convert',
533 b'convert',
534 b'p4.encoding',
534 b'p4.encoding',
535 default=dynamicdefault,
535 default=dynamicdefault,
536 )
536 )
537 coreconfigitem(
537 coreconfigitem(
538 b'convert',
538 b'convert',
539 b'p4.startrev',
539 b'p4.startrev',
540 default=0,
540 default=0,
541 )
541 )
542 coreconfigitem(
542 coreconfigitem(
543 b'convert',
543 b'convert',
544 b'skiptags',
544 b'skiptags',
545 default=False,
545 default=False,
546 )
546 )
547 coreconfigitem(
547 coreconfigitem(
548 b'convert',
548 b'convert',
549 b'svn.debugsvnlog',
549 b'svn.debugsvnlog',
550 default=True,
550 default=True,
551 )
551 )
552 coreconfigitem(
552 coreconfigitem(
553 b'convert',
553 b'convert',
554 b'svn.trunk',
554 b'svn.trunk',
555 default=None,
555 default=None,
556 )
556 )
557 coreconfigitem(
557 coreconfigitem(
558 b'convert',
558 b'convert',
559 b'svn.tags',
559 b'svn.tags',
560 default=None,
560 default=None,
561 )
561 )
562 coreconfigitem(
562 coreconfigitem(
563 b'convert',
563 b'convert',
564 b'svn.branches',
564 b'svn.branches',
565 default=None,
565 default=None,
566 )
566 )
567 coreconfigitem(
567 coreconfigitem(
568 b'convert',
568 b'convert',
569 b'svn.startrev',
569 b'svn.startrev',
570 default=0,
570 default=0,
571 )
571 )
572 coreconfigitem(
572 coreconfigitem(
573 b'debug',
573 b'debug',
574 b'dirstate.delaywrite',
574 b'dirstate.delaywrite',
575 default=0,
575 default=0,
576 )
576 )
577 coreconfigitem(
577 coreconfigitem(
578 b'defaults',
578 b'defaults',
579 b'.*',
579 b'.*',
580 default=None,
580 default=None,
581 generic=True,
581 generic=True,
582 )
582 )
583 coreconfigitem(
583 coreconfigitem(
584 b'devel',
584 b'devel',
585 b'all-warnings',
585 b'all-warnings',
586 default=False,
586 default=False,
587 )
587 )
588 coreconfigitem(
588 coreconfigitem(
589 b'devel',
589 b'devel',
590 b'bundle2.debug',
590 b'bundle2.debug',
591 default=False,
591 default=False,
592 )
592 )
593 coreconfigitem(
593 coreconfigitem(
594 b'devel',
594 b'devel',
595 b'bundle.delta',
595 b'bundle.delta',
596 default=b'',
596 default=b'',
597 )
597 )
598 coreconfigitem(
598 coreconfigitem(
599 b'devel',
599 b'devel',
600 b'cache-vfs',
600 b'cache-vfs',
601 default=None,
601 default=None,
602 )
602 )
603 coreconfigitem(
603 coreconfigitem(
604 b'devel',
604 b'devel',
605 b'check-locks',
605 b'check-locks',
606 default=False,
606 default=False,
607 )
607 )
608 coreconfigitem(
608 coreconfigitem(
609 b'devel',
609 b'devel',
610 b'check-relroot',
610 b'check-relroot',
611 default=False,
611 default=False,
612 )
612 )
613 coreconfigitem(
613 coreconfigitem(
614 b'devel',
614 b'devel',
615 b'default-date',
615 b'default-date',
616 default=None,
616 default=None,
617 )
617 )
618 coreconfigitem(
618 coreconfigitem(
619 b'devel',
619 b'devel',
620 b'deprec-warn',
620 b'deprec-warn',
621 default=False,
621 default=False,
622 )
622 )
623 coreconfigitem(
623 coreconfigitem(
624 b'devel',
624 b'devel',
625 b'disableloaddefaultcerts',
625 b'disableloaddefaultcerts',
626 default=False,
626 default=False,
627 )
627 )
628 coreconfigitem(
628 coreconfigitem(
629 b'devel',
629 b'devel',
630 b'warn-empty-changegroup',
630 b'warn-empty-changegroup',
631 default=False,
631 default=False,
632 )
632 )
633 coreconfigitem(
633 coreconfigitem(
634 b'devel',
634 b'devel',
635 b'legacy.exchange',
635 b'legacy.exchange',
636 default=list,
636 default=list,
637 )
637 )
638 # When True, revlogs use a special reference version of the nodemap, that is not
638 # When True, revlogs use a special reference version of the nodemap, that is not
639 # performant but is "known" to behave properly.
639 # performant but is "known" to behave properly.
640 coreconfigitem(
640 coreconfigitem(
641 b'devel',
641 b'devel',
642 b'persistent-nodemap',
642 b'persistent-nodemap',
643 default=False,
643 default=False,
644 )
644 )
645 coreconfigitem(
645 coreconfigitem(
646 b'devel',
646 b'devel',
647 b'servercafile',
647 b'servercafile',
648 default=b'',
648 default=b'',
649 )
649 )
650 coreconfigitem(
650 coreconfigitem(
651 b'devel',
651 b'devel',
652 b'serverexactprotocol',
652 b'serverexactprotocol',
653 default=b'',
653 default=b'',
654 )
654 )
655 coreconfigitem(
655 coreconfigitem(
656 b'devel',
656 b'devel',
657 b'serverrequirecert',
657 b'serverrequirecert',
658 default=False,
658 default=False,
659 )
659 )
660 coreconfigitem(
660 coreconfigitem(
661 b'devel',
661 b'devel',
662 b'strip-obsmarkers',
662 b'strip-obsmarkers',
663 default=True,
663 default=True,
664 )
664 )
665 coreconfigitem(
665 coreconfigitem(
666 b'devel',
666 b'devel',
667 b'warn-config',
667 b'warn-config',
668 default=None,
668 default=None,
669 )
669 )
670 coreconfigitem(
670 coreconfigitem(
671 b'devel',
671 b'devel',
672 b'warn-config-default',
672 b'warn-config-default',
673 default=None,
673 default=None,
674 )
674 )
675 coreconfigitem(
675 coreconfigitem(
676 b'devel',
676 b'devel',
677 b'user.obsmarker',
677 b'user.obsmarker',
678 default=None,
678 default=None,
679 )
679 )
680 coreconfigitem(
680 coreconfigitem(
681 b'devel',
681 b'devel',
682 b'warn-config-unknown',
682 b'warn-config-unknown',
683 default=None,
683 default=None,
684 )
684 )
685 coreconfigitem(
685 coreconfigitem(
686 b'devel',
686 b'devel',
687 b'debug.copies',
687 b'debug.copies',
688 default=False,
688 default=False,
689 )
689 )
690 coreconfigitem(
690 coreconfigitem(
691 b'devel',
691 b'devel',
692 b'debug.extensions',
692 b'debug.extensions',
693 default=False,
693 default=False,
694 )
694 )
695 coreconfigitem(
695 coreconfigitem(
696 b'devel',
696 b'devel',
697 b'debug.repo-filters',
697 b'debug.repo-filters',
698 default=False,
698 default=False,
699 )
699 )
700 coreconfigitem(
700 coreconfigitem(
701 b'devel',
701 b'devel',
702 b'debug.peer-request',
702 b'debug.peer-request',
703 default=False,
703 default=False,
704 )
704 )
705 # If discovery.exchange-heads is False, the discovery will not start with
706 # remote head fetching and local head querying.
707 coreconfigitem(
708 b'devel',
709 b'discovery.exchange-heads',
710 default=True,
711 )
705 # If discovery.grow-sample is False, the sample size used in set discovery will
712 # If discovery.grow-sample is False, the sample size used in set discovery will
706 # not be increased through the process
713 # not be increased through the process
707 coreconfigitem(
714 coreconfigitem(
708 b'devel',
715 b'devel',
709 b'discovery.grow-sample',
716 b'discovery.grow-sample',
710 default=True,
717 default=True,
711 )
718 )
712 # discovery.grow-sample.rate control the rate at which the sample grow
719 # discovery.grow-sample.rate control the rate at which the sample grow
713 coreconfigitem(
720 coreconfigitem(
714 b'devel',
721 b'devel',
715 b'discovery.grow-sample.rate',
722 b'discovery.grow-sample.rate',
716 default=1.05,
723 default=1.05,
717 )
724 )
718 # If discovery.randomize is False, random sampling during discovery are
725 # If discovery.randomize is False, random sampling during discovery are
719 # deterministic. It is meant for integration tests.
726 # deterministic. It is meant for integration tests.
720 coreconfigitem(
727 coreconfigitem(
721 b'devel',
728 b'devel',
722 b'discovery.randomize',
729 b'discovery.randomize',
723 default=True,
730 default=True,
724 )
731 )
725 _registerdiffopts(section=b'diff')
732 _registerdiffopts(section=b'diff')
726 coreconfigitem(
733 coreconfigitem(
727 b'email',
734 b'email',
728 b'bcc',
735 b'bcc',
729 default=None,
736 default=None,
730 )
737 )
731 coreconfigitem(
738 coreconfigitem(
732 b'email',
739 b'email',
733 b'cc',
740 b'cc',
734 default=None,
741 default=None,
735 )
742 )
736 coreconfigitem(
743 coreconfigitem(
737 b'email',
744 b'email',
738 b'charsets',
745 b'charsets',
739 default=list,
746 default=list,
740 )
747 )
741 coreconfigitem(
748 coreconfigitem(
742 b'email',
749 b'email',
743 b'from',
750 b'from',
744 default=None,
751 default=None,
745 )
752 )
746 coreconfigitem(
753 coreconfigitem(
747 b'email',
754 b'email',
748 b'method',
755 b'method',
749 default=b'smtp',
756 default=b'smtp',
750 )
757 )
751 coreconfigitem(
758 coreconfigitem(
752 b'email',
759 b'email',
753 b'reply-to',
760 b'reply-to',
754 default=None,
761 default=None,
755 )
762 )
756 coreconfigitem(
763 coreconfigitem(
757 b'email',
764 b'email',
758 b'to',
765 b'to',
759 default=None,
766 default=None,
760 )
767 )
761 coreconfigitem(
768 coreconfigitem(
762 b'experimental',
769 b'experimental',
763 b'archivemetatemplate',
770 b'archivemetatemplate',
764 default=dynamicdefault,
771 default=dynamicdefault,
765 )
772 )
766 coreconfigitem(
773 coreconfigitem(
767 b'experimental',
774 b'experimental',
768 b'auto-publish',
775 b'auto-publish',
769 default=b'publish',
776 default=b'publish',
770 )
777 )
771 coreconfigitem(
778 coreconfigitem(
772 b'experimental',
779 b'experimental',
773 b'bundle-phases',
780 b'bundle-phases',
774 default=False,
781 default=False,
775 )
782 )
776 coreconfigitem(
783 coreconfigitem(
777 b'experimental',
784 b'experimental',
778 b'bundle2-advertise',
785 b'bundle2-advertise',
779 default=True,
786 default=True,
780 )
787 )
781 coreconfigitem(
788 coreconfigitem(
782 b'experimental',
789 b'experimental',
783 b'bundle2-output-capture',
790 b'bundle2-output-capture',
784 default=False,
791 default=False,
785 )
792 )
786 coreconfigitem(
793 coreconfigitem(
787 b'experimental',
794 b'experimental',
788 b'bundle2.pushback',
795 b'bundle2.pushback',
789 default=False,
796 default=False,
790 )
797 )
791 coreconfigitem(
798 coreconfigitem(
792 b'experimental',
799 b'experimental',
793 b'bundle2lazylocking',
800 b'bundle2lazylocking',
794 default=False,
801 default=False,
795 )
802 )
796 coreconfigitem(
803 coreconfigitem(
797 b'experimental',
804 b'experimental',
798 b'bundlecomplevel',
805 b'bundlecomplevel',
799 default=None,
806 default=None,
800 )
807 )
801 coreconfigitem(
808 coreconfigitem(
802 b'experimental',
809 b'experimental',
803 b'bundlecomplevel.bzip2',
810 b'bundlecomplevel.bzip2',
804 default=None,
811 default=None,
805 )
812 )
806 coreconfigitem(
813 coreconfigitem(
807 b'experimental',
814 b'experimental',
808 b'bundlecomplevel.gzip',
815 b'bundlecomplevel.gzip',
809 default=None,
816 default=None,
810 )
817 )
811 coreconfigitem(
818 coreconfigitem(
812 b'experimental',
819 b'experimental',
813 b'bundlecomplevel.none',
820 b'bundlecomplevel.none',
814 default=None,
821 default=None,
815 )
822 )
816 coreconfigitem(
823 coreconfigitem(
817 b'experimental',
824 b'experimental',
818 b'bundlecomplevel.zstd',
825 b'bundlecomplevel.zstd',
819 default=None,
826 default=None,
820 )
827 )
821 coreconfigitem(
828 coreconfigitem(
822 b'experimental',
829 b'experimental',
823 b'changegroup3',
830 b'changegroup3',
824 default=False,
831 default=False,
825 )
832 )
826 coreconfigitem(
833 coreconfigitem(
827 b'experimental',
834 b'experimental',
828 b'cleanup-as-archived',
835 b'cleanup-as-archived',
829 default=False,
836 default=False,
830 )
837 )
831 coreconfigitem(
838 coreconfigitem(
832 b'experimental',
839 b'experimental',
833 b'clientcompressionengines',
840 b'clientcompressionengines',
834 default=list,
841 default=list,
835 )
842 )
836 coreconfigitem(
843 coreconfigitem(
837 b'experimental',
844 b'experimental',
838 b'copytrace',
845 b'copytrace',
839 default=b'on',
846 default=b'on',
840 )
847 )
841 coreconfigitem(
848 coreconfigitem(
842 b'experimental',
849 b'experimental',
843 b'copytrace.movecandidateslimit',
850 b'copytrace.movecandidateslimit',
844 default=100,
851 default=100,
845 )
852 )
846 coreconfigitem(
853 coreconfigitem(
847 b'experimental',
854 b'experimental',
848 b'copytrace.sourcecommitlimit',
855 b'copytrace.sourcecommitlimit',
849 default=100,
856 default=100,
850 )
857 )
851 coreconfigitem(
858 coreconfigitem(
852 b'experimental',
859 b'experimental',
853 b'copies.read-from',
860 b'copies.read-from',
854 default=b"filelog-only",
861 default=b"filelog-only",
855 )
862 )
856 coreconfigitem(
863 coreconfigitem(
857 b'experimental',
864 b'experimental',
858 b'copies.write-to',
865 b'copies.write-to',
859 default=b'filelog-only',
866 default=b'filelog-only',
860 )
867 )
861 coreconfigitem(
868 coreconfigitem(
862 b'experimental',
869 b'experimental',
863 b'crecordtest',
870 b'crecordtest',
864 default=None,
871 default=None,
865 )
872 )
866 coreconfigitem(
873 coreconfigitem(
867 b'experimental',
874 b'experimental',
868 b'directaccess',
875 b'directaccess',
869 default=False,
876 default=False,
870 )
877 )
871 coreconfigitem(
878 coreconfigitem(
872 b'experimental',
879 b'experimental',
873 b'directaccess.revnums',
880 b'directaccess.revnums',
874 default=False,
881 default=False,
875 )
882 )
876 coreconfigitem(
883 coreconfigitem(
877 b'experimental',
884 b'experimental',
878 b'editortmpinhg',
885 b'editortmpinhg',
879 default=False,
886 default=False,
880 )
887 )
881 coreconfigitem(
888 coreconfigitem(
882 b'experimental',
889 b'experimental',
883 b'evolution',
890 b'evolution',
884 default=list,
891 default=list,
885 )
892 )
886 coreconfigitem(
893 coreconfigitem(
887 b'experimental',
894 b'experimental',
888 b'evolution.allowdivergence',
895 b'evolution.allowdivergence',
889 default=False,
896 default=False,
890 alias=[(b'experimental', b'allowdivergence')],
897 alias=[(b'experimental', b'allowdivergence')],
891 )
898 )
892 coreconfigitem(
899 coreconfigitem(
893 b'experimental',
900 b'experimental',
894 b'evolution.allowunstable',
901 b'evolution.allowunstable',
895 default=None,
902 default=None,
896 )
903 )
897 coreconfigitem(
904 coreconfigitem(
898 b'experimental',
905 b'experimental',
899 b'evolution.createmarkers',
906 b'evolution.createmarkers',
900 default=None,
907 default=None,
901 )
908 )
902 coreconfigitem(
909 coreconfigitem(
903 b'experimental',
910 b'experimental',
904 b'evolution.effect-flags',
911 b'evolution.effect-flags',
905 default=True,
912 default=True,
906 alias=[(b'experimental', b'effect-flags')],
913 alias=[(b'experimental', b'effect-flags')],
907 )
914 )
908 coreconfigitem(
915 coreconfigitem(
909 b'experimental',
916 b'experimental',
910 b'evolution.exchange',
917 b'evolution.exchange',
911 default=None,
918 default=None,
912 )
919 )
913 coreconfigitem(
920 coreconfigitem(
914 b'experimental',
921 b'experimental',
915 b'evolution.bundle-obsmarker',
922 b'evolution.bundle-obsmarker',
916 default=False,
923 default=False,
917 )
924 )
918 coreconfigitem(
925 coreconfigitem(
919 b'experimental',
926 b'experimental',
920 b'evolution.bundle-obsmarker:mandatory',
927 b'evolution.bundle-obsmarker:mandatory',
921 default=True,
928 default=True,
922 )
929 )
923 coreconfigitem(
930 coreconfigitem(
924 b'experimental',
931 b'experimental',
925 b'log.topo',
932 b'log.topo',
926 default=False,
933 default=False,
927 )
934 )
928 coreconfigitem(
935 coreconfigitem(
929 b'experimental',
936 b'experimental',
930 b'evolution.report-instabilities',
937 b'evolution.report-instabilities',
931 default=True,
938 default=True,
932 )
939 )
933 coreconfigitem(
940 coreconfigitem(
934 b'experimental',
941 b'experimental',
935 b'evolution.track-operation',
942 b'evolution.track-operation',
936 default=True,
943 default=True,
937 )
944 )
938 # repo-level config to exclude a revset visibility
945 # repo-level config to exclude a revset visibility
939 #
946 #
940 # The target use case is to use `share` to expose different subset of the same
947 # The target use case is to use `share` to expose different subset of the same
941 # repository, especially server side. See also `server.view`.
948 # repository, especially server side. See also `server.view`.
942 coreconfigitem(
949 coreconfigitem(
943 b'experimental',
950 b'experimental',
944 b'extra-filter-revs',
951 b'extra-filter-revs',
945 default=None,
952 default=None,
946 )
953 )
947 coreconfigitem(
954 coreconfigitem(
948 b'experimental',
955 b'experimental',
949 b'maxdeltachainspan',
956 b'maxdeltachainspan',
950 default=-1,
957 default=-1,
951 )
958 )
952 # tracks files which were undeleted (merge might delete them but we explicitly
959 # tracks files which were undeleted (merge might delete them but we explicitly
953 # kept/undeleted them) and creates new filenodes for them
960 # kept/undeleted them) and creates new filenodes for them
954 coreconfigitem(
961 coreconfigitem(
955 b'experimental',
962 b'experimental',
956 b'merge-track-salvaged',
963 b'merge-track-salvaged',
957 default=False,
964 default=False,
958 )
965 )
959 coreconfigitem(
966 coreconfigitem(
960 b'experimental',
967 b'experimental',
961 b'mergetempdirprefix',
968 b'mergetempdirprefix',
962 default=None,
969 default=None,
963 )
970 )
964 coreconfigitem(
971 coreconfigitem(
965 b'experimental',
972 b'experimental',
966 b'mmapindexthreshold',
973 b'mmapindexthreshold',
967 default=None,
974 default=None,
968 )
975 )
969 coreconfigitem(
976 coreconfigitem(
970 b'experimental',
977 b'experimental',
971 b'narrow',
978 b'narrow',
972 default=False,
979 default=False,
973 )
980 )
974 coreconfigitem(
981 coreconfigitem(
975 b'experimental',
982 b'experimental',
976 b'nonnormalparanoidcheck',
983 b'nonnormalparanoidcheck',
977 default=False,
984 default=False,
978 )
985 )
979 coreconfigitem(
986 coreconfigitem(
980 b'experimental',
987 b'experimental',
981 b'exportableenviron',
988 b'exportableenviron',
982 default=list,
989 default=list,
983 )
990 )
984 coreconfigitem(
991 coreconfigitem(
985 b'experimental',
992 b'experimental',
986 b'extendedheader.index',
993 b'extendedheader.index',
987 default=None,
994 default=None,
988 )
995 )
989 coreconfigitem(
996 coreconfigitem(
990 b'experimental',
997 b'experimental',
991 b'extendedheader.similarity',
998 b'extendedheader.similarity',
992 default=False,
999 default=False,
993 )
1000 )
994 coreconfigitem(
1001 coreconfigitem(
995 b'experimental',
1002 b'experimental',
996 b'graphshorten',
1003 b'graphshorten',
997 default=False,
1004 default=False,
998 )
1005 )
999 coreconfigitem(
1006 coreconfigitem(
1000 b'experimental',
1007 b'experimental',
1001 b'graphstyle.parent',
1008 b'graphstyle.parent',
1002 default=dynamicdefault,
1009 default=dynamicdefault,
1003 )
1010 )
1004 coreconfigitem(
1011 coreconfigitem(
1005 b'experimental',
1012 b'experimental',
1006 b'graphstyle.missing',
1013 b'graphstyle.missing',
1007 default=dynamicdefault,
1014 default=dynamicdefault,
1008 )
1015 )
1009 coreconfigitem(
1016 coreconfigitem(
1010 b'experimental',
1017 b'experimental',
1011 b'graphstyle.grandparent',
1018 b'graphstyle.grandparent',
1012 default=dynamicdefault,
1019 default=dynamicdefault,
1013 )
1020 )
1014 coreconfigitem(
1021 coreconfigitem(
1015 b'experimental',
1022 b'experimental',
1016 b'hook-track-tags',
1023 b'hook-track-tags',
1017 default=False,
1024 default=False,
1018 )
1025 )
1019 coreconfigitem(
1026 coreconfigitem(
1020 b'experimental',
1027 b'experimental',
1021 b'httppeer.advertise-v2',
1028 b'httppeer.advertise-v2',
1022 default=False,
1029 default=False,
1023 )
1030 )
1024 coreconfigitem(
1031 coreconfigitem(
1025 b'experimental',
1032 b'experimental',
1026 b'httppeer.v2-encoder-order',
1033 b'httppeer.v2-encoder-order',
1027 default=None,
1034 default=None,
1028 )
1035 )
1029 coreconfigitem(
1036 coreconfigitem(
1030 b'experimental',
1037 b'experimental',
1031 b'httppostargs',
1038 b'httppostargs',
1032 default=False,
1039 default=False,
1033 )
1040 )
1034 coreconfigitem(b'experimental', b'nointerrupt', default=False)
1041 coreconfigitem(b'experimental', b'nointerrupt', default=False)
1035 coreconfigitem(b'experimental', b'nointerrupt-interactiveonly', default=True)
1042 coreconfigitem(b'experimental', b'nointerrupt-interactiveonly', default=True)
1036
1043
1037 coreconfigitem(
1044 coreconfigitem(
1038 b'experimental',
1045 b'experimental',
1039 b'obsmarkers-exchange-debug',
1046 b'obsmarkers-exchange-debug',
1040 default=False,
1047 default=False,
1041 )
1048 )
1042 coreconfigitem(
1049 coreconfigitem(
1043 b'experimental',
1050 b'experimental',
1044 b'remotenames',
1051 b'remotenames',
1045 default=False,
1052 default=False,
1046 )
1053 )
1047 coreconfigitem(
1054 coreconfigitem(
1048 b'experimental',
1055 b'experimental',
1049 b'removeemptydirs',
1056 b'removeemptydirs',
1050 default=True,
1057 default=True,
1051 )
1058 )
1052 coreconfigitem(
1059 coreconfigitem(
1053 b'experimental',
1060 b'experimental',
1054 b'revert.interactive.select-to-keep',
1061 b'revert.interactive.select-to-keep',
1055 default=False,
1062 default=False,
1056 )
1063 )
1057 coreconfigitem(
1064 coreconfigitem(
1058 b'experimental',
1065 b'experimental',
1059 b'revisions.prefixhexnode',
1066 b'revisions.prefixhexnode',
1060 default=False,
1067 default=False,
1061 )
1068 )
1062 coreconfigitem(
1069 coreconfigitem(
1063 b'experimental',
1070 b'experimental',
1064 b'revlogv2',
1071 b'revlogv2',
1065 default=None,
1072 default=None,
1066 )
1073 )
1067 coreconfigitem(
1074 coreconfigitem(
1068 b'experimental',
1075 b'experimental',
1069 b'revisions.disambiguatewithin',
1076 b'revisions.disambiguatewithin',
1070 default=None,
1077 default=None,
1071 )
1078 )
1072 coreconfigitem(
1079 coreconfigitem(
1073 b'experimental',
1080 b'experimental',
1074 b'rust.index',
1081 b'rust.index',
1075 default=False,
1082 default=False,
1076 )
1083 )
1077 coreconfigitem(
1084 coreconfigitem(
1078 b'experimental',
1085 b'experimental',
1079 b'server.filesdata.recommended-batch-size',
1086 b'server.filesdata.recommended-batch-size',
1080 default=50000,
1087 default=50000,
1081 )
1088 )
1082 coreconfigitem(
1089 coreconfigitem(
1083 b'experimental',
1090 b'experimental',
1084 b'server.manifestdata.recommended-batch-size',
1091 b'server.manifestdata.recommended-batch-size',
1085 default=100000,
1092 default=100000,
1086 )
1093 )
1087 coreconfigitem(
1094 coreconfigitem(
1088 b'experimental',
1095 b'experimental',
1089 b'server.stream-narrow-clones',
1096 b'server.stream-narrow-clones',
1090 default=False,
1097 default=False,
1091 )
1098 )
1092 coreconfigitem(
1099 coreconfigitem(
1093 b'experimental',
1100 b'experimental',
1094 b'sharesafe-auto-downgrade-shares',
1101 b'sharesafe-auto-downgrade-shares',
1095 default=False,
1102 default=False,
1096 )
1103 )
1097 coreconfigitem(
1104 coreconfigitem(
1098 b'experimental',
1105 b'experimental',
1099 b'sharesafe-auto-upgrade-shares',
1106 b'sharesafe-auto-upgrade-shares',
1100 default=False,
1107 default=False,
1101 )
1108 )
1102 coreconfigitem(
1109 coreconfigitem(
1103 b'experimental',
1110 b'experimental',
1104 b'sharesafe-auto-upgrade-fail-error',
1111 b'sharesafe-auto-upgrade-fail-error',
1105 default=False,
1112 default=False,
1106 )
1113 )
1107 coreconfigitem(
1114 coreconfigitem(
1108 b'experimental',
1115 b'experimental',
1109 b'sharesafe-warn-outdated-shares',
1116 b'sharesafe-warn-outdated-shares',
1110 default=True,
1117 default=True,
1111 )
1118 )
1112 coreconfigitem(
1119 coreconfigitem(
1113 b'experimental',
1120 b'experimental',
1114 b'single-head-per-branch',
1121 b'single-head-per-branch',
1115 default=False,
1122 default=False,
1116 )
1123 )
1117 coreconfigitem(
1124 coreconfigitem(
1118 b'experimental',
1125 b'experimental',
1119 b'single-head-per-branch:account-closed-heads',
1126 b'single-head-per-branch:account-closed-heads',
1120 default=False,
1127 default=False,
1121 )
1128 )
1122 coreconfigitem(
1129 coreconfigitem(
1123 b'experimental',
1130 b'experimental',
1124 b'single-head-per-branch:public-changes-only',
1131 b'single-head-per-branch:public-changes-only',
1125 default=False,
1132 default=False,
1126 )
1133 )
1127 coreconfigitem(
1134 coreconfigitem(
1128 b'experimental',
1135 b'experimental',
1129 b'sshserver.support-v2',
1136 b'sshserver.support-v2',
1130 default=False,
1137 default=False,
1131 )
1138 )
1132 coreconfigitem(
1139 coreconfigitem(
1133 b'experimental',
1140 b'experimental',
1134 b'sparse-read',
1141 b'sparse-read',
1135 default=False,
1142 default=False,
1136 )
1143 )
1137 coreconfigitem(
1144 coreconfigitem(
1138 b'experimental',
1145 b'experimental',
1139 b'sparse-read.density-threshold',
1146 b'sparse-read.density-threshold',
1140 default=0.50,
1147 default=0.50,
1141 )
1148 )
1142 coreconfigitem(
1149 coreconfigitem(
1143 b'experimental',
1150 b'experimental',
1144 b'sparse-read.min-gap-size',
1151 b'sparse-read.min-gap-size',
1145 default=b'65K',
1152 default=b'65K',
1146 )
1153 )
1147 coreconfigitem(
1154 coreconfigitem(
1148 b'experimental',
1155 b'experimental',
1149 b'treemanifest',
1156 b'treemanifest',
1150 default=False,
1157 default=False,
1151 )
1158 )
1152 coreconfigitem(
1159 coreconfigitem(
1153 b'experimental',
1160 b'experimental',
1154 b'update.atomic-file',
1161 b'update.atomic-file',
1155 default=False,
1162 default=False,
1156 )
1163 )
1157 coreconfigitem(
1164 coreconfigitem(
1158 b'experimental',
1165 b'experimental',
1159 b'sshpeer.advertise-v2',
1166 b'sshpeer.advertise-v2',
1160 default=False,
1167 default=False,
1161 )
1168 )
1162 coreconfigitem(
1169 coreconfigitem(
1163 b'experimental',
1170 b'experimental',
1164 b'web.apiserver',
1171 b'web.apiserver',
1165 default=False,
1172 default=False,
1166 )
1173 )
1167 coreconfigitem(
1174 coreconfigitem(
1168 b'experimental',
1175 b'experimental',
1169 b'web.api.http-v2',
1176 b'web.api.http-v2',
1170 default=False,
1177 default=False,
1171 )
1178 )
1172 coreconfigitem(
1179 coreconfigitem(
1173 b'experimental',
1180 b'experimental',
1174 b'web.api.debugreflect',
1181 b'web.api.debugreflect',
1175 default=False,
1182 default=False,
1176 )
1183 )
1177 coreconfigitem(
1184 coreconfigitem(
1178 b'experimental',
1185 b'experimental',
1179 b'worker.wdir-get-thread-safe',
1186 b'worker.wdir-get-thread-safe',
1180 default=False,
1187 default=False,
1181 )
1188 )
1182 coreconfigitem(
1189 coreconfigitem(
1183 b'experimental',
1190 b'experimental',
1184 b'worker.repository-upgrade',
1191 b'worker.repository-upgrade',
1185 default=False,
1192 default=False,
1186 )
1193 )
1187 coreconfigitem(
1194 coreconfigitem(
1188 b'experimental',
1195 b'experimental',
1189 b'xdiff',
1196 b'xdiff',
1190 default=False,
1197 default=False,
1191 )
1198 )
1192 coreconfigitem(
1199 coreconfigitem(
1193 b'extensions',
1200 b'extensions',
1194 b'.*',
1201 b'.*',
1195 default=None,
1202 default=None,
1196 generic=True,
1203 generic=True,
1197 )
1204 )
1198 coreconfigitem(
1205 coreconfigitem(
1199 b'extdata',
1206 b'extdata',
1200 b'.*',
1207 b'.*',
1201 default=None,
1208 default=None,
1202 generic=True,
1209 generic=True,
1203 )
1210 )
1204 coreconfigitem(
1211 coreconfigitem(
1205 b'format',
1212 b'format',
1206 b'bookmarks-in-store',
1213 b'bookmarks-in-store',
1207 default=False,
1214 default=False,
1208 )
1215 )
1209 coreconfigitem(
1216 coreconfigitem(
1210 b'format',
1217 b'format',
1211 b'chunkcachesize',
1218 b'chunkcachesize',
1212 default=None,
1219 default=None,
1213 experimental=True,
1220 experimental=True,
1214 )
1221 )
1215 coreconfigitem(
1222 coreconfigitem(
1216 b'format',
1223 b'format',
1217 b'dotencode',
1224 b'dotencode',
1218 default=True,
1225 default=True,
1219 )
1226 )
1220 coreconfigitem(
1227 coreconfigitem(
1221 b'format',
1228 b'format',
1222 b'generaldelta',
1229 b'generaldelta',
1223 default=False,
1230 default=False,
1224 experimental=True,
1231 experimental=True,
1225 )
1232 )
1226 coreconfigitem(
1233 coreconfigitem(
1227 b'format',
1234 b'format',
1228 b'manifestcachesize',
1235 b'manifestcachesize',
1229 default=None,
1236 default=None,
1230 experimental=True,
1237 experimental=True,
1231 )
1238 )
1232 coreconfigitem(
1239 coreconfigitem(
1233 b'format',
1240 b'format',
1234 b'maxchainlen',
1241 b'maxchainlen',
1235 default=dynamicdefault,
1242 default=dynamicdefault,
1236 experimental=True,
1243 experimental=True,
1237 )
1244 )
1238 coreconfigitem(
1245 coreconfigitem(
1239 b'format',
1246 b'format',
1240 b'obsstore-version',
1247 b'obsstore-version',
1241 default=None,
1248 default=None,
1242 )
1249 )
1243 coreconfigitem(
1250 coreconfigitem(
1244 b'format',
1251 b'format',
1245 b'sparse-revlog',
1252 b'sparse-revlog',
1246 default=True,
1253 default=True,
1247 )
1254 )
1248 coreconfigitem(
1255 coreconfigitem(
1249 b'format',
1256 b'format',
1250 b'revlog-compression',
1257 b'revlog-compression',
1251 default=lambda: [b'zlib'],
1258 default=lambda: [b'zlib'],
1252 alias=[(b'experimental', b'format.compression')],
1259 alias=[(b'experimental', b'format.compression')],
1253 )
1260 )
1254 coreconfigitem(
1261 coreconfigitem(
1255 b'format',
1262 b'format',
1256 b'usefncache',
1263 b'usefncache',
1257 default=True,
1264 default=True,
1258 )
1265 )
1259 coreconfigitem(
1266 coreconfigitem(
1260 b'format',
1267 b'format',
1261 b'usegeneraldelta',
1268 b'usegeneraldelta',
1262 default=True,
1269 default=True,
1263 )
1270 )
1264 coreconfigitem(
1271 coreconfigitem(
1265 b'format',
1272 b'format',
1266 b'usestore',
1273 b'usestore',
1267 default=True,
1274 default=True,
1268 )
1275 )
1269 coreconfigitem(
1276 coreconfigitem(
1270 b'format',
1277 b'format',
1271 b'use-persistent-nodemap',
1278 b'use-persistent-nodemap',
1272 default=False,
1279 default=False,
1273 )
1280 )
1274 coreconfigitem(
1281 coreconfigitem(
1275 b'format',
1282 b'format',
1276 b'exp-use-copies-side-data-changeset',
1283 b'exp-use-copies-side-data-changeset',
1277 default=False,
1284 default=False,
1278 experimental=True,
1285 experimental=True,
1279 )
1286 )
1280 coreconfigitem(
1287 coreconfigitem(
1281 b'format',
1288 b'format',
1282 b'exp-use-side-data',
1289 b'exp-use-side-data',
1283 default=False,
1290 default=False,
1284 experimental=True,
1291 experimental=True,
1285 )
1292 )
1286 coreconfigitem(
1293 coreconfigitem(
1287 b'format',
1294 b'format',
1288 b'exp-share-safe',
1295 b'exp-share-safe',
1289 default=False,
1296 default=False,
1290 experimental=True,
1297 experimental=True,
1291 )
1298 )
1292 coreconfigitem(
1299 coreconfigitem(
1293 b'format',
1300 b'format',
1294 b'internal-phase',
1301 b'internal-phase',
1295 default=False,
1302 default=False,
1296 experimental=True,
1303 experimental=True,
1297 )
1304 )
1298 coreconfigitem(
1305 coreconfigitem(
1299 b'fsmonitor',
1306 b'fsmonitor',
1300 b'warn_when_unused',
1307 b'warn_when_unused',
1301 default=True,
1308 default=True,
1302 )
1309 )
1303 coreconfigitem(
1310 coreconfigitem(
1304 b'fsmonitor',
1311 b'fsmonitor',
1305 b'warn_update_file_count',
1312 b'warn_update_file_count',
1306 default=50000,
1313 default=50000,
1307 )
1314 )
1308 coreconfigitem(
1315 coreconfigitem(
1309 b'fsmonitor',
1316 b'fsmonitor',
1310 b'warn_update_file_count_rust',
1317 b'warn_update_file_count_rust',
1311 default=400000,
1318 default=400000,
1312 )
1319 )
1313 coreconfigitem(
1320 coreconfigitem(
1314 b'help',
1321 b'help',
1315 br'hidden-command\..*',
1322 br'hidden-command\..*',
1316 default=False,
1323 default=False,
1317 generic=True,
1324 generic=True,
1318 )
1325 )
1319 coreconfigitem(
1326 coreconfigitem(
1320 b'help',
1327 b'help',
1321 br'hidden-topic\..*',
1328 br'hidden-topic\..*',
1322 default=False,
1329 default=False,
1323 generic=True,
1330 generic=True,
1324 )
1331 )
1325 coreconfigitem(
1332 coreconfigitem(
1326 b'hooks',
1333 b'hooks',
1327 b'.*',
1334 b'.*',
1328 default=dynamicdefault,
1335 default=dynamicdefault,
1329 generic=True,
1336 generic=True,
1330 )
1337 )
1331 coreconfigitem(
1338 coreconfigitem(
1332 b'hgweb-paths',
1339 b'hgweb-paths',
1333 b'.*',
1340 b'.*',
1334 default=list,
1341 default=list,
1335 generic=True,
1342 generic=True,
1336 )
1343 )
1337 coreconfigitem(
1344 coreconfigitem(
1338 b'hostfingerprints',
1345 b'hostfingerprints',
1339 b'.*',
1346 b'.*',
1340 default=list,
1347 default=list,
1341 generic=True,
1348 generic=True,
1342 )
1349 )
1343 coreconfigitem(
1350 coreconfigitem(
1344 b'hostsecurity',
1351 b'hostsecurity',
1345 b'ciphers',
1352 b'ciphers',
1346 default=None,
1353 default=None,
1347 )
1354 )
1348 coreconfigitem(
1355 coreconfigitem(
1349 b'hostsecurity',
1356 b'hostsecurity',
1350 b'minimumprotocol',
1357 b'minimumprotocol',
1351 default=dynamicdefault,
1358 default=dynamicdefault,
1352 )
1359 )
1353 coreconfigitem(
1360 coreconfigitem(
1354 b'hostsecurity',
1361 b'hostsecurity',
1355 b'.*:minimumprotocol$',
1362 b'.*:minimumprotocol$',
1356 default=dynamicdefault,
1363 default=dynamicdefault,
1357 generic=True,
1364 generic=True,
1358 )
1365 )
1359 coreconfigitem(
1366 coreconfigitem(
1360 b'hostsecurity',
1367 b'hostsecurity',
1361 b'.*:ciphers$',
1368 b'.*:ciphers$',
1362 default=dynamicdefault,
1369 default=dynamicdefault,
1363 generic=True,
1370 generic=True,
1364 )
1371 )
1365 coreconfigitem(
1372 coreconfigitem(
1366 b'hostsecurity',
1373 b'hostsecurity',
1367 b'.*:fingerprints$',
1374 b'.*:fingerprints$',
1368 default=list,
1375 default=list,
1369 generic=True,
1376 generic=True,
1370 )
1377 )
1371 coreconfigitem(
1378 coreconfigitem(
1372 b'hostsecurity',
1379 b'hostsecurity',
1373 b'.*:verifycertsfile$',
1380 b'.*:verifycertsfile$',
1374 default=None,
1381 default=None,
1375 generic=True,
1382 generic=True,
1376 )
1383 )
1377
1384
1378 coreconfigitem(
1385 coreconfigitem(
1379 b'http_proxy',
1386 b'http_proxy',
1380 b'always',
1387 b'always',
1381 default=False,
1388 default=False,
1382 )
1389 )
1383 coreconfigitem(
1390 coreconfigitem(
1384 b'http_proxy',
1391 b'http_proxy',
1385 b'host',
1392 b'host',
1386 default=None,
1393 default=None,
1387 )
1394 )
1388 coreconfigitem(
1395 coreconfigitem(
1389 b'http_proxy',
1396 b'http_proxy',
1390 b'no',
1397 b'no',
1391 default=list,
1398 default=list,
1392 )
1399 )
1393 coreconfigitem(
1400 coreconfigitem(
1394 b'http_proxy',
1401 b'http_proxy',
1395 b'passwd',
1402 b'passwd',
1396 default=None,
1403 default=None,
1397 )
1404 )
1398 coreconfigitem(
1405 coreconfigitem(
1399 b'http_proxy',
1406 b'http_proxy',
1400 b'user',
1407 b'user',
1401 default=None,
1408 default=None,
1402 )
1409 )
1403
1410
1404 coreconfigitem(
1411 coreconfigitem(
1405 b'http',
1412 b'http',
1406 b'timeout',
1413 b'timeout',
1407 default=None,
1414 default=None,
1408 )
1415 )
1409
1416
1410 coreconfigitem(
1417 coreconfigitem(
1411 b'logtoprocess',
1418 b'logtoprocess',
1412 b'commandexception',
1419 b'commandexception',
1413 default=None,
1420 default=None,
1414 )
1421 )
1415 coreconfigitem(
1422 coreconfigitem(
1416 b'logtoprocess',
1423 b'logtoprocess',
1417 b'commandfinish',
1424 b'commandfinish',
1418 default=None,
1425 default=None,
1419 )
1426 )
1420 coreconfigitem(
1427 coreconfigitem(
1421 b'logtoprocess',
1428 b'logtoprocess',
1422 b'command',
1429 b'command',
1423 default=None,
1430 default=None,
1424 )
1431 )
1425 coreconfigitem(
1432 coreconfigitem(
1426 b'logtoprocess',
1433 b'logtoprocess',
1427 b'develwarn',
1434 b'develwarn',
1428 default=None,
1435 default=None,
1429 )
1436 )
1430 coreconfigitem(
1437 coreconfigitem(
1431 b'logtoprocess',
1438 b'logtoprocess',
1432 b'uiblocked',
1439 b'uiblocked',
1433 default=None,
1440 default=None,
1434 )
1441 )
1435 coreconfigitem(
1442 coreconfigitem(
1436 b'merge',
1443 b'merge',
1437 b'checkunknown',
1444 b'checkunknown',
1438 default=b'abort',
1445 default=b'abort',
1439 )
1446 )
1440 coreconfigitem(
1447 coreconfigitem(
1441 b'merge',
1448 b'merge',
1442 b'checkignored',
1449 b'checkignored',
1443 default=b'abort',
1450 default=b'abort',
1444 )
1451 )
1445 coreconfigitem(
1452 coreconfigitem(
1446 b'experimental',
1453 b'experimental',
1447 b'merge.checkpathconflicts',
1454 b'merge.checkpathconflicts',
1448 default=False,
1455 default=False,
1449 )
1456 )
1450 coreconfigitem(
1457 coreconfigitem(
1451 b'merge',
1458 b'merge',
1452 b'followcopies',
1459 b'followcopies',
1453 default=True,
1460 default=True,
1454 )
1461 )
1455 coreconfigitem(
1462 coreconfigitem(
1456 b'merge',
1463 b'merge',
1457 b'on-failure',
1464 b'on-failure',
1458 default=b'continue',
1465 default=b'continue',
1459 )
1466 )
1460 coreconfigitem(
1467 coreconfigitem(
1461 b'merge',
1468 b'merge',
1462 b'preferancestor',
1469 b'preferancestor',
1463 default=lambda: [b'*'],
1470 default=lambda: [b'*'],
1464 experimental=True,
1471 experimental=True,
1465 )
1472 )
1466 coreconfigitem(
1473 coreconfigitem(
1467 b'merge',
1474 b'merge',
1468 b'strict-capability-check',
1475 b'strict-capability-check',
1469 default=False,
1476 default=False,
1470 )
1477 )
1471 coreconfigitem(
1478 coreconfigitem(
1472 b'merge-tools',
1479 b'merge-tools',
1473 b'.*',
1480 b'.*',
1474 default=None,
1481 default=None,
1475 generic=True,
1482 generic=True,
1476 )
1483 )
1477 coreconfigitem(
1484 coreconfigitem(
1478 b'merge-tools',
1485 b'merge-tools',
1479 br'.*\.args$',
1486 br'.*\.args$',
1480 default=b"$local $base $other",
1487 default=b"$local $base $other",
1481 generic=True,
1488 generic=True,
1482 priority=-1,
1489 priority=-1,
1483 )
1490 )
1484 coreconfigitem(
1491 coreconfigitem(
1485 b'merge-tools',
1492 b'merge-tools',
1486 br'.*\.binary$',
1493 br'.*\.binary$',
1487 default=False,
1494 default=False,
1488 generic=True,
1495 generic=True,
1489 priority=-1,
1496 priority=-1,
1490 )
1497 )
1491 coreconfigitem(
1498 coreconfigitem(
1492 b'merge-tools',
1499 b'merge-tools',
1493 br'.*\.check$',
1500 br'.*\.check$',
1494 default=list,
1501 default=list,
1495 generic=True,
1502 generic=True,
1496 priority=-1,
1503 priority=-1,
1497 )
1504 )
1498 coreconfigitem(
1505 coreconfigitem(
1499 b'merge-tools',
1506 b'merge-tools',
1500 br'.*\.checkchanged$',
1507 br'.*\.checkchanged$',
1501 default=False,
1508 default=False,
1502 generic=True,
1509 generic=True,
1503 priority=-1,
1510 priority=-1,
1504 )
1511 )
1505 coreconfigitem(
1512 coreconfigitem(
1506 b'merge-tools',
1513 b'merge-tools',
1507 br'.*\.executable$',
1514 br'.*\.executable$',
1508 default=dynamicdefault,
1515 default=dynamicdefault,
1509 generic=True,
1516 generic=True,
1510 priority=-1,
1517 priority=-1,
1511 )
1518 )
1512 coreconfigitem(
1519 coreconfigitem(
1513 b'merge-tools',
1520 b'merge-tools',
1514 br'.*\.fixeol$',
1521 br'.*\.fixeol$',
1515 default=False,
1522 default=False,
1516 generic=True,
1523 generic=True,
1517 priority=-1,
1524 priority=-1,
1518 )
1525 )
1519 coreconfigitem(
1526 coreconfigitem(
1520 b'merge-tools',
1527 b'merge-tools',
1521 br'.*\.gui$',
1528 br'.*\.gui$',
1522 default=False,
1529 default=False,
1523 generic=True,
1530 generic=True,
1524 priority=-1,
1531 priority=-1,
1525 )
1532 )
1526 coreconfigitem(
1533 coreconfigitem(
1527 b'merge-tools',
1534 b'merge-tools',
1528 br'.*\.mergemarkers$',
1535 br'.*\.mergemarkers$',
1529 default=b'basic',
1536 default=b'basic',
1530 generic=True,
1537 generic=True,
1531 priority=-1,
1538 priority=-1,
1532 )
1539 )
1533 coreconfigitem(
1540 coreconfigitem(
1534 b'merge-tools',
1541 b'merge-tools',
1535 br'.*\.mergemarkertemplate$',
1542 br'.*\.mergemarkertemplate$',
1536 default=dynamicdefault, # take from command-templates.mergemarker
1543 default=dynamicdefault, # take from command-templates.mergemarker
1537 generic=True,
1544 generic=True,
1538 priority=-1,
1545 priority=-1,
1539 )
1546 )
1540 coreconfigitem(
1547 coreconfigitem(
1541 b'merge-tools',
1548 b'merge-tools',
1542 br'.*\.priority$',
1549 br'.*\.priority$',
1543 default=0,
1550 default=0,
1544 generic=True,
1551 generic=True,
1545 priority=-1,
1552 priority=-1,
1546 )
1553 )
1547 coreconfigitem(
1554 coreconfigitem(
1548 b'merge-tools',
1555 b'merge-tools',
1549 br'.*\.premerge$',
1556 br'.*\.premerge$',
1550 default=dynamicdefault,
1557 default=dynamicdefault,
1551 generic=True,
1558 generic=True,
1552 priority=-1,
1559 priority=-1,
1553 )
1560 )
1554 coreconfigitem(
1561 coreconfigitem(
1555 b'merge-tools',
1562 b'merge-tools',
1556 br'.*\.symlink$',
1563 br'.*\.symlink$',
1557 default=False,
1564 default=False,
1558 generic=True,
1565 generic=True,
1559 priority=-1,
1566 priority=-1,
1560 )
1567 )
1561 coreconfigitem(
1568 coreconfigitem(
1562 b'pager',
1569 b'pager',
1563 b'attend-.*',
1570 b'attend-.*',
1564 default=dynamicdefault,
1571 default=dynamicdefault,
1565 generic=True,
1572 generic=True,
1566 )
1573 )
1567 coreconfigitem(
1574 coreconfigitem(
1568 b'pager',
1575 b'pager',
1569 b'ignore',
1576 b'ignore',
1570 default=list,
1577 default=list,
1571 )
1578 )
1572 coreconfigitem(
1579 coreconfigitem(
1573 b'pager',
1580 b'pager',
1574 b'pager',
1581 b'pager',
1575 default=dynamicdefault,
1582 default=dynamicdefault,
1576 )
1583 )
1577 coreconfigitem(
1584 coreconfigitem(
1578 b'patch',
1585 b'patch',
1579 b'eol',
1586 b'eol',
1580 default=b'strict',
1587 default=b'strict',
1581 )
1588 )
1582 coreconfigitem(
1589 coreconfigitem(
1583 b'patch',
1590 b'patch',
1584 b'fuzz',
1591 b'fuzz',
1585 default=2,
1592 default=2,
1586 )
1593 )
1587 coreconfigitem(
1594 coreconfigitem(
1588 b'paths',
1595 b'paths',
1589 b'default',
1596 b'default',
1590 default=None,
1597 default=None,
1591 )
1598 )
1592 coreconfigitem(
1599 coreconfigitem(
1593 b'paths',
1600 b'paths',
1594 b'default-push',
1601 b'default-push',
1595 default=None,
1602 default=None,
1596 )
1603 )
1597 coreconfigitem(
1604 coreconfigitem(
1598 b'paths',
1605 b'paths',
1599 b'.*',
1606 b'.*',
1600 default=None,
1607 default=None,
1601 generic=True,
1608 generic=True,
1602 )
1609 )
1603 coreconfigitem(
1610 coreconfigitem(
1604 b'phases',
1611 b'phases',
1605 b'checksubrepos',
1612 b'checksubrepos',
1606 default=b'follow',
1613 default=b'follow',
1607 )
1614 )
1608 coreconfigitem(
1615 coreconfigitem(
1609 b'phases',
1616 b'phases',
1610 b'new-commit',
1617 b'new-commit',
1611 default=b'draft',
1618 default=b'draft',
1612 )
1619 )
1613 coreconfigitem(
1620 coreconfigitem(
1614 b'phases',
1621 b'phases',
1615 b'publish',
1622 b'publish',
1616 default=True,
1623 default=True,
1617 )
1624 )
1618 coreconfigitem(
1625 coreconfigitem(
1619 b'profiling',
1626 b'profiling',
1620 b'enabled',
1627 b'enabled',
1621 default=False,
1628 default=False,
1622 )
1629 )
1623 coreconfigitem(
1630 coreconfigitem(
1624 b'profiling',
1631 b'profiling',
1625 b'format',
1632 b'format',
1626 default=b'text',
1633 default=b'text',
1627 )
1634 )
1628 coreconfigitem(
1635 coreconfigitem(
1629 b'profiling',
1636 b'profiling',
1630 b'freq',
1637 b'freq',
1631 default=1000,
1638 default=1000,
1632 )
1639 )
1633 coreconfigitem(
1640 coreconfigitem(
1634 b'profiling',
1641 b'profiling',
1635 b'limit',
1642 b'limit',
1636 default=30,
1643 default=30,
1637 )
1644 )
1638 coreconfigitem(
1645 coreconfigitem(
1639 b'profiling',
1646 b'profiling',
1640 b'nested',
1647 b'nested',
1641 default=0,
1648 default=0,
1642 )
1649 )
1643 coreconfigitem(
1650 coreconfigitem(
1644 b'profiling',
1651 b'profiling',
1645 b'output',
1652 b'output',
1646 default=None,
1653 default=None,
1647 )
1654 )
1648 coreconfigitem(
1655 coreconfigitem(
1649 b'profiling',
1656 b'profiling',
1650 b'showmax',
1657 b'showmax',
1651 default=0.999,
1658 default=0.999,
1652 )
1659 )
1653 coreconfigitem(
1660 coreconfigitem(
1654 b'profiling',
1661 b'profiling',
1655 b'showmin',
1662 b'showmin',
1656 default=dynamicdefault,
1663 default=dynamicdefault,
1657 )
1664 )
1658 coreconfigitem(
1665 coreconfigitem(
1659 b'profiling',
1666 b'profiling',
1660 b'showtime',
1667 b'showtime',
1661 default=True,
1668 default=True,
1662 )
1669 )
1663 coreconfigitem(
1670 coreconfigitem(
1664 b'profiling',
1671 b'profiling',
1665 b'sort',
1672 b'sort',
1666 default=b'inlinetime',
1673 default=b'inlinetime',
1667 )
1674 )
1668 coreconfigitem(
1675 coreconfigitem(
1669 b'profiling',
1676 b'profiling',
1670 b'statformat',
1677 b'statformat',
1671 default=b'hotpath',
1678 default=b'hotpath',
1672 )
1679 )
1673 coreconfigitem(
1680 coreconfigitem(
1674 b'profiling',
1681 b'profiling',
1675 b'time-track',
1682 b'time-track',
1676 default=dynamicdefault,
1683 default=dynamicdefault,
1677 )
1684 )
1678 coreconfigitem(
1685 coreconfigitem(
1679 b'profiling',
1686 b'profiling',
1680 b'type',
1687 b'type',
1681 default=b'stat',
1688 default=b'stat',
1682 )
1689 )
1683 coreconfigitem(
1690 coreconfigitem(
1684 b'progress',
1691 b'progress',
1685 b'assume-tty',
1692 b'assume-tty',
1686 default=False,
1693 default=False,
1687 )
1694 )
1688 coreconfigitem(
1695 coreconfigitem(
1689 b'progress',
1696 b'progress',
1690 b'changedelay',
1697 b'changedelay',
1691 default=1,
1698 default=1,
1692 )
1699 )
1693 coreconfigitem(
1700 coreconfigitem(
1694 b'progress',
1701 b'progress',
1695 b'clear-complete',
1702 b'clear-complete',
1696 default=True,
1703 default=True,
1697 )
1704 )
1698 coreconfigitem(
1705 coreconfigitem(
1699 b'progress',
1706 b'progress',
1700 b'debug',
1707 b'debug',
1701 default=False,
1708 default=False,
1702 )
1709 )
1703 coreconfigitem(
1710 coreconfigitem(
1704 b'progress',
1711 b'progress',
1705 b'delay',
1712 b'delay',
1706 default=3,
1713 default=3,
1707 )
1714 )
1708 coreconfigitem(
1715 coreconfigitem(
1709 b'progress',
1716 b'progress',
1710 b'disable',
1717 b'disable',
1711 default=False,
1718 default=False,
1712 )
1719 )
1713 coreconfigitem(
1720 coreconfigitem(
1714 b'progress',
1721 b'progress',
1715 b'estimateinterval',
1722 b'estimateinterval',
1716 default=60.0,
1723 default=60.0,
1717 )
1724 )
1718 coreconfigitem(
1725 coreconfigitem(
1719 b'progress',
1726 b'progress',
1720 b'format',
1727 b'format',
1721 default=lambda: [b'topic', b'bar', b'number', b'estimate'],
1728 default=lambda: [b'topic', b'bar', b'number', b'estimate'],
1722 )
1729 )
1723 coreconfigitem(
1730 coreconfigitem(
1724 b'progress',
1731 b'progress',
1725 b'refresh',
1732 b'refresh',
1726 default=0.1,
1733 default=0.1,
1727 )
1734 )
1728 coreconfigitem(
1735 coreconfigitem(
1729 b'progress',
1736 b'progress',
1730 b'width',
1737 b'width',
1731 default=dynamicdefault,
1738 default=dynamicdefault,
1732 )
1739 )
1733 coreconfigitem(
1740 coreconfigitem(
1734 b'pull',
1741 b'pull',
1735 b'confirm',
1742 b'confirm',
1736 default=False,
1743 default=False,
1737 )
1744 )
1738 coreconfigitem(
1745 coreconfigitem(
1739 b'push',
1746 b'push',
1740 b'pushvars.server',
1747 b'pushvars.server',
1741 default=False,
1748 default=False,
1742 )
1749 )
1743 coreconfigitem(
1750 coreconfigitem(
1744 b'rewrite',
1751 b'rewrite',
1745 b'backup-bundle',
1752 b'backup-bundle',
1746 default=True,
1753 default=True,
1747 alias=[(b'ui', b'history-editing-backup')],
1754 alias=[(b'ui', b'history-editing-backup')],
1748 )
1755 )
1749 coreconfigitem(
1756 coreconfigitem(
1750 b'rewrite',
1757 b'rewrite',
1751 b'update-timestamp',
1758 b'update-timestamp',
1752 default=False,
1759 default=False,
1753 )
1760 )
1754 coreconfigitem(
1761 coreconfigitem(
1755 b'rewrite',
1762 b'rewrite',
1756 b'empty-successor',
1763 b'empty-successor',
1757 default=b'skip',
1764 default=b'skip',
1758 experimental=True,
1765 experimental=True,
1759 )
1766 )
1760 coreconfigitem(
1767 coreconfigitem(
1761 b'storage',
1768 b'storage',
1762 b'new-repo-backend',
1769 b'new-repo-backend',
1763 default=b'revlogv1',
1770 default=b'revlogv1',
1764 experimental=True,
1771 experimental=True,
1765 )
1772 )
1766 coreconfigitem(
1773 coreconfigitem(
1767 b'storage',
1774 b'storage',
1768 b'revlog.optimize-delta-parent-choice',
1775 b'revlog.optimize-delta-parent-choice',
1769 default=True,
1776 default=True,
1770 alias=[(b'format', b'aggressivemergedeltas')],
1777 alias=[(b'format', b'aggressivemergedeltas')],
1771 )
1778 )
1772 # experimental as long as rust is experimental (or a C version is implemented)
1779 # experimental as long as rust is experimental (or a C version is implemented)
1773 coreconfigitem(
1780 coreconfigitem(
1774 b'storage',
1781 b'storage',
1775 b'revlog.persistent-nodemap.mmap',
1782 b'revlog.persistent-nodemap.mmap',
1776 default=True,
1783 default=True,
1777 )
1784 )
1778 # experimental as long as format.use-persistent-nodemap is.
1785 # experimental as long as format.use-persistent-nodemap is.
1779 coreconfigitem(
1786 coreconfigitem(
1780 b'storage',
1787 b'storage',
1781 b'revlog.persistent-nodemap.slow-path',
1788 b'revlog.persistent-nodemap.slow-path',
1782 default=b"abort",
1789 default=b"abort",
1783 )
1790 )
1784
1791
1785 coreconfigitem(
1792 coreconfigitem(
1786 b'storage',
1793 b'storage',
1787 b'revlog.reuse-external-delta',
1794 b'revlog.reuse-external-delta',
1788 default=True,
1795 default=True,
1789 )
1796 )
1790 coreconfigitem(
1797 coreconfigitem(
1791 b'storage',
1798 b'storage',
1792 b'revlog.reuse-external-delta-parent',
1799 b'revlog.reuse-external-delta-parent',
1793 default=None,
1800 default=None,
1794 )
1801 )
1795 coreconfigitem(
1802 coreconfigitem(
1796 b'storage',
1803 b'storage',
1797 b'revlog.zlib.level',
1804 b'revlog.zlib.level',
1798 default=None,
1805 default=None,
1799 )
1806 )
1800 coreconfigitem(
1807 coreconfigitem(
1801 b'storage',
1808 b'storage',
1802 b'revlog.zstd.level',
1809 b'revlog.zstd.level',
1803 default=None,
1810 default=None,
1804 )
1811 )
1805 coreconfigitem(
1812 coreconfigitem(
1806 b'server',
1813 b'server',
1807 b'bookmarks-pushkey-compat',
1814 b'bookmarks-pushkey-compat',
1808 default=True,
1815 default=True,
1809 )
1816 )
1810 coreconfigitem(
1817 coreconfigitem(
1811 b'server',
1818 b'server',
1812 b'bundle1',
1819 b'bundle1',
1813 default=True,
1820 default=True,
1814 )
1821 )
1815 coreconfigitem(
1822 coreconfigitem(
1816 b'server',
1823 b'server',
1817 b'bundle1gd',
1824 b'bundle1gd',
1818 default=None,
1825 default=None,
1819 )
1826 )
1820 coreconfigitem(
1827 coreconfigitem(
1821 b'server',
1828 b'server',
1822 b'bundle1.pull',
1829 b'bundle1.pull',
1823 default=None,
1830 default=None,
1824 )
1831 )
1825 coreconfigitem(
1832 coreconfigitem(
1826 b'server',
1833 b'server',
1827 b'bundle1gd.pull',
1834 b'bundle1gd.pull',
1828 default=None,
1835 default=None,
1829 )
1836 )
1830 coreconfigitem(
1837 coreconfigitem(
1831 b'server',
1838 b'server',
1832 b'bundle1.push',
1839 b'bundle1.push',
1833 default=None,
1840 default=None,
1834 )
1841 )
1835 coreconfigitem(
1842 coreconfigitem(
1836 b'server',
1843 b'server',
1837 b'bundle1gd.push',
1844 b'bundle1gd.push',
1838 default=None,
1845 default=None,
1839 )
1846 )
1840 coreconfigitem(
1847 coreconfigitem(
1841 b'server',
1848 b'server',
1842 b'bundle2.stream',
1849 b'bundle2.stream',
1843 default=True,
1850 default=True,
1844 alias=[(b'experimental', b'bundle2.stream')],
1851 alias=[(b'experimental', b'bundle2.stream')],
1845 )
1852 )
1846 coreconfigitem(
1853 coreconfigitem(
1847 b'server',
1854 b'server',
1848 b'compressionengines',
1855 b'compressionengines',
1849 default=list,
1856 default=list,
1850 )
1857 )
1851 coreconfigitem(
1858 coreconfigitem(
1852 b'server',
1859 b'server',
1853 b'concurrent-push-mode',
1860 b'concurrent-push-mode',
1854 default=b'check-related',
1861 default=b'check-related',
1855 )
1862 )
1856 coreconfigitem(
1863 coreconfigitem(
1857 b'server',
1864 b'server',
1858 b'disablefullbundle',
1865 b'disablefullbundle',
1859 default=False,
1866 default=False,
1860 )
1867 )
1861 coreconfigitem(
1868 coreconfigitem(
1862 b'server',
1869 b'server',
1863 b'maxhttpheaderlen',
1870 b'maxhttpheaderlen',
1864 default=1024,
1871 default=1024,
1865 )
1872 )
1866 coreconfigitem(
1873 coreconfigitem(
1867 b'server',
1874 b'server',
1868 b'pullbundle',
1875 b'pullbundle',
1869 default=False,
1876 default=False,
1870 )
1877 )
1871 coreconfigitem(
1878 coreconfigitem(
1872 b'server',
1879 b'server',
1873 b'preferuncompressed',
1880 b'preferuncompressed',
1874 default=False,
1881 default=False,
1875 )
1882 )
1876 coreconfigitem(
1883 coreconfigitem(
1877 b'server',
1884 b'server',
1878 b'streamunbundle',
1885 b'streamunbundle',
1879 default=False,
1886 default=False,
1880 )
1887 )
1881 coreconfigitem(
1888 coreconfigitem(
1882 b'server',
1889 b'server',
1883 b'uncompressed',
1890 b'uncompressed',
1884 default=True,
1891 default=True,
1885 )
1892 )
1886 coreconfigitem(
1893 coreconfigitem(
1887 b'server',
1894 b'server',
1888 b'uncompressedallowsecret',
1895 b'uncompressedallowsecret',
1889 default=False,
1896 default=False,
1890 )
1897 )
1891 coreconfigitem(
1898 coreconfigitem(
1892 b'server',
1899 b'server',
1893 b'view',
1900 b'view',
1894 default=b'served',
1901 default=b'served',
1895 )
1902 )
1896 coreconfigitem(
1903 coreconfigitem(
1897 b'server',
1904 b'server',
1898 b'validate',
1905 b'validate',
1899 default=False,
1906 default=False,
1900 )
1907 )
1901 coreconfigitem(
1908 coreconfigitem(
1902 b'server',
1909 b'server',
1903 b'zliblevel',
1910 b'zliblevel',
1904 default=-1,
1911 default=-1,
1905 )
1912 )
1906 coreconfigitem(
1913 coreconfigitem(
1907 b'server',
1914 b'server',
1908 b'zstdlevel',
1915 b'zstdlevel',
1909 default=3,
1916 default=3,
1910 )
1917 )
1911 coreconfigitem(
1918 coreconfigitem(
1912 b'share',
1919 b'share',
1913 b'pool',
1920 b'pool',
1914 default=None,
1921 default=None,
1915 )
1922 )
1916 coreconfigitem(
1923 coreconfigitem(
1917 b'share',
1924 b'share',
1918 b'poolnaming',
1925 b'poolnaming',
1919 default=b'identity',
1926 default=b'identity',
1920 )
1927 )
1921 coreconfigitem(
1928 coreconfigitem(
1922 b'shelve',
1929 b'shelve',
1923 b'maxbackups',
1930 b'maxbackups',
1924 default=10,
1931 default=10,
1925 )
1932 )
1926 coreconfigitem(
1933 coreconfigitem(
1927 b'smtp',
1934 b'smtp',
1928 b'host',
1935 b'host',
1929 default=None,
1936 default=None,
1930 )
1937 )
1931 coreconfigitem(
1938 coreconfigitem(
1932 b'smtp',
1939 b'smtp',
1933 b'local_hostname',
1940 b'local_hostname',
1934 default=None,
1941 default=None,
1935 )
1942 )
1936 coreconfigitem(
1943 coreconfigitem(
1937 b'smtp',
1944 b'smtp',
1938 b'password',
1945 b'password',
1939 default=None,
1946 default=None,
1940 )
1947 )
1941 coreconfigitem(
1948 coreconfigitem(
1942 b'smtp',
1949 b'smtp',
1943 b'port',
1950 b'port',
1944 default=dynamicdefault,
1951 default=dynamicdefault,
1945 )
1952 )
1946 coreconfigitem(
1953 coreconfigitem(
1947 b'smtp',
1954 b'smtp',
1948 b'tls',
1955 b'tls',
1949 default=b'none',
1956 default=b'none',
1950 )
1957 )
1951 coreconfigitem(
1958 coreconfigitem(
1952 b'smtp',
1959 b'smtp',
1953 b'username',
1960 b'username',
1954 default=None,
1961 default=None,
1955 )
1962 )
1956 coreconfigitem(
1963 coreconfigitem(
1957 b'sparse',
1964 b'sparse',
1958 b'missingwarning',
1965 b'missingwarning',
1959 default=True,
1966 default=True,
1960 experimental=True,
1967 experimental=True,
1961 )
1968 )
1962 coreconfigitem(
1969 coreconfigitem(
1963 b'subrepos',
1970 b'subrepos',
1964 b'allowed',
1971 b'allowed',
1965 default=dynamicdefault, # to make backporting simpler
1972 default=dynamicdefault, # to make backporting simpler
1966 )
1973 )
1967 coreconfigitem(
1974 coreconfigitem(
1968 b'subrepos',
1975 b'subrepos',
1969 b'hg:allowed',
1976 b'hg:allowed',
1970 default=dynamicdefault,
1977 default=dynamicdefault,
1971 )
1978 )
1972 coreconfigitem(
1979 coreconfigitem(
1973 b'subrepos',
1980 b'subrepos',
1974 b'git:allowed',
1981 b'git:allowed',
1975 default=dynamicdefault,
1982 default=dynamicdefault,
1976 )
1983 )
1977 coreconfigitem(
1984 coreconfigitem(
1978 b'subrepos',
1985 b'subrepos',
1979 b'svn:allowed',
1986 b'svn:allowed',
1980 default=dynamicdefault,
1987 default=dynamicdefault,
1981 )
1988 )
1982 coreconfigitem(
1989 coreconfigitem(
1983 b'templates',
1990 b'templates',
1984 b'.*',
1991 b'.*',
1985 default=None,
1992 default=None,
1986 generic=True,
1993 generic=True,
1987 )
1994 )
1988 coreconfigitem(
1995 coreconfigitem(
1989 b'templateconfig',
1996 b'templateconfig',
1990 b'.*',
1997 b'.*',
1991 default=dynamicdefault,
1998 default=dynamicdefault,
1992 generic=True,
1999 generic=True,
1993 )
2000 )
1994 coreconfigitem(
2001 coreconfigitem(
1995 b'trusted',
2002 b'trusted',
1996 b'groups',
2003 b'groups',
1997 default=list,
2004 default=list,
1998 )
2005 )
1999 coreconfigitem(
2006 coreconfigitem(
2000 b'trusted',
2007 b'trusted',
2001 b'users',
2008 b'users',
2002 default=list,
2009 default=list,
2003 )
2010 )
2004 coreconfigitem(
2011 coreconfigitem(
2005 b'ui',
2012 b'ui',
2006 b'_usedassubrepo',
2013 b'_usedassubrepo',
2007 default=False,
2014 default=False,
2008 )
2015 )
2009 coreconfigitem(
2016 coreconfigitem(
2010 b'ui',
2017 b'ui',
2011 b'allowemptycommit',
2018 b'allowemptycommit',
2012 default=False,
2019 default=False,
2013 )
2020 )
2014 coreconfigitem(
2021 coreconfigitem(
2015 b'ui',
2022 b'ui',
2016 b'archivemeta',
2023 b'archivemeta',
2017 default=True,
2024 default=True,
2018 )
2025 )
2019 coreconfigitem(
2026 coreconfigitem(
2020 b'ui',
2027 b'ui',
2021 b'askusername',
2028 b'askusername',
2022 default=False,
2029 default=False,
2023 )
2030 )
2024 coreconfigitem(
2031 coreconfigitem(
2025 b'ui',
2032 b'ui',
2026 b'available-memory',
2033 b'available-memory',
2027 default=None,
2034 default=None,
2028 )
2035 )
2029
2036
2030 coreconfigitem(
2037 coreconfigitem(
2031 b'ui',
2038 b'ui',
2032 b'clonebundlefallback',
2039 b'clonebundlefallback',
2033 default=False,
2040 default=False,
2034 )
2041 )
2035 coreconfigitem(
2042 coreconfigitem(
2036 b'ui',
2043 b'ui',
2037 b'clonebundleprefers',
2044 b'clonebundleprefers',
2038 default=list,
2045 default=list,
2039 )
2046 )
2040 coreconfigitem(
2047 coreconfigitem(
2041 b'ui',
2048 b'ui',
2042 b'clonebundles',
2049 b'clonebundles',
2043 default=True,
2050 default=True,
2044 )
2051 )
2045 coreconfigitem(
2052 coreconfigitem(
2046 b'ui',
2053 b'ui',
2047 b'color',
2054 b'color',
2048 default=b'auto',
2055 default=b'auto',
2049 )
2056 )
2050 coreconfigitem(
2057 coreconfigitem(
2051 b'ui',
2058 b'ui',
2052 b'commitsubrepos',
2059 b'commitsubrepos',
2053 default=False,
2060 default=False,
2054 )
2061 )
2055 coreconfigitem(
2062 coreconfigitem(
2056 b'ui',
2063 b'ui',
2057 b'debug',
2064 b'debug',
2058 default=False,
2065 default=False,
2059 )
2066 )
2060 coreconfigitem(
2067 coreconfigitem(
2061 b'ui',
2068 b'ui',
2062 b'debugger',
2069 b'debugger',
2063 default=None,
2070 default=None,
2064 )
2071 )
2065 coreconfigitem(
2072 coreconfigitem(
2066 b'ui',
2073 b'ui',
2067 b'editor',
2074 b'editor',
2068 default=dynamicdefault,
2075 default=dynamicdefault,
2069 )
2076 )
2070 coreconfigitem(
2077 coreconfigitem(
2071 b'ui',
2078 b'ui',
2072 b'detailed-exit-code',
2079 b'detailed-exit-code',
2073 default=False,
2080 default=False,
2074 experimental=True,
2081 experimental=True,
2075 )
2082 )
2076 coreconfigitem(
2083 coreconfigitem(
2077 b'ui',
2084 b'ui',
2078 b'fallbackencoding',
2085 b'fallbackencoding',
2079 default=None,
2086 default=None,
2080 )
2087 )
2081 coreconfigitem(
2088 coreconfigitem(
2082 b'ui',
2089 b'ui',
2083 b'forcecwd',
2090 b'forcecwd',
2084 default=None,
2091 default=None,
2085 )
2092 )
2086 coreconfigitem(
2093 coreconfigitem(
2087 b'ui',
2094 b'ui',
2088 b'forcemerge',
2095 b'forcemerge',
2089 default=None,
2096 default=None,
2090 )
2097 )
2091 coreconfigitem(
2098 coreconfigitem(
2092 b'ui',
2099 b'ui',
2093 b'formatdebug',
2100 b'formatdebug',
2094 default=False,
2101 default=False,
2095 )
2102 )
2096 coreconfigitem(
2103 coreconfigitem(
2097 b'ui',
2104 b'ui',
2098 b'formatjson',
2105 b'formatjson',
2099 default=False,
2106 default=False,
2100 )
2107 )
2101 coreconfigitem(
2108 coreconfigitem(
2102 b'ui',
2109 b'ui',
2103 b'formatted',
2110 b'formatted',
2104 default=None,
2111 default=None,
2105 )
2112 )
2106 coreconfigitem(
2113 coreconfigitem(
2107 b'ui',
2114 b'ui',
2108 b'interactive',
2115 b'interactive',
2109 default=None,
2116 default=None,
2110 )
2117 )
2111 coreconfigitem(
2118 coreconfigitem(
2112 b'ui',
2119 b'ui',
2113 b'interface',
2120 b'interface',
2114 default=None,
2121 default=None,
2115 )
2122 )
2116 coreconfigitem(
2123 coreconfigitem(
2117 b'ui',
2124 b'ui',
2118 b'interface.chunkselector',
2125 b'interface.chunkselector',
2119 default=None,
2126 default=None,
2120 )
2127 )
2121 coreconfigitem(
2128 coreconfigitem(
2122 b'ui',
2129 b'ui',
2123 b'large-file-limit',
2130 b'large-file-limit',
2124 default=10000000,
2131 default=10000000,
2125 )
2132 )
2126 coreconfigitem(
2133 coreconfigitem(
2127 b'ui',
2134 b'ui',
2128 b'logblockedtimes',
2135 b'logblockedtimes',
2129 default=False,
2136 default=False,
2130 )
2137 )
2131 coreconfigitem(
2138 coreconfigitem(
2132 b'ui',
2139 b'ui',
2133 b'merge',
2140 b'merge',
2134 default=None,
2141 default=None,
2135 )
2142 )
2136 coreconfigitem(
2143 coreconfigitem(
2137 b'ui',
2144 b'ui',
2138 b'mergemarkers',
2145 b'mergemarkers',
2139 default=b'basic',
2146 default=b'basic',
2140 )
2147 )
2141 coreconfigitem(
2148 coreconfigitem(
2142 b'ui',
2149 b'ui',
2143 b'message-output',
2150 b'message-output',
2144 default=b'stdio',
2151 default=b'stdio',
2145 )
2152 )
2146 coreconfigitem(
2153 coreconfigitem(
2147 b'ui',
2154 b'ui',
2148 b'nontty',
2155 b'nontty',
2149 default=False,
2156 default=False,
2150 )
2157 )
2151 coreconfigitem(
2158 coreconfigitem(
2152 b'ui',
2159 b'ui',
2153 b'origbackuppath',
2160 b'origbackuppath',
2154 default=None,
2161 default=None,
2155 )
2162 )
2156 coreconfigitem(
2163 coreconfigitem(
2157 b'ui',
2164 b'ui',
2158 b'paginate',
2165 b'paginate',
2159 default=True,
2166 default=True,
2160 )
2167 )
2161 coreconfigitem(
2168 coreconfigitem(
2162 b'ui',
2169 b'ui',
2163 b'patch',
2170 b'patch',
2164 default=None,
2171 default=None,
2165 )
2172 )
2166 coreconfigitem(
2173 coreconfigitem(
2167 b'ui',
2174 b'ui',
2168 b'portablefilenames',
2175 b'portablefilenames',
2169 default=b'warn',
2176 default=b'warn',
2170 )
2177 )
2171 coreconfigitem(
2178 coreconfigitem(
2172 b'ui',
2179 b'ui',
2173 b'promptecho',
2180 b'promptecho',
2174 default=False,
2181 default=False,
2175 )
2182 )
2176 coreconfigitem(
2183 coreconfigitem(
2177 b'ui',
2184 b'ui',
2178 b'quiet',
2185 b'quiet',
2179 default=False,
2186 default=False,
2180 )
2187 )
2181 coreconfigitem(
2188 coreconfigitem(
2182 b'ui',
2189 b'ui',
2183 b'quietbookmarkmove',
2190 b'quietbookmarkmove',
2184 default=False,
2191 default=False,
2185 )
2192 )
2186 coreconfigitem(
2193 coreconfigitem(
2187 b'ui',
2194 b'ui',
2188 b'relative-paths',
2195 b'relative-paths',
2189 default=b'legacy',
2196 default=b'legacy',
2190 )
2197 )
2191 coreconfigitem(
2198 coreconfigitem(
2192 b'ui',
2199 b'ui',
2193 b'remotecmd',
2200 b'remotecmd',
2194 default=b'hg',
2201 default=b'hg',
2195 )
2202 )
2196 coreconfigitem(
2203 coreconfigitem(
2197 b'ui',
2204 b'ui',
2198 b'report_untrusted',
2205 b'report_untrusted',
2199 default=True,
2206 default=True,
2200 )
2207 )
2201 coreconfigitem(
2208 coreconfigitem(
2202 b'ui',
2209 b'ui',
2203 b'rollback',
2210 b'rollback',
2204 default=True,
2211 default=True,
2205 )
2212 )
2206 coreconfigitem(
2213 coreconfigitem(
2207 b'ui',
2214 b'ui',
2208 b'signal-safe-lock',
2215 b'signal-safe-lock',
2209 default=True,
2216 default=True,
2210 )
2217 )
2211 coreconfigitem(
2218 coreconfigitem(
2212 b'ui',
2219 b'ui',
2213 b'slash',
2220 b'slash',
2214 default=False,
2221 default=False,
2215 )
2222 )
2216 coreconfigitem(
2223 coreconfigitem(
2217 b'ui',
2224 b'ui',
2218 b'ssh',
2225 b'ssh',
2219 default=b'ssh',
2226 default=b'ssh',
2220 )
2227 )
2221 coreconfigitem(
2228 coreconfigitem(
2222 b'ui',
2229 b'ui',
2223 b'ssherrorhint',
2230 b'ssherrorhint',
2224 default=None,
2231 default=None,
2225 )
2232 )
2226 coreconfigitem(
2233 coreconfigitem(
2227 b'ui',
2234 b'ui',
2228 b'statuscopies',
2235 b'statuscopies',
2229 default=False,
2236 default=False,
2230 )
2237 )
2231 coreconfigitem(
2238 coreconfigitem(
2232 b'ui',
2239 b'ui',
2233 b'strict',
2240 b'strict',
2234 default=False,
2241 default=False,
2235 )
2242 )
2236 coreconfigitem(
2243 coreconfigitem(
2237 b'ui',
2244 b'ui',
2238 b'style',
2245 b'style',
2239 default=b'',
2246 default=b'',
2240 )
2247 )
2241 coreconfigitem(
2248 coreconfigitem(
2242 b'ui',
2249 b'ui',
2243 b'supportcontact',
2250 b'supportcontact',
2244 default=None,
2251 default=None,
2245 )
2252 )
2246 coreconfigitem(
2253 coreconfigitem(
2247 b'ui',
2254 b'ui',
2248 b'textwidth',
2255 b'textwidth',
2249 default=78,
2256 default=78,
2250 )
2257 )
2251 coreconfigitem(
2258 coreconfigitem(
2252 b'ui',
2259 b'ui',
2253 b'timeout',
2260 b'timeout',
2254 default=b'600',
2261 default=b'600',
2255 )
2262 )
2256 coreconfigitem(
2263 coreconfigitem(
2257 b'ui',
2264 b'ui',
2258 b'timeout.warn',
2265 b'timeout.warn',
2259 default=0,
2266 default=0,
2260 )
2267 )
2261 coreconfigitem(
2268 coreconfigitem(
2262 b'ui',
2269 b'ui',
2263 b'timestamp-output',
2270 b'timestamp-output',
2264 default=False,
2271 default=False,
2265 )
2272 )
2266 coreconfigitem(
2273 coreconfigitem(
2267 b'ui',
2274 b'ui',
2268 b'traceback',
2275 b'traceback',
2269 default=False,
2276 default=False,
2270 )
2277 )
2271 coreconfigitem(
2278 coreconfigitem(
2272 b'ui',
2279 b'ui',
2273 b'tweakdefaults',
2280 b'tweakdefaults',
2274 default=False,
2281 default=False,
2275 )
2282 )
2276 coreconfigitem(b'ui', b'username', alias=[(b'ui', b'user')])
2283 coreconfigitem(b'ui', b'username', alias=[(b'ui', b'user')])
2277 coreconfigitem(
2284 coreconfigitem(
2278 b'ui',
2285 b'ui',
2279 b'verbose',
2286 b'verbose',
2280 default=False,
2287 default=False,
2281 )
2288 )
2282 coreconfigitem(
2289 coreconfigitem(
2283 b'verify',
2290 b'verify',
2284 b'skipflags',
2291 b'skipflags',
2285 default=None,
2292 default=None,
2286 )
2293 )
2287 coreconfigitem(
2294 coreconfigitem(
2288 b'web',
2295 b'web',
2289 b'allowbz2',
2296 b'allowbz2',
2290 default=False,
2297 default=False,
2291 )
2298 )
2292 coreconfigitem(
2299 coreconfigitem(
2293 b'web',
2300 b'web',
2294 b'allowgz',
2301 b'allowgz',
2295 default=False,
2302 default=False,
2296 )
2303 )
2297 coreconfigitem(
2304 coreconfigitem(
2298 b'web',
2305 b'web',
2299 b'allow-pull',
2306 b'allow-pull',
2300 alias=[(b'web', b'allowpull')],
2307 alias=[(b'web', b'allowpull')],
2301 default=True,
2308 default=True,
2302 )
2309 )
2303 coreconfigitem(
2310 coreconfigitem(
2304 b'web',
2311 b'web',
2305 b'allow-push',
2312 b'allow-push',
2306 alias=[(b'web', b'allow_push')],
2313 alias=[(b'web', b'allow_push')],
2307 default=list,
2314 default=list,
2308 )
2315 )
2309 coreconfigitem(
2316 coreconfigitem(
2310 b'web',
2317 b'web',
2311 b'allowzip',
2318 b'allowzip',
2312 default=False,
2319 default=False,
2313 )
2320 )
2314 coreconfigitem(
2321 coreconfigitem(
2315 b'web',
2322 b'web',
2316 b'archivesubrepos',
2323 b'archivesubrepos',
2317 default=False,
2324 default=False,
2318 )
2325 )
2319 coreconfigitem(
2326 coreconfigitem(
2320 b'web',
2327 b'web',
2321 b'cache',
2328 b'cache',
2322 default=True,
2329 default=True,
2323 )
2330 )
2324 coreconfigitem(
2331 coreconfigitem(
2325 b'web',
2332 b'web',
2326 b'comparisoncontext',
2333 b'comparisoncontext',
2327 default=5,
2334 default=5,
2328 )
2335 )
2329 coreconfigitem(
2336 coreconfigitem(
2330 b'web',
2337 b'web',
2331 b'contact',
2338 b'contact',
2332 default=None,
2339 default=None,
2333 )
2340 )
2334 coreconfigitem(
2341 coreconfigitem(
2335 b'web',
2342 b'web',
2336 b'deny_push',
2343 b'deny_push',
2337 default=list,
2344 default=list,
2338 )
2345 )
2339 coreconfigitem(
2346 coreconfigitem(
2340 b'web',
2347 b'web',
2341 b'guessmime',
2348 b'guessmime',
2342 default=False,
2349 default=False,
2343 )
2350 )
2344 coreconfigitem(
2351 coreconfigitem(
2345 b'web',
2352 b'web',
2346 b'hidden',
2353 b'hidden',
2347 default=False,
2354 default=False,
2348 )
2355 )
2349 coreconfigitem(
2356 coreconfigitem(
2350 b'web',
2357 b'web',
2351 b'labels',
2358 b'labels',
2352 default=list,
2359 default=list,
2353 )
2360 )
2354 coreconfigitem(
2361 coreconfigitem(
2355 b'web',
2362 b'web',
2356 b'logoimg',
2363 b'logoimg',
2357 default=b'hglogo.png',
2364 default=b'hglogo.png',
2358 )
2365 )
2359 coreconfigitem(
2366 coreconfigitem(
2360 b'web',
2367 b'web',
2361 b'logourl',
2368 b'logourl',
2362 default=b'https://mercurial-scm.org/',
2369 default=b'https://mercurial-scm.org/',
2363 )
2370 )
2364 coreconfigitem(
2371 coreconfigitem(
2365 b'web',
2372 b'web',
2366 b'accesslog',
2373 b'accesslog',
2367 default=b'-',
2374 default=b'-',
2368 )
2375 )
2369 coreconfigitem(
2376 coreconfigitem(
2370 b'web',
2377 b'web',
2371 b'address',
2378 b'address',
2372 default=b'',
2379 default=b'',
2373 )
2380 )
2374 coreconfigitem(
2381 coreconfigitem(
2375 b'web',
2382 b'web',
2376 b'allow-archive',
2383 b'allow-archive',
2377 alias=[(b'web', b'allow_archive')],
2384 alias=[(b'web', b'allow_archive')],
2378 default=list,
2385 default=list,
2379 )
2386 )
2380 coreconfigitem(
2387 coreconfigitem(
2381 b'web',
2388 b'web',
2382 b'allow_read',
2389 b'allow_read',
2383 default=list,
2390 default=list,
2384 )
2391 )
2385 coreconfigitem(
2392 coreconfigitem(
2386 b'web',
2393 b'web',
2387 b'baseurl',
2394 b'baseurl',
2388 default=None,
2395 default=None,
2389 )
2396 )
2390 coreconfigitem(
2397 coreconfigitem(
2391 b'web',
2398 b'web',
2392 b'cacerts',
2399 b'cacerts',
2393 default=None,
2400 default=None,
2394 )
2401 )
2395 coreconfigitem(
2402 coreconfigitem(
2396 b'web',
2403 b'web',
2397 b'certificate',
2404 b'certificate',
2398 default=None,
2405 default=None,
2399 )
2406 )
2400 coreconfigitem(
2407 coreconfigitem(
2401 b'web',
2408 b'web',
2402 b'collapse',
2409 b'collapse',
2403 default=False,
2410 default=False,
2404 )
2411 )
2405 coreconfigitem(
2412 coreconfigitem(
2406 b'web',
2413 b'web',
2407 b'csp',
2414 b'csp',
2408 default=None,
2415 default=None,
2409 )
2416 )
2410 coreconfigitem(
2417 coreconfigitem(
2411 b'web',
2418 b'web',
2412 b'deny_read',
2419 b'deny_read',
2413 default=list,
2420 default=list,
2414 )
2421 )
2415 coreconfigitem(
2422 coreconfigitem(
2416 b'web',
2423 b'web',
2417 b'descend',
2424 b'descend',
2418 default=True,
2425 default=True,
2419 )
2426 )
2420 coreconfigitem(
2427 coreconfigitem(
2421 b'web',
2428 b'web',
2422 b'description',
2429 b'description',
2423 default=b"",
2430 default=b"",
2424 )
2431 )
2425 coreconfigitem(
2432 coreconfigitem(
2426 b'web',
2433 b'web',
2427 b'encoding',
2434 b'encoding',
2428 default=lambda: encoding.encoding,
2435 default=lambda: encoding.encoding,
2429 )
2436 )
2430 coreconfigitem(
2437 coreconfigitem(
2431 b'web',
2438 b'web',
2432 b'errorlog',
2439 b'errorlog',
2433 default=b'-',
2440 default=b'-',
2434 )
2441 )
2435 coreconfigitem(
2442 coreconfigitem(
2436 b'web',
2443 b'web',
2437 b'ipv6',
2444 b'ipv6',
2438 default=False,
2445 default=False,
2439 )
2446 )
2440 coreconfigitem(
2447 coreconfigitem(
2441 b'web',
2448 b'web',
2442 b'maxchanges',
2449 b'maxchanges',
2443 default=10,
2450 default=10,
2444 )
2451 )
2445 coreconfigitem(
2452 coreconfigitem(
2446 b'web',
2453 b'web',
2447 b'maxfiles',
2454 b'maxfiles',
2448 default=10,
2455 default=10,
2449 )
2456 )
2450 coreconfigitem(
2457 coreconfigitem(
2451 b'web',
2458 b'web',
2452 b'maxshortchanges',
2459 b'maxshortchanges',
2453 default=60,
2460 default=60,
2454 )
2461 )
2455 coreconfigitem(
2462 coreconfigitem(
2456 b'web',
2463 b'web',
2457 b'motd',
2464 b'motd',
2458 default=b'',
2465 default=b'',
2459 )
2466 )
2460 coreconfigitem(
2467 coreconfigitem(
2461 b'web',
2468 b'web',
2462 b'name',
2469 b'name',
2463 default=dynamicdefault,
2470 default=dynamicdefault,
2464 )
2471 )
2465 coreconfigitem(
2472 coreconfigitem(
2466 b'web',
2473 b'web',
2467 b'port',
2474 b'port',
2468 default=8000,
2475 default=8000,
2469 )
2476 )
2470 coreconfigitem(
2477 coreconfigitem(
2471 b'web',
2478 b'web',
2472 b'prefix',
2479 b'prefix',
2473 default=b'',
2480 default=b'',
2474 )
2481 )
2475 coreconfigitem(
2482 coreconfigitem(
2476 b'web',
2483 b'web',
2477 b'push_ssl',
2484 b'push_ssl',
2478 default=True,
2485 default=True,
2479 )
2486 )
2480 coreconfigitem(
2487 coreconfigitem(
2481 b'web',
2488 b'web',
2482 b'refreshinterval',
2489 b'refreshinterval',
2483 default=20,
2490 default=20,
2484 )
2491 )
2485 coreconfigitem(
2492 coreconfigitem(
2486 b'web',
2493 b'web',
2487 b'server-header',
2494 b'server-header',
2488 default=None,
2495 default=None,
2489 )
2496 )
2490 coreconfigitem(
2497 coreconfigitem(
2491 b'web',
2498 b'web',
2492 b'static',
2499 b'static',
2493 default=None,
2500 default=None,
2494 )
2501 )
2495 coreconfigitem(
2502 coreconfigitem(
2496 b'web',
2503 b'web',
2497 b'staticurl',
2504 b'staticurl',
2498 default=None,
2505 default=None,
2499 )
2506 )
2500 coreconfigitem(
2507 coreconfigitem(
2501 b'web',
2508 b'web',
2502 b'stripes',
2509 b'stripes',
2503 default=1,
2510 default=1,
2504 )
2511 )
2505 coreconfigitem(
2512 coreconfigitem(
2506 b'web',
2513 b'web',
2507 b'style',
2514 b'style',
2508 default=b'paper',
2515 default=b'paper',
2509 )
2516 )
2510 coreconfigitem(
2517 coreconfigitem(
2511 b'web',
2518 b'web',
2512 b'templates',
2519 b'templates',
2513 default=None,
2520 default=None,
2514 )
2521 )
2515 coreconfigitem(
2522 coreconfigitem(
2516 b'web',
2523 b'web',
2517 b'view',
2524 b'view',
2518 default=b'served',
2525 default=b'served',
2519 experimental=True,
2526 experimental=True,
2520 )
2527 )
2521 coreconfigitem(
2528 coreconfigitem(
2522 b'worker',
2529 b'worker',
2523 b'backgroundclose',
2530 b'backgroundclose',
2524 default=dynamicdefault,
2531 default=dynamicdefault,
2525 )
2532 )
2526 # Windows defaults to a limit of 512 open files. A buffer of 128
2533 # Windows defaults to a limit of 512 open files. A buffer of 128
2527 # should give us enough headway.
2534 # should give us enough headway.
2528 coreconfigitem(
2535 coreconfigitem(
2529 b'worker',
2536 b'worker',
2530 b'backgroundclosemaxqueue',
2537 b'backgroundclosemaxqueue',
2531 default=384,
2538 default=384,
2532 )
2539 )
2533 coreconfigitem(
2540 coreconfigitem(
2534 b'worker',
2541 b'worker',
2535 b'backgroundcloseminfilecount',
2542 b'backgroundcloseminfilecount',
2536 default=2048,
2543 default=2048,
2537 )
2544 )
2538 coreconfigitem(
2545 coreconfigitem(
2539 b'worker',
2546 b'worker',
2540 b'backgroundclosethreadcount',
2547 b'backgroundclosethreadcount',
2541 default=4,
2548 default=4,
2542 )
2549 )
2543 coreconfigitem(
2550 coreconfigitem(
2544 b'worker',
2551 b'worker',
2545 b'enabled',
2552 b'enabled',
2546 default=True,
2553 default=True,
2547 )
2554 )
2548 coreconfigitem(
2555 coreconfigitem(
2549 b'worker',
2556 b'worker',
2550 b'numcpus',
2557 b'numcpus',
2551 default=None,
2558 default=None,
2552 )
2559 )
2553
2560
2554 # Rebase related configuration moved to core because other extension are doing
2561 # Rebase related configuration moved to core because other extension are doing
2555 # strange things. For example, shelve import the extensions to reuse some bit
2562 # strange things. For example, shelve import the extensions to reuse some bit
2556 # without formally loading it.
2563 # without formally loading it.
2557 coreconfigitem(
2564 coreconfigitem(
2558 b'commands',
2565 b'commands',
2559 b'rebase.requiredest',
2566 b'rebase.requiredest',
2560 default=False,
2567 default=False,
2561 )
2568 )
2562 coreconfigitem(
2569 coreconfigitem(
2563 b'experimental',
2570 b'experimental',
2564 b'rebaseskipobsolete',
2571 b'rebaseskipobsolete',
2565 default=True,
2572 default=True,
2566 )
2573 )
2567 coreconfigitem(
2574 coreconfigitem(
2568 b'rebase',
2575 b'rebase',
2569 b'singletransaction',
2576 b'singletransaction',
2570 default=False,
2577 default=False,
2571 )
2578 )
2572 coreconfigitem(
2579 coreconfigitem(
2573 b'rebase',
2580 b'rebase',
2574 b'experimental.inmemory',
2581 b'experimental.inmemory',
2575 default=False,
2582 default=False,
2576 )
2583 )
@@ -1,507 +1,517 b''
1 # setdiscovery.py - improved discovery of common nodeset for mercurial
1 # setdiscovery.py - improved discovery of common nodeset for mercurial
2 #
2 #
3 # Copyright 2010 Benoit Boissinot <bboissin@gmail.com>
3 # Copyright 2010 Benoit Boissinot <bboissin@gmail.com>
4 # and Peter Arrenbrecht <peter@arrenbrecht.ch>
4 # and Peter Arrenbrecht <peter@arrenbrecht.ch>
5 #
5 #
6 # This software may be used and distributed according to the terms of the
6 # This software may be used and distributed according to the terms of the
7 # GNU General Public License version 2 or any later version.
7 # GNU General Public License version 2 or any later version.
8 """
8 """
9 Algorithm works in the following way. You have two repository: local and
9 Algorithm works in the following way. You have two repository: local and
10 remote. They both contains a DAG of changelists.
10 remote. They both contains a DAG of changelists.
11
11
12 The goal of the discovery protocol is to find one set of node *common*,
12 The goal of the discovery protocol is to find one set of node *common*,
13 the set of nodes shared by local and remote.
13 the set of nodes shared by local and remote.
14
14
15 One of the issue with the original protocol was latency, it could
15 One of the issue with the original protocol was latency, it could
16 potentially require lots of roundtrips to discover that the local repo was a
16 potentially require lots of roundtrips to discover that the local repo was a
17 subset of remote (which is a very common case, you usually have few changes
17 subset of remote (which is a very common case, you usually have few changes
18 compared to upstream, while upstream probably had lots of development).
18 compared to upstream, while upstream probably had lots of development).
19
19
20 The new protocol only requires one interface for the remote repo: `known()`,
20 The new protocol only requires one interface for the remote repo: `known()`,
21 which given a set of changelists tells you if they are present in the DAG.
21 which given a set of changelists tells you if they are present in the DAG.
22
22
23 The algorithm then works as follow:
23 The algorithm then works as follow:
24
24
25 - We will be using three sets, `common`, `missing`, `unknown`. Originally
25 - We will be using three sets, `common`, `missing`, `unknown`. Originally
26 all nodes are in `unknown`.
26 all nodes are in `unknown`.
27 - Take a sample from `unknown`, call `remote.known(sample)`
27 - Take a sample from `unknown`, call `remote.known(sample)`
28 - For each node that remote knows, move it and all its ancestors to `common`
28 - For each node that remote knows, move it and all its ancestors to `common`
29 - For each node that remote doesn't know, move it and all its descendants
29 - For each node that remote doesn't know, move it and all its descendants
30 to `missing`
30 to `missing`
31 - Iterate until `unknown` is empty
31 - Iterate until `unknown` is empty
32
32
33 There are a couple optimizations, first is instead of starting with a random
33 There are a couple optimizations, first is instead of starting with a random
34 sample of missing, start by sending all heads, in the case where the local
34 sample of missing, start by sending all heads, in the case where the local
35 repo is a subset, you computed the answer in one round trip.
35 repo is a subset, you computed the answer in one round trip.
36
36
37 Then you can do something similar to the bisecting strategy used when
37 Then you can do something similar to the bisecting strategy used when
38 finding faulty changesets. Instead of random samples, you can try picking
38 finding faulty changesets. Instead of random samples, you can try picking
39 nodes that will maximize the number of nodes that will be
39 nodes that will maximize the number of nodes that will be
40 classified with it (since all ancestors or descendants will be marked as well).
40 classified with it (since all ancestors or descendants will be marked as well).
41 """
41 """
42
42
43 from __future__ import absolute_import
43 from __future__ import absolute_import
44
44
45 import collections
45 import collections
46 import random
46 import random
47
47
48 from .i18n import _
48 from .i18n import _
49 from .node import (
49 from .node import (
50 nullid,
50 nullid,
51 nullrev,
51 nullrev,
52 )
52 )
53 from . import (
53 from . import (
54 error,
54 error,
55 policy,
55 policy,
56 util,
56 util,
57 )
57 )
58
58
59
59
60 def _updatesample(revs, heads, sample, parentfn, quicksamplesize=0):
60 def _updatesample(revs, heads, sample, parentfn, quicksamplesize=0):
61 """update an existing sample to match the expected size
61 """update an existing sample to match the expected size
62
62
63 The sample is updated with revs exponentially distant from each head of the
63 The sample is updated with revs exponentially distant from each head of the
64 <revs> set. (H~1, H~2, H~4, H~8, etc).
64 <revs> set. (H~1, H~2, H~4, H~8, etc).
65
65
66 If a target size is specified, the sampling will stop once this size is
66 If a target size is specified, the sampling will stop once this size is
67 reached. Otherwise sampling will happen until roots of the <revs> set are
67 reached. Otherwise sampling will happen until roots of the <revs> set are
68 reached.
68 reached.
69
69
70 :revs: set of revs we want to discover (if None, assume the whole dag)
70 :revs: set of revs we want to discover (if None, assume the whole dag)
71 :heads: set of DAG head revs
71 :heads: set of DAG head revs
72 :sample: a sample to update
72 :sample: a sample to update
73 :parentfn: a callable to resolve parents for a revision
73 :parentfn: a callable to resolve parents for a revision
74 :quicksamplesize: optional target size of the sample"""
74 :quicksamplesize: optional target size of the sample"""
75 dist = {}
75 dist = {}
76 visit = collections.deque(heads)
76 visit = collections.deque(heads)
77 seen = set()
77 seen = set()
78 factor = 1
78 factor = 1
79 while visit:
79 while visit:
80 curr = visit.popleft()
80 curr = visit.popleft()
81 if curr in seen:
81 if curr in seen:
82 continue
82 continue
83 d = dist.setdefault(curr, 1)
83 d = dist.setdefault(curr, 1)
84 if d > factor:
84 if d > factor:
85 factor *= 2
85 factor *= 2
86 if d == factor:
86 if d == factor:
87 sample.add(curr)
87 sample.add(curr)
88 if quicksamplesize and (len(sample) >= quicksamplesize):
88 if quicksamplesize and (len(sample) >= quicksamplesize):
89 return
89 return
90 seen.add(curr)
90 seen.add(curr)
91
91
92 for p in parentfn(curr):
92 for p in parentfn(curr):
93 if p != nullrev and (not revs or p in revs):
93 if p != nullrev and (not revs or p in revs):
94 dist.setdefault(p, d + 1)
94 dist.setdefault(p, d + 1)
95 visit.append(p)
95 visit.append(p)
96
96
97
97
98 def _limitsample(sample, desiredlen, randomize=True):
98 def _limitsample(sample, desiredlen, randomize=True):
99 """return a random subset of sample of at most desiredlen item.
99 """return a random subset of sample of at most desiredlen item.
100
100
101 If randomize is False, though, a deterministic subset is returned.
101 If randomize is False, though, a deterministic subset is returned.
102 This is meant for integration tests.
102 This is meant for integration tests.
103 """
103 """
104 if len(sample) <= desiredlen:
104 if len(sample) <= desiredlen:
105 return sample
105 return sample
106 if randomize:
106 if randomize:
107 return set(random.sample(sample, desiredlen))
107 return set(random.sample(sample, desiredlen))
108 sample = list(sample)
108 sample = list(sample)
109 sample.sort()
109 sample.sort()
110 return set(sample[:desiredlen])
110 return set(sample[:desiredlen])
111
111
112
112
113 class partialdiscovery(object):
113 class partialdiscovery(object):
114 """an object representing ongoing discovery
114 """an object representing ongoing discovery
115
115
116 Feed with data from the remote repository, this object keep track of the
116 Feed with data from the remote repository, this object keep track of the
117 current set of changeset in various states:
117 current set of changeset in various states:
118
118
119 - common: revs also known remotely
119 - common: revs also known remotely
120 - undecided: revs we don't have information on yet
120 - undecided: revs we don't have information on yet
121 - missing: revs missing remotely
121 - missing: revs missing remotely
122 (all tracked revisions are known locally)
122 (all tracked revisions are known locally)
123 """
123 """
124
124
125 def __init__(self, repo, targetheads, respectsize, randomize=True):
125 def __init__(self, repo, targetheads, respectsize, randomize=True):
126 self._repo = repo
126 self._repo = repo
127 self._targetheads = targetheads
127 self._targetheads = targetheads
128 self._common = repo.changelog.incrementalmissingrevs()
128 self._common = repo.changelog.incrementalmissingrevs()
129 self._undecided = None
129 self._undecided = None
130 self.missing = set()
130 self.missing = set()
131 self._childrenmap = None
131 self._childrenmap = None
132 self._respectsize = respectsize
132 self._respectsize = respectsize
133 self.randomize = randomize
133 self.randomize = randomize
134
134
135 def addcommons(self, commons):
135 def addcommons(self, commons):
136 """register nodes known as common"""
136 """register nodes known as common"""
137 self._common.addbases(commons)
137 self._common.addbases(commons)
138 if self._undecided is not None:
138 if self._undecided is not None:
139 self._common.removeancestorsfrom(self._undecided)
139 self._common.removeancestorsfrom(self._undecided)
140
140
141 def addmissings(self, missings):
141 def addmissings(self, missings):
142 """register some nodes as missing"""
142 """register some nodes as missing"""
143 newmissing = self._repo.revs(b'%ld::%ld', missings, self.undecided)
143 newmissing = self._repo.revs(b'%ld::%ld', missings, self.undecided)
144 if newmissing:
144 if newmissing:
145 self.missing.update(newmissing)
145 self.missing.update(newmissing)
146 self.undecided.difference_update(newmissing)
146 self.undecided.difference_update(newmissing)
147
147
148 def addinfo(self, sample):
148 def addinfo(self, sample):
149 """consume an iterable of (rev, known) tuples"""
149 """consume an iterable of (rev, known) tuples"""
150 common = set()
150 common = set()
151 missing = set()
151 missing = set()
152 for rev, known in sample:
152 for rev, known in sample:
153 if known:
153 if known:
154 common.add(rev)
154 common.add(rev)
155 else:
155 else:
156 missing.add(rev)
156 missing.add(rev)
157 if common:
157 if common:
158 self.addcommons(common)
158 self.addcommons(common)
159 if missing:
159 if missing:
160 self.addmissings(missing)
160 self.addmissings(missing)
161
161
162 def hasinfo(self):
162 def hasinfo(self):
163 """return True is we have any clue about the remote state"""
163 """return True is we have any clue about the remote state"""
164 return self._common.hasbases()
164 return self._common.hasbases()
165
165
166 def iscomplete(self):
166 def iscomplete(self):
167 """True if all the necessary data have been gathered"""
167 """True if all the necessary data have been gathered"""
168 return self._undecided is not None and not self._undecided
168 return self._undecided is not None and not self._undecided
169
169
170 @property
170 @property
171 def undecided(self):
171 def undecided(self):
172 if self._undecided is not None:
172 if self._undecided is not None:
173 return self._undecided
173 return self._undecided
174 self._undecided = set(self._common.missingancestors(self._targetheads))
174 self._undecided = set(self._common.missingancestors(self._targetheads))
175 return self._undecided
175 return self._undecided
176
176
177 def stats(self):
177 def stats(self):
178 return {
178 return {
179 'undecided': len(self.undecided),
179 'undecided': len(self.undecided),
180 }
180 }
181
181
182 def commonheads(self):
182 def commonheads(self):
183 """the heads of the known common set"""
183 """the heads of the known common set"""
184 # heads(common) == heads(common.bases) since common represents
184 # heads(common) == heads(common.bases) since common represents
185 # common.bases and all its ancestors
185 # common.bases and all its ancestors
186 return self._common.basesheads()
186 return self._common.basesheads()
187
187
188 def _parentsgetter(self):
188 def _parentsgetter(self):
189 getrev = self._repo.changelog.index.__getitem__
189 getrev = self._repo.changelog.index.__getitem__
190
190
191 def getparents(r):
191 def getparents(r):
192 return getrev(r)[5:7]
192 return getrev(r)[5:7]
193
193
194 return getparents
194 return getparents
195
195
196 def _childrengetter(self):
196 def _childrengetter(self):
197
197
198 if self._childrenmap is not None:
198 if self._childrenmap is not None:
199 # During discovery, the `undecided` set keep shrinking.
199 # During discovery, the `undecided` set keep shrinking.
200 # Therefore, the map computed for an iteration N will be
200 # Therefore, the map computed for an iteration N will be
201 # valid for iteration N+1. Instead of computing the same
201 # valid for iteration N+1. Instead of computing the same
202 # data over and over we cached it the first time.
202 # data over and over we cached it the first time.
203 return self._childrenmap.__getitem__
203 return self._childrenmap.__getitem__
204
204
205 # _updatesample() essentially does interaction over revisions to look
205 # _updatesample() essentially does interaction over revisions to look
206 # up their children. This lookup is expensive and doing it in a loop is
206 # up their children. This lookup is expensive and doing it in a loop is
207 # quadratic. We precompute the children for all relevant revisions and
207 # quadratic. We precompute the children for all relevant revisions and
208 # make the lookup in _updatesample() a simple dict lookup.
208 # make the lookup in _updatesample() a simple dict lookup.
209 self._childrenmap = children = {}
209 self._childrenmap = children = {}
210
210
211 parentrevs = self._parentsgetter()
211 parentrevs = self._parentsgetter()
212 revs = self.undecided
212 revs = self.undecided
213
213
214 for rev in sorted(revs):
214 for rev in sorted(revs):
215 # Always ensure revision has an entry so we don't need to worry
215 # Always ensure revision has an entry so we don't need to worry
216 # about missing keys.
216 # about missing keys.
217 children[rev] = []
217 children[rev] = []
218 for prev in parentrevs(rev):
218 for prev in parentrevs(rev):
219 if prev == nullrev:
219 if prev == nullrev:
220 continue
220 continue
221 c = children.get(prev)
221 c = children.get(prev)
222 if c is not None:
222 if c is not None:
223 c.append(rev)
223 c.append(rev)
224 return children.__getitem__
224 return children.__getitem__
225
225
226 def takequicksample(self, headrevs, size):
226 def takequicksample(self, headrevs, size):
227 """takes a quick sample of size <size>
227 """takes a quick sample of size <size>
228
228
229 It is meant for initial sampling and focuses on querying heads and close
229 It is meant for initial sampling and focuses on querying heads and close
230 ancestors of heads.
230 ancestors of heads.
231
231
232 :headrevs: set of head revisions in local DAG to consider
232 :headrevs: set of head revisions in local DAG to consider
233 :size: the maximum size of the sample"""
233 :size: the maximum size of the sample"""
234 revs = self.undecided
234 revs = self.undecided
235 if len(revs) <= size:
235 if len(revs) <= size:
236 return list(revs)
236 return list(revs)
237 sample = set(self._repo.revs(b'heads(%ld)', revs))
237 sample = set(self._repo.revs(b'heads(%ld)', revs))
238
238
239 if len(sample) >= size:
239 if len(sample) >= size:
240 return _limitsample(sample, size, randomize=self.randomize)
240 return _limitsample(sample, size, randomize=self.randomize)
241
241
242 _updatesample(
242 _updatesample(
243 None, headrevs, sample, self._parentsgetter(), quicksamplesize=size
243 None, headrevs, sample, self._parentsgetter(), quicksamplesize=size
244 )
244 )
245 return sample
245 return sample
246
246
247 def takefullsample(self, headrevs, size):
247 def takefullsample(self, headrevs, size):
248 revs = self.undecided
248 revs = self.undecided
249 if len(revs) <= size:
249 if len(revs) <= size:
250 return list(revs)
250 return list(revs)
251 repo = self._repo
251 repo = self._repo
252 sample = set(repo.revs(b'heads(%ld)', revs))
252 sample = set(repo.revs(b'heads(%ld)', revs))
253 parentrevs = self._parentsgetter()
253 parentrevs = self._parentsgetter()
254
254
255 # update from heads
255 # update from heads
256 revsheads = sample.copy()
256 revsheads = sample.copy()
257 _updatesample(revs, revsheads, sample, parentrevs)
257 _updatesample(revs, revsheads, sample, parentrevs)
258
258
259 # update from roots
259 # update from roots
260 revsroots = set(repo.revs(b'roots(%ld)', revs))
260 revsroots = set(repo.revs(b'roots(%ld)', revs))
261 childrenrevs = self._childrengetter()
261 childrenrevs = self._childrengetter()
262 _updatesample(revs, revsroots, sample, childrenrevs)
262 _updatesample(revs, revsroots, sample, childrenrevs)
263 assert sample
263 assert sample
264
264
265 if not self._respectsize:
265 if not self._respectsize:
266 size = max(size, min(len(revsroots), len(revsheads)))
266 size = max(size, min(len(revsroots), len(revsheads)))
267
267
268 sample = _limitsample(sample, size, randomize=self.randomize)
268 sample = _limitsample(sample, size, randomize=self.randomize)
269 if len(sample) < size:
269 if len(sample) < size:
270 more = size - len(sample)
270 more = size - len(sample)
271 takefrom = list(revs - sample)
271 takefrom = list(revs - sample)
272 if self.randomize:
272 if self.randomize:
273 sample.update(random.sample(takefrom, more))
273 sample.update(random.sample(takefrom, more))
274 else:
274 else:
275 takefrom.sort()
275 takefrom.sort()
276 sample.update(takefrom[:more])
276 sample.update(takefrom[:more])
277 return sample
277 return sample
278
278
279
279
280 partialdiscovery = policy.importrust(
280 partialdiscovery = policy.importrust(
281 'discovery', member='PartialDiscovery', default=partialdiscovery
281 'discovery', member='PartialDiscovery', default=partialdiscovery
282 )
282 )
283
283
284
284
285 def findcommonheads(
285 def findcommonheads(
286 ui,
286 ui,
287 local,
287 local,
288 remote,
288 remote,
289 initialsamplesize=100,
289 initialsamplesize=100,
290 fullsamplesize=200,
290 fullsamplesize=200,
291 abortwhenunrelated=True,
291 abortwhenunrelated=True,
292 ancestorsof=None,
292 ancestorsof=None,
293 audit=None,
293 audit=None,
294 ):
294 ):
295 """Return a tuple (common, anyincoming, remoteheads) used to identify
295 """Return a tuple (common, anyincoming, remoteheads) used to identify
296 missing nodes from or in remote.
296 missing nodes from or in remote.
297
297
298 The audit argument is an optional dictionnary that a caller can pass. it
298 The audit argument is an optional dictionnary that a caller can pass. it
299 will be updated with extra data about the discovery, this is useful for
299 will be updated with extra data about the discovery, this is useful for
300 debug.
300 debug.
301 """
301 """
302
302
303 samplegrowth = float(ui.config(b'devel', b'discovery.grow-sample.rate'))
303 samplegrowth = float(ui.config(b'devel', b'discovery.grow-sample.rate'))
304
304
305 start = util.timer()
305 start = util.timer()
306
306
307 roundtrips = 0
307 roundtrips = 0
308 cl = local.changelog
308 cl = local.changelog
309 clnode = cl.node
309 clnode = cl.node
310 clrev = cl.rev
310 clrev = cl.rev
311
311
312 if ancestorsof is not None:
312 if ancestorsof is not None:
313 ownheads = [clrev(n) for n in ancestorsof]
313 ownheads = [clrev(n) for n in ancestorsof]
314 else:
314 else:
315 ownheads = [rev for rev in cl.headrevs() if rev != nullrev]
315 ownheads = [rev for rev in cl.headrevs() if rev != nullrev]
316
316
317 initial_head_exchange = ui.configbool(b'devel', b'discovery.exchange-heads')
318
317 # We also ask remote about all the local heads. That set can be arbitrarily
319 # We also ask remote about all the local heads. That set can be arbitrarily
318 # large, so we used to limit it size to `initialsamplesize`. We no longer
320 # large, so we used to limit it size to `initialsamplesize`. We no longer
319 # do as it proved counter productive. The skipped heads could lead to a
321 # do as it proved counter productive. The skipped heads could lead to a
320 # large "undecided" set, slower to be clarified than if we asked the
322 # large "undecided" set, slower to be clarified than if we asked the
321 # question for all heads right away.
323 # question for all heads right away.
322 #
324 #
323 # We are already fetching all server heads using the `heads` commands,
325 # We are already fetching all server heads using the `heads` commands,
324 # sending a equivalent number of heads the other way should not have a
326 # sending a equivalent number of heads the other way should not have a
325 # significant impact. In addition, it is very likely that we are going to
327 # significant impact. In addition, it is very likely that we are going to
326 # have to issue "known" request for an equivalent amount of revisions in
328 # have to issue "known" request for an equivalent amount of revisions in
327 # order to decide if theses heads are common or missing.
329 # order to decide if theses heads are common or missing.
328 #
330 #
329 # find a detailled analysis below.
331 # find a detailled analysis below.
330 #
332 #
331 # Case A: local and server both has few heads
333 # Case A: local and server both has few heads
332 #
334 #
333 # Ownheads is below initialsamplesize, limit would not have any effect.
335 # Ownheads is below initialsamplesize, limit would not have any effect.
334 #
336 #
335 # Case B: local has few heads and server has many
337 # Case B: local has few heads and server has many
336 #
338 #
337 # Ownheads is below initialsamplesize, limit would not have any effect.
339 # Ownheads is below initialsamplesize, limit would not have any effect.
338 #
340 #
339 # Case C: local and server both has many heads
341 # Case C: local and server both has many heads
340 #
342 #
341 # We now transfert some more data, but not significantly more than is
343 # We now transfert some more data, but not significantly more than is
342 # already transfered to carry the server heads.
344 # already transfered to carry the server heads.
343 #
345 #
344 # Case D: local has many heads, server has few
346 # Case D: local has many heads, server has few
345 #
347 #
346 # D.1 local heads are mostly known remotely
348 # D.1 local heads are mostly known remotely
347 #
349 #
348 # All the known head will have be part of a `known` request at some
350 # All the known head will have be part of a `known` request at some
349 # point for the discovery to finish. Sending them all earlier is
351 # point for the discovery to finish. Sending them all earlier is
350 # actually helping.
352 # actually helping.
351 #
353 #
352 # (This case is fairly unlikely, it requires the numerous heads to all
354 # (This case is fairly unlikely, it requires the numerous heads to all
353 # be merged server side in only a few heads)
355 # be merged server side in only a few heads)
354 #
356 #
355 # D.2 local heads are mostly missing remotely
357 # D.2 local heads are mostly missing remotely
356 #
358 #
357 # To determine that the heads are missing, we'll have to issue `known`
359 # To determine that the heads are missing, we'll have to issue `known`
358 # request for them or one of their ancestors. This amount of `known`
360 # request for them or one of their ancestors. This amount of `known`
359 # request will likely be in the same order of magnitude than the amount
361 # request will likely be in the same order of magnitude than the amount
360 # of local heads.
362 # of local heads.
361 #
363 #
362 # The only case where we can be more efficient using `known` request on
364 # The only case where we can be more efficient using `known` request on
363 # ancestors are case were all the "missing" local heads are based on a
365 # ancestors are case were all the "missing" local heads are based on a
364 # few changeset, also "missing". This means we would have a "complex"
366 # few changeset, also "missing". This means we would have a "complex"
365 # graph (with many heads) attached to, but very independant to a the
367 # graph (with many heads) attached to, but very independant to a the
366 # "simple" graph on the server. This is a fairly usual case and have
368 # "simple" graph on the server. This is a fairly usual case and have
367 # not been met in the wild so far.
369 # not been met in the wild so far.
368 if remote.limitedarguments:
370 if initial_head_exchange:
369 sample = _limitsample(ownheads, initialsamplesize)
371 if remote.limitedarguments:
370 # indices between sample and externalized version must match
372 sample = _limitsample(ownheads, initialsamplesize)
371 sample = list(sample)
373 # indices between sample and externalized version must match
372 else:
374 sample = list(sample)
373 sample = ownheads
375 else:
376 sample = ownheads
374
377
375 ui.debug(b"query 1; heads\n")
378 ui.debug(b"query 1; heads\n")
376 roundtrips += 1
379 roundtrips += 1
377 with remote.commandexecutor() as e:
380 with remote.commandexecutor() as e:
378 fheads = e.callcommand(b'heads', {})
381 fheads = e.callcommand(b'heads', {})
379 fknown = e.callcommand(
382 fknown = e.callcommand(
380 b'known',
383 b'known',
381 {
384 {
382 b'nodes': [clnode(r) for r in sample],
385 b'nodes': [clnode(r) for r in sample],
383 },
386 },
384 )
387 )
388
389 srvheadhashes, yesno = fheads.result(), fknown.result()
385
390
386 srvheadhashes, yesno = fheads.result(), fknown.result()
391 if audit is not None:
387
392 audit[b'total-roundtrips'] = 1
388 if audit is not None:
389 audit[b'total-roundtrips'] = 1
390
393
391 if cl.tip() == nullid:
394 if cl.tip() == nullid:
392 if srvheadhashes != [nullid]:
395 if srvheadhashes != [nullid]:
393 return [nullid], True, srvheadhashes
396 return [nullid], True, srvheadhashes
394 return [nullid], False, []
397 return [nullid], False, []
398 else:
399 # we still need the remote head for the function return
400 with remote.commandexecutor() as e:
401 fheads = e.callcommand(b'heads', {})
402 srvheadhashes = fheads.result()
395
403
396 # start actual discovery (we note this before the next "if" for
404 # start actual discovery (we note this before the next "if" for
397 # compatibility reasons)
405 # compatibility reasons)
398 ui.status(_(b"searching for changes\n"))
406 ui.status(_(b"searching for changes\n"))
399
407
400 knownsrvheads = [] # revnos of remote heads that are known locally
408 knownsrvheads = [] # revnos of remote heads that are known locally
401 for node in srvheadhashes:
409 for node in srvheadhashes:
402 if node == nullid:
410 if node == nullid:
403 continue
411 continue
404
412
405 try:
413 try:
406 knownsrvheads.append(clrev(node))
414 knownsrvheads.append(clrev(node))
407 # Catches unknown and filtered nodes.
415 # Catches unknown and filtered nodes.
408 except error.LookupError:
416 except error.LookupError:
409 continue
417 continue
410
418
411 # early exit if we know all the specified remote heads already
419 if initial_head_exchange:
412 if len(knownsrvheads) == len(srvheadhashes):
420 # early exit if we know all the specified remote heads already
413 ui.debug(b"all remote heads known locally\n")
421 if len(knownsrvheads) == len(srvheadhashes):
414 return srvheadhashes, False, srvheadhashes
422 ui.debug(b"all remote heads known locally\n")
423 return srvheadhashes, False, srvheadhashes
415
424
416 if len(sample) == len(ownheads) and all(yesno):
425 if len(sample) == len(ownheads) and all(yesno):
417 ui.note(_(b"all local changesets known remotely\n"))
426 ui.note(_(b"all local changesets known remotely\n"))
418 ownheadhashes = [clnode(r) for r in ownheads]
427 ownheadhashes = [clnode(r) for r in ownheads]
419 return ownheadhashes, True, srvheadhashes
428 return ownheadhashes, True, srvheadhashes
420
429
421 # full blown discovery
430 # full blown discovery
422
431
423 # if the server has a limit to its arguments size, we can't grow the sample.
432 # if the server has a limit to its arguments size, we can't grow the sample.
424 hard_limit_sample = remote.limitedarguments
433 hard_limit_sample = remote.limitedarguments
425 grow_sample = local.ui.configbool(b'devel', b'discovery.grow-sample')
434 grow_sample = local.ui.configbool(b'devel', b'discovery.grow-sample')
426 hard_limit_sample = hard_limit_sample and grow_sample
435 hard_limit_sample = hard_limit_sample and grow_sample
427
436
428 randomize = ui.configbool(b'devel', b'discovery.randomize')
437 randomize = ui.configbool(b'devel', b'discovery.randomize')
429 disco = partialdiscovery(
438 disco = partialdiscovery(
430 local, ownheads, hard_limit_sample, randomize=randomize
439 local, ownheads, hard_limit_sample, randomize=randomize
431 )
440 )
432 # treat remote heads (and maybe own heads) as a first implicit sample
441 if initial_head_exchange:
433 # response
442 # treat remote heads (and maybe own heads) as a first implicit sample
434 disco.addcommons(knownsrvheads)
443 # response
435 disco.addinfo(zip(sample, yesno))
444 disco.addcommons(knownsrvheads)
445 disco.addinfo(zip(sample, yesno))
436
446
437 full = False
447 full = not initial_head_exchange
438 progress = ui.makeprogress(_(b'searching'), unit=_(b'queries'))
448 progress = ui.makeprogress(_(b'searching'), unit=_(b'queries'))
439 while not disco.iscomplete():
449 while not disco.iscomplete():
440
450
441 if full or disco.hasinfo():
451 if full or disco.hasinfo():
442 if full:
452 if full:
443 ui.note(_(b"sampling from both directions\n"))
453 ui.note(_(b"sampling from both directions\n"))
444 else:
454 else:
445 ui.debug(b"taking initial sample\n")
455 ui.debug(b"taking initial sample\n")
446 samplefunc = disco.takefullsample
456 samplefunc = disco.takefullsample
447 targetsize = fullsamplesize
457 targetsize = fullsamplesize
448 if not hard_limit_sample:
458 if not hard_limit_sample:
449 fullsamplesize = int(fullsamplesize * samplegrowth)
459 fullsamplesize = int(fullsamplesize * samplegrowth)
450 else:
460 else:
451 # use even cheaper initial sample
461 # use even cheaper initial sample
452 ui.debug(b"taking quick initial sample\n")
462 ui.debug(b"taking quick initial sample\n")
453 samplefunc = disco.takequicksample
463 samplefunc = disco.takequicksample
454 targetsize = initialsamplesize
464 targetsize = initialsamplesize
455 sample = samplefunc(ownheads, targetsize)
465 sample = samplefunc(ownheads, targetsize)
456
466
457 roundtrips += 1
467 roundtrips += 1
458 progress.update(roundtrips)
468 progress.update(roundtrips)
459 stats = disco.stats()
469 stats = disco.stats()
460 ui.debug(
470 ui.debug(
461 b"query %i; still undecided: %i, sample size is: %i\n"
471 b"query %i; still undecided: %i, sample size is: %i\n"
462 % (roundtrips, stats['undecided'], len(sample))
472 % (roundtrips, stats['undecided'], len(sample))
463 )
473 )
464
474
465 # indices between sample and externalized version must match
475 # indices between sample and externalized version must match
466 sample = list(sample)
476 sample = list(sample)
467
477
468 with remote.commandexecutor() as e:
478 with remote.commandexecutor() as e:
469 yesno = e.callcommand(
479 yesno = e.callcommand(
470 b'known',
480 b'known',
471 {
481 {
472 b'nodes': [clnode(r) for r in sample],
482 b'nodes': [clnode(r) for r in sample],
473 },
483 },
474 ).result()
484 ).result()
475
485
476 full = True
486 full = True
477
487
478 disco.addinfo(zip(sample, yesno))
488 disco.addinfo(zip(sample, yesno))
479
489
480 result = disco.commonheads()
490 result = disco.commonheads()
481 elapsed = util.timer() - start
491 elapsed = util.timer() - start
482 progress.complete()
492 progress.complete()
483 ui.debug(b"%d total queries in %.4fs\n" % (roundtrips, elapsed))
493 ui.debug(b"%d total queries in %.4fs\n" % (roundtrips, elapsed))
484 msg = (
494 msg = (
485 b'found %d common and %d unknown server heads,'
495 b'found %d common and %d unknown server heads,'
486 b' %d roundtrips in %.4fs\n'
496 b' %d roundtrips in %.4fs\n'
487 )
497 )
488 missing = set(result) - set(knownsrvheads)
498 missing = set(result) - set(knownsrvheads)
489 ui.log(b'discovery', msg, len(result), len(missing), roundtrips, elapsed)
499 ui.log(b'discovery', msg, len(result), len(missing), roundtrips, elapsed)
490
500
491 if audit is not None:
501 if audit is not None:
492 audit[b'total-roundtrips'] = roundtrips
502 audit[b'total-roundtrips'] = roundtrips
493
503
494 if not result and srvheadhashes != [nullid]:
504 if not result and srvheadhashes != [nullid]:
495 if abortwhenunrelated:
505 if abortwhenunrelated:
496 raise error.Abort(_(b"repository is unrelated"))
506 raise error.Abort(_(b"repository is unrelated"))
497 else:
507 else:
498 ui.warn(_(b"warning: repository is unrelated\n"))
508 ui.warn(_(b"warning: repository is unrelated\n"))
499 return (
509 return (
500 {nullid},
510 {nullid},
501 True,
511 True,
502 srvheadhashes,
512 srvheadhashes,
503 )
513 )
504
514
505 anyincoming = srvheadhashes != [nullid]
515 anyincoming = srvheadhashes != [nullid]
506 result = {clnode(r) for r in result}
516 result = {clnode(r) for r in result}
507 return result, anyincoming, srvheadhashes
517 return result, anyincoming, srvheadhashes
@@ -1,1583 +1,1582 b''
1
1
2 Function to test discovery between two repos in both directions, using both the local shortcut
2 Function to test discovery between two repos in both directions, using both the local shortcut
3 (which is currently not activated by default) and the full remotable protocol:
3 (which is currently not activated by default) and the full remotable protocol:
4
4
5 $ testdesc() { # revs_a, revs_b, dagdesc
5 $ testdesc() { # revs_a, revs_b, dagdesc
6 > if [ -d foo ]; then rm -rf foo; fi
6 > if [ -d foo ]; then rm -rf foo; fi
7 > hg init foo
7 > hg init foo
8 > cd foo
8 > cd foo
9 > hg debugbuilddag "$3"
9 > hg debugbuilddag "$3"
10 > hg clone . a $1 --quiet
10 > hg clone . a $1 --quiet
11 > hg clone . b $2 --quiet
11 > hg clone . b $2 --quiet
12 > echo
12 > echo
13 > echo "% -- a -> b tree"
13 > echo "% -- a -> b tree"
14 > hg -R a debugdiscovery b --verbose --old
14 > hg -R a debugdiscovery b --verbose --old
15 > echo
15 > echo
16 > echo "% -- a -> b set"
16 > echo "% -- a -> b set"
17 > hg -R a debugdiscovery b --verbose --debug --config progress.debug=true
17 > hg -R a debugdiscovery b --verbose --debug --config progress.debug=true
18 > echo
18 > echo
19 > echo "% -- a -> b set (tip only)"
19 > echo "% -- a -> b set (tip only)"
20 > hg -R a debugdiscovery b --verbose --debug --config progress.debug=true --rev tip
20 > hg -R a debugdiscovery b --verbose --debug --config progress.debug=true --rev tip
21 > echo
21 > echo
22 > echo "% -- b -> a tree"
22 > echo "% -- b -> a tree"
23 > hg -R b debugdiscovery a --verbose --old
23 > hg -R b debugdiscovery a --verbose --old
24 > echo
24 > echo
25 > echo "% -- b -> a set"
25 > echo "% -- b -> a set"
26 > hg -R b debugdiscovery a --verbose --debug --config progress.debug=true
26 > hg -R b debugdiscovery a --verbose --debug --config progress.debug=true
27 > echo
27 > echo
28 > echo "% -- b -> a set (tip only)"
28 > echo "% -- b -> a set (tip only)"
29 > hg -R b debugdiscovery a --verbose --debug --config progress.debug=true --rev tip
29 > hg -R b debugdiscovery a --verbose --debug --config progress.debug=true --rev tip
30 > cd ..
30 > cd ..
31 > }
31 > }
32
32
33
33
34 Small superset:
34 Small superset:
35
35
36 $ testdesc '-ra1 -ra2' '-rb1 -rb2 -rb3' '
36 $ testdesc '-ra1 -ra2' '-rb1 -rb2 -rb3' '
37 > +2:f +1:a1:b1
37 > +2:f +1:a1:b1
38 > <f +4 :a2
38 > <f +4 :a2
39 > +5 :b2
39 > +5 :b2
40 > <f +3 :b3'
40 > <f +3 :b3'
41
41
42 % -- a -> b tree
42 % -- a -> b tree
43 comparing with b
43 comparing with b
44 searching for changes
44 searching for changes
45 unpruned common: 01241442b3c2 66f7d451a68b b5714e113bc0
45 unpruned common: 01241442b3c2 66f7d451a68b b5714e113bc0
46 elapsed time: * seconds (glob)
46 elapsed time: * seconds (glob)
47 round-trips: 2
47 round-trips: 2
48 heads summary:
48 heads summary:
49 total common heads: 2
49 total common heads: 2
50 also local heads: 2
50 also local heads: 2
51 also remote heads: 1
51 also remote heads: 1
52 both: 1
52 both: 1
53 local heads: 2
53 local heads: 2
54 common: 2
54 common: 2
55 missing: 0
55 missing: 0
56 remote heads: 3
56 remote heads: 3
57 common: 1
57 common: 1
58 unknown: 2
58 unknown: 2
59 local changesets: 7
59 local changesets: 7
60 common: 7
60 common: 7
61 heads: 2
61 heads: 2
62 roots: 1
62 roots: 1
63 missing: 0
63 missing: 0
64 heads: 0
64 heads: 0
65 roots: 0
65 roots: 0
66 first undecided set: 3
66 first undecided set: 3
67 heads: 1
67 heads: 1
68 roots: 1
68 roots: 1
69 common: 3
69 common: 3
70 missing: 0
70 missing: 0
71 common heads: 01241442b3c2 b5714e113bc0
71 common heads: 01241442b3c2 b5714e113bc0
72
72
73 % -- a -> b set
73 % -- a -> b set
74 comparing with b
74 comparing with b
75 query 1; heads
75 query 1; heads
76 searching for changes
76 searching for changes
77 all local changesets known remotely
77 all local changesets known remotely
78 elapsed time: * seconds (glob)
78 elapsed time: * seconds (glob)
79 round-trips: 1
79 round-trips: 1
80 heads summary:
80 heads summary:
81 total common heads: 2
81 total common heads: 2
82 also local heads: 2
82 also local heads: 2
83 also remote heads: 1
83 also remote heads: 1
84 both: 1
84 both: 1
85 local heads: 2
85 local heads: 2
86 common: 2
86 common: 2
87 missing: 0
87 missing: 0
88 remote heads: 3
88 remote heads: 3
89 common: 1
89 common: 1
90 unknown: 2
90 unknown: 2
91 local changesets: 7
91 local changesets: 7
92 common: 7
92 common: 7
93 heads: 2
93 heads: 2
94 roots: 1
94 roots: 1
95 missing: 0
95 missing: 0
96 heads: 0
96 heads: 0
97 roots: 0
97 roots: 0
98 first undecided set: 3
98 first undecided set: 3
99 heads: 1
99 heads: 1
100 roots: 1
100 roots: 1
101 common: 3
101 common: 3
102 missing: 0
102 missing: 0
103 common heads: 01241442b3c2 b5714e113bc0
103 common heads: 01241442b3c2 b5714e113bc0
104
104
105 % -- a -> b set (tip only)
105 % -- a -> b set (tip only)
106 comparing with b
106 comparing with b
107 query 1; heads
107 query 1; heads
108 searching for changes
108 searching for changes
109 all local changesets known remotely
109 all local changesets known remotely
110 elapsed time: * seconds (glob)
110 elapsed time: * seconds (glob)
111 round-trips: 1
111 round-trips: 1
112 heads summary:
112 heads summary:
113 total common heads: 1
113 total common heads: 1
114 also local heads: 1
114 also local heads: 1
115 also remote heads: 0
115 also remote heads: 0
116 both: 0
116 both: 0
117 local heads: 2
117 local heads: 2
118 common: 1
118 common: 1
119 missing: 1
119 missing: 1
120 remote heads: 3
120 remote heads: 3
121 common: 0
121 common: 0
122 unknown: 3
122 unknown: 3
123 local changesets: 7
123 local changesets: 7
124 common: 6
124 common: 6
125 heads: 1
125 heads: 1
126 roots: 1
126 roots: 1
127 missing: 1
127 missing: 1
128 heads: 1
128 heads: 1
129 roots: 1
129 roots: 1
130 first undecided set: 6
130 first undecided set: 6
131 heads: 2
131 heads: 2
132 roots: 1
132 roots: 1
133 common: 5
133 common: 5
134 missing: 1
134 missing: 1
135 common heads: b5714e113bc0
135 common heads: b5714e113bc0
136
136
137 % -- b -> a tree
137 % -- b -> a tree
138 comparing with a
138 comparing with a
139 searching for changes
139 searching for changes
140 unpruned common: 01241442b3c2 b5714e113bc0
140 unpruned common: 01241442b3c2 b5714e113bc0
141 elapsed time: * seconds (glob)
141 elapsed time: * seconds (glob)
142 round-trips: 1
142 round-trips: 1
143 heads summary:
143 heads summary:
144 total common heads: 2
144 total common heads: 2
145 also local heads: 1
145 also local heads: 1
146 also remote heads: 2
146 also remote heads: 2
147 both: 1
147 both: 1
148 local heads: 3
148 local heads: 3
149 common: 1
149 common: 1
150 missing: 2
150 missing: 2
151 remote heads: 2
151 remote heads: 2
152 common: 2
152 common: 2
153 unknown: 0
153 unknown: 0
154 local changesets: 15
154 local changesets: 15
155 common: 7
155 common: 7
156 heads: 2
156 heads: 2
157 roots: 1
157 roots: 1
158 missing: 8
158 missing: 8
159 heads: 2
159 heads: 2
160 roots: 2
160 roots: 2
161 first undecided set: 8
161 first undecided set: 8
162 heads: 2
162 heads: 2
163 roots: 2
163 roots: 2
164 common: 0
164 common: 0
165 missing: 8
165 missing: 8
166 common heads: 01241442b3c2 b5714e113bc0
166 common heads: 01241442b3c2 b5714e113bc0
167
167
168 % -- b -> a set
168 % -- b -> a set
169 comparing with a
169 comparing with a
170 query 1; heads
170 query 1; heads
171 searching for changes
171 searching for changes
172 all remote heads known locally
172 all remote heads known locally
173 elapsed time: * seconds (glob)
173 elapsed time: * seconds (glob)
174 round-trips: 1
174 round-trips: 1
175 heads summary:
175 heads summary:
176 total common heads: 2
176 total common heads: 2
177 also local heads: 1
177 also local heads: 1
178 also remote heads: 2
178 also remote heads: 2
179 both: 1
179 both: 1
180 local heads: 3
180 local heads: 3
181 common: 1
181 common: 1
182 missing: 2
182 missing: 2
183 remote heads: 2
183 remote heads: 2
184 common: 2
184 common: 2
185 unknown: 0
185 unknown: 0
186 local changesets: 15
186 local changesets: 15
187 common: 7
187 common: 7
188 heads: 2
188 heads: 2
189 roots: 1
189 roots: 1
190 missing: 8
190 missing: 8
191 heads: 2
191 heads: 2
192 roots: 2
192 roots: 2
193 first undecided set: 8
193 first undecided set: 8
194 heads: 2
194 heads: 2
195 roots: 2
195 roots: 2
196 common: 0
196 common: 0
197 missing: 8
197 missing: 8
198 common heads: 01241442b3c2 b5714e113bc0
198 common heads: 01241442b3c2 b5714e113bc0
199
199
200 % -- b -> a set (tip only)
200 % -- b -> a set (tip only)
201 comparing with a
201 comparing with a
202 query 1; heads
202 query 1; heads
203 searching for changes
203 searching for changes
204 all remote heads known locally
204 all remote heads known locally
205 elapsed time: * seconds (glob)
205 elapsed time: * seconds (glob)
206 round-trips: 1
206 round-trips: 1
207 heads summary:
207 heads summary:
208 total common heads: 2
208 total common heads: 2
209 also local heads: 1
209 also local heads: 1
210 also remote heads: 2
210 also remote heads: 2
211 both: 1
211 both: 1
212 local heads: 3
212 local heads: 3
213 common: 1
213 common: 1
214 missing: 2
214 missing: 2
215 remote heads: 2
215 remote heads: 2
216 common: 2
216 common: 2
217 unknown: 0
217 unknown: 0
218 local changesets: 15
218 local changesets: 15
219 common: 7
219 common: 7
220 heads: 2
220 heads: 2
221 roots: 1
221 roots: 1
222 missing: 8
222 missing: 8
223 heads: 2
223 heads: 2
224 roots: 2
224 roots: 2
225 first undecided set: 8
225 first undecided set: 8
226 heads: 2
226 heads: 2
227 roots: 2
227 roots: 2
228 common: 0
228 common: 0
229 missing: 8
229 missing: 8
230 common heads: 01241442b3c2 b5714e113bc0
230 common heads: 01241442b3c2 b5714e113bc0
231
231
232
232
233 Many new:
233 Many new:
234
234
235 $ testdesc '-ra1 -ra2' '-rb' '
235 $ testdesc '-ra1 -ra2' '-rb' '
236 > +2:f +3:a1 +3:b
236 > +2:f +3:a1 +3:b
237 > <f +30 :a2'
237 > <f +30 :a2'
238
238
239 % -- a -> b tree
239 % -- a -> b tree
240 comparing with b
240 comparing with b
241 searching for changes
241 searching for changes
242 unpruned common: bebd167eb94d
242 unpruned common: bebd167eb94d
243 elapsed time: * seconds (glob)
243 elapsed time: * seconds (glob)
244 round-trips: 2
244 round-trips: 2
245 heads summary:
245 heads summary:
246 total common heads: 1
246 total common heads: 1
247 also local heads: 1
247 also local heads: 1
248 also remote heads: 0
248 also remote heads: 0
249 both: 0
249 both: 0
250 local heads: 2
250 local heads: 2
251 common: 1
251 common: 1
252 missing: 1
252 missing: 1
253 remote heads: 1
253 remote heads: 1
254 common: 0
254 common: 0
255 unknown: 1
255 unknown: 1
256 local changesets: 35
256 local changesets: 35
257 common: 5
257 common: 5
258 heads: 1
258 heads: 1
259 roots: 1
259 roots: 1
260 missing: 30
260 missing: 30
261 heads: 1
261 heads: 1
262 roots: 1
262 roots: 1
263 first undecided set: 34
263 first undecided set: 34
264 heads: 2
264 heads: 2
265 roots: 1
265 roots: 1
266 common: 4
266 common: 4
267 missing: 30
267 missing: 30
268 common heads: bebd167eb94d
268 common heads: bebd167eb94d
269
269
270 % -- a -> b set
270 % -- a -> b set
271 comparing with b
271 comparing with b
272 query 1; heads
272 query 1; heads
273 searching for changes
273 searching for changes
274 taking initial sample
274 taking initial sample
275 searching: 2 queries
275 searching: 2 queries
276 query 2; still undecided: 29, sample size is: 29
276 query 2; still undecided: 29, sample size is: 29
277 2 total queries in *.????s (glob)
277 2 total queries in *.????s (glob)
278 elapsed time: * seconds (glob)
278 elapsed time: * seconds (glob)
279 round-trips: 2
279 round-trips: 2
280 heads summary:
280 heads summary:
281 total common heads: 1
281 total common heads: 1
282 also local heads: 1
282 also local heads: 1
283 also remote heads: 0
283 also remote heads: 0
284 both: 0
284 both: 0
285 local heads: 2
285 local heads: 2
286 common: 1
286 common: 1
287 missing: 1
287 missing: 1
288 remote heads: 1
288 remote heads: 1
289 common: 0
289 common: 0
290 unknown: 1
290 unknown: 1
291 local changesets: 35
291 local changesets: 35
292 common: 5
292 common: 5
293 heads: 1
293 heads: 1
294 roots: 1
294 roots: 1
295 missing: 30
295 missing: 30
296 heads: 1
296 heads: 1
297 roots: 1
297 roots: 1
298 first undecided set: 34
298 first undecided set: 34
299 heads: 2
299 heads: 2
300 roots: 1
300 roots: 1
301 common: 4
301 common: 4
302 missing: 30
302 missing: 30
303 common heads: bebd167eb94d
303 common heads: bebd167eb94d
304
304
305 % -- a -> b set (tip only)
305 % -- a -> b set (tip only)
306 comparing with b
306 comparing with b
307 query 1; heads
307 query 1; heads
308 searching for changes
308 searching for changes
309 taking quick initial sample
309 taking quick initial sample
310 searching: 2 queries
310 searching: 2 queries
311 query 2; still undecided: 31, sample size is: 31
311 query 2; still undecided: 31, sample size is: 31
312 2 total queries in *.????s (glob)
312 2 total queries in *.????s (glob)
313 elapsed time: * seconds (glob)
313 elapsed time: * seconds (glob)
314 round-trips: 2
314 round-trips: 2
315 heads summary:
315 heads summary:
316 total common heads: 1
316 total common heads: 1
317 also local heads: 0
317 also local heads: 0
318 also remote heads: 0
318 also remote heads: 0
319 both: 0
319 both: 0
320 local heads: 2
320 local heads: 2
321 common: 0
321 common: 0
322 missing: 2
322 missing: 2
323 remote heads: 1
323 remote heads: 1
324 common: 0
324 common: 0
325 unknown: 1
325 unknown: 1
326 local changesets: 35
326 local changesets: 35
327 common: 2
327 common: 2
328 heads: 1
328 heads: 1
329 roots: 1
329 roots: 1
330 missing: 33
330 missing: 33
331 heads: 2
331 heads: 2
332 roots: 2
332 roots: 2
333 first undecided set: 35
333 first undecided set: 35
334 heads: 2
334 heads: 2
335 roots: 1
335 roots: 1
336 common: 2
336 common: 2
337 missing: 33
337 missing: 33
338 common heads: 66f7d451a68b
338 common heads: 66f7d451a68b
339
339
340 % -- b -> a tree
340 % -- b -> a tree
341 comparing with a
341 comparing with a
342 searching for changes
342 searching for changes
343 unpruned common: 66f7d451a68b bebd167eb94d
343 unpruned common: 66f7d451a68b bebd167eb94d
344 elapsed time: * seconds (glob)
344 elapsed time: * seconds (glob)
345 round-trips: 4
345 round-trips: 4
346 heads summary:
346 heads summary:
347 total common heads: 1
347 total common heads: 1
348 also local heads: 0
348 also local heads: 0
349 also remote heads: 1
349 also remote heads: 1
350 both: 0
350 both: 0
351 local heads: 1
351 local heads: 1
352 common: 0
352 common: 0
353 missing: 1
353 missing: 1
354 remote heads: 2
354 remote heads: 2
355 common: 1
355 common: 1
356 unknown: 1
356 unknown: 1
357 local changesets: 8
357 local changesets: 8
358 common: 5
358 common: 5
359 heads: 1
359 heads: 1
360 roots: 1
360 roots: 1
361 missing: 3
361 missing: 3
362 heads: 1
362 heads: 1
363 roots: 1
363 roots: 1
364 first undecided set: 3
364 first undecided set: 3
365 heads: 1
365 heads: 1
366 roots: 1
366 roots: 1
367 common: 0
367 common: 0
368 missing: 3
368 missing: 3
369 common heads: bebd167eb94d
369 common heads: bebd167eb94d
370
370
371 % -- b -> a set
371 % -- b -> a set
372 comparing with a
372 comparing with a
373 query 1; heads
373 query 1; heads
374 searching for changes
374 searching for changes
375 taking initial sample
375 taking initial sample
376 searching: 2 queries
376 searching: 2 queries
377 query 2; still undecided: 2, sample size is: 2
377 query 2; still undecided: 2, sample size is: 2
378 2 total queries in *.????s (glob)
378 2 total queries in *.????s (glob)
379 elapsed time: * seconds (glob)
379 elapsed time: * seconds (glob)
380 round-trips: 2
380 round-trips: 2
381 heads summary:
381 heads summary:
382 total common heads: 1
382 total common heads: 1
383 also local heads: 0
383 also local heads: 0
384 also remote heads: 1
384 also remote heads: 1
385 both: 0
385 both: 0
386 local heads: 1
386 local heads: 1
387 common: 0
387 common: 0
388 missing: 1
388 missing: 1
389 remote heads: 2
389 remote heads: 2
390 common: 1
390 common: 1
391 unknown: 1
391 unknown: 1
392 local changesets: 8
392 local changesets: 8
393 common: 5
393 common: 5
394 heads: 1
394 heads: 1
395 roots: 1
395 roots: 1
396 missing: 3
396 missing: 3
397 heads: 1
397 heads: 1
398 roots: 1
398 roots: 1
399 first undecided set: 3
399 first undecided set: 3
400 heads: 1
400 heads: 1
401 roots: 1
401 roots: 1
402 common: 0
402 common: 0
403 missing: 3
403 missing: 3
404 common heads: bebd167eb94d
404 common heads: bebd167eb94d
405
405
406 % -- b -> a set (tip only)
406 % -- b -> a set (tip only)
407 comparing with a
407 comparing with a
408 query 1; heads
408 query 1; heads
409 searching for changes
409 searching for changes
410 taking initial sample
410 taking initial sample
411 searching: 2 queries
411 searching: 2 queries
412 query 2; still undecided: 2, sample size is: 2
412 query 2; still undecided: 2, sample size is: 2
413 2 total queries in *.????s (glob)
413 2 total queries in *.????s (glob)
414 elapsed time: * seconds (glob)
414 elapsed time: * seconds (glob)
415 round-trips: 2
415 round-trips: 2
416 heads summary:
416 heads summary:
417 total common heads: 1
417 total common heads: 1
418 also local heads: 0
418 also local heads: 0
419 also remote heads: 1
419 also remote heads: 1
420 both: 0
420 both: 0
421 local heads: 1
421 local heads: 1
422 common: 0
422 common: 0
423 missing: 1
423 missing: 1
424 remote heads: 2
424 remote heads: 2
425 common: 1
425 common: 1
426 unknown: 1
426 unknown: 1
427 local changesets: 8
427 local changesets: 8
428 common: 5
428 common: 5
429 heads: 1
429 heads: 1
430 roots: 1
430 roots: 1
431 missing: 3
431 missing: 3
432 heads: 1
432 heads: 1
433 roots: 1
433 roots: 1
434 first undecided set: 3
434 first undecided set: 3
435 heads: 1
435 heads: 1
436 roots: 1
436 roots: 1
437 common: 0
437 common: 0
438 missing: 3
438 missing: 3
439 common heads: bebd167eb94d
439 common heads: bebd167eb94d
440
440
441 Both sides many new with stub:
441 Both sides many new with stub:
442
442
443 $ testdesc '-ra1 -ra2' '-rb' '
443 $ testdesc '-ra1 -ra2' '-rb' '
444 > +2:f +2:a1 +30 :b
444 > +2:f +2:a1 +30 :b
445 > <f +30 :a2'
445 > <f +30 :a2'
446
446
447 % -- a -> b tree
447 % -- a -> b tree
448 comparing with b
448 comparing with b
449 searching for changes
449 searching for changes
450 unpruned common: 2dc09a01254d
450 unpruned common: 2dc09a01254d
451 elapsed time: * seconds (glob)
451 elapsed time: * seconds (glob)
452 round-trips: 4
452 round-trips: 4
453 heads summary:
453 heads summary:
454 total common heads: 1
454 total common heads: 1
455 also local heads: 1
455 also local heads: 1
456 also remote heads: 0
456 also remote heads: 0
457 both: 0
457 both: 0
458 local heads: 2
458 local heads: 2
459 common: 1
459 common: 1
460 missing: 1
460 missing: 1
461 remote heads: 1
461 remote heads: 1
462 common: 0
462 common: 0
463 unknown: 1
463 unknown: 1
464 local changesets: 34
464 local changesets: 34
465 common: 4
465 common: 4
466 heads: 1
466 heads: 1
467 roots: 1
467 roots: 1
468 missing: 30
468 missing: 30
469 heads: 1
469 heads: 1
470 roots: 1
470 roots: 1
471 first undecided set: 33
471 first undecided set: 33
472 heads: 2
472 heads: 2
473 roots: 1
473 roots: 1
474 common: 3
474 common: 3
475 missing: 30
475 missing: 30
476 common heads: 2dc09a01254d
476 common heads: 2dc09a01254d
477
477
478 % -- a -> b set
478 % -- a -> b set
479 comparing with b
479 comparing with b
480 query 1; heads
480 query 1; heads
481 searching for changes
481 searching for changes
482 taking initial sample
482 taking initial sample
483 searching: 2 queries
483 searching: 2 queries
484 query 2; still undecided: 29, sample size is: 29
484 query 2; still undecided: 29, sample size is: 29
485 2 total queries in *.????s (glob)
485 2 total queries in *.????s (glob)
486 elapsed time: * seconds (glob)
486 elapsed time: * seconds (glob)
487 round-trips: 2
487 round-trips: 2
488 heads summary:
488 heads summary:
489 total common heads: 1
489 total common heads: 1
490 also local heads: 1
490 also local heads: 1
491 also remote heads: 0
491 also remote heads: 0
492 both: 0
492 both: 0
493 local heads: 2
493 local heads: 2
494 common: 1
494 common: 1
495 missing: 1
495 missing: 1
496 remote heads: 1
496 remote heads: 1
497 common: 0
497 common: 0
498 unknown: 1
498 unknown: 1
499 local changesets: 34
499 local changesets: 34
500 common: 4
500 common: 4
501 heads: 1
501 heads: 1
502 roots: 1
502 roots: 1
503 missing: 30
503 missing: 30
504 heads: 1
504 heads: 1
505 roots: 1
505 roots: 1
506 first undecided set: 33
506 first undecided set: 33
507 heads: 2
507 heads: 2
508 roots: 1
508 roots: 1
509 common: 3
509 common: 3
510 missing: 30
510 missing: 30
511 common heads: 2dc09a01254d
511 common heads: 2dc09a01254d
512
512
513 % -- a -> b set (tip only)
513 % -- a -> b set (tip only)
514 comparing with b
514 comparing with b
515 query 1; heads
515 query 1; heads
516 searching for changes
516 searching for changes
517 taking quick initial sample
517 taking quick initial sample
518 searching: 2 queries
518 searching: 2 queries
519 query 2; still undecided: 31, sample size is: 31
519 query 2; still undecided: 31, sample size is: 31
520 2 total queries in *.????s (glob)
520 2 total queries in *.????s (glob)
521 elapsed time: * seconds (glob)
521 elapsed time: * seconds (glob)
522 round-trips: 2
522 round-trips: 2
523 heads summary:
523 heads summary:
524 total common heads: 1
524 total common heads: 1
525 also local heads: 0
525 also local heads: 0
526 also remote heads: 0
526 also remote heads: 0
527 both: 0
527 both: 0
528 local heads: 2
528 local heads: 2
529 common: 0
529 common: 0
530 missing: 2
530 missing: 2
531 remote heads: 1
531 remote heads: 1
532 common: 0
532 common: 0
533 unknown: 1
533 unknown: 1
534 local changesets: 34
534 local changesets: 34
535 common: 2
535 common: 2
536 heads: 1
536 heads: 1
537 roots: 1
537 roots: 1
538 missing: 32
538 missing: 32
539 heads: 2
539 heads: 2
540 roots: 2
540 roots: 2
541 first undecided set: 34
541 first undecided set: 34
542 heads: 2
542 heads: 2
543 roots: 1
543 roots: 1
544 common: 2
544 common: 2
545 missing: 32
545 missing: 32
546 common heads: 66f7d451a68b
546 common heads: 66f7d451a68b
547
547
548 % -- b -> a tree
548 % -- b -> a tree
549 comparing with a
549 comparing with a
550 searching for changes
550 searching for changes
551 unpruned common: 2dc09a01254d 66f7d451a68b
551 unpruned common: 2dc09a01254d 66f7d451a68b
552 elapsed time: * seconds (glob)
552 elapsed time: * seconds (glob)
553 round-trips: 4
553 round-trips: 4
554 heads summary:
554 heads summary:
555 total common heads: 1
555 total common heads: 1
556 also local heads: 0
556 also local heads: 0
557 also remote heads: 1
557 also remote heads: 1
558 both: 0
558 both: 0
559 local heads: 1
559 local heads: 1
560 common: 0
560 common: 0
561 missing: 1
561 missing: 1
562 remote heads: 2
562 remote heads: 2
563 common: 1
563 common: 1
564 unknown: 1
564 unknown: 1
565 local changesets: 34
565 local changesets: 34
566 common: 4
566 common: 4
567 heads: 1
567 heads: 1
568 roots: 1
568 roots: 1
569 missing: 30
569 missing: 30
570 heads: 1
570 heads: 1
571 roots: 1
571 roots: 1
572 first undecided set: 30
572 first undecided set: 30
573 heads: 1
573 heads: 1
574 roots: 1
574 roots: 1
575 common: 0
575 common: 0
576 missing: 30
576 missing: 30
577 common heads: 2dc09a01254d
577 common heads: 2dc09a01254d
578
578
579 % -- b -> a set
579 % -- b -> a set
580 comparing with a
580 comparing with a
581 query 1; heads
581 query 1; heads
582 searching for changes
582 searching for changes
583 taking initial sample
583 taking initial sample
584 searching: 2 queries
584 searching: 2 queries
585 query 2; still undecided: 29, sample size is: 29
585 query 2; still undecided: 29, sample size is: 29
586 2 total queries in *.????s (glob)
586 2 total queries in *.????s (glob)
587 elapsed time: * seconds (glob)
587 elapsed time: * seconds (glob)
588 round-trips: 2
588 round-trips: 2
589 heads summary:
589 heads summary:
590 total common heads: 1
590 total common heads: 1
591 also local heads: 0
591 also local heads: 0
592 also remote heads: 1
592 also remote heads: 1
593 both: 0
593 both: 0
594 local heads: 1
594 local heads: 1
595 common: 0
595 common: 0
596 missing: 1
596 missing: 1
597 remote heads: 2
597 remote heads: 2
598 common: 1
598 common: 1
599 unknown: 1
599 unknown: 1
600 local changesets: 34
600 local changesets: 34
601 common: 4
601 common: 4
602 heads: 1
602 heads: 1
603 roots: 1
603 roots: 1
604 missing: 30
604 missing: 30
605 heads: 1
605 heads: 1
606 roots: 1
606 roots: 1
607 first undecided set: 30
607 first undecided set: 30
608 heads: 1
608 heads: 1
609 roots: 1
609 roots: 1
610 common: 0
610 common: 0
611 missing: 30
611 missing: 30
612 common heads: 2dc09a01254d
612 common heads: 2dc09a01254d
613
613
614 % -- b -> a set (tip only)
614 % -- b -> a set (tip only)
615 comparing with a
615 comparing with a
616 query 1; heads
616 query 1; heads
617 searching for changes
617 searching for changes
618 taking initial sample
618 taking initial sample
619 searching: 2 queries
619 searching: 2 queries
620 query 2; still undecided: 29, sample size is: 29
620 query 2; still undecided: 29, sample size is: 29
621 2 total queries in *.????s (glob)
621 2 total queries in *.????s (glob)
622 elapsed time: * seconds (glob)
622 elapsed time: * seconds (glob)
623 round-trips: 2
623 round-trips: 2
624 heads summary:
624 heads summary:
625 total common heads: 1
625 total common heads: 1
626 also local heads: 0
626 also local heads: 0
627 also remote heads: 1
627 also remote heads: 1
628 both: 0
628 both: 0
629 local heads: 1
629 local heads: 1
630 common: 0
630 common: 0
631 missing: 1
631 missing: 1
632 remote heads: 2
632 remote heads: 2
633 common: 1
633 common: 1
634 unknown: 1
634 unknown: 1
635 local changesets: 34
635 local changesets: 34
636 common: 4
636 common: 4
637 heads: 1
637 heads: 1
638 roots: 1
638 roots: 1
639 missing: 30
639 missing: 30
640 heads: 1
640 heads: 1
641 roots: 1
641 roots: 1
642 first undecided set: 30
642 first undecided set: 30
643 heads: 1
643 heads: 1
644 roots: 1
644 roots: 1
645 common: 0
645 common: 0
646 missing: 30
646 missing: 30
647 common heads: 2dc09a01254d
647 common heads: 2dc09a01254d
648
648
649
649
650 Both many new:
650 Both many new:
651
651
652 $ testdesc '-ra' '-rb' '
652 $ testdesc '-ra' '-rb' '
653 > +2:f +30 :b
653 > +2:f +30 :b
654 > <f +30 :a'
654 > <f +30 :a'
655
655
656 % -- a -> b tree
656 % -- a -> b tree
657 comparing with b
657 comparing with b
658 searching for changes
658 searching for changes
659 unpruned common: 66f7d451a68b
659 unpruned common: 66f7d451a68b
660 elapsed time: * seconds (glob)
660 elapsed time: * seconds (glob)
661 round-trips: 4
661 round-trips: 4
662 heads summary:
662 heads summary:
663 total common heads: 1
663 total common heads: 1
664 also local heads: 0
664 also local heads: 0
665 also remote heads: 0
665 also remote heads: 0
666 both: 0
666 both: 0
667 local heads: 1
667 local heads: 1
668 common: 0
668 common: 0
669 missing: 1
669 missing: 1
670 remote heads: 1
670 remote heads: 1
671 common: 0
671 common: 0
672 unknown: 1
672 unknown: 1
673 local changesets: 32
673 local changesets: 32
674 common: 2
674 common: 2
675 heads: 1
675 heads: 1
676 roots: 1
676 roots: 1
677 missing: 30
677 missing: 30
678 heads: 1
678 heads: 1
679 roots: 1
679 roots: 1
680 first undecided set: 32
680 first undecided set: 32
681 heads: 1
681 heads: 1
682 roots: 1
682 roots: 1
683 common: 2
683 common: 2
684 missing: 30
684 missing: 30
685 common heads: 66f7d451a68b
685 common heads: 66f7d451a68b
686
686
687 % -- a -> b set
687 % -- a -> b set
688 comparing with b
688 comparing with b
689 query 1; heads
689 query 1; heads
690 searching for changes
690 searching for changes
691 taking quick initial sample
691 taking quick initial sample
692 searching: 2 queries
692 searching: 2 queries
693 query 2; still undecided: 31, sample size is: 31
693 query 2; still undecided: 31, sample size is: 31
694 2 total queries in *.????s (glob)
694 2 total queries in *.????s (glob)
695 elapsed time: * seconds (glob)
695 elapsed time: * seconds (glob)
696 round-trips: 2
696 round-trips: 2
697 heads summary:
697 heads summary:
698 total common heads: 1
698 total common heads: 1
699 also local heads: 0
699 also local heads: 0
700 also remote heads: 0
700 also remote heads: 0
701 both: 0
701 both: 0
702 local heads: 1
702 local heads: 1
703 common: 0
703 common: 0
704 missing: 1
704 missing: 1
705 remote heads: 1
705 remote heads: 1
706 common: 0
706 common: 0
707 unknown: 1
707 unknown: 1
708 local changesets: 32
708 local changesets: 32
709 common: 2
709 common: 2
710 heads: 1
710 heads: 1
711 roots: 1
711 roots: 1
712 missing: 30
712 missing: 30
713 heads: 1
713 heads: 1
714 roots: 1
714 roots: 1
715 first undecided set: 32
715 first undecided set: 32
716 heads: 1
716 heads: 1
717 roots: 1
717 roots: 1
718 common: 2
718 common: 2
719 missing: 30
719 missing: 30
720 common heads: 66f7d451a68b
720 common heads: 66f7d451a68b
721
721
722 % -- a -> b set (tip only)
722 % -- a -> b set (tip only)
723 comparing with b
723 comparing with b
724 query 1; heads
724 query 1; heads
725 searching for changes
725 searching for changes
726 taking quick initial sample
726 taking quick initial sample
727 searching: 2 queries
727 searching: 2 queries
728 query 2; still undecided: 31, sample size is: 31
728 query 2; still undecided: 31, sample size is: 31
729 2 total queries in *.????s (glob)
729 2 total queries in *.????s (glob)
730 elapsed time: * seconds (glob)
730 elapsed time: * seconds (glob)
731 round-trips: 2
731 round-trips: 2
732 heads summary:
732 heads summary:
733 total common heads: 1
733 total common heads: 1
734 also local heads: 0
734 also local heads: 0
735 also remote heads: 0
735 also remote heads: 0
736 both: 0
736 both: 0
737 local heads: 1
737 local heads: 1
738 common: 0
738 common: 0
739 missing: 1
739 missing: 1
740 remote heads: 1
740 remote heads: 1
741 common: 0
741 common: 0
742 unknown: 1
742 unknown: 1
743 local changesets: 32
743 local changesets: 32
744 common: 2
744 common: 2
745 heads: 1
745 heads: 1
746 roots: 1
746 roots: 1
747 missing: 30
747 missing: 30
748 heads: 1
748 heads: 1
749 roots: 1
749 roots: 1
750 first undecided set: 32
750 first undecided set: 32
751 heads: 1
751 heads: 1
752 roots: 1
752 roots: 1
753 common: 2
753 common: 2
754 missing: 30
754 missing: 30
755 common heads: 66f7d451a68b
755 common heads: 66f7d451a68b
756
756
757 % -- b -> a tree
757 % -- b -> a tree
758 comparing with a
758 comparing with a
759 searching for changes
759 searching for changes
760 unpruned common: 66f7d451a68b
760 unpruned common: 66f7d451a68b
761 elapsed time: * seconds (glob)
761 elapsed time: * seconds (glob)
762 round-trips: 4
762 round-trips: 4
763 heads summary:
763 heads summary:
764 total common heads: 1
764 total common heads: 1
765 also local heads: 0
765 also local heads: 0
766 also remote heads: 0
766 also remote heads: 0
767 both: 0
767 both: 0
768 local heads: 1
768 local heads: 1
769 common: 0
769 common: 0
770 missing: 1
770 missing: 1
771 remote heads: 1
771 remote heads: 1
772 common: 0
772 common: 0
773 unknown: 1
773 unknown: 1
774 local changesets: 32
774 local changesets: 32
775 common: 2
775 common: 2
776 heads: 1
776 heads: 1
777 roots: 1
777 roots: 1
778 missing: 30
778 missing: 30
779 heads: 1
779 heads: 1
780 roots: 1
780 roots: 1
781 first undecided set: 32
781 first undecided set: 32
782 heads: 1
782 heads: 1
783 roots: 1
783 roots: 1
784 common: 2
784 common: 2
785 missing: 30
785 missing: 30
786 common heads: 66f7d451a68b
786 common heads: 66f7d451a68b
787
787
788 % -- b -> a set
788 % -- b -> a set
789 comparing with a
789 comparing with a
790 query 1; heads
790 query 1; heads
791 searching for changes
791 searching for changes
792 taking quick initial sample
792 taking quick initial sample
793 searching: 2 queries
793 searching: 2 queries
794 query 2; still undecided: 31, sample size is: 31
794 query 2; still undecided: 31, sample size is: 31
795 2 total queries in *.????s (glob)
795 2 total queries in *.????s (glob)
796 elapsed time: * seconds (glob)
796 elapsed time: * seconds (glob)
797 round-trips: 2
797 round-trips: 2
798 heads summary:
798 heads summary:
799 total common heads: 1
799 total common heads: 1
800 also local heads: 0
800 also local heads: 0
801 also remote heads: 0
801 also remote heads: 0
802 both: 0
802 both: 0
803 local heads: 1
803 local heads: 1
804 common: 0
804 common: 0
805 missing: 1
805 missing: 1
806 remote heads: 1
806 remote heads: 1
807 common: 0
807 common: 0
808 unknown: 1
808 unknown: 1
809 local changesets: 32
809 local changesets: 32
810 common: 2
810 common: 2
811 heads: 1
811 heads: 1
812 roots: 1
812 roots: 1
813 missing: 30
813 missing: 30
814 heads: 1
814 heads: 1
815 roots: 1
815 roots: 1
816 first undecided set: 32
816 first undecided set: 32
817 heads: 1
817 heads: 1
818 roots: 1
818 roots: 1
819 common: 2
819 common: 2
820 missing: 30
820 missing: 30
821 common heads: 66f7d451a68b
821 common heads: 66f7d451a68b
822
822
823 % -- b -> a set (tip only)
823 % -- b -> a set (tip only)
824 comparing with a
824 comparing with a
825 query 1; heads
825 query 1; heads
826 searching for changes
826 searching for changes
827 taking quick initial sample
827 taking quick initial sample
828 searching: 2 queries
828 searching: 2 queries
829 query 2; still undecided: 31, sample size is: 31
829 query 2; still undecided: 31, sample size is: 31
830 2 total queries in *.????s (glob)
830 2 total queries in *.????s (glob)
831 elapsed time: * seconds (glob)
831 elapsed time: * seconds (glob)
832 round-trips: 2
832 round-trips: 2
833 heads summary:
833 heads summary:
834 total common heads: 1
834 total common heads: 1
835 also local heads: 0
835 also local heads: 0
836 also remote heads: 0
836 also remote heads: 0
837 both: 0
837 both: 0
838 local heads: 1
838 local heads: 1
839 common: 0
839 common: 0
840 missing: 1
840 missing: 1
841 remote heads: 1
841 remote heads: 1
842 common: 0
842 common: 0
843 unknown: 1
843 unknown: 1
844 local changesets: 32
844 local changesets: 32
845 common: 2
845 common: 2
846 heads: 1
846 heads: 1
847 roots: 1
847 roots: 1
848 missing: 30
848 missing: 30
849 heads: 1
849 heads: 1
850 roots: 1
850 roots: 1
851 first undecided set: 32
851 first undecided set: 32
852 heads: 1
852 heads: 1
853 roots: 1
853 roots: 1
854 common: 2
854 common: 2
855 missing: 30
855 missing: 30
856 common heads: 66f7d451a68b
856 common heads: 66f7d451a68b
857
857
858
858
859 Both many new skewed:
859 Both many new skewed:
860
860
861 $ testdesc '-ra' '-rb' '
861 $ testdesc '-ra' '-rb' '
862 > +2:f +30 :b
862 > +2:f +30 :b
863 > <f +50 :a'
863 > <f +50 :a'
864
864
865 % -- a -> b tree
865 % -- a -> b tree
866 comparing with b
866 comparing with b
867 searching for changes
867 searching for changes
868 unpruned common: 66f7d451a68b
868 unpruned common: 66f7d451a68b
869 elapsed time: * seconds (glob)
869 elapsed time: * seconds (glob)
870 round-trips: 4
870 round-trips: 4
871 heads summary:
871 heads summary:
872 total common heads: 1
872 total common heads: 1
873 also local heads: 0
873 also local heads: 0
874 also remote heads: 0
874 also remote heads: 0
875 both: 0
875 both: 0
876 local heads: 1
876 local heads: 1
877 common: 0
877 common: 0
878 missing: 1
878 missing: 1
879 remote heads: 1
879 remote heads: 1
880 common: 0
880 common: 0
881 unknown: 1
881 unknown: 1
882 local changesets: 52
882 local changesets: 52
883 common: 2
883 common: 2
884 heads: 1
884 heads: 1
885 roots: 1
885 roots: 1
886 missing: 50
886 missing: 50
887 heads: 1
887 heads: 1
888 roots: 1
888 roots: 1
889 first undecided set: 52
889 first undecided set: 52
890 heads: 1
890 heads: 1
891 roots: 1
891 roots: 1
892 common: 2
892 common: 2
893 missing: 50
893 missing: 50
894 common heads: 66f7d451a68b
894 common heads: 66f7d451a68b
895
895
896 % -- a -> b set
896 % -- a -> b set
897 comparing with b
897 comparing with b
898 query 1; heads
898 query 1; heads
899 searching for changes
899 searching for changes
900 taking quick initial sample
900 taking quick initial sample
901 searching: 2 queries
901 searching: 2 queries
902 query 2; still undecided: 51, sample size is: 51
902 query 2; still undecided: 51, sample size is: 51
903 2 total queries in *.????s (glob)
903 2 total queries in *.????s (glob)
904 elapsed time: * seconds (glob)
904 elapsed time: * seconds (glob)
905 round-trips: 2
905 round-trips: 2
906 heads summary:
906 heads summary:
907 total common heads: 1
907 total common heads: 1
908 also local heads: 0
908 also local heads: 0
909 also remote heads: 0
909 also remote heads: 0
910 both: 0
910 both: 0
911 local heads: 1
911 local heads: 1
912 common: 0
912 common: 0
913 missing: 1
913 missing: 1
914 remote heads: 1
914 remote heads: 1
915 common: 0
915 common: 0
916 unknown: 1
916 unknown: 1
917 local changesets: 52
917 local changesets: 52
918 common: 2
918 common: 2
919 heads: 1
919 heads: 1
920 roots: 1
920 roots: 1
921 missing: 50
921 missing: 50
922 heads: 1
922 heads: 1
923 roots: 1
923 roots: 1
924 first undecided set: 52
924 first undecided set: 52
925 heads: 1
925 heads: 1
926 roots: 1
926 roots: 1
927 common: 2
927 common: 2
928 missing: 50
928 missing: 50
929 common heads: 66f7d451a68b
929 common heads: 66f7d451a68b
930
930
931 % -- a -> b set (tip only)
931 % -- a -> b set (tip only)
932 comparing with b
932 comparing with b
933 query 1; heads
933 query 1; heads
934 searching for changes
934 searching for changes
935 taking quick initial sample
935 taking quick initial sample
936 searching: 2 queries
936 searching: 2 queries
937 query 2; still undecided: 51, sample size is: 51
937 query 2; still undecided: 51, sample size is: 51
938 2 total queries in *.????s (glob)
938 2 total queries in *.????s (glob)
939 elapsed time: * seconds (glob)
939 elapsed time: * seconds (glob)
940 round-trips: 2
940 round-trips: 2
941 heads summary:
941 heads summary:
942 total common heads: 1
942 total common heads: 1
943 also local heads: 0
943 also local heads: 0
944 also remote heads: 0
944 also remote heads: 0
945 both: 0
945 both: 0
946 local heads: 1
946 local heads: 1
947 common: 0
947 common: 0
948 missing: 1
948 missing: 1
949 remote heads: 1
949 remote heads: 1
950 common: 0
950 common: 0
951 unknown: 1
951 unknown: 1
952 local changesets: 52
952 local changesets: 52
953 common: 2
953 common: 2
954 heads: 1
954 heads: 1
955 roots: 1
955 roots: 1
956 missing: 50
956 missing: 50
957 heads: 1
957 heads: 1
958 roots: 1
958 roots: 1
959 first undecided set: 52
959 first undecided set: 52
960 heads: 1
960 heads: 1
961 roots: 1
961 roots: 1
962 common: 2
962 common: 2
963 missing: 50
963 missing: 50
964 common heads: 66f7d451a68b
964 common heads: 66f7d451a68b
965
965
966 % -- b -> a tree
966 % -- b -> a tree
967 comparing with a
967 comparing with a
968 searching for changes
968 searching for changes
969 unpruned common: 66f7d451a68b
969 unpruned common: 66f7d451a68b
970 elapsed time: * seconds (glob)
970 elapsed time: * seconds (glob)
971 round-trips: 3
971 round-trips: 3
972 heads summary:
972 heads summary:
973 total common heads: 1
973 total common heads: 1
974 also local heads: 0
974 also local heads: 0
975 also remote heads: 0
975 also remote heads: 0
976 both: 0
976 both: 0
977 local heads: 1
977 local heads: 1
978 common: 0
978 common: 0
979 missing: 1
979 missing: 1
980 remote heads: 1
980 remote heads: 1
981 common: 0
981 common: 0
982 unknown: 1
982 unknown: 1
983 local changesets: 32
983 local changesets: 32
984 common: 2
984 common: 2
985 heads: 1
985 heads: 1
986 roots: 1
986 roots: 1
987 missing: 30
987 missing: 30
988 heads: 1
988 heads: 1
989 roots: 1
989 roots: 1
990 first undecided set: 32
990 first undecided set: 32
991 heads: 1
991 heads: 1
992 roots: 1
992 roots: 1
993 common: 2
993 common: 2
994 missing: 30
994 missing: 30
995 common heads: 66f7d451a68b
995 common heads: 66f7d451a68b
996
996
997 % -- b -> a set
997 % -- b -> a set
998 comparing with a
998 comparing with a
999 query 1; heads
999 query 1; heads
1000 searching for changes
1000 searching for changes
1001 taking quick initial sample
1001 taking quick initial sample
1002 searching: 2 queries
1002 searching: 2 queries
1003 query 2; still undecided: 31, sample size is: 31
1003 query 2; still undecided: 31, sample size is: 31
1004 2 total queries in *.????s (glob)
1004 2 total queries in *.????s (glob)
1005 elapsed time: * seconds (glob)
1005 elapsed time: * seconds (glob)
1006 round-trips: 2
1006 round-trips: 2
1007 heads summary:
1007 heads summary:
1008 total common heads: 1
1008 total common heads: 1
1009 also local heads: 0
1009 also local heads: 0
1010 also remote heads: 0
1010 also remote heads: 0
1011 both: 0
1011 both: 0
1012 local heads: 1
1012 local heads: 1
1013 common: 0
1013 common: 0
1014 missing: 1
1014 missing: 1
1015 remote heads: 1
1015 remote heads: 1
1016 common: 0
1016 common: 0
1017 unknown: 1
1017 unknown: 1
1018 local changesets: 32
1018 local changesets: 32
1019 common: 2
1019 common: 2
1020 heads: 1
1020 heads: 1
1021 roots: 1
1021 roots: 1
1022 missing: 30
1022 missing: 30
1023 heads: 1
1023 heads: 1
1024 roots: 1
1024 roots: 1
1025 first undecided set: 32
1025 first undecided set: 32
1026 heads: 1
1026 heads: 1
1027 roots: 1
1027 roots: 1
1028 common: 2
1028 common: 2
1029 missing: 30
1029 missing: 30
1030 common heads: 66f7d451a68b
1030 common heads: 66f7d451a68b
1031
1031
1032 % -- b -> a set (tip only)
1032 % -- b -> a set (tip only)
1033 comparing with a
1033 comparing with a
1034 query 1; heads
1034 query 1; heads
1035 searching for changes
1035 searching for changes
1036 taking quick initial sample
1036 taking quick initial sample
1037 searching: 2 queries
1037 searching: 2 queries
1038 query 2; still undecided: 31, sample size is: 31
1038 query 2; still undecided: 31, sample size is: 31
1039 2 total queries in *.????s (glob)
1039 2 total queries in *.????s (glob)
1040 elapsed time: * seconds (glob)
1040 elapsed time: * seconds (glob)
1041 round-trips: 2
1041 round-trips: 2
1042 heads summary:
1042 heads summary:
1043 total common heads: 1
1043 total common heads: 1
1044 also local heads: 0
1044 also local heads: 0
1045 also remote heads: 0
1045 also remote heads: 0
1046 both: 0
1046 both: 0
1047 local heads: 1
1047 local heads: 1
1048 common: 0
1048 common: 0
1049 missing: 1
1049 missing: 1
1050 remote heads: 1
1050 remote heads: 1
1051 common: 0
1051 common: 0
1052 unknown: 1
1052 unknown: 1
1053 local changesets: 32
1053 local changesets: 32
1054 common: 2
1054 common: 2
1055 heads: 1
1055 heads: 1
1056 roots: 1
1056 roots: 1
1057 missing: 30
1057 missing: 30
1058 heads: 1
1058 heads: 1
1059 roots: 1
1059 roots: 1
1060 first undecided set: 32
1060 first undecided set: 32
1061 heads: 1
1061 heads: 1
1062 roots: 1
1062 roots: 1
1063 common: 2
1063 common: 2
1064 missing: 30
1064 missing: 30
1065 common heads: 66f7d451a68b
1065 common heads: 66f7d451a68b
1066
1066
1067
1067
1068 Both many new on top of long history:
1068 Both many new on top of long history:
1069
1069
1070 $ testdesc '-ra' '-rb' '
1070 $ testdesc '-ra' '-rb' '
1071 > +1000:f +30 :b
1071 > +1000:f +30 :b
1072 > <f +50 :a'
1072 > <f +50 :a'
1073
1073
1074 % -- a -> b tree
1074 % -- a -> b tree
1075 comparing with b
1075 comparing with b
1076 searching for changes
1076 searching for changes
1077 unpruned common: 7ead0cba2838
1077 unpruned common: 7ead0cba2838
1078 elapsed time: * seconds (glob)
1078 elapsed time: * seconds (glob)
1079 round-trips: 4
1079 round-trips: 4
1080 heads summary:
1080 heads summary:
1081 total common heads: 1
1081 total common heads: 1
1082 also local heads: 0
1082 also local heads: 0
1083 also remote heads: 0
1083 also remote heads: 0
1084 both: 0
1084 both: 0
1085 local heads: 1
1085 local heads: 1
1086 common: 0
1086 common: 0
1087 missing: 1
1087 missing: 1
1088 remote heads: 1
1088 remote heads: 1
1089 common: 0
1089 common: 0
1090 unknown: 1
1090 unknown: 1
1091 local changesets: 1050
1091 local changesets: 1050
1092 common: 1000
1092 common: 1000
1093 heads: 1
1093 heads: 1
1094 roots: 1
1094 roots: 1
1095 missing: 50
1095 missing: 50
1096 heads: 1
1096 heads: 1
1097 roots: 1
1097 roots: 1
1098 first undecided set: 1050
1098 first undecided set: 1050
1099 heads: 1
1099 heads: 1
1100 roots: 1
1100 roots: 1
1101 common: 1000
1101 common: 1000
1102 missing: 50
1102 missing: 50
1103 common heads: 7ead0cba2838
1103 common heads: 7ead0cba2838
1104
1104
1105 % -- a -> b set
1105 % -- a -> b set
1106 comparing with b
1106 comparing with b
1107 query 1; heads
1107 query 1; heads
1108 searching for changes
1108 searching for changes
1109 taking quick initial sample
1109 taking quick initial sample
1110 searching: 2 queries
1110 searching: 2 queries
1111 query 2; still undecided: 1049, sample size is: 11
1111 query 2; still undecided: 1049, sample size is: 11
1112 sampling from both directions
1112 sampling from both directions
1113 searching: 3 queries
1113 searching: 3 queries
1114 query 3; still undecided: 31, sample size is: 31
1114 query 3; still undecided: 31, sample size is: 31
1115 3 total queries in *.????s (glob)
1115 3 total queries in *.????s (glob)
1116 elapsed time: * seconds (glob)
1116 elapsed time: * seconds (glob)
1117 round-trips: 3
1117 round-trips: 3
1118 heads summary:
1118 heads summary:
1119 total common heads: 1
1119 total common heads: 1
1120 also local heads: 0
1120 also local heads: 0
1121 also remote heads: 0
1121 also remote heads: 0
1122 both: 0
1122 both: 0
1123 local heads: 1
1123 local heads: 1
1124 common: 0
1124 common: 0
1125 missing: 1
1125 missing: 1
1126 remote heads: 1
1126 remote heads: 1
1127 common: 0
1127 common: 0
1128 unknown: 1
1128 unknown: 1
1129 local changesets: 1050
1129 local changesets: 1050
1130 common: 1000
1130 common: 1000
1131 heads: 1
1131 heads: 1
1132 roots: 1
1132 roots: 1
1133 missing: 50
1133 missing: 50
1134 heads: 1
1134 heads: 1
1135 roots: 1
1135 roots: 1
1136 first undecided set: 1050
1136 first undecided set: 1050
1137 heads: 1
1137 heads: 1
1138 roots: 1
1138 roots: 1
1139 common: 1000
1139 common: 1000
1140 missing: 50
1140 missing: 50
1141 common heads: 7ead0cba2838
1141 common heads: 7ead0cba2838
1142
1142
1143 % -- a -> b set (tip only)
1143 % -- a -> b set (tip only)
1144 comparing with b
1144 comparing with b
1145 query 1; heads
1145 query 1; heads
1146 searching for changes
1146 searching for changes
1147 taking quick initial sample
1147 taking quick initial sample
1148 searching: 2 queries
1148 searching: 2 queries
1149 query 2; still undecided: 1049, sample size is: 11
1149 query 2; still undecided: 1049, sample size is: 11
1150 sampling from both directions
1150 sampling from both directions
1151 searching: 3 queries
1151 searching: 3 queries
1152 query 3; still undecided: 31, sample size is: 31
1152 query 3; still undecided: 31, sample size is: 31
1153 3 total queries in *.????s (glob)
1153 3 total queries in *.????s (glob)
1154 elapsed time: * seconds (glob)
1154 elapsed time: * seconds (glob)
1155 round-trips: 3
1155 round-trips: 3
1156 heads summary:
1156 heads summary:
1157 total common heads: 1
1157 total common heads: 1
1158 also local heads: 0
1158 also local heads: 0
1159 also remote heads: 0
1159 also remote heads: 0
1160 both: 0
1160 both: 0
1161 local heads: 1
1161 local heads: 1
1162 common: 0
1162 common: 0
1163 missing: 1
1163 missing: 1
1164 remote heads: 1
1164 remote heads: 1
1165 common: 0
1165 common: 0
1166 unknown: 1
1166 unknown: 1
1167 local changesets: 1050
1167 local changesets: 1050
1168 common: 1000
1168 common: 1000
1169 heads: 1
1169 heads: 1
1170 roots: 1
1170 roots: 1
1171 missing: 50
1171 missing: 50
1172 heads: 1
1172 heads: 1
1173 roots: 1
1173 roots: 1
1174 first undecided set: 1050
1174 first undecided set: 1050
1175 heads: 1
1175 heads: 1
1176 roots: 1
1176 roots: 1
1177 common: 1000
1177 common: 1000
1178 missing: 50
1178 missing: 50
1179 common heads: 7ead0cba2838
1179 common heads: 7ead0cba2838
1180
1180
1181 % -- b -> a tree
1181 % -- b -> a tree
1182 comparing with a
1182 comparing with a
1183 searching for changes
1183 searching for changes
1184 unpruned common: 7ead0cba2838
1184 unpruned common: 7ead0cba2838
1185 elapsed time: * seconds (glob)
1185 elapsed time: * seconds (glob)
1186 round-trips: 3
1186 round-trips: 3
1187 heads summary:
1187 heads summary:
1188 total common heads: 1
1188 total common heads: 1
1189 also local heads: 0
1189 also local heads: 0
1190 also remote heads: 0
1190 also remote heads: 0
1191 both: 0
1191 both: 0
1192 local heads: 1
1192 local heads: 1
1193 common: 0
1193 common: 0
1194 missing: 1
1194 missing: 1
1195 remote heads: 1
1195 remote heads: 1
1196 common: 0
1196 common: 0
1197 unknown: 1
1197 unknown: 1
1198 local changesets: 1030
1198 local changesets: 1030
1199 common: 1000
1199 common: 1000
1200 heads: 1
1200 heads: 1
1201 roots: 1
1201 roots: 1
1202 missing: 30
1202 missing: 30
1203 heads: 1
1203 heads: 1
1204 roots: 1
1204 roots: 1
1205 first undecided set: 1030
1205 first undecided set: 1030
1206 heads: 1
1206 heads: 1
1207 roots: 1
1207 roots: 1
1208 common: 1000
1208 common: 1000
1209 missing: 30
1209 missing: 30
1210 common heads: 7ead0cba2838
1210 common heads: 7ead0cba2838
1211
1211
1212 % -- b -> a set
1212 % -- b -> a set
1213 comparing with a
1213 comparing with a
1214 query 1; heads
1214 query 1; heads
1215 searching for changes
1215 searching for changes
1216 taking quick initial sample
1216 taking quick initial sample
1217 searching: 2 queries
1217 searching: 2 queries
1218 query 2; still undecided: 1029, sample size is: 11
1218 query 2; still undecided: 1029, sample size is: 11
1219 sampling from both directions
1219 sampling from both directions
1220 searching: 3 queries
1220 searching: 3 queries
1221 query 3; still undecided: 15, sample size is: 15
1221 query 3; still undecided: 15, sample size is: 15
1222 3 total queries in *.????s (glob)
1222 3 total queries in *.????s (glob)
1223 elapsed time: * seconds (glob)
1223 elapsed time: * seconds (glob)
1224 round-trips: 3
1224 round-trips: 3
1225 heads summary:
1225 heads summary:
1226 total common heads: 1
1226 total common heads: 1
1227 also local heads: 0
1227 also local heads: 0
1228 also remote heads: 0
1228 also remote heads: 0
1229 both: 0
1229 both: 0
1230 local heads: 1
1230 local heads: 1
1231 common: 0
1231 common: 0
1232 missing: 1
1232 missing: 1
1233 remote heads: 1
1233 remote heads: 1
1234 common: 0
1234 common: 0
1235 unknown: 1
1235 unknown: 1
1236 local changesets: 1030
1236 local changesets: 1030
1237 common: 1000
1237 common: 1000
1238 heads: 1
1238 heads: 1
1239 roots: 1
1239 roots: 1
1240 missing: 30
1240 missing: 30
1241 heads: 1
1241 heads: 1
1242 roots: 1
1242 roots: 1
1243 first undecided set: 1030
1243 first undecided set: 1030
1244 heads: 1
1244 heads: 1
1245 roots: 1
1245 roots: 1
1246 common: 1000
1246 common: 1000
1247 missing: 30
1247 missing: 30
1248 common heads: 7ead0cba2838
1248 common heads: 7ead0cba2838
1249
1249
1250 % -- b -> a set (tip only)
1250 % -- b -> a set (tip only)
1251 comparing with a
1251 comparing with a
1252 query 1; heads
1252 query 1; heads
1253 searching for changes
1253 searching for changes
1254 taking quick initial sample
1254 taking quick initial sample
1255 searching: 2 queries
1255 searching: 2 queries
1256 query 2; still undecided: 1029, sample size is: 11
1256 query 2; still undecided: 1029, sample size is: 11
1257 sampling from both directions
1257 sampling from both directions
1258 searching: 3 queries
1258 searching: 3 queries
1259 query 3; still undecided: 15, sample size is: 15
1259 query 3; still undecided: 15, sample size is: 15
1260 3 total queries in *.????s (glob)
1260 3 total queries in *.????s (glob)
1261 elapsed time: * seconds (glob)
1261 elapsed time: * seconds (glob)
1262 round-trips: 3
1262 round-trips: 3
1263 heads summary:
1263 heads summary:
1264 total common heads: 1
1264 total common heads: 1
1265 also local heads: 0
1265 also local heads: 0
1266 also remote heads: 0
1266 also remote heads: 0
1267 both: 0
1267 both: 0
1268 local heads: 1
1268 local heads: 1
1269 common: 0
1269 common: 0
1270 missing: 1
1270 missing: 1
1271 remote heads: 1
1271 remote heads: 1
1272 common: 0
1272 common: 0
1273 unknown: 1
1273 unknown: 1
1274 local changesets: 1030
1274 local changesets: 1030
1275 common: 1000
1275 common: 1000
1276 heads: 1
1276 heads: 1
1277 roots: 1
1277 roots: 1
1278 missing: 30
1278 missing: 30
1279 heads: 1
1279 heads: 1
1280 roots: 1
1280 roots: 1
1281 first undecided set: 1030
1281 first undecided set: 1030
1282 heads: 1
1282 heads: 1
1283 roots: 1
1283 roots: 1
1284 common: 1000
1284 common: 1000
1285 missing: 30
1285 missing: 30
1286 common heads: 7ead0cba2838
1286 common heads: 7ead0cba2838
1287
1287
1288
1288
1289 One with >200 heads. We now switch to send them all in the initial roundtrip, but still do sampling for the later request.
1289 One with >200 heads. We now switch to send them all in the initial roundtrip, but still do sampling for the later request.
1290
1290
1291 $ hg init manyheads
1291 $ hg init manyheads
1292 $ cd manyheads
1292 $ cd manyheads
1293 $ echo "+300:r @a" >dagdesc
1293 $ echo "+300:r @a" >dagdesc
1294 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
1294 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
1295 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
1295 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
1296 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
1296 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
1297 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
1297 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
1298 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
1298 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
1299 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
1299 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
1300 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
1300 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
1301 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
1301 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
1302 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
1302 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
1303 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
1303 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
1304 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
1304 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
1305 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
1305 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
1306 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
1306 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
1307 $ echo "@b *r+3" >>dagdesc # one more head
1307 $ echo "@b *r+3" >>dagdesc # one more head
1308 $ hg debugbuilddag <dagdesc
1308 $ hg debugbuilddag <dagdesc
1309 reading DAG from stdin
1309 reading DAG from stdin
1310
1310
1311 $ hg heads -t --template . | wc -c
1311 $ hg heads -t --template . | wc -c
1312 \s*261 (re)
1312 \s*261 (re)
1313
1313
1314 $ hg clone -b a . a
1314 $ hg clone -b a . a
1315 adding changesets
1315 adding changesets
1316 adding manifests
1316 adding manifests
1317 adding file changes
1317 adding file changes
1318 added 1340 changesets with 0 changes to 0 files (+259 heads)
1318 added 1340 changesets with 0 changes to 0 files (+259 heads)
1319 new changesets 1ea73414a91b:1c51e2c80832
1319 new changesets 1ea73414a91b:1c51e2c80832
1320 updating to branch a
1320 updating to branch a
1321 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
1321 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
1322 $ hg clone -b b . b
1322 $ hg clone -b b . b
1323 adding changesets
1323 adding changesets
1324 adding manifests
1324 adding manifests
1325 adding file changes
1325 adding file changes
1326 added 304 changesets with 0 changes to 0 files
1326 added 304 changesets with 0 changes to 0 files
1327 new changesets 1ea73414a91b:513314ca8b3a
1327 new changesets 1ea73414a91b:513314ca8b3a
1328 updating to branch b
1328 updating to branch b
1329 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
1329 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
1330
1330
1331 $ hg -R a debugdiscovery b --debug --verbose --config progress.debug=true --config devel.discovery.randomize=false
1331 $ hg -R a debugdiscovery b --debug --verbose --config progress.debug=true --config devel.discovery.randomize=false
1332 comparing with b
1332 comparing with b
1333 query 1; heads
1333 query 1; heads
1334 searching for changes
1334 searching for changes
1335 taking quick initial sample
1335 taking quick initial sample
1336 searching: 2 queries
1336 searching: 2 queries
1337 query 2; still undecided: 1080, sample size is: 100
1337 query 2; still undecided: 1080, sample size is: 100
1338 sampling from both directions
1338 sampling from both directions
1339 searching: 3 queries
1339 searching: 3 queries
1340 query 3; still undecided: 980, sample size is: 200
1340 query 3; still undecided: 980, sample size is: 200
1341 sampling from both directions
1341 sampling from both directions
1342 searching: 4 queries
1342 searching: 4 queries
1343 query 4; still undecided: 497, sample size is: 210
1343 query 4; still undecided: 497, sample size is: 210
1344 sampling from both directions
1344 sampling from both directions
1345 searching: 5 queries
1345 searching: 5 queries
1346 query 5; still undecided: 285, sample size is: 220
1346 query 5; still undecided: 285, sample size is: 220
1347 sampling from both directions
1347 sampling from both directions
1348 searching: 6 queries
1348 searching: 6 queries
1349 query 6; still undecided: 63, sample size is: 63
1349 query 6; still undecided: 63, sample size is: 63
1350 6 total queries in *.????s (glob)
1350 6 total queries in *.????s (glob)
1351 elapsed time: * seconds (glob)
1351 elapsed time: * seconds (glob)
1352 round-trips: 6
1352 round-trips: 6
1353 heads summary:
1353 heads summary:
1354 total common heads: 1
1354 total common heads: 1
1355 also local heads: 0
1355 also local heads: 0
1356 also remote heads: 0
1356 also remote heads: 0
1357 both: 0
1357 both: 0
1358 local heads: 260
1358 local heads: 260
1359 common: 0
1359 common: 0
1360 missing: 260
1360 missing: 260
1361 remote heads: 1
1361 remote heads: 1
1362 common: 0
1362 common: 0
1363 unknown: 1
1363 unknown: 1
1364 local changesets: 1340
1364 local changesets: 1340
1365 common: 300
1365 common: 300
1366 heads: 1
1366 heads: 1
1367 roots: 1
1367 roots: 1
1368 missing: 1040
1368 missing: 1040
1369 heads: 260
1369 heads: 260
1370 roots: 260
1370 roots: 260
1371 first undecided set: 1340
1371 first undecided set: 1340
1372 heads: 260
1372 heads: 260
1373 roots: 1
1373 roots: 1
1374 common: 300
1374 common: 300
1375 missing: 1040
1375 missing: 1040
1376 common heads: 3ee37d65064a
1376 common heads: 3ee37d65064a
1377 $ hg -R a debugdiscovery b --debug --verbose --config progress.debug=true --rev tip
1377 $ hg -R a debugdiscovery b --debug --verbose --config progress.debug=true --rev tip
1378 comparing with b
1378 comparing with b
1379 query 1; heads
1379 query 1; heads
1380 searching for changes
1380 searching for changes
1381 taking quick initial sample
1381 taking quick initial sample
1382 searching: 2 queries
1382 searching: 2 queries
1383 query 2; still undecided: 303, sample size is: 9
1383 query 2; still undecided: 303, sample size is: 9
1384 sampling from both directions
1384 sampling from both directions
1385 searching: 3 queries
1385 searching: 3 queries
1386 query 3; still undecided: 3, sample size is: 3
1386 query 3; still undecided: 3, sample size is: 3
1387 3 total queries in *.????s (glob)
1387 3 total queries in *.????s (glob)
1388 elapsed time: * seconds (glob)
1388 elapsed time: * seconds (glob)
1389 round-trips: 3
1389 round-trips: 3
1390 heads summary:
1390 heads summary:
1391 total common heads: 1
1391 total common heads: 1
1392 also local heads: 0
1392 also local heads: 0
1393 also remote heads: 0
1393 also remote heads: 0
1394 both: 0
1394 both: 0
1395 local heads: 260
1395 local heads: 260
1396 common: 0
1396 common: 0
1397 missing: 260
1397 missing: 260
1398 remote heads: 1
1398 remote heads: 1
1399 common: 0
1399 common: 0
1400 unknown: 1
1400 unknown: 1
1401 local changesets: 1340
1401 local changesets: 1340
1402 common: 300
1402 common: 300
1403 heads: 1
1403 heads: 1
1404 roots: 1
1404 roots: 1
1405 missing: 1040
1405 missing: 1040
1406 heads: 260
1406 heads: 260
1407 roots: 260
1407 roots: 260
1408 first undecided set: 1340
1408 first undecided set: 1340
1409 heads: 260
1409 heads: 260
1410 roots: 1
1410 roots: 1
1411 common: 300
1411 common: 300
1412 missing: 1040
1412 missing: 1040
1413 common heads: 3ee37d65064a
1413 common heads: 3ee37d65064a
1414
1414
1415 $ hg -R a debugdiscovery b --debug --config devel.discovery.randomize=false --config devel.discovery.grow-sample.rate=1.01
1415 $ hg -R a debugdiscovery b --debug --config devel.discovery.exchange-heads=false --config devel.discovery.randomize=false --config devel.discovery.grow-sample.rate=1.01
1416 comparing with b
1416 comparing with b
1417 query 1; heads
1418 searching for changes
1417 searching for changes
1419 taking quick initial sample
1420 query 2; still undecided: 1080, sample size is: 100
1421 sampling from both directions
1418 sampling from both directions
1422 query 3; still undecided: 980, sample size is: 200
1419 query 1; still undecided: 1340, sample size is: 200
1420 sampling from both directions
1421 query 2; still undecided: 795, sample size is: 202
1423 sampling from both directions
1422 sampling from both directions
1424 query 4; still undecided: 497, sample size is: 202
1423 query 3; still undecided: 525, sample size is: 204
1425 sampling from both directions
1424 sampling from both directions
1426 query 5; still undecided: 294, sample size is: 204
1425 query 4; still undecided: 252, sample size is: 206
1427 sampling from both directions
1426 sampling from both directions
1428 query 6; still undecided: 90, sample size is: 90
1427 query 5; still undecided: 44, sample size is: 44
1429 6 total queries in *s (glob)
1428 5 total queries in *s (glob)
1430 elapsed time: * seconds (glob)
1429 elapsed time: * seconds (glob)
1431 round-trips: 6
1430 round-trips: 5
1432 heads summary:
1431 heads summary:
1433 total common heads: 1
1432 total common heads: 1
1434 also local heads: 0
1433 also local heads: 0
1435 also remote heads: 0
1434 also remote heads: 0
1436 both: 0
1435 both: 0
1437 local heads: 260
1436 local heads: 260
1438 common: 0
1437 common: 0
1439 missing: 260
1438 missing: 260
1440 remote heads: 1
1439 remote heads: 1
1441 common: 0
1440 common: 0
1442 unknown: 1
1441 unknown: 1
1443 local changesets: 1340
1442 local changesets: 1340
1444 common: 300
1443 common: 300
1445 heads: 1
1444 heads: 1
1446 roots: 1
1445 roots: 1
1447 missing: 1040
1446 missing: 1040
1448 heads: 260
1447 heads: 260
1449 roots: 260
1448 roots: 260
1450 first undecided set: 1340
1449 first undecided set: 1340
1451 heads: 260
1450 heads: 260
1452 roots: 1
1451 roots: 1
1453 common: 300
1452 common: 300
1454 missing: 1040
1453 missing: 1040
1455 common heads: 3ee37d65064a
1454 common heads: 3ee37d65064a
1456
1455
1457 Test actual protocol when pulling one new head in addition to common heads
1456 Test actual protocol when pulling one new head in addition to common heads
1458
1457
1459 $ hg clone -U b c
1458 $ hg clone -U b c
1460 $ hg -R c id -ir tip
1459 $ hg -R c id -ir tip
1461 513314ca8b3a
1460 513314ca8b3a
1462 $ hg -R c up -qr default
1461 $ hg -R c up -qr default
1463 $ touch c/f
1462 $ touch c/f
1464 $ hg -R c ci -Aqm "extra head"
1463 $ hg -R c ci -Aqm "extra head"
1465 $ hg -R c id -i
1464 $ hg -R c id -i
1466 e64a39e7da8b
1465 e64a39e7da8b
1467
1466
1468 $ hg serve -R c -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
1467 $ hg serve -R c -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
1469 $ cat hg.pid >> $DAEMON_PIDS
1468 $ cat hg.pid >> $DAEMON_PIDS
1470
1469
1471 $ hg -R b incoming http://localhost:$HGPORT/ -T '{node|short}\n'
1470 $ hg -R b incoming http://localhost:$HGPORT/ -T '{node|short}\n'
1472 comparing with http://localhost:$HGPORT/
1471 comparing with http://localhost:$HGPORT/
1473 searching for changes
1472 searching for changes
1474 e64a39e7da8b
1473 e64a39e7da8b
1475
1474
1476 $ killdaemons.py
1475 $ killdaemons.py
1477 $ cut -d' ' -f6- access.log | grep -v cmd=known # cmd=known uses random sampling
1476 $ cut -d' ' -f6- access.log | grep -v cmd=known # cmd=known uses random sampling
1478 "GET /?cmd=capabilities HTTP/1.1" 200 -
1477 "GET /?cmd=capabilities HTTP/1.1" 200 -
1479 "GET /?cmd=batch HTTP/1.1" 200 - x-hgarg-1:cmds=heads+%3Bknown+nodes%3D513314ca8b3ae4dac8eec56966265b00fcf866db x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
1478 "GET /?cmd=batch HTTP/1.1" 200 - x-hgarg-1:cmds=heads+%3Bknown+nodes%3D513314ca8b3ae4dac8eec56966265b00fcf866db x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
1480 "GET /?cmd=getbundle HTTP/1.1" 200 - x-hgarg-1:$USUAL_BUNDLE_CAPS$&cg=1&common=513314ca8b3ae4dac8eec56966265b00fcf866db&heads=e64a39e7da8b0d54bc63e81169aff001c13b3477 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
1479 "GET /?cmd=getbundle HTTP/1.1" 200 - x-hgarg-1:$USUAL_BUNDLE_CAPS$&cg=1&common=513314ca8b3ae4dac8eec56966265b00fcf866db&heads=e64a39e7da8b0d54bc63e81169aff001c13b3477 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
1481 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
1480 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
1482 $ cat errors.log
1481 $ cat errors.log
1483
1482
1484 $ cd ..
1483 $ cd ..
1485
1484
1486
1485
1487 Issue 4438 - test coverage for 3ef893520a85 issues.
1486 Issue 4438 - test coverage for 3ef893520a85 issues.
1488
1487
1489 $ mkdir issue4438
1488 $ mkdir issue4438
1490 $ cd issue4438
1489 $ cd issue4438
1491 #if false
1490 #if false
1492 generate new bundles:
1491 generate new bundles:
1493 $ hg init r1
1492 $ hg init r1
1494 $ for i in `"$PYTHON" $TESTDIR/seq.py 101`; do hg -R r1 up -qr null && hg -R r1 branch -q b$i && hg -R r1 ci -qmb$i; done
1493 $ for i in `"$PYTHON" $TESTDIR/seq.py 101`; do hg -R r1 up -qr null && hg -R r1 branch -q b$i && hg -R r1 ci -qmb$i; done
1495 $ hg clone -q r1 r2
1494 $ hg clone -q r1 r2
1496 $ for i in `"$PYTHON" $TESTDIR/seq.py 10`; do hg -R r1 up -qr null && hg -R r1 branch -q c$i && hg -R r1 ci -qmc$i; done
1495 $ for i in `"$PYTHON" $TESTDIR/seq.py 10`; do hg -R r1 up -qr null && hg -R r1 branch -q c$i && hg -R r1 ci -qmc$i; done
1497 $ hg -R r2 branch -q r2change && hg -R r2 ci -qmr2change
1496 $ hg -R r2 branch -q r2change && hg -R r2 ci -qmr2change
1498 $ hg -R r1 bundle -qa $TESTDIR/bundles/issue4438-r1.hg
1497 $ hg -R r1 bundle -qa $TESTDIR/bundles/issue4438-r1.hg
1499 $ hg -R r2 bundle -qa $TESTDIR/bundles/issue4438-r2.hg
1498 $ hg -R r2 bundle -qa $TESTDIR/bundles/issue4438-r2.hg
1500 #else
1499 #else
1501 use existing bundles:
1500 use existing bundles:
1502 $ hg init r1
1501 $ hg init r1
1503 $ hg -R r1 -q unbundle $TESTDIR/bundles/issue4438-r1.hg
1502 $ hg -R r1 -q unbundle $TESTDIR/bundles/issue4438-r1.hg
1504 $ hg -R r1 -q up
1503 $ hg -R r1 -q up
1505 $ hg init r2
1504 $ hg init r2
1506 $ hg -R r2 -q unbundle $TESTDIR/bundles/issue4438-r2.hg
1505 $ hg -R r2 -q unbundle $TESTDIR/bundles/issue4438-r2.hg
1507 $ hg -R r2 -q up
1506 $ hg -R r2 -q up
1508 #endif
1507 #endif
1509
1508
1510 Set iteration order could cause wrong and unstable results - fixed in 73cfaa348650:
1509 Set iteration order could cause wrong and unstable results - fixed in 73cfaa348650:
1511
1510
1512 $ hg -R r1 outgoing r2 -T'{rev} '
1511 $ hg -R r1 outgoing r2 -T'{rev} '
1513 comparing with r2
1512 comparing with r2
1514 searching for changes
1513 searching for changes
1515 101 102 103 104 105 106 107 108 109 110 (no-eol)
1514 101 102 103 104 105 106 107 108 109 110 (no-eol)
1516
1515
1517 The case where all the 'initialsamplesize' samples already were common would
1516 The case where all the 'initialsamplesize' samples already were common would
1518 give 'all remote heads known locally' without checking the remaining heads -
1517 give 'all remote heads known locally' without checking the remaining heads -
1519 fixed in 86c35b7ae300:
1518 fixed in 86c35b7ae300:
1520
1519
1521 $ cat >> r1/.hg/hgrc << EOF
1520 $ cat >> r1/.hg/hgrc << EOF
1522 > [devel]
1521 > [devel]
1523 > discovery.randomize = False
1522 > discovery.randomize = False
1524 > EOF
1523 > EOF
1525
1524
1526 $ hg -R r1 outgoing r2 -T'{rev} ' --config extensions.blackbox= \
1525 $ hg -R r1 outgoing r2 -T'{rev} ' --config extensions.blackbox= \
1527 > --config blackbox.track='command commandfinish discovery'
1526 > --config blackbox.track='command commandfinish discovery'
1528 comparing with r2
1527 comparing with r2
1529 searching for changes
1528 searching for changes
1530 101 102 103 104 105 106 107 108 109 110 (no-eol)
1529 101 102 103 104 105 106 107 108 109 110 (no-eol)
1531 $ hg -R r1 --config extensions.blackbox= blackbox --config blackbox.track=
1530 $ hg -R r1 --config extensions.blackbox= blackbox --config blackbox.track=
1532 * @5d0b986a083e0d91f116de4691e2aaa54d5bbec0 (*)> serve --cmdserver chgunix * (glob) (chg !)
1531 * @5d0b986a083e0d91f116de4691e2aaa54d5bbec0 (*)> serve --cmdserver chgunix * (glob) (chg !)
1533 * @5d0b986a083e0d91f116de4691e2aaa54d5bbec0 (*)> -R r1 outgoing r2 *-T{rev} * --config *extensions.blackbox=* (glob)
1532 * @5d0b986a083e0d91f116de4691e2aaa54d5bbec0 (*)> -R r1 outgoing r2 *-T{rev} * --config *extensions.blackbox=* (glob)
1534 * @5d0b986a083e0d91f116de4691e2aaa54d5bbec0 (*)> found 101 common and 1 unknown server heads, 1 roundtrips in *.????s (glob)
1533 * @5d0b986a083e0d91f116de4691e2aaa54d5bbec0 (*)> found 101 common and 1 unknown server heads, 1 roundtrips in *.????s (glob)
1535 * @5d0b986a083e0d91f116de4691e2aaa54d5bbec0 (*)> -R r1 outgoing r2 *-T{rev} * --config *extensions.blackbox=* exited 0 after *.?? seconds (glob)
1534 * @5d0b986a083e0d91f116de4691e2aaa54d5bbec0 (*)> -R r1 outgoing r2 *-T{rev} * --config *extensions.blackbox=* exited 0 after *.?? seconds (glob)
1536 $ cd ..
1535 $ cd ..
1537
1536
1538 Even if the set of revs to discover is restricted, unrelated revs may be
1537 Even if the set of revs to discover is restricted, unrelated revs may be
1539 returned as common heads.
1538 returned as common heads.
1540
1539
1541 $ mkdir ancestorsof
1540 $ mkdir ancestorsof
1542 $ cd ancestorsof
1541 $ cd ancestorsof
1543 $ hg init a
1542 $ hg init a
1544 $ hg clone a b -q
1543 $ hg clone a b -q
1545 $ cd b
1544 $ cd b
1546 $ hg debugbuilddag '.:root *root *root'
1545 $ hg debugbuilddag '.:root *root *root'
1547 $ hg log -G -T '{node|short}'
1546 $ hg log -G -T '{node|short}'
1548 o fa942426a6fd
1547 o fa942426a6fd
1549 |
1548 |
1550 | o 66f7d451a68b
1549 | o 66f7d451a68b
1551 |/
1550 |/
1552 o 1ea73414a91b
1551 o 1ea73414a91b
1553
1552
1554 $ hg push -r 66f7d451a68b -q
1553 $ hg push -r 66f7d451a68b -q
1555 $ hg debugdiscovery --verbose --rev fa942426a6fd
1554 $ hg debugdiscovery --verbose --rev fa942426a6fd
1556 comparing with $TESTTMP/ancestorsof/a
1555 comparing with $TESTTMP/ancestorsof/a
1557 searching for changes
1556 searching for changes
1558 elapsed time: * seconds (glob)
1557 elapsed time: * seconds (glob)
1559 round-trips: 1
1558 round-trips: 1
1560 heads summary:
1559 heads summary:
1561 total common heads: 1
1560 total common heads: 1
1562 also local heads: 1
1561 also local heads: 1
1563 also remote heads: 1
1562 also remote heads: 1
1564 both: 1
1563 both: 1
1565 local heads: 2
1564 local heads: 2
1566 common: 1
1565 common: 1
1567 missing: 1
1566 missing: 1
1568 remote heads: 1
1567 remote heads: 1
1569 common: 1
1568 common: 1
1570 unknown: 0
1569 unknown: 0
1571 local changesets: 3
1570 local changesets: 3
1572 common: 2
1571 common: 2
1573 heads: 1
1572 heads: 1
1574 roots: 1
1573 roots: 1
1575 missing: 1
1574 missing: 1
1576 heads: 1
1575 heads: 1
1577 roots: 1
1576 roots: 1
1578 first undecided set: 1
1577 first undecided set: 1
1579 heads: 1
1578 heads: 1
1580 roots: 1
1579 roots: 1
1581 common: 0
1580 common: 0
1582 missing: 1
1581 missing: 1
1583 common heads: 66f7d451a68b
1582 common heads: 66f7d451a68b
General Comments 0
You need to be logged in to leave comments. Login now