D3187: phase: add dry-run functionality

khanchi97 (Sushil khanchi) phabricator at mercurial-scm.org
Sat Apr 7 07:43:04 EDT 2018


khanchi97 updated this revision to Diff 7874.
khanchi97 retitled this revision from "phase: Add dry-run functionality" to "phase: add dry-run functionality".

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D3187?vs=7873&id=7874

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

AFFECTED FILES
  mercurial/commands.py
  tests/test-completion.t
  tests/test-phases.t

CHANGE DETAILS

diff --git a/tests/test-phases.t b/tests/test-phases.t
--- a/tests/test-phases.t
+++ b/tests/test-phases.t
@@ -826,3 +826,217 @@
   rollback completed
   abort: pretxnclose-phase.nopublish_D hook exited with status 1
   [255]
+
+Test dry-run functionality
+
+  $ hg init dryrunrepo
+  $ cd dryrunrepo
+  $ echo a > a
+  $ hg ci -qAm 0
+  test-debug-phase: new rev 0:  x -> 1
+  test-hook-close-phase: f7b1eb17ad24730a1651fccd46c43826d1bbc2ac:   -> draft
+  $ echo b > b
+  $ hg ci -qAm 1
+  test-debug-phase: new rev 1:  x -> 1
+  test-hook-close-phase: 925d80f479bb026b0fb3deb27503780b13f74123:   -> draft
+  $ echo c > c
+  $ hg ci -qAm 2
+  test-debug-phase: new rev 2:  x -> 1
+  test-hook-close-phase: 0316ce92851d493393d2181900388caa05d256c3:   -> draft
+  $ echo d > d
+  $ hg ci -qAm 3
+  test-debug-phase: new rev 3:  x -> 1
+  test-hook-close-phase: 14b465a7e25bf201e963c055be0e780414cff648:   -> draft
+  $ echo e > e
+  $ hg ci -qAm 4
+  test-debug-phase: new rev 4:  x -> 1
+  test-hook-close-phase: b385d13d5ed4ceb2b67ced172470734a60187cd1:   -> draft
+  $ echo f > f
+  $ hg ci -qAm 5
+  test-debug-phase: new rev 5:  x -> 1
+  test-hook-close-phase: fdc0253c25cfd67fe42b7be81e3abc9f92bebbd5:   -> draft
+  $ hg up 3 -q
+  $ echo g > g
+  $ hg ci -qAm 6
+  test-debug-phase: new rev 6:  x -> 1
+  test-hook-close-phase: f19b7f89f44eee9ffe34ba58b4e4ee3b3cea1f34:   -> draft
+  $ echo h > h
+  $ hg ci -qAm 7
+  test-debug-phase: new rev 7:  x -> 1
+  test-hook-close-phase: 4ccc844d545402eb0f39cd294227cd38de3ece20:   -> draft
+  $ hg log -G -T phases
+  @  changeset:   7:4ccc844d5454
+  |  tag:         tip
+  |  phase:       draft
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     7
+  |
+  o  changeset:   6:f19b7f89f44e
+  |  phase:       draft
+  |  parent:      3:14b465a7e25b
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     6
+  |
+  | o  changeset:   5:fdc0253c25cf
+  | |  phase:       draft
+  | |  user:        test
+  | |  date:        Thu Jan 01 00:00:00 1970 +0000
+  | |  summary:     5
+  | |
+  | o  changeset:   4:b385d13d5ed4
+  |/   phase:       draft
+  |    user:        test
+  |    date:        Thu Jan 01 00:00:00 1970 +0000
+  |    summary:     4
+  |
+  o  changeset:   3:14b465a7e25b
+  |  phase:       draft
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     3
+  |
+  o  changeset:   2:0316ce92851d
+  |  phase:       draft
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     2
+  |
+  o  changeset:   1:925d80f479bb
+  |  phase:       draft
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     1
+  |
+  o  changeset:   0:f7b1eb17ad24
+     phase:       draft
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     0
+  
+
+  $ hg phase --public 1
+  test-debug-phase: move rev 0: 1 -> 0
+  test-debug-phase: move rev 1: 1 -> 0
+  test-hook-close-phase: f7b1eb17ad24730a1651fccd46c43826d1bbc2ac:  draft -> public
+  test-hook-close-phase: 925d80f479bb026b0fb3deb27503780b13f74123:  draft -> public
+  $ hg phase --secret 4 --force
+  test-debug-phase: move rev 2: 1 -> 2
+  test-debug-phase: move rev 3: 1 -> 2
+  test-debug-phase: move rev 4: 1 -> 2
+  test-debug-phase: move rev 5: 1 -> 2
+  test-hook-close-phase: 0316ce92851d493393d2181900388caa05d256c3:  draft -> secret
+  test-hook-close-phase: 14b465a7e25bf201e963c055be0e780414cff648:  draft -> secret
+  test-hook-close-phase: b385d13d5ed4ceb2b67ced172470734a60187cd1:  draft -> secret
+  test-hook-close-phase: fdc0253c25cfd67fe42b7be81e3abc9f92bebbd5:  draft -> secret
+
+  $ hg log -G -T phases
+  @  changeset:   7:4ccc844d5454
+  |  tag:         tip
+  |  phase:       draft
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     7
+  |
+  o  changeset:   6:f19b7f89f44e
+  |  phase:       draft
+  |  parent:      3:14b465a7e25b
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     6
+  |
+  | o  changeset:   5:fdc0253c25cf
+  | |  phase:       secret
+  | |  user:        test
+  | |  date:        Thu Jan 01 00:00:00 1970 +0000
+  | |  summary:     5
+  | |
+  | o  changeset:   4:b385d13d5ed4
+  |/   phase:       secret
+  |    user:        test
+  |    date:        Thu Jan 01 00:00:00 1970 +0000
+  |    summary:     4
+  |
+  o  changeset:   3:14b465a7e25b
+  |  phase:       draft
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     3
+  |
+  o  changeset:   2:0316ce92851d
+  |  phase:       draft
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     2
+  |
+  o  changeset:   1:925d80f479bb
+  |  phase:       public
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     1
+  |
+  o  changeset:   0:f7b1eb17ad24
+     phase:       public
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     0
+  
+  $ hg phase --draft 0 5 -n
+  cannot move 1 changesets to a higher phase, use --force
+  phase changed for 2 changesets
+  [1]
+  $ hg phase --draft 0 5 --force -n
+  phase changed for 4 changesets
+
+  $ hg log -G -T phases
+  @  changeset:   7:4ccc844d5454
+  |  tag:         tip
+  |  phase:       draft
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     7
+  |
+  o  changeset:   6:f19b7f89f44e
+  |  phase:       draft
+  |  parent:      3:14b465a7e25b
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     6
+  |
+  | o  changeset:   5:fdc0253c25cf
+  | |  phase:       secret
+  | |  user:        test
+  | |  date:        Thu Jan 01 00:00:00 1970 +0000
+  | |  summary:     5
+  | |
+  | o  changeset:   4:b385d13d5ed4
+  |/   phase:       secret
+  |    user:        test
+  |    date:        Thu Jan 01 00:00:00 1970 +0000
+  |    summary:     4
+  |
+  o  changeset:   3:14b465a7e25b
+  |  phase:       draft
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     3
+  |
+  o  changeset:   2:0316ce92851d
+  |  phase:       draft
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     2
+  |
+  o  changeset:   1:925d80f479bb
+  |  phase:       public
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     1
+  |
+  o  changeset:   0:f7b1eb17ad24
+     phase:       public
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     0
+  
diff --git a/tests/test-completion.t b/tests/test-completion.t
--- a/tests/test-completion.t
+++ b/tests/test-completion.t
@@ -323,7 +323,7 @@
   outgoing: force, rev, newest-first, bookmarks, branch, patch, git, limit, no-merges, stat, graph, style, template, ssh, remotecmd, insecure, subrepos
   parents: rev, style, template
   paths: template
