diff --git a/mercurial/commands.py b/mercurial/commands.py --- a/mercurial/commands.py +++ b/mercurial/commands.py @@ -2128,6 +2128,8 @@ ('c', 'continue', False, _('resume interrupted graft')), ('e', 'edit', False, _('invoke editor on commit messages')), ('', 'log', None, _('append graft info to log message')), + ('', 'no-commit', None, + _("don't commit, just apply the changes in working directory")), ('f', 'force', False, _('force graft')), ('D', 'currentdate', False, _('record the current date as commit date')), @@ -2164,7 +2166,7 @@ .. note:: The -c/--continue option does not reapply earlier options, except - for --force, --user and --date. + for --force, --user, --date and --no-commit. .. container:: verbose @@ -2218,6 +2220,14 @@ **pycompat.strkwargs(opts)) cont = False + if opts.get('no_commit'): + if opts.get('edit'): + raise error.Abort(_("can't specify --no-commit and --edit")) + if opts.get('currentuser'): + raise error.Abort(_("can't specify --no-commit and --currentuser")) + if opts.get('currentdate'): + raise error.Abort(_("can't specify --no-commit and --currentdate")) + graftstate = statemod.cmdstate(repo, 'graftstate') if opts.get('continue'): cont = True @@ -2230,6 +2240,8 @@ opts['date'] = statedata['date'] if statedata.get('user'): opts['user'] = statedata['user'] + if statedata.get('no_commit'): + opts['no_commit'] = statedata.get('no_commit') nodes = statedata['nodes'] revs = [repo[node].rev() for node in nodes] else: @@ -2316,6 +2328,8 @@ if not revs: return -1 + if opts.get('no_commit'): + statedata['no_commit'] = True for pos, ctx in enumerate(repo.set("%ld", revs)): desc = '%d:%s "%s"' % (ctx.rev(), ctx, ctx.description().split('\n', 1)[0]) @@ -2373,13 +2387,14 @@ else: cont = False - # commit - node = repo.commit(text=message, user=user, - date=date, extra=extra, editor=editor) - if node is None: - ui.warn( - _('note: graft of %d:%s created no changes to commit\n') % - (ctx.rev(), ctx)) + # commit if --no-commit is False + if not opts.get('no_commit'): + node = repo.commit(text=message, user=user, + date=date, extra=extra, editor=editor) + if node is None: + ui.warn( + _('note: graft of %d:%s created no changes to commit\n') % + (ctx.rev(), ctx)) # remove state when we complete successfully if not opts.get('dry_run'): diff --git a/tests/test-graft.t b/tests/test-graft.t --- a/tests/test-graft.t +++ b/tests/test-graft.t @@ -1536,3 +1536,106 @@ date: Thu Jan 01 00:00:00 1970 +0000 summary: bar to b +Test for --no-commit option: + + $ hg init nocommit + $ cd nocommit + $ echo a > a + $ hg ci -qAm0 + $ echo b > b + $ hg ci -qAm1 + $ hg up -q 0 + $ echo c > c + $ hg ci -qAm2 + +Check reporting when --no-commit used with non-applicable options: + + $ hg graft 1 --no-commit -e + abort: can't specify --no-commit and --edit + [255] + +Test --no-commit is working: + $ hg graft 1 --no-commit + grafting 1:925d80f479bb "1" + + $ hg tip -T "rev: {rev}\n" + rev: 2 + + $ hg diff + diff -r db815d6d32e6 b + --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + +++ b/b Thu Jan 01 00:00:00 1970 +0000 + @@ -0,0 +1,1 @@ + +b + + $ hg ci -qm3 + +Prepare wrdir to check --no-commit is resepected after --continue: + + $ echo A>a + $ hg ci -qm4 + $ hg up -q 1 + $ echo B>a + $ hg ci -qm5 + $ hg graft 4 --no-commit + grafting 4:a08bb3910e7c "4" + merging a + warning: conflicts while merging a! (edit, then use 'hg resolve --mark') + abort: unresolved conflicts, can't continue + (use 'hg resolve' and 'hg graft --continue') + [255] + +Resolving conflict: + + $ echo A>a + $ hg resolve --mark + (no more unresolved files) + continue: hg graft --continue + +Test --no-commit is respected after --continue: + + $ hg graft --continue + grafting 4:a08bb3910e7c "4" + $ hg tip -T "rev: {rev}\n" + rev: 5 + $ hg diff + diff -r b1d5b5056844 a + --- a/a Thu Jan 01 00:00:00 1970 +0000 + +++ b/a Thu Jan 01 00:00:00 1970 +0000 + @@ -1,1 +1,1 @@ + -B + +A + +Prepare wrdir to check --no-commit is resepected when passed with --continue: + + $ echo B>a + $ hg graft 4 + grafting 4:a08bb3910e7c "4" + merging a + warning: conflicts while merging a! (edit, then use 'hg resolve --mark') + abort: unresolved conflicts, can't continue + (use 'hg resolve' and 'hg graft --continue') + [255] + +Resolving conflict: + + $ echo A>a + $ hg resolve --mark + (no more unresolved files) + continue: hg graft --continue + +Test --no-commit is respected with --continue: + $ hg graft --continue --no-commit + grafting 4:a08bb3910e7c "4" + $ hg diff + diff -r b1d5b5056844 a + --- a/a Thu Jan 01 00:00:00 1970 +0000 + +++ b/a Thu Jan 01 00:00:00 1970 +0000 + @@ -1,1 +1,1 @@ + -B + +A + $ hg tip -T "rev: {rev}\n" + rev: 5 + + $ cd .. +