##// END OF EJS Templates
discovery: add a discovery.grow-sample.rate...
marmoute -
r46926:867304e7 default draft
parent child Browse files
Show More
@@ -1,2564 +1,2570 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 coreconfigitem(
638 coreconfigitem(
639 b'devel',
639 b'devel',
640 b'persistent-nodemap',
640 b'persistent-nodemap',
641 default=False,
641 default=False,
642 )
642 )
643 coreconfigitem(
643 coreconfigitem(
644 b'devel',
644 b'devel',
645 b'servercafile',
645 b'servercafile',
646 default=b'',
646 default=b'',
647 )
647 )
648 coreconfigitem(
648 coreconfigitem(
649 b'devel',
649 b'devel',
650 b'serverexactprotocol',
650 b'serverexactprotocol',
651 default=b'',
651 default=b'',
652 )
652 )
653 coreconfigitem(
653 coreconfigitem(
654 b'devel',
654 b'devel',
655 b'serverrequirecert',
655 b'serverrequirecert',
656 default=False,
656 default=False,
657 )
657 )
658 coreconfigitem(
658 coreconfigitem(
659 b'devel',
659 b'devel',
660 b'strip-obsmarkers',
660 b'strip-obsmarkers',
661 default=True,
661 default=True,
662 )
662 )
663 coreconfigitem(
663 coreconfigitem(
664 b'devel',
664 b'devel',
665 b'warn-config',
665 b'warn-config',
666 default=None,
666 default=None,
667 )
667 )
668 coreconfigitem(
668 coreconfigitem(
669 b'devel',
669 b'devel',
670 b'warn-config-default',
670 b'warn-config-default',
671 default=None,
671 default=None,
672 )
672 )
673 coreconfigitem(
673 coreconfigitem(
674 b'devel',
674 b'devel',
675 b'user.obsmarker',
675 b'user.obsmarker',
676 default=None,
676 default=None,
677 )
677 )
678 coreconfigitem(
678 coreconfigitem(
679 b'devel',
679 b'devel',
680 b'warn-config-unknown',
680 b'warn-config-unknown',
681 default=None,
681 default=None,
682 )
682 )
683 coreconfigitem(
683 coreconfigitem(
684 b'devel',
684 b'devel',
685 b'debug.copies',
685 b'debug.copies',
686 default=False,
686 default=False,
687 )
687 )
688 coreconfigitem(
688 coreconfigitem(
689 b'devel',
689 b'devel',
690 b'debug.extensions',
690 b'debug.extensions',
691 default=False,
691 default=False,
692 )
692 )
693 coreconfigitem(
693 coreconfigitem(
694 b'devel',
694 b'devel',
695 b'debug.repo-filters',
695 b'debug.repo-filters',
696 default=False,
696 default=False,
697 )
697 )
698 coreconfigitem(
698 coreconfigitem(
699 b'devel',
699 b'devel',
700 b'debug.peer-request',
700 b'debug.peer-request',
701 default=False,
701 default=False,
702 )
702 )
703 # If discovery.grow-sample is False, the sample size used in set discovery will
703 # If discovery.grow-sample is False, the sample size used in set discovery will
704 # not be increased through the process
704 # not be increased through the process
705 coreconfigitem(
705 coreconfigitem(
706 b'devel',
706 b'devel',
707 b'discovery.grow-sample',
707 b'discovery.grow-sample',
708 default=True,
708 default=True,
709 )
709 )
710 # discovery.grow-sample.rate control the rate at which the sample grow
711 coreconfigitem(
712 b'devel',
713 b'discovery.grow-sample.rate',
714 default=1.05,
715 )
710 # If discovery.randomize is False, random sampling during discovery are
716 # If discovery.randomize is False, random sampling during discovery are
711 # deterministic. It is meant for integration tests.
717 # deterministic. It is meant for integration tests.
712 coreconfigitem(
718 coreconfigitem(
713 b'devel',
719 b'devel',
714 b'discovery.randomize',
720 b'discovery.randomize',
715 default=True,
721 default=True,
716 )
722 )
717 _registerdiffopts(section=b'diff')
723 _registerdiffopts(section=b'diff')
718 coreconfigitem(
724 coreconfigitem(
719 b'email',
725 b'email',
720 b'bcc',
726 b'bcc',
721 default=None,
727 default=None,
722 )
728 )
723 coreconfigitem(
729 coreconfigitem(
724 b'email',
730 b'email',
725 b'cc',
731 b'cc',
726 default=None,
732 default=None,
727 )
733 )
728 coreconfigitem(
734 coreconfigitem(
729 b'email',
735 b'email',
730 b'charsets',
736 b'charsets',
731 default=list,
737 default=list,
732 )
738 )
733 coreconfigitem(
739 coreconfigitem(
734 b'email',
740 b'email',
735 b'from',
741 b'from',
736 default=None,
742 default=None,
737 )
743 )
738 coreconfigitem(
744 coreconfigitem(
739 b'email',
745 b'email',
740 b'method',
746 b'method',
741 default=b'smtp',
747 default=b'smtp',
742 )
748 )
743 coreconfigitem(
749 coreconfigitem(
744 b'email',
750 b'email',
745 b'reply-to',
751 b'reply-to',
746 default=None,
752 default=None,
747 )
753 )
748 coreconfigitem(
754 coreconfigitem(
749 b'email',
755 b'email',
750 b'to',
756 b'to',
751 default=None,
757 default=None,
752 )
758 )
753 coreconfigitem(
759 coreconfigitem(
754 b'experimental',
760 b'experimental',
755 b'archivemetatemplate',
761 b'archivemetatemplate',
756 default=dynamicdefault,
762 default=dynamicdefault,
757 )
763 )
758 coreconfigitem(
764 coreconfigitem(
759 b'experimental',
765 b'experimental',
760 b'auto-publish',
766 b'auto-publish',
761 default=b'publish',
767 default=b'publish',
762 )
768 )
763 coreconfigitem(
769 coreconfigitem(
764 b'experimental',
770 b'experimental',
765 b'bundle-phases',
771 b'bundle-phases',
766 default=False,
772 default=False,
767 )
773 )
768 coreconfigitem(
774 coreconfigitem(
769 b'experimental',
775 b'experimental',
770 b'bundle2-advertise',
776 b'bundle2-advertise',
771 default=True,
777 default=True,
772 )
778 )
773 coreconfigitem(
779 coreconfigitem(
774 b'experimental',
780 b'experimental',
775 b'bundle2-output-capture',
781 b'bundle2-output-capture',
776 default=False,
782 default=False,
777 )
783 )
778 coreconfigitem(
784 coreconfigitem(
779 b'experimental',
785 b'experimental',
780 b'bundle2.pushback',
786 b'bundle2.pushback',
781 default=False,
787 default=False,
782 )
788 )
783 coreconfigitem(
789 coreconfigitem(
784 b'experimental',
790 b'experimental',
785 b'bundle2lazylocking',
791 b'bundle2lazylocking',
786 default=False,
792 default=False,
787 )
793 )
788 coreconfigitem(
794 coreconfigitem(
789 b'experimental',
795 b'experimental',
790 b'bundlecomplevel',
796 b'bundlecomplevel',
791 default=None,
797 default=None,
792 )
798 )
793 coreconfigitem(
799 coreconfigitem(
794 b'experimental',
800 b'experimental',
795 b'bundlecomplevel.bzip2',
801 b'bundlecomplevel.bzip2',
796 default=None,
802 default=None,
797 )
803 )
798 coreconfigitem(
804 coreconfigitem(
799 b'experimental',
805 b'experimental',
800 b'bundlecomplevel.gzip',
806 b'bundlecomplevel.gzip',
801 default=None,
807 default=None,
802 )
808 )
803 coreconfigitem(
809 coreconfigitem(
804 b'experimental',
810 b'experimental',
805 b'bundlecomplevel.none',
811 b'bundlecomplevel.none',
806 default=None,
812 default=None,
807 )
813 )
808 coreconfigitem(
814 coreconfigitem(
809 b'experimental',
815 b'experimental',
810 b'bundlecomplevel.zstd',
816 b'bundlecomplevel.zstd',
811 default=None,
817 default=None,
812 )
818 )
813 coreconfigitem(
819 coreconfigitem(
814 b'experimental',
820 b'experimental',
815 b'changegroup3',
821 b'changegroup3',
816 default=False,
822 default=False,
817 )
823 )
818 coreconfigitem(
824 coreconfigitem(
819 b'experimental',
825 b'experimental',
820 b'cleanup-as-archived',
826 b'cleanup-as-archived',
821 default=False,
827 default=False,
822 )
828 )
823 coreconfigitem(
829 coreconfigitem(
824 b'experimental',
830 b'experimental',
825 b'clientcompressionengines',
831 b'clientcompressionengines',
826 default=list,
832 default=list,
827 )
833 )
828 coreconfigitem(
834 coreconfigitem(
829 b'experimental',
835 b'experimental',
830 b'copytrace',
836 b'copytrace',
831 default=b'on',
837 default=b'on',
832 )
838 )
833 coreconfigitem(
839 coreconfigitem(
834 b'experimental',
840 b'experimental',
835 b'copytrace.movecandidateslimit',
841 b'copytrace.movecandidateslimit',
836 default=100,
842 default=100,
837 )
843 )
838 coreconfigitem(
844 coreconfigitem(
839 b'experimental',
845 b'experimental',
840 b'copytrace.sourcecommitlimit',
846 b'copytrace.sourcecommitlimit',
841 default=100,
847 default=100,
842 )
848 )
843 coreconfigitem(
849 coreconfigitem(
844 b'experimental',
850 b'experimental',
845 b'copies.read-from',
851 b'copies.read-from',
846 default=b"filelog-only",
852 default=b"filelog-only",
847 )
853 )
848 coreconfigitem(
854 coreconfigitem(
849 b'experimental',
855 b'experimental',
850 b'copies.write-to',
856 b'copies.write-to',
851 default=b'filelog-only',
857 default=b'filelog-only',
852 )
858 )
853 coreconfigitem(
859 coreconfigitem(
854 b'experimental',
860 b'experimental',
855 b'crecordtest',
861 b'crecordtest',
856 default=None,
862 default=None,
857 )
863 )
858 coreconfigitem(
864 coreconfigitem(
859 b'experimental',
865 b'experimental',
860 b'directaccess',
866 b'directaccess',
861 default=False,
867 default=False,
862 )
868 )
863 coreconfigitem(
869 coreconfigitem(
864 b'experimental',
870 b'experimental',
865 b'directaccess.revnums',
871 b'directaccess.revnums',
866 default=False,
872 default=False,
867 )
873 )
868 coreconfigitem(
874 coreconfigitem(
869 b'experimental',
875 b'experimental',
870 b'editortmpinhg',
876 b'editortmpinhg',
871 default=False,
877 default=False,
872 )
878 )
873 coreconfigitem(
879 coreconfigitem(
874 b'experimental',
880 b'experimental',
875 b'evolution',
881 b'evolution',
876 default=list,
882 default=list,
877 )
883 )
878 coreconfigitem(
884 coreconfigitem(
879 b'experimental',
885 b'experimental',
880 b'evolution.allowdivergence',
886 b'evolution.allowdivergence',
881 default=False,
887 default=False,
882 alias=[(b'experimental', b'allowdivergence')],
888 alias=[(b'experimental', b'allowdivergence')],
883 )
889 )
884 coreconfigitem(
890 coreconfigitem(
885 b'experimental',
891 b'experimental',
886 b'evolution.allowunstable',
892 b'evolution.allowunstable',
887 default=None,
893 default=None,
888 )
894 )
889 coreconfigitem(
895 coreconfigitem(
890 b'experimental',
896 b'experimental',
891 b'evolution.createmarkers',
897 b'evolution.createmarkers',
892 default=None,
898 default=None,
893 )
899 )
894 coreconfigitem(
900 coreconfigitem(
895 b'experimental',
901 b'experimental',
896 b'evolution.effect-flags',
902 b'evolution.effect-flags',
897 default=True,
903 default=True,
898 alias=[(b'experimental', b'effect-flags')],
904 alias=[(b'experimental', b'effect-flags')],
899 )
905 )
900 coreconfigitem(
906 coreconfigitem(
901 b'experimental',
907 b'experimental',
902 b'evolution.exchange',
908 b'evolution.exchange',
903 default=None,
909 default=None,
904 )
910 )
905 coreconfigitem(
911 coreconfigitem(
906 b'experimental',
912 b'experimental',
907 b'evolution.bundle-obsmarker',
913 b'evolution.bundle-obsmarker',
908 default=False,
914 default=False,
909 )
915 )
910 coreconfigitem(
916 coreconfigitem(
911 b'experimental',
917 b'experimental',
912 b'evolution.bundle-obsmarker:mandatory',
918 b'evolution.bundle-obsmarker:mandatory',
913 default=True,
919 default=True,
914 )
920 )
915 coreconfigitem(
921 coreconfigitem(
916 b'experimental',
922 b'experimental',
917 b'log.topo',
923 b'log.topo',
918 default=False,
924 default=False,
919 )
925 )
920 coreconfigitem(
926 coreconfigitem(
921 b'experimental',
927 b'experimental',
922 b'evolution.report-instabilities',
928 b'evolution.report-instabilities',
923 default=True,
929 default=True,
924 )
930 )
925 coreconfigitem(
931 coreconfigitem(
926 b'experimental',
932 b'experimental',
927 b'evolution.track-operation',
933 b'evolution.track-operation',
928 default=True,
934 default=True,
929 )
935 )
930 # repo-level config to exclude a revset visibility
936 # repo-level config to exclude a revset visibility
931 #
937 #
932 # The target use case is to use `share` to expose different subset of the same
938 # The target use case is to use `share` to expose different subset of the same
933 # repository, especially server side. See also `server.view`.
939 # repository, especially server side. See also `server.view`.
934 coreconfigitem(
940 coreconfigitem(
935 b'experimental',
941 b'experimental',
936 b'extra-filter-revs',
942 b'extra-filter-revs',
937 default=None,
943 default=None,
938 )
944 )
939 coreconfigitem(
945 coreconfigitem(
940 b'experimental',
946 b'experimental',
941 b'maxdeltachainspan',
947 b'maxdeltachainspan',
942 default=-1,
948 default=-1,
943 )
949 )
944 # tracks files which were undeleted (merge might delete them but we explicitly
950 # tracks files which were undeleted (merge might delete them but we explicitly
945 # kept/undeleted them) and creates new filenodes for them
951 # kept/undeleted them) and creates new filenodes for them
946 coreconfigitem(
952 coreconfigitem(
947 b'experimental',
953 b'experimental',
948 b'merge-track-salvaged',
954 b'merge-track-salvaged',
949 default=False,
955 default=False,
950 )
956 )
951 coreconfigitem(
957 coreconfigitem(
952 b'experimental',
958 b'experimental',
953 b'mergetempdirprefix',
959 b'mergetempdirprefix',
954 default=None,
960 default=None,
955 )
961 )
956 coreconfigitem(
962 coreconfigitem(
957 b'experimental',
963 b'experimental',
958 b'mmapindexthreshold',
964 b'mmapindexthreshold',
959 default=None,
965 default=None,
960 )
966 )
961 coreconfigitem(
967 coreconfigitem(
962 b'experimental',
968 b'experimental',
963 b'narrow',
969 b'narrow',
964 default=False,
970 default=False,
965 )
971 )
966 coreconfigitem(
972 coreconfigitem(
967 b'experimental',
973 b'experimental',
968 b'nonnormalparanoidcheck',
974 b'nonnormalparanoidcheck',
969 default=False,
975 default=False,
970 )
976 )
971 coreconfigitem(
977 coreconfigitem(
972 b'experimental',
978 b'experimental',
973 b'exportableenviron',
979 b'exportableenviron',
974 default=list,
980 default=list,
975 )
981 )
976 coreconfigitem(
982 coreconfigitem(
977 b'experimental',
983 b'experimental',
978 b'extendedheader.index',
984 b'extendedheader.index',
979 default=None,
985 default=None,
980 )
986 )
981 coreconfigitem(
987 coreconfigitem(
982 b'experimental',
988 b'experimental',
983 b'extendedheader.similarity',
989 b'extendedheader.similarity',
984 default=False,
990 default=False,
985 )
991 )
986 coreconfigitem(
992 coreconfigitem(
987 b'experimental',
993 b'experimental',
988 b'graphshorten',
994 b'graphshorten',
989 default=False,
995 default=False,
990 )
996 )
991 coreconfigitem(
997 coreconfigitem(
992 b'experimental',
998 b'experimental',
993 b'graphstyle.parent',
999 b'graphstyle.parent',
994 default=dynamicdefault,
1000 default=dynamicdefault,
995 )
1001 )
996 coreconfigitem(
1002 coreconfigitem(
997 b'experimental',
1003 b'experimental',
998 b'graphstyle.missing',
1004 b'graphstyle.missing',
999 default=dynamicdefault,
1005 default=dynamicdefault,
1000 )
1006 )
1001 coreconfigitem(
1007 coreconfigitem(
1002 b'experimental',
1008 b'experimental',
1003 b'graphstyle.grandparent',
1009 b'graphstyle.grandparent',
1004 default=dynamicdefault,
1010 default=dynamicdefault,
1005 )
1011 )
1006 coreconfigitem(
1012 coreconfigitem(
1007 b'experimental',
1013 b'experimental',
1008 b'hook-track-tags',
1014 b'hook-track-tags',
1009 default=False,
1015 default=False,
1010 )
1016 )
1011 coreconfigitem(
1017 coreconfigitem(
1012 b'experimental',
1018 b'experimental',
1013 b'httppeer.advertise-v2',
1019 b'httppeer.advertise-v2',
1014 default=False,
1020 default=False,
1015 )
1021 )
1016 coreconfigitem(
1022 coreconfigitem(
1017 b'experimental',
1023 b'experimental',
1018 b'httppeer.v2-encoder-order',
1024 b'httppeer.v2-encoder-order',
1019 default=None,
1025 default=None,
1020 )
1026 )
1021 coreconfigitem(
1027 coreconfigitem(
1022 b'experimental',
1028 b'experimental',
1023 b'httppostargs',
1029 b'httppostargs',
1024 default=False,
1030 default=False,
1025 )
1031 )
1026 coreconfigitem(b'experimental', b'nointerrupt', default=False)
1032 coreconfigitem(b'experimental', b'nointerrupt', default=False)
1027 coreconfigitem(b'experimental', b'nointerrupt-interactiveonly', default=True)
1033 coreconfigitem(b'experimental', b'nointerrupt-interactiveonly', default=True)
1028
1034
1029 coreconfigitem(
1035 coreconfigitem(
1030 b'experimental',
1036 b'experimental',
1031 b'obsmarkers-exchange-debug',
1037 b'obsmarkers-exchange-debug',
1032 default=False,
1038 default=False,
1033 )
1039 )
1034 coreconfigitem(
1040 coreconfigitem(
1035 b'experimental',
1041 b'experimental',
1036 b'remotenames',
1042 b'remotenames',
1037 default=False,
1043 default=False,
1038 )
1044 )
1039 coreconfigitem(
1045 coreconfigitem(
1040 b'experimental',
1046 b'experimental',
1041 b'removeemptydirs',
1047 b'removeemptydirs',
1042 default=True,
1048 default=True,
1043 )
1049 )
1044 coreconfigitem(
1050 coreconfigitem(
1045 b'experimental',
1051 b'experimental',
1046 b'revert.interactive.select-to-keep',
1052 b'revert.interactive.select-to-keep',
1047 default=False,
1053 default=False,
1048 )
1054 )
1049 coreconfigitem(
1055 coreconfigitem(
1050 b'experimental',
1056 b'experimental',
1051 b'revisions.prefixhexnode',
1057 b'revisions.prefixhexnode',
1052 default=False,
1058 default=False,
1053 )
1059 )
1054 coreconfigitem(
1060 coreconfigitem(
1055 b'experimental',
1061 b'experimental',
1056 b'revlogv2',
1062 b'revlogv2',
1057 default=None,
1063 default=None,
1058 )
1064 )
1059 coreconfigitem(
1065 coreconfigitem(
1060 b'experimental',
1066 b'experimental',
1061 b'revisions.disambiguatewithin',
1067 b'revisions.disambiguatewithin',
1062 default=None,
1068 default=None,
1063 )
1069 )
1064 coreconfigitem(
1070 coreconfigitem(
1065 b'experimental',
1071 b'experimental',
1066 b'rust.index',
1072 b'rust.index',
1067 default=False,
1073 default=False,
1068 )
1074 )
1069 coreconfigitem(
1075 coreconfigitem(
1070 b'experimental',
1076 b'experimental',
1071 b'server.filesdata.recommended-batch-size',
1077 b'server.filesdata.recommended-batch-size',
1072 default=50000,
1078 default=50000,
1073 )
1079 )
1074 coreconfigitem(
1080 coreconfigitem(
1075 b'experimental',
1081 b'experimental',
1076 b'server.manifestdata.recommended-batch-size',
1082 b'server.manifestdata.recommended-batch-size',
1077 default=100000,
1083 default=100000,
1078 )
1084 )
1079 coreconfigitem(
1085 coreconfigitem(
1080 b'experimental',
1086 b'experimental',
1081 b'server.stream-narrow-clones',
1087 b'server.stream-narrow-clones',
1082 default=False,
1088 default=False,
1083 )
1089 )
1084 coreconfigitem(
1090 coreconfigitem(
1085 b'experimental',
1091 b'experimental',
1086 b'sharesafe-auto-downgrade-shares',
1092 b'sharesafe-auto-downgrade-shares',
1087 default=False,
1093 default=False,
1088 )
1094 )
1089 coreconfigitem(
1095 coreconfigitem(
1090 b'experimental',
1096 b'experimental',
1091 b'sharesafe-auto-upgrade-shares',
1097 b'sharesafe-auto-upgrade-shares',
1092 default=False,
1098 default=False,
1093 )
1099 )
1094 coreconfigitem(
1100 coreconfigitem(
1095 b'experimental',
1101 b'experimental',
1096 b'sharesafe-auto-upgrade-fail-error',
1102 b'sharesafe-auto-upgrade-fail-error',
1097 default=False,
1103 default=False,
1098 )
1104 )
1099 coreconfigitem(
1105 coreconfigitem(
1100 b'experimental',
1106 b'experimental',
1101 b'sharesafe-warn-outdated-shares',
1107 b'sharesafe-warn-outdated-shares',
1102 default=True,
1108 default=True,
1103 )
1109 )
1104 coreconfigitem(
1110 coreconfigitem(
1105 b'experimental',
1111 b'experimental',
1106 b'single-head-per-branch',
1112 b'single-head-per-branch',
1107 default=False,
1113 default=False,
1108 )
1114 )
1109 coreconfigitem(
1115 coreconfigitem(
1110 b'experimental',
1116 b'experimental',
1111 b'single-head-per-branch:account-closed-heads',
1117 b'single-head-per-branch:account-closed-heads',
1112 default=False,
1118 default=False,
1113 )
1119 )
1114 coreconfigitem(
1120 coreconfigitem(
1115 b'experimental',
1121 b'experimental',
1116 b'single-head-per-branch:public-changes-only',
1122 b'single-head-per-branch:public-changes-only',
1117 default=False,
1123 default=False,
1118 )
1124 )
1119 coreconfigitem(
1125 coreconfigitem(
1120 b'experimental',
1126 b'experimental',
1121 b'sshserver.support-v2',
1127 b'sshserver.support-v2',
1122 default=False,
1128 default=False,
1123 )
1129 )
1124 coreconfigitem(
1130 coreconfigitem(
1125 b'experimental',
1131 b'experimental',
1126 b'sparse-read',
1132 b'sparse-read',
1127 default=False,
1133 default=False,
1128 )
1134 )
1129 coreconfigitem(
1135 coreconfigitem(
1130 b'experimental',
1136 b'experimental',
1131 b'sparse-read.density-threshold',
1137 b'sparse-read.density-threshold',
1132 default=0.50,
1138 default=0.50,
1133 )
1139 )
1134 coreconfigitem(
1140 coreconfigitem(
1135 b'experimental',
1141 b'experimental',
1136 b'sparse-read.min-gap-size',
1142 b'sparse-read.min-gap-size',
1137 default=b'65K',
1143 default=b'65K',
1138 )
1144 )
1139 coreconfigitem(
1145 coreconfigitem(
1140 b'experimental',
1146 b'experimental',
1141 b'treemanifest',
1147 b'treemanifest',
1142 default=False,
1148 default=False,
1143 )
1149 )
1144 coreconfigitem(
1150 coreconfigitem(
1145 b'experimental',
1151 b'experimental',
1146 b'update.atomic-file',
1152 b'update.atomic-file',
1147 default=False,
1153 default=False,
1148 )
1154 )
1149 coreconfigitem(
1155 coreconfigitem(
1150 b'experimental',
1156 b'experimental',
1151 b'sshpeer.advertise-v2',
1157 b'sshpeer.advertise-v2',
1152 default=False,
1158 default=False,
1153 )
1159 )
1154 coreconfigitem(
1160 coreconfigitem(
1155 b'experimental',
1161 b'experimental',
1156 b'web.apiserver',
1162 b'web.apiserver',
1157 default=False,
1163 default=False,
1158 )
1164 )
1159 coreconfigitem(
1165 coreconfigitem(
1160 b'experimental',
1166 b'experimental',
1161 b'web.api.http-v2',
1167 b'web.api.http-v2',
1162 default=False,
1168 default=False,
1163 )
1169 )
1164 coreconfigitem(
1170 coreconfigitem(
1165 b'experimental',
1171 b'experimental',
1166 b'web.api.debugreflect',
1172 b'web.api.debugreflect',
1167 default=False,
1173 default=False,
1168 )
1174 )
1169 coreconfigitem(
1175 coreconfigitem(
1170 b'experimental',
1176 b'experimental',
1171 b'worker.wdir-get-thread-safe',
1177 b'worker.wdir-get-thread-safe',
1172 default=False,
1178 default=False,
1173 )
1179 )
1174 coreconfigitem(
1180 coreconfigitem(
1175 b'experimental',
1181 b'experimental',
1176 b'worker.repository-upgrade',
1182 b'worker.repository-upgrade',
1177 default=False,
1183 default=False,
1178 )
1184 )
1179 coreconfigitem(
1185 coreconfigitem(
1180 b'experimental',
1186 b'experimental',
1181 b'xdiff',
1187 b'xdiff',
1182 default=False,
1188 default=False,
1183 )
1189 )
1184 coreconfigitem(
1190 coreconfigitem(
1185 b'extensions',
1191 b'extensions',
1186 b'.*',
1192 b'.*',
1187 default=None,
1193 default=None,
1188 generic=True,
1194 generic=True,
1189 )
1195 )
1190 coreconfigitem(
1196 coreconfigitem(
1191 b'extdata',
1197 b'extdata',
1192 b'.*',
1198 b'.*',
1193 default=None,
1199 default=None,
1194 generic=True,
1200 generic=True,
1195 )
1201 )
1196 coreconfigitem(
1202 coreconfigitem(
1197 b'format',
1203 b'format',
1198 b'bookmarks-in-store',
1204 b'bookmarks-in-store',
1199 default=False,
1205 default=False,
1200 )
1206 )
1201 coreconfigitem(
1207 coreconfigitem(
1202 b'format',
1208 b'format',
1203 b'chunkcachesize',
1209 b'chunkcachesize',
1204 default=None,
1210 default=None,
1205 experimental=True,
1211 experimental=True,
1206 )
1212 )
1207 coreconfigitem(
1213 coreconfigitem(
1208 b'format',
1214 b'format',
1209 b'dotencode',
1215 b'dotencode',
1210 default=True,
1216 default=True,
1211 )
1217 )
1212 coreconfigitem(
1218 coreconfigitem(
1213 b'format',
1219 b'format',
1214 b'generaldelta',
1220 b'generaldelta',
1215 default=False,
1221 default=False,
1216 experimental=True,
1222 experimental=True,
1217 )
1223 )
1218 coreconfigitem(
1224 coreconfigitem(
1219 b'format',
1225 b'format',
1220 b'manifestcachesize',
1226 b'manifestcachesize',
1221 default=None,
1227 default=None,
1222 experimental=True,
1228 experimental=True,
1223 )
1229 )
1224 coreconfigitem(
1230 coreconfigitem(
1225 b'format',
1231 b'format',
1226 b'maxchainlen',
1232 b'maxchainlen',
1227 default=dynamicdefault,
1233 default=dynamicdefault,
1228 experimental=True,
1234 experimental=True,
1229 )
1235 )
1230 coreconfigitem(
1236 coreconfigitem(
1231 b'format',
1237 b'format',
1232 b'obsstore-version',
1238 b'obsstore-version',
1233 default=None,
1239 default=None,
1234 )
1240 )
1235 coreconfigitem(
1241 coreconfigitem(
1236 b'format',
1242 b'format',
1237 b'sparse-revlog',
1243 b'sparse-revlog',
1238 default=True,
1244 default=True,
1239 )
1245 )
1240 coreconfigitem(
1246 coreconfigitem(
1241 b'format',
1247 b'format',
1242 b'revlog-compression',
1248 b'revlog-compression',
1243 default=lambda: [b'zlib'],
1249 default=lambda: [b'zlib'],
1244 alias=[(b'experimental', b'format.compression')],
1250 alias=[(b'experimental', b'format.compression')],
1245 )
1251 )
1246 coreconfigitem(
1252 coreconfigitem(
1247 b'format',
1253 b'format',
1248 b'usefncache',
1254 b'usefncache',
1249 default=True,
1255 default=True,
1250 )
1256 )
1251 coreconfigitem(
1257 coreconfigitem(
1252 b'format',
1258 b'format',
1253 b'usegeneraldelta',
1259 b'usegeneraldelta',
1254 default=True,
1260 default=True,
1255 )
1261 )
1256 coreconfigitem(
1262 coreconfigitem(
1257 b'format',
1263 b'format',
1258 b'usestore',
1264 b'usestore',
1259 default=True,
1265 default=True,
1260 )
1266 )
1261 # Right now, the only efficient implement of the nodemap logic is in Rust, so
1267 # Right now, the only efficient implement of the nodemap logic is in Rust, so
1262 # the persistent nodemap feature needs to stay experimental as long as the Rust
1268 # the persistent nodemap feature needs to stay experimental as long as the Rust
1263 # extensions are an experimental feature.
1269 # extensions are an experimental feature.
1264 coreconfigitem(
1270 coreconfigitem(
1265 b'format', b'use-persistent-nodemap', default=False, experimental=True
1271 b'format', b'use-persistent-nodemap', default=False, experimental=True
1266 )
1272 )
1267 coreconfigitem(
1273 coreconfigitem(
1268 b'format',
1274 b'format',
1269 b'exp-use-copies-side-data-changeset',
1275 b'exp-use-copies-side-data-changeset',
1270 default=False,
1276 default=False,
1271 experimental=True,
1277 experimental=True,
1272 )
1278 )
1273 coreconfigitem(
1279 coreconfigitem(
1274 b'format',
1280 b'format',
1275 b'exp-use-side-data',
1281 b'exp-use-side-data',
1276 default=False,
1282 default=False,
1277 experimental=True,
1283 experimental=True,
1278 )
1284 )
1279 coreconfigitem(
1285 coreconfigitem(
1280 b'format',
1286 b'format',
1281 b'exp-share-safe',
1287 b'exp-share-safe',
1282 default=False,
1288 default=False,
1283 experimental=True,
1289 experimental=True,
1284 )
1290 )
1285 coreconfigitem(
1291 coreconfigitem(
1286 b'format',
1292 b'format',
1287 b'internal-phase',
1293 b'internal-phase',
1288 default=False,
1294 default=False,
1289 experimental=True,
1295 experimental=True,
1290 )
1296 )
1291 coreconfigitem(
1297 coreconfigitem(
1292 b'fsmonitor',
1298 b'fsmonitor',
1293 b'warn_when_unused',
1299 b'warn_when_unused',
1294 default=True,
1300 default=True,
1295 )
1301 )
1296 coreconfigitem(
1302 coreconfigitem(
1297 b'fsmonitor',
1303 b'fsmonitor',
1298 b'warn_update_file_count',
1304 b'warn_update_file_count',
1299 default=50000,
1305 default=50000,
1300 )
1306 )
1301 coreconfigitem(
1307 coreconfigitem(
1302 b'fsmonitor',
1308 b'fsmonitor',
1303 b'warn_update_file_count_rust',
1309 b'warn_update_file_count_rust',
1304 default=400000,
1310 default=400000,
1305 )
1311 )
1306 coreconfigitem(
1312 coreconfigitem(
1307 b'help',
1313 b'help',
1308 br'hidden-command\..*',
1314 br'hidden-command\..*',
1309 default=False,
1315 default=False,
1310 generic=True,
1316 generic=True,
1311 )
1317 )
1312 coreconfigitem(
1318 coreconfigitem(
1313 b'help',
1319 b'help',
1314 br'hidden-topic\..*',
1320 br'hidden-topic\..*',
1315 default=False,
1321 default=False,
1316 generic=True,
1322 generic=True,
1317 )
1323 )
1318 coreconfigitem(
1324 coreconfigitem(
1319 b'hooks',
1325 b'hooks',
1320 b'.*',
1326 b'.*',
1321 default=dynamicdefault,
1327 default=dynamicdefault,
1322 generic=True,
1328 generic=True,
1323 )
1329 )
1324 coreconfigitem(
1330 coreconfigitem(
1325 b'hgweb-paths',
1331 b'hgweb-paths',
1326 b'.*',
1332 b'.*',
1327 default=list,
1333 default=list,
1328 generic=True,
1334 generic=True,
1329 )
1335 )
1330 coreconfigitem(
1336 coreconfigitem(
1331 b'hostfingerprints',
1337 b'hostfingerprints',
1332 b'.*',
1338 b'.*',
1333 default=list,
1339 default=list,
1334 generic=True,
1340 generic=True,
1335 )
1341 )
1336 coreconfigitem(
1342 coreconfigitem(
1337 b'hostsecurity',
1343 b'hostsecurity',
1338 b'ciphers',
1344 b'ciphers',
1339 default=None,
1345 default=None,
1340 )
1346 )
1341 coreconfigitem(
1347 coreconfigitem(
1342 b'hostsecurity',
1348 b'hostsecurity',
1343 b'minimumprotocol',
1349 b'minimumprotocol',
1344 default=dynamicdefault,
1350 default=dynamicdefault,
1345 )
1351 )
1346 coreconfigitem(
1352 coreconfigitem(
1347 b'hostsecurity',
1353 b'hostsecurity',
1348 b'.*:minimumprotocol$',
1354 b'.*:minimumprotocol$',
1349 default=dynamicdefault,
1355 default=dynamicdefault,
1350 generic=True,
1356 generic=True,
1351 )
1357 )
1352 coreconfigitem(
1358 coreconfigitem(
1353 b'hostsecurity',
1359 b'hostsecurity',
1354 b'.*:ciphers$',
1360 b'.*:ciphers$',
1355 default=dynamicdefault,
1361 default=dynamicdefault,
1356 generic=True,
1362 generic=True,
1357 )
1363 )
1358 coreconfigitem(
1364 coreconfigitem(
1359 b'hostsecurity',
1365 b'hostsecurity',
1360 b'.*:fingerprints$',
1366 b'.*:fingerprints$',
1361 default=list,
1367 default=list,
1362 generic=True,
1368 generic=True,
1363 )
1369 )
1364 coreconfigitem(
1370 coreconfigitem(
1365 b'hostsecurity',
1371 b'hostsecurity',
1366 b'.*:verifycertsfile$',
1372 b'.*:verifycertsfile$',
1367 default=None,
1373 default=None,
1368 generic=True,
1374 generic=True,
1369 )
1375 )
1370
1376
1371 coreconfigitem(
1377 coreconfigitem(
1372 b'http_proxy',
1378 b'http_proxy',
1373 b'always',
1379 b'always',
1374 default=False,
1380 default=False,
1375 )
1381 )
1376 coreconfigitem(
1382 coreconfigitem(
1377 b'http_proxy',
1383 b'http_proxy',
1378 b'host',
1384 b'host',
1379 default=None,
1385 default=None,
1380 )
1386 )
1381 coreconfigitem(
1387 coreconfigitem(
1382 b'http_proxy',
1388 b'http_proxy',
1383 b'no',
1389 b'no',
1384 default=list,
1390 default=list,
1385 )
1391 )
1386 coreconfigitem(
1392 coreconfigitem(
1387 b'http_proxy',
1393 b'http_proxy',
1388 b'passwd',
1394 b'passwd',
1389 default=None,
1395 default=None,
1390 )
1396 )
1391 coreconfigitem(
1397 coreconfigitem(
1392 b'http_proxy',
1398 b'http_proxy',
1393 b'user',
1399 b'user',
1394 default=None,
1400 default=None,
1395 )
1401 )
1396
1402
1397 coreconfigitem(
1403 coreconfigitem(
1398 b'http',
1404 b'http',
1399 b'timeout',
1405 b'timeout',
1400 default=None,
1406 default=None,
1401 )
1407 )
1402
1408
1403 coreconfigitem(
1409 coreconfigitem(
1404 b'logtoprocess',
1410 b'logtoprocess',
1405 b'commandexception',
1411 b'commandexception',
1406 default=None,
1412 default=None,
1407 )
1413 )
1408 coreconfigitem(
1414 coreconfigitem(
1409 b'logtoprocess',
1415 b'logtoprocess',
1410 b'commandfinish',
1416 b'commandfinish',
1411 default=None,
1417 default=None,
1412 )
1418 )
1413 coreconfigitem(
1419 coreconfigitem(
1414 b'logtoprocess',
1420 b'logtoprocess',
1415 b'command',
1421 b'command',
1416 default=None,
1422 default=None,
1417 )
1423 )
1418 coreconfigitem(
1424 coreconfigitem(
1419 b'logtoprocess',
1425 b'logtoprocess',
1420 b'develwarn',
1426 b'develwarn',
1421 default=None,
1427 default=None,
1422 )
1428 )
1423 coreconfigitem(
1429 coreconfigitem(
1424 b'logtoprocess',
1430 b'logtoprocess',
1425 b'uiblocked',
1431 b'uiblocked',
1426 default=None,
1432 default=None,
1427 )
1433 )
1428 coreconfigitem(
1434 coreconfigitem(
1429 b'merge',
1435 b'merge',
1430 b'checkunknown',
1436 b'checkunknown',
1431 default=b'abort',
1437 default=b'abort',
1432 )
1438 )
1433 coreconfigitem(
1439 coreconfigitem(
1434 b'merge',
1440 b'merge',
1435 b'checkignored',
1441 b'checkignored',
1436 default=b'abort',
1442 default=b'abort',
1437 )
1443 )
1438 coreconfigitem(
1444 coreconfigitem(
1439 b'experimental',
1445 b'experimental',
1440 b'merge.checkpathconflicts',
1446 b'merge.checkpathconflicts',
1441 default=False,
1447 default=False,
1442 )
1448 )
1443 coreconfigitem(
1449 coreconfigitem(
1444 b'merge',
1450 b'merge',
1445 b'followcopies',
1451 b'followcopies',
1446 default=True,
1452 default=True,
1447 )
1453 )
1448 coreconfigitem(
1454 coreconfigitem(
1449 b'merge',
1455 b'merge',
1450 b'on-failure',
1456 b'on-failure',
1451 default=b'continue',
1457 default=b'continue',
1452 )
1458 )
1453 coreconfigitem(
1459 coreconfigitem(
1454 b'merge',
1460 b'merge',
1455 b'preferancestor',
1461 b'preferancestor',
1456 default=lambda: [b'*'],
1462 default=lambda: [b'*'],
1457 experimental=True,
1463 experimental=True,
1458 )
1464 )
1459 coreconfigitem(
1465 coreconfigitem(
1460 b'merge',
1466 b'merge',
1461 b'strict-capability-check',
1467 b'strict-capability-check',
1462 default=False,
1468 default=False,
1463 )
1469 )
1464 coreconfigitem(
1470 coreconfigitem(
1465 b'merge-tools',
1471 b'merge-tools',
1466 b'.*',
1472 b'.*',
1467 default=None,
1473 default=None,
1468 generic=True,
1474 generic=True,
1469 )
1475 )
1470 coreconfigitem(
1476 coreconfigitem(
1471 b'merge-tools',
1477 b'merge-tools',
1472 br'.*\.args$',
1478 br'.*\.args$',
1473 default=b"$local $base $other",
1479 default=b"$local $base $other",
1474 generic=True,
1480 generic=True,
1475 priority=-1,
1481 priority=-1,
1476 )
1482 )
1477 coreconfigitem(
1483 coreconfigitem(
1478 b'merge-tools',
1484 b'merge-tools',
1479 br'.*\.binary$',
1485 br'.*\.binary$',
1480 default=False,
1486 default=False,
1481 generic=True,
1487 generic=True,
1482 priority=-1,
1488 priority=-1,
1483 )
1489 )
1484 coreconfigitem(
1490 coreconfigitem(
1485 b'merge-tools',
1491 b'merge-tools',
1486 br'.*\.check$',
1492 br'.*\.check$',
1487 default=list,
1493 default=list,
1488 generic=True,
1494 generic=True,
1489 priority=-1,
1495 priority=-1,
1490 )
1496 )
1491 coreconfigitem(
1497 coreconfigitem(
1492 b'merge-tools',
1498 b'merge-tools',
1493 br'.*\.checkchanged$',
1499 br'.*\.checkchanged$',
1494 default=False,
1500 default=False,
1495 generic=True,
1501 generic=True,
1496 priority=-1,
1502 priority=-1,
1497 )
1503 )
1498 coreconfigitem(
1504 coreconfigitem(
1499 b'merge-tools',
1505 b'merge-tools',
1500 br'.*\.executable$',
1506 br'.*\.executable$',
1501 default=dynamicdefault,
1507 default=dynamicdefault,
1502 generic=True,
1508 generic=True,
1503 priority=-1,
1509 priority=-1,
1504 )
1510 )
1505 coreconfigitem(
1511 coreconfigitem(
1506 b'merge-tools',
1512 b'merge-tools',
1507 br'.*\.fixeol$',
1513 br'.*\.fixeol$',
1508 default=False,
1514 default=False,
1509 generic=True,
1515 generic=True,
1510 priority=-1,
1516 priority=-1,
1511 )
1517 )
1512 coreconfigitem(
1518 coreconfigitem(
1513 b'merge-tools',
1519 b'merge-tools',
1514 br'.*\.gui$',
1520 br'.*\.gui$',
1515 default=False,
1521 default=False,
1516 generic=True,
1522 generic=True,
1517 priority=-1,
1523 priority=-1,
1518 )
1524 )
1519 coreconfigitem(
1525 coreconfigitem(
1520 b'merge-tools',
1526 b'merge-tools',
1521 br'.*\.mergemarkers$',
1527 br'.*\.mergemarkers$',
1522 default=b'basic',
1528 default=b'basic',
1523 generic=True,
1529 generic=True,
1524 priority=-1,
1530 priority=-1,
1525 )
1531 )
1526 coreconfigitem(
1532 coreconfigitem(
1527 b'merge-tools',
1533 b'merge-tools',
1528 br'.*\.mergemarkertemplate$',
1534 br'.*\.mergemarkertemplate$',
1529 default=dynamicdefault, # take from command-templates.mergemarker
1535 default=dynamicdefault, # take from command-templates.mergemarker
1530 generic=True,
1536 generic=True,
1531 priority=-1,
1537 priority=-1,
1532 )
1538 )
1533 coreconfigitem(
1539 coreconfigitem(
1534 b'merge-tools',
1540 b'merge-tools',
1535 br'.*\.priority$',
1541 br'.*\.priority$',
1536 default=0,
1542 default=0,
1537 generic=True,
1543 generic=True,
1538 priority=-1,
1544 priority=-1,
1539 )
1545 )
1540 coreconfigitem(
1546 coreconfigitem(
1541 b'merge-tools',
1547 b'merge-tools',
1542 br'.*\.premerge$',
1548 br'.*\.premerge$',
1543 default=dynamicdefault,
1549 default=dynamicdefault,
1544 generic=True,
1550 generic=True,
1545 priority=-1,
1551 priority=-1,
1546 )
1552 )
1547 coreconfigitem(
1553 coreconfigitem(
1548 b'merge-tools',
1554 b'merge-tools',
1549 br'.*\.symlink$',
1555 br'.*\.symlink$',
1550 default=False,
1556 default=False,
1551 generic=True,
1557 generic=True,
1552 priority=-1,
1558 priority=-1,
1553 )
1559 )
1554 coreconfigitem(
1560 coreconfigitem(
1555 b'pager',
1561 b'pager',
1556 b'attend-.*',
1562 b'attend-.*',
1557 default=dynamicdefault,
1563 default=dynamicdefault,
1558 generic=True,
1564 generic=True,
1559 )
1565 )
1560 coreconfigitem(
1566 coreconfigitem(
1561 b'pager',
1567 b'pager',
1562 b'ignore',
1568 b'ignore',
1563 default=list,
1569 default=list,
1564 )
1570 )
1565 coreconfigitem(
1571 coreconfigitem(
1566 b'pager',
1572 b'pager',
1567 b'pager',
1573 b'pager',
1568 default=dynamicdefault,
1574 default=dynamicdefault,
1569 )
1575 )
1570 coreconfigitem(
1576 coreconfigitem(
1571 b'patch',
1577 b'patch',
1572 b'eol',
1578 b'eol',
1573 default=b'strict',
1579 default=b'strict',
1574 )
1580 )
1575 coreconfigitem(
1581 coreconfigitem(
1576 b'patch',
1582 b'patch',
1577 b'fuzz',
1583 b'fuzz',
1578 default=2,
1584 default=2,
1579 )
1585 )
1580 coreconfigitem(
1586 coreconfigitem(
1581 b'paths',
1587 b'paths',
1582 b'default',
1588 b'default',
1583 default=None,
1589 default=None,
1584 )
1590 )
1585 coreconfigitem(
1591 coreconfigitem(
1586 b'paths',
1592 b'paths',
1587 b'default-push',
1593 b'default-push',
1588 default=None,
1594 default=None,
1589 )
1595 )
1590 coreconfigitem(
1596 coreconfigitem(
1591 b'paths',
1597 b'paths',
1592 b'.*',
1598 b'.*',
1593 default=None,
1599 default=None,
1594 generic=True,
1600 generic=True,
1595 )
1601 )
1596 coreconfigitem(
1602 coreconfigitem(
1597 b'phases',
1603 b'phases',
1598 b'checksubrepos',
1604 b'checksubrepos',
1599 default=b'follow',
1605 default=b'follow',
1600 )
1606 )
1601 coreconfigitem(
1607 coreconfigitem(
1602 b'phases',
1608 b'phases',
1603 b'new-commit',
1609 b'new-commit',
1604 default=b'draft',
1610 default=b'draft',
1605 )
1611 )
1606 coreconfigitem(
1612 coreconfigitem(
1607 b'phases',
1613 b'phases',
1608 b'publish',
1614 b'publish',
1609 default=True,
1615 default=True,
1610 )
1616 )
1611 coreconfigitem(
1617 coreconfigitem(
1612 b'profiling',
1618 b'profiling',
1613 b'enabled',
1619 b'enabled',
1614 default=False,
1620 default=False,
1615 )
1621 )
1616 coreconfigitem(
1622 coreconfigitem(
1617 b'profiling',
1623 b'profiling',
1618 b'format',
1624 b'format',
1619 default=b'text',
1625 default=b'text',
1620 )
1626 )
1621 coreconfigitem(
1627 coreconfigitem(
1622 b'profiling',
1628 b'profiling',
1623 b'freq',
1629 b'freq',
1624 default=1000,
1630 default=1000,
1625 )
1631 )
1626 coreconfigitem(
1632 coreconfigitem(
1627 b'profiling',
1633 b'profiling',
1628 b'limit',
1634 b'limit',
1629 default=30,
1635 default=30,
1630 )
1636 )
1631 coreconfigitem(
1637 coreconfigitem(
1632 b'profiling',
1638 b'profiling',
1633 b'nested',
1639 b'nested',
1634 default=0,
1640 default=0,
1635 )
1641 )
1636 coreconfigitem(
1642 coreconfigitem(
1637 b'profiling',
1643 b'profiling',
1638 b'output',
1644 b'output',
1639 default=None,
1645 default=None,
1640 )
1646 )
1641 coreconfigitem(
1647 coreconfigitem(
1642 b'profiling',
1648 b'profiling',
1643 b'showmax',
1649 b'showmax',
1644 default=0.999,
1650 default=0.999,
1645 )
1651 )
1646 coreconfigitem(
1652 coreconfigitem(
1647 b'profiling',
1653 b'profiling',
1648 b'showmin',
1654 b'showmin',
1649 default=dynamicdefault,
1655 default=dynamicdefault,
1650 )
1656 )
1651 coreconfigitem(
1657 coreconfigitem(
1652 b'profiling',
1658 b'profiling',
1653 b'showtime',
1659 b'showtime',
1654 default=True,
1660 default=True,
1655 )
1661 )
1656 coreconfigitem(
1662 coreconfigitem(
1657 b'profiling',
1663 b'profiling',
1658 b'sort',
1664 b'sort',
1659 default=b'inlinetime',
1665 default=b'inlinetime',
1660 )
1666 )
1661 coreconfigitem(
1667 coreconfigitem(
1662 b'profiling',
1668 b'profiling',
1663 b'statformat',
1669 b'statformat',
1664 default=b'hotpath',
1670 default=b'hotpath',
1665 )
1671 )
1666 coreconfigitem(
1672 coreconfigitem(
1667 b'profiling',
1673 b'profiling',
1668 b'time-track',
1674 b'time-track',
1669 default=dynamicdefault,
1675 default=dynamicdefault,
1670 )
1676 )
1671 coreconfigitem(
1677 coreconfigitem(
1672 b'profiling',
1678 b'profiling',
1673 b'type',
1679 b'type',
1674 default=b'stat',
1680 default=b'stat',
1675 )
1681 )
1676 coreconfigitem(
1682 coreconfigitem(
1677 b'progress',
1683 b'progress',
1678 b'assume-tty',
1684 b'assume-tty',
1679 default=False,
1685 default=False,
1680 )
1686 )
1681 coreconfigitem(
1687 coreconfigitem(
1682 b'progress',
1688 b'progress',
1683 b'changedelay',
1689 b'changedelay',
1684 default=1,
1690 default=1,
1685 )
1691 )
1686 coreconfigitem(
1692 coreconfigitem(
1687 b'progress',
1693 b'progress',
1688 b'clear-complete',
1694 b'clear-complete',
1689 default=True,
1695 default=True,
1690 )
1696 )
1691 coreconfigitem(
1697 coreconfigitem(
1692 b'progress',
1698 b'progress',
1693 b'debug',
1699 b'debug',
1694 default=False,
1700 default=False,
1695 )
1701 )
1696 coreconfigitem(
1702 coreconfigitem(
1697 b'progress',
1703 b'progress',
1698 b'delay',
1704 b'delay',
1699 default=3,
1705 default=3,
1700 )
1706 )
1701 coreconfigitem(
1707 coreconfigitem(
1702 b'progress',
1708 b'progress',
1703 b'disable',
1709 b'disable',
1704 default=False,
1710 default=False,
1705 )
1711 )
1706 coreconfigitem(
1712 coreconfigitem(
1707 b'progress',
1713 b'progress',
1708 b'estimateinterval',
1714 b'estimateinterval',
1709 default=60.0,
1715 default=60.0,
1710 )
1716 )
1711 coreconfigitem(
1717 coreconfigitem(
1712 b'progress',
1718 b'progress',
1713 b'format',
1719 b'format',
1714 default=lambda: [b'topic', b'bar', b'number', b'estimate'],
1720 default=lambda: [b'topic', b'bar', b'number', b'estimate'],
1715 )
1721 )
1716 coreconfigitem(
1722 coreconfigitem(
1717 b'progress',
1723 b'progress',
1718 b'refresh',
1724 b'refresh',
1719 default=0.1,
1725 default=0.1,
1720 )
1726 )
1721 coreconfigitem(
1727 coreconfigitem(
1722 b'progress',
1728 b'progress',
1723 b'width',
1729 b'width',
1724 default=dynamicdefault,
1730 default=dynamicdefault,
1725 )
1731 )
1726 coreconfigitem(
1732 coreconfigitem(
1727 b'pull',
1733 b'pull',
1728 b'confirm',
1734 b'confirm',
1729 default=False,
1735 default=False,
1730 )
1736 )
1731 coreconfigitem(
1737 coreconfigitem(
1732 b'push',
1738 b'push',
1733 b'pushvars.server',
1739 b'pushvars.server',
1734 default=False,
1740 default=False,
1735 )
1741 )
1736 coreconfigitem(
1742 coreconfigitem(
1737 b'rewrite',
1743 b'rewrite',
1738 b'backup-bundle',
1744 b'backup-bundle',
1739 default=True,
1745 default=True,
1740 alias=[(b'ui', b'history-editing-backup')],
1746 alias=[(b'ui', b'history-editing-backup')],
1741 )
1747 )
1742 coreconfigitem(
1748 coreconfigitem(
1743 b'rewrite',
1749 b'rewrite',
1744 b'update-timestamp',
1750 b'update-timestamp',
1745 default=False,
1751 default=False,
1746 )
1752 )
1747 coreconfigitem(
1753 coreconfigitem(
1748 b'rewrite',
1754 b'rewrite',
1749 b'empty-successor',
1755 b'empty-successor',
1750 default=b'skip',
1756 default=b'skip',
1751 experimental=True,
1757 experimental=True,
1752 )
1758 )
1753 coreconfigitem(
1759 coreconfigitem(
1754 b'storage',
1760 b'storage',
1755 b'new-repo-backend',
1761 b'new-repo-backend',
1756 default=b'revlogv1',
1762 default=b'revlogv1',
1757 experimental=True,
1763 experimental=True,
1758 )
1764 )
1759 coreconfigitem(
1765 coreconfigitem(
1760 b'storage',
1766 b'storage',
1761 b'revlog.optimize-delta-parent-choice',
1767 b'revlog.optimize-delta-parent-choice',
1762 default=True,
1768 default=True,
1763 alias=[(b'format', b'aggressivemergedeltas')],
1769 alias=[(b'format', b'aggressivemergedeltas')],
1764 )
1770 )
1765 # experimental as long as rust is experimental (or a C version is implemented)
1771 # experimental as long as rust is experimental (or a C version is implemented)
1766 coreconfigitem(
1772 coreconfigitem(
1767 b'storage', b'revlog.nodemap.mmap', default=True, experimental=True
1773 b'storage', b'revlog.nodemap.mmap', default=True, experimental=True
1768 )
1774 )
1769 # experimental as long as format.use-persistent-nodemap is.
1775 # experimental as long as format.use-persistent-nodemap is.
1770 coreconfigitem(
1776 coreconfigitem(
1771 b'storage', b'revlog.nodemap.mode', default=b'compat', experimental=True
1777 b'storage', b'revlog.nodemap.mode', default=b'compat', experimental=True
1772 )
1778 )
1773 coreconfigitem(
1779 coreconfigitem(
1774 b'storage',
1780 b'storage',
1775 b'revlog.reuse-external-delta',
1781 b'revlog.reuse-external-delta',
1776 default=True,
1782 default=True,
1777 )
1783 )
1778 coreconfigitem(
1784 coreconfigitem(
1779 b'storage',
1785 b'storage',
1780 b'revlog.reuse-external-delta-parent',
1786 b'revlog.reuse-external-delta-parent',
1781 default=None,
1787 default=None,
1782 )
1788 )
1783 coreconfigitem(
1789 coreconfigitem(
1784 b'storage',
1790 b'storage',
1785 b'revlog.zlib.level',
1791 b'revlog.zlib.level',
1786 default=None,
1792 default=None,
1787 )
1793 )
1788 coreconfigitem(
1794 coreconfigitem(
1789 b'storage',
1795 b'storage',
1790 b'revlog.zstd.level',
1796 b'revlog.zstd.level',
1791 default=None,
1797 default=None,
1792 )
1798 )
1793 coreconfigitem(
1799 coreconfigitem(
1794 b'server',
1800 b'server',
1795 b'bookmarks-pushkey-compat',
1801 b'bookmarks-pushkey-compat',
1796 default=True,
1802 default=True,
1797 )
1803 )
1798 coreconfigitem(
1804 coreconfigitem(
1799 b'server',
1805 b'server',
1800 b'bundle1',
1806 b'bundle1',
1801 default=True,
1807 default=True,
1802 )
1808 )
1803 coreconfigitem(
1809 coreconfigitem(
1804 b'server',
1810 b'server',
1805 b'bundle1gd',
1811 b'bundle1gd',
1806 default=None,
1812 default=None,
1807 )
1813 )
1808 coreconfigitem(
1814 coreconfigitem(
1809 b'server',
1815 b'server',
1810 b'bundle1.pull',
1816 b'bundle1.pull',
1811 default=None,
1817 default=None,
1812 )
1818 )
1813 coreconfigitem(
1819 coreconfigitem(
1814 b'server',
1820 b'server',
1815 b'bundle1gd.pull',
1821 b'bundle1gd.pull',
1816 default=None,
1822 default=None,
1817 )
1823 )
1818 coreconfigitem(
1824 coreconfigitem(
1819 b'server',
1825 b'server',
1820 b'bundle1.push',
1826 b'bundle1.push',
1821 default=None,
1827 default=None,
1822 )
1828 )
1823 coreconfigitem(
1829 coreconfigitem(
1824 b'server',
1830 b'server',
1825 b'bundle1gd.push',
1831 b'bundle1gd.push',
1826 default=None,
1832 default=None,
1827 )
1833 )
1828 coreconfigitem(
1834 coreconfigitem(
1829 b'server',
1835 b'server',
1830 b'bundle2.stream',
1836 b'bundle2.stream',
1831 default=True,
1837 default=True,
1832 alias=[(b'experimental', b'bundle2.stream')],
1838 alias=[(b'experimental', b'bundle2.stream')],
1833 )
1839 )
1834 coreconfigitem(
1840 coreconfigitem(
1835 b'server',
1841 b'server',
1836 b'compressionengines',
1842 b'compressionengines',
1837 default=list,
1843 default=list,
1838 )
1844 )
1839 coreconfigitem(
1845 coreconfigitem(
1840 b'server',
1846 b'server',
1841 b'concurrent-push-mode',
1847 b'concurrent-push-mode',
1842 default=b'check-related',
1848 default=b'check-related',
1843 )
1849 )
1844 coreconfigitem(
1850 coreconfigitem(
1845 b'server',
1851 b'server',
1846 b'disablefullbundle',
1852 b'disablefullbundle',
1847 default=False,
1853 default=False,
1848 )
1854 )
1849 coreconfigitem(
1855 coreconfigitem(
1850 b'server',
1856 b'server',
1851 b'maxhttpheaderlen',
1857 b'maxhttpheaderlen',
1852 default=1024,
1858 default=1024,
1853 )
1859 )
1854 coreconfigitem(
1860 coreconfigitem(
1855 b'server',
1861 b'server',
1856 b'pullbundle',
1862 b'pullbundle',
1857 default=False,
1863 default=False,
1858 )
1864 )
1859 coreconfigitem(
1865 coreconfigitem(
1860 b'server',
1866 b'server',
1861 b'preferuncompressed',
1867 b'preferuncompressed',
1862 default=False,
1868 default=False,
1863 )
1869 )
1864 coreconfigitem(
1870 coreconfigitem(
1865 b'server',
1871 b'server',
1866 b'streamunbundle',
1872 b'streamunbundle',
1867 default=False,
1873 default=False,
1868 )
1874 )
1869 coreconfigitem(
1875 coreconfigitem(
1870 b'server',
1876 b'server',
1871 b'uncompressed',
1877 b'uncompressed',
1872 default=True,
1878 default=True,
1873 )
1879 )
1874 coreconfigitem(
1880 coreconfigitem(
1875 b'server',
1881 b'server',
1876 b'uncompressedallowsecret',
1882 b'uncompressedallowsecret',
1877 default=False,
1883 default=False,
1878 )
1884 )
1879 coreconfigitem(
1885 coreconfigitem(
1880 b'server',
1886 b'server',
1881 b'view',
1887 b'view',
1882 default=b'served',
1888 default=b'served',
1883 )
1889 )
1884 coreconfigitem(
1890 coreconfigitem(
1885 b'server',
1891 b'server',
1886 b'validate',
1892 b'validate',
1887 default=False,
1893 default=False,
1888 )
1894 )
1889 coreconfigitem(
1895 coreconfigitem(
1890 b'server',
1896 b'server',
1891 b'zliblevel',
1897 b'zliblevel',
1892 default=-1,
1898 default=-1,
1893 )
1899 )
1894 coreconfigitem(
1900 coreconfigitem(
1895 b'server',
1901 b'server',
1896 b'zstdlevel',
1902 b'zstdlevel',
1897 default=3,
1903 default=3,
1898 )
1904 )
1899 coreconfigitem(
1905 coreconfigitem(
1900 b'share',
1906 b'share',
1901 b'pool',
1907 b'pool',
1902 default=None,
1908 default=None,
1903 )
1909 )
1904 coreconfigitem(
1910 coreconfigitem(
1905 b'share',
1911 b'share',
1906 b'poolnaming',
1912 b'poolnaming',
1907 default=b'identity',
1913 default=b'identity',
1908 )
1914 )
1909 coreconfigitem(
1915 coreconfigitem(
1910 b'shelve',
1916 b'shelve',
1911 b'maxbackups',
1917 b'maxbackups',
1912 default=10,
1918 default=10,
1913 )
1919 )
1914 coreconfigitem(
1920 coreconfigitem(
1915 b'smtp',
1921 b'smtp',
1916 b'host',
1922 b'host',
1917 default=None,
1923 default=None,
1918 )
1924 )
1919 coreconfigitem(
1925 coreconfigitem(
1920 b'smtp',
1926 b'smtp',
1921 b'local_hostname',
1927 b'local_hostname',
1922 default=None,
1928 default=None,
1923 )
1929 )
1924 coreconfigitem(
1930 coreconfigitem(
1925 b'smtp',
1931 b'smtp',
1926 b'password',
1932 b'password',
1927 default=None,
1933 default=None,
1928 )
1934 )
1929 coreconfigitem(
1935 coreconfigitem(
1930 b'smtp',
1936 b'smtp',
1931 b'port',
1937 b'port',
1932 default=dynamicdefault,
1938 default=dynamicdefault,
1933 )
1939 )
1934 coreconfigitem(
1940 coreconfigitem(
1935 b'smtp',
1941 b'smtp',
1936 b'tls',
1942 b'tls',
1937 default=b'none',
1943 default=b'none',
1938 )
1944 )
1939 coreconfigitem(
1945 coreconfigitem(
1940 b'smtp',
1946 b'smtp',
1941 b'username',
1947 b'username',
1942 default=None,
1948 default=None,
1943 )
1949 )
1944 coreconfigitem(
1950 coreconfigitem(
1945 b'sparse',
1951 b'sparse',
1946 b'missingwarning',
1952 b'missingwarning',
1947 default=True,
1953 default=True,
1948 experimental=True,
1954 experimental=True,
1949 )
1955 )
1950 coreconfigitem(
1956 coreconfigitem(
1951 b'subrepos',
1957 b'subrepos',
1952 b'allowed',
1958 b'allowed',
1953 default=dynamicdefault, # to make backporting simpler
1959 default=dynamicdefault, # to make backporting simpler
1954 )
1960 )
1955 coreconfigitem(
1961 coreconfigitem(
1956 b'subrepos',
1962 b'subrepos',
1957 b'hg:allowed',
1963 b'hg:allowed',
1958 default=dynamicdefault,
1964 default=dynamicdefault,
1959 )
1965 )
1960 coreconfigitem(
1966 coreconfigitem(
1961 b'subrepos',
1967 b'subrepos',
1962 b'git:allowed',
1968 b'git:allowed',
1963 default=dynamicdefault,
1969 default=dynamicdefault,
1964 )
1970 )
1965 coreconfigitem(
1971 coreconfigitem(
1966 b'subrepos',
1972 b'subrepos',
1967 b'svn:allowed',
1973 b'svn:allowed',
1968 default=dynamicdefault,
1974 default=dynamicdefault,
1969 )
1975 )
1970 coreconfigitem(
1976 coreconfigitem(
1971 b'templates',
1977 b'templates',
1972 b'.*',
1978 b'.*',
1973 default=None,
1979 default=None,
1974 generic=True,
1980 generic=True,
1975 )
1981 )
1976 coreconfigitem(
1982 coreconfigitem(
1977 b'templateconfig',
1983 b'templateconfig',
1978 b'.*',
1984 b'.*',
1979 default=dynamicdefault,
1985 default=dynamicdefault,
1980 generic=True,
1986 generic=True,
1981 )
1987 )
1982 coreconfigitem(
1988 coreconfigitem(
1983 b'trusted',
1989 b'trusted',
1984 b'groups',
1990 b'groups',
1985 default=list,
1991 default=list,
1986 )
1992 )
1987 coreconfigitem(
1993 coreconfigitem(
1988 b'trusted',
1994 b'trusted',
1989 b'users',
1995 b'users',
1990 default=list,
1996 default=list,
1991 )
1997 )
1992 coreconfigitem(
1998 coreconfigitem(
1993 b'ui',
1999 b'ui',
1994 b'_usedassubrepo',
2000 b'_usedassubrepo',
1995 default=False,
2001 default=False,
1996 )
2002 )
1997 coreconfigitem(
2003 coreconfigitem(
1998 b'ui',
2004 b'ui',
1999 b'allowemptycommit',
2005 b'allowemptycommit',
2000 default=False,
2006 default=False,
2001 )
2007 )
2002 coreconfigitem(
2008 coreconfigitem(
2003 b'ui',
2009 b'ui',
2004 b'archivemeta',
2010 b'archivemeta',
2005 default=True,
2011 default=True,
2006 )
2012 )
2007 coreconfigitem(
2013 coreconfigitem(
2008 b'ui',
2014 b'ui',
2009 b'askusername',
2015 b'askusername',
2010 default=False,
2016 default=False,
2011 )
2017 )
2012 coreconfigitem(
2018 coreconfigitem(
2013 b'ui',
2019 b'ui',
2014 b'available-memory',
2020 b'available-memory',
2015 default=None,
2021 default=None,
2016 )
2022 )
2017
2023
2018 coreconfigitem(
2024 coreconfigitem(
2019 b'ui',
2025 b'ui',
2020 b'clonebundlefallback',
2026 b'clonebundlefallback',
2021 default=False,
2027 default=False,
2022 )
2028 )
2023 coreconfigitem(
2029 coreconfigitem(
2024 b'ui',
2030 b'ui',
2025 b'clonebundleprefers',
2031 b'clonebundleprefers',
2026 default=list,
2032 default=list,
2027 )
2033 )
2028 coreconfigitem(
2034 coreconfigitem(
2029 b'ui',
2035 b'ui',
2030 b'clonebundles',
2036 b'clonebundles',
2031 default=True,
2037 default=True,
2032 )
2038 )
2033 coreconfigitem(
2039 coreconfigitem(
2034 b'ui',
2040 b'ui',
2035 b'color',
2041 b'color',
2036 default=b'auto',
2042 default=b'auto',
2037 )
2043 )
2038 coreconfigitem(
2044 coreconfigitem(
2039 b'ui',
2045 b'ui',
2040 b'commitsubrepos',
2046 b'commitsubrepos',
2041 default=False,
2047 default=False,
2042 )
2048 )
2043 coreconfigitem(
2049 coreconfigitem(
2044 b'ui',
2050 b'ui',
2045 b'debug',
2051 b'debug',
2046 default=False,
2052 default=False,
2047 )
2053 )
2048 coreconfigitem(
2054 coreconfigitem(
2049 b'ui',
2055 b'ui',
2050 b'debugger',
2056 b'debugger',
2051 default=None,
2057 default=None,
2052 )
2058 )
2053 coreconfigitem(
2059 coreconfigitem(
2054 b'ui',
2060 b'ui',
2055 b'editor',
2061 b'editor',
2056 default=dynamicdefault,
2062 default=dynamicdefault,
2057 )
2063 )
2058 coreconfigitem(
2064 coreconfigitem(
2059 b'ui',
2065 b'ui',
2060 b'detailed-exit-code',
2066 b'detailed-exit-code',
2061 default=False,
2067 default=False,
2062 experimental=True,
2068 experimental=True,
2063 )
2069 )
2064 coreconfigitem(
2070 coreconfigitem(
2065 b'ui',
2071 b'ui',
2066 b'fallbackencoding',
2072 b'fallbackencoding',
2067 default=None,
2073 default=None,
2068 )
2074 )
2069 coreconfigitem(
2075 coreconfigitem(
2070 b'ui',
2076 b'ui',
2071 b'forcecwd',
2077 b'forcecwd',
2072 default=None,
2078 default=None,
2073 )
2079 )
2074 coreconfigitem(
2080 coreconfigitem(
2075 b'ui',
2081 b'ui',
2076 b'forcemerge',
2082 b'forcemerge',
2077 default=None,
2083 default=None,
2078 )
2084 )
2079 coreconfigitem(
2085 coreconfigitem(
2080 b'ui',
2086 b'ui',
2081 b'formatdebug',
2087 b'formatdebug',
2082 default=False,
2088 default=False,
2083 )
2089 )
2084 coreconfigitem(
2090 coreconfigitem(
2085 b'ui',
2091 b'ui',
2086 b'formatjson',
2092 b'formatjson',
2087 default=False,
2093 default=False,
2088 )
2094 )
2089 coreconfigitem(
2095 coreconfigitem(
2090 b'ui',
2096 b'ui',
2091 b'formatted',
2097 b'formatted',
2092 default=None,
2098 default=None,
2093 )
2099 )
2094 coreconfigitem(
2100 coreconfigitem(
2095 b'ui',
2101 b'ui',
2096 b'interactive',
2102 b'interactive',
2097 default=None,
2103 default=None,
2098 )
2104 )
2099 coreconfigitem(
2105 coreconfigitem(
2100 b'ui',
2106 b'ui',
2101 b'interface',
2107 b'interface',
2102 default=None,
2108 default=None,
2103 )
2109 )
2104 coreconfigitem(
2110 coreconfigitem(
2105 b'ui',
2111 b'ui',
2106 b'interface.chunkselector',
2112 b'interface.chunkselector',
2107 default=None,
2113 default=None,
2108 )
2114 )
2109 coreconfigitem(
2115 coreconfigitem(
2110 b'ui',
2116 b'ui',
2111 b'large-file-limit',
2117 b'large-file-limit',
2112 default=10000000,
2118 default=10000000,
2113 )
2119 )
2114 coreconfigitem(
2120 coreconfigitem(
2115 b'ui',
2121 b'ui',
2116 b'logblockedtimes',
2122 b'logblockedtimes',
2117 default=False,
2123 default=False,
2118 )
2124 )
2119 coreconfigitem(
2125 coreconfigitem(
2120 b'ui',
2126 b'ui',
2121 b'merge',
2127 b'merge',
2122 default=None,
2128 default=None,
2123 )
2129 )
2124 coreconfigitem(
2130 coreconfigitem(
2125 b'ui',
2131 b'ui',
2126 b'mergemarkers',
2132 b'mergemarkers',
2127 default=b'basic',
2133 default=b'basic',
2128 )
2134 )
2129 coreconfigitem(
2135 coreconfigitem(
2130 b'ui',
2136 b'ui',
2131 b'message-output',
2137 b'message-output',
2132 default=b'stdio',
2138 default=b'stdio',
2133 )
2139 )
2134 coreconfigitem(
2140 coreconfigitem(
2135 b'ui',
2141 b'ui',
2136 b'nontty',
2142 b'nontty',
2137 default=False,
2143 default=False,
2138 )
2144 )
2139 coreconfigitem(
2145 coreconfigitem(
2140 b'ui',
2146 b'ui',
2141 b'origbackuppath',
2147 b'origbackuppath',
2142 default=None,
2148 default=None,
2143 )
2149 )
2144 coreconfigitem(
2150 coreconfigitem(
2145 b'ui',
2151 b'ui',
2146 b'paginate',
2152 b'paginate',
2147 default=True,
2153 default=True,
2148 )
2154 )
2149 coreconfigitem(
2155 coreconfigitem(
2150 b'ui',
2156 b'ui',
2151 b'patch',
2157 b'patch',
2152 default=None,
2158 default=None,
2153 )
2159 )
2154 coreconfigitem(
2160 coreconfigitem(
2155 b'ui',
2161 b'ui',
2156 b'portablefilenames',
2162 b'portablefilenames',
2157 default=b'warn',
2163 default=b'warn',
2158 )
2164 )
2159 coreconfigitem(
2165 coreconfigitem(
2160 b'ui',
2166 b'ui',
2161 b'promptecho',
2167 b'promptecho',
2162 default=False,
2168 default=False,
2163 )
2169 )
2164 coreconfigitem(
2170 coreconfigitem(
2165 b'ui',
2171 b'ui',
2166 b'quiet',
2172 b'quiet',
2167 default=False,
2173 default=False,
2168 )
2174 )
2169 coreconfigitem(
2175 coreconfigitem(
2170 b'ui',
2176 b'ui',
2171 b'quietbookmarkmove',
2177 b'quietbookmarkmove',
2172 default=False,
2178 default=False,
2173 )
2179 )
2174 coreconfigitem(
2180 coreconfigitem(
2175 b'ui',
2181 b'ui',
2176 b'relative-paths',
2182 b'relative-paths',
2177 default=b'legacy',
2183 default=b'legacy',
2178 )
2184 )
2179 coreconfigitem(
2185 coreconfigitem(
2180 b'ui',
2186 b'ui',
2181 b'remotecmd',
2187 b'remotecmd',
2182 default=b'hg',
2188 default=b'hg',
2183 )
2189 )
2184 coreconfigitem(
2190 coreconfigitem(
2185 b'ui',
2191 b'ui',
2186 b'report_untrusted',
2192 b'report_untrusted',
2187 default=True,
2193 default=True,
2188 )
2194 )
2189 coreconfigitem(
2195 coreconfigitem(
2190 b'ui',
2196 b'ui',
2191 b'rollback',
2197 b'rollback',
2192 default=True,
2198 default=True,
2193 )
2199 )
2194 coreconfigitem(
2200 coreconfigitem(
2195 b'ui',
2201 b'ui',
2196 b'signal-safe-lock',
2202 b'signal-safe-lock',
2197 default=True,
2203 default=True,
2198 )
2204 )
2199 coreconfigitem(
2205 coreconfigitem(
2200 b'ui',
2206 b'ui',
2201 b'slash',
2207 b'slash',
2202 default=False,
2208 default=False,
2203 )
2209 )
2204 coreconfigitem(
2210 coreconfigitem(
2205 b'ui',
2211 b'ui',
2206 b'ssh',
2212 b'ssh',
2207 default=b'ssh',
2213 default=b'ssh',
2208 )
2214 )
2209 coreconfigitem(
2215 coreconfigitem(
2210 b'ui',
2216 b'ui',
2211 b'ssherrorhint',
2217 b'ssherrorhint',
2212 default=None,
2218 default=None,
2213 )
2219 )
2214 coreconfigitem(
2220 coreconfigitem(
2215 b'ui',
2221 b'ui',
2216 b'statuscopies',
2222 b'statuscopies',
2217 default=False,
2223 default=False,
2218 )
2224 )
2219 coreconfigitem(
2225 coreconfigitem(
2220 b'ui',
2226 b'ui',
2221 b'strict',
2227 b'strict',
2222 default=False,
2228 default=False,
2223 )
2229 )
2224 coreconfigitem(
2230 coreconfigitem(
2225 b'ui',
2231 b'ui',
2226 b'style',
2232 b'style',
2227 default=b'',
2233 default=b'',
2228 )
2234 )
2229 coreconfigitem(
2235 coreconfigitem(
2230 b'ui',
2236 b'ui',
2231 b'supportcontact',
2237 b'supportcontact',
2232 default=None,
2238 default=None,
2233 )
2239 )
2234 coreconfigitem(
2240 coreconfigitem(
2235 b'ui',
2241 b'ui',
2236 b'textwidth',
2242 b'textwidth',
2237 default=78,
2243 default=78,
2238 )
2244 )
2239 coreconfigitem(
2245 coreconfigitem(
2240 b'ui',
2246 b'ui',
2241 b'timeout',
2247 b'timeout',
2242 default=b'600',
2248 default=b'600',
2243 )
2249 )
2244 coreconfigitem(
2250 coreconfigitem(
2245 b'ui',
2251 b'ui',
2246 b'timeout.warn',
2252 b'timeout.warn',
2247 default=0,
2253 default=0,
2248 )
2254 )
2249 coreconfigitem(
2255 coreconfigitem(
2250 b'ui',
2256 b'ui',
2251 b'timestamp-output',
2257 b'timestamp-output',
2252 default=False,
2258 default=False,
2253 )
2259 )
2254 coreconfigitem(
2260 coreconfigitem(
2255 b'ui',
2261 b'ui',
2256 b'traceback',
2262 b'traceback',
2257 default=False,
2263 default=False,
2258 )
2264 )
2259 coreconfigitem(
2265 coreconfigitem(
2260 b'ui',
2266 b'ui',
2261 b'tweakdefaults',
2267 b'tweakdefaults',
2262 default=False,
2268 default=False,
2263 )
2269 )
2264 coreconfigitem(b'ui', b'username', alias=[(b'ui', b'user')])
2270 coreconfigitem(b'ui', b'username', alias=[(b'ui', b'user')])
2265 coreconfigitem(
2271 coreconfigitem(
2266 b'ui',
2272 b'ui',
2267 b'verbose',
2273 b'verbose',
2268 default=False,
2274 default=False,
2269 )
2275 )
2270 coreconfigitem(
2276 coreconfigitem(
2271 b'verify',
2277 b'verify',
2272 b'skipflags',
2278 b'skipflags',
2273 default=None,
2279 default=None,
2274 )
2280 )
2275 coreconfigitem(
2281 coreconfigitem(
2276 b'web',
2282 b'web',
2277 b'allowbz2',
2283 b'allowbz2',
2278 default=False,
2284 default=False,
2279 )
2285 )
2280 coreconfigitem(
2286 coreconfigitem(
2281 b'web',
2287 b'web',
2282 b'allowgz',
2288 b'allowgz',
2283 default=False,
2289 default=False,
2284 )
2290 )
2285 coreconfigitem(
2291 coreconfigitem(
2286 b'web',
2292 b'web',
2287 b'allow-pull',
2293 b'allow-pull',
2288 alias=[(b'web', b'allowpull')],
2294 alias=[(b'web', b'allowpull')],
2289 default=True,
2295 default=True,
2290 )
2296 )
2291 coreconfigitem(
2297 coreconfigitem(
2292 b'web',
2298 b'web',
2293 b'allow-push',
2299 b'allow-push',
2294 alias=[(b'web', b'allow_push')],
2300 alias=[(b'web', b'allow_push')],
2295 default=list,
2301 default=list,
2296 )
2302 )
2297 coreconfigitem(
2303 coreconfigitem(
2298 b'web',
2304 b'web',
2299 b'allowzip',
2305 b'allowzip',
2300 default=False,
2306 default=False,
2301 )
2307 )
2302 coreconfigitem(
2308 coreconfigitem(
2303 b'web',
2309 b'web',
2304 b'archivesubrepos',
2310 b'archivesubrepos',
2305 default=False,
2311 default=False,
2306 )
2312 )
2307 coreconfigitem(
2313 coreconfigitem(
2308 b'web',
2314 b'web',
2309 b'cache',
2315 b'cache',
2310 default=True,
2316 default=True,
2311 )
2317 )
2312 coreconfigitem(
2318 coreconfigitem(
2313 b'web',
2319 b'web',
2314 b'comparisoncontext',
2320 b'comparisoncontext',
2315 default=5,
2321 default=5,
2316 )
2322 )
2317 coreconfigitem(
2323 coreconfigitem(
2318 b'web',
2324 b'web',
2319 b'contact',
2325 b'contact',
2320 default=None,
2326 default=None,
2321 )
2327 )
2322 coreconfigitem(
2328 coreconfigitem(
2323 b'web',
2329 b'web',
2324 b'deny_push',
2330 b'deny_push',
2325 default=list,
2331 default=list,
2326 )
2332 )
2327 coreconfigitem(
2333 coreconfigitem(
2328 b'web',
2334 b'web',
2329 b'guessmime',
2335 b'guessmime',
2330 default=False,
2336 default=False,
2331 )
2337 )
2332 coreconfigitem(
2338 coreconfigitem(
2333 b'web',
2339 b'web',
2334 b'hidden',
2340 b'hidden',
2335 default=False,
2341 default=False,
2336 )
2342 )
2337 coreconfigitem(
2343 coreconfigitem(
2338 b'web',
2344 b'web',
2339 b'labels',
2345 b'labels',
2340 default=list,
2346 default=list,
2341 )
2347 )
2342 coreconfigitem(
2348 coreconfigitem(
2343 b'web',
2349 b'web',
2344 b'logoimg',
2350 b'logoimg',
2345 default=b'hglogo.png',
2351 default=b'hglogo.png',
2346 )
2352 )
2347 coreconfigitem(
2353 coreconfigitem(
2348 b'web',
2354 b'web',
2349 b'logourl',
2355 b'logourl',
2350 default=b'https://mercurial-scm.org/',
2356 default=b'https://mercurial-scm.org/',
2351 )
2357 )
2352 coreconfigitem(
2358 coreconfigitem(
2353 b'web',
2359 b'web',
2354 b'accesslog',
2360 b'accesslog',
2355 default=b'-',
2361 default=b'-',
2356 )
2362 )
2357 coreconfigitem(
2363 coreconfigitem(
2358 b'web',
2364 b'web',
2359 b'address',
2365 b'address',
2360 default=b'',
2366 default=b'',
2361 )
2367 )
2362 coreconfigitem(
2368 coreconfigitem(
2363 b'web',
2369 b'web',
2364 b'allow-archive',
2370 b'allow-archive',
2365 alias=[(b'web', b'allow_archive')],
2371 alias=[(b'web', b'allow_archive')],
2366 default=list,
2372 default=list,
2367 )
2373 )
2368 coreconfigitem(
2374 coreconfigitem(
2369 b'web',
2375 b'web',
2370 b'allow_read',
2376 b'allow_read',
2371 default=list,
2377 default=list,
2372 )
2378 )
2373 coreconfigitem(
2379 coreconfigitem(
2374 b'web',
2380 b'web',
2375 b'baseurl',
2381 b'baseurl',
2376 default=None,
2382 default=None,
2377 )
2383 )
2378 coreconfigitem(
2384 coreconfigitem(
2379 b'web',
2385 b'web',
2380 b'cacerts',
2386 b'cacerts',
2381 default=None,
2387 default=None,
2382 )
2388 )
2383 coreconfigitem(
2389 coreconfigitem(
2384 b'web',
2390 b'web',
2385 b'certificate',
2391 b'certificate',
2386 default=None,
2392 default=None,
2387 )
2393 )
2388 coreconfigitem(
2394 coreconfigitem(
2389 b'web',
2395 b'web',
2390 b'collapse',
2396 b'collapse',
2391 default=False,
2397 default=False,
2392 )
2398 )
2393 coreconfigitem(
2399 coreconfigitem(
2394 b'web',
2400 b'web',
2395 b'csp',
2401 b'csp',
2396 default=None,
2402 default=None,
2397 )
2403 )
2398 coreconfigitem(
2404 coreconfigitem(
2399 b'web',
2405 b'web',
2400 b'deny_read',
2406 b'deny_read',
2401 default=list,
2407 default=list,
2402 )
2408 )
2403 coreconfigitem(
2409 coreconfigitem(
2404 b'web',
2410 b'web',
2405 b'descend',
2411 b'descend',
2406 default=True,
2412 default=True,
2407 )
2413 )
2408 coreconfigitem(
2414 coreconfigitem(
2409 b'web',
2415 b'web',
2410 b'description',
2416 b'description',
2411 default=b"",
2417 default=b"",
2412 )
2418 )
2413 coreconfigitem(
2419 coreconfigitem(
2414 b'web',
2420 b'web',
2415 b'encoding',
2421 b'encoding',
2416 default=lambda: encoding.encoding,
2422 default=lambda: encoding.encoding,
2417 )
2423 )
2418 coreconfigitem(
2424 coreconfigitem(
2419 b'web',
2425 b'web',
2420 b'errorlog',
2426 b'errorlog',
2421 default=b'-',
2427 default=b'-',
2422 )
2428 )
2423 coreconfigitem(
2429 coreconfigitem(
2424 b'web',
2430 b'web',
2425 b'ipv6',
2431 b'ipv6',
2426 default=False,
2432 default=False,
2427 )
2433 )
2428 coreconfigitem(
2434 coreconfigitem(
2429 b'web',
2435 b'web',
2430 b'maxchanges',
2436 b'maxchanges',
2431 default=10,
2437 default=10,
2432 )
2438 )
2433 coreconfigitem(
2439 coreconfigitem(
2434 b'web',
2440 b'web',
2435 b'maxfiles',
2441 b'maxfiles',
2436 default=10,
2442 default=10,
2437 )
2443 )
2438 coreconfigitem(
2444 coreconfigitem(
2439 b'web',
2445 b'web',
2440 b'maxshortchanges',
2446 b'maxshortchanges',
2441 default=60,
2447 default=60,
2442 )
2448 )
2443 coreconfigitem(
2449 coreconfigitem(
2444 b'web',
2450 b'web',
2445 b'motd',
2451 b'motd',
2446 default=b'',
2452 default=b'',
2447 )
2453 )
2448 coreconfigitem(
2454 coreconfigitem(
2449 b'web',
2455 b'web',
2450 b'name',
2456 b'name',
2451 default=dynamicdefault,
2457 default=dynamicdefault,
2452 )
2458 )
2453 coreconfigitem(
2459 coreconfigitem(
2454 b'web',
2460 b'web',
2455 b'port',
2461 b'port',
2456 default=8000,
2462 default=8000,
2457 )
2463 )
2458 coreconfigitem(
2464 coreconfigitem(
2459 b'web',
2465 b'web',
2460 b'prefix',
2466 b'prefix',
2461 default=b'',
2467 default=b'',
2462 )
2468 )
2463 coreconfigitem(
2469 coreconfigitem(
2464 b'web',
2470 b'web',
2465 b'push_ssl',
2471 b'push_ssl',
2466 default=True,
2472 default=True,
2467 )
2473 )
2468 coreconfigitem(
2474 coreconfigitem(
2469 b'web',
2475 b'web',
2470 b'refreshinterval',
2476 b'refreshinterval',
2471 default=20,
2477 default=20,
2472 )
2478 )
2473 coreconfigitem(
2479 coreconfigitem(
2474 b'web',
2480 b'web',
2475 b'server-header',
2481 b'server-header',
2476 default=None,
2482 default=None,
2477 )
2483 )
2478 coreconfigitem(
2484 coreconfigitem(
2479 b'web',
2485 b'web',
2480 b'static',
2486 b'static',
2481 default=None,
2487 default=None,
2482 )
2488 )
2483 coreconfigitem(
2489 coreconfigitem(
2484 b'web',
2490 b'web',
2485 b'staticurl',
2491 b'staticurl',
2486 default=None,
2492 default=None,
2487 )
2493 )
2488 coreconfigitem(
2494 coreconfigitem(
2489 b'web',
2495 b'web',
2490 b'stripes',
2496 b'stripes',
2491 default=1,
2497 default=1,
2492 )
2498 )
2493 coreconfigitem(
2499 coreconfigitem(
2494 b'web',
2500 b'web',
2495 b'style',
2501 b'style',
2496 default=b'paper',
2502 default=b'paper',
2497 )
2503 )
2498 coreconfigitem(
2504 coreconfigitem(
2499 b'web',
2505 b'web',
2500 b'templates',
2506 b'templates',
2501 default=None,
2507 default=None,
2502 )
2508 )
2503 coreconfigitem(
2509 coreconfigitem(
2504 b'web',
2510 b'web',
2505 b'view',
2511 b'view',
2506 default=b'served',
2512 default=b'served',
2507 experimental=True,
2513 experimental=True,
2508 )
2514 )
2509 coreconfigitem(
2515 coreconfigitem(
2510 b'worker',
2516 b'worker',
2511 b'backgroundclose',
2517 b'backgroundclose',
2512 default=dynamicdefault,
2518 default=dynamicdefault,
2513 )
2519 )
2514 # Windows defaults to a limit of 512 open files. A buffer of 128
2520 # Windows defaults to a limit of 512 open files. A buffer of 128
2515 # should give us enough headway.
2521 # should give us enough headway.
2516 coreconfigitem(
2522 coreconfigitem(
2517 b'worker',
2523 b'worker',
2518 b'backgroundclosemaxqueue',
2524 b'backgroundclosemaxqueue',
2519 default=384,
2525 default=384,
2520 )
2526 )
2521 coreconfigitem(
2527 coreconfigitem(
2522 b'worker',
2528 b'worker',
2523 b'backgroundcloseminfilecount',
2529 b'backgroundcloseminfilecount',
2524 default=2048,
2530 default=2048,
2525 )
2531 )
2526 coreconfigitem(
2532 coreconfigitem(
2527 b'worker',
2533 b'worker',
2528 b'backgroundclosethreadcount',
2534 b'backgroundclosethreadcount',
2529 default=4,
2535 default=4,
2530 )
2536 )
2531 coreconfigitem(
2537 coreconfigitem(
2532 b'worker',
2538 b'worker',
2533 b'enabled',
2539 b'enabled',
2534 default=True,
2540 default=True,
2535 )
2541 )
2536 coreconfigitem(
2542 coreconfigitem(
2537 b'worker',
2543 b'worker',
2538 b'numcpus',
2544 b'numcpus',
2539 default=None,
2545 default=None,
2540 )
2546 )
2541
2547
2542 # Rebase related configuration moved to core because other extension are doing
2548 # Rebase related configuration moved to core because other extension are doing
2543 # strange things. For example, shelve import the extensions to reuse some bit
2549 # strange things. For example, shelve import the extensions to reuse some bit
2544 # without formally loading it.
2550 # without formally loading it.
2545 coreconfigitem(
2551 coreconfigitem(
2546 b'commands',
2552 b'commands',
2547 b'rebase.requiredest',
2553 b'rebase.requiredest',
2548 default=False,
2554 default=False,
2549 )
2555 )
2550 coreconfigitem(
2556 coreconfigitem(
2551 b'experimental',
2557 b'experimental',
2552 b'rebaseskipobsolete',
2558 b'rebaseskipobsolete',
2553 default=True,
2559 default=True,
2554 )
2560 )
2555 coreconfigitem(
2561 coreconfigitem(
2556 b'rebase',
2562 b'rebase',
2557 b'singletransaction',
2563 b'singletransaction',
2558 default=False,
2564 default=False,
2559 )
2565 )
2560 coreconfigitem(
2566 coreconfigitem(
2561 b'rebase',
2567 b'rebase',
2562 b'experimental.inmemory',
2568 b'experimental.inmemory',
2563 default=False,
2569 default=False,
2564 )
2570 )
@@ -1,505 +1,507 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 samplegrowth=1.05,
294 audit=None,
293 audit=None,
295 ):
294 ):
296 """Return a tuple (common, anyincoming, remoteheads) used to identify
295 """Return a tuple (common, anyincoming, remoteheads) used to identify
297 missing nodes from or in remote.
296 missing nodes from or in remote.
298
297
299 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
300 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
301 debug.
300 debug.
302 """
301 """
302
303 samplegrowth = float(ui.config(b'devel', b'discovery.grow-sample.rate'))
304
303 start = util.timer()
305 start = util.timer()
304
306
305 roundtrips = 0
307 roundtrips = 0
306 cl = local.changelog
308 cl = local.changelog
307 clnode = cl.node
309 clnode = cl.node
308 clrev = cl.rev
310 clrev = cl.rev
309
311
310 if ancestorsof is not None:
312 if ancestorsof is not None:
311 ownheads = [clrev(n) for n in ancestorsof]
313 ownheads = [clrev(n) for n in ancestorsof]
312 else:
314 else:
313 ownheads = [rev for rev in cl.headrevs() if rev != nullrev]
315 ownheads = [rev for rev in cl.headrevs() if rev != nullrev]
314
316
315 # early exit if we know all the specified remote heads already
317 # early exit if we know all the specified remote heads already
316 ui.debug(b"query 1; heads\n")
318 ui.debug(b"query 1; heads\n")
317 roundtrips += 1
319 roundtrips += 1
318 # We also ask remote about all the local heads. That set can be arbitrarily
320 # We also ask remote about all the local heads. That set can be arbitrarily
319 # large, so we used to limit it size to `initialsamplesize`. We no longer
321 # large, so we used to limit it size to `initialsamplesize`. We no longer
320 # do as it proved counter productive. The skipped heads could lead to a
322 # do as it proved counter productive. The skipped heads could lead to a
321 # large "undecided" set, slower to be clarified than if we asked the
323 # large "undecided" set, slower to be clarified than if we asked the
322 # question for all heads right away.
324 # question for all heads right away.
323 #
325 #
324 # We are already fetching all server heads using the `heads` commands,
326 # We are already fetching all server heads using the `heads` commands,
325 # sending a equivalent number of heads the other way should not have a
327 # sending a equivalent number of heads the other way should not have a
326 # significant impact. In addition, it is very likely that we are going to
328 # significant impact. In addition, it is very likely that we are going to
327 # have to issue "known" request for an equivalent amount of revisions in
329 # have to issue "known" request for an equivalent amount of revisions in
328 # order to decide if theses heads are common or missing.
330 # order to decide if theses heads are common or missing.
329 #
331 #
330 # find a detailled analysis below.
332 # find a detailled analysis below.
331 #
333 #
332 # Case A: local and server both has few heads
334 # Case A: local and server both has few heads
333 #
335 #
334 # Ownheads is below initialsamplesize, limit would not have any effect.
336 # Ownheads is below initialsamplesize, limit would not have any effect.
335 #
337 #
336 # Case B: local has few heads and server has many
338 # Case B: local has few heads and server has many
337 #
339 #
338 # Ownheads is below initialsamplesize, limit would not have any effect.
340 # Ownheads is below initialsamplesize, limit would not have any effect.
339 #
341 #
340 # Case C: local and server both has many heads
342 # Case C: local and server both has many heads
341 #
343 #
342 # We now transfert some more data, but not significantly more than is
344 # We now transfert some more data, but not significantly more than is
343 # already transfered to carry the server heads.
345 # already transfered to carry the server heads.
344 #
346 #
345 # Case D: local has many heads, server has few
347 # Case D: local has many heads, server has few
346 #
348 #
347 # D.1 local heads are mostly known remotely
349 # D.1 local heads are mostly known remotely
348 #
350 #
349 # All the known head will have be part of a `known` request at some
351 # All the known head will have be part of a `known` request at some
350 # point for the discovery to finish. Sending them all earlier is
352 # point for the discovery to finish. Sending them all earlier is
351 # actually helping.
353 # actually helping.
352 #
354 #
353 # (This case is fairly unlikely, it requires the numerous heads to all
355 # (This case is fairly unlikely, it requires the numerous heads to all
354 # be merged server side in only a few heads)
356 # be merged server side in only a few heads)
355 #
357 #
356 # D.2 local heads are mostly missing remotely
358 # D.2 local heads are mostly missing remotely
357 #
359 #
358 # To determine that the heads are missing, we'll have to issue `known`
360 # To determine that the heads are missing, we'll have to issue `known`
359 # request for them or one of their ancestors. This amount of `known`
361 # request for them or one of their ancestors. This amount of `known`
360 # request will likely be in the same order of magnitude than the amount
362 # request will likely be in the same order of magnitude than the amount
361 # of local heads.
363 # of local heads.
362 #
364 #
363 # The only case where we can be more efficient using `known` request on
365 # The only case where we can be more efficient using `known` request on
364 # ancestors are case were all the "missing" local heads are based on a
366 # ancestors are case were all the "missing" local heads are based on a
365 # few changeset, also "missing". This means we would have a "complex"
367 # few changeset, also "missing". This means we would have a "complex"
366 # graph (with many heads) attached to, but very independant to a the
368 # graph (with many heads) attached to, but very independant to a the
367 # "simple" graph on the server. This is a fairly usual case and have
369 # "simple" graph on the server. This is a fairly usual case and have
368 # not been met in the wild so far.
370 # not been met in the wild so far.
369 if remote.limitedarguments:
371 if remote.limitedarguments:
370 sample = _limitsample(ownheads, initialsamplesize)
372 sample = _limitsample(ownheads, initialsamplesize)
371 # indices between sample and externalized version must match
373 # indices between sample and externalized version must match
372 sample = list(sample)
374 sample = list(sample)
373 else:
375 else:
374 sample = ownheads
376 sample = ownheads
375
377
376 with remote.commandexecutor() as e:
378 with remote.commandexecutor() as e:
377 fheads = e.callcommand(b'heads', {})
379 fheads = e.callcommand(b'heads', {})
378 fknown = e.callcommand(
380 fknown = e.callcommand(
379 b'known',
381 b'known',
380 {
382 {
381 b'nodes': [clnode(r) for r in sample],
383 b'nodes': [clnode(r) for r in sample],
382 },
384 },
383 )
385 )
384
386
385 srvheadhashes, yesno = fheads.result(), fknown.result()
387 srvheadhashes, yesno = fheads.result(), fknown.result()
386
388
387 if audit is not None:
389 if audit is not None:
388 audit[b'total-roundtrips'] = 1
390 audit[b'total-roundtrips'] = 1
389
391
390 if cl.tip() == nullid:
392 if cl.tip() == nullid:
391 if srvheadhashes != [nullid]:
393 if srvheadhashes != [nullid]:
392 return [nullid], True, srvheadhashes
394 return [nullid], True, srvheadhashes
393 return [nullid], False, []
395 return [nullid], False, []
394
396
395 # start actual discovery (we note this before the next "if" for
397 # start actual discovery (we note this before the next "if" for
396 # compatibility reasons)
398 # compatibility reasons)
397 ui.status(_(b"searching for changes\n"))
399 ui.status(_(b"searching for changes\n"))
398
400
399 knownsrvheads = [] # revnos of remote heads that are known locally
401 knownsrvheads = [] # revnos of remote heads that are known locally
400 for node in srvheadhashes:
402 for node in srvheadhashes:
401 if node == nullid:
403 if node == nullid:
402 continue
404 continue
403
405
404 try:
406 try:
405 knownsrvheads.append(clrev(node))
407 knownsrvheads.append(clrev(node))
406 # Catches unknown and filtered nodes.
408 # Catches unknown and filtered nodes.
407 except error.LookupError:
409 except error.LookupError:
408 continue
410 continue
409
411
410 if len(knownsrvheads) == len(srvheadhashes):
412 if len(knownsrvheads) == len(srvheadhashes):
411 ui.debug(b"all remote heads known locally\n")
413 ui.debug(b"all remote heads known locally\n")
412 return srvheadhashes, False, srvheadhashes
414 return srvheadhashes, False, srvheadhashes
413
415
414 if len(sample) == len(ownheads) and all(yesno):
416 if len(sample) == len(ownheads) and all(yesno):
415 ui.note(_(b"all local changesets known remotely\n"))
417 ui.note(_(b"all local changesets known remotely\n"))
416 ownheadhashes = [clnode(r) for r in ownheads]
418 ownheadhashes = [clnode(r) for r in ownheads]
417 return ownheadhashes, True, srvheadhashes
419 return ownheadhashes, True, srvheadhashes
418
420
419 # full blown discovery
421 # full blown discovery
420
422
421 # if the server has a limit to its arguments size, we can't grow the sample.
423 # if the server has a limit to its arguments size, we can't grow the sample.
422 hard_limit_sample = remote.limitedarguments
424 hard_limit_sample = remote.limitedarguments
423 grow_sample = local.ui.configbool(b'devel', b'discovery.grow-sample')
425 grow_sample = local.ui.configbool(b'devel', b'discovery.grow-sample')
424 hard_limit_sample = hard_limit_sample and grow_sample
426 hard_limit_sample = hard_limit_sample and grow_sample
425
427
426 randomize = ui.configbool(b'devel', b'discovery.randomize')
428 randomize = ui.configbool(b'devel', b'discovery.randomize')
427 disco = partialdiscovery(
429 disco = partialdiscovery(
428 local, ownheads, hard_limit_sample, randomize=randomize
430 local, ownheads, hard_limit_sample, randomize=randomize
429 )
431 )
430 # treat remote heads (and maybe own heads) as a first implicit sample
432 # treat remote heads (and maybe own heads) as a first implicit sample
431 # response
433 # response
432 disco.addcommons(knownsrvheads)
434 disco.addcommons(knownsrvheads)
433 disco.addinfo(zip(sample, yesno))
435 disco.addinfo(zip(sample, yesno))
434
436
435 full = False
437 full = False
436 progress = ui.makeprogress(_(b'searching'), unit=_(b'queries'))
438 progress = ui.makeprogress(_(b'searching'), unit=_(b'queries'))
437 while not disco.iscomplete():
439 while not disco.iscomplete():
438
440
439 if full or disco.hasinfo():
441 if full or disco.hasinfo():
440 if full:
442 if full:
441 ui.note(_(b"sampling from both directions\n"))
443 ui.note(_(b"sampling from both directions\n"))
442 else:
444 else:
443 ui.debug(b"taking initial sample\n")
445 ui.debug(b"taking initial sample\n")
444 samplefunc = disco.takefullsample
446 samplefunc = disco.takefullsample
445 targetsize = fullsamplesize
447 targetsize = fullsamplesize
446 if not hard_limit_sample:
448 if not hard_limit_sample:
447 fullsamplesize = int(fullsamplesize * samplegrowth)
449 fullsamplesize = int(fullsamplesize * samplegrowth)
448 else:
450 else:
449 # use even cheaper initial sample
451 # use even cheaper initial sample
450 ui.debug(b"taking quick initial sample\n")
452 ui.debug(b"taking quick initial sample\n")
451 samplefunc = disco.takequicksample
453 samplefunc = disco.takequicksample
452 targetsize = initialsamplesize
454 targetsize = initialsamplesize
453 sample = samplefunc(ownheads, targetsize)
455 sample = samplefunc(ownheads, targetsize)
454
456
455 roundtrips += 1
457 roundtrips += 1
456 progress.update(roundtrips)
458 progress.update(roundtrips)
457 stats = disco.stats()
459 stats = disco.stats()
458 ui.debug(
460 ui.debug(
459 b"query %i; still undecided: %i, sample size is: %i\n"
461 b"query %i; still undecided: %i, sample size is: %i\n"
460 % (roundtrips, stats['undecided'], len(sample))
462 % (roundtrips, stats['undecided'], len(sample))
461 )
463 )
462
464
463 # indices between sample and externalized version must match
465 # indices between sample and externalized version must match
464 sample = list(sample)
466 sample = list(sample)
465
467
466 with remote.commandexecutor() as e:
468 with remote.commandexecutor() as e:
467 yesno = e.callcommand(
469 yesno = e.callcommand(
468 b'known',
470 b'known',
469 {
471 {
470 b'nodes': [clnode(r) for r in sample],
472 b'nodes': [clnode(r) for r in sample],
471 },
473 },
472 ).result()
474 ).result()
473
475
474 full = True
476 full = True
475
477
476 disco.addinfo(zip(sample, yesno))
478 disco.addinfo(zip(sample, yesno))
477
479
478 result = disco.commonheads()
480 result = disco.commonheads()
479 elapsed = util.timer() - start
481 elapsed = util.timer() - start
480 progress.complete()
482 progress.complete()
481 ui.debug(b"%d total queries in %.4fs\n" % (roundtrips, elapsed))
483 ui.debug(b"%d total queries in %.4fs\n" % (roundtrips, elapsed))
482 msg = (
484 msg = (
483 b'found %d common and %d unknown server heads,'
485 b'found %d common and %d unknown server heads,'
484 b' %d roundtrips in %.4fs\n'
486 b' %d roundtrips in %.4fs\n'
485 )
487 )
486 missing = set(result) - set(knownsrvheads)
488 missing = set(result) - set(knownsrvheads)
487 ui.log(b'discovery', msg, len(result), len(missing), roundtrips, elapsed)
489 ui.log(b'discovery', msg, len(result), len(missing), roundtrips, elapsed)
488
490
489 if audit is not None:
491 if audit is not None:
490 audit[b'total-roundtrips'] = roundtrips
492 audit[b'total-roundtrips'] = roundtrips
491
493
492 if not result and srvheadhashes != [nullid]:
494 if not result and srvheadhashes != [nullid]:
493 if abortwhenunrelated:
495 if abortwhenunrelated:
494 raise error.Abort(_(b"repository is unrelated"))
496 raise error.Abort(_(b"repository is unrelated"))
495 else:
497 else:
496 ui.warn(_(b"warning: repository is unrelated\n"))
498 ui.warn(_(b"warning: repository is unrelated\n"))
497 return (
499 return (
498 {nullid},
500 {nullid},
499 True,
501 True,
500 srvheadhashes,
502 srvheadhashes,
501 )
503 )
502
504
503 anyincoming = srvheadhashes != [nullid]
505 anyincoming = srvheadhashes != [nullid]
504 result = {clnode(r) for r in result}
506 result = {clnode(r) for r in result}
505 return result, anyincoming, srvheadhashes
507 return result, anyincoming, srvheadhashes
@@ -1,1541 +1,1583 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
1416 comparing with b
1417 query 1; heads
1418 searching for changes
1419 taking quick initial sample
1420 query 2; still undecided: 1080, sample size is: 100
1421 sampling from both directions
1422 query 3; still undecided: 980, sample size is: 200
1423 sampling from both directions
1424 query 4; still undecided: 497, sample size is: 202
1425 sampling from both directions
1426 query 5; still undecided: 294, sample size is: 204
1427 sampling from both directions
1428 query 6; still undecided: 90, sample size is: 90
1429 6 total queries in *s (glob)
1430 elapsed time: * seconds (glob)
1431 round-trips: 6
1432 heads summary:
1433 total common heads: 1
1434 also local heads: 0
1435 also remote heads: 0
1436 both: 0
1437 local heads: 260
1438 common: 0
1439 missing: 260
1440 remote heads: 1
1441 common: 0
1442 unknown: 1
1443 local changesets: 1340
1444 common: 300
1445 heads: 1
1446 roots: 1
1447 missing: 1040
1448 heads: 260
1449 roots: 260
1450 first undecided set: 1340
1451 heads: 260
1452 roots: 1
1453 common: 300
1454 missing: 1040
1455 common heads: 3ee37d65064a
1456
1415 Test actual protocol when pulling one new head in addition to common heads
1457 Test actual protocol when pulling one new head in addition to common heads
1416
1458
1417 $ hg clone -U b c
1459 $ hg clone -U b c
1418 $ hg -R c id -ir tip
1460 $ hg -R c id -ir tip
1419 513314ca8b3a
1461 513314ca8b3a
1420 $ hg -R c up -qr default
1462 $ hg -R c up -qr default
1421 $ touch c/f
1463 $ touch c/f
1422 $ hg -R c ci -Aqm "extra head"
1464 $ hg -R c ci -Aqm "extra head"
1423 $ hg -R c id -i
1465 $ hg -R c id -i
1424 e64a39e7da8b
1466 e64a39e7da8b
1425
1467
1426 $ hg serve -R c -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
1468 $ hg serve -R c -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
1427 $ cat hg.pid >> $DAEMON_PIDS
1469 $ cat hg.pid >> $DAEMON_PIDS
1428
1470
1429 $ hg -R b incoming http://localhost:$HGPORT/ -T '{node|short}\n'
1471 $ hg -R b incoming http://localhost:$HGPORT/ -T '{node|short}\n'
1430 comparing with http://localhost:$HGPORT/
1472 comparing with http://localhost:$HGPORT/
1431 searching for changes
1473 searching for changes
1432 e64a39e7da8b
1474 e64a39e7da8b
1433
1475
1434 $ killdaemons.py
1476 $ killdaemons.py
1435 $ cut -d' ' -f6- access.log | grep -v cmd=known # cmd=known uses random sampling
1477 $ cut -d' ' -f6- access.log | grep -v cmd=known # cmd=known uses random sampling
1436 "GET /?cmd=capabilities HTTP/1.1" 200 -
1478 "GET /?cmd=capabilities HTTP/1.1" 200 -
1437 "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
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
1438 "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
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
1439 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases 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
1440 $ cat errors.log
1482 $ cat errors.log
1441
1483
1442 $ cd ..
1484 $ cd ..
1443
1485
1444
1486
1445 Issue 4438 - test coverage for 3ef893520a85 issues.
1487 Issue 4438 - test coverage for 3ef893520a85 issues.
1446
1488
1447 $ mkdir issue4438
1489 $ mkdir issue4438
1448 $ cd issue4438
1490 $ cd issue4438
1449 #if false
1491 #if false
1450 generate new bundles:
1492 generate new bundles:
1451 $ hg init r1
1493 $ hg init r1
1452 $ 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
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
1453 $ hg clone -q r1 r2
1495 $ hg clone -q r1 r2
1454 $ 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
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
1455 $ hg -R r2 branch -q r2change && hg -R r2 ci -qmr2change
1497 $ hg -R r2 branch -q r2change && hg -R r2 ci -qmr2change
1456 $ hg -R r1 bundle -qa $TESTDIR/bundles/issue4438-r1.hg
1498 $ hg -R r1 bundle -qa $TESTDIR/bundles/issue4438-r1.hg
1457 $ hg -R r2 bundle -qa $TESTDIR/bundles/issue4438-r2.hg
1499 $ hg -R r2 bundle -qa $TESTDIR/bundles/issue4438-r2.hg
1458 #else
1500 #else
1459 use existing bundles:
1501 use existing bundles:
1460 $ hg init r1
1502 $ hg init r1
1461 $ hg -R r1 -q unbundle $TESTDIR/bundles/issue4438-r1.hg
1503 $ hg -R r1 -q unbundle $TESTDIR/bundles/issue4438-r1.hg
1462 $ hg -R r1 -q up
1504 $ hg -R r1 -q up
1463 $ hg init r2
1505 $ hg init r2
1464 $ hg -R r2 -q unbundle $TESTDIR/bundles/issue4438-r2.hg
1506 $ hg -R r2 -q unbundle $TESTDIR/bundles/issue4438-r2.hg
1465 $ hg -R r2 -q up
1507 $ hg -R r2 -q up
1466 #endif
1508 #endif
1467
1509
1468 Set iteration order could cause wrong and unstable results - fixed in 73cfaa348650:
1510 Set iteration order could cause wrong and unstable results - fixed in 73cfaa348650:
1469
1511
1470 $ hg -R r1 outgoing r2 -T'{rev} '
1512 $ hg -R r1 outgoing r2 -T'{rev} '
1471 comparing with r2
1513 comparing with r2
1472 searching for changes
1514 searching for changes
1473 101 102 103 104 105 106 107 108 109 110 (no-eol)
1515 101 102 103 104 105 106 107 108 109 110 (no-eol)
1474
1516
1475 The case where all the 'initialsamplesize' samples already were common would
1517 The case where all the 'initialsamplesize' samples already were common would
1476 give 'all remote heads known locally' without checking the remaining heads -
1518 give 'all remote heads known locally' without checking the remaining heads -
1477 fixed in 86c35b7ae300:
1519 fixed in 86c35b7ae300:
1478
1520
1479 $ cat >> r1/.hg/hgrc << EOF
1521 $ cat >> r1/.hg/hgrc << EOF
1480 > [devel]
1522 > [devel]
1481 > discovery.randomize = False
1523 > discovery.randomize = False
1482 > EOF
1524 > EOF
1483
1525
1484 $ hg -R r1 outgoing r2 -T'{rev} ' --config extensions.blackbox= \
1526 $ hg -R r1 outgoing r2 -T'{rev} ' --config extensions.blackbox= \
1485 > --config blackbox.track='command commandfinish discovery'
1527 > --config blackbox.track='command commandfinish discovery'
1486 comparing with r2
1528 comparing with r2
1487 searching for changes
1529 searching for changes
1488 101 102 103 104 105 106 107 108 109 110 (no-eol)
1530 101 102 103 104 105 106 107 108 109 110 (no-eol)
1489 $ hg -R r1 --config extensions.blackbox= blackbox --config blackbox.track=
1531 $ hg -R r1 --config extensions.blackbox= blackbox --config blackbox.track=
1490 * @5d0b986a083e0d91f116de4691e2aaa54d5bbec0 (*)> serve --cmdserver chgunix * (glob) (chg !)
1532 * @5d0b986a083e0d91f116de4691e2aaa54d5bbec0 (*)> serve --cmdserver chgunix * (glob) (chg !)
1491 * @5d0b986a083e0d91f116de4691e2aaa54d5bbec0 (*)> -R r1 outgoing r2 *-T{rev} * --config *extensions.blackbox=* (glob)
1533 * @5d0b986a083e0d91f116de4691e2aaa54d5bbec0 (*)> -R r1 outgoing r2 *-T{rev} * --config *extensions.blackbox=* (glob)
1492 * @5d0b986a083e0d91f116de4691e2aaa54d5bbec0 (*)> found 101 common and 1 unknown server heads, 1 roundtrips in *.????s (glob)
1534 * @5d0b986a083e0d91f116de4691e2aaa54d5bbec0 (*)> found 101 common and 1 unknown server heads, 1 roundtrips in *.????s (glob)
1493 * @5d0b986a083e0d91f116de4691e2aaa54d5bbec0 (*)> -R r1 outgoing r2 *-T{rev} * --config *extensions.blackbox=* exited 0 after *.?? seconds (glob)
1535 * @5d0b986a083e0d91f116de4691e2aaa54d5bbec0 (*)> -R r1 outgoing r2 *-T{rev} * --config *extensions.blackbox=* exited 0 after *.?? seconds (glob)
1494 $ cd ..
1536 $ cd ..
1495
1537
1496 Even if the set of revs to discover is restricted, unrelated revs may be
1538 Even if the set of revs to discover is restricted, unrelated revs may be
1497 returned as common heads.
1539 returned as common heads.
1498
1540
1499 $ mkdir ancestorsof
1541 $ mkdir ancestorsof
1500 $ cd ancestorsof
1542 $ cd ancestorsof
1501 $ hg init a
1543 $ hg init a
1502 $ hg clone a b -q
1544 $ hg clone a b -q
1503 $ cd b
1545 $ cd b
1504 $ hg debugbuilddag '.:root *root *root'
1546 $ hg debugbuilddag '.:root *root *root'
1505 $ hg log -G -T '{node|short}'
1547 $ hg log -G -T '{node|short}'
1506 o fa942426a6fd
1548 o fa942426a6fd
1507 |
1549 |
1508 | o 66f7d451a68b
1550 | o 66f7d451a68b
1509 |/
1551 |/
1510 o 1ea73414a91b
1552 o 1ea73414a91b
1511
1553
1512 $ hg push -r 66f7d451a68b -q
1554 $ hg push -r 66f7d451a68b -q
1513 $ hg debugdiscovery --verbose --rev fa942426a6fd
1555 $ hg debugdiscovery --verbose --rev fa942426a6fd
1514 comparing with $TESTTMP/ancestorsof/a
1556 comparing with $TESTTMP/ancestorsof/a
1515 searching for changes
1557 searching for changes
1516 elapsed time: * seconds (glob)
1558 elapsed time: * seconds (glob)
1517 round-trips: 1
1559 round-trips: 1
1518 heads summary:
1560 heads summary:
1519 total common heads: 1
1561 total common heads: 1
1520 also local heads: 1
1562 also local heads: 1
1521 also remote heads: 1
1563 also remote heads: 1
1522 both: 1
1564 both: 1
1523 local heads: 2
1565 local heads: 2
1524 common: 1
1566 common: 1
1525 missing: 1
1567 missing: 1
1526 remote heads: 1
1568 remote heads: 1
1527 common: 1
1569 common: 1
1528 unknown: 0
1570 unknown: 0
1529 local changesets: 3
1571 local changesets: 3
1530 common: 2
1572 common: 2
1531 heads: 1
1573 heads: 1
1532 roots: 1
1574 roots: 1
1533 missing: 1
1575 missing: 1
1534 heads: 1
1576 heads: 1
1535 roots: 1
1577 roots: 1
1536 first undecided set: 1
1578 first undecided set: 1
1537 heads: 1
1579 heads: 1
1538 roots: 1
1580 roots: 1
1539 common: 0
1581 common: 0
1540 missing: 1
1582 missing: 1
1541 common heads: 66f7d451a68b
1583 common heads: 66f7d451a68b
General Comments 0
You need to be logged in to leave comments. Login now