-  phase: public, draft, secret, force, rev
+  phase: public, draft, secret, force, rev, dry-run
   recover: 
   rename: after, force, include, exclude, dry-run
   resolve: all, list, mark, unmark, no-status, tool, include, exclude, template
diff --git a/mercurial/commands.py b/mercurial/commands.py
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -3828,7 +3828,7 @@
      ('s', 'secret', False, _('set changeset phase to secret')),
      ('f', 'force', False, _('allow to move boundary backward')),
      ('r', 'rev', [], _('target revision'), _('REV')),
-    ],
+    ] + dryrunopts,
     _('[-p|-d|-s] [-f] [-r] [REV...]'))
 def phase(ui, repo, *revs, **opts):
     """set or show the current phase name
@@ -3868,6 +3868,8 @@
 
     ret = 0
     if targetphase is None:
+        if opts['dry_run']:
+            raise error.Abort(_("can't use --dryrun when no targetphase"))
         # display
         for r in revs:
             ctx = repo[r]
@@ -3883,22 +3885,45 @@
             unfi = repo.unfiltered()
             getphase = unfi._phasecache.phase
             olddata = [getphase(unfi, r) for r in unfi]
-            phases.advanceboundary(repo, tr, targetphase, nodes)
-            if opts['force']:
-                phases.retractboundary(repo, tr, targetphase, nodes)
+            if not opts['dry_run']:
+                phases.advanceboundary(repo, tr, targetphase, nodes)
+                if opts['force']:
+                    phases.retractboundary(repo, tr, targetphase, nodes)
         getphase = unfi._phasecache.phase
         newdata = [getphase(unfi, r) for r in unfi]
         changes = sum(newdata[r] != olddata[r] for r in unfi)
         cl = unfi.changelog
         rejected = [n for n in nodes
                     if newdata[cl.rev(n)] < targetphase]
+        if opts['dry_run']:
+            rejected = []
+            if not opts['force']:
+                rejected = [n for n in nodes
+                            if olddata[cl.rev(n)] < targetphase]
+            affected = set()
+            allphases = range(3)
+            phcache = repo._phasecache.copy()
+            for phase in xrange(targetphase + 1, len(allphases)):
+                nds = [n for n in nodes
+                       if phcache.phase(repo, repo[n].rev()) >= phase]
+                if not nds:
+                    break
+                oldroots = repo._phasecache.phaseroots[phase]
+                affected.update(unfi.revs('%ln::%ln', oldroots, nds))
+            if opts['force']:
+                nds = [n for n in nodes
+                       if phcache.phase(repo, repo[n].rev()) < targetphase]
+                oldroots = repo._phasecache.phaseroots[targetphase]
+                affected.update(unfi.revs('(%ln::) - (%ln::)', nds,
+                                          oldroots))
+            changes = len(affected)
         if rejected:
             ui.warn(_('cannot move %i changesets to a higher '
                       'phase, use --force\n') % len(rejected))
             ret = 1
         if changes:
             msg = _('phase changed for %i changesets\n') % changes
-            if ret:
+            if ret or opts['dry_run']:
                 ui.status(msg)
             else:
                 ui.note(msg)



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


More information about the Mercurial-devel mailing list