##// END OF EJS Templates
obsolete: add a devel.user.obsmarker...
Boris Feld -
r34576:dc91580a default
parent child Browse files
Show More
@@ -1,764 +1,767 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
12 12 from . import (
13 13 encoding,
14 14 error,
15 15 )
16 16
17 17 def loadconfigtable(ui, extname, configtable):
18 18 """update config item known to the ui with the extension ones"""
19 19 for section, items in configtable.items():
20 20 knownitems = ui._knownconfig.setdefault(section, {})
21 21 knownkeys = set(knownitems)
22 22 newkeys = set(items)
23 23 for key in sorted(knownkeys & newkeys):
24 24 msg = "extension '%s' overwrite config item '%s.%s'"
25 25 msg %= (extname, section, key)
26 26 ui.develwarn(msg, config='warn-config')
27 27
28 28 knownitems.update(items)
29 29
30 30 class configitem(object):
31 31 """represent a known config item
32 32
33 33 :section: the official config section where to find this item,
34 34 :name: the official name within the section,
35 35 :default: default value for this item,
36 36 :alias: optional list of tuples as alternatives.
37 37 """
38 38
39 39 def __init__(self, section, name, default=None, alias=()):
40 40 self.section = section
41 41 self.name = name
42 42 self.default = default
43 43 self.alias = list(alias)
44 44
45 45 coreitems = {}
46 46
47 47 def _register(configtable, *args, **kwargs):
48 48 item = configitem(*args, **kwargs)
49 49 section = configtable.setdefault(item.section, {})
50 50 if item.name in section:
51 51 msg = "duplicated config item registration for '%s.%s'"
52 52 raise error.ProgrammingError(msg % (item.section, item.name))
53 53 section[item.name] = item
54 54
55 55 # special value for case where the default is derived from other values
56 56 dynamicdefault = object()
57 57
58 58 # Registering actual config items
59 59
60 60 def getitemregister(configtable):
61 61 return functools.partial(_register, configtable)
62 62
63 63 coreconfigitem = getitemregister(coreitems)
64 64
65 65 coreconfigitem('auth', 'cookiefile',
66 66 default=None,
67 67 )
68 68 # bookmarks.pushing: internal hack for discovery
69 69 coreconfigitem('bookmarks', 'pushing',
70 70 default=list,
71 71 )
72 72 # bundle.mainreporoot: internal hack for bundlerepo
73 73 coreconfigitem('bundle', 'mainreporoot',
74 74 default='',
75 75 )
76 76 # bundle.reorder: experimental config
77 77 coreconfigitem('bundle', 'reorder',
78 78 default='auto',
79 79 )
80 80 coreconfigitem('censor', 'policy',
81 81 default='abort',
82 82 )
83 83 coreconfigitem('chgserver', 'idletimeout',
84 84 default=3600,
85 85 )
86 86 coreconfigitem('chgserver', 'skiphash',
87 87 default=False,
88 88 )
89 89 coreconfigitem('cmdserver', 'log',
90 90 default=None,
91 91 )
92 92 coreconfigitem('color', 'mode',
93 93 default='auto',
94 94 )
95 95 coreconfigitem('color', 'pagermode',
96 96 default=dynamicdefault,
97 97 )
98 98 coreconfigitem('commands', 'status.relative',
99 99 default=False,
100 100 )
101 101 coreconfigitem('commands', 'status.skipstates',
102 102 default=[],
103 103 )
104 104 coreconfigitem('commands', 'status.verbose',
105 105 default=False,
106 106 )
107 107 coreconfigitem('commands', 'update.requiredest',
108 108 default=False,
109 109 )
110 110 coreconfigitem('debug', 'dirstate.delaywrite',
111 111 default=0,
112 112 )
113 113 coreconfigitem('devel', 'all-warnings',
114 114 default=False,
115 115 )
116 116 coreconfigitem('devel', 'bundle2.debug',
117 117 default=False,
118 118 )
119 119 coreconfigitem('devel', 'cache-vfs',
120 120 default=None,
121 121 )
122 122 coreconfigitem('devel', 'check-locks',
123 123 default=False,
124 124 )
125 125 coreconfigitem('devel', 'check-relroot',
126 126 default=False,
127 127 )
128 128 coreconfigitem('devel', 'default-date',
129 129 default=None,
130 130 )
131 131 coreconfigitem('devel', 'deprec-warn',
132 132 default=False,
133 133 )
134 134 coreconfigitem('devel', 'disableloaddefaultcerts',
135 135 default=False,
136 136 )
137 137 coreconfigitem('devel', 'empty-changegroup',
138 138 default=False,
139 139 )
140 140 coreconfigitem('devel', 'legacy.exchange',
141 141 default=list,
142 142 )
143 143 coreconfigitem('devel', 'servercafile',
144 144 default='',
145 145 )
146 146 coreconfigitem('devel', 'serverexactprotocol',
147 147 default='',
148 148 )
149 149 coreconfigitem('devel', 'serverrequirecert',
150 150 default=False,
151 151 )
152 152 coreconfigitem('devel', 'strip-obsmarkers',
153 153 default=True,
154 154 )
155 155 coreconfigitem('devel', 'warn-config',
156 156 default=None,
157 157 )
158 158 coreconfigitem('devel', 'warn-config-default',
159 159 default=None,
160 160 )
161 coreconfigitem('devel', 'user.obsmarker',
162 default=None,
163 )
161 164 coreconfigitem('diff', 'nodates',
162 165 default=None,
163 166 )
164 167 coreconfigitem('diff', 'showfunc',
165 168 default=None,
166 169 )
167 170 coreconfigitem('diff', 'unified',
168 171 default=None,
169 172 )
170 173 coreconfigitem('diff', 'git',
171 174 default=None,
172 175 )
173 176 coreconfigitem('diff', 'ignorews',
174 177 default=None,
175 178 )
176 179 coreconfigitem('diff', 'ignorewsamount',
177 180 default=None,
178 181 )
179 182 coreconfigitem('diff', 'ignoreblanklines',
180 183 default=None,
181 184 )
182 185 coreconfigitem('diff', 'ignorewseol',
183 186 default=None,
184 187 )
185 188 coreconfigitem('diff', 'nobinary',
186 189 default=None,
187 190 )
188 191 coreconfigitem('diff', 'noprefix',
189 192 default=None,
190 193 )
191 194 coreconfigitem('email', 'charsets',
192 195 default=list,
193 196 )
194 197 coreconfigitem('email', 'from',
195 198 default=None,
196 199 )
197 200 coreconfigitem('email', 'method',
198 201 default='smtp',
199 202 )
200 203 coreconfigitem('experimental', 'allowdivergence',
201 204 default=False,
202 205 )
203 206 coreconfigitem('experimental', 'bundle-phases',
204 207 default=False,
205 208 )
206 209 coreconfigitem('experimental', 'bundle2-advertise',
207 210 default=True,
208 211 )
209 212 coreconfigitem('experimental', 'bundle2-output-capture',
210 213 default=False,
211 214 )
212 215 coreconfigitem('experimental', 'bundle2.pushback',
213 216 default=False,
214 217 )
215 218 coreconfigitem('experimental', 'bundle2lazylocking',
216 219 default=False,
217 220 )
218 221 coreconfigitem('experimental', 'bundlecomplevel',
219 222 default=None,
220 223 )
221 224 coreconfigitem('experimental', 'changegroup3',
222 225 default=False,
223 226 )
224 227 coreconfigitem('experimental', 'clientcompressionengines',
225 228 default=list,
226 229 )
227 230 coreconfigitem('experimental', 'copytrace',
228 231 default='on',
229 232 )
230 233 coreconfigitem('experimental', 'copytrace.sourcecommitlimit',
231 234 default=100,
232 235 )
233 236 coreconfigitem('experimental', 'crecordtest',
234 237 default=None,
235 238 )
236 239 coreconfigitem('experimental', 'editortmpinhg',
237 240 default=False,
238 241 )
239 242 coreconfigitem('experimental', 'maxdeltachainspan',
240 243 default=-1,
241 244 )
242 245 coreconfigitem('experimental', 'mmapindexthreshold',
243 246 default=None,
244 247 )
245 248 coreconfigitem('experimental', 'nonnormalparanoidcheck',
246 249 default=False,
247 250 )
248 251 coreconfigitem('experimental', 'stabilization',
249 252 default=list,
250 253 alias=[('experimental', 'evolution')],
251 254 )
252 255 coreconfigitem('experimental', 'stabilization.bundle-obsmarker',
253 256 default=False,
254 257 alias=[('experimental', 'evolution.bundle-obsmarker')],
255 258 )
256 259 coreconfigitem('experimental', 'stabilization.track-operation',
257 260 default=True,
258 261 alias=[('experimental', 'evolution.track-operation')]
259 262 )
260 263 coreconfigitem('experimental', 'exportableenviron',
261 264 default=list,
262 265 )
263 266 coreconfigitem('experimental', 'extendedheader.index',
264 267 default=None,
265 268 )
266 269 coreconfigitem('experimental', 'extendedheader.similarity',
267 270 default=False,
268 271 )
269 272 coreconfigitem('experimental', 'format.compression',
270 273 default='zlib',
271 274 )
272 275 coreconfigitem('experimental', 'graphshorten',
273 276 default=False,
274 277 )
275 278 coreconfigitem('experimental', 'graphstyle.parent',
276 279 default=dynamicdefault,
277 280 )
278 281 coreconfigitem('experimental', 'graphstyle.missing',
279 282 default=dynamicdefault,
280 283 )
281 284 coreconfigitem('experimental', 'graphstyle.grandparent',
282 285 default=dynamicdefault,
283 286 )
284 287 coreconfigitem('experimental', 'hook-track-tags',
285 288 default=False,
286 289 )
287 290 coreconfigitem('experimental', 'httppostargs',
288 291 default=False,
289 292 )
290 293 coreconfigitem('experimental', 'manifestv2',
291 294 default=False,
292 295 )
293 296 coreconfigitem('experimental', 'mergedriver',
294 297 default=None,
295 298 )
296 299 coreconfigitem('experimental', 'obsmarkers-exchange-debug',
297 300 default=False,
298 301 )
299 302 coreconfigitem('experimental', 'rebase.multidest',
300 303 default=False,
301 304 )
302 305 coreconfigitem('experimental', 'revertalternateinteractivemode',
303 306 default=True,
304 307 )
305 308 coreconfigitem('experimental', 'revlogv2',
306 309 default=None,
307 310 )
308 311 coreconfigitem('experimental', 'spacemovesdown',
309 312 default=False,
310 313 )
311 314 coreconfigitem('experimental', 'treemanifest',
312 315 default=False,
313 316 )
314 317 coreconfigitem('experimental', 'updatecheck',
315 318 default=None,
316 319 )
317 320 coreconfigitem('format', 'aggressivemergedeltas',
318 321 default=False,
319 322 )
320 323 coreconfigitem('format', 'chunkcachesize',
321 324 default=None,
322 325 )
323 326 coreconfigitem('format', 'dotencode',
324 327 default=True,
325 328 )
326 329 coreconfigitem('format', 'generaldelta',
327 330 default=False,
328 331 )
329 332 coreconfigitem('format', 'manifestcachesize',
330 333 default=None,
331 334 )
332 335 coreconfigitem('format', 'maxchainlen',
333 336 default=None,
334 337 )
335 338 coreconfigitem('format', 'obsstore-version',
336 339 default=None,
337 340 )
338 341 coreconfigitem('format', 'usefncache',
339 342 default=True,
340 343 )
341 344 coreconfigitem('format', 'usegeneraldelta',
342 345 default=True,
343 346 )
344 347 coreconfigitem('format', 'usestore',
345 348 default=True,
346 349 )
347 350 coreconfigitem('hostsecurity', 'ciphers',
348 351 default=None,
349 352 )
350 353 coreconfigitem('hostsecurity', 'disabletls10warning',
351 354 default=False,
352 355 )
353 356 coreconfigitem('http_proxy', 'always',
354 357 default=False,
355 358 )
356 359 coreconfigitem('http_proxy', 'host',
357 360 default=None,
358 361 )
359 362 coreconfigitem('http_proxy', 'no',
360 363 default=list,
361 364 )
362 365 coreconfigitem('http_proxy', 'passwd',
363 366 default=None,
364 367 )
365 368 coreconfigitem('http_proxy', 'user',
366 369 default=None,
367 370 )
368 371 coreconfigitem('merge', 'checkunknown',
369 372 default='abort',
370 373 )
371 374 coreconfigitem('merge', 'checkignored',
372 375 default='abort',
373 376 )
374 377 coreconfigitem('merge', 'followcopies',
375 378 default=True,
376 379 )
377 380 coreconfigitem('merge', 'preferancestor',
378 381 default=lambda: ['*'],
379 382 )
380 383 coreconfigitem('pager', 'ignore',
381 384 default=list,
382 385 )
383 386 coreconfigitem('patch', 'eol',
384 387 default='strict',
385 388 )
386 389 coreconfigitem('patch', 'fuzz',
387 390 default=2,
388 391 )
389 392 coreconfigitem('paths', 'default',
390 393 default=None,
391 394 )
392 395 coreconfigitem('paths', 'default-push',
393 396 default=None,
394 397 )
395 398 coreconfigitem('phases', 'checksubrepos',
396 399 default='follow',
397 400 )
398 401 coreconfigitem('phases', 'new-commit',
399 402 default='draft',
400 403 )
401 404 coreconfigitem('phases', 'publish',
402 405 default=True,
403 406 )
404 407 coreconfigitem('profiling', 'enabled',
405 408 default=False,
406 409 )
407 410 coreconfigitem('profiling', 'format',
408 411 default='text',
409 412 )
410 413 coreconfigitem('profiling', 'freq',
411 414 default=1000,
412 415 )
413 416 coreconfigitem('profiling', 'limit',
414 417 default=30,
415 418 )
416 419 coreconfigitem('profiling', 'nested',
417 420 default=0,
418 421 )
419 422 coreconfigitem('profiling', 'output',
420 423 default=None,
421 424 )
422 425 coreconfigitem('profiling', 'showmax',
423 426 default=0.999,
424 427 )
425 428 coreconfigitem('profiling', 'showmin',
426 429 default=dynamicdefault,
427 430 )
428 431 coreconfigitem('profiling', 'sort',
429 432 default='inlinetime',
430 433 )
431 434 coreconfigitem('profiling', 'statformat',
432 435 default='hotpath',
433 436 )
434 437 coreconfigitem('profiling', 'type',
435 438 default='stat',
436 439 )
437 440 coreconfigitem('progress', 'assume-tty',
438 441 default=False,
439 442 )
440 443 coreconfigitem('progress', 'changedelay',
441 444 default=1,
442 445 )
443 446 coreconfigitem('progress', 'clear-complete',
444 447 default=True,
445 448 )
446 449 coreconfigitem('progress', 'debug',
447 450 default=False,
448 451 )
449 452 coreconfigitem('progress', 'delay',
450 453 default=3,
451 454 )
452 455 coreconfigitem('progress', 'disable',
453 456 default=False,
454 457 )
455 458 coreconfigitem('progress', 'estimateinterval',
456 459 default=60.0,
457 460 )
458 461 coreconfigitem('progress', 'refresh',
459 462 default=0.1,
460 463 )
461 464 coreconfigitem('progress', 'width',
462 465 default=dynamicdefault,
463 466 )
464 467 coreconfigitem('push', 'pushvars.server',
465 468 default=False,
466 469 )
467 470 coreconfigitem('server', 'bundle1',
468 471 default=True,
469 472 )
470 473 coreconfigitem('server', 'bundle1gd',
471 474 default=None,
472 475 )
473 476 coreconfigitem('server', 'compressionengines',
474 477 default=list,
475 478 )
476 479 coreconfigitem('server', 'concurrent-push-mode',
477 480 default='strict',
478 481 )
479 482 coreconfigitem('server', 'disablefullbundle',
480 483 default=False,
481 484 )
482 485 coreconfigitem('server', 'maxhttpheaderlen',
483 486 default=1024,
484 487 )
485 488 coreconfigitem('server', 'preferuncompressed',
486 489 default=False,
487 490 )
488 491 coreconfigitem('server', 'uncompressed',
489 492 default=True,
490 493 )
491 494 coreconfigitem('server', 'uncompressedallowsecret',
492 495 default=False,
493 496 )
494 497 coreconfigitem('server', 'validate',
495 498 default=False,
496 499 )
497 500 coreconfigitem('server', 'zliblevel',
498 501 default=-1,
499 502 )
500 503 coreconfigitem('smtp', 'host',
501 504 default=None,
502 505 )
503 506 coreconfigitem('smtp', 'local_hostname',
504 507 default=None,
505 508 )
506 509 coreconfigitem('smtp', 'password',
507 510 default=None,
508 511 )
509 512 coreconfigitem('smtp', 'port',
510 513 default=dynamicdefault,
511 514 )
512 515 coreconfigitem('smtp', 'tls',
513 516 default='none',
514 517 )
515 518 coreconfigitem('smtp', 'username',
516 519 default=None,
517 520 )
518 521 coreconfigitem('sparse', 'missingwarning',
519 522 default=True,
520 523 )
521 524 coreconfigitem('trusted', 'groups',
522 525 default=list,
523 526 )
524 527 coreconfigitem('trusted', 'users',
525 528 default=list,
526 529 )
527 530 coreconfigitem('ui', '_usedassubrepo',
528 531 default=False,
529 532 )
530 533 coreconfigitem('ui', 'allowemptycommit',
531 534 default=False,
532 535 )
533 536 coreconfigitem('ui', 'archivemeta',
534 537 default=True,
535 538 )
536 539 coreconfigitem('ui', 'askusername',
537 540 default=False,
538 541 )
539 542 coreconfigitem('ui', 'clonebundlefallback',
540 543 default=False,
541 544 )
542 545 coreconfigitem('ui', 'clonebundleprefers',
543 546 default=list,
544 547 )
545 548 coreconfigitem('ui', 'clonebundles',
546 549 default=True,
547 550 )
548 551 coreconfigitem('ui', 'color',
549 552 default='auto',
550 553 )
551 554 coreconfigitem('ui', 'commitsubrepos',
552 555 default=False,
553 556 )
554 557 coreconfigitem('ui', 'debug',
555 558 default=False,
556 559 )
557 560 coreconfigitem('ui', 'debugger',
558 561 default=None,
559 562 )
560 563 coreconfigitem('ui', 'fallbackencoding',
561 564 default=None,
562 565 )
563 566 coreconfigitem('ui', 'forcecwd',
564 567 default=None,
565 568 )
566 569 coreconfigitem('ui', 'forcemerge',
567 570 default=None,
568 571 )
569 572 coreconfigitem('ui', 'formatdebug',
570 573 default=False,
571 574 )
572 575 coreconfigitem('ui', 'formatjson',
573 576 default=False,
574 577 )
575 578 coreconfigitem('ui', 'formatted',
576 579 default=None,
577 580 )
578 581 coreconfigitem('ui', 'graphnodetemplate',
579 582 default=None,
580 583 )
581 584 coreconfigitem('ui', 'http2debuglevel',
582 585 default=None,
583 586 )
584 587 coreconfigitem('ui', 'interactive',
585 588 default=None,
586 589 )
587 590 coreconfigitem('ui', 'interface',
588 591 default=None,
589 592 )
590 593 coreconfigitem('ui', 'logblockedtimes',
591 594 default=False,
592 595 )
593 596 coreconfigitem('ui', 'logtemplate',
594 597 default=None,
595 598 )
596 599 coreconfigitem('ui', 'merge',
597 600 default=None,
598 601 )
599 602 coreconfigitem('ui', 'mergemarkers',
600 603 default='basic',
601 604 )
602 605 coreconfigitem('ui', 'mergemarkertemplate',
603 606 default=('{node|short} '
604 607 '{ifeq(tags, "tip", "", '
605 608 'ifeq(tags, "", "", "{tags} "))}'
606 609 '{if(bookmarks, "{bookmarks} ")}'
607 610 '{ifeq(branch, "default", "", "{branch} ")}'
608 611 '- {author|user}: {desc|firstline}')
609 612 )
610 613 coreconfigitem('ui', 'nontty',
611 614 default=False,
612 615 )
613 616 coreconfigitem('ui', 'origbackuppath',
614 617 default=None,
615 618 )
616 619 coreconfigitem('ui', 'paginate',
617 620 default=True,
618 621 )
619 622 coreconfigitem('ui', 'patch',
620 623 default=None,
621 624 )
622 625 coreconfigitem('ui', 'portablefilenames',
623 626 default='warn',
624 627 )
625 628 coreconfigitem('ui', 'promptecho',
626 629 default=False,
627 630 )
628 631 coreconfigitem('ui', 'quiet',
629 632 default=False,
630 633 )
631 634 coreconfigitem('ui', 'quietbookmarkmove',
632 635 default=False,
633 636 )
634 637 coreconfigitem('ui', 'remotecmd',
635 638 default='hg',
636 639 )
637 640 coreconfigitem('ui', 'report_untrusted',
638 641 default=True,
639 642 )
640 643 coreconfigitem('ui', 'rollback',
641 644 default=True,
642 645 )
643 646 coreconfigitem('ui', 'slash',
644 647 default=False,
645 648 )
646 649 coreconfigitem('ui', 'ssh',
647 650 default='ssh',
648 651 )
649 652 coreconfigitem('ui', 'statuscopies',
650 653 default=False,
651 654 )
652 655 coreconfigitem('ui', 'strict',
653 656 default=False,
654 657 )
655 658 coreconfigitem('ui', 'style',
656 659 default='',
657 660 )
658 661 coreconfigitem('ui', 'supportcontact',
659 662 default=None,
660 663 )
661 664 coreconfigitem('ui', 'textwidth',
662 665 default=78,
663 666 )
664 667 coreconfigitem('ui', 'timeout',
665 668 default='600',
666 669 )
667 670 coreconfigitem('ui', 'traceback',
668 671 default=False,
669 672 )
670 673 coreconfigitem('ui', 'tweakdefaults',
671 674 default=False,
672 675 )
673 676 coreconfigitem('ui', 'usehttp2',
674 677 default=False,
675 678 )
676 679 coreconfigitem('ui', 'username',
677 680 alias=[('ui', 'user')]
678 681 )
679 682 coreconfigitem('ui', 'verbose',
680 683 default=False,
681 684 )
682 685 coreconfigitem('verify', 'skipflags',
683 686 default=None,
684 687 )
685 688 coreconfigitem('web', 'accesslog',
686 689 default='-',
687 690 )
688 691 coreconfigitem('web', 'address',
689 692 default='',
690 693 )
691 694 coreconfigitem('web', 'allow_archive',
692 695 default=list,
693 696 )
694 697 coreconfigitem('web', 'allow_read',
695 698 default=list,
696 699 )
697 700 coreconfigitem('web', 'baseurl',
698 701 default=None,
699 702 )
700 703 coreconfigitem('web', 'cacerts',
701 704 default=None,
702 705 )
703 706 coreconfigitem('web', 'certificate',
704 707 default=None,
705 708 )
706 709 coreconfigitem('web', 'collapse',
707 710 default=False,
708 711 )
709 712 coreconfigitem('web', 'csp',
710 713 default=None,
711 714 )
712 715 coreconfigitem('web', 'deny_read',
713 716 default=list,
714 717 )
715 718 coreconfigitem('web', 'descend',
716 719 default=True,
717 720 )
718 721 coreconfigitem('web', 'description',
719 722 default="",
720 723 )
721 724 coreconfigitem('web', 'encoding',
722 725 default=lambda: encoding.encoding,
723 726 )
724 727 coreconfigitem('web', 'errorlog',
725 728 default='-',
726 729 )
727 730 coreconfigitem('web', 'ipv6',
728 731 default=False,
729 732 )
730 733 coreconfigitem('web', 'port',
731 734 default=8000,
732 735 )
733 736 coreconfigitem('web', 'prefix',
734 737 default='',
735 738 )
736 739 coreconfigitem('web', 'refreshinterval',
737 740 default=20,
738 741 )
739 742 coreconfigitem('web', 'stripes',
740 743 default=1,
741 744 )
742 745 coreconfigitem('web', 'style',
743 746 default='paper',
744 747 )
745 748 coreconfigitem('web', 'templates',
746 749 default=None,
747 750 )
748 751 coreconfigitem('worker', 'backgroundclose',
749 752 default=dynamicdefault,
750 753 )
751 754 # Windows defaults to a limit of 512 open files. A buffer of 128
752 755 # should give us enough headway.
753 756 coreconfigitem('worker', 'backgroundclosemaxqueue',
754 757 default=384,
755 758 )
756 759 coreconfigitem('worker', 'backgroundcloseminfilecount',
757 760 default=2048,
758 761 )
759 762 coreconfigitem('worker', 'backgroundclosethreadcount',
760 763 default=4,
761 764 )
762 765 coreconfigitem('worker', 'numcpus',
763 766 default=None,
764 767 )
@@ -1,1095 +1,1099 b''
1 1 # obsolete.py - obsolete markers handling
2 2 #
3 3 # Copyright 2012 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
4 4 # Logilab SA <contact@logilab.fr>
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 """Obsolete marker handling
10 10
11 11 An obsolete marker maps an old changeset to a list of new
12 12 changesets. If the list of new changesets is empty, the old changeset
13 13 is said to be "killed". Otherwise, the old changeset is being
14 14 "replaced" by the new changesets.
15 15
16 16 Obsolete markers can be used to record and distribute changeset graph
17 17 transformations performed by history rewrite operations, and help
18 18 building new tools to reconcile conflicting rewrite actions. To
19 19 facilitate conflict resolution, markers include various annotations
20 20 besides old and news changeset identifiers, such as creation date or
21 21 author name.
22 22
23 23 The old obsoleted changeset is called a "predecessor" and possible
24 24 replacements are called "successors". Markers that used changeset X as
25 25 a predecessor are called "successor markers of X" because they hold
26 26 information about the successors of X. Markers that use changeset Y as
27 27 a successors are call "predecessor markers of Y" because they hold
28 28 information about the predecessors of Y.
29 29
30 30 Examples:
31 31
32 32 - When changeset A is replaced by changeset A', one marker is stored:
33 33
34 34 (A, (A',))
35 35
36 36 - When changesets A and B are folded into a new changeset C, two markers are
37 37 stored:
38 38
39 39 (A, (C,)) and (B, (C,))
40 40
41 41 - When changeset A is simply "pruned" from the graph, a marker is created:
42 42
43 43 (A, ())
44 44
45 45 - When changeset A is split into B and C, a single marker is used:
46 46
47 47 (A, (B, C))
48 48
49 49 We use a single marker to distinguish the "split" case from the "divergence"
50 50 case. If two independent operations rewrite the same changeset A in to A' and
51 51 A'', we have an error case: divergent rewriting. We can detect it because
52 52 two markers will be created independently:
53 53
54 54 (A, (B,)) and (A, (C,))
55 55
56 56 Format
57 57 ------
58 58
59 59 Markers are stored in an append-only file stored in
60 60 '.hg/store/obsstore'.
61 61
62 62 The file starts with a version header:
63 63
64 64 - 1 unsigned byte: version number, starting at zero.
65 65
66 66 The header is followed by the markers. Marker format depend of the version. See
67 67 comment associated with each format for details.
68 68
69 69 """
70 70 from __future__ import absolute_import
71 71
72 72 import errno
73 73 import struct
74 74
75 75 from .i18n import _
76 76 from . import (
77 77 error,
78 78 node,
79 79 obsutil,
80 80 phases,
81 81 policy,
82 82 util,
83 83 )
84 84
85 85 parsers = policy.importmod(r'parsers')
86 86
87 87 _pack = struct.pack
88 88 _unpack = struct.unpack
89 89 _calcsize = struct.calcsize
90 90 propertycache = util.propertycache
91 91
92 92 # the obsolete feature is not mature enough to be enabled by default.
93 93 # you have to rely on third party extension extension to enable this.
94 94 _enabled = False
95 95
96 96 # Options for obsolescence
97 97 createmarkersopt = 'createmarkers'
98 98 allowunstableopt = 'allowunstable'
99 99 exchangeopt = 'exchange'
100 100
101 101 def isenabled(repo, option):
102 102 """Returns True if the given repository has the given obsolete option
103 103 enabled.
104 104 """
105 105 result = set(repo.ui.configlist('experimental', 'stabilization'))
106 106 if 'all' in result:
107 107 return True
108 108
109 109 # For migration purposes, temporarily return true if the config hasn't been
110 110 # set but _enabled is true.
111 111 if len(result) == 0 and _enabled:
112 112 return True
113 113
114 114 # createmarkers must be enabled if other options are enabled
115 115 if ((allowunstableopt in result or exchangeopt in result) and
116 116 not createmarkersopt in result):
117 117 raise error.Abort(_("'createmarkers' obsolete option must be enabled "
118 118 "if other obsolete options are enabled"))
119 119
120 120 return option in result
121 121
122 122 ### obsolescence marker flag
123 123
124 124 ## bumpedfix flag
125 125 #
126 126 # When a changeset A' succeed to a changeset A which became public, we call A'
127 127 # "bumped" because it's a successors of a public changesets
128 128 #
129 129 # o A' (bumped)
130 130 # |`:
131 131 # | o A
132 132 # |/
133 133 # o Z
134 134 #
135 135 # The way to solve this situation is to create a new changeset Ad as children
136 136 # of A. This changeset have the same content than A'. So the diff from A to A'
137 137 # is the same than the diff from A to Ad. Ad is marked as a successors of A'
138 138 #
139 139 # o Ad
140 140 # |`:
141 141 # | x A'
142 142 # |'|
143 143 # o | A
144 144 # |/
145 145 # o Z
146 146 #
147 147 # But by transitivity Ad is also a successors of A. To avoid having Ad marked
148 148 # as bumped too, we add the `bumpedfix` flag to the marker. <A', (Ad,)>.
149 149 # This flag mean that the successors express the changes between the public and
150 150 # bumped version and fix the situation, breaking the transitivity of
151 151 # "bumped" here.
152 152 bumpedfix = 1
153 153 usingsha256 = 2
154 154
155 155 ## Parsing and writing of version "0"
156 156 #
157 157 # The header is followed by the markers. Each marker is made of:
158 158 #
159 159 # - 1 uint8 : number of new changesets "N", can be zero.
160 160 #
161 161 # - 1 uint32: metadata size "M" in bytes.
162 162 #
163 163 # - 1 byte: a bit field. It is reserved for flags used in common
164 164 # obsolete marker operations, to avoid repeated decoding of metadata
165 165 # entries.
166 166 #
167 167 # - 20 bytes: obsoleted changeset identifier.
168 168 #
169 169 # - N*20 bytes: new changesets identifiers.
170 170 #
171 171 # - M bytes: metadata as a sequence of nul-terminated strings. Each
172 172 # string contains a key and a value, separated by a colon ':', without
173 173 # additional encoding. Keys cannot contain '\0' or ':' and values
174 174 # cannot contain '\0'.
175 175 _fm0version = 0
176 176 _fm0fixed = '>BIB20s'
177 177 _fm0node = '20s'
178 178 _fm0fsize = _calcsize(_fm0fixed)
179 179 _fm0fnodesize = _calcsize(_fm0node)
180 180
181 181 def _fm0readmarkers(data, off, stop):
182 182 # Loop on markers
183 183 while off < stop:
184 184 # read fixed part
185 185 cur = data[off:off + _fm0fsize]
186 186 off += _fm0fsize
187 187 numsuc, mdsize, flags, pre = _unpack(_fm0fixed, cur)
188 188 # read replacement
189 189 sucs = ()
190 190 if numsuc:
191 191 s = (_fm0fnodesize * numsuc)
192 192 cur = data[off:off + s]
193 193 sucs = _unpack(_fm0node * numsuc, cur)
194 194 off += s
195 195 # read metadata
196 196 # (metadata will be decoded on demand)
197 197 metadata = data[off:off + mdsize]
198 198 if len(metadata) != mdsize:
199 199 raise error.Abort(_('parsing obsolete marker: metadata is too '
200 200 'short, %d bytes expected, got %d')
201 201 % (mdsize, len(metadata)))
202 202 off += mdsize
203 203 metadata = _fm0decodemeta(metadata)
204 204 try:
205 205 when, offset = metadata.pop('date', '0 0').split(' ')
206 206 date = float(when), int(offset)
207 207 except ValueError:
208 208 date = (0., 0)
209 209 parents = None
210 210 if 'p2' in metadata:
211 211 parents = (metadata.pop('p1', None), metadata.pop('p2', None))
212 212 elif 'p1' in metadata:
213 213 parents = (metadata.pop('p1', None),)
214 214 elif 'p0' in metadata:
215 215 parents = ()
216 216 if parents is not None:
217 217 try:
218 218 parents = tuple(node.bin(p) for p in parents)
219 219 # if parent content is not a nodeid, drop the data
220 220 for p in parents:
221 221 if len(p) != 20:
222 222 parents = None
223 223 break
224 224 except TypeError:
225 225 # if content cannot be translated to nodeid drop the data.
226 226 parents = None
227 227
228 228 metadata = tuple(sorted(metadata.iteritems()))
229 229
230 230 yield (pre, sucs, flags, metadata, date, parents)
231 231
232 232 def _fm0encodeonemarker(marker):
233 233 pre, sucs, flags, metadata, date, parents = marker
234 234 if flags & usingsha256:
235 235 raise error.Abort(_('cannot handle sha256 with old obsstore format'))
236 236 metadata = dict(metadata)
237 237 time, tz = date
238 238 metadata['date'] = '%r %i' % (time, tz)
239 239 if parents is not None:
240 240 if not parents:
241 241 # mark that we explicitly recorded no parents
242 242 metadata['p0'] = ''
243 243 for i, p in enumerate(parents, 1):
244 244 metadata['p%i' % i] = node.hex(p)
245 245 metadata = _fm0encodemeta(metadata)
246 246 numsuc = len(sucs)
247 247 format = _fm0fixed + (_fm0node * numsuc)
248 248 data = [numsuc, len(metadata), flags, pre]
249 249 data.extend(sucs)
250 250 return _pack(format, *data) + metadata
251 251
252 252 def _fm0encodemeta(meta):
253 253 """Return encoded metadata string to string mapping.
254 254
255 255 Assume no ':' in key and no '\0' in both key and value."""
256 256 for key, value in meta.iteritems():
257 257 if ':' in key or '\0' in key:
258 258 raise ValueError("':' and '\0' are forbidden in metadata key'")
259 259 if '\0' in value:
260 260 raise ValueError("':' is forbidden in metadata value'")
261 261 return '\0'.join(['%s:%s' % (k, meta[k]) for k in sorted(meta)])
262 262
263 263 def _fm0decodemeta(data):
264 264 """Return string to string dictionary from encoded version."""
265 265 d = {}
266 266 for l in data.split('\0'):
267 267 if l:
268 268 key, value = l.split(':')
269 269 d[key] = value
270 270 return d
271 271
272 272 ## Parsing and writing of version "1"
273 273 #
274 274 # The header is followed by the markers. Each marker is made of:
275 275 #
276 276 # - uint32: total size of the marker (including this field)
277 277 #
278 278 # - float64: date in seconds since epoch
279 279 #
280 280 # - int16: timezone offset in minutes
281 281 #
282 282 # - uint16: a bit field. It is reserved for flags used in common
283 283 # obsolete marker operations, to avoid repeated decoding of metadata
284 284 # entries.
285 285 #
286 286 # - uint8: number of successors "N", can be zero.
287 287 #
288 288 # - uint8: number of parents "P", can be zero.
289 289 #
290 290 # 0: parents data stored but no parent,
291 291 # 1: one parent stored,
292 292 # 2: two parents stored,
293 293 # 3: no parent data stored
294 294 #
295 295 # - uint8: number of metadata entries M
296 296 #
297 297 # - 20 or 32 bytes: predecessor changeset identifier.
298 298 #
299 299 # - N*(20 or 32) bytes: successors changesets identifiers.
300 300 #
301 301 # - P*(20 or 32) bytes: parents of the predecessors changesets.
302 302 #
303 303 # - M*(uint8, uint8): size of all metadata entries (key and value)
304 304 #
305 305 # - remaining bytes: the metadata, each (key, value) pair after the other.
306 306 _fm1version = 1
307 307 _fm1fixed = '>IdhHBBB20s'
308 308 _fm1nodesha1 = '20s'
309 309 _fm1nodesha256 = '32s'
310 310 _fm1nodesha1size = _calcsize(_fm1nodesha1)
311 311 _fm1nodesha256size = _calcsize(_fm1nodesha256)
312 312 _fm1fsize = _calcsize(_fm1fixed)
313 313 _fm1parentnone = 3
314 314 _fm1parentshift = 14
315 315 _fm1parentmask = (_fm1parentnone << _fm1parentshift)
316 316 _fm1metapair = 'BB'
317 317 _fm1metapairsize = _calcsize(_fm1metapair)
318 318
319 319 def _fm1purereadmarkers(data, off, stop):
320 320 # make some global constants local for performance
321 321 noneflag = _fm1parentnone
322 322 sha2flag = usingsha256
323 323 sha1size = _fm1nodesha1size
324 324 sha2size = _fm1nodesha256size
325 325 sha1fmt = _fm1nodesha1
326 326 sha2fmt = _fm1nodesha256
327 327 metasize = _fm1metapairsize
328 328 metafmt = _fm1metapair
329 329 fsize = _fm1fsize
330 330 unpack = _unpack
331 331
332 332 # Loop on markers
333 333 ufixed = struct.Struct(_fm1fixed).unpack
334 334
335 335 while off < stop:
336 336 # read fixed part
337 337 o1 = off + fsize
338 338 t, secs, tz, flags, numsuc, numpar, nummeta, prec = ufixed(data[off:o1])
339 339
340 340 if flags & sha2flag:
341 341 # FIXME: prec was read as a SHA1, needs to be amended
342 342
343 343 # read 0 or more successors
344 344 if numsuc == 1:
345 345 o2 = o1 + sha2size
346 346 sucs = (data[o1:o2],)
347 347 else:
348 348 o2 = o1 + sha2size * numsuc
349 349 sucs = unpack(sha2fmt * numsuc, data[o1:o2])
350 350
351 351 # read parents
352 352 if numpar == noneflag:
353 353 o3 = o2
354 354 parents = None
355 355 elif numpar == 1:
356 356 o3 = o2 + sha2size
357 357 parents = (data[o2:o3],)
358 358 else:
359 359 o3 = o2 + sha2size * numpar
360 360 parents = unpack(sha2fmt * numpar, data[o2:o3])
361 361 else:
362 362 # read 0 or more successors
363 363 if numsuc == 1:
364 364 o2 = o1 + sha1size
365 365 sucs = (data[o1:o2],)
366 366 else:
367 367 o2 = o1 + sha1size * numsuc
368 368 sucs = unpack(sha1fmt * numsuc, data[o1:o2])
369 369
370 370 # read parents
371 371 if numpar == noneflag:
372 372 o3 = o2
373 373 parents = None
374 374 elif numpar == 1:
375 375 o3 = o2 + sha1size
376 376 parents = (data[o2:o3],)
377 377 else:
378 378 o3 = o2 + sha1size * numpar
379 379 parents = unpack(sha1fmt * numpar, data[o2:o3])
380 380
381 381 # read metadata
382 382 off = o3 + metasize * nummeta
383 383 metapairsize = unpack('>' + (metafmt * nummeta), data[o3:off])
384 384 metadata = []
385 385 for idx in xrange(0, len(metapairsize), 2):
386 386 o1 = off + metapairsize[idx]
387 387 o2 = o1 + metapairsize[idx + 1]
388 388 metadata.append((data[off:o1], data[o1:o2]))
389 389 off = o2
390 390
391 391 yield (prec, sucs, flags, tuple(metadata), (secs, tz * 60), parents)
392 392
393 393 def _fm1encodeonemarker(marker):
394 394 pre, sucs, flags, metadata, date, parents = marker
395 395 # determine node size
396 396 _fm1node = _fm1nodesha1
397 397 if flags & usingsha256:
398 398 _fm1node = _fm1nodesha256
399 399 numsuc = len(sucs)
400 400 numextranodes = numsuc
401 401 if parents is None:
402 402 numpar = _fm1parentnone
403 403 else:
404 404 numpar = len(parents)
405 405 numextranodes += numpar
406 406 formatnodes = _fm1node * numextranodes
407 407 formatmeta = _fm1metapair * len(metadata)
408 408 format = _fm1fixed + formatnodes + formatmeta
409 409 # tz is stored in minutes so we divide by 60
410 410 tz = date[1]//60
411 411 data = [None, date[0], tz, flags, numsuc, numpar, len(metadata), pre]
412 412 data.extend(sucs)
413 413 if parents is not None:
414 414 data.extend(parents)
415 415 totalsize = _calcsize(format)
416 416 for key, value in metadata:
417 417 lk = len(key)
418 418 lv = len(value)
419 419 if lk > 255:
420 420 msg = ('obsstore metadata key cannot be longer than 255 bytes'
421 421 ' (key "%s" is %u bytes)') % (key, lk)
422 422 raise error.ProgrammingError(msg)
423 423 if lv > 255:
424 424 msg = ('obsstore metadata value cannot be longer than 255 bytes'
425 425 ' (value "%s" for key "%s" is %u bytes)') % (value, key, lv)
426 426 raise error.ProgrammingError(msg)
427 427 data.append(lk)
428 428 data.append(lv)
429 429 totalsize += lk + lv
430 430 data[0] = totalsize
431 431 data = [_pack(format, *data)]
432 432 for key, value in metadata:
433 433 data.append(key)
434 434 data.append(value)
435 435 return ''.join(data)
436 436
437 437 def _fm1readmarkers(data, off, stop):
438 438 native = getattr(parsers, 'fm1readmarkers', None)
439 439 if not native:
440 440 return _fm1purereadmarkers(data, off, stop)
441 441 return native(data, off, stop)
442 442
443 443 # mapping to read/write various marker formats
444 444 # <version> -> (decoder, encoder)
445 445 formats = {_fm0version: (_fm0readmarkers, _fm0encodeonemarker),
446 446 _fm1version: (_fm1readmarkers, _fm1encodeonemarker)}
447 447
448 448 def _readmarkerversion(data):
449 449 return _unpack('>B', data[0:1])[0]
450 450
451 451 @util.nogc
452 452 def _readmarkers(data, off=None, stop=None):
453 453 """Read and enumerate markers from raw data"""
454 454 diskversion = _readmarkerversion(data)
455 455 if not off:
456 456 off = 1 # skip 1 byte version number
457 457 if stop is None:
458 458 stop = len(data)
459 459 if diskversion not in formats:
460 460 msg = _('parsing obsolete marker: unknown version %r') % diskversion
461 461 raise error.UnknownVersion(msg, version=diskversion)
462 462 return diskversion, formats[diskversion][0](data, off, stop)
463 463
464 464 def encodeheader(version=_fm0version):
465 465 return _pack('>B', version)
466 466
467 467 def encodemarkers(markers, addheader=False, version=_fm0version):
468 468 # Kept separate from flushmarkers(), it will be reused for
469 469 # markers exchange.
470 470 encodeone = formats[version][1]
471 471 if addheader:
472 472 yield encodeheader(version)
473 473 for marker in markers:
474 474 yield encodeone(marker)
475 475
476 476 @util.nogc
477 477 def _addsuccessors(successors, markers):
478 478 for mark in markers:
479 479 successors.setdefault(mark[0], set()).add(mark)
480 480
481 481 def _addprecursors(*args, **kwargs):
482 482 msg = ("'obsolete._addprecursors' is deprecated, "
483 483 "use 'obsolete._addpredecessors'")
484 484 util.nouideprecwarn(msg, '4.4')
485 485
486 486 return _addpredecessors(*args, **kwargs)
487 487
488 488 @util.nogc
489 489 def _addpredecessors(predecessors, markers):
490 490 for mark in markers:
491 491 for suc in mark[1]:
492 492 predecessors.setdefault(suc, set()).add(mark)
493 493
494 494 @util.nogc
495 495 def _addchildren(children, markers):
496 496 for mark in markers:
497 497 parents = mark[5]
498 498 if parents is not None:
499 499 for p in parents:
500 500 children.setdefault(p, set()).add(mark)
501 501
502 502 def _checkinvalidmarkers(markers):
503 503 """search for marker with invalid data and raise error if needed
504 504
505 505 Exist as a separated function to allow the evolve extension for a more
506 506 subtle handling.
507 507 """
508 508 for mark in markers:
509 509 if node.nullid in mark[1]:
510 510 raise error.Abort(_('bad obsolescence marker detected: '
511 511 'invalid successors nullid'))
512 512
513 513 class obsstore(object):
514 514 """Store obsolete markers
515 515
516 516 Markers can be accessed with two mappings:
517 517 - predecessors[x] -> set(markers on predecessors edges of x)
518 518 - successors[x] -> set(markers on successors edges of x)
519 519 - children[x] -> set(markers on predecessors edges of children(x)
520 520 """
521 521
522 522 fields = ('prec', 'succs', 'flag', 'meta', 'date', 'parents')
523 523 # prec: nodeid, predecessors changesets
524 524 # succs: tuple of nodeid, successor changesets (0-N length)
525 525 # flag: integer, flag field carrying modifier for the markers (see doc)
526 526 # meta: binary blob, encoded metadata dictionary
527 527 # date: (float, int) tuple, date of marker creation
528 528 # parents: (tuple of nodeid) or None, parents of predecessors
529 529 # None is used when no data has been recorded
530 530
531 531 def __init__(self, svfs, defaultformat=_fm1version, readonly=False):
532 532 # caches for various obsolescence related cache
533 533 self.caches = {}
534 534 self.svfs = svfs
535 535 self._defaultformat = defaultformat
536 536 self._readonly = readonly
537 537
538 538 def __iter__(self):
539 539 return iter(self._all)
540 540
541 541 def __len__(self):
542 542 return len(self._all)
543 543
544 544 def __nonzero__(self):
545 545 if not self._cached('_all'):
546 546 try:
547 547 return self.svfs.stat('obsstore').st_size > 1
548 548 except OSError as inst:
549 549 if inst.errno != errno.ENOENT:
550 550 raise
551 551 # just build an empty _all list if no obsstore exists, which
552 552 # avoids further stat() syscalls
553 553 return bool(self._all)
554 554
555 555 __bool__ = __nonzero__
556 556
557 557 @property
558 558 def readonly(self):
559 559 """True if marker creation is disabled
560 560
561 561 Remove me in the future when obsolete marker is always on."""
562 562 return self._readonly
563 563
564 564 def create(self, transaction, prec, succs=(), flag=0, parents=None,
565 565 date=None, metadata=None, ui=None):
566 566 """obsolete: add a new obsolete marker
567 567
568 568 * ensuring it is hashable
569 569 * check mandatory metadata
570 570 * encode metadata
571 571
572 572 If you are a human writing code creating marker you want to use the
573 573 `createmarkers` function in this module instead.
574 574
575 575 return True if a new marker have been added, False if the markers
576 576 already existed (no op).
577 577 """
578 578 if metadata is None:
579 579 metadata = {}
580 580 if date is None:
581 581 if 'date' in metadata:
582 582 # as a courtesy for out-of-tree extensions
583 583 date = util.parsedate(metadata.pop('date'))
584 584 elif ui is not None:
585 585 date = ui.configdate('devel', 'default-date')
586 586 if date is None:
587 587 date = util.makedate()
588 588 else:
589 589 date = util.makedate()
590 590 if len(prec) != 20:
591 591 raise ValueError(prec)
592 592 for succ in succs:
593 593 if len(succ) != 20:
594 594 raise ValueError(succ)
595 595 if prec in succs:
596 596 raise ValueError(_('in-marker cycle with %s') % node.hex(prec))
597 597
598 598 metadata = tuple(sorted(metadata.iteritems()))
599 599
600 600 marker = (bytes(prec), tuple(succs), int(flag), metadata, date, parents)
601 601 return bool(self.add(transaction, [marker]))
602 602
603 603 def add(self, transaction, markers):
604 604 """Add new markers to the store
605 605
606 606 Take care of filtering duplicate.
607 607 Return the number of new marker."""
608 608 if self._readonly:
609 609 raise error.Abort(_('creating obsolete markers is not enabled on '
610 610 'this repo'))
611 611 known = set()
612 612 getsuccessors = self.successors.get
613 613 new = []
614 614 for m in markers:
615 615 if m not in getsuccessors(m[0], ()) and m not in known:
616 616 known.add(m)
617 617 new.append(m)
618 618 if new:
619 619 f = self.svfs('obsstore', 'ab')
620 620 try:
621 621 offset = f.tell()
622 622 transaction.add('obsstore', offset)
623 623 # offset == 0: new file - add the version header
624 624 data = b''.join(encodemarkers(new, offset == 0, self._version))
625 625 f.write(data)
626 626 finally:
627 627 # XXX: f.close() == filecache invalidation == obsstore rebuilt.
628 628 # call 'filecacheentry.refresh()' here
629 629 f.close()
630 630 addedmarkers = transaction.changes.get('obsmarkers')
631 631 if addedmarkers is not None:
632 632 addedmarkers.update(new)
633 633 self._addmarkers(new, data)
634 634 # new marker *may* have changed several set. invalidate the cache.
635 635 self.caches.clear()
636 636 # records the number of new markers for the transaction hooks
637 637 previous = int(transaction.hookargs.get('new_obsmarkers', '0'))
638 638 transaction.hookargs['new_obsmarkers'] = str(previous + len(new))
639 639 return len(new)
640 640
641 641 def mergemarkers(self, transaction, data):
642 642 """merge a binary stream of markers inside the obsstore
643 643
644 644 Returns the number of new markers added."""
645 645 version, markers = _readmarkers(data)
646 646 return self.add(transaction, markers)
647 647
648 648 @propertycache
649 649 def _data(self):
650 650 return self.svfs.tryread('obsstore')
651 651
652 652 @propertycache
653 653 def _version(self):
654 654 if len(self._data) >= 1:
655 655 return _readmarkerversion(self._data)
656 656 else:
657 657 return self._defaultformat
658 658
659 659 @propertycache
660 660 def _all(self):
661 661 data = self._data
662 662 if not data:
663 663 return []
664 664 self._version, markers = _readmarkers(data)
665 665 markers = list(markers)
666 666 _checkinvalidmarkers(markers)
667 667 return markers
668 668
669 669 @propertycache
670 670 def successors(self):
671 671 successors = {}
672 672 _addsuccessors(successors, self._all)
673 673 return successors
674 674
675 675 @property
676 676 def precursors(self):
677 677 msg = ("'obsstore.precursors' is deprecated, "
678 678 "use 'obsstore.predecessors'")
679 679 util.nouideprecwarn(msg, '4.4')
680 680
681 681 return self.predecessors
682 682
683 683 @propertycache
684 684 def predecessors(self):
685 685 predecessors = {}
686 686 _addpredecessors(predecessors, self._all)
687 687 return predecessors
688 688
689 689 @propertycache
690 690 def children(self):
691 691 children = {}
692 692 _addchildren(children, self._all)
693 693 return children
694 694
695 695 def _cached(self, attr):
696 696 return attr in self.__dict__
697 697
698 698 def _addmarkers(self, markers, rawdata):
699 699 markers = list(markers) # to allow repeated iteration
700 700 self._data = self._data + rawdata
701 701 self._all.extend(markers)
702 702 if self._cached('successors'):
703 703 _addsuccessors(self.successors, markers)
704 704 if self._cached('predecessors'):
705 705 _addpredecessors(self.predecessors, markers)
706 706 if self._cached('children'):
707 707 _addchildren(self.children, markers)
708 708 _checkinvalidmarkers(markers)
709 709
710 710 def relevantmarkers(self, nodes):
711 711 """return a set of all obsolescence markers relevant to a set of nodes.
712 712
713 713 "relevant" to a set of nodes mean:
714 714
715 715 - marker that use this changeset as successor
716 716 - prune marker of direct children on this changeset
717 717 - recursive application of the two rules on predecessors of these
718 718 markers
719 719
720 720 It is a set so you cannot rely on order."""
721 721
722 722 pendingnodes = set(nodes)
723 723 seenmarkers = set()
724 724 seennodes = set(pendingnodes)
725 725 precursorsmarkers = self.predecessors
726 726 succsmarkers = self.successors
727 727 children = self.children
728 728 while pendingnodes:
729 729 direct = set()
730 730 for current in pendingnodes:
731 731 direct.update(precursorsmarkers.get(current, ()))
732 732 pruned = [m for m in children.get(current, ()) if not m[1]]
733 733 direct.update(pruned)
734 734 pruned = [m for m in succsmarkers.get(current, ()) if not m[1]]
735 735 direct.update(pruned)
736 736 direct -= seenmarkers
737 737 pendingnodes = set([m[0] for m in direct])
738 738 seenmarkers |= direct
739 739 pendingnodes -= seennodes
740 740 seennodes |= pendingnodes
741 741 return seenmarkers
742 742
743 743 def makestore(ui, repo):
744 744 """Create an obsstore instance from a repo."""
745 745 # read default format for new obsstore.
746 746 # developer config: format.obsstore-version
747 747 defaultformat = ui.configint('format', 'obsstore-version')
748 748 # rely on obsstore class default when possible.
749 749 kwargs = {}
750 750 if defaultformat is not None:
751 751 kwargs['defaultformat'] = defaultformat
752 752 readonly = not isenabled(repo, createmarkersopt)
753 753 store = obsstore(repo.svfs, readonly=readonly, **kwargs)
754 754 if store and readonly:
755 755 ui.warn(_('obsolete feature not enabled but %i markers found!\n')
756 756 % len(list(store)))
757 757 return store
758 758
759 759 def commonversion(versions):
760 760 """Return the newest version listed in both versions and our local formats.
761 761
762 762 Returns None if no common version exists.
763 763 """
764 764 versions.sort(reverse=True)
765 765 # search for highest version known on both side
766 766 for v in versions:
767 767 if v in formats:
768 768 return v
769 769 return None
770 770
771 771 # arbitrary picked to fit into 8K limit from HTTP server
772 772 # you have to take in account:
773 773 # - the version header
774 774 # - the base85 encoding
775 775 _maxpayload = 5300
776 776
777 777 def _pushkeyescape(markers):
778 778 """encode markers into a dict suitable for pushkey exchange
779 779
780 780 - binary data is base85 encoded
781 781 - split in chunks smaller than 5300 bytes"""
782 782 keys = {}
783 783 parts = []
784 784 currentlen = _maxpayload * 2 # ensure we create a new part
785 785 for marker in markers:
786 786 nextdata = _fm0encodeonemarker(marker)
787 787 if (len(nextdata) + currentlen > _maxpayload):
788 788 currentpart = []
789 789 currentlen = 0
790 790 parts.append(currentpart)
791 791 currentpart.append(nextdata)
792 792 currentlen += len(nextdata)
793 793 for idx, part in enumerate(reversed(parts)):
794 794 data = ''.join([_pack('>B', _fm0version)] + part)
795 795 keys['dump%i' % idx] = util.b85encode(data)
796 796 return keys
797 797
798 798 def listmarkers(repo):
799 799 """List markers over pushkey"""
800 800 if not repo.obsstore:
801 801 return {}
802 802 return _pushkeyescape(sorted(repo.obsstore))
803 803
804 804 def pushmarker(repo, key, old, new):
805 805 """Push markers over pushkey"""
806 806 if not key.startswith('dump'):
807 807 repo.ui.warn(_('unknown key: %r') % key)
808 808 return False
809 809 if old:
810 810 repo.ui.warn(_('unexpected old value for %r') % key)
811 811 return False
812 812 data = util.b85decode(new)
813 813 lock = repo.lock()
814 814 try:
815 815 tr = repo.transaction('pushkey: obsolete markers')
816 816 try:
817 817 repo.obsstore.mergemarkers(tr, data)
818 818 repo.invalidatevolatilesets()
819 819 tr.close()
820 820 return True
821 821 finally:
822 822 tr.release()
823 823 finally:
824 824 lock.release()
825 825
826 826 # keep compatibility for the 4.3 cycle
827 827 def allprecursors(obsstore, nodes, ignoreflags=0):
828 828 movemsg = 'obsolete.allprecursors moved to obsutil.allprecursors'
829 829 util.nouideprecwarn(movemsg, '4.3')
830 830 return obsutil.allprecursors(obsstore, nodes, ignoreflags)
831 831
832 832 def allsuccessors(obsstore, nodes, ignoreflags=0):
833 833 movemsg = 'obsolete.allsuccessors moved to obsutil.allsuccessors'
834 834 util.nouideprecwarn(movemsg, '4.3')
835 835 return obsutil.allsuccessors(obsstore, nodes, ignoreflags)
836 836
837 837 def marker(repo, data):
838 838 movemsg = 'obsolete.marker moved to obsutil.marker'
839 839 repo.ui.deprecwarn(movemsg, '4.3')
840 840 return obsutil.marker(repo, data)
841 841
842 842 def getmarkers(repo, nodes=None, exclusive=False):
843 843 movemsg = 'obsolete.getmarkers moved to obsutil.getmarkers'
844 844 repo.ui.deprecwarn(movemsg, '4.3')
845 845 return obsutil.getmarkers(repo, nodes=nodes, exclusive=exclusive)
846 846
847 847 def exclusivemarkers(repo, nodes):
848 848 movemsg = 'obsolete.exclusivemarkers moved to obsutil.exclusivemarkers'
849 849 repo.ui.deprecwarn(movemsg, '4.3')
850 850 return obsutil.exclusivemarkers(repo, nodes)
851 851
852 852 def foreground(repo, nodes):
853 853 movemsg = 'obsolete.foreground moved to obsutil.foreground'
854 854 repo.ui.deprecwarn(movemsg, '4.3')
855 855 return obsutil.foreground(repo, nodes)
856 856
857 857 def successorssets(repo, initialnode, cache=None):
858 858 movemsg = 'obsolete.successorssets moved to obsutil.successorssets'
859 859 repo.ui.deprecwarn(movemsg, '4.3')
860 860 return obsutil.successorssets(repo, initialnode, cache=cache)
861 861
862 862 # mapping of 'set-name' -> <function to compute this set>
863 863 cachefuncs = {}
864 864 def cachefor(name):
865 865 """Decorator to register a function as computing the cache for a set"""
866 866 def decorator(func):
867 867 if name in cachefuncs:
868 868 msg = "duplicated registration for volatileset '%s' (existing: %r)"
869 869 raise error.ProgrammingError(msg % (name, cachefuncs[name]))
870 870 cachefuncs[name] = func
871 871 return func
872 872 return decorator
873 873
874 874 def getrevs(repo, name):
875 875 """Return the set of revision that belong to the <name> set
876 876
877 877 Such access may compute the set and cache it for future use"""
878 878 repo = repo.unfiltered()
879 879 if not repo.obsstore:
880 880 return frozenset()
881 881 if name not in repo.obsstore.caches:
882 882 repo.obsstore.caches[name] = cachefuncs[name](repo)
883 883 return repo.obsstore.caches[name]
884 884
885 885 # To be simple we need to invalidate obsolescence cache when:
886 886 #
887 887 # - new changeset is added:
888 888 # - public phase is changed
889 889 # - obsolescence marker are added
890 890 # - strip is used a repo
891 891 def clearobscaches(repo):
892 892 """Remove all obsolescence related cache from a repo
893 893
894 894 This remove all cache in obsstore is the obsstore already exist on the
895 895 repo.
896 896
897 897 (We could be smarter here given the exact event that trigger the cache
898 898 clearing)"""
899 899 # only clear cache is there is obsstore data in this repo
900 900 if 'obsstore' in repo._filecache:
901 901 repo.obsstore.caches.clear()
902 902
903 903 def _mutablerevs(repo):
904 904 """the set of mutable revision in the repository"""
905 905 return repo._phasecache.getrevset(repo, (phases.draft, phases.secret))
906 906
907 907 @cachefor('obsolete')
908 908 def _computeobsoleteset(repo):
909 909 """the set of obsolete revisions"""
910 910 getnode = repo.changelog.node
911 911 notpublic = _mutablerevs(repo)
912 912 isobs = repo.obsstore.successors.__contains__
913 913 obs = set(r for r in notpublic if isobs(getnode(r)))
914 914 return obs
915 915
916 916 @cachefor('unstable')
917 917 def _computeunstableset(repo):
918 918 msg = ("'unstable' volatile set is deprecated, "
919 919 "use 'orphan'")
920 920 repo.ui.deprecwarn(msg, '4.4')
921 921
922 922 return _computeorphanset(repo)
923 923
924 924 @cachefor('orphan')
925 925 def _computeorphanset(repo):
926 926 """the set of non obsolete revisions with obsolete parents"""
927 927 pfunc = repo.changelog.parentrevs
928 928 mutable = _mutablerevs(repo)
929 929 obsolete = getrevs(repo, 'obsolete')
930 930 others = mutable - obsolete
931 931 unstable = set()
932 932 for r in sorted(others):
933 933 # A rev is unstable if one of its parent is obsolete or unstable
934 934 # this works since we traverse following growing rev order
935 935 for p in pfunc(r):
936 936 if p in obsolete or p in unstable:
937 937 unstable.add(r)
938 938 break
939 939 return unstable
940 940
941 941 @cachefor('suspended')
942 942 def _computesuspendedset(repo):
943 943 """the set of obsolete parents with non obsolete descendants"""
944 944 suspended = repo.changelog.ancestors(getrevs(repo, 'orphan'))
945 945 return set(r for r in getrevs(repo, 'obsolete') if r in suspended)
946 946
947 947 @cachefor('extinct')
948 948 def _computeextinctset(repo):
949 949 """the set of obsolete parents without non obsolete descendants"""
950 950 return getrevs(repo, 'obsolete') - getrevs(repo, 'suspended')
951 951
952 952 @cachefor('bumped')
953 953 def _computebumpedset(repo):
954 954 msg = ("'bumped' volatile set is deprecated, "
955 955 "use 'phasedivergent'")
956 956 repo.ui.deprecwarn(msg, '4.4')
957 957
958 958 return _computephasedivergentset(repo)
959 959
960 960 @cachefor('phasedivergent')
961 961 def _computephasedivergentset(repo):
962 962 """the set of revs trying to obsolete public revisions"""
963 963 bumped = set()
964 964 # util function (avoid attribute lookup in the loop)
965 965 phase = repo._phasecache.phase # would be faster to grab the full list
966 966 public = phases.public
967 967 cl = repo.changelog
968 968 torev = cl.nodemap.get
969 969 for ctx in repo.set('(not public()) and (not obsolete())'):
970 970 rev = ctx.rev()
971 971 # We only evaluate mutable, non-obsolete revision
972 972 node = ctx.node()
973 973 # (future) A cache of predecessors may worth if split is very common
974 974 for pnode in obsutil.allpredecessors(repo.obsstore, [node],
975 975 ignoreflags=bumpedfix):
976 976 prev = torev(pnode) # unfiltered! but so is phasecache
977 977 if (prev is not None) and (phase(repo, prev) <= public):
978 978 # we have a public predecessor
979 979 bumped.add(rev)
980 980 break # Next draft!
981 981 return bumped
982 982
983 983 @cachefor('divergent')
984 984 def _computedivergentset(repo):
985 985 msg = ("'divergent' volatile set is deprecated, "
986 986 "use 'contentdivergent'")
987 987 repo.ui.deprecwarn(msg, '4.4')
988 988
989 989 return _computecontentdivergentset(repo)
990 990
991 991 @cachefor('contentdivergent')
992 992 def _computecontentdivergentset(repo):
993 993 """the set of rev that compete to be the final successors of some revision.
994 994 """
995 995 divergent = set()
996 996 obsstore = repo.obsstore
997 997 newermap = {}
998 998 for ctx in repo.set('(not public()) - obsolete()'):
999 999 mark = obsstore.predecessors.get(ctx.node(), ())
1000 1000 toprocess = set(mark)
1001 1001 seen = set()
1002 1002 while toprocess:
1003 1003 prec = toprocess.pop()[0]
1004 1004 if prec in seen:
1005 1005 continue # emergency cycle hanging prevention
1006 1006 seen.add(prec)
1007 1007 if prec not in newermap:
1008 1008 obsutil.successorssets(repo, prec, cache=newermap)
1009 1009 newer = [n for n in newermap[prec] if n]
1010 1010 if len(newer) > 1:
1011 1011 divergent.add(ctx.rev())
1012 1012 break
1013 1013 toprocess.update(obsstore.predecessors.get(prec, ()))
1014 1014 return divergent
1015 1015
1016 1016
1017 1017 def createmarkers(repo, relations, flag=0, date=None, metadata=None,
1018 1018 operation=None):
1019 1019 """Add obsolete markers between changesets in a repo
1020 1020
1021 1021 <relations> must be an iterable of (<old>, (<new>, ...)[,{metadata}])
1022 1022 tuple. `old` and `news` are changectx. metadata is an optional dictionary
1023 1023 containing metadata for this marker only. It is merged with the global
1024 1024 metadata specified through the `metadata` argument of this function,
1025 1025
1026 1026 Trying to obsolete a public changeset will raise an exception.
1027 1027
1028 1028 Current user and date are used except if specified otherwise in the
1029 1029 metadata attribute.
1030 1030
1031 1031 This function operates within a transaction of its own, but does
1032 1032 not take any lock on the repo.
1033 1033 """
1034 1034 # prepare metadata
1035 1035 if metadata is None:
1036 1036 metadata = {}
1037 1037 if 'user' not in metadata:
1038 metadata['user'] = repo.ui.username()
1038 develuser = repo.ui.config('devel', 'user.obsmarker')
1039 if develuser:
1040 metadata['user'] = develuser
1041 else:
1042 metadata['user'] = repo.ui.username()
1039 1043
1040 1044 # Operation metadata handling
1041 1045 useoperation = repo.ui.configbool('experimental',
1042 1046 'stabilization.track-operation')
1043 1047 if useoperation and operation:
1044 1048 metadata['operation'] = operation
1045 1049
1046 1050 # Effect flag metadata handling
1047 1051 saveeffectflag = repo.ui.configbool('experimental',
1048 1052 'effect-flags',
1049 1053 False)
1050 1054
1051 1055 tr = repo.transaction('add-obsolescence-marker')
1052 1056 try:
1053 1057 markerargs = []
1054 1058 for rel in relations:
1055 1059 prec = rel[0]
1056 1060 sucs = rel[1]
1057 1061 localmetadata = metadata.copy()
1058 1062 if 2 < len(rel):
1059 1063 localmetadata.update(rel[2])
1060 1064
1061 1065 if not prec.mutable():
1062 1066 raise error.Abort(_("cannot obsolete public changeset: %s")
1063 1067 % prec,
1064 1068 hint="see 'hg help phases' for details")
1065 1069 nprec = prec.node()
1066 1070 nsucs = tuple(s.node() for s in sucs)
1067 1071 npare = None
1068 1072 if not nsucs:
1069 1073 npare = tuple(p.node() for p in prec.parents())
1070 1074 if nprec in nsucs:
1071 1075 raise error.Abort(_("changeset %s cannot obsolete itself")
1072 1076 % prec)
1073 1077
1074 1078 # Effect flag can be different by relation
1075 1079 if saveeffectflag:
1076 1080 # The effect flag is saved in a versioned field name for future
1077 1081 # evolution
1078 1082 effectflag = obsutil.geteffectflag(rel)
1079 1083 localmetadata[obsutil.EFFECTFLAGFIELD] = "%d" % effectflag
1080 1084
1081 1085 # Creating the marker causes the hidden cache to become invalid,
1082 1086 # which causes recomputation when we ask for prec.parents() above.
1083 1087 # Resulting in n^2 behavior. So let's prepare all of the args
1084 1088 # first, then create the markers.
1085 1089 markerargs.append((nprec, nsucs, npare, localmetadata))
1086 1090
1087 1091 for args in markerargs:
1088 1092 nprec, nsucs, npare, localmetadata = args
1089 1093 repo.obsstore.create(tr, nprec, nsucs, flag, parents=npare,
1090 1094 date=date, metadata=localmetadata,
1091 1095 ui=repo.ui)
1092 1096 repo.filteredrevcache.clear()
1093 1097 tr.close()
1094 1098 finally:
1095 1099 tr.release()
@@ -1,1766 +1,1766 b''
1 1 This test file test the various templates related to obsmarkers.
2 2
3 3 Global setup
4 4 ============
5 5
6 6 $ . $TESTDIR/testlib/obsmarker-common.sh
7 7 $ cat >> $HGRCPATH <<EOF
8 8 > [ui]
9 9 > interactive = true
10 10 > [phases]
11 11 > publish=False
12 12 > [experimental]
13 13 > stabilization=all
14 14 > [templates]
15 15 > obsfatesuccessors = "{if(successors, " as ")}{join(successors, ", ")}"
16 16 > obsfateverb = "{obsfateverb(successors)}"
17 17 > obsfateoperations = "{if(obsfateoperations(markers), " using {join(obsfateoperations(markers), ", ")}")}"
18 18 > obsfateusers = "{if(obsfateusers(markers), " by {join(obsfateusers(markers), ", ")}")}"
19 19 > obsfatedate = "{if(obsfatedate(markers), "{ifeq(min(obsfatedate(markers)), max(obsfatedate(markers)), " (at {min(obsfatedate(markers))|isodate})", " (between {min(obsfatedate(markers))|isodate} and {max(obsfatedate(markers))|isodate})")}")}"
20 20 > obsfate = "{obsfateverb}{obsfateoperations}{obsfatesuccessors}{obsfateusers}{obsfatedate}; "
21 21 > [alias]
22 22 > tlog = log -G -T '{node|short}\
23 23 > {if(predecessors, "\n Predecessors: {predecessors}")}\
24 24 > {if(predecessors, "\n semi-colon: {join(predecessors, "; ")}")}\
25 25 > {if(predecessors, "\n json: {predecessors|json}")}\
26 26 > {if(predecessors, "\n map: {join(predecessors % "{rev}:{node}", " ")}")}\
27 27 > {if(successorssets, "\n Successors: {successorssets}")}\
28 28 > {if(successorssets, "\n multi-line: {join(successorssets, "\n multi-line: ")}")}\
29 29 > {if(successorssets, "\n json: {successorssets|json}")}\n'
30 30 > fatelog = log -G -T '{node|short}\n{if(succsandmarkers, " Obsfate: {succsandmarkers % "{obsfate}"} \n" )}'
31 31 > fatelogjson = log -G -T '{node|short}\n{if(succsandmarkers, " Obsfate: {succsandmarkers|json}\n")}'
32 32 > EOF
33 33
34 34 Test templates on amended commit
35 35 ================================
36 36
37 37 Test setup
38 38 ----------
39 39
40 40 $ hg init $TESTTMP/templates-local-amend
41 41 $ cd $TESTTMP/templates-local-amend
42 42 $ mkcommit ROOT
43 43 $ mkcommit A0
44 44 $ echo 42 >> A0
45 $ HGUSER=test1 hg commit --amend -m "A1" --config devel.default-date="1234567890 0"
46 $ HGUSER=test2 hg commit --amend -m "A2" --config devel.default-date="987654321 0"
45 $ hg commit --amend -m "A1" --config devel.default-date="1234567890 0" --config devel.user.obsmarker=test1
46 $ hg commit --amend -m "A2" --config devel.default-date="987654321 0" --config devel.user.obsmarker=test2
47 47
48 48 $ hg log --hidden -G
49 49 @ changeset: 3:d004c8f274b9
50 50 | tag: tip
51 51 | parent: 0:ea207398892e
52 52 | user: test
53 53 | date: Thu Jan 01 00:00:00 1970 +0000
54 54 | summary: A2
55 55 |
56 56 | x changeset: 2:a468dc9b3633
57 57 |/ parent: 0:ea207398892e
58 58 | user: test
59 59 | date: Thu Jan 01 00:00:00 1970 +0000
60 60 | summary: A1
61 61 |
62 62 | x changeset: 1:471f378eab4c
63 63 |/ user: test
64 64 | date: Thu Jan 01 00:00:00 1970 +0000
65 65 | summary: A0
66 66 |
67 67 o changeset: 0:ea207398892e
68 68 user: test
69 69 date: Thu Jan 01 00:00:00 1970 +0000
70 70 summary: ROOT
71 71
72 72 Check templates
73 73 ---------------
74 74 $ hg up 'desc(A0)' --hidden
75 75 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
76 76
77 77 Predecessors template should show current revision as it is the working copy
78 78 $ hg tlog
79 79 o d004c8f274b9
80 80 | Predecessors: 1:471f378eab4c
81 81 | semi-colon: 1:471f378eab4c
82 82 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
83 83 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
84 84 | @ 471f378eab4c
85 85 |/ Successors: 3:d004c8f274b9
86 86 | multi-line: 3:d004c8f274b9
87 87 | json: [["d004c8f274b9ec480a47a93c10dac5eee63adb78"]]
88 88 o ea207398892e
89 89
90 90 $ hg fatelog -q --traceback
91 91 o d004c8f274b9
92 92 |
93 93 | @ 471f378eab4c
94 94 |/ Obsfate: rewritten using amend as 3:d004c8f274b9 by test1, test2 (between 2001-04-19 04:25 +0000 and 2009-02-13 23:31 +0000);
95 95 o ea207398892e
96 96
97 97 $ hg fatelog
98 98 o d004c8f274b9
99 99 |
100 100 | @ 471f378eab4c
101 101 |/ Obsfate: rewritten using amend as 3:d004c8f274b9 by test1, test2 (between 2001-04-19 04:25 +0000 and 2009-02-13 23:31 +0000);
102 102 o ea207398892e
103 103
104 104 $ hg fatelog -v
105 105 o d004c8f274b9
106 106 |
107 107 | @ 471f378eab4c
108 108 |/ Obsfate: rewritten using amend as 3:d004c8f274b9 by test1, test2 (between 2001-04-19 04:25 +0000 and 2009-02-13 23:31 +0000);
109 109 o ea207398892e
110 110
111 111 $ hg up 'desc(A1)' --hidden
112 112 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
113 113
114 114 Predecessors template should show current revision as it is the working copy
115 115 $ hg tlog
116 116 o d004c8f274b9
117 117 | Predecessors: 2:a468dc9b3633
118 118 | semi-colon: 2:a468dc9b3633
119 119 | json: ["a468dc9b36338b14fdb7825f55ce3df4e71517ad"]
120 120 | map: 2:a468dc9b36338b14fdb7825f55ce3df4e71517ad
121 121 | @ a468dc9b3633
122 122 |/ Successors: 3:d004c8f274b9
123 123 | multi-line: 3:d004c8f274b9
124 124 | json: [["d004c8f274b9ec480a47a93c10dac5eee63adb78"]]
125 125 o ea207398892e
126 126
127 127 $ hg fatelog -v
128 128 o d004c8f274b9
129 129 |
130 130 | @ a468dc9b3633
131 131 |/ Obsfate: rewritten using amend as 3:d004c8f274b9 by test2 (at 2001-04-19 04:25 +0000);
132 132 o ea207398892e
133 133
134 134 Predecessors template should show all the predecessors as we force their display
135 135 with --hidden
136 136 $ hg tlog --hidden
137 137 o d004c8f274b9
138 138 | Predecessors: 2:a468dc9b3633
139 139 | semi-colon: 2:a468dc9b3633
140 140 | json: ["a468dc9b36338b14fdb7825f55ce3df4e71517ad"]
141 141 | map: 2:a468dc9b36338b14fdb7825f55ce3df4e71517ad
142 142 | @ a468dc9b3633
143 143 |/ Predecessors: 1:471f378eab4c
144 144 | semi-colon: 1:471f378eab4c
145 145 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
146 146 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
147 147 | Successors: 3:d004c8f274b9
148 148 | multi-line: 3:d004c8f274b9
149 149 | json: [["d004c8f274b9ec480a47a93c10dac5eee63adb78"]]
150 150 | x 471f378eab4c
151 151 |/ Successors: 2:a468dc9b3633
152 152 | multi-line: 2:a468dc9b3633
153 153 | json: [["a468dc9b36338b14fdb7825f55ce3df4e71517ad"]]
154 154 o ea207398892e
155 155
156 156 $ hg fatelog --hidden -q
157 157 o d004c8f274b9
158 158 |
159 159 | @ a468dc9b3633
160 160 |/ Obsfate: rewritten using amend as 3:d004c8f274b9 by test2 (at 2001-04-19 04:25 +0000);
161 161 | x 471f378eab4c
162 162 |/ Obsfate: rewritten using amend as 2:a468dc9b3633 by test1 (at 2009-02-13 23:31 +0000);
163 163 o ea207398892e
164 164
165 165
166 166 Predecessors template shouldn't show anything as all obsolete commit are not
167 167 visible.
168 168 $ hg up 'desc(A2)'
169 169 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
170 170 $ hg tlog
171 171 @ d004c8f274b9
172 172 |
173 173 o ea207398892e
174 174
175 175 $ hg tlog --hidden
176 176 @ d004c8f274b9
177 177 | Predecessors: 2:a468dc9b3633
178 178 | semi-colon: 2:a468dc9b3633
179 179 | json: ["a468dc9b36338b14fdb7825f55ce3df4e71517ad"]
180 180 | map: 2:a468dc9b36338b14fdb7825f55ce3df4e71517ad
181 181 | x a468dc9b3633
182 182 |/ Predecessors: 1:471f378eab4c
183 183 | semi-colon: 1:471f378eab4c
184 184 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
185 185 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
186 186 | Successors: 3:d004c8f274b9
187 187 | multi-line: 3:d004c8f274b9
188 188 | json: [["d004c8f274b9ec480a47a93c10dac5eee63adb78"]]
189 189 | x 471f378eab4c
190 190 |/ Successors: 2:a468dc9b3633
191 191 | multi-line: 2:a468dc9b3633
192 192 | json: [["a468dc9b36338b14fdb7825f55ce3df4e71517ad"]]
193 193 o ea207398892e
194 194
195 195 $ hg fatelog -v
196 196 @ d004c8f274b9
197 197 |
198 198 o ea207398892e
199 199
200 200
201 201 $ hg fatelog -v --hidden
202 202 @ d004c8f274b9
203 203 |
204 204 | x a468dc9b3633
205 205 |/ Obsfate: rewritten using amend as 3:d004c8f274b9 by test2 (at 2001-04-19 04:25 +0000);
206 206 | x 471f378eab4c
207 207 |/ Obsfate: rewritten using amend as 2:a468dc9b3633 by test1 (at 2009-02-13 23:31 +0000);
208 208 o ea207398892e
209 209
210 210 $ hg fatelogjson --hidden
211 211 @ d004c8f274b9
212 212 |
213 213 | x a468dc9b3633
214 214 |/ Obsfate: [{"markers": [["a468dc9b36338b14fdb7825f55ce3df4e71517ad", ["d004c8f274b9ec480a47a93c10dac5eee63adb78"], 0, [["operation", "amend"], ["user", "test2"]], [987654321.0, 0], null]], "successors": ["d004c8f274b9ec480a47a93c10dac5eee63adb78"]}]
215 215 | x 471f378eab4c
216 216 |/ Obsfate: [{"markers": [["471f378eab4c5e25f6c77f785b27c936efb22874", ["a468dc9b36338b14fdb7825f55ce3df4e71517ad"], 0, [["operation", "amend"], ["user", "test1"]], [1234567890.0, 0], null]], "successors": ["a468dc9b36338b14fdb7825f55ce3df4e71517ad"]}]
217 217 o ea207398892e
218 218
219 219 Test templates with splitted commit
220 220 ===================================
221 221
222 222 $ hg init $TESTTMP/templates-local-split
223 223 $ cd $TESTTMP/templates-local-split
224 224 $ mkcommit ROOT
225 225 $ echo 42 >> a
226 226 $ echo 43 >> b
227 227 $ hg commit -A -m "A0"
228 228 adding a
229 229 adding b
230 230 $ hg log --hidden -G
231 231 @ changeset: 1:471597cad322
232 232 | tag: tip
233 233 | user: test
234 234 | date: Thu Jan 01 00:00:00 1970 +0000
235 235 | summary: A0
236 236 |
237 237 o changeset: 0:ea207398892e
238 238 user: test
239 239 date: Thu Jan 01 00:00:00 1970 +0000
240 240 summary: ROOT
241 241
242 242 # Simulate split
243 243 $ hg up -r "desc(ROOT)"
244 244 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
245 245 $ echo 42 >> a
246 246 $ hg commit -A -m "A0"
247 247 adding a
248 248 created new head
249 249 $ echo 43 >> b
250 250 $ hg commit -A -m "A0"
251 251 adding b
252 252 $ hg debugobsolete `getid "1"` `getid "2"` `getid "3"`
253 253 obsoleted 1 changesets
254 254
255 255 $ hg log --hidden -G
256 256 @ changeset: 3:f257fde29c7a
257 257 | tag: tip
258 258 | user: test
259 259 | date: Thu Jan 01 00:00:00 1970 +0000
260 260 | summary: A0
261 261 |
262 262 o changeset: 2:337fec4d2edc
263 263 | parent: 0:ea207398892e
264 264 | user: test
265 265 | date: Thu Jan 01 00:00:00 1970 +0000
266 266 | summary: A0
267 267 |
268 268 | x changeset: 1:471597cad322
269 269 |/ user: test
270 270 | date: Thu Jan 01 00:00:00 1970 +0000
271 271 | summary: A0
272 272 |
273 273 o changeset: 0:ea207398892e
274 274 user: test
275 275 date: Thu Jan 01 00:00:00 1970 +0000
276 276 summary: ROOT
277 277
278 278 Check templates
279 279 ---------------
280 280
281 281 $ hg up 'obsolete()' --hidden
282 282 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
283 283
284 284 Predecessors template should show current revision as it is the working copy
285 285 $ hg tlog
286 286 o f257fde29c7a
287 287 | Predecessors: 1:471597cad322
288 288 | semi-colon: 1:471597cad322
289 289 | json: ["471597cad322d1f659bb169751be9133dad92ef3"]
290 290 | map: 1:471597cad322d1f659bb169751be9133dad92ef3
291 291 o 337fec4d2edc
292 292 | Predecessors: 1:471597cad322
293 293 | semi-colon: 1:471597cad322
294 294 | json: ["471597cad322d1f659bb169751be9133dad92ef3"]
295 295 | map: 1:471597cad322d1f659bb169751be9133dad92ef3
296 296 | @ 471597cad322
297 297 |/ Successors: 2:337fec4d2edc 3:f257fde29c7a
298 298 | multi-line: 2:337fec4d2edc 3:f257fde29c7a
299 299 | json: [["337fec4d2edcf0e7a467e35f818234bc620068b5", "f257fde29c7a847c9b607f6e958656d0df0fb15c"]]
300 300 o ea207398892e
301 301
302 302
303 303 $ hg fatelog
304 304 o f257fde29c7a
305 305 |
306 306 o 337fec4d2edc
307 307 |
308 308 | @ 471597cad322
309 309 |/ Obsfate: split as 2:337fec4d2edc, 3:f257fde29c7a by test (at 1970-01-01 00:00 +0000);
310 310 o ea207398892e
311 311
312 312 $ hg up f257fde29c7a
313 313 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
314 314
315 315 Predecessors template should not show a predecessor as it's not displayed in
316 316 the log
317 317 $ hg tlog
318 318 @ f257fde29c7a
319 319 |
320 320 o 337fec4d2edc
321 321 |
322 322 o ea207398892e
323 323
324 324 Predecessors template should show both predecessors as we force their display
325 325 with --hidden
326 326 $ hg tlog --hidden
327 327 @ f257fde29c7a
328 328 | Predecessors: 1:471597cad322
329 329 | semi-colon: 1:471597cad322
330 330 | json: ["471597cad322d1f659bb169751be9133dad92ef3"]
331 331 | map: 1:471597cad322d1f659bb169751be9133dad92ef3
332 332 o 337fec4d2edc
333 333 | Predecessors: 1:471597cad322
334 334 | semi-colon: 1:471597cad322
335 335 | json: ["471597cad322d1f659bb169751be9133dad92ef3"]
336 336 | map: 1:471597cad322d1f659bb169751be9133dad92ef3
337 337 | x 471597cad322
338 338 |/ Successors: 2:337fec4d2edc 3:f257fde29c7a
339 339 | multi-line: 2:337fec4d2edc 3:f257fde29c7a
340 340 | json: [["337fec4d2edcf0e7a467e35f818234bc620068b5", "f257fde29c7a847c9b607f6e958656d0df0fb15c"]]
341 341 o ea207398892e
342 342
343 343
344 344 $ hg fatelog --hidden
345 345 @ f257fde29c7a
346 346 |
347 347 o 337fec4d2edc
348 348 |
349 349 | x 471597cad322
350 350 |/ Obsfate: split as 2:337fec4d2edc, 3:f257fde29c7a by test (at 1970-01-01 00:00 +0000);
351 351 o ea207398892e
352 352
353 353 $ hg fatelogjson --hidden
354 354 @ f257fde29c7a
355 355 |
356 356 o 337fec4d2edc
357 357 |
358 358 | x 471597cad322
359 359 |/ Obsfate: [{"markers": [["471597cad322d1f659bb169751be9133dad92ef3", ["337fec4d2edcf0e7a467e35f818234bc620068b5", "f257fde29c7a847c9b607f6e958656d0df0fb15c"], 0, [["user", "test"]], [0.0, 0], null]], "successors": ["337fec4d2edcf0e7a467e35f818234bc620068b5", "f257fde29c7a847c9b607f6e958656d0df0fb15c"]}]
360 360 o ea207398892e
361 361
362 362 Test templates with folded commit
363 363 =================================
364 364
365 365 Test setup
366 366 ----------
367 367
368 368 $ hg init $TESTTMP/templates-local-fold
369 369 $ cd $TESTTMP/templates-local-fold
370 370 $ mkcommit ROOT
371 371 $ mkcommit A0
372 372 $ mkcommit B0
373 373 $ hg log --hidden -G
374 374 @ changeset: 2:0dec01379d3b
375 375 | tag: tip
376 376 | user: test
377 377 | date: Thu Jan 01 00:00:00 1970 +0000
378 378 | summary: B0
379 379 |
380 380 o changeset: 1:471f378eab4c
381 381 | user: test
382 382 | date: Thu Jan 01 00:00:00 1970 +0000
383 383 | summary: A0
384 384 |
385 385 o changeset: 0:ea207398892e
386 386 user: test
387 387 date: Thu Jan 01 00:00:00 1970 +0000
388 388 summary: ROOT
389 389
390 390 Simulate a fold
391 391 $ hg up -r "desc(ROOT)"
392 392 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
393 393 $ echo "A0" > A0
394 394 $ echo "B0" > B0
395 395 $ hg commit -A -m "C0"
396 396 adding A0
397 397 adding B0
398 398 created new head
399 399 $ hg debugobsolete `getid "desc(A0)"` `getid "desc(C0)"`
400 400 obsoleted 1 changesets
401 401 $ hg debugobsolete `getid "desc(B0)"` `getid "desc(C0)"`
402 402 obsoleted 1 changesets
403 403
404 404 $ hg log --hidden -G
405 405 @ changeset: 3:eb5a0daa2192
406 406 | tag: tip
407 407 | parent: 0:ea207398892e
408 408 | user: test
409 409 | date: Thu Jan 01 00:00:00 1970 +0000
410 410 | summary: C0
411 411 |
412 412 | x changeset: 2:0dec01379d3b
413 413 | | user: test
414 414 | | date: Thu Jan 01 00:00:00 1970 +0000
415 415 | | summary: B0
416 416 | |
417 417 | x changeset: 1:471f378eab4c
418 418 |/ user: test
419 419 | date: Thu Jan 01 00:00:00 1970 +0000
420 420 | summary: A0
421 421 |
422 422 o changeset: 0:ea207398892e
423 423 user: test
424 424 date: Thu Jan 01 00:00:00 1970 +0000
425 425 summary: ROOT
426 426
427 427 Check templates
428 428 ---------------
429 429
430 430 $ hg up 'desc(A0)' --hidden
431 431 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
432 432
433 433 Predecessors template should show current revision as it is the working copy
434 434 $ hg tlog
435 435 o eb5a0daa2192
436 436 | Predecessors: 1:471f378eab4c
437 437 | semi-colon: 1:471f378eab4c
438 438 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
439 439 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
440 440 | @ 471f378eab4c
441 441 |/ Successors: 3:eb5a0daa2192
442 442 | multi-line: 3:eb5a0daa2192
443 443 | json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
444 444 o ea207398892e
445 445
446 446
447 447 $ hg fatelog
448 448 o eb5a0daa2192
449 449 |
450 450 | @ 471f378eab4c
451 451 |/ Obsfate: rewritten as 3:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000);
452 452 o ea207398892e
453 453
454 454 $ hg up 'desc(B0)' --hidden
455 455 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
456 456
457 457 Predecessors template should show both predecessors as they should be both
458 458 displayed
459 459 $ hg tlog
460 460 o eb5a0daa2192
461 461 | Predecessors: 2:0dec01379d3b 1:471f378eab4c
462 462 | semi-colon: 2:0dec01379d3b; 1:471f378eab4c
463 463 | json: ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5", "471f378eab4c5e25f6c77f785b27c936efb22874"]
464 464 | map: 2:0dec01379d3be6318c470ead31b1fe7ae7cb53d5 1:471f378eab4c5e25f6c77f785b27c936efb22874
465 465 | @ 0dec01379d3b
466 466 | | Successors: 3:eb5a0daa2192
467 467 | | multi-line: 3:eb5a0daa2192
468 468 | | json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
469 469 | x 471f378eab4c
470 470 |/ Successors: 3:eb5a0daa2192
471 471 | multi-line: 3:eb5a0daa2192
472 472 | json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
473 473 o ea207398892e
474 474
475 475
476 476 $ hg fatelog
477 477 o eb5a0daa2192
478 478 |
479 479 | @ 0dec01379d3b
480 480 | | Obsfate: rewritten as 3:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000);
481 481 | x 471f378eab4c
482 482 |/ Obsfate: rewritten as 3:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000);
483 483 o ea207398892e
484 484
485 485 $ hg up 'desc(C0)'
486 486 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
487 487
488 488 Predecessors template should not show predecessors as they are not displayed in
489 489 the log
490 490 $ hg tlog
491 491 @ eb5a0daa2192
492 492 |
493 493 o ea207398892e
494 494
495 495 Predecessors template should show both predecessors as we force their display
496 496 with --hidden
497 497 $ hg tlog --hidden
498 498 @ eb5a0daa2192
499 499 | Predecessors: 2:0dec01379d3b 1:471f378eab4c
500 500 | semi-colon: 2:0dec01379d3b; 1:471f378eab4c
501 501 | json: ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5", "471f378eab4c5e25f6c77f785b27c936efb22874"]
502 502 | map: 2:0dec01379d3be6318c470ead31b1fe7ae7cb53d5 1:471f378eab4c5e25f6c77f785b27c936efb22874
503 503 | x 0dec01379d3b
504 504 | | Successors: 3:eb5a0daa2192
505 505 | | multi-line: 3:eb5a0daa2192
506 506 | | json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
507 507 | x 471f378eab4c
508 508 |/ Successors: 3:eb5a0daa2192
509 509 | multi-line: 3:eb5a0daa2192
510 510 | json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
511 511 o ea207398892e
512 512
513 513
514 514 $ hg fatelog --hidden
515 515 @ eb5a0daa2192
516 516 |
517 517 | x 0dec01379d3b
518 518 | | Obsfate: rewritten as 3:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000);
519 519 | x 471f378eab4c
520 520 |/ Obsfate: rewritten as 3:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000);
521 521 o ea207398892e
522 522
523 523
524 524 $ hg fatelogjson --hidden
525 525 @ eb5a0daa2192
526 526 |
527 527 | x 0dec01379d3b
528 528 | | Obsfate: [{"markers": [["0dec01379d3be6318c470ead31b1fe7ae7cb53d5", ["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"], 0, [["user", "test"]], [0.0, 0], null]], "successors": ["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]}]
529 529 | x 471f378eab4c
530 530 |/ Obsfate: [{"markers": [["471f378eab4c5e25f6c77f785b27c936efb22874", ["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"], 0, [["user", "test"]], [0.0, 0], null]], "successors": ["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]}]
531 531 o ea207398892e
532 532
533 533
534 534 Test templates with divergence
535 535 ==============================
536 536
537 537 Test setup
538 538 ----------
539 539
540 540 $ hg init $TESTTMP/templates-local-divergence
541 541 $ cd $TESTTMP/templates-local-divergence
542 542 $ mkcommit ROOT
543 543 $ mkcommit A0
544 544 $ hg commit --amend -m "A1"
545 545 $ hg log --hidden -G
546 546 @ changeset: 2:fdf9bde5129a
547 547 | tag: tip
548 548 | parent: 0:ea207398892e
549 549 | user: test
550 550 | date: Thu Jan 01 00:00:00 1970 +0000
551 551 | summary: A1
552 552 |
553 553 | x changeset: 1:471f378eab4c
554 554 |/ user: test
555 555 | date: Thu Jan 01 00:00:00 1970 +0000
556 556 | summary: A0
557 557 |
558 558 o changeset: 0:ea207398892e
559 559 user: test
560 560 date: Thu Jan 01 00:00:00 1970 +0000
561 561 summary: ROOT
562 562
563 563 $ hg update --hidden 'desc(A0)'
564 564 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
565 565 $ hg commit --amend -m "A2"
566 566 $ hg log --hidden -G
567 567 @ changeset: 3:65b757b745b9
568 568 | tag: tip
569 569 | parent: 0:ea207398892e
570 570 | user: test
571 571 | date: Thu Jan 01 00:00:00 1970 +0000
572 572 | instability: content-divergent
573 573 | summary: A2
574 574 |
575 575 | o changeset: 2:fdf9bde5129a
576 576 |/ parent: 0:ea207398892e
577 577 | user: test
578 578 | date: Thu Jan 01 00:00:00 1970 +0000
579 579 | instability: content-divergent
580 580 | summary: A1
581 581 |
582 582 | x changeset: 1:471f378eab4c
583 583 |/ user: test
584 584 | date: Thu Jan 01 00:00:00 1970 +0000
585 585 | summary: A0
586 586 |
587 587 o changeset: 0:ea207398892e
588 588 user: test
589 589 date: Thu Jan 01 00:00:00 1970 +0000
590 590 summary: ROOT
591 591
592 592 $ hg commit --amend -m 'A3'
593 593 $ hg log --hidden -G
594 594 @ changeset: 4:019fadeab383
595 595 | tag: tip
596 596 | parent: 0:ea207398892e
597 597 | user: test
598 598 | date: Thu Jan 01 00:00:00 1970 +0000
599 599 | instability: content-divergent
600 600 | summary: A3
601 601 |
602 602 | x changeset: 3:65b757b745b9
603 603 |/ parent: 0:ea207398892e
604 604 | user: test
605 605 | date: Thu Jan 01 00:00:00 1970 +0000
606 606 | summary: A2
607 607 |
608 608 | o changeset: 2:fdf9bde5129a
609 609 |/ parent: 0:ea207398892e
610 610 | user: test
611 611 | date: Thu Jan 01 00:00:00 1970 +0000
612 612 | instability: content-divergent
613 613 | summary: A1
614 614 |
615 615 | x changeset: 1:471f378eab4c
616 616 |/ user: test
617 617 | date: Thu Jan 01 00:00:00 1970 +0000
618 618 | summary: A0
619 619 |
620 620 o changeset: 0:ea207398892e
621 621 user: test
622 622 date: Thu Jan 01 00:00:00 1970 +0000
623 623 summary: ROOT
624 624
625 625
626 626 Check templates
627 627 ---------------
628 628
629 629 $ hg up 'desc(A0)' --hidden
630 630 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
631 631
632 632 Predecessors template should show current revision as it is the working copy
633 633 $ hg tlog
634 634 o 019fadeab383
635 635 | Predecessors: 1:471f378eab4c
636 636 | semi-colon: 1:471f378eab4c
637 637 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
638 638 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
639 639 | o fdf9bde5129a
640 640 |/ Predecessors: 1:471f378eab4c
641 641 | semi-colon: 1:471f378eab4c
642 642 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
643 643 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
644 644 | @ 471f378eab4c
645 645 |/ Successors: 2:fdf9bde5129a; 4:019fadeab383
646 646 | multi-line: 2:fdf9bde5129a
647 647 | multi-line: 4:019fadeab383
648 648 | json: [["fdf9bde5129a28d4548fadd3f62b265cdd3b7a2e"], ["019fadeab383f6699fa83ad7bdb4d82ed2c0e5ab"]]
649 649 o ea207398892e
650 650
651 651 $ hg fatelog
652 652 o 019fadeab383
653 653 |
654 654 | o fdf9bde5129a
655 655 |/
656 656 | @ 471f378eab4c
657 657 |/ Obsfate: rewritten using amend as 2:fdf9bde5129a by test (at 1970-01-01 00:00 +0000); rewritten using amend as 4:019fadeab383 by test (at 1970-01-01 00:00 +0000);
658 658 o ea207398892e
659 659
660 660 $ hg up 'desc(A1)'
661 661 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
662 662
663 663 Predecessors template should not show predecessors as they are not displayed in
664 664 the log
665 665 $ hg tlog
666 666 o 019fadeab383
667 667 |
668 668 | @ fdf9bde5129a
669 669 |/
670 670 o ea207398892e
671 671
672 672
673 673 $ hg fatelog
674 674 o 019fadeab383
675 675 |
676 676 | @ fdf9bde5129a
677 677 |/
678 678 o ea207398892e
679 679
680 680 Predecessors template should the predecessors as we force their display with
681 681 --hidden
682 682 $ hg tlog --hidden
683 683 o 019fadeab383
684 684 | Predecessors: 3:65b757b745b9
685 685 | semi-colon: 3:65b757b745b9
686 686 | json: ["65b757b745b935093c87a2bccd877521cccffcbd"]
687 687 | map: 3:65b757b745b935093c87a2bccd877521cccffcbd
688 688 | x 65b757b745b9
689 689 |/ Predecessors: 1:471f378eab4c
690 690 | semi-colon: 1:471f378eab4c
691 691 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
692 692 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
693 693 | Successors: 4:019fadeab383
694 694 | multi-line: 4:019fadeab383
695 695 | json: [["019fadeab383f6699fa83ad7bdb4d82ed2c0e5ab"]]
696 696 | @ fdf9bde5129a
697 697 |/ Predecessors: 1:471f378eab4c
698 698 | semi-colon: 1:471f378eab4c
699 699 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
700 700 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
701 701 | x 471f378eab4c
702 702 |/ Successors: 2:fdf9bde5129a; 3:65b757b745b9
703 703 | multi-line: 2:fdf9bde5129a
704 704 | multi-line: 3:65b757b745b9
705 705 | json: [["fdf9bde5129a28d4548fadd3f62b265cdd3b7a2e"], ["65b757b745b935093c87a2bccd877521cccffcbd"]]
706 706 o ea207398892e
707 707
708 708
709 709 $ hg fatelog --hidden
710 710 o 019fadeab383
711 711 |
712 712 | x 65b757b745b9
713 713 |/ Obsfate: rewritten using amend as 4:019fadeab383 by test (at 1970-01-01 00:00 +0000);
714 714 | @ fdf9bde5129a
715 715 |/
716 716 | x 471f378eab4c
717 717 |/ Obsfate: rewritten using amend as 2:fdf9bde5129a by test (at 1970-01-01 00:00 +0000); rewritten using amend as 3:65b757b745b9 by test (at 1970-01-01 00:00 +0000);
718 718 o ea207398892e
719 719
720 720
721 721 $ hg fatelogjson --hidden
722 722 o 019fadeab383
723 723 |
724 724 | x 65b757b745b9
725 725 |/ Obsfate: [{"markers": [["65b757b745b935093c87a2bccd877521cccffcbd", ["019fadeab383f6699fa83ad7bdb4d82ed2c0e5ab"], 0, [["operation", "amend"], ["user", "test"]], [0.0, 0], null]], "successors": ["019fadeab383f6699fa83ad7bdb4d82ed2c0e5ab"]}]
726 726 | @ fdf9bde5129a
727 727 |/
728 728 | x 471f378eab4c
729 729 |/ Obsfate: [{"markers": [["471f378eab4c5e25f6c77f785b27c936efb22874", ["fdf9bde5129a28d4548fadd3f62b265cdd3b7a2e"], 0, [["operation", "amend"], ["user", "test"]], [0.0, 0], null]], "successors": ["fdf9bde5129a28d4548fadd3f62b265cdd3b7a2e"]}, {"markers": [["471f378eab4c5e25f6c77f785b27c936efb22874", ["65b757b745b935093c87a2bccd877521cccffcbd"], 0, [["operation", "amend"], ["user", "test"]], [0.0, 0], null]], "successors": ["65b757b745b935093c87a2bccd877521cccffcbd"]}]
730 730 o ea207398892e
731 731
732 732
733 733 Test templates with amended + folded commit
734 734 ===========================================
735 735
736 736 Test setup
737 737 ----------
738 738
739 739 $ hg init $TESTTMP/templates-local-amend-fold
740 740 $ cd $TESTTMP/templates-local-amend-fold
741 741 $ mkcommit ROOT
742 742 $ mkcommit A0
743 743 $ mkcommit B0
744 744 $ hg commit --amend -m "B1"
745 745 $ hg log --hidden -G
746 746 @ changeset: 3:b7ea6d14e664
747 747 | tag: tip
748 748 | parent: 1:471f378eab4c
749 749 | user: test
750 750 | date: Thu Jan 01 00:00:00 1970 +0000
751 751 | summary: B1
752 752 |
753 753 | x changeset: 2:0dec01379d3b
754 754 |/ user: test
755 755 | date: Thu Jan 01 00:00:00 1970 +0000
756 756 | summary: B0
757 757 |
758 758 o changeset: 1:471f378eab4c
759 759 | user: test
760 760 | date: Thu Jan 01 00:00:00 1970 +0000
761 761 | summary: A0
762 762 |
763 763 o changeset: 0:ea207398892e
764 764 user: test
765 765 date: Thu Jan 01 00:00:00 1970 +0000
766 766 summary: ROOT
767 767
768 768 # Simulate a fold
769 769 $ hg up -r "desc(ROOT)"
770 770 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
771 771 $ echo "A0" > A0
772 772 $ echo "B0" > B0
773 773 $ hg commit -A -m "C0"
774 774 adding A0
775 775 adding B0
776 776 created new head
777 777 $ hg debugobsolete `getid "desc(A0)"` `getid "desc(C0)"`
778 778 obsoleted 1 changesets
779 779 $ hg debugobsolete `getid "desc(B1)"` `getid "desc(C0)"`
780 780 obsoleted 1 changesets
781 781
782 782 $ hg log --hidden -G
783 783 @ changeset: 4:eb5a0daa2192
784 784 | tag: tip
785 785 | parent: 0:ea207398892e
786 786 | user: test
787 787 | date: Thu Jan 01 00:00:00 1970 +0000
788 788 | summary: C0
789 789 |
790 790 | x changeset: 3:b7ea6d14e664
791 791 | | parent: 1:471f378eab4c
792 792 | | user: test
793 793 | | date: Thu Jan 01 00:00:00 1970 +0000
794 794 | | summary: B1
795 795 | |
796 796 | | x changeset: 2:0dec01379d3b
797 797 | |/ user: test
798 798 | | date: Thu Jan 01 00:00:00 1970 +0000
799 799 | | summary: B0
800 800 | |
801 801 | x changeset: 1:471f378eab4c
802 802 |/ user: test
803 803 | date: Thu Jan 01 00:00:00 1970 +0000
804 804 | summary: A0
805 805 |
806 806 o changeset: 0:ea207398892e
807 807 user: test
808 808 date: Thu Jan 01 00:00:00 1970 +0000
809 809 summary: ROOT
810 810
811 811 Check templates
812 812 ---------------
813 813
814 814 $ hg up 'desc(A0)' --hidden
815 815 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
816 816
817 817 Predecessors template should show current revision as it is the working copy
818 818 $ hg tlog
819 819 o eb5a0daa2192
820 820 | Predecessors: 1:471f378eab4c
821 821 | semi-colon: 1:471f378eab4c
822 822 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
823 823 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
824 824 | @ 471f378eab4c
825 825 |/ Successors: 4:eb5a0daa2192
826 826 | multi-line: 4:eb5a0daa2192
827 827 | json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
828 828 o ea207398892e
829 829
830 830
831 831 $ hg fatelog
832 832 o eb5a0daa2192
833 833 |
834 834 | @ 471f378eab4c
835 835 |/ Obsfate: rewritten as 4:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000);
836 836 o ea207398892e
837 837
838 838 $ hg up 'desc(B0)' --hidden
839 839 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
840 840
841 841 Predecessors template should both predecessors as they are visible
842 842 $ hg tlog
843 843 o eb5a0daa2192
844 844 | Predecessors: 2:0dec01379d3b 1:471f378eab4c
845 845 | semi-colon: 2:0dec01379d3b; 1:471f378eab4c
846 846 | json: ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5", "471f378eab4c5e25f6c77f785b27c936efb22874"]
847 847 | map: 2:0dec01379d3be6318c470ead31b1fe7ae7cb53d5 1:471f378eab4c5e25f6c77f785b27c936efb22874
848 848 | @ 0dec01379d3b
849 849 | | Successors: 4:eb5a0daa2192
850 850 | | multi-line: 4:eb5a0daa2192
851 851 | | json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
852 852 | x 471f378eab4c
853 853 |/ Successors: 4:eb5a0daa2192
854 854 | multi-line: 4:eb5a0daa2192
855 855 | json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
856 856 o ea207398892e
857 857
858 858
859 859 $ hg fatelog
860 860 o eb5a0daa2192
861 861 |
862 862 | @ 0dec01379d3b
863 863 | | Obsfate: rewritten using amend as 4:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000);
864 864 | x 471f378eab4c
865 865 |/ Obsfate: rewritten as 4:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000);
866 866 o ea207398892e
867 867
868 868 $ hg up 'desc(B1)' --hidden
869 869 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
870 870
871 871 Predecessors template should both predecessors as they are visible
872 872 $ hg tlog
873 873 o eb5a0daa2192
874 874 | Predecessors: 1:471f378eab4c 3:b7ea6d14e664
875 875 | semi-colon: 1:471f378eab4c; 3:b7ea6d14e664
876 876 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874", "b7ea6d14e664bdc8922221f7992631b50da3fb07"]
877 877 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874 3:b7ea6d14e664bdc8922221f7992631b50da3fb07
878 878 | @ b7ea6d14e664
879 879 | | Successors: 4:eb5a0daa2192
880 880 | | multi-line: 4:eb5a0daa2192
881 881 | | json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
882 882 | x 471f378eab4c
883 883 |/ Successors: 4:eb5a0daa2192
884 884 | multi-line: 4:eb5a0daa2192
885 885 | json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
886 886 o ea207398892e
887 887
888 888
889 889 $ hg fatelog
890 890 o eb5a0daa2192
891 891 |
892 892 | @ b7ea6d14e664
893 893 | | Obsfate: rewritten as 4:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000);
894 894 | x 471f378eab4c
895 895 |/ Obsfate: rewritten as 4:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000);
896 896 o ea207398892e
897 897
898 898 $ hg up 'desc(C0)'
899 899 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
900 900
901 901 Predecessors template should show no predecessors as they are both non visible
902 902 $ hg tlog
903 903 @ eb5a0daa2192
904 904 |
905 905 o ea207398892e
906 906
907 907
908 908 $ hg fatelog
909 909 @ eb5a0daa2192
910 910 |
911 911 o ea207398892e
912 912
913 913 Predecessors template should show all predecessors as we force their display
914 914 with --hidden
915 915 $ hg tlog --hidden
916 916 @ eb5a0daa2192
917 917 | Predecessors: 1:471f378eab4c 3:b7ea6d14e664
918 918 | semi-colon: 1:471f378eab4c; 3:b7ea6d14e664
919 919 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874", "b7ea6d14e664bdc8922221f7992631b50da3fb07"]
920 920 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874 3:b7ea6d14e664bdc8922221f7992631b50da3fb07
921 921 | x b7ea6d14e664
922 922 | | Predecessors: 2:0dec01379d3b
923 923 | | semi-colon: 2:0dec01379d3b
924 924 | | json: ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]
925 925 | | map: 2:0dec01379d3be6318c470ead31b1fe7ae7cb53d5
926 926 | | Successors: 4:eb5a0daa2192
927 927 | | multi-line: 4:eb5a0daa2192
928 928 | | json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
929 929 | | x 0dec01379d3b
930 930 | |/ Successors: 3:b7ea6d14e664
931 931 | | multi-line: 3:b7ea6d14e664
932 932 | | json: [["b7ea6d14e664bdc8922221f7992631b50da3fb07"]]
933 933 | x 471f378eab4c
934 934 |/ Successors: 4:eb5a0daa2192
935 935 | multi-line: 4:eb5a0daa2192
936 936 | json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
937 937 o ea207398892e
938 938
939 939
940 940 $ hg fatelog --hidden
941 941 @ eb5a0daa2192
942 942 |
943 943 | x b7ea6d14e664
944 944 | | Obsfate: rewritten as 4:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000);
945 945 | | x 0dec01379d3b
946 946 | |/ Obsfate: rewritten using amend as 3:b7ea6d14e664 by test (at 1970-01-01 00:00 +0000);
947 947 | x 471f378eab4c
948 948 |/ Obsfate: rewritten as 4:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000);
949 949 o ea207398892e
950 950
951 951
952 952 $ hg fatelogjson --hidden
953 953 @ eb5a0daa2192
954 954 |
955 955 | x b7ea6d14e664
956 956 | | Obsfate: [{"markers": [["b7ea6d14e664bdc8922221f7992631b50da3fb07", ["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"], 0, [["user", "test"]], [0.0, 0], null]], "successors": ["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]}]
957 957 | | x 0dec01379d3b
958 958 | |/ Obsfate: [{"markers": [["0dec01379d3be6318c470ead31b1fe7ae7cb53d5", ["b7ea6d14e664bdc8922221f7992631b50da3fb07"], 0, [["operation", "amend"], ["user", "test"]], [0.0, 0], null]], "successors": ["b7ea6d14e664bdc8922221f7992631b50da3fb07"]}]
959 959 | x 471f378eab4c
960 960 |/ Obsfate: [{"markers": [["471f378eab4c5e25f6c77f785b27c936efb22874", ["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"], 0, [["user", "test"]], [0.0, 0], null]], "successors": ["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]}]
961 961 o ea207398892e
962 962
963 963
964 964 Test template with pushed and pulled obs markers
965 965 ================================================
966 966
967 967 Test setup
968 968 ----------
969 969
970 970 $ hg init $TESTTMP/templates-local-remote-markers-1
971 971 $ cd $TESTTMP/templates-local-remote-markers-1
972 972 $ mkcommit ROOT
973 973 $ mkcommit A0
974 974 $ hg clone $TESTTMP/templates-local-remote-markers-1 $TESTTMP/templates-local-remote-markers-2
975 975 updating to branch default
976 976 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
977 977 $ cd $TESTTMP/templates-local-remote-markers-2
978 978 $ hg log --hidden -G
979 979 @ changeset: 1:471f378eab4c
980 980 | tag: tip
981 981 | user: test
982 982 | date: Thu Jan 01 00:00:00 1970 +0000
983 983 | summary: A0
984 984 |
985 985 o changeset: 0:ea207398892e
986 986 user: test
987 987 date: Thu Jan 01 00:00:00 1970 +0000
988 988 summary: ROOT
989 989
990 990 $ cd $TESTTMP/templates-local-remote-markers-1
991 991 $ hg commit --amend -m "A1"
992 992 $ hg commit --amend -m "A2"
993 993 $ hg log --hidden -G
994 994 @ changeset: 3:7a230b46bf61
995 995 | tag: tip
996 996 | parent: 0:ea207398892e
997 997 | user: test
998 998 | date: Thu Jan 01 00:00:00 1970 +0000
999 999 | summary: A2
1000 1000 |
1001 1001 | x changeset: 2:fdf9bde5129a
1002 1002 |/ parent: 0:ea207398892e
1003 1003 | user: test
1004 1004 | date: Thu Jan 01 00:00:00 1970 +0000
1005 1005 | summary: A1
1006 1006 |
1007 1007 | x changeset: 1:471f378eab4c
1008 1008 |/ user: test
1009 1009 | date: Thu Jan 01 00:00:00 1970 +0000
1010 1010 | summary: A0
1011 1011 |
1012 1012 o changeset: 0:ea207398892e
1013 1013 user: test
1014 1014 date: Thu Jan 01 00:00:00 1970 +0000
1015 1015 summary: ROOT
1016 1016
1017 1017 $ cd $TESTTMP/templates-local-remote-markers-2
1018 1018 $ hg pull
1019 1019 pulling from $TESTTMP/templates-local-remote-markers-1 (glob)
1020 1020 searching for changes
1021 1021 adding changesets
1022 1022 adding manifests
1023 1023 adding file changes
1024 1024 added 1 changesets with 0 changes to 1 files (+1 heads)
1025 1025 2 new obsolescence markers
1026 1026 obsoleted 1 changesets
1027 1027 (run 'hg heads' to see heads, 'hg merge' to merge)
1028 1028 $ hg log --hidden -G
1029 1029 o changeset: 2:7a230b46bf61
1030 1030 | tag: tip
1031 1031 | parent: 0:ea207398892e
1032 1032 | user: test
1033 1033 | date: Thu Jan 01 00:00:00 1970 +0000
1034 1034 | summary: A2
1035 1035 |
1036 1036 | @ changeset: 1:471f378eab4c
1037 1037 |/ user: test
1038 1038 | date: Thu Jan 01 00:00:00 1970 +0000
1039 1039 | summary: A0
1040 1040 |
1041 1041 o changeset: 0:ea207398892e
1042 1042 user: test
1043 1043 date: Thu Jan 01 00:00:00 1970 +0000
1044 1044 summary: ROOT
1045 1045
1046 1046
1047 1047 $ hg debugobsolete
1048 1048 471f378eab4c5e25f6c77f785b27c936efb22874 fdf9bde5129a28d4548fadd3f62b265cdd3b7a2e 0 (Thu Jan 01 00:00:00 1970 +0000) {'operation': 'amend', 'user': 'test'}
1049 1049 fdf9bde5129a28d4548fadd3f62b265cdd3b7a2e 7a230b46bf61e50b30308c6cfd7bd1269ef54702 0 (Thu Jan 01 00:00:00 1970 +0000) {'operation': 'amend', 'user': 'test'}
1050 1050
1051 1051 Check templates
1052 1052 ---------------
1053 1053
1054 1054 Predecessors template should show current revision as it is the working copy
1055 1055 $ hg tlog
1056 1056 o 7a230b46bf61
1057 1057 | Predecessors: 1:471f378eab4c
1058 1058 | semi-colon: 1:471f378eab4c
1059 1059 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
1060 1060 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
1061 1061 | @ 471f378eab4c
1062 1062 |/ Successors: 2:7a230b46bf61
1063 1063 | multi-line: 2:7a230b46bf61
1064 1064 | json: [["7a230b46bf61e50b30308c6cfd7bd1269ef54702"]]
1065 1065 o ea207398892e
1066 1066
1067 1067
1068 1068 $ hg fatelog
1069 1069 o 7a230b46bf61
1070 1070 |
1071 1071 | @ 471f378eab4c
1072 1072 |/ Obsfate: rewritten using amend as 2:7a230b46bf61 by test (at 1970-01-01 00:00 +0000);
1073 1073 o ea207398892e
1074 1074
1075 1075 $ hg up 'desc(A2)'
1076 1076 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
1077 1077
1078 1078 Predecessors template should show no predecessors as they are non visible
1079 1079 $ hg tlog
1080 1080 @ 7a230b46bf61
1081 1081 |
1082 1082 o ea207398892e
1083 1083
1084 1084
1085 1085 $ hg fatelog
1086 1086 @ 7a230b46bf61
1087 1087 |
1088 1088 o ea207398892e
1089 1089
1090 1090 Predecessors template should show all predecessors as we force their display
1091 1091 with --hidden
1092 1092 $ hg tlog --hidden
1093 1093 @ 7a230b46bf61
1094 1094 | Predecessors: 1:471f378eab4c
1095 1095 | semi-colon: 1:471f378eab4c
1096 1096 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
1097 1097 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
1098 1098 | x 471f378eab4c
1099 1099 |/ Successors: 2:7a230b46bf61
1100 1100 | multi-line: 2:7a230b46bf61
1101 1101 | json: [["7a230b46bf61e50b30308c6cfd7bd1269ef54702"]]
1102 1102 o ea207398892e
1103 1103
1104 1104
1105 1105 $ hg fatelog --hidden
1106 1106 @ 7a230b46bf61
1107 1107 |
1108 1108 | x 471f378eab4c
1109 1109 |/ Obsfate: rewritten using amend as 2:7a230b46bf61 by test (at 1970-01-01 00:00 +0000);
1110 1110 o ea207398892e
1111 1111
1112 1112
1113 1113 Test template with obsmarkers cycle
1114 1114 ===================================
1115 1115
1116 1116 Test setup
1117 1117 ----------
1118 1118
1119 1119 $ hg init $TESTTMP/templates-local-cycle
1120 1120 $ cd $TESTTMP/templates-local-cycle
1121 1121 $ mkcommit ROOT
1122 1122 $ mkcommit A0
1123 1123 $ mkcommit B0
1124 1124 $ hg up -r 0
1125 1125 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
1126 1126 $ mkcommit C0
1127 1127 created new head
1128 1128
1129 1129 Create the cycle
1130 1130
1131 1131 $ hg debugobsolete `getid "desc(A0)"` `getid "desc(B0)"`
1132 1132 obsoleted 1 changesets
1133 1133 $ hg debugobsolete `getid "desc(B0)"` `getid "desc(C0)"`
1134 1134 obsoleted 1 changesets
1135 1135 $ hg debugobsolete `getid "desc(B0)"` `getid "desc(A0)"`
1136 1136
1137 1137 Check templates
1138 1138 ---------------
1139 1139
1140 1140 $ hg tlog
1141 1141 @ f897c6137566
1142 1142 |
1143 1143 o ea207398892e
1144 1144
1145 1145
1146 1146 $ hg fatelog
1147 1147 @ f897c6137566
1148 1148 |
1149 1149 o ea207398892e
1150 1150
1151 1151
1152 1152 $ hg up -r "desc(B0)" --hidden
1153 1153 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
1154 1154 $ hg tlog
1155 1155 o f897c6137566
1156 1156 | Predecessors: 2:0dec01379d3b
1157 1157 | semi-colon: 2:0dec01379d3b
1158 1158 | json: ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]
1159 1159 | map: 2:0dec01379d3be6318c470ead31b1fe7ae7cb53d5
1160 1160 | @ 0dec01379d3b
1161 1161 | | Predecessors: 1:471f378eab4c
1162 1162 | | semi-colon: 1:471f378eab4c
1163 1163 | | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
1164 1164 | | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
1165 1165 | | Successors: 3:f897c6137566; 1:471f378eab4c
1166 1166 | | multi-line: 3:f897c6137566
1167 1167 | | multi-line: 1:471f378eab4c
1168 1168 | | json: [["f897c6137566320b081514b4c7227ecc3d384b39"], ["471f378eab4c5e25f6c77f785b27c936efb22874"]]
1169 1169 | x 471f378eab4c
1170 1170 |/ Predecessors: 2:0dec01379d3b
1171 1171 | semi-colon: 2:0dec01379d3b
1172 1172 | json: ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]
1173 1173 | map: 2:0dec01379d3be6318c470ead31b1fe7ae7cb53d5
1174 1174 | Successors: 2:0dec01379d3b
1175 1175 | multi-line: 2:0dec01379d3b
1176 1176 | json: [["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]]
1177 1177 o ea207398892e
1178 1178
1179 1179
1180 1180 $ hg fatelog
1181 1181 o f897c6137566
1182 1182 |
1183 1183 | @ 0dec01379d3b
1184 1184 | | Obsfate: rewritten as 3:f897c6137566 by test (at 1970-01-01 00:00 +0000); rewritten as 1:471f378eab4c by test (at 1970-01-01 00:00 +0000);
1185 1185 | x 471f378eab4c
1186 1186 |/ Obsfate: rewritten as 2:0dec01379d3b by test (at 1970-01-01 00:00 +0000);
1187 1187 o ea207398892e
1188 1188
1189 1189
1190 1190 $ hg up -r "desc(A0)" --hidden
1191 1191 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1192 1192 $ hg tlog
1193 1193 o f897c6137566
1194 1194 | Predecessors: 1:471f378eab4c
1195 1195 | semi-colon: 1:471f378eab4c
1196 1196 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
1197 1197 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
1198 1198 | @ 471f378eab4c
1199 1199 |/
1200 1200 o ea207398892e
1201 1201
1202 1202
1203 1203 $ hg fatelog
1204 1204 o f897c6137566
1205 1205 |
1206 1206 | @ 471f378eab4c
1207 1207 |/ Obsfate: pruned;
1208 1208 o ea207398892e
1209 1209
1210 1210
1211 1211 $ hg up -r "desc(ROOT)" --hidden
1212 1212 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1213 1213 $ hg tlog
1214 1214 o f897c6137566
1215 1215 |
1216 1216 @ ea207398892e
1217 1217
1218 1218
1219 1219 $ hg fatelog
1220 1220 o f897c6137566
1221 1221 |
1222 1222 @ ea207398892e
1223 1223
1224 1224
1225 1225 $ hg tlog --hidden
1226 1226 o f897c6137566
1227 1227 | Predecessors: 2:0dec01379d3b
1228 1228 | semi-colon: 2:0dec01379d3b
1229 1229 | json: ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]
1230 1230 | map: 2:0dec01379d3be6318c470ead31b1fe7ae7cb53d5
1231 1231 | x 0dec01379d3b
1232 1232 | | Predecessors: 1:471f378eab4c
1233 1233 | | semi-colon: 1:471f378eab4c
1234 1234 | | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
1235 1235 | | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
1236 1236 | | Successors: 3:f897c6137566; 1:471f378eab4c
1237 1237 | | multi-line: 3:f897c6137566
1238 1238 | | multi-line: 1:471f378eab4c
1239 1239 | | json: [["f897c6137566320b081514b4c7227ecc3d384b39"], ["471f378eab4c5e25f6c77f785b27c936efb22874"]]
1240 1240 | x 471f378eab4c
1241 1241 |/ Predecessors: 2:0dec01379d3b
1242 1242 | semi-colon: 2:0dec01379d3b
1243 1243 | json: ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]
1244 1244 | map: 2:0dec01379d3be6318c470ead31b1fe7ae7cb53d5
1245 1245 | Successors: 2:0dec01379d3b
1246 1246 | multi-line: 2:0dec01379d3b
1247 1247 | json: [["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]]
1248 1248 @ ea207398892e
1249 1249
1250 1250 Test template with split + divergence with cycles
1251 1251 =================================================
1252 1252
1253 1253 $ hg log -G
1254 1254 o changeset: 3:f897c6137566
1255 1255 | tag: tip
1256 1256 | parent: 0:ea207398892e
1257 1257 | user: test
1258 1258 | date: Thu Jan 01 00:00:00 1970 +0000
1259 1259 | summary: C0
1260 1260 |
1261 1261 @ changeset: 0:ea207398892e
1262 1262 user: test
1263 1263 date: Thu Jan 01 00:00:00 1970 +0000
1264 1264 summary: ROOT
1265 1265
1266 1266 $ hg up
1267 1267 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1268 1268
1269 1269 Create a commit with three files
1270 1270 $ touch A B C
1271 1271 $ hg commit -A -m "Add A,B,C" A B C
1272 1272
1273 1273 Split it
1274 1274 $ hg up 3
1275 1275 0 files updated, 0 files merged, 3 files removed, 0 files unresolved
1276 1276 $ touch A
1277 1277 $ hg commit -A -m "Add A,B,C" A
1278 1278 created new head
1279 1279
1280 1280 $ touch B
1281 1281 $ hg commit -A -m "Add A,B,C" B
1282 1282
1283 1283 $ touch C
1284 1284 $ hg commit -A -m "Add A,B,C" C
1285 1285
1286 1286 $ hg log -G
1287 1287 @ changeset: 7:ba2ed02b0c9a
1288 1288 | tag: tip
1289 1289 | user: test
1290 1290 | date: Thu Jan 01 00:00:00 1970 +0000
1291 1291 | summary: Add A,B,C
1292 1292 |
1293 1293 o changeset: 6:4a004186e638
1294 1294 | user: test
1295 1295 | date: Thu Jan 01 00:00:00 1970 +0000
1296 1296 | summary: Add A,B,C
1297 1297 |
1298 1298 o changeset: 5:dd800401bd8c
1299 1299 | parent: 3:f897c6137566
1300 1300 | user: test
1301 1301 | date: Thu Jan 01 00:00:00 1970 +0000
1302 1302 | summary: Add A,B,C
1303 1303 |
1304 1304 | o changeset: 4:9bd10a0775e4
1305 1305 |/ user: test
1306 1306 | date: Thu Jan 01 00:00:00 1970 +0000
1307 1307 | summary: Add A,B,C
1308 1308 |
1309 1309 o changeset: 3:f897c6137566
1310 1310 | parent: 0:ea207398892e
1311 1311 | user: test
1312 1312 | date: Thu Jan 01 00:00:00 1970 +0000
1313 1313 | summary: C0
1314 1314 |
1315 1315 o changeset: 0:ea207398892e
1316 1316 user: test
1317 1317 date: Thu Jan 01 00:00:00 1970 +0000
1318 1318 summary: ROOT
1319 1319
1320 1320 $ hg debugobsolete `getid "4"` `getid "5"` `getid "6"` `getid "7"`
1321 1321 obsoleted 1 changesets
1322 1322 $ hg log -G
1323 1323 @ changeset: 7:ba2ed02b0c9a
1324 1324 | tag: tip
1325 1325 | user: test
1326 1326 | date: Thu Jan 01 00:00:00 1970 +0000
1327 1327 | summary: Add A,B,C
1328 1328 |
1329 1329 o changeset: 6:4a004186e638
1330 1330 | user: test
1331 1331 | date: Thu Jan 01 00:00:00 1970 +0000
1332 1332 | summary: Add A,B,C
1333 1333 |
1334 1334 o changeset: 5:dd800401bd8c
1335 1335 | parent: 3:f897c6137566
1336 1336 | user: test
1337 1337 | date: Thu Jan 01 00:00:00 1970 +0000
1338 1338 | summary: Add A,B,C
1339 1339 |
1340 1340 o changeset: 3:f897c6137566
1341 1341 | parent: 0:ea207398892e
1342 1342 | user: test
1343 1343 | date: Thu Jan 01 00:00:00 1970 +0000
1344 1344 | summary: C0
1345 1345 |
1346 1346 o changeset: 0:ea207398892e
1347 1347 user: test
1348 1348 date: Thu Jan 01 00:00:00 1970 +0000
1349 1349 summary: ROOT
1350 1350
1351 1351 Diverge one of the splitted commit
1352 1352
1353 1353 $ hg up 6
1354 1354 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1355 1355 $ hg commit --amend -m "Add only B"
1356 1356
1357 1357 $ hg up 6 --hidden
1358 1358 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
1359 1359 $ hg commit --amend -m "Add B only"
1360 1360
1361 1361 $ hg log -G
1362 1362 @ changeset: 9:0b997eb7ceee
1363 1363 | tag: tip
1364 1364 | parent: 5:dd800401bd8c
1365 1365 | user: test
1366 1366 | date: Thu Jan 01 00:00:00 1970 +0000
1367 1367 | instability: content-divergent
1368 1368 | summary: Add B only
1369 1369 |
1370 1370 | o changeset: 8:b18bc8331526
1371 1371 |/ parent: 5:dd800401bd8c
1372 1372 | user: test
1373 1373 | date: Thu Jan 01 00:00:00 1970 +0000
1374 1374 | instability: content-divergent
1375 1375 | summary: Add only B
1376 1376 |
1377 1377 | o changeset: 7:ba2ed02b0c9a
1378 1378 | | user: test
1379 1379 | | date: Thu Jan 01 00:00:00 1970 +0000
1380 1380 | | instability: orphan, content-divergent
1381 1381 | | summary: Add A,B,C
1382 1382 | |
1383 1383 | x changeset: 6:4a004186e638
1384 1384 |/ user: test
1385 1385 | date: Thu Jan 01 00:00:00 1970 +0000
1386 1386 | summary: Add A,B,C
1387 1387 |
1388 1388 o changeset: 5:dd800401bd8c
1389 1389 | parent: 3:f897c6137566
1390 1390 | user: test
1391 1391 | date: Thu Jan 01 00:00:00 1970 +0000
1392 1392 | instability: content-divergent
1393 1393 | summary: Add A,B,C
1394 1394 |
1395 1395 o changeset: 3:f897c6137566
1396 1396 | parent: 0:ea207398892e
1397 1397 | user: test
1398 1398 | date: Thu Jan 01 00:00:00 1970 +0000
1399 1399 | summary: C0
1400 1400 |
1401 1401 o changeset: 0:ea207398892e
1402 1402 user: test
1403 1403 date: Thu Jan 01 00:00:00 1970 +0000
1404 1404 summary: ROOT
1405 1405
1406 1406
1407 1407 Check templates
1408 1408 ---------------
1409 1409
1410 1410 $ hg tlog
1411 1411 @ 0b997eb7ceee
1412 1412 | Predecessors: 6:4a004186e638
1413 1413 | semi-colon: 6:4a004186e638
1414 1414 | json: ["4a004186e63889f20cb16434fcbd72220bd1eace"]
1415 1415 | map: 6:4a004186e63889f20cb16434fcbd72220bd1eace
1416 1416 | o b18bc8331526
1417 1417 |/ Predecessors: 6:4a004186e638
1418 1418 | semi-colon: 6:4a004186e638
1419 1419 | json: ["4a004186e63889f20cb16434fcbd72220bd1eace"]
1420 1420 | map: 6:4a004186e63889f20cb16434fcbd72220bd1eace
1421 1421 | o ba2ed02b0c9a
1422 1422 | |
1423 1423 | x 4a004186e638
1424 1424 |/ Successors: 8:b18bc8331526; 9:0b997eb7ceee
1425 1425 | multi-line: 8:b18bc8331526
1426 1426 | multi-line: 9:0b997eb7ceee
1427 1427 | json: [["b18bc8331526a22cbb1801022bd1555bf291c48b"], ["0b997eb7ceeee06200a02f8aab185979092d514e"]]
1428 1428 o dd800401bd8c
1429 1429 |
1430 1430 o f897c6137566
1431 1431 |
1432 1432 o ea207398892e
1433 1433
1434 1434 $ hg fatelog
1435 1435 @ 0b997eb7ceee
1436 1436 |
1437 1437 | o b18bc8331526
1438 1438 |/
1439 1439 | o ba2ed02b0c9a
1440 1440 | |
1441 1441 | x 4a004186e638
1442 1442 |/ Obsfate: rewritten using amend as 8:b18bc8331526 by test (at 1970-01-01 00:00 +0000); rewritten using amend as 9:0b997eb7ceee by test (at 1970-01-01 00:00 +0000);
1443 1443 o dd800401bd8c
1444 1444 |
1445 1445 o f897c6137566
1446 1446 |
1447 1447 o ea207398892e
1448 1448
1449 1449 $ hg tlog --hidden
1450 1450 @ 0b997eb7ceee
1451 1451 | Predecessors: 6:4a004186e638
1452 1452 | semi-colon: 6:4a004186e638
1453 1453 | json: ["4a004186e63889f20cb16434fcbd72220bd1eace"]
1454 1454 | map: 6:4a004186e63889f20cb16434fcbd72220bd1eace
1455 1455 | o b18bc8331526
1456 1456 |/ Predecessors: 6:4a004186e638
1457 1457 | semi-colon: 6:4a004186e638
1458 1458 | json: ["4a004186e63889f20cb16434fcbd72220bd1eace"]
1459 1459 | map: 6:4a004186e63889f20cb16434fcbd72220bd1eace
1460 1460 | o ba2ed02b0c9a
1461 1461 | | Predecessors: 4:9bd10a0775e4
1462 1462 | | semi-colon: 4:9bd10a0775e4
1463 1463 | | json: ["9bd10a0775e478708cada5f176ec6de654359ce7"]
1464 1464 | | map: 4:9bd10a0775e478708cada5f176ec6de654359ce7
1465 1465 | x 4a004186e638
1466 1466 |/ Predecessors: 4:9bd10a0775e4
1467 1467 | semi-colon: 4:9bd10a0775e4
1468 1468 | json: ["9bd10a0775e478708cada5f176ec6de654359ce7"]
1469 1469 | map: 4:9bd10a0775e478708cada5f176ec6de654359ce7
1470 1470 | Successors: 8:b18bc8331526; 9:0b997eb7ceee
1471 1471 | multi-line: 8:b18bc8331526
1472 1472 | multi-line: 9:0b997eb7ceee
1473 1473 | json: [["b18bc8331526a22cbb1801022bd1555bf291c48b"], ["0b997eb7ceeee06200a02f8aab185979092d514e"]]
1474 1474 o dd800401bd8c
1475 1475 | Predecessors: 4:9bd10a0775e4
1476 1476 | semi-colon: 4:9bd10a0775e4
1477 1477 | json: ["9bd10a0775e478708cada5f176ec6de654359ce7"]
1478 1478 | map: 4:9bd10a0775e478708cada5f176ec6de654359ce7
1479 1479 | x 9bd10a0775e4
1480 1480 |/ Successors: 5:dd800401bd8c 6:4a004186e638 7:ba2ed02b0c9a
1481 1481 | multi-line: 5:dd800401bd8c 6:4a004186e638 7:ba2ed02b0c9a
1482 1482 | json: [["dd800401bd8c79d815329277739e433e883f784e", "4a004186e63889f20cb16434fcbd72220bd1eace", "ba2ed02b0c9a56b9fdbc4e79c7e57866984d8a1f"]]
1483 1483 o f897c6137566
1484 1484 | Predecessors: 2:0dec01379d3b
1485 1485 | semi-colon: 2:0dec01379d3b
1486 1486 | json: ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]
1487 1487 | map: 2:0dec01379d3be6318c470ead31b1fe7ae7cb53d5
1488 1488 | x 0dec01379d3b
1489 1489 | | Predecessors: 1:471f378eab4c
1490 1490 | | semi-colon: 1:471f378eab4c
1491 1491 | | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
1492 1492 | | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
1493 1493 | | Successors: 3:f897c6137566; 1:471f378eab4c
1494 1494 | | multi-line: 3:f897c6137566
1495 1495 | | multi-line: 1:471f378eab4c
1496 1496 | | json: [["f897c6137566320b081514b4c7227ecc3d384b39"], ["471f378eab4c5e25f6c77f785b27c936efb22874"]]
1497 1497 | x 471f378eab4c
1498 1498 |/ Predecessors: 2:0dec01379d3b
1499 1499 | semi-colon: 2:0dec01379d3b
1500 1500 | json: ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]
1501 1501 | map: 2:0dec01379d3be6318c470ead31b1fe7ae7cb53d5
1502 1502 | Successors: 2:0dec01379d3b
1503 1503 | multi-line: 2:0dec01379d3b
1504 1504 | json: [["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]]
1505 1505 o ea207398892e
1506 1506
1507 1507 $ hg fatelog --hidden
1508 1508 @ 0b997eb7ceee
1509 1509 |
1510 1510 | o b18bc8331526
1511 1511 |/
1512 1512 | o ba2ed02b0c9a
1513 1513 | |
1514 1514 | x 4a004186e638
1515 1515 |/ Obsfate: rewritten using amend as 8:b18bc8331526 by test (at 1970-01-01 00:00 +0000); rewritten using amend as 9:0b997eb7ceee by test (at 1970-01-01 00:00 +0000);
1516 1516 o dd800401bd8c
1517 1517 |
1518 1518 | x 9bd10a0775e4
1519 1519 |/ Obsfate: split as 5:dd800401bd8c, 6:4a004186e638, 7:ba2ed02b0c9a by test (at 1970-01-01 00:00 +0000);
1520 1520 o f897c6137566
1521 1521 |
1522 1522 | x 0dec01379d3b
1523 1523 | | Obsfate: rewritten as 3:f897c6137566 by test (at 1970-01-01 00:00 +0000); rewritten as 1:471f378eab4c by test (at 1970-01-01 00:00 +0000);
1524 1524 | x 471f378eab4c
1525 1525 |/ Obsfate: rewritten as 2:0dec01379d3b by test (at 1970-01-01 00:00 +0000);
1526 1526 o ea207398892e
1527 1527
1528 1528 $ hg fatelogjson --hidden
1529 1529 @ 0b997eb7ceee
1530 1530 |
1531 1531 | o b18bc8331526
1532 1532 |/
1533 1533 | o ba2ed02b0c9a
1534 1534 | |
1535 1535 | x 4a004186e638
1536 1536 |/ Obsfate: [{"markers": [["4a004186e63889f20cb16434fcbd72220bd1eace", ["b18bc8331526a22cbb1801022bd1555bf291c48b"], 0, [["operation", "amend"], ["user", "test"]], [0.0, 0], null]], "successors": ["b18bc8331526a22cbb1801022bd1555bf291c48b"]}, {"markers": [["4a004186e63889f20cb16434fcbd72220bd1eace", ["0b997eb7ceeee06200a02f8aab185979092d514e"], 0, [["operation", "amend"], ["user", "test"]], [0.0, 0], null]], "successors": ["0b997eb7ceeee06200a02f8aab185979092d514e"]}]
1537 1537 o dd800401bd8c
1538 1538 |
1539 1539 | x 9bd10a0775e4
1540 1540 |/ Obsfate: [{"markers": [["9bd10a0775e478708cada5f176ec6de654359ce7", ["dd800401bd8c79d815329277739e433e883f784e", "4a004186e63889f20cb16434fcbd72220bd1eace", "ba2ed02b0c9a56b9fdbc4e79c7e57866984d8a1f"], 0, [["user", "test"]], [0.0, 0], null]], "successors": ["dd800401bd8c79d815329277739e433e883f784e", "4a004186e63889f20cb16434fcbd72220bd1eace", "ba2ed02b0c9a56b9fdbc4e79c7e57866984d8a1f"]}]
1541 1541 o f897c6137566
1542 1542 |
1543 1543 | x 0dec01379d3b
1544 1544 | | Obsfate: [{"markers": [["0dec01379d3be6318c470ead31b1fe7ae7cb53d5", ["f897c6137566320b081514b4c7227ecc3d384b39"], 0, [["user", "test"]], [0.0, 0], null]], "successors": ["f897c6137566320b081514b4c7227ecc3d384b39"]}, {"markers": [["0dec01379d3be6318c470ead31b1fe7ae7cb53d5", ["471f378eab4c5e25f6c77f785b27c936efb22874"], 0, [["user", "test"]], [0.0, 0], null]], "successors": ["471f378eab4c5e25f6c77f785b27c936efb22874"]}]
1545 1545 | x 471f378eab4c
1546 1546 |/ Obsfate: [{"markers": [["471f378eab4c5e25f6c77f785b27c936efb22874", ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"], 0, [["user", "test"]], [0.0, 0], null]], "successors": ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]}]
1547 1547 o ea207398892e
1548 1548
1549 1549 $ hg up --hidden 4
1550 1550 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1551 1551 $ hg rebase -r 7 -d 8 --config extensions.rebase=
1552 1552 rebasing 7:ba2ed02b0c9a "Add A,B,C"
1553 1553 $ hg tlog
1554 1554 o eceed8f98ffc
1555 1555 | Predecessors: 4:9bd10a0775e4
1556 1556 | semi-colon: 4:9bd10a0775e4
1557 1557 | json: ["9bd10a0775e478708cada5f176ec6de654359ce7"]
1558 1558 | map: 4:9bd10a0775e478708cada5f176ec6de654359ce7
1559 1559 | o 0b997eb7ceee
1560 1560 | | Predecessors: 4:9bd10a0775e4
1561 1561 | | semi-colon: 4:9bd10a0775e4
1562 1562 | | json: ["9bd10a0775e478708cada5f176ec6de654359ce7"]
1563 1563 | | map: 4:9bd10a0775e478708cada5f176ec6de654359ce7
1564 1564 o | b18bc8331526
1565 1565 |/ Predecessors: 4:9bd10a0775e4
1566 1566 | semi-colon: 4:9bd10a0775e4
1567 1567 | json: ["9bd10a0775e478708cada5f176ec6de654359ce7"]
1568 1568 | map: 4:9bd10a0775e478708cada5f176ec6de654359ce7
1569 1569 o dd800401bd8c
1570 1570 | Predecessors: 4:9bd10a0775e4
1571 1571 | semi-colon: 4:9bd10a0775e4
1572 1572 | json: ["9bd10a0775e478708cada5f176ec6de654359ce7"]
1573 1573 | map: 4:9bd10a0775e478708cada5f176ec6de654359ce7
1574 1574 | @ 9bd10a0775e4
1575 1575 |/ Successors: 5:dd800401bd8c 9:0b997eb7ceee 10:eceed8f98ffc; 5:dd800401bd8c 8:b18bc8331526 10:eceed8f98ffc
1576 1576 | multi-line: 5:dd800401bd8c 9:0b997eb7ceee 10:eceed8f98ffc
1577 1577 | multi-line: 5:dd800401bd8c 8:b18bc8331526 10:eceed8f98ffc
1578 1578 | json: [["dd800401bd8c79d815329277739e433e883f784e", "0b997eb7ceeee06200a02f8aab185979092d514e", "eceed8f98ffc4186032e29a6542ab98888ebf68d"], ["dd800401bd8c79d815329277739e433e883f784e", "b18bc8331526a22cbb1801022bd1555bf291c48b", "eceed8f98ffc4186032e29a6542ab98888ebf68d"]]
1579 1579 o f897c6137566
1580 1580 |
1581 1581 o ea207398892e
1582 1582
1583 1583
1584 1584 $ hg fatelog
1585 1585 o eceed8f98ffc
1586 1586 |
1587 1587 | o 0b997eb7ceee
1588 1588 | |
1589 1589 o | b18bc8331526
1590 1590 |/
1591 1591 o dd800401bd8c
1592 1592 |
1593 1593 | @ 9bd10a0775e4
1594 1594 |/ Obsfate: split using amend, rebase as 5:dd800401bd8c, 9:0b997eb7ceee, 10:eceed8f98ffc by test (at 1970-01-01 00:00 +0000); split using amend, rebase as 5:dd800401bd8c, 8:b18bc8331526, 10:eceed8f98ffc by test (at 1970-01-01 00:00 +0000);
1595 1595 o f897c6137566
1596 1596 |
1597 1597 o ea207398892e
1598 1598
1599 1599 Test templates with pruned commits
1600 1600 ==================================
1601 1601
1602 1602 Test setup
1603 1603 ----------
1604 1604
1605 1605 $ hg init $TESTTMP/templates-local-prune
1606 1606 $ cd $TESTTMP/templates-local-prune
1607 1607 $ mkcommit ROOT
1608 1608 $ mkcommit A0
1609 1609 $ hg debugobsolete --record-parent `getid "."`
1610 1610 obsoleted 1 changesets
1611 1611
1612 1612 Check output
1613 1613 ------------
1614 1614
1615 1615 $ hg up "desc(A0)" --hidden
1616 1616 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
1617 1617 $ hg tlog
1618 1618 @ 471f378eab4c
1619 1619 |
1620 1620 o ea207398892e
1621 1621
1622 1622 $ hg fatelog
1623 1623 @ 471f378eab4c
1624 1624 | Obsfate: pruned by test (at 1970-01-01 00:00 +0000);
1625 1625 o ea207398892e
1626 1626
1627 1627 $ hg fatelog -v
1628 1628 @ 471f378eab4c
1629 1629 | Obsfate: pruned by test (at 1970-01-01 00:00 +0000);
1630 1630 o ea207398892e
1631 1631
1632 1632 Test templates with multiple pruned commits
1633 1633 ===========================================
1634 1634
1635 1635 Test setup
1636 1636 ----------
1637 1637
1638 1638 $ hg init $TESTTMP/multiple-local-prune
1639 1639 $ cd $TESTTMP/multiple-local-prune
1640 1640 $ mkcommit ROOT
1641 1641 $ mkcommit A0
1642 1642 $ hg commit --amend -m "A1"
1643 1643 $ hg debugobsolete --record-parent `getid "."`
1644 1644 obsoleted 1 changesets
1645 1645
1646 1646 $ hg up -r "desc(A0)" --hidden
1647 1647 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
1648 1648 $ hg commit --amend -m "A2"
1649 1649 $ hg debugobsolete --record-parent `getid "."`
1650 1650 obsoleted 1 changesets
1651 1651
1652 1652 Check output
1653 1653 ------------
1654 1654
1655 1655 $ hg up "desc(A0)" --hidden
1656 1656 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
1657 1657 $ hg tlog
1658 1658 @ 471f378eab4c
1659 1659 |
1660 1660 o ea207398892e
1661 1661
1662 1662 # todo: the obsfate output is not ideal
1663 1663 $ hg fatelog
1664 1664 @ 471f378eab4c
1665 1665 | Obsfate: pruned;
1666 1666 o ea207398892e
1667 1667
1668 1668 $ hg fatelog -v --hidden
1669 1669 x 65b757b745b9
1670 1670 | Obsfate: pruned by test (at 1970-01-01 00:00 +0000);
1671 1671 | x fdf9bde5129a
1672 1672 |/ Obsfate: pruned by test (at 1970-01-01 00:00 +0000);
1673 1673 | @ 471f378eab4c
1674 1674 |/ Obsfate: rewritten using amend as 2:fdf9bde5129a by test (at 1970-01-01 00:00 +0000); rewritten using amend as 3:65b757b745b9 by test (at 1970-01-01 00:00 +0000);
1675 1675 o ea207398892e
1676 1676
1677 1677
1678 1678 Test templates with splitted and pruned commit
1679 1679 ==============================================
1680 1680
1681 1681 $ hg init $TESTTMP/templates-local-split-prune
1682 1682 $ cd $TESTTMP/templates-local-split-prune
1683 1683 $ mkcommit ROOT
1684 1684 $ echo 42 >> a
1685 1685 $ echo 43 >> b
1686 1686 $ hg commit -A -m "A0"
1687 1687 adding a
1688 1688 adding b
1689 1689 $ hg log --hidden -G
1690 1690 @ changeset: 1:471597cad322
1691 1691 | tag: tip
1692 1692 | user: test
1693 1693 | date: Thu Jan 01 00:00:00 1970 +0000
1694 1694 | summary: A0
1695 1695 |
1696 1696 o changeset: 0:ea207398892e
1697 1697 user: test
1698 1698 date: Thu Jan 01 00:00:00 1970 +0000
1699 1699 summary: ROOT
1700 1700
1701 1701 # Simulate split
1702 1702 $ hg up -r "desc(ROOT)"
1703 1703 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
1704 1704 $ echo 42 >> a
1705 1705 $ hg commit -A -m "A1"
1706 1706 adding a
1707 1707 created new head
1708 1708 $ echo 43 >> b
1709 1709 $ hg commit -A -m "A2"
1710 1710 adding b
1711 1711 $ hg debugobsolete `getid "1"` `getid "2"` `getid "3"`
1712 1712 obsoleted 1 changesets
1713 1713
1714 1714 # Simulate prune
1715 1715 $ hg debugobsolete --record-parent `getid "."`
1716 1716 obsoleted 1 changesets
1717 1717
1718 1718 $ hg log --hidden -G
1719 1719 @ changeset: 3:0d0ef4bdf70e
1720 1720 | tag: tip
1721 1721 | user: test
1722 1722 | date: Thu Jan 01 00:00:00 1970 +0000
1723 1723 | summary: A2
1724 1724 |
1725 1725 o changeset: 2:617adc3a144c
1726 1726 | parent: 0:ea207398892e
1727 1727 | user: test
1728 1728 | date: Thu Jan 01 00:00:00 1970 +0000
1729 1729 | summary: A1
1730 1730 |
1731 1731 | x changeset: 1:471597cad322
1732 1732 |/ user: test
1733 1733 | date: Thu Jan 01 00:00:00 1970 +0000
1734 1734 | summary: A0
1735 1735 |
1736 1736 o changeset: 0:ea207398892e
1737 1737 user: test
1738 1738 date: Thu Jan 01 00:00:00 1970 +0000
1739 1739 summary: ROOT
1740 1740
1741 1741 Check templates
1742 1742 ---------------
1743 1743
1744 1744 $ hg up 'desc("A0")' --hidden
1745 1745 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
1746 1746
1747 1747 # todo: the obsfate output is not ideal
1748 1748 $ hg fatelog
1749 1749 o 617adc3a144c
1750 1750 |
1751 1751 | @ 471597cad322
1752 1752 |/ Obsfate: pruned;
1753 1753 o ea207398892e
1754 1754
1755 1755 $ hg up -r 'desc("A2")' --hidden
1756 1756 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
1757 1757
1758 1758 $ hg fatelog --hidden
1759 1759 @ 0d0ef4bdf70e
1760 1760 | Obsfate: pruned by test (at 1970-01-01 00:00 +0000);
1761 1761 o 617adc3a144c
1762 1762 |
1763 1763 | x 471597cad322
1764 1764 |/ Obsfate: split as 2:617adc3a144c, 3:0d0ef4bdf70e by test (at 1970-01-01 00:00 +0000);
1765 1765 o ea207398892e
1766 1766
General Comments 0
You need to be logged in to leave comments. Login now