Show More
@@ -3425,3 +3425,90 b' def hgabortgraft(ui, repo):' | |||
|
3425 | 3425 | with repo.wlock(): |
|
3426 | 3426 | graftstate = statemod.cmdstate(repo, 'graftstate') |
|
3427 | 3427 | return abortgraft(ui, repo, graftstate) |
|
3428 | ||
|
3429 | def continuegraft(ui, repo): | |
|
3430 | """logic to resume interrupted graft using 'hg continue'""" | |
|
3431 | with repo.wlock(): | |
|
3432 | graftstate = statemod.cmdstate(repo, 'graftstate') | |
|
3433 | statedata = readgraftstate(repo, graftstate) | |
|
3434 | opts = {} | |
|
3435 | cont = True | |
|
3436 | if statedata.get('date'): | |
|
3437 | opts['date'] = statedata['date'] | |
|
3438 | if statedata.get('user'): | |
|
3439 | opts['user'] = statedata['user'] | |
|
3440 | if statedata.get('log'): | |
|
3441 | opts['log'] = True | |
|
3442 | if statedata.get('no_commit'): | |
|
3443 | opts['no_commit'] = statedata.get('no_commit') | |
|
3444 | nodes = statedata['nodes'] | |
|
3445 | revs = [repo[node].rev() for node in nodes] | |
|
3446 | ||
|
3447 | skipped = set() | |
|
3448 | for rev in repo.revs('%ld and merge()', revs): | |
|
3449 | ui.warn(_('skipping ungraftable merge revision %d\n') % rev) | |
|
3450 | skipped.add(rev) | |
|
3451 | revs = [r for r in revs if r not in skipped] | |
|
3452 | if not revs: | |
|
3453 | return -1 | |
|
3454 | ||
|
3455 | for pos, ctx in enumerate(repo.set("%ld", revs)): | |
|
3456 | desc = '%d:%s "%s"' % (ctx.rev(), ctx, | |
|
3457 | ctx.description().split('\n', 1)[0]) | |
|
3458 | names = repo.nodetags(ctx.node()) + repo.nodebookmarks(ctx.node()) | |
|
3459 | if names: | |
|
3460 | desc += ' (%s)' % ' '.join(names) | |
|
3461 | ui.status(_('grafting %s\n') % desc) | |
|
3462 | ||
|
3463 | source = ctx.extra().get('source') | |
|
3464 | extra = {} | |
|
3465 | if source: | |
|
3466 | extra['source'] = source | |
|
3467 | extra['intermediate-source'] = ctx.hex() | |
|
3468 | else: | |
|
3469 | extra['source'] = ctx.hex() | |
|
3470 | user = ctx.user() | |
|
3471 | if opts.get('user'): | |
|
3472 | user = opts['user'] | |
|
3473 | statedata['user'] = user | |
|
3474 | date = ctx.date() | |
|
3475 | if opts.get('date'): | |
|
3476 | date = opts['date'] | |
|
3477 | statedata['date'] = date | |
|
3478 | message = ctx.description() | |
|
3479 | if opts.get('log'): | |
|
3480 | message += '\n(grafted from %s)' % ctx.hex() | |
|
3481 | statedata['log'] = True | |
|
3482 | if not cont: | |
|
3483 | # perform the graft merge with p1(rev) as 'ancestor' | |
|
3484 | overrides = {('ui', 'forcemerge'): opts.get('tool', '')} | |
|
3485 | base = ctx.p1() | |
|
3486 | with ui.configoverride(overrides, 'graft'): | |
|
3487 | stats = mergemod.graft(repo, ctx, base, ['local', 'graft']) | |
|
3488 | # report any conflicts | |
|
3489 | if stats.unresolvedcount > 0: | |
|
3490 | # write out state for --continue | |
|
3491 | nodes = [repo[rev].hex() for rev in revs[pos:]] | |
|
3492 | statedata['nodes'] = nodes | |
|
3493 | stateversion = 1 | |
|
3494 | graftstate.save(stateversion, statedata) | |
|
3495 | hint = _("use 'hg resolve' and 'hg graft --continue'") | |
|
3496 | raise error.Abort( | |
|
3497 | _("unresolved conflicts, can't continue"), | |
|
3498 | hint=hint) | |
|
3499 | else: | |
|
3500 | cont = False | |
|
3501 | editor = getcommiteditor(editform='graft', | |
|
3502 | **pycompat.strkwargs(opts)) | |
|
3503 | if not opts.get('no_commit'): | |
|
3504 | node = repo.commit(text=message, user=user, date=date, | |
|
3505 | extra=extra, editor=editor) | |
|
3506 | if node is None: | |
|
3507 | ui.warn( | |
|
3508 | _('note: graft of %d:%s created no changes to commit\n') % | |
|
3509 | (ctx.rev(), ctx)) | |
|
3510 | # checking that newnodes exist because old state files won't have it | |
|
3511 | if statedata.get('newnodes') is not None: | |
|
3512 | statedata['newnodes'].append(node) | |
|
3513 | graftstate.delete() | |
|
3514 | return 0 |
@@ -2706,6 +2706,7 b' def _stopgraft(ui, repo, graftstate):' | |||
|
2706 | 2706 | statemod.addunfinished( |
|
2707 | 2707 | 'graft', fname='graftstate', clearable=True, stopflag=True, |
|
2708 | 2708 | continueflag=True, abortfunc=cmdutil.hgabortgraft, |
|
2709 | continuefunc=cmdutil.continuegraft, | |
|
2709 | 2710 | cmdhint=_("use 'hg graft --continue' or 'hg graft --stop' to stop") |
|
2710 | 2711 | ) |
|
2711 | 2712 |
@@ -1,4 +1,4 b'' | |||
|
1 | #testcases abortcommand abortflag | |
|
1 | #testcases abortcommand abortflag continueflag continuecommand | |
|
2 | 2 | |
|
3 | 3 | $ cat >> $HGRCPATH <<EOF |
|
4 | 4 | > [extdiff] |
@@ -13,6 +13,13 b'' | |||
|
13 | 13 | > EOF |
|
14 | 14 | #endif |
|
15 | 15 | |
|
16 | #if continueflag | |
|
17 | $ cat >> $HGRCPATH <<EOF | |
|
18 | > [alias] | |
|
19 | > continue = graft --continue | |
|
20 | > EOF | |
|
21 | #endif | |
|
22 | ||
|
16 | 23 | Create a repo with some stuff in it: |
|
17 | 24 | |
|
18 | 25 | $ hg init a |
@@ -92,9 +99,11 b" Can't continue without starting:" | |||
|
92 | 99 | |
|
93 | 100 | $ hg -q up -cr tip |
|
94 | 101 | $ hg rm -q e |
|
95 |
$ hg |
|
|
96 | abort: no graft in progress | |
|
102 | $ hg continue | |
|
103 | abort: no graft in progress (continueflag !) | |
|
104 | abort: no operation in progress (no-continueflag !) | |
|
97 | 105 | [255] |
|
106 | ||
|
98 | 107 | $ hg revert -r . -q e |
|
99 | 108 | |
|
100 | 109 | Need to specify a rev: |
@@ -1697,7 +1706,13 b' Writing the nodes in old format to graft' | |||
|
1697 | 1706 | $ hg resolve -m |
|
1698 | 1707 | (no more unresolved files) |
|
1699 | 1708 | continue: hg graft --continue |
|
1700 | $ hg graft --continue | |
|
1709 | ||
|
1710 | #if continuecommand | |
|
1711 | $ hg continue --dry-run | |
|
1712 | graft in progress, will be resumed | |
|
1713 | #endif | |
|
1714 | ||
|
1715 | $ hg continue | |
|
1701 | 1716 | grafting 1:80e6d2c47cfe "added b" |
|
1702 | 1717 | grafting 2:8be98ac1a569 "added c" |
|
1703 | 1718 | |
@@ -1754,7 +1769,7 b' running `hg graft --continue`' | |||
|
1754 | 1769 | (no more unresolved files) |
|
1755 | 1770 | continue: hg graft --continue |
|
1756 | 1771 | |
|
1757 |
$ hg |
|
|
1772 | $ hg continue | |
|
1758 | 1773 | grafting 1:80e6d2c47cfe "added b" |
|
1759 | 1774 | grafting 2:8be98ac1a569 "added c" |
|
1760 | 1775 | |
@@ -1803,7 +1818,7 b' Test that --date is preserved and reused' | |||
|
1803 | 1818 | $ hg resolve -m |
|
1804 | 1819 | (no more unresolved files) |
|
1805 | 1820 | continue: hg graft --continue |
|
1806 |
$ hg |
|
|
1821 | $ hg continue | |
|
1807 | 1822 | grafting 1:80e6d2c47cfe "added b" |
|
1808 | 1823 | grafting 2:8be98ac1a569 "added c" |
|
1809 | 1824 | |
@@ -1843,7 +1858,7 b' Test that --log is preserved and reused ' | |||
|
1843 | 1858 | (no more unresolved files) |
|
1844 | 1859 | continue: hg graft --continue |
|
1845 | 1860 | |
|
1846 |
$ hg |
|
|
1861 | $ hg continue | |
|
1847 | 1862 | grafting 1:80e6d2c47cfe "added b" |
|
1848 | 1863 | grafting 2:8be98ac1a569 "added c" |
|
1849 | 1864 | |
@@ -1997,7 +2012,7 b' before the graft' | |||
|
1997 | 2012 | |
|
1998 | 2013 | $ hg abort |
|
1999 | 2014 | abort: no interrupted graft to abort (abortflag !) |
|
2000 |
abort: no operation in progress ( |
|
|
2015 | abort: no operation in progress (no-abortflag !) | |
|
2001 | 2016 | [255] |
|
2002 | 2017 | |
|
2003 | 2018 | when stripping is required |
@@ -2273,7 +2288,7 b' Resolve conflict:' | |||
|
2273 | 2288 | (no more unresolved files) |
|
2274 | 2289 | continue: hg graft --continue |
|
2275 | 2290 | |
|
2276 |
$ hg |
|
|
2291 | $ hg continue | |
|
2277 | 2292 | grafting 3:09e253b87e17 "A in file a" |
|
2278 | 2293 | $ hg log -GT "{rev}:{node|short} {desc}\n" |
|
2279 | 2294 | @ 4:2aa9ad1006ff B in file a |
@@ -2350,7 +2365,7 b' When there is conflict:' | |||
|
2350 | 2365 | $ hg resolve --mark |
|
2351 | 2366 | (no more unresolved files) |
|
2352 | 2367 | continue: hg graft --continue |
|
2353 |
$ hg |
|
|
2368 | $ hg continue | |
|
2354 | 2369 | grafting 3:09e253b87e17 "A in file a" |
|
2355 | 2370 | $ hg diff |
|
2356 | 2371 | diff -r 2aa9ad1006ff a |
General Comments 0
You need to be logged in to leave comments.
Login now