##// END OF EJS Templates
discovery: new devel.discovery.randomize option...
Georges Racinet -
r42969:334c1ea5 default
parent child Browse files
Show More
@@ -1,1502 +1,1505 b''
1 1 # configitems.py - centralized declaration of configuration option
2 2 #
3 3 # Copyright 2017 Pierre-Yves David <pierre-yves.david@octobus.net>
4 4 #
5 5 # This software may be used and distributed according to the terms of the
6 6 # GNU General Public License version 2 or any later version.
7 7
8 8 from __future__ import absolute_import
9 9
10 10 import functools
11 11 import re
12 12
13 13 from . import (
14 14 encoding,
15 15 error,
16 16 )
17 17
18 18 def loadconfigtable(ui, extname, configtable):
19 19 """update config item known to the ui with the extension ones"""
20 20 for section, items in sorted(configtable.items()):
21 21 knownitems = ui._knownconfig.setdefault(section, itemregister())
22 22 knownkeys = set(knownitems)
23 23 newkeys = set(items)
24 24 for key in sorted(knownkeys & newkeys):
25 25 msg = "extension '%s' overwrite config item '%s.%s'"
26 26 msg %= (extname, section, key)
27 27 ui.develwarn(msg, config='warn-config')
28 28
29 29 knownitems.update(items)
30 30
31 31 class configitem(object):
32 32 """represent a known config item
33 33
34 34 :section: the official config section where to find this item,
35 35 :name: the official name within the section,
36 36 :default: default value for this item,
37 37 :alias: optional list of tuples as alternatives,
38 38 :generic: this is a generic definition, match name using regular expression.
39 39 """
40 40
41 41 def __init__(self, section, name, default=None, alias=(),
42 42 generic=False, priority=0):
43 43 self.section = section
44 44 self.name = name
45 45 self.default = default
46 46 self.alias = list(alias)
47 47 self.generic = generic
48 48 self.priority = priority
49 49 self._re = None
50 50 if generic:
51 51 self._re = re.compile(self.name)
52 52
53 53 class itemregister(dict):
54 54 """A specialized dictionary that can handle wild-card selection"""
55 55
56 56 def __init__(self):
57 57 super(itemregister, self).__init__()
58 58 self._generics = set()
59 59
60 60 def update(self, other):
61 61 super(itemregister, self).update(other)
62 62 self._generics.update(other._generics)
63 63
64 64 def __setitem__(self, key, item):
65 65 super(itemregister, self).__setitem__(key, item)
66 66 if item.generic:
67 67 self._generics.add(item)
68 68
69 69 def get(self, key):
70 70 baseitem = super(itemregister, self).get(key)
71 71 if baseitem is not None and not baseitem.generic:
72 72 return baseitem
73 73
74 74 # search for a matching generic item
75 75 generics = sorted(self._generics, key=(lambda x: (x.priority, x.name)))
76 76 for item in generics:
77 77 # we use 'match' instead of 'search' to make the matching simpler
78 78 # for people unfamiliar with regular expression. Having the match
79 79 # rooted to the start of the string will produce less surprising
80 80 # result for user writing simple regex for sub-attribute.
81 81 #
82 82 # For example using "color\..*" match produces an unsurprising
83 83 # result, while using search could suddenly match apparently
84 84 # unrelated configuration that happens to contains "color."
85 85 # anywhere. This is a tradeoff where we favor requiring ".*" on
86 86 # some match to avoid the need to prefix most pattern with "^".
87 87 # The "^" seems more error prone.
88 88 if item._re.match(key):
89 89 return item
90 90
91 91 return None
92 92
93 93 coreitems = {}
94 94
95 95 def _register(configtable, *args, **kwargs):
96 96 item = configitem(*args, **kwargs)
97 97 section = configtable.setdefault(item.section, itemregister())
98 98 if item.name in section:
99 99 msg = "duplicated config item registration for '%s.%s'"
100 100 raise error.ProgrammingError(msg % (item.section, item.name))
101 101 section[item.name] = item
102 102
103 103 # special value for case where the default is derived from other values
104 104 dynamicdefault = object()
105 105
106 106 # Registering actual config items
107 107
108 108 def getitemregister(configtable):
109 109 f = functools.partial(_register, configtable)
110 110 # export pseudo enum as configitem.*
111 111 f.dynamicdefault = dynamicdefault
112 112 return f
113 113
114 114 coreconfigitem = getitemregister(coreitems)
115 115
116 116 def _registerdiffopts(section, configprefix=''):
117 117 coreconfigitem(section, configprefix + 'nodates',
118 118 default=False,
119 119 )
120 120 coreconfigitem(section, configprefix + 'showfunc',
121 121 default=False,
122 122 )
123 123 coreconfigitem(section, configprefix + 'unified',
124 124 default=None,
125 125 )
126 126 coreconfigitem(section, configprefix + 'git',
127 127 default=False,
128 128 )
129 129 coreconfigitem(section, configprefix + 'ignorews',
130 130 default=False,
131 131 )
132 132 coreconfigitem(section, configprefix + 'ignorewsamount',
133 133 default=False,
134 134 )
135 135 coreconfigitem(section, configprefix + 'ignoreblanklines',
136 136 default=False,
137 137 )
138 138 coreconfigitem(section, configprefix + 'ignorewseol',
139 139 default=False,
140 140 )
141 141 coreconfigitem(section, configprefix + 'nobinary',
142 142 default=False,
143 143 )
144 144 coreconfigitem(section, configprefix + 'noprefix',
145 145 default=False,
146 146 )
147 147 coreconfigitem(section, configprefix + 'word-diff',
148 148 default=False,
149 149 )
150 150
151 151 coreconfigitem('alias', '.*',
152 152 default=dynamicdefault,
153 153 generic=True,
154 154 )
155 155 coreconfigitem('auth', 'cookiefile',
156 156 default=None,
157 157 )
158 158 _registerdiffopts(section='annotate')
159 159 # bookmarks.pushing: internal hack for discovery
160 160 coreconfigitem('bookmarks', 'pushing',
161 161 default=list,
162 162 )
163 163 # bundle.mainreporoot: internal hack for bundlerepo
164 164 coreconfigitem('bundle', 'mainreporoot',
165 165 default='',
166 166 )
167 167 coreconfigitem('censor', 'policy',
168 168 default='abort',
169 169 )
170 170 coreconfigitem('chgserver', 'idletimeout',
171 171 default=3600,
172 172 )
173 173 coreconfigitem('chgserver', 'skiphash',
174 174 default=False,
175 175 )
176 176 coreconfigitem('cmdserver', 'log',
177 177 default=None,
178 178 )
179 179 coreconfigitem('cmdserver', 'max-log-files',
180 180 default=7,
181 181 )
182 182 coreconfigitem('cmdserver', 'max-log-size',
183 183 default='1 MB',
184 184 )
185 185 coreconfigitem('cmdserver', 'max-repo-cache',
186 186 default=0,
187 187 )
188 188 coreconfigitem('cmdserver', 'message-encodings',
189 189 default=list,
190 190 )
191 191 coreconfigitem('cmdserver', 'track-log',
192 192 default=lambda: ['chgserver', 'cmdserver', 'repocache'],
193 193 )
194 194 coreconfigitem('color', '.*',
195 195 default=None,
196 196 generic=True,
197 197 )
198 198 coreconfigitem('color', 'mode',
199 199 default='auto',
200 200 )
201 201 coreconfigitem('color', 'pagermode',
202 202 default=dynamicdefault,
203 203 )
204 204 _registerdiffopts(section='commands', configprefix='commit.interactive.')
205 205 coreconfigitem('commands', 'commit.post-status',
206 206 default=False,
207 207 )
208 208 coreconfigitem('commands', 'grep.all-files',
209 209 default=False,
210 210 )
211 211 coreconfigitem('commands', 'resolve.confirm',
212 212 default=False,
213 213 )
214 214 coreconfigitem('commands', 'resolve.explicit-re-merge',
215 215 default=False,
216 216 )
217 217 coreconfigitem('commands', 'resolve.mark-check',
218 218 default='none',
219 219 )
220 220 _registerdiffopts(section='commands', configprefix='revert.interactive.')
221 221 coreconfigitem('commands', 'show.aliasprefix',
222 222 default=list,
223 223 )
224 224 coreconfigitem('commands', 'status.relative',
225 225 default=False,
226 226 )
227 227 coreconfigitem('commands', 'status.skipstates',
228 228 default=[],
229 229 )
230 230 coreconfigitem('commands', 'status.terse',
231 231 default='',
232 232 )
233 233 coreconfigitem('commands', 'status.verbose',
234 234 default=False,
235 235 )
236 236 coreconfigitem('commands', 'update.check',
237 237 default=None,
238 238 )
239 239 coreconfigitem('commands', 'update.requiredest',
240 240 default=False,
241 241 )
242 242 coreconfigitem('committemplate', '.*',
243 243 default=None,
244 244 generic=True,
245 245 )
246 246 coreconfigitem('convert', 'bzr.saverev',
247 247 default=True,
248 248 )
249 249 coreconfigitem('convert', 'cvsps.cache',
250 250 default=True,
251 251 )
252 252 coreconfigitem('convert', 'cvsps.fuzz',
253 253 default=60,
254 254 )
255 255 coreconfigitem('convert', 'cvsps.logencoding',
256 256 default=None,
257 257 )
258 258 coreconfigitem('convert', 'cvsps.mergefrom',
259 259 default=None,
260 260 )
261 261 coreconfigitem('convert', 'cvsps.mergeto',
262 262 default=None,
263 263 )
264 264 coreconfigitem('convert', 'git.committeractions',
265 265 default=lambda: ['messagedifferent'],
266 266 )
267 267 coreconfigitem('convert', 'git.extrakeys',
268 268 default=list,
269 269 )
270 270 coreconfigitem('convert', 'git.findcopiesharder',
271 271 default=False,
272 272 )
273 273 coreconfigitem('convert', 'git.remoteprefix',
274 274 default='remote',
275 275 )
276 276 coreconfigitem('convert', 'git.renamelimit',
277 277 default=400,
278 278 )
279 279 coreconfigitem('convert', 'git.saverev',
280 280 default=True,
281 281 )
282 282 coreconfigitem('convert', 'git.similarity',
283 283 default=50,
284 284 )
285 285 coreconfigitem('convert', 'git.skipsubmodules',
286 286 default=False,
287 287 )
288 288 coreconfigitem('convert', 'hg.clonebranches',
289 289 default=False,
290 290 )
291 291 coreconfigitem('convert', 'hg.ignoreerrors',
292 292 default=False,
293 293 )
294 294 coreconfigitem('convert', 'hg.preserve-hash',
295 295 default=False,
296 296 )
297 297 coreconfigitem('convert', 'hg.revs',
298 298 default=None,
299 299 )
300 300 coreconfigitem('convert', 'hg.saverev',
301 301 default=False,
302 302 )
303 303 coreconfigitem('convert', 'hg.sourcename',
304 304 default=None,
305 305 )
306 306 coreconfigitem('convert', 'hg.startrev',
307 307 default=None,
308 308 )
309 309 coreconfigitem('convert', 'hg.tagsbranch',
310 310 default='default',
311 311 )
312 312 coreconfigitem('convert', 'hg.usebranchnames',
313 313 default=True,
314 314 )
315 315 coreconfigitem('convert', 'ignoreancestorcheck',
316 316 default=False,
317 317 )
318 318 coreconfigitem('convert', 'localtimezone',
319 319 default=False,
320 320 )
321 321 coreconfigitem('convert', 'p4.encoding',
322 322 default=dynamicdefault,
323 323 )
324 324 coreconfigitem('convert', 'p4.startrev',
325 325 default=0,
326 326 )
327 327 coreconfigitem('convert', 'skiptags',
328 328 default=False,
329 329 )
330 330 coreconfigitem('convert', 'svn.debugsvnlog',
331 331 default=True,
332 332 )
333 333 coreconfigitem('convert', 'svn.trunk',
334 334 default=None,
335 335 )
336 336 coreconfigitem('convert', 'svn.tags',
337 337 default=None,
338 338 )
339 339 coreconfigitem('convert', 'svn.branches',
340 340 default=None,
341 341 )
342 342 coreconfigitem('convert', 'svn.startrev',
343 343 default=0,
344 344 )
345 345 coreconfigitem('debug', 'dirstate.delaywrite',
346 346 default=0,
347 347 )
348 348 coreconfigitem('defaults', '.*',
349 349 default=None,
350 350 generic=True,
351 351 )
352 352 coreconfigitem('devel', 'all-warnings',
353 353 default=False,
354 354 )
355 355 coreconfigitem('devel', 'bundle2.debug',
356 356 default=False,
357 357 )
358 358 coreconfigitem('devel', 'bundle.delta',
359 359 default='',
360 360 )
361 361 coreconfigitem('devel', 'cache-vfs',
362 362 default=None,
363 363 )
364 364 coreconfigitem('devel', 'check-locks',
365 365 default=False,
366 366 )
367 367 coreconfigitem('devel', 'check-relroot',
368 368 default=False,
369 369 )
370 370 coreconfigitem('devel', 'default-date',
371 371 default=None,
372 372 )
373 373 coreconfigitem('devel', 'deprec-warn',
374 374 default=False,
375 375 )
376 376 coreconfigitem('devel', 'disableloaddefaultcerts',
377 377 default=False,
378 378 )
379 379 coreconfigitem('devel', 'warn-empty-changegroup',
380 380 default=False,
381 381 )
382 382 coreconfigitem('devel', 'legacy.exchange',
383 383 default=list,
384 384 )
385 385 coreconfigitem('devel', 'servercafile',
386 386 default='',
387 387 )
388 388 coreconfigitem('devel', 'serverexactprotocol',
389 389 default='',
390 390 )
391 391 coreconfigitem('devel', 'serverrequirecert',
392 392 default=False,
393 393 )
394 394 coreconfigitem('devel', 'strip-obsmarkers',
395 395 default=True,
396 396 )
397 397 coreconfigitem('devel', 'warn-config',
398 398 default=None,
399 399 )
400 400 coreconfigitem('devel', 'warn-config-default',
401 401 default=None,
402 402 )
403 403 coreconfigitem('devel', 'user.obsmarker',
404 404 default=None,
405 405 )
406 406 coreconfigitem('devel', 'warn-config-unknown',
407 407 default=None,
408 408 )
409 409 coreconfigitem('devel', 'debug.copies',
410 410 default=False,
411 411 )
412 412 coreconfigitem('devel', 'debug.extensions',
413 413 default=False,
414 414 )
415 415 coreconfigitem('devel', 'debug.peer-request',
416 416 default=False,
417 417 )
418 coreconfigitem('devel', 'discovery.randomize',
419 default=True,
420 )
418 421 _registerdiffopts(section='diff')
419 422 coreconfigitem('email', 'bcc',
420 423 default=None,
421 424 )
422 425 coreconfigitem('email', 'cc',
423 426 default=None,
424 427 )
425 428 coreconfigitem('email', 'charsets',
426 429 default=list,
427 430 )
428 431 coreconfigitem('email', 'from',
429 432 default=None,
430 433 )
431 434 coreconfigitem('email', 'method',
432 435 default='smtp',
433 436 )
434 437 coreconfigitem('email', 'reply-to',
435 438 default=None,
436 439 )
437 440 coreconfigitem('email', 'to',
438 441 default=None,
439 442 )
440 443 coreconfigitem('experimental', 'archivemetatemplate',
441 444 default=dynamicdefault,
442 445 )
443 446 coreconfigitem('experimental', 'auto-publish',
444 447 default='publish',
445 448 )
446 449 coreconfigitem('experimental', 'bundle-phases',
447 450 default=False,
448 451 )
449 452 coreconfigitem('experimental', 'bundle2-advertise',
450 453 default=True,
451 454 )
452 455 coreconfigitem('experimental', 'bundle2-output-capture',
453 456 default=False,
454 457 )
455 458 coreconfigitem('experimental', 'bundle2.pushback',
456 459 default=False,
457 460 )
458 461 coreconfigitem('experimental', 'bundle2lazylocking',
459 462 default=False,
460 463 )
461 464 coreconfigitem('experimental', 'bundlecomplevel',
462 465 default=None,
463 466 )
464 467 coreconfigitem('experimental', 'bundlecomplevel.bzip2',
465 468 default=None,
466 469 )
467 470 coreconfigitem('experimental', 'bundlecomplevel.gzip',
468 471 default=None,
469 472 )
470 473 coreconfigitem('experimental', 'bundlecomplevel.none',
471 474 default=None,
472 475 )
473 476 coreconfigitem('experimental', 'bundlecomplevel.zstd',
474 477 default=None,
475 478 )
476 479 coreconfigitem('experimental', 'changegroup3',
477 480 default=False,
478 481 )
479 482 coreconfigitem('experimental', 'cleanup-as-archived',
480 483 default=False,
481 484 )
482 485 coreconfigitem('experimental', 'clientcompressionengines',
483 486 default=list,
484 487 )
485 488 coreconfigitem('experimental', 'copytrace',
486 489 default='on',
487 490 )
488 491 coreconfigitem('experimental', 'copytrace.movecandidateslimit',
489 492 default=100,
490 493 )
491 494 coreconfigitem('experimental', 'copytrace.sourcecommitlimit',
492 495 default=100,
493 496 )
494 497 coreconfigitem('experimental', 'copies.read-from',
495 498 default="filelog-only",
496 499 )
497 500 coreconfigitem('experimental', 'copies.write-to',
498 501 default='filelog-only',
499 502 )
500 503 coreconfigitem('experimental', 'crecordtest',
501 504 default=None,
502 505 )
503 506 coreconfigitem('experimental', 'directaccess',
504 507 default=False,
505 508 )
506 509 coreconfigitem('experimental', 'directaccess.revnums',
507 510 default=False,
508 511 )
509 512 coreconfigitem('experimental', 'editortmpinhg',
510 513 default=False,
511 514 )
512 515 coreconfigitem('experimental', 'evolution',
513 516 default=list,
514 517 )
515 518 coreconfigitem('experimental', 'evolution.allowdivergence',
516 519 default=False,
517 520 alias=[('experimental', 'allowdivergence')]
518 521 )
519 522 coreconfigitem('experimental', 'evolution.allowunstable',
520 523 default=None,
521 524 )
522 525 coreconfigitem('experimental', 'evolution.createmarkers',
523 526 default=None,
524 527 )
525 528 coreconfigitem('experimental', 'evolution.effect-flags',
526 529 default=True,
527 530 alias=[('experimental', 'effect-flags')]
528 531 )
529 532 coreconfigitem('experimental', 'evolution.exchange',
530 533 default=None,
531 534 )
532 535 coreconfigitem('experimental', 'evolution.bundle-obsmarker',
533 536 default=False,
534 537 )
535 538 coreconfigitem('experimental', 'log.topo',
536 539 default=False,
537 540 )
538 541 coreconfigitem('experimental', 'evolution.report-instabilities',
539 542 default=True,
540 543 )
541 544 coreconfigitem('experimental', 'evolution.track-operation',
542 545 default=True,
543 546 )
544 547 # repo-level config to exclude a revset visibility
545 548 #
546 549 # The target use case is to use `share` to expose different subset of the same
547 550 # repository, especially server side. See also `server.view`.
548 551 coreconfigitem('experimental', 'extra-filter-revs',
549 552 default=None,
550 553 )
551 554 coreconfigitem('experimental', 'maxdeltachainspan',
552 555 default=-1,
553 556 )
554 557 coreconfigitem('experimental', 'mergetempdirprefix',
555 558 default=None,
556 559 )
557 560 coreconfigitem('experimental', 'mmapindexthreshold',
558 561 default=None,
559 562 )
560 563 coreconfigitem('experimental', 'narrow',
561 564 default=False,
562 565 )
563 566 coreconfigitem('experimental', 'nonnormalparanoidcheck',
564 567 default=False,
565 568 )
566 569 coreconfigitem('experimental', 'exportableenviron',
567 570 default=list,
568 571 )
569 572 coreconfigitem('experimental', 'extendedheader.index',
570 573 default=None,
571 574 )
572 575 coreconfigitem('experimental', 'extendedheader.similarity',
573 576 default=False,
574 577 )
575 578 coreconfigitem('experimental', 'graphshorten',
576 579 default=False,
577 580 )
578 581 coreconfigitem('experimental', 'graphstyle.parent',
579 582 default=dynamicdefault,
580 583 )
581 584 coreconfigitem('experimental', 'graphstyle.missing',
582 585 default=dynamicdefault,
583 586 )
584 587 coreconfigitem('experimental', 'graphstyle.grandparent',
585 588 default=dynamicdefault,
586 589 )
587 590 coreconfigitem('experimental', 'hook-track-tags',
588 591 default=False,
589 592 )
590 593 coreconfigitem('experimental', 'httppeer.advertise-v2',
591 594 default=False,
592 595 )
593 596 coreconfigitem('experimental', 'httppeer.v2-encoder-order',
594 597 default=None,
595 598 )
596 599 coreconfigitem('experimental', 'httppostargs',
597 600 default=False,
598 601 )
599 602 coreconfigitem('experimental', 'mergedriver',
600 603 default=None,
601 604 )
602 605 coreconfigitem('experimental', 'nointerrupt', default=False)
603 606 coreconfigitem('experimental', 'nointerrupt-interactiveonly', default=True)
604 607
605 608 coreconfigitem('experimental', 'obsmarkers-exchange-debug',
606 609 default=False,
607 610 )
608 611 coreconfigitem('experimental', 'remotenames',
609 612 default=False,
610 613 )
611 614 coreconfigitem('experimental', 'removeemptydirs',
612 615 default=True,
613 616 )
614 617 coreconfigitem('experimental', 'revert.interactive.select-to-keep',
615 618 default=False,
616 619 )
617 620 coreconfigitem('experimental', 'revisions.prefixhexnode',
618 621 default=False,
619 622 )
620 623 coreconfigitem('experimental', 'revlogv2',
621 624 default=None,
622 625 )
623 626 coreconfigitem('experimental', 'revisions.disambiguatewithin',
624 627 default=None,
625 628 )
626 629 coreconfigitem('experimental', 'server.filesdata.recommended-batch-size',
627 630 default=50000,
628 631 )
629 632 coreconfigitem('experimental', 'server.manifestdata.recommended-batch-size',
630 633 default=100000,
631 634 )
632 635 coreconfigitem('experimental', 'server.stream-narrow-clones',
633 636 default=False,
634 637 )
635 638 coreconfigitem('experimental', 'single-head-per-branch',
636 639 default=False,
637 640 )
638 641 coreconfigitem('experimental', 'sshserver.support-v2',
639 642 default=False,
640 643 )
641 644 coreconfigitem('experimental', 'sparse-read',
642 645 default=False,
643 646 )
644 647 coreconfigitem('experimental', 'sparse-read.density-threshold',
645 648 default=0.50,
646 649 )
647 650 coreconfigitem('experimental', 'sparse-read.min-gap-size',
648 651 default='65K',
649 652 )
650 653 coreconfigitem('experimental', 'treemanifest',
651 654 default=False,
652 655 )
653 656 coreconfigitem('experimental', 'update.atomic-file',
654 657 default=False,
655 658 )
656 659 coreconfigitem('experimental', 'sshpeer.advertise-v2',
657 660 default=False,
658 661 )
659 662 coreconfigitem('experimental', 'web.apiserver',
660 663 default=False,
661 664 )
662 665 coreconfigitem('experimental', 'web.api.http-v2',
663 666 default=False,
664 667 )
665 668 coreconfigitem('experimental', 'web.api.debugreflect',
666 669 default=False,
667 670 )
668 671 coreconfigitem('experimental', 'worker.wdir-get-thread-safe',
669 672 default=False,
670 673 )
671 674 coreconfigitem('experimental', 'xdiff',
672 675 default=False,
673 676 )
674 677 coreconfigitem('extensions', '.*',
675 678 default=None,
676 679 generic=True,
677 680 )
678 681 coreconfigitem('extdata', '.*',
679 682 default=None,
680 683 generic=True,
681 684 )
682 685 coreconfigitem('format', 'bookmarks-in-store',
683 686 default=False,
684 687 )
685 688 coreconfigitem('format', 'chunkcachesize',
686 689 default=None,
687 690 )
688 691 coreconfigitem('format', 'dotencode',
689 692 default=True,
690 693 )
691 694 coreconfigitem('format', 'generaldelta',
692 695 default=False,
693 696 )
694 697 coreconfigitem('format', 'manifestcachesize',
695 698 default=None,
696 699 )
697 700 coreconfigitem('format', 'maxchainlen',
698 701 default=dynamicdefault,
699 702 )
700 703 coreconfigitem('format', 'obsstore-version',
701 704 default=None,
702 705 )
703 706 coreconfigitem('format', 'sparse-revlog',
704 707 default=True,
705 708 )
706 709 coreconfigitem('format', 'revlog-compression',
707 710 default='zlib',
708 711 alias=[('experimental', 'format.compression')]
709 712 )
710 713 coreconfigitem('format', 'usefncache',
711 714 default=True,
712 715 )
713 716 coreconfigitem('format', 'usegeneraldelta',
714 717 default=True,
715 718 )
716 719 coreconfigitem('format', 'usestore',
717 720 default=True,
718 721 )
719 722 coreconfigitem('format', 'internal-phase',
720 723 default=False,
721 724 )
722 725 coreconfigitem('fsmonitor', 'warn_when_unused',
723 726 default=True,
724 727 )
725 728 coreconfigitem('fsmonitor', 'warn_update_file_count',
726 729 default=50000,
727 730 )
728 731 coreconfigitem('help', br'hidden-command\..*',
729 732 default=False,
730 733 generic=True,
731 734 )
732 735 coreconfigitem('help', br'hidden-topic\..*',
733 736 default=False,
734 737 generic=True,
735 738 )
736 739 coreconfigitem('hooks', '.*',
737 740 default=dynamicdefault,
738 741 generic=True,
739 742 )
740 743 coreconfigitem('hgweb-paths', '.*',
741 744 default=list,
742 745 generic=True,
743 746 )
744 747 coreconfigitem('hostfingerprints', '.*',
745 748 default=list,
746 749 generic=True,
747 750 )
748 751 coreconfigitem('hostsecurity', 'ciphers',
749 752 default=None,
750 753 )
751 754 coreconfigitem('hostsecurity', 'disabletls10warning',
752 755 default=False,
753 756 )
754 757 coreconfigitem('hostsecurity', 'minimumprotocol',
755 758 default=dynamicdefault,
756 759 )
757 760 coreconfigitem('hostsecurity', '.*:minimumprotocol$',
758 761 default=dynamicdefault,
759 762 generic=True,
760 763 )
761 764 coreconfigitem('hostsecurity', '.*:ciphers$',
762 765 default=dynamicdefault,
763 766 generic=True,
764 767 )
765 768 coreconfigitem('hostsecurity', '.*:fingerprints$',
766 769 default=list,
767 770 generic=True,
768 771 )
769 772 coreconfigitem('hostsecurity', '.*:verifycertsfile$',
770 773 default=None,
771 774 generic=True,
772 775 )
773 776
774 777 coreconfigitem('http_proxy', 'always',
775 778 default=False,
776 779 )
777 780 coreconfigitem('http_proxy', 'host',
778 781 default=None,
779 782 )
780 783 coreconfigitem('http_proxy', 'no',
781 784 default=list,
782 785 )
783 786 coreconfigitem('http_proxy', 'passwd',
784 787 default=None,
785 788 )
786 789 coreconfigitem('http_proxy', 'user',
787 790 default=None,
788 791 )
789 792
790 793 coreconfigitem('http', 'timeout',
791 794 default=None,
792 795 )
793 796
794 797 coreconfigitem('logtoprocess', 'commandexception',
795 798 default=None,
796 799 )
797 800 coreconfigitem('logtoprocess', 'commandfinish',
798 801 default=None,
799 802 )
800 803 coreconfigitem('logtoprocess', 'command',
801 804 default=None,
802 805 )
803 806 coreconfigitem('logtoprocess', 'develwarn',
804 807 default=None,
805 808 )
806 809 coreconfigitem('logtoprocess', 'uiblocked',
807 810 default=None,
808 811 )
809 812 coreconfigitem('merge', 'checkunknown',
810 813 default='abort',
811 814 )
812 815 coreconfigitem('merge', 'checkignored',
813 816 default='abort',
814 817 )
815 818 coreconfigitem('experimental', 'merge.checkpathconflicts',
816 819 default=False,
817 820 )
818 821 coreconfigitem('merge', 'followcopies',
819 822 default=True,
820 823 )
821 824 coreconfigitem('merge', 'on-failure',
822 825 default='continue',
823 826 )
824 827 coreconfigitem('merge', 'preferancestor',
825 828 default=lambda: ['*'],
826 829 )
827 830 coreconfigitem('merge', 'strict-capability-check',
828 831 default=False,
829 832 )
830 833 coreconfigitem('merge-tools', '.*',
831 834 default=None,
832 835 generic=True,
833 836 )
834 837 coreconfigitem('merge-tools', br'.*\.args$',
835 838 default="$local $base $other",
836 839 generic=True,
837 840 priority=-1,
838 841 )
839 842 coreconfigitem('merge-tools', br'.*\.binary$',
840 843 default=False,
841 844 generic=True,
842 845 priority=-1,
843 846 )
844 847 coreconfigitem('merge-tools', br'.*\.check$',
845 848 default=list,
846 849 generic=True,
847 850 priority=-1,
848 851 )
849 852 coreconfigitem('merge-tools', br'.*\.checkchanged$',
850 853 default=False,
851 854 generic=True,
852 855 priority=-1,
853 856 )
854 857 coreconfigitem('merge-tools', br'.*\.executable$',
855 858 default=dynamicdefault,
856 859 generic=True,
857 860 priority=-1,
858 861 )
859 862 coreconfigitem('merge-tools', br'.*\.fixeol$',
860 863 default=False,
861 864 generic=True,
862 865 priority=-1,
863 866 )
864 867 coreconfigitem('merge-tools', br'.*\.gui$',
865 868 default=False,
866 869 generic=True,
867 870 priority=-1,
868 871 )
869 872 coreconfigitem('merge-tools', br'.*\.mergemarkers$',
870 873 default='basic',
871 874 generic=True,
872 875 priority=-1,
873 876 )
874 877 coreconfigitem('merge-tools', br'.*\.mergemarkertemplate$',
875 878 default=dynamicdefault, # take from ui.mergemarkertemplate
876 879 generic=True,
877 880 priority=-1,
878 881 )
879 882 coreconfigitem('merge-tools', br'.*\.priority$',
880 883 default=0,
881 884 generic=True,
882 885 priority=-1,
883 886 )
884 887 coreconfigitem('merge-tools', br'.*\.premerge$',
885 888 default=dynamicdefault,
886 889 generic=True,
887 890 priority=-1,
888 891 )
889 892 coreconfigitem('merge-tools', br'.*\.symlink$',
890 893 default=False,
891 894 generic=True,
892 895 priority=-1,
893 896 )
894 897 coreconfigitem('pager', 'attend-.*',
895 898 default=dynamicdefault,
896 899 generic=True,
897 900 )
898 901 coreconfigitem('pager', 'ignore',
899 902 default=list,
900 903 )
901 904 coreconfigitem('pager', 'pager',
902 905 default=dynamicdefault,
903 906 )
904 907 coreconfigitem('patch', 'eol',
905 908 default='strict',
906 909 )
907 910 coreconfigitem('patch', 'fuzz',
908 911 default=2,
909 912 )
910 913 coreconfigitem('paths', 'default',
911 914 default=None,
912 915 )
913 916 coreconfigitem('paths', 'default-push',
914 917 default=None,
915 918 )
916 919 coreconfigitem('paths', '.*',
917 920 default=None,
918 921 generic=True,
919 922 )
920 923 coreconfigitem('phases', 'checksubrepos',
921 924 default='follow',
922 925 )
923 926 coreconfigitem('phases', 'new-commit',
924 927 default='draft',
925 928 )
926 929 coreconfigitem('phases', 'publish',
927 930 default=True,
928 931 )
929 932 coreconfigitem('profiling', 'enabled',
930 933 default=False,
931 934 )
932 935 coreconfigitem('profiling', 'format',
933 936 default='text',
934 937 )
935 938 coreconfigitem('profiling', 'freq',
936 939 default=1000,
937 940 )
938 941 coreconfigitem('profiling', 'limit',
939 942 default=30,
940 943 )
941 944 coreconfigitem('profiling', 'nested',
942 945 default=0,
943 946 )
944 947 coreconfigitem('profiling', 'output',
945 948 default=None,
946 949 )
947 950 coreconfigitem('profiling', 'showmax',
948 951 default=0.999,
949 952 )
950 953 coreconfigitem('profiling', 'showmin',
951 954 default=dynamicdefault,
952 955 )
953 956 coreconfigitem('profiling', 'showtime',
954 957 default=True,
955 958 )
956 959 coreconfigitem('profiling', 'sort',
957 960 default='inlinetime',
958 961 )
959 962 coreconfigitem('profiling', 'statformat',
960 963 default='hotpath',
961 964 )
962 965 coreconfigitem('profiling', 'time-track',
963 966 default=dynamicdefault,
964 967 )
965 968 coreconfigitem('profiling', 'type',
966 969 default='stat',
967 970 )
968 971 coreconfigitem('progress', 'assume-tty',
969 972 default=False,
970 973 )
971 974 coreconfigitem('progress', 'changedelay',
972 975 default=1,
973 976 )
974 977 coreconfigitem('progress', 'clear-complete',
975 978 default=True,
976 979 )
977 980 coreconfigitem('progress', 'debug',
978 981 default=False,
979 982 )
980 983 coreconfigitem('progress', 'delay',
981 984 default=3,
982 985 )
983 986 coreconfigitem('progress', 'disable',
984 987 default=False,
985 988 )
986 989 coreconfigitem('progress', 'estimateinterval',
987 990 default=60.0,
988 991 )
989 992 coreconfigitem('progress', 'format',
990 993 default=lambda: ['topic', 'bar', 'number', 'estimate'],
991 994 )
992 995 coreconfigitem('progress', 'refresh',
993 996 default=0.1,
994 997 )
995 998 coreconfigitem('progress', 'width',
996 999 default=dynamicdefault,
997 1000 )
998 1001 coreconfigitem('push', 'pushvars.server',
999 1002 default=False,
1000 1003 )
1001 1004 coreconfigitem('rewrite', 'backup-bundle',
1002 1005 default=True,
1003 1006 alias=[('ui', 'history-editing-backup')],
1004 1007 )
1005 1008 coreconfigitem('rewrite', 'update-timestamp',
1006 1009 default=False,
1007 1010 )
1008 1011 coreconfigitem('storage', 'new-repo-backend',
1009 1012 default='revlogv1',
1010 1013 )
1011 1014 coreconfigitem('storage', 'revlog.optimize-delta-parent-choice',
1012 1015 default=True,
1013 1016 alias=[('format', 'aggressivemergedeltas')],
1014 1017 )
1015 1018 coreconfigitem('storage', 'revlog.reuse-external-delta',
1016 1019 default=True,
1017 1020 )
1018 1021 coreconfigitem('storage', 'revlog.reuse-external-delta-parent',
1019 1022 default=None,
1020 1023 )
1021 1024 coreconfigitem('storage', 'revlog.zlib.level',
1022 1025 default=None,
1023 1026 )
1024 1027 coreconfigitem('storage', 'revlog.zstd.level',
1025 1028 default=None,
1026 1029 )
1027 1030 coreconfigitem('server', 'bookmarks-pushkey-compat',
1028 1031 default=True,
1029 1032 )
1030 1033 coreconfigitem('server', 'bundle1',
1031 1034 default=True,
1032 1035 )
1033 1036 coreconfigitem('server', 'bundle1gd',
1034 1037 default=None,
1035 1038 )
1036 1039 coreconfigitem('server', 'bundle1.pull',
1037 1040 default=None,
1038 1041 )
1039 1042 coreconfigitem('server', 'bundle1gd.pull',
1040 1043 default=None,
1041 1044 )
1042 1045 coreconfigitem('server', 'bundle1.push',
1043 1046 default=None,
1044 1047 )
1045 1048 coreconfigitem('server', 'bundle1gd.push',
1046 1049 default=None,
1047 1050 )
1048 1051 coreconfigitem('server', 'bundle2.stream',
1049 1052 default=True,
1050 1053 alias=[('experimental', 'bundle2.stream')]
1051 1054 )
1052 1055 coreconfigitem('server', 'compressionengines',
1053 1056 default=list,
1054 1057 )
1055 1058 coreconfigitem('server', 'concurrent-push-mode',
1056 1059 default='strict',
1057 1060 )
1058 1061 coreconfigitem('server', 'disablefullbundle',
1059 1062 default=False,
1060 1063 )
1061 1064 coreconfigitem('server', 'maxhttpheaderlen',
1062 1065 default=1024,
1063 1066 )
1064 1067 coreconfigitem('server', 'pullbundle',
1065 1068 default=False,
1066 1069 )
1067 1070 coreconfigitem('server', 'preferuncompressed',
1068 1071 default=False,
1069 1072 )
1070 1073 coreconfigitem('server', 'streamunbundle',
1071 1074 default=False,
1072 1075 )
1073 1076 coreconfigitem('server', 'uncompressed',
1074 1077 default=True,
1075 1078 )
1076 1079 coreconfigitem('server', 'uncompressedallowsecret',
1077 1080 default=False,
1078 1081 )
1079 1082 coreconfigitem('server', 'view',
1080 1083 default='served',
1081 1084 )
1082 1085 coreconfigitem('server', 'validate',
1083 1086 default=False,
1084 1087 )
1085 1088 coreconfigitem('server', 'zliblevel',
1086 1089 default=-1,
1087 1090 )
1088 1091 coreconfigitem('server', 'zstdlevel',
1089 1092 default=3,
1090 1093 )
1091 1094 coreconfigitem('share', 'pool',
1092 1095 default=None,
1093 1096 )
1094 1097 coreconfigitem('share', 'poolnaming',
1095 1098 default='identity',
1096 1099 )
1097 1100 coreconfigitem('shelve','maxbackups',
1098 1101 default=10,
1099 1102 )
1100 1103 coreconfigitem('smtp', 'host',
1101 1104 default=None,
1102 1105 )
1103 1106 coreconfigitem('smtp', 'local_hostname',
1104 1107 default=None,
1105 1108 )
1106 1109 coreconfigitem('smtp', 'password',
1107 1110 default=None,
1108 1111 )
1109 1112 coreconfigitem('smtp', 'port',
1110 1113 default=dynamicdefault,
1111 1114 )
1112 1115 coreconfigitem('smtp', 'tls',
1113 1116 default='none',
1114 1117 )
1115 1118 coreconfigitem('smtp', 'username',
1116 1119 default=None,
1117 1120 )
1118 1121 coreconfigitem('sparse', 'missingwarning',
1119 1122 default=True,
1120 1123 )
1121 1124 coreconfigitem('subrepos', 'allowed',
1122 1125 default=dynamicdefault, # to make backporting simpler
1123 1126 )
1124 1127 coreconfigitem('subrepos', 'hg:allowed',
1125 1128 default=dynamicdefault,
1126 1129 )
1127 1130 coreconfigitem('subrepos', 'git:allowed',
1128 1131 default=dynamicdefault,
1129 1132 )
1130 1133 coreconfigitem('subrepos', 'svn:allowed',
1131 1134 default=dynamicdefault,
1132 1135 )
1133 1136 coreconfigitem('templates', '.*',
1134 1137 default=None,
1135 1138 generic=True,
1136 1139 )
1137 1140 coreconfigitem('templateconfig', '.*',
1138 1141 default=dynamicdefault,
1139 1142 generic=True,
1140 1143 )
1141 1144 coreconfigitem('trusted', 'groups',
1142 1145 default=list,
1143 1146 )
1144 1147 coreconfigitem('trusted', 'users',
1145 1148 default=list,
1146 1149 )
1147 1150 coreconfigitem('ui', '_usedassubrepo',
1148 1151 default=False,
1149 1152 )
1150 1153 coreconfigitem('ui', 'allowemptycommit',
1151 1154 default=False,
1152 1155 )
1153 1156 coreconfigitem('ui', 'archivemeta',
1154 1157 default=True,
1155 1158 )
1156 1159 coreconfigitem('ui', 'askusername',
1157 1160 default=False,
1158 1161 )
1159 1162 coreconfigitem('ui', 'clonebundlefallback',
1160 1163 default=False,
1161 1164 )
1162 1165 coreconfigitem('ui', 'clonebundleprefers',
1163 1166 default=list,
1164 1167 )
1165 1168 coreconfigitem('ui', 'clonebundles',
1166 1169 default=True,
1167 1170 )
1168 1171 coreconfigitem('ui', 'color',
1169 1172 default='auto',
1170 1173 )
1171 1174 coreconfigitem('ui', 'commitsubrepos',
1172 1175 default=False,
1173 1176 )
1174 1177 coreconfigitem('ui', 'debug',
1175 1178 default=False,
1176 1179 )
1177 1180 coreconfigitem('ui', 'debugger',
1178 1181 default=None,
1179 1182 )
1180 1183 coreconfigitem('ui', 'editor',
1181 1184 default=dynamicdefault,
1182 1185 )
1183 1186 coreconfigitem('ui', 'fallbackencoding',
1184 1187 default=None,
1185 1188 )
1186 1189 coreconfigitem('ui', 'forcecwd',
1187 1190 default=None,
1188 1191 )
1189 1192 coreconfigitem('ui', 'forcemerge',
1190 1193 default=None,
1191 1194 )
1192 1195 coreconfigitem('ui', 'formatdebug',
1193 1196 default=False,
1194 1197 )
1195 1198 coreconfigitem('ui', 'formatjson',
1196 1199 default=False,
1197 1200 )
1198 1201 coreconfigitem('ui', 'formatted',
1199 1202 default=None,
1200 1203 )
1201 1204 coreconfigitem('ui', 'graphnodetemplate',
1202 1205 default=None,
1203 1206 )
1204 1207 coreconfigitem('ui', 'interactive',
1205 1208 default=None,
1206 1209 )
1207 1210 coreconfigitem('ui', 'interface',
1208 1211 default=None,
1209 1212 )
1210 1213 coreconfigitem('ui', 'interface.chunkselector',
1211 1214 default=None,
1212 1215 )
1213 1216 coreconfigitem('ui', 'large-file-limit',
1214 1217 default=10000000,
1215 1218 )
1216 1219 coreconfigitem('ui', 'logblockedtimes',
1217 1220 default=False,
1218 1221 )
1219 1222 coreconfigitem('ui', 'logtemplate',
1220 1223 default=None,
1221 1224 )
1222 1225 coreconfigitem('ui', 'merge',
1223 1226 default=None,
1224 1227 )
1225 1228 coreconfigitem('ui', 'mergemarkers',
1226 1229 default='basic',
1227 1230 )
1228 1231 coreconfigitem('ui', 'mergemarkertemplate',
1229 1232 default=('{node|short} '
1230 1233 '{ifeq(tags, "tip", "", '
1231 1234 'ifeq(tags, "", "", "{tags} "))}'
1232 1235 '{if(bookmarks, "{bookmarks} ")}'
1233 1236 '{ifeq(branch, "default", "", "{branch} ")}'
1234 1237 '- {author|user}: {desc|firstline}')
1235 1238 )
1236 1239 coreconfigitem('ui', 'message-output',
1237 1240 default='stdio',
1238 1241 )
1239 1242 coreconfigitem('ui', 'nontty',
1240 1243 default=False,
1241 1244 )
1242 1245 coreconfigitem('ui', 'origbackuppath',
1243 1246 default=None,
1244 1247 )
1245 1248 coreconfigitem('ui', 'paginate',
1246 1249 default=True,
1247 1250 )
1248 1251 coreconfigitem('ui', 'patch',
1249 1252 default=None,
1250 1253 )
1251 1254 coreconfigitem('ui', 'pre-merge-tool-output-template',
1252 1255 default=None,
1253 1256 )
1254 1257 coreconfigitem('ui', 'portablefilenames',
1255 1258 default='warn',
1256 1259 )
1257 1260 coreconfigitem('ui', 'promptecho',
1258 1261 default=False,
1259 1262 )
1260 1263 coreconfigitem('ui', 'quiet',
1261 1264 default=False,
1262 1265 )
1263 1266 coreconfigitem('ui', 'quietbookmarkmove',
1264 1267 default=False,
1265 1268 )
1266 1269 coreconfigitem('ui', 'relative-paths',
1267 1270 default='legacy',
1268 1271 )
1269 1272 coreconfigitem('ui', 'remotecmd',
1270 1273 default='hg',
1271 1274 )
1272 1275 coreconfigitem('ui', 'report_untrusted',
1273 1276 default=True,
1274 1277 )
1275 1278 coreconfigitem('ui', 'rollback',
1276 1279 default=True,
1277 1280 )
1278 1281 coreconfigitem('ui', 'signal-safe-lock',
1279 1282 default=True,
1280 1283 )
1281 1284 coreconfigitem('ui', 'slash',
1282 1285 default=False,
1283 1286 )
1284 1287 coreconfigitem('ui', 'ssh',
1285 1288 default='ssh',
1286 1289 )
1287 1290 coreconfigitem('ui', 'ssherrorhint',
1288 1291 default=None,
1289 1292 )
1290 1293 coreconfigitem('ui', 'statuscopies',
1291 1294 default=False,
1292 1295 )
1293 1296 coreconfigitem('ui', 'strict',
1294 1297 default=False,
1295 1298 )
1296 1299 coreconfigitem('ui', 'style',
1297 1300 default='',
1298 1301 )
1299 1302 coreconfigitem('ui', 'supportcontact',
1300 1303 default=None,
1301 1304 )
1302 1305 coreconfigitem('ui', 'textwidth',
1303 1306 default=78,
1304 1307 )
1305 1308 coreconfigitem('ui', 'timeout',
1306 1309 default='600',
1307 1310 )
1308 1311 coreconfigitem('ui', 'timeout.warn',
1309 1312 default=0,
1310 1313 )
1311 1314 coreconfigitem('ui', 'traceback',
1312 1315 default=False,
1313 1316 )
1314 1317 coreconfigitem('ui', 'tweakdefaults',
1315 1318 default=False,
1316 1319 )
1317 1320 coreconfigitem('ui', 'username',
1318 1321 alias=[('ui', 'user')]
1319 1322 )
1320 1323 coreconfigitem('ui', 'verbose',
1321 1324 default=False,
1322 1325 )
1323 1326 coreconfigitem('verify', 'skipflags',
1324 1327 default=None,
1325 1328 )
1326 1329 coreconfigitem('web', 'allowbz2',
1327 1330 default=False,
1328 1331 )
1329 1332 coreconfigitem('web', 'allowgz',
1330 1333 default=False,
1331 1334 )
1332 1335 coreconfigitem('web', 'allow-pull',
1333 1336 alias=[('web', 'allowpull')],
1334 1337 default=True,
1335 1338 )
1336 1339 coreconfigitem('web', 'allow-push',
1337 1340 alias=[('web', 'allow_push')],
1338 1341 default=list,
1339 1342 )
1340 1343 coreconfigitem('web', 'allowzip',
1341 1344 default=False,
1342 1345 )
1343 1346 coreconfigitem('web', 'archivesubrepos',
1344 1347 default=False,
1345 1348 )
1346 1349 coreconfigitem('web', 'cache',
1347 1350 default=True,
1348 1351 )
1349 1352 coreconfigitem('web', 'comparisoncontext',
1350 1353 default=5,
1351 1354 )
1352 1355 coreconfigitem('web', 'contact',
1353 1356 default=None,
1354 1357 )
1355 1358 coreconfigitem('web', 'deny_push',
1356 1359 default=list,
1357 1360 )
1358 1361 coreconfigitem('web', 'guessmime',
1359 1362 default=False,
1360 1363 )
1361 1364 coreconfigitem('web', 'hidden',
1362 1365 default=False,
1363 1366 )
1364 1367 coreconfigitem('web', 'labels',
1365 1368 default=list,
1366 1369 )
1367 1370 coreconfigitem('web', 'logoimg',
1368 1371 default='hglogo.png',
1369 1372 )
1370 1373 coreconfigitem('web', 'logourl',
1371 1374 default='https://mercurial-scm.org/',
1372 1375 )
1373 1376 coreconfigitem('web', 'accesslog',
1374 1377 default='-',
1375 1378 )
1376 1379 coreconfigitem('web', 'address',
1377 1380 default='',
1378 1381 )
1379 1382 coreconfigitem('web', 'allow-archive',
1380 1383 alias=[('web', 'allow_archive')],
1381 1384 default=list,
1382 1385 )
1383 1386 coreconfigitem('web', 'allow_read',
1384 1387 default=list,
1385 1388 )
1386 1389 coreconfigitem('web', 'baseurl',
1387 1390 default=None,
1388 1391 )
1389 1392 coreconfigitem('web', 'cacerts',
1390 1393 default=None,
1391 1394 )
1392 1395 coreconfigitem('web', 'certificate',
1393 1396 default=None,
1394 1397 )
1395 1398 coreconfigitem('web', 'collapse',
1396 1399 default=False,
1397 1400 )
1398 1401 coreconfigitem('web', 'csp',
1399 1402 default=None,
1400 1403 )
1401 1404 coreconfigitem('web', 'deny_read',
1402 1405 default=list,
1403 1406 )
1404 1407 coreconfigitem('web', 'descend',
1405 1408 default=True,
1406 1409 )
1407 1410 coreconfigitem('web', 'description',
1408 1411 default="",
1409 1412 )
1410 1413 coreconfigitem('web', 'encoding',
1411 1414 default=lambda: encoding.encoding,
1412 1415 )
1413 1416 coreconfigitem('web', 'errorlog',
1414 1417 default='-',
1415 1418 )
1416 1419 coreconfigitem('web', 'ipv6',
1417 1420 default=False,
1418 1421 )
1419 1422 coreconfigitem('web', 'maxchanges',
1420 1423 default=10,
1421 1424 )
1422 1425 coreconfigitem('web', 'maxfiles',
1423 1426 default=10,
1424 1427 )
1425 1428 coreconfigitem('web', 'maxshortchanges',
1426 1429 default=60,
1427 1430 )
1428 1431 coreconfigitem('web', 'motd',
1429 1432 default='',
1430 1433 )
1431 1434 coreconfigitem('web', 'name',
1432 1435 default=dynamicdefault,
1433 1436 )
1434 1437 coreconfigitem('web', 'port',
1435 1438 default=8000,
1436 1439 )
1437 1440 coreconfigitem('web', 'prefix',
1438 1441 default='',
1439 1442 )
1440 1443 coreconfigitem('web', 'push_ssl',
1441 1444 default=True,
1442 1445 )
1443 1446 coreconfigitem('web', 'refreshinterval',
1444 1447 default=20,
1445 1448 )
1446 1449 coreconfigitem('web', 'server-header',
1447 1450 default=None,
1448 1451 )
1449 1452 coreconfigitem('web', 'static',
1450 1453 default=None,
1451 1454 )
1452 1455 coreconfigitem('web', 'staticurl',
1453 1456 default=None,
1454 1457 )
1455 1458 coreconfigitem('web', 'stripes',
1456 1459 default=1,
1457 1460 )
1458 1461 coreconfigitem('web', 'style',
1459 1462 default='paper',
1460 1463 )
1461 1464 coreconfigitem('web', 'templates',
1462 1465 default=None,
1463 1466 )
1464 1467 coreconfigitem('web', 'view',
1465 1468 default='served',
1466 1469 )
1467 1470 coreconfigitem('worker', 'backgroundclose',
1468 1471 default=dynamicdefault,
1469 1472 )
1470 1473 # Windows defaults to a limit of 512 open files. A buffer of 128
1471 1474 # should give us enough headway.
1472 1475 coreconfigitem('worker', 'backgroundclosemaxqueue',
1473 1476 default=384,
1474 1477 )
1475 1478 coreconfigitem('worker', 'backgroundcloseminfilecount',
1476 1479 default=2048,
1477 1480 )
1478 1481 coreconfigitem('worker', 'backgroundclosethreadcount',
1479 1482 default=4,
1480 1483 )
1481 1484 coreconfigitem('worker', 'enabled',
1482 1485 default=True,
1483 1486 )
1484 1487 coreconfigitem('worker', 'numcpus',
1485 1488 default=None,
1486 1489 )
1487 1490
1488 1491 # Rebase related configuration moved to core because other extension are doing
1489 1492 # strange things. For example, shelve import the extensions to reuse some bit
1490 1493 # without formally loading it.
1491 1494 coreconfigitem('commands', 'rebase.requiredest',
1492 1495 default=False,
1493 1496 )
1494 1497 coreconfigitem('experimental', 'rebaseskipobsolete',
1495 1498 default=True,
1496 1499 )
1497 1500 coreconfigitem('rebase', 'singletransaction',
1498 1501 default=False,
1499 1502 )
1500 1503 coreconfigitem('rebase', 'experimental.inmemory',
1501 1504 default=False,
1502 1505 )
@@ -1,456 +1,458 b''
1 1 # setdiscovery.py - improved discovery of common nodeset for mercurial
2 2 #
3 3 # Copyright 2010 Benoit Boissinot <bboissin@gmail.com>
4 4 # and Peter Arrenbrecht <peter@arrenbrecht.ch>
5 5 #
6 6 # This software may be used and distributed according to the terms of the
7 7 # GNU General Public License version 2 or any later version.
8 8 """
9 9 Algorithm works in the following way. You have two repository: local and
10 10 remote. They both contains a DAG of changelists.
11 11
12 12 The goal of the discovery protocol is to find one set of node *common*,
13 13 the set of nodes shared by local and remote.
14 14
15 15 One of the issue with the original protocol was latency, it could
16 16 potentially require lots of roundtrips to discover that the local repo was a
17 17 subset of remote (which is a very common case, you usually have few changes
18 18 compared to upstream, while upstream probably had lots of development).
19 19
20 20 The new protocol only requires one interface for the remote repo: `known()`,
21 21 which given a set of changelists tells you if they are present in the DAG.
22 22
23 23 The algorithm then works as follow:
24 24
25 25 - We will be using three sets, `common`, `missing`, `unknown`. Originally
26 26 all nodes are in `unknown`.
27 27 - Take a sample from `unknown`, call `remote.known(sample)`
28 28 - For each node that remote knows, move it and all its ancestors to `common`
29 29 - For each node that remote doesn't know, move it and all its descendants
30 30 to `missing`
31 31 - Iterate until `unknown` is empty
32 32
33 33 There are a couple optimizations, first is instead of starting with a random
34 34 sample of missing, start by sending all heads, in the case where the local
35 35 repo is a subset, you computed the answer in one round trip.
36 36
37 37 Then you can do something similar to the bisecting strategy used when
38 38 finding faulty changesets. Instead of random samples, you can try picking
39 39 nodes that will maximize the number of nodes that will be
40 40 classified with it (since all ancestors or descendants will be marked as well).
41 41 """
42 42
43 43 from __future__ import absolute_import
44 44
45 45 import collections
46 46 import random
47 47
48 48 from .i18n import _
49 49 from .node import (
50 50 nullid,
51 51 nullrev,
52 52 )
53 53 from . import (
54 54 error,
55 55 util,
56 56 )
57 57
58 58 def _updatesample(revs, heads, sample, parentfn, quicksamplesize=0):
59 59 """update an existing sample to match the expected size
60 60
61 61 The sample is updated with revs exponentially distant from each head of the
62 62 <revs> set. (H~1, H~2, H~4, H~8, etc).
63 63
64 64 If a target size is specified, the sampling will stop once this size is
65 65 reached. Otherwise sampling will happen until roots of the <revs> set are
66 66 reached.
67 67
68 68 :revs: set of revs we want to discover (if None, assume the whole dag)
69 69 :heads: set of DAG head revs
70 70 :sample: a sample to update
71 71 :parentfn: a callable to resolve parents for a revision
72 72 :quicksamplesize: optional target size of the sample"""
73 73 dist = {}
74 74 visit = collections.deque(heads)
75 75 seen = set()
76 76 factor = 1
77 77 while visit:
78 78 curr = visit.popleft()
79 79 if curr in seen:
80 80 continue
81 81 d = dist.setdefault(curr, 1)
82 82 if d > factor:
83 83 factor *= 2
84 84 if d == factor:
85 85 sample.add(curr)
86 86 if quicksamplesize and (len(sample) >= quicksamplesize):
87 87 return
88 88 seen.add(curr)
89 89
90 90 for p in parentfn(curr):
91 91 if p != nullrev and (not revs or p in revs):
92 92 dist.setdefault(p, d + 1)
93 93 visit.append(p)
94 94
95 95 def _limitsample(sample, desiredlen, randomize=True):
96 96 """return a random subset of sample of at most desiredlen item.
97 97
98 98 If randomize is False, though, a deterministic subset is returned.
99 99 This is meant for integration tests.
100 100 """
101 101 if len(sample) <= desiredlen:
102 102 return sample
103 103 if randomize:
104 104 return set(random.sample(sample, desiredlen))
105 105 sample = list(sample)
106 106 sample.sort()
107 107 return set(sample[:desiredlen])
108 108
109 109 class partialdiscovery(object):
110 110 """an object representing ongoing discovery
111 111
112 112 Feed with data from the remote repository, this object keep track of the
113 113 current set of changeset in various states:
114 114
115 115 - common: revs also known remotely
116 116 - undecided: revs we don't have information on yet
117 117 - missing: revs missing remotely
118 118 (all tracked revisions are known locally)
119 119 """
120 120
121 121 def __init__(self, repo, targetheads, respectsize, randomize=True):
122 122 self._repo = repo
123 123 self._targetheads = targetheads
124 124 self._common = repo.changelog.incrementalmissingrevs()
125 125 self._undecided = None
126 126 self.missing = set()
127 127 self._childrenmap = None
128 128 self._respectsize = respectsize
129 129 self.randomize = randomize
130 130
131 131 def addcommons(self, commons):
132 132 """register nodes known as common"""
133 133 self._common.addbases(commons)
134 134 if self._undecided is not None:
135 135 self._common.removeancestorsfrom(self._undecided)
136 136
137 137 def addmissings(self, missings):
138 138 """register some nodes as missing"""
139 139 newmissing = self._repo.revs('%ld::%ld', missings, self.undecided)
140 140 if newmissing:
141 141 self.missing.update(newmissing)
142 142 self.undecided.difference_update(newmissing)
143 143
144 144 def addinfo(self, sample):
145 145 """consume an iterable of (rev, known) tuples"""
146 146 common = set()
147 147 missing = set()
148 148 for rev, known in sample:
149 149 if known:
150 150 common.add(rev)
151 151 else:
152 152 missing.add(rev)
153 153 if common:
154 154 self.addcommons(common)
155 155 if missing:
156 156 self.addmissings(missing)
157 157
158 158 def hasinfo(self):
159 159 """return True is we have any clue about the remote state"""
160 160 return self._common.hasbases()
161 161
162 162 def iscomplete(self):
163 163 """True if all the necessary data have been gathered"""
164 164 return self._undecided is not None and not self._undecided
165 165
166 166 @property
167 167 def undecided(self):
168 168 if self._undecided is not None:
169 169 return self._undecided
170 170 self._undecided = set(self._common.missingancestors(self._targetheads))
171 171 return self._undecided
172 172
173 173 def stats(self):
174 174 return {
175 175 'undecided': len(self.undecided),
176 176 }
177 177
178 178 def commonheads(self):
179 179 """the heads of the known common set"""
180 180 # heads(common) == heads(common.bases) since common represents
181 181 # common.bases and all its ancestors
182 182 return self._common.basesheads()
183 183
184 184 def _parentsgetter(self):
185 185 getrev = self._repo.changelog.index.__getitem__
186 186 def getparents(r):
187 187 return getrev(r)[5:7]
188 188 return getparents
189 189
190 190 def _childrengetter(self):
191 191
192 192 if self._childrenmap is not None:
193 193 # During discovery, the `undecided` set keep shrinking.
194 194 # Therefore, the map computed for an iteration N will be
195 195 # valid for iteration N+1. Instead of computing the same
196 196 # data over and over we cached it the first time.
197 197 return self._childrenmap.__getitem__
198 198
199 199 # _updatesample() essentially does interaction over revisions to look
200 200 # up their children. This lookup is expensive and doing it in a loop is
201 201 # quadratic. We precompute the children for all relevant revisions and
202 202 # make the lookup in _updatesample() a simple dict lookup.
203 203 self._childrenmap = children = {}
204 204
205 205 parentrevs = self._parentsgetter()
206 206 revs = self.undecided
207 207
208 208 for rev in sorted(revs):
209 209 # Always ensure revision has an entry so we don't need to worry
210 210 # about missing keys.
211 211 children[rev] = []
212 212 for prev in parentrevs(rev):
213 213 if prev == nullrev:
214 214 continue
215 215 c = children.get(prev)
216 216 if c is not None:
217 217 c.append(rev)
218 218 return children.__getitem__
219 219
220 220 def takequicksample(self, headrevs, size):
221 221 """takes a quick sample of size <size>
222 222
223 223 It is meant for initial sampling and focuses on querying heads and close
224 224 ancestors of heads.
225 225
226 226 :headrevs: set of head revisions in local DAG to consider
227 227 :size: the maximum size of the sample"""
228 228 revs = self.undecided
229 229 if len(revs) <= size:
230 230 return list(revs)
231 231 sample = set(self._repo.revs('heads(%ld)', revs))
232 232
233 233 if len(sample) >= size:
234 234 return _limitsample(sample, size, randomize=self.randomize)
235 235
236 236 _updatesample(None, headrevs, sample, self._parentsgetter(),
237 237 quicksamplesize=size)
238 238 return sample
239 239
240 240 def takefullsample(self, headrevs, size):
241 241 revs = self.undecided
242 242 if len(revs) <= size:
243 243 return list(revs)
244 244 repo = self._repo
245 245 sample = set(repo.revs('heads(%ld)', revs))
246 246 parentrevs = self._parentsgetter()
247 247
248 248 # update from heads
249 249 revsheads = sample.copy()
250 250 _updatesample(revs, revsheads, sample, parentrevs)
251 251
252 252 # update from roots
253 253 revsroots = set(repo.revs('roots(%ld)', revs))
254 254 childrenrevs = self._childrengetter()
255 255 _updatesample(revs, revsroots, sample, childrenrevs)
256 256 assert sample
257 257
258 258 if not self._respectsize:
259 259 size = max(size, min(len(revsroots), len(revsheads)))
260 260
261 261 sample = _limitsample(sample, size, randomize=self.randomize)
262 262 if len(sample) < size:
263 263 more = size - len(sample)
264 264 takefrom = list(revs - sample)
265 265 if self.randomize:
266 266 sample.update(random.sample(takefrom, more))
267 267 else:
268 268 takefrom.sort()
269 269 sample.update(takefrom[:more])
270 270 return sample
271 271
272 272 def findcommonheads(ui, local, remote,
273 273 initialsamplesize=100,
274 274 fullsamplesize=200,
275 275 abortwhenunrelated=True,
276 276 ancestorsof=None,
277 277 samplegrowth=1.05):
278 278 '''Return a tuple (common, anyincoming, remoteheads) used to identify
279 279 missing nodes from or in remote.
280 280 '''
281 281 start = util.timer()
282 282
283 283 roundtrips = 0
284 284 cl = local.changelog
285 285 clnode = cl.node
286 286 clrev = cl.rev
287 287
288 288 if ancestorsof is not None:
289 289 ownheads = [clrev(n) for n in ancestorsof]
290 290 else:
291 291 ownheads = [rev for rev in cl.headrevs() if rev != nullrev]
292 292
293 293 # early exit if we know all the specified remote heads already
294 294 ui.debug("query 1; heads\n")
295 295 roundtrips += 1
296 296 # We also ask remote about all the local heads. That set can be arbitrarily
297 297 # large, so we used to limit it size to `initialsamplesize`. We no longer
298 298 # do as it proved counter productive. The skipped heads could lead to a
299 299 # large "undecided" set, slower to be clarified than if we asked the
300 300 # question for all heads right away.
301 301 #
302 302 # We are already fetching all server heads using the `heads` commands,
303 303 # sending a equivalent number of heads the other way should not have a
304 304 # significant impact. In addition, it is very likely that we are going to
305 305 # have to issue "known" request for an equivalent amount of revisions in
306 306 # order to decide if theses heads are common or missing.
307 307 #
308 308 # find a detailled analysis below.
309 309 #
310 310 # Case A: local and server both has few heads
311 311 #
312 312 # Ownheads is below initialsamplesize, limit would not have any effect.
313 313 #
314 314 # Case B: local has few heads and server has many
315 315 #
316 316 # Ownheads is below initialsamplesize, limit would not have any effect.
317 317 #
318 318 # Case C: local and server both has many heads
319 319 #
320 320 # We now transfert some more data, but not significantly more than is
321 321 # already transfered to carry the server heads.
322 322 #
323 323 # Case D: local has many heads, server has few
324 324 #
325 325 # D.1 local heads are mostly known remotely
326 326 #
327 327 # All the known head will have be part of a `known` request at some
328 328 # point for the discovery to finish. Sending them all earlier is
329 329 # actually helping.
330 330 #
331 331 # (This case is fairly unlikely, it requires the numerous heads to all
332 332 # be merged server side in only a few heads)
333 333 #
334 334 # D.2 local heads are mostly missing remotely
335 335 #
336 336 # To determine that the heads are missing, we'll have to issue `known`
337 337 # request for them or one of their ancestors. This amount of `known`
338 338 # request will likely be in the same order of magnitude than the amount
339 339 # of local heads.
340 340 #
341 341 # The only case where we can be more efficient using `known` request on
342 342 # ancestors are case were all the "missing" local heads are based on a
343 343 # few changeset, also "missing". This means we would have a "complex"
344 344 # graph (with many heads) attached to, but very independant to a the
345 345 # "simple" graph on the server. This is a fairly usual case and have
346 346 # not been met in the wild so far.
347 347 if remote.limitedarguments:
348 348 sample = _limitsample(ownheads, initialsamplesize)
349 349 # indices between sample and externalized version must match
350 350 sample = list(sample)
351 351 else:
352 352 sample = ownheads
353 353
354 354 with remote.commandexecutor() as e:
355 355 fheads = e.callcommand('heads', {})
356 356 fknown = e.callcommand('known', {
357 357 'nodes': [clnode(r) for r in sample],
358 358 })
359 359
360 360 srvheadhashes, yesno = fheads.result(), fknown.result()
361 361
362 362 if cl.tip() == nullid:
363 363 if srvheadhashes != [nullid]:
364 364 return [nullid], True, srvheadhashes
365 365 return [nullid], False, []
366 366
367 367 # start actual discovery (we note this before the next "if" for
368 368 # compatibility reasons)
369 369 ui.status(_("searching for changes\n"))
370 370
371 371 knownsrvheads = [] # revnos of remote heads that are known locally
372 372 for node in srvheadhashes:
373 373 if node == nullid:
374 374 continue
375 375
376 376 try:
377 377 knownsrvheads.append(clrev(node))
378 378 # Catches unknown and filtered nodes.
379 379 except error.LookupError:
380 380 continue
381 381
382 382 if len(knownsrvheads) == len(srvheadhashes):
383 383 ui.debug("all remote heads known locally\n")
384 384 return srvheadhashes, False, srvheadhashes
385 385
386 386 if len(sample) == len(ownheads) and all(yesno):
387 387 ui.note(_("all local heads known remotely\n"))
388 388 ownheadhashes = [clnode(r) for r in ownheads]
389 389 return ownheadhashes, True, srvheadhashes
390 390
391 391 # full blown discovery
392 392
393 disco = partialdiscovery(local, ownheads, remote.limitedarguments)
393 randomize = ui.configbool('devel', 'discovery.randomize')
394 disco = partialdiscovery(local, ownheads, remote.limitedarguments,
395 randomize=randomize)
394 396 # treat remote heads (and maybe own heads) as a first implicit sample
395 397 # response
396 398 disco.addcommons(knownsrvheads)
397 399 disco.addinfo(zip(sample, yesno))
398 400
399 401 full = False
400 402 progress = ui.makeprogress(_('searching'), unit=_('queries'))
401 403 while not disco.iscomplete():
402 404
403 405 if full or disco.hasinfo():
404 406 if full:
405 407 ui.note(_("sampling from both directions\n"))
406 408 else:
407 409 ui.debug("taking initial sample\n")
408 410 samplefunc = disco.takefullsample
409 411 targetsize = fullsamplesize
410 412 if not remote.limitedarguments:
411 413 fullsamplesize = int(fullsamplesize * samplegrowth)
412 414 else:
413 415 # use even cheaper initial sample
414 416 ui.debug("taking quick initial sample\n")
415 417 samplefunc = disco.takequicksample
416 418 targetsize = initialsamplesize
417 419 sample = samplefunc(ownheads, targetsize)
418 420
419 421 roundtrips += 1
420 422 progress.update(roundtrips)
421 423 stats = disco.stats()
422 424 ui.debug("query %i; still undecided: %i, sample size is: %i\n"
423 425 % (roundtrips, stats['undecided'], len(sample)))
424 426
425 427 # indices between sample and externalized version must match
426 428 sample = list(sample)
427 429
428 430 with remote.commandexecutor() as e:
429 431 yesno = e.callcommand('known', {
430 432 'nodes': [clnode(r) for r in sample],
431 433 }).result()
432 434
433 435 full = True
434 436
435 437 disco.addinfo(zip(sample, yesno))
436 438
437 439 result = disco.commonheads()
438 440 elapsed = util.timer() - start
439 441 progress.complete()
440 442 ui.debug("%d total queries in %.4fs\n" % (roundtrips, elapsed))
441 443 msg = ('found %d common and %d unknown server heads,'
442 444 ' %d roundtrips in %.4fs\n')
443 445 missing = set(result) - set(knownsrvheads)
444 446 ui.log('discovery', msg, len(result), len(missing), roundtrips,
445 447 elapsed)
446 448
447 449 if not result and srvheadhashes != [nullid]:
448 450 if abortwhenunrelated:
449 451 raise error.Abort(_("repository is unrelated"))
450 452 else:
451 453 ui.warn(_("warning: repository is unrelated\n"))
452 454 return ({nullid}, True, srvheadhashes,)
453 455
454 456 anyincoming = (srvheadhashes != [nullid])
455 457 result = {clnode(r) for r in result}
456 458 return result, anyincoming, srvheadhashes
@@ -1,1120 +1,1114 b''
1 1
2 2 Function to test discovery between two repos in both directions, using both the local shortcut
3 3 (which is currently not activated by default) and the full remotable protocol:
4 4
5 5 $ testdesc() { # revs_a, revs_b, dagdesc
6 6 > if [ -d foo ]; then rm -rf foo; fi
7 7 > hg init foo
8 8 > cd foo
9 9 > hg debugbuilddag "$3"
10 10 > hg clone . a $1 --quiet
11 11 > hg clone . b $2 --quiet
12 12 > echo
13 13 > echo "% -- a -> b tree"
14 14 > hg -R a debugdiscovery b --verbose --old
15 15 > echo
16 16 > echo "% -- a -> b set"
17 17 > hg -R a debugdiscovery b --verbose --debug --config progress.debug=true
18 18 > echo
19 19 > echo "% -- a -> b set (tip only)"
20 20 > hg -R a debugdiscovery b --verbose --debug --config progress.debug=true --rev tip
21 21 > echo
22 22 > echo "% -- b -> a tree"
23 23 > hg -R b debugdiscovery a --verbose --old
24 24 > echo
25 25 > echo "% -- b -> a set"
26 26 > hg -R b debugdiscovery a --verbose --debug --config progress.debug=true
27 27 > echo
28 28 > echo "% -- b -> a set (tip only)"
29 29 > hg -R b debugdiscovery a --verbose --debug --config progress.debug=true --rev tip
30 30 > cd ..
31 31 > }
32 32
33 33
34 34 Small superset:
35 35
36 36 $ testdesc '-ra1 -ra2' '-rb1 -rb2 -rb3' '
37 37 > +2:f +1:a1:b1
38 38 > <f +4 :a2
39 39 > +5 :b2
40 40 > <f +3 :b3'
41 41
42 42 % -- a -> b tree
43 43 comparing with b
44 44 searching for changes
45 45 unpruned common: 01241442b3c2 66f7d451a68b b5714e113bc0
46 46 elapsed time: * seconds (glob)
47 47 heads summary:
48 48 total common heads: 2
49 49 also local heads: 2
50 50 also remote heads: 1
51 51 both: 1
52 52 local heads: 2
53 53 common: 2
54 54 missing: 0
55 55 remote heads: 3
56 56 common: 1
57 57 unknown: 2
58 58 local changesets: 7
59 59 common: 7
60 60 missing: 0
61 61 common heads: 01241442b3c2 b5714e113bc0
62 62
63 63 % -- a -> b set
64 64 comparing with b
65 65 query 1; heads
66 66 searching for changes
67 67 all local heads known remotely
68 68 elapsed time: * seconds (glob)
69 69 heads summary:
70 70 total common heads: 2
71 71 also local heads: 2
72 72 also remote heads: 1
73 73 both: 1
74 74 local heads: 2
75 75 common: 2
76 76 missing: 0
77 77 remote heads: 3
78 78 common: 1
79 79 unknown: 2
80 80 local changesets: 7
81 81 common: 7
82 82 missing: 0
83 83 common heads: 01241442b3c2 b5714e113bc0
84 84
85 85 % -- a -> b set (tip only)
86 86 comparing with b
87 87 query 1; heads
88 88 searching for changes
89 89 all local heads known remotely
90 90 elapsed time: * seconds (glob)
91 91 heads summary:
92 92 total common heads: 1
93 93 also local heads: 1
94 94 also remote heads: 0
95 95 both: 0
96 96 local heads: 2
97 97 common: 1
98 98 missing: 1
99 99 remote heads: 3
100 100 common: 0
101 101 unknown: 3
102 102 local changesets: 7
103 103 common: 6
104 104 missing: 1
105 105 common heads: b5714e113bc0
106 106
107 107 % -- b -> a tree
108 108 comparing with a
109 109 searching for changes
110 110 unpruned common: 01241442b3c2 b5714e113bc0
111 111 elapsed time: * seconds (glob)
112 112 heads summary:
113 113 total common heads: 2
114 114 also local heads: 1
115 115 also remote heads: 2
116 116 both: 1
117 117 local heads: 3
118 118 common: 1
119 119 missing: 2
120 120 remote heads: 2
121 121 common: 2
122 122 unknown: 0
123 123 local changesets: 15
124 124 common: 7
125 125 missing: 8
126 126 common heads: 01241442b3c2 b5714e113bc0
127 127
128 128 % -- b -> a set
129 129 comparing with a
130 130 query 1; heads
131 131 searching for changes
132 132 all remote heads known locally
133 133 elapsed time: * seconds (glob)
134 134 heads summary:
135 135 total common heads: 2
136 136 also local heads: 1
137 137 also remote heads: 2
138 138 both: 1
139 139 local heads: 3
140 140 common: 1
141 141 missing: 2
142 142 remote heads: 2
143 143 common: 2
144 144 unknown: 0
145 145 local changesets: 15
146 146 common: 7
147 147 missing: 8
148 148 common heads: 01241442b3c2 b5714e113bc0
149 149
150 150 % -- b -> a set (tip only)
151 151 comparing with a
152 152 query 1; heads
153 153 searching for changes
154 154 all remote heads known locally
155 155 elapsed time: * seconds (glob)
156 156 heads summary:
157 157 total common heads: 2
158 158 also local heads: 1
159 159 also remote heads: 2
160 160 both: 1
161 161 local heads: 3
162 162 common: 1
163 163 missing: 2
164 164 remote heads: 2
165 165 common: 2
166 166 unknown: 0
167 167 local changesets: 15
168 168 common: 7
169 169 missing: 8
170 170 common heads: 01241442b3c2 b5714e113bc0
171 171
172 172
173 173 Many new:
174 174
175 175 $ testdesc '-ra1 -ra2' '-rb' '
176 176 > +2:f +3:a1 +3:b
177 177 > <f +30 :a2'
178 178
179 179 % -- a -> b tree
180 180 comparing with b
181 181 searching for changes
182 182 unpruned common: bebd167eb94d
183 183 elapsed time: * seconds (glob)
184 184 heads summary:
185 185 total common heads: 1
186 186 also local heads: 1
187 187 also remote heads: 0
188 188 both: 0
189 189 local heads: 2
190 190 common: 1
191 191 missing: 1
192 192 remote heads: 1
193 193 common: 0
194 194 unknown: 1
195 195 local changesets: 35
196 196 common: 5
197 197 missing: 30
198 198 common heads: bebd167eb94d
199 199
200 200 % -- a -> b set
201 201 comparing with b
202 202 query 1; heads
203 203 searching for changes
204 204 taking initial sample
205 205 searching: 2 queries
206 206 query 2; still undecided: 29, sample size is: 29
207 207 2 total queries in *.????s (glob)
208 208 elapsed time: * seconds (glob)
209 209 heads summary:
210 210 total common heads: 1
211 211 also local heads: 1
212 212 also remote heads: 0
213 213 both: 0
214 214 local heads: 2
215 215 common: 1
216 216 missing: 1
217 217 remote heads: 1
218 218 common: 0
219 219 unknown: 1
220 220 local changesets: 35
221 221 common: 5
222 222 missing: 30
223 223 common heads: bebd167eb94d
224 224
225 225 % -- a -> b set (tip only)
226 226 comparing with b
227 227 query 1; heads
228 228 searching for changes
229 229 taking quick initial sample
230 230 searching: 2 queries
231 231 query 2; still undecided: 31, sample size is: 31
232 232 2 total queries in *.????s (glob)
233 233 elapsed time: * seconds (glob)
234 234 heads summary:
235 235 total common heads: 1
236 236 also local heads: 0
237 237 also remote heads: 0
238 238 both: 0
239 239 local heads: 2
240 240 common: 0
241 241 missing: 2
242 242 remote heads: 1
243 243 common: 0
244 244 unknown: 1
245 245 local changesets: 35
246 246 common: 2
247 247 missing: 33
248 248 common heads: 66f7d451a68b
249 249
250 250 % -- b -> a tree
251 251 comparing with a
252 252 searching for changes
253 253 unpruned common: 66f7d451a68b bebd167eb94d
254 254 elapsed time: * seconds (glob)
255 255 heads summary:
256 256 total common heads: 1
257 257 also local heads: 0
258 258 also remote heads: 1
259 259 both: 0
260 260 local heads: 1
261 261 common: 0
262 262 missing: 1
263 263 remote heads: 2
264 264 common: 1
265 265 unknown: 1
266 266 local changesets: 8
267 267 common: 5
268 268 missing: 3
269 269 common heads: bebd167eb94d
270 270
271 271 % -- b -> a set
272 272 comparing with a
273 273 query 1; heads
274 274 searching for changes
275 275 taking initial sample
276 276 searching: 2 queries
277 277 query 2; still undecided: 2, sample size is: 2
278 278 2 total queries in *.????s (glob)
279 279 elapsed time: * seconds (glob)
280 280 heads summary:
281 281 total common heads: 1
282 282 also local heads: 0
283 283 also remote heads: 1
284 284 both: 0
285 285 local heads: 1
286 286 common: 0
287 287 missing: 1
288 288 remote heads: 2
289 289 common: 1
290 290 unknown: 1
291 291 local changesets: 8
292 292 common: 5
293 293 missing: 3
294 294 common heads: bebd167eb94d
295 295
296 296 % -- b -> a set (tip only)
297 297 comparing with a
298 298 query 1; heads
299 299 searching for changes
300 300 taking initial sample
301 301 searching: 2 queries
302 302 query 2; still undecided: 2, sample size is: 2
303 303 2 total queries in *.????s (glob)
304 304 elapsed time: * seconds (glob)
305 305 heads summary:
306 306 total common heads: 1
307 307 also local heads: 0
308 308 also remote heads: 1
309 309 both: 0
310 310 local heads: 1
311 311 common: 0
312 312 missing: 1
313 313 remote heads: 2
314 314 common: 1
315 315 unknown: 1
316 316 local changesets: 8
317 317 common: 5
318 318 missing: 3
319 319 common heads: bebd167eb94d
320 320
321 321 Both sides many new with stub:
322 322
323 323 $ testdesc '-ra1 -ra2' '-rb' '
324 324 > +2:f +2:a1 +30 :b
325 325 > <f +30 :a2'
326 326
327 327 % -- a -> b tree
328 328 comparing with b
329 329 searching for changes
330 330 unpruned common: 2dc09a01254d
331 331 elapsed time: * seconds (glob)
332 332 heads summary:
333 333 total common heads: 1
334 334 also local heads: 1
335 335 also remote heads: 0
336 336 both: 0
337 337 local heads: 2
338 338 common: 1
339 339 missing: 1
340 340 remote heads: 1
341 341 common: 0
342 342 unknown: 1
343 343 local changesets: 34
344 344 common: 4
345 345 missing: 30
346 346 common heads: 2dc09a01254d
347 347
348 348 % -- a -> b set
349 349 comparing with b
350 350 query 1; heads
351 351 searching for changes
352 352 taking initial sample
353 353 searching: 2 queries
354 354 query 2; still undecided: 29, sample size is: 29
355 355 2 total queries in *.????s (glob)
356 356 elapsed time: * seconds (glob)
357 357 heads summary:
358 358 total common heads: 1
359 359 also local heads: 1
360 360 also remote heads: 0
361 361 both: 0
362 362 local heads: 2
363 363 common: 1
364 364 missing: 1
365 365 remote heads: 1
366 366 common: 0
367 367 unknown: 1
368 368 local changesets: 34
369 369 common: 4
370 370 missing: 30
371 371 common heads: 2dc09a01254d
372 372
373 373 % -- a -> b set (tip only)
374 374 comparing with b
375 375 query 1; heads
376 376 searching for changes
377 377 taking quick initial sample
378 378 searching: 2 queries
379 379 query 2; still undecided: 31, sample size is: 31
380 380 2 total queries in *.????s (glob)
381 381 elapsed time: * seconds (glob)
382 382 heads summary:
383 383 total common heads: 1
384 384 also local heads: 0
385 385 also remote heads: 0
386 386 both: 0
387 387 local heads: 2
388 388 common: 0
389 389 missing: 2
390 390 remote heads: 1
391 391 common: 0
392 392 unknown: 1
393 393 local changesets: 34
394 394 common: 2
395 395 missing: 32
396 396 common heads: 66f7d451a68b
397 397
398 398 % -- b -> a tree
399 399 comparing with a
400 400 searching for changes
401 401 unpruned common: 2dc09a01254d 66f7d451a68b
402 402 elapsed time: * seconds (glob)
403 403 heads summary:
404 404 total common heads: 1
405 405 also local heads: 0
406 406 also remote heads: 1
407 407 both: 0
408 408 local heads: 1
409 409 common: 0
410 410 missing: 1
411 411 remote heads: 2
412 412 common: 1
413 413 unknown: 1
414 414 local changesets: 34
415 415 common: 4
416 416 missing: 30
417 417 common heads: 2dc09a01254d
418 418
419 419 % -- b -> a set
420 420 comparing with a
421 421 query 1; heads
422 422 searching for changes
423 423 taking initial sample
424 424 searching: 2 queries
425 425 query 2; still undecided: 29, sample size is: 29
426 426 2 total queries in *.????s (glob)
427 427 elapsed time: * seconds (glob)
428 428 heads summary:
429 429 total common heads: 1
430 430 also local heads: 0
431 431 also remote heads: 1
432 432 both: 0
433 433 local heads: 1
434 434 common: 0
435 435 missing: 1
436 436 remote heads: 2
437 437 common: 1
438 438 unknown: 1
439 439 local changesets: 34
440 440 common: 4
441 441 missing: 30
442 442 common heads: 2dc09a01254d
443 443
444 444 % -- b -> a set (tip only)
445 445 comparing with a
446 446 query 1; heads
447 447 searching for changes
448 448 taking initial sample
449 449 searching: 2 queries
450 450 query 2; still undecided: 29, sample size is: 29
451 451 2 total queries in *.????s (glob)
452 452 elapsed time: * seconds (glob)
453 453 heads summary:
454 454 total common heads: 1
455 455 also local heads: 0
456 456 also remote heads: 1
457 457 both: 0
458 458 local heads: 1
459 459 common: 0
460 460 missing: 1
461 461 remote heads: 2
462 462 common: 1
463 463 unknown: 1
464 464 local changesets: 34
465 465 common: 4
466 466 missing: 30
467 467 common heads: 2dc09a01254d
468 468
469 469
470 470 Both many new:
471 471
472 472 $ testdesc '-ra' '-rb' '
473 473 > +2:f +30 :b
474 474 > <f +30 :a'
475 475
476 476 % -- a -> b tree
477 477 comparing with b
478 478 searching for changes
479 479 unpruned common: 66f7d451a68b
480 480 elapsed time: * seconds (glob)
481 481 heads summary:
482 482 total common heads: 1
483 483 also local heads: 0
484 484 also remote heads: 0
485 485 both: 0
486 486 local heads: 1
487 487 common: 0
488 488 missing: 1
489 489 remote heads: 1
490 490 common: 0
491 491 unknown: 1
492 492 local changesets: 32
493 493 common: 2
494 494 missing: 30
495 495 common heads: 66f7d451a68b
496 496
497 497 % -- a -> b set
498 498 comparing with b
499 499 query 1; heads
500 500 searching for changes
501 501 taking quick initial sample
502 502 searching: 2 queries
503 503 query 2; still undecided: 31, sample size is: 31
504 504 2 total queries in *.????s (glob)
505 505 elapsed time: * seconds (glob)
506 506 heads summary:
507 507 total common heads: 1
508 508 also local heads: 0
509 509 also remote heads: 0
510 510 both: 0
511 511 local heads: 1
512 512 common: 0
513 513 missing: 1
514 514 remote heads: 1
515 515 common: 0
516 516 unknown: 1
517 517 local changesets: 32
518 518 common: 2
519 519 missing: 30
520 520 common heads: 66f7d451a68b
521 521
522 522 % -- a -> b set (tip only)
523 523 comparing with b
524 524 query 1; heads
525 525 searching for changes
526 526 taking quick initial sample
527 527 searching: 2 queries
528 528 query 2; still undecided: 31, sample size is: 31
529 529 2 total queries in *.????s (glob)
530 530 elapsed time: * seconds (glob)
531 531 heads summary:
532 532 total common heads: 1
533 533 also local heads: 0
534 534 also remote heads: 0
535 535 both: 0
536 536 local heads: 1
537 537 common: 0
538 538 missing: 1
539 539 remote heads: 1
540 540 common: 0
541 541 unknown: 1
542 542 local changesets: 32
543 543 common: 2
544 544 missing: 30
545 545 common heads: 66f7d451a68b
546 546
547 547 % -- b -> a tree
548 548 comparing with a
549 549 searching for changes
550 550 unpruned common: 66f7d451a68b
551 551 elapsed time: * seconds (glob)
552 552 heads summary:
553 553 total common heads: 1
554 554 also local heads: 0
555 555 also remote heads: 0
556 556 both: 0
557 557 local heads: 1
558 558 common: 0
559 559 missing: 1
560 560 remote heads: 1
561 561 common: 0
562 562 unknown: 1
563 563 local changesets: 32
564 564 common: 2
565 565 missing: 30
566 566 common heads: 66f7d451a68b
567 567
568 568 % -- b -> a set
569 569 comparing with a
570 570 query 1; heads
571 571 searching for changes
572 572 taking quick initial sample
573 573 searching: 2 queries
574 574 query 2; still undecided: 31, sample size is: 31
575 575 2 total queries in *.????s (glob)
576 576 elapsed time: * seconds (glob)
577 577 heads summary:
578 578 total common heads: 1
579 579 also local heads: 0
580 580 also remote heads: 0
581 581 both: 0
582 582 local heads: 1
583 583 common: 0
584 584 missing: 1
585 585 remote heads: 1
586 586 common: 0
587 587 unknown: 1
588 588 local changesets: 32
589 589 common: 2
590 590 missing: 30
591 591 common heads: 66f7d451a68b
592 592
593 593 % -- b -> a set (tip only)
594 594 comparing with a
595 595 query 1; heads
596 596 searching for changes
597 597 taking quick initial sample
598 598 searching: 2 queries
599 599 query 2; still undecided: 31, sample size is: 31
600 600 2 total queries in *.????s (glob)
601 601 elapsed time: * seconds (glob)
602 602 heads summary:
603 603 total common heads: 1
604 604 also local heads: 0
605 605 also remote heads: 0
606 606 both: 0
607 607 local heads: 1
608 608 common: 0
609 609 missing: 1
610 610 remote heads: 1
611 611 common: 0
612 612 unknown: 1
613 613 local changesets: 32
614 614 common: 2
615 615 missing: 30
616 616 common heads: 66f7d451a68b
617 617
618 618
619 619 Both many new skewed:
620 620
621 621 $ testdesc '-ra' '-rb' '
622 622 > +2:f +30 :b
623 623 > <f +50 :a'
624 624
625 625 % -- a -> b tree
626 626 comparing with b
627 627 searching for changes
628 628 unpruned common: 66f7d451a68b
629 629 elapsed time: * seconds (glob)
630 630 heads summary:
631 631 total common heads: 1
632 632 also local heads: 0
633 633 also remote heads: 0
634 634 both: 0
635 635 local heads: 1
636 636 common: 0
637 637 missing: 1
638 638 remote heads: 1
639 639 common: 0
640 640 unknown: 1
641 641 local changesets: 52
642 642 common: 2
643 643 missing: 50
644 644 common heads: 66f7d451a68b
645 645
646 646 % -- a -> b set
647 647 comparing with b
648 648 query 1; heads
649 649 searching for changes
650 650 taking quick initial sample
651 651 searching: 2 queries
652 652 query 2; still undecided: 51, sample size is: 51
653 653 2 total queries in *.????s (glob)
654 654 elapsed time: * seconds (glob)
655 655 heads summary:
656 656 total common heads: 1
657 657 also local heads: 0
658 658 also remote heads: 0
659 659 both: 0
660 660 local heads: 1
661 661 common: 0
662 662 missing: 1
663 663 remote heads: 1
664 664 common: 0
665 665 unknown: 1
666 666 local changesets: 52
667 667 common: 2
668 668 missing: 50
669 669 common heads: 66f7d451a68b
670 670
671 671 % -- a -> b set (tip only)
672 672 comparing with b
673 673 query 1; heads
674 674 searching for changes
675 675 taking quick initial sample
676 676 searching: 2 queries
677 677 query 2; still undecided: 51, sample size is: 51
678 678 2 total queries in *.????s (glob)
679 679 elapsed time: * seconds (glob)
680 680 heads summary:
681 681 total common heads: 1
682 682 also local heads: 0
683 683 also remote heads: 0
684 684 both: 0
685 685 local heads: 1
686 686 common: 0
687 687 missing: 1
688 688 remote heads: 1
689 689 common: 0
690 690 unknown: 1
691 691 local changesets: 52
692 692 common: 2
693 693 missing: 50
694 694 common heads: 66f7d451a68b
695 695
696 696 % -- b -> a tree
697 697 comparing with a
698 698 searching for changes
699 699 unpruned common: 66f7d451a68b
700 700 elapsed time: * seconds (glob)
701 701 heads summary:
702 702 total common heads: 1
703 703 also local heads: 0
704 704 also remote heads: 0
705 705 both: 0
706 706 local heads: 1
707 707 common: 0
708 708 missing: 1
709 709 remote heads: 1
710 710 common: 0
711 711 unknown: 1
712 712 local changesets: 32
713 713 common: 2
714 714 missing: 30
715 715 common heads: 66f7d451a68b
716 716
717 717 % -- b -> a set
718 718 comparing with a
719 719 query 1; heads
720 720 searching for changes
721 721 taking quick initial sample
722 722 searching: 2 queries
723 723 query 2; still undecided: 31, sample size is: 31
724 724 2 total queries in *.????s (glob)
725 725 elapsed time: * seconds (glob)
726 726 heads summary:
727 727 total common heads: 1
728 728 also local heads: 0
729 729 also remote heads: 0
730 730 both: 0
731 731 local heads: 1
732 732 common: 0
733 733 missing: 1
734 734 remote heads: 1
735 735 common: 0
736 736 unknown: 1
737 737 local changesets: 32
738 738 common: 2
739 739 missing: 30
740 740 common heads: 66f7d451a68b
741 741
742 742 % -- b -> a set (tip only)
743 743 comparing with a
744 744 query 1; heads
745 745 searching for changes
746 746 taking quick initial sample
747 747 searching: 2 queries
748 748 query 2; still undecided: 31, sample size is: 31
749 749 2 total queries in *.????s (glob)
750 750 elapsed time: * seconds (glob)
751 751 heads summary:
752 752 total common heads: 1
753 753 also local heads: 0
754 754 also remote heads: 0
755 755 both: 0
756 756 local heads: 1
757 757 common: 0
758 758 missing: 1
759 759 remote heads: 1
760 760 common: 0
761 761 unknown: 1
762 762 local changesets: 32
763 763 common: 2
764 764 missing: 30
765 765 common heads: 66f7d451a68b
766 766
767 767
768 768 Both many new on top of long history:
769 769
770 770 $ testdesc '-ra' '-rb' '
771 771 > +1000:f +30 :b
772 772 > <f +50 :a'
773 773
774 774 % -- a -> b tree
775 775 comparing with b
776 776 searching for changes
777 777 unpruned common: 7ead0cba2838
778 778 elapsed time: * seconds (glob)
779 779 heads summary:
780 780 total common heads: 1
781 781 also local heads: 0
782 782 also remote heads: 0
783 783 both: 0
784 784 local heads: 1
785 785 common: 0
786 786 missing: 1
787 787 remote heads: 1
788 788 common: 0
789 789 unknown: 1
790 790 local changesets: 1050
791 791 common: 1000
792 792 missing: 50
793 793 common heads: 7ead0cba2838
794 794
795 795 % -- a -> b set
796 796 comparing with b
797 797 query 1; heads
798 798 searching for changes
799 799 taking quick initial sample
800 800 searching: 2 queries
801 801 query 2; still undecided: 1049, sample size is: 11
802 802 sampling from both directions
803 803 searching: 3 queries
804 804 query 3; still undecided: 31, sample size is: 31
805 805 3 total queries in *.????s (glob)
806 806 elapsed time: * seconds (glob)
807 807 heads summary:
808 808 total common heads: 1
809 809 also local heads: 0
810 810 also remote heads: 0
811 811 both: 0
812 812 local heads: 1
813 813 common: 0
814 814 missing: 1
815 815 remote heads: 1
816 816 common: 0
817 817 unknown: 1
818 818 local changesets: 1050
819 819 common: 1000
820 820 missing: 50
821 821 common heads: 7ead0cba2838
822 822
823 823 % -- a -> b set (tip only)
824 824 comparing with b
825 825 query 1; heads
826 826 searching for changes
827 827 taking quick initial sample
828 828 searching: 2 queries
829 829 query 2; still undecided: 1049, sample size is: 11
830 830 sampling from both directions
831 831 searching: 3 queries
832 832 query 3; still undecided: 31, sample size is: 31
833 833 3 total queries in *.????s (glob)
834 834 elapsed time: * seconds (glob)
835 835 heads summary:
836 836 total common heads: 1
837 837 also local heads: 0
838 838 also remote heads: 0
839 839 both: 0
840 840 local heads: 1
841 841 common: 0
842 842 missing: 1
843 843 remote heads: 1
844 844 common: 0
845 845 unknown: 1
846 846 local changesets: 1050
847 847 common: 1000
848 848 missing: 50
849 849 common heads: 7ead0cba2838
850 850
851 851 % -- b -> a tree
852 852 comparing with a
853 853 searching for changes
854 854 unpruned common: 7ead0cba2838
855 855 elapsed time: * seconds (glob)
856 856 heads summary:
857 857 total common heads: 1
858 858 also local heads: 0
859 859 also remote heads: 0
860 860 both: 0
861 861 local heads: 1
862 862 common: 0
863 863 missing: 1
864 864 remote heads: 1
865 865 common: 0
866 866 unknown: 1
867 867 local changesets: 1030
868 868 common: 1000
869 869 missing: 30
870 870 common heads: 7ead0cba2838
871 871
872 872 % -- b -> a set
873 873 comparing with a
874 874 query 1; heads
875 875 searching for changes
876 876 taking quick initial sample
877 877 searching: 2 queries
878 878 query 2; still undecided: 1029, sample size is: 11
879 879 sampling from both directions
880 880 searching: 3 queries
881 881 query 3; still undecided: 15, sample size is: 15
882 882 3 total queries in *.????s (glob)
883 883 elapsed time: * seconds (glob)
884 884 heads summary:
885 885 total common heads: 1
886 886 also local heads: 0
887 887 also remote heads: 0
888 888 both: 0
889 889 local heads: 1
890 890 common: 0
891 891 missing: 1
892 892 remote heads: 1
893 893 common: 0
894 894 unknown: 1
895 895 local changesets: 1030
896 896 common: 1000
897 897 missing: 30
898 898 common heads: 7ead0cba2838
899 899
900 900 % -- b -> a set (tip only)
901 901 comparing with a
902 902 query 1; heads
903 903 searching for changes
904 904 taking quick initial sample
905 905 searching: 2 queries
906 906 query 2; still undecided: 1029, sample size is: 11
907 907 sampling from both directions
908 908 searching: 3 queries
909 909 query 3; still undecided: 15, sample size is: 15
910 910 3 total queries in *.????s (glob)
911 911 elapsed time: * seconds (glob)
912 912 heads summary:
913 913 total common heads: 1
914 914 also local heads: 0
915 915 also remote heads: 0
916 916 both: 0
917 917 local heads: 1
918 918 common: 0
919 919 missing: 1
920 920 remote heads: 1
921 921 common: 0
922 922 unknown: 1
923 923 local changesets: 1030
924 924 common: 1000
925 925 missing: 30
926 926 common heads: 7ead0cba2838
927 927
928 928
929 929 One with >200 heads. We now switch to send them all in the initial roundtrip, but still do sampling for the later request.
930 930
931 931 $ hg init manyheads
932 932 $ cd manyheads
933 933 $ echo "+300:r @a" >dagdesc
934 934 $ 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
935 935 $ 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
936 936 $ 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
937 937 $ 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
938 938 $ 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
939 939 $ 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
940 940 $ 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
941 941 $ 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
942 942 $ 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
943 943 $ 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
944 944 $ 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
945 945 $ 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
946 946 $ 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
947 947 $ echo "@b *r+3" >>dagdesc # one more head
948 948 $ hg debugbuilddag <dagdesc
949 949 reading DAG from stdin
950 950
951 951 $ hg heads -t --template . | wc -c
952 952 \s*261 (re)
953 953
954 954 $ hg clone -b a . a
955 955 adding changesets
956 956 adding manifests
957 957 adding file changes
958 958 added 1340 changesets with 0 changes to 0 files (+259 heads)
959 959 new changesets 1ea73414a91b:1c51e2c80832
960 960 updating to branch a
961 961 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
962 962 $ hg clone -b b . b
963 963 adding changesets
964 964 adding manifests
965 965 adding file changes
966 966 added 304 changesets with 0 changes to 0 files
967 967 new changesets 1ea73414a91b:513314ca8b3a
968 968 updating to branch b
969 969 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
970 970
971 $ hg -R a debugdiscovery b --debug --verbose --config progress.debug=true
971 $ hg -R a debugdiscovery b --debug --verbose --config progress.debug=true --config devel.discovery.randomize=false
972 972 comparing with b
973 973 query 1; heads
974 974 searching for changes
975 975 taking quick initial sample
976 976 searching: 2 queries
977 977 query 2; still undecided: 1080, sample size is: 100
978 978 sampling from both directions
979 979 searching: 3 queries
980 980 query 3; still undecided: 980, sample size is: 200
981 981 sampling from both directions
982 982 searching: 4 queries
983 query 4; still undecided: 435, sample size is: 210 (no-py3 !)
984 query 4; still undecided: 430, sample size is: 210 (py3 !)
983 query 4; still undecided: 497, sample size is: 210
985 984 sampling from both directions
986 985 searching: 5 queries
987 query 5; still undecided: 185, sample size is: 185 (no-py3 !)
988 query 5; still undecided: 187, sample size is: 187 (py3 !)
989 5 total queries in *.????s (glob)
986 query 5; still undecided: 285, sample size is: 220
987 sampling from both directions
988 searching: 6 queries
989 query 6; still undecided: 63, sample size is: 63
990 6 total queries in *.????s (glob)
990 991 elapsed time: * seconds (glob)
991 992 heads summary:
992 993 total common heads: 1
993 994 also local heads: 0
994 995 also remote heads: 0
995 996 both: 0
996 997 local heads: 260
997 998 common: 0
998 999 missing: 260
999 1000 remote heads: 1
1000 1001 common: 0
1001 1002 unknown: 1
1002 1003 local changesets: 1340
1003 1004 common: 300
1004 1005 missing: 1040
1005 1006 common heads: 3ee37d65064a
1006 1007 $ hg -R a debugdiscovery b --debug --verbose --config progress.debug=true --rev tip
1007 1008 comparing with b
1008 1009 query 1; heads
1009 1010 searching for changes
1010 1011 taking quick initial sample
1011 1012 searching: 2 queries
1012 1013 query 2; still undecided: 303, sample size is: 9
1013 1014 sampling from both directions
1014 1015 searching: 3 queries
1015 1016 query 3; still undecided: 3, sample size is: 3
1016 1017 3 total queries in *.????s (glob)
1017 1018 elapsed time: * seconds (glob)
1018 1019 heads summary:
1019 1020 total common heads: 1
1020 1021 also local heads: 0
1021 1022 also remote heads: 0
1022 1023 both: 0
1023 1024 local heads: 260
1024 1025 common: 0
1025 1026 missing: 260
1026 1027 remote heads: 1
1027 1028 common: 0
1028 1029 unknown: 1
1029 1030 local changesets: 1340
1030 1031 common: 300
1031 1032 missing: 1040
1032 1033 common heads: 3ee37d65064a
1033 1034
1034 1035 Test actual protocol when pulling one new head in addition to common heads
1035 1036
1036 1037 $ hg clone -U b c
1037 1038 $ hg -R c id -ir tip
1038 1039 513314ca8b3a
1039 1040 $ hg -R c up -qr default
1040 1041 $ touch c/f
1041 1042 $ hg -R c ci -Aqm "extra head"
1042 1043 $ hg -R c id -i
1043 1044 e64a39e7da8b
1044 1045
1045 1046 $ hg serve -R c -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
1046 1047 $ cat hg.pid >> $DAEMON_PIDS
1047 1048
1048 1049 $ hg -R b incoming http://localhost:$HGPORT/ -T '{node|short}\n'
1049 1050 comparing with http://localhost:$HGPORT/
1050 1051 searching for changes
1051 1052 e64a39e7da8b
1052 1053
1053 1054 $ killdaemons.py
1054 1055 $ cut -d' ' -f6- access.log | grep -v cmd=known # cmd=known uses random sampling
1055 1056 "GET /?cmd=capabilities HTTP/1.1" 200 -
1056 1057 "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
1057 1058 "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
1058 1059 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
1059 1060 $ cat errors.log
1060 1061
1061 1062 $ cd ..
1062 1063
1063 1064
1064 1065 Issue 4438 - test coverage for 3ef893520a85 issues.
1065 1066
1066 1067 $ mkdir issue4438
1067 1068 $ cd issue4438
1068 1069 #if false
1069 1070 generate new bundles:
1070 1071 $ hg init r1
1071 1072 $ 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
1072 1073 $ hg clone -q r1 r2
1073 1074 $ 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
1074 1075 $ hg -R r2 branch -q r2change && hg -R r2 ci -qmr2change
1075 1076 $ hg -R r1 bundle -qa $TESTDIR/bundles/issue4438-r1.hg
1076 1077 $ hg -R r2 bundle -qa $TESTDIR/bundles/issue4438-r2.hg
1077 1078 #else
1078 1079 use existing bundles:
1079 1080 $ hg init r1
1080 1081 $ hg -R r1 -q unbundle $TESTDIR/bundles/issue4438-r1.hg
1081 1082 $ hg -R r1 -q up
1082 1083 $ hg init r2
1083 1084 $ hg -R r2 -q unbundle $TESTDIR/bundles/issue4438-r2.hg
1084 1085 $ hg -R r2 -q up
1085 1086 #endif
1086 1087
1087 1088 Set iteration order could cause wrong and unstable results - fixed in 73cfaa348650:
1088 1089
1089 1090 $ hg -R r1 outgoing r2 -T'{rev} '
1090 1091 comparing with r2
1091 1092 searching for changes
1092 1093 101 102 103 104 105 106 107 108 109 110 (no-eol)
1093 1094
1094 1095 The case where all the 'initialsamplesize' samples already were common would
1095 1096 give 'all remote heads known locally' without checking the remaining heads -
1096 1097 fixed in 86c35b7ae300:
1097 1098
1098 $ cat >> $TESTTMP/unrandomsample.py << EOF
1099 > import random
1100 > def sample(population, k):
1101 > return sorted(population)[:k]
1102 > random.sample = sample
1103 > EOF
1104
1105 1099 $ cat >> r1/.hg/hgrc << EOF
1106 > [extensions]
1107 > unrandomsample = $TESTTMP/unrandomsample.py
1100 > [devel]
1101 > discovery.randomize = False
1108 1102 > EOF
1109 1103
1110 1104 $ hg -R r1 outgoing r2 -T'{rev} ' --config extensions.blackbox= \
1111 1105 > --config blackbox.track='command commandfinish discovery'
1112 1106 comparing with r2
1113 1107 searching for changes
1114 1108 101 102 103 104 105 106 107 108 109 110 (no-eol)
1115 1109 $ hg -R r1 --config extensions.blackbox= blackbox --config blackbox.track=
1116 1110 * @5d0b986a083e0d91f116de4691e2aaa54d5bbec0 (*)> serve --cmdserver chgunix * (glob) (chg !)
1117 1111 * @5d0b986a083e0d91f116de4691e2aaa54d5bbec0 (*)> -R r1 outgoing r2 *-T{rev} * --config *extensions.blackbox=* (glob)
1118 1112 * @5d0b986a083e0d91f116de4691e2aaa54d5bbec0 (*)> found 101 common and 1 unknown server heads, 1 roundtrips in *.????s (glob)
1119 1113 * @5d0b986a083e0d91f116de4691e2aaa54d5bbec0 (*)> -R r1 outgoing r2 *-T{rev} * --config *extensions.blackbox=* exited 0 after *.?? seconds (glob)
1120 1114 $ cd ..
General Comments 0
You need to be logged in to leave comments. Login now