Patchwork D2409: graft: add no-commit mode (issue5631)

login
register
mail settings
Submitter phabricator
Date June 2, 2018, 5:21 p.m.
Message ID <2b59df2d50378163bb731fff30bf8710@localhost.localdomain>
Download mbox | patch
Permalink /patch/31935/
State Not Applicable
Headers show

Comments

phabricator - June 2, 2018, 5:21 p.m.
khanchi97 updated this revision to Diff 8953.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D2409?vs=6538&id=8953

REVISION DETAIL
  https://phab.mercurial-scm.org/D2409

AFFECTED FILES
  mercurial/commands.py
  tests/test-graft.t

CHANGE DETAILS




To: khanchi97, #hg-reviewers
Cc: pulkit, mercurial-devel

Patch

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 ..
+
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
@@ -2232,6 +2242,10 @@ 
                 opts['user'] = statedata['user']
             nodes = statedata['nodes']
             revs = [repo[node].rev() for node in nodes]
+            if opts.get('no_commit'):
+                statedata['no_commit'] = True
+                stateversion = 1
+                graftstate.save(stateversion, statedata)
         else:
             cmdutil.wrongtooltocontinue(repo, _('graft'))
     else:
@@ -2361,6 +2375,11 @@ 
                 # write out state for --continue
                 nodes = [repo[rev].hex() for rev in revs[pos:]]
                 statedata['nodes'] = nodes
+                if pos == 0:
+                    if opts.get('no_commit'):
+                        statedata['no_commit'] = True
+                    else:
+                        statedata['no_commit'] = False
                 stateversion = 1
                 graftstate.save(stateversion, statedata)
                 extra = ''
@@ -2373,13 +2392,21 @@ 
         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
+        try:
+            flagfromstate = statedata['no_commit']
+        except KeyError:
+            flagfromstate = False
+
+        nocommitflag = opts.get('no_commit') or (opts.get('continue') and
+                                                 flagfromstate)
+        if not nocommitflag:
+            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'):