changeset 1633:9bcb24c3ba8d

merge with stable
author Pierre-Yves David <pierre-yves.david@fb.com>
date Fri, 18 Mar 2016 23:49:32 -0700
parents 7463f5880ce9 (diff) 498329a3c900 (current diff)
children 9ae4e79a28f3
files hgext/evolve.py
diffstat 11 files changed, 300 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/README	Thu Mar 17 17:03:51 2016 -0700
+++ b/README	Fri Mar 18 23:49:32 2016 -0700
@@ -56,6 +56,15 @@
 Changelog
 =========
 
+5.4.0 -- 
+
+- Some collaboration with the topic experimental extensions,
+  - hg evolve --all with consider all trouble in your current topic,
+  - preserve 'topic' during evolve,
+  - 'next' and 'prev' restrict themself to the current topic by default,
+  - remove the dangerous 'kill' alias for 'prune' (because 'hg kill -1' without
+    the leading 'hg' will give you an hardtime)
+
 5.3.0 -- 2016-02-11
 
 - split: add a new command to split changesets,
--- a/hgext/__init__.py	Thu Mar 17 17:03:51 2016 -0700
+++ b/hgext/__init__.py	Fri Mar 18 23:49:32 2016 -0700
@@ -1,1 +1,4 @@
-# Copyright 2011 Logilab SA <contact@logilab.fr>
+from __future__ import absolute_import
+import pkgutil
+__path__ = pkgutil.extend_path(__path__, __name__)
+
--- a/hgext/evolve.py	Thu Mar 17 17:03:51 2016 -0700
+++ b/hgext/evolve.py	Fri Mar 18 23:49:32 2016 -0700
@@ -62,7 +62,6 @@
 import sys, os
 import random
 from StringIO import StringIO
-import struct
 import re
 import collections
 import socket
@@ -1455,9 +1454,14 @@
         revs = repo.revs(targetcat+'()')
         if revopt:
             revs = scmutil.revrange(repo, revopt) & revs
-        elif not anyopt and targetcat == 'unstable':
-            revs = set(_aspiringdescendant(repo,
-                                           repo.revs('(.::) - obsolete()::')))
+        elif not anyopt:
+            topic = getattr(repo, 'currenttopic', '')
+            if topic:
+                revs = repo.revs('topic(%s)', topic) & revs
+            elif targetcat == 'unstable':
+                revs = _aspiringdescendant(repo,
+                                           repo.revs('(.::) - obsolete()::'))
+                revs = set(revs)
         if targetcat == 'divergent':
             # Pick one divergent per group of divergents
             revs = _dedupedivergents(repo, revs)
@@ -1645,7 +1649,7 @@
 
     def progresscb():
         if revopt or allopt:
-            ui.progress(_('evolve'), seen, unit='changesets', total=count)
+            ui.progress(_('evolve'), seen, unit=_('changesets'), total=count)
 
     # Continuation handling
     if contopt:
@@ -2027,7 +2031,7 @@
 /!\ * hg up to the parent of the amended changeset (which are named W and Z)
 /!\ * hg revert --all -r X
 /!\ * hg ci -m "same message as the amended changeset" => new cset Y
-/!\ * hg kill -n Y W Z
+/!\ * hg prune -n Y W Z
 """)
     if progresscb: progresscb()
     emtpycommitallowed = repo.ui.backupconfig('ui', 'allowemptycommit')
@@ -2075,6 +2079,7 @@
          [('B', 'move-bookmark', False,
              _('move active bookmark after update')),
           ('', 'merge', False, _('bring uncommitted change along')),
+          ('', 'no-topic', False, _('ignore topic and move topologically')),
           ('n', 'dry-run', False,
              _('do not perform actions, just print what would be done'))],
          '[OPTION]...')
@@ -2095,8 +2100,14 @@
             raise
 
     parents = wparents[0].parents()
+    topic = getattr(repo, 'currenttopic', '')
+    if topic and not opts.get("no_topic", False):
+        parents = [ctx for ctx in parents if ctx.topic() == topic]
     displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate})
-    if len(parents) == 1:
+    if not parents:
+        ui.warn(_('no parent in topic "%s"\n') % topic)
+        ui.warn(_('(do you want --no-topic)\n'))
+    elif len(parents) == 1:
         p = parents[0]
         bm = bmactive(repo)
         shouldmove = opts.get('move_bookmark') and bm is not None
@@ -2133,6 +2144,7 @@
              _('move active bookmark after update')),
           ('', 'merge', False, _('bring uncommitted change along')),
           ('', 'evolve', False, _('evolve the next changeset if necessary')),
+          ('', 'no-topic', False, _('ignore topic and move topologically')),
           ('n', 'dry-run', False,
               _('do not perform actions, just print what would be done'))],
               '[OPTION]...')
@@ -2156,6 +2168,12 @@
             raise
 
     children = [ctx for ctx in wparents[0].children() if not ctx.obsolete()]
+    topic = getattr(repo, 'currenttopic', '')
+    filtered = []
+    if topic and not opts.get("no_topic", False):
+        filtered = [ctx for ctx in children if ctx.topic() != topic]
+        # XXX N-square membership on children
+        children = [ctx for ctx in children if ctx not in filtered]
     displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate})
     if len(children) == 1:
         c = children[0]
@@ -2191,8 +2209,17 @@
         result = 1
     else:
         aspchildren = _aspiringchildren(repo, [repo['.'].rev()])
+        if topic:
+            filtered.extend(repo[c] for c in children
+                            if repo[c].topic() != topic)
+            # XXX N-square membership on children
+            aspchildren = [ctx for ctx in aspchildren if ctx not in filtered]
         if not opts['evolve'] or not aspchildren:
-            ui.warn(_('no children\n'))
+            if filtered:
+                ui.warn(_('no children on topic "%s"\n') % topic)
+                ui.warn(_('do you want --no-topic\n'))
+            else:
+                ui.warn(_('no children\n'))
             if aspchildren:
                 msg = _('(%i unstable changesets to be evolved here, '
                         'do you want --evolve?)\n')
@@ -2272,7 +2299,7 @@
     return metadata
 
 
-@command('^prune|obsolete|kill',
+@command('^prune|obsolete',
     [('n', 'new', [], _("successor changeset (DEPRECATED)")),
      ('s', 'succ', [], _("successor changeset")),
      ('r', 'rev', [], _("revisions to prune")),
@@ -3044,7 +3071,7 @@
 
 @eh.extsetup
 def oldevolveextsetup(ui):
-    for cmd in ['kill', 'uncommit', 'touch', 'fold']:
+    for cmd in ['prune', 'uncommit', 'touch', 'fold']:
         try:
             entry = extensions.wrapcommand(cmdtable, cmd,
                                            warnobserrors)
@@ -3246,7 +3273,7 @@
         undecided.difference_update(common)
 
 
-    ui.progress(_("comparing with other"), None, total=totalnb)
+    ui.progress(_("comparing with other"), None)
     result = dag.headsetofconnecteds(common)
     ui.debug("%d total queries\n" % roundtrips)
 
@@ -3265,7 +3292,7 @@
         return len(self.getvalue())
 
     def read(self, size=None):
-        obsexcprg(self.ui, self.tell(), unit="bytes", total=self.length)
+        obsexcprg(self.ui, self.tell(), unit=_("bytes"), total=self.length)
         return StringIO.read(self, size)
 
     def __iter__(self):
@@ -3317,11 +3344,11 @@
                                % (len(markers), len(remotedata), totalbytes),
                       True)
             for key, data in remotedata:
-                obsexcprg(repo.ui, sentbytes, item=key, unit="bytes",
+                obsexcprg(repo.ui, sentbytes, item=key, unit=_("bytes"),
                           total=totalbytes)
                 rslts.append(remote.pushkey('obsolete', key, '', data))
                 sentbytes += len(data)
-                obsexcprg(repo.ui, sentbytes, item=key, unit="bytes",
+                obsexcprg(repo.ui, sentbytes, item=key, unit=_("bytes"),
                           total=totalbytes)
             obsexcprg(repo.ui, None)
             if [r for r in rslts if not r]:
@@ -3530,12 +3557,12 @@
     current = 0
     data = StringIO()
     ui = self.ui
-    obsexcprg(ui, current, unit="bytes", total=length)
+    obsexcprg(ui, current, unit=_("bytes"), total=length)
     while current < length:
         readsize = min(length - current, chunk)
         data.write(f.read(readsize))
         current += readsize
-        obsexcprg(ui, current, unit="bytes", total=length)
+        obsexcprg(ui, current, unit=_("bytes"), total=length)
     obsexcprg(ui, None)
     data.seek(0)
     return data
@@ -3834,6 +3861,14 @@
     bmdeactivate(repo)
     if keepbranch:
        repo.dirstate.setbranch(orig.branch())
+    if util.safehasattr(repo, 'currenttopic'):
+        # uurrgs
+        # there no other topic setter yet
+        if not orig.topic() and repo.vfs.exists('topic'):
+                repo.vfs.unlink('topic')
+        else:
+            with repo.vfs.open('topic', 'w') as f:
+                f.write(orig.topic())
 
     try:
        r = merge.graft(repo, orig, pctx, ['local', 'graft'], True)
--- a/tests/test-corrupt.t	Thu Mar 17 17:03:51 2016 -0700
+++ b/tests/test-corrupt.t	Fri Mar 18 23:49:32 2016 -0700
@@ -101,7 +101,7 @@
      summary:     add A
   
 
-  $ hg kill --fold -n -1 -- -2 -3
+  $ hg prune --fold -n -1 -- -2 -3
   2 changesets pruned
   $ hg push ../other
   pushing to ../other
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-evolve-topic.t	Fri Mar 18 23:49:32 2016 -0700
@@ -0,0 +1,223 @@
+
+Check we can find the topic extensions
+
+  $ [ -e $TOPICROOT/hgext3rd/topic/__init__.py ] || exit 80
+  $ cat >> $HGRCPATH <<EOF
+  > [defaults]
+  > amend=-d "0 0"
+  > fold=-d "0 0"
+  > [phases]
+  > publish = False
+  > [ui]
+  > logtemplate = {rev} - \{{get(namespaces, "topics")}} {node|short} {desc} ({phase})\n
+  > [diff]
+  > git = 1
+  > unified = 0
+  > [extensions]
+  > rebase = 
+  > topic = $TOPICROOT/hgext3rd/topic/
+  > EOF
+  $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH
+
+  $ mkcommit() {
+  >    echo "$1" > "$1"
+  >    hg add "$1"
+  >    hg ci -m "add $1"
+  > }
+
+Create a simple setup
+
+  $ hg init repoa
+  $ cd repoa
+  $ mkcommit aaa
+  $ mkcommit bbb
+  $ hg topic foo
+  $ mkcommit ccc
+  $ mkcommit ddd
+  created new head
+  $ mkcommit eee
+  created new head
+  $ mkcommit fff
+  created new head
+  $ hg topic bar
+  $ mkcommit ggg
+  created new head
+  $ mkcommit hhh
+  created new head
+  $ mkcommit iii
+  created new head
+  $ mkcommit jjj
+  created new head
+
+  $ hg log -G
+  @  9 - {bar} 1d964213b023 add jjj (draft)
+  |
+  o  8 - {bar} fcab990f3261 add iii (draft)
+  |
+  o  7 - {bar} b0c2554835ac add hhh (draft)
+  |
+  o  6 - {bar} c748293f1c1a add ggg (draft)
+  |
+  o  5 - {foo} 6a6b7365c751 add fff (draft)
+  |
+  o  4 - {foo} 3969ab847d9c add eee (draft)
+  |
+  o  3 - {foo} 4e3a154f38c7 add ddd (draft)
+  |
+  o  2 - {foo} cced9bac76e3 add ccc (draft)
+  |
+  o  1 - {} a4dbed0837ea add bbb (draft)
+  |
+  o  0 - {} 199cc73e9a0b add aaa (draft)
+  
+
+Test that evolve --all evolve the current topic
+-----------------------------------------------
+
+make a mess
+
+  $ hg up foo
+  switching to topic foo
+  0 files updated, 0 files merged, 4 files removed, 0 files unresolved
+  $ hg topic -l 
+    _ add bbb
+  t0: add ccc
+  t1: add ddd
+  t2: add eee
+  t3@ add fff (current)
+  $ hg up 'desc(ddd)'
+  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ echo ddd >> ddd
+  $ hg amend
+  6 new unstable changesets
+  $ hg up 'desc(fff)'
+  3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ echo fff >> fff
+  $ hg amend
+
+  $ hg log -G
+  @  13 - {foo} e104f49bab28 add fff (draft)
+  |
+  | o  11 - {foo} d9cacd156ffc add ddd (draft)
+  | |
+  | | o  9 - {bar} 1d964213b023 add jjj (draft)
+  | | |
+  | | o  8 - {bar} fcab990f3261 add iii (draft)
+  | | |
+  | | o  7 - {bar} b0c2554835ac add hhh (draft)
+  | | |
+  | | o  6 - {bar} c748293f1c1a add ggg (draft)
+  | | |
+  +---x  5 - {foo} 6a6b7365c751 add fff (draft)
+  | |
+  o |  4 - {foo} 3969ab847d9c add eee (draft)
+  | |
+  x |  3 - {foo} 4e3a154f38c7 add ddd (draft)
+  |/
+  o  2 - {foo} cced9bac76e3 add ccc (draft)
+  |
+  o  1 - {} a4dbed0837ea add bbb (draft)
+  |
+  o  0 - {} 199cc73e9a0b add aaa (draft)
+  
+
+Run evolve --all
+
+  $ hg evolve --all
+  move:[4] add eee
+  atop:[11] add ddd
+  move:[13] add fff
+  atop:[14] add eee
+  working directory is now at 070c5573d8f9
+  $ hg log -G
+  @  15 - {foo} 070c5573d8f9 add fff (draft)
+  |
+  o  14 - {foo} 42b49017ff90 add eee (draft)
+  |
+  o  11 - {foo} d9cacd156ffc add ddd (draft)
+  |
+  | o  9 - {bar} 1d964213b023 add jjj (draft)
+  | |
+  | o  8 - {bar} fcab990f3261 add iii (draft)
+  | |
+  | o  7 - {bar} b0c2554835ac add hhh (draft)
+  | |
+  | o  6 - {bar} c748293f1c1a add ggg (draft)
+  | |
+  | x  5 - {foo} 6a6b7365c751 add fff (draft)
+  | |
+  | x  4 - {foo} 3969ab847d9c add eee (draft)
+  | |
+  | x  3 - {foo} 4e3a154f38c7 add ddd (draft)
+  |/
+  o  2 - {foo} cced9bac76e3 add ccc (draft)
+  |
+  o  1 - {} a4dbed0837ea add bbb (draft)
+  |
+  o  0 - {} 199cc73e9a0b add aaa (draft)
+  
+
+Test that evolve does not loose topic information
+-------------------------------------------------
+
+  $ hg evolve --rev 'topic(bar)'
+  move:[6] add ggg
+  atop:[15] add fff
+  move:[7] add hhh
+  atop:[16] add ggg
+  move:[8] add iii
+  atop:[17] add hhh
+  move:[9] add jjj
+  atop:[18] add iii
+  working directory is now at 9bf430c106b7
+  $ hg log -G
+  @  19 - {bar} 9bf430c106b7 add jjj (draft)
+  |
+  o  18 - {bar} d2dc89c57700 add iii (draft)
+  |
+  o  17 - {bar} 20bc4d02aa62 add hhh (draft)
+  |
+  o  16 - {bar} 16d6f664b17c add ggg (draft)
+  |
+  o  15 - {foo} 070c5573d8f9 add fff (draft)
+  |
+  o  14 - {foo} 42b49017ff90 add eee (draft)
+  |
+  o  11 - {foo} d9cacd156ffc add ddd (draft)
+  |
+  o  2 - {foo} cced9bac76e3 add ccc (draft)
+  |
+  o  1 - {} a4dbed0837ea add bbb (draft)
+  |
+  o  0 - {} 199cc73e9a0b add aaa (draft)
+  
+
+Tests next and prev behavior
+============================
+
+Basic move are restricted to the current topic
+
+  $ hg up foo
+  switching to topic foo
+  0 files updated, 0 files merged, 4 files removed, 0 files unresolved
+  $ hg prev
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  [14] add eee
+  $ hg next
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  [15] add fff
+  $ hg next
+  no children on topic "foo"
+  do you want --no-topic
+  [1]
+  $ hg next --no-topic
+  switching to topic bar
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  [16] add ggg
+  $ hg prev
+  no parent in topic "bar"
+  (do you want --no-topic)
+  $ hg prev --no-topic
+  switching to topic foo
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  [15] add fff
--- a/tests/test-evolve.t	Thu Mar 17 17:03:51 2016 -0700
+++ b/tests/test-evolve.t	Fri Mar 18 23:49:32 2016 -0700
@@ -112,7 +112,7 @@
 
   $ hg log -r 1 --template '{rev} {phase} {obsolete}\n'
   1 public stable
-  $ hg kill 1
+  $ hg prune 1
   abort: cannot prune immutable changeset: 7c3bad9141dc
   (see "hg help phases" for details)
   [255]
@@ -123,7 +123,7 @@
 
   $ hg id -n
   5
-  $ hg kill .
+  $ hg prune .
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
   working directory now at fbb94e3a0ecf
   1 changesets pruned
@@ -136,7 +136,7 @@
 
 test multiple kill
 
-  $ hg kill 4 -r 3
+  $ hg prune 4 -r 3
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
   working directory now at 7c3bad9141dc
   2 changesets pruned
@@ -151,7 +151,7 @@
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ echo 4 > g
   $ hg add g
-  $ hg kill .
+  $ hg prune .
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
   working directory now at 7c3bad9141dc
   1 changesets pruned
@@ -790,7 +790,7 @@
   adding b
   $ hg mv a c
   $ hg ci -m c
-  $ hg kill .^
+  $ hg prune .^
   1 changesets pruned
   1 new unstable changesets
   $ hg stab --any
--- a/tests/test-inhibit.t	Thu Mar 17 17:03:51 2016 -0700
+++ b/tests/test-inhibit.t	Fri Mar 18 23:49:32 2016 -0700
@@ -419,7 +419,7 @@
   abort: hidden revision '3'!
   (use --hidden to access hidden revisions)
   [255]
-  $ hg rebase -r ad78ff7d621f -r 53a94305e133 -d  2db36d8066ff
+  $ hg rebase -r ad78ff7d621f -r 53a94305e133 -d  2db36d8066ff --config experimental.rebaseskipobsolete=0
   Warning: accessing hidden changesets 2db36d8066ff for write operation
   Warning: accessing hidden changesets ad78ff7d621f,53a94305e133 for write operation
   rebasing 10:ad78ff7d621f "add cK"
--- a/tests/test-obsolete-push.t	Thu Mar 17 17:03:51 2016 -0700
+++ b/tests/test-obsolete-push.t	Fri Mar 18 23:49:32 2016 -0700
@@ -25,7 +25,7 @@
   $ echo c > c
   $ hg ci -qAm C c
   $ hg phase --secret --force .
-  $ hg kill 0 1
+  $ hg prune 0 1
   2 changesets pruned
   1 new unstable changesets
   $ glog --hidden
--- a/tests/test-obsolete.t	Thu Mar 17 17:03:51 2016 -0700
+++ b/tests/test-obsolete.t	Fri Mar 18 23:49:32 2016 -0700
@@ -457,6 +457,7 @@
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ hg up 
   3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  1 other heads for branch "default"
   $ hg id -n
   8
 
@@ -508,7 +509,7 @@
 should not rebase extinct changesets
 
 #excluded 'whole rebase set is extinct and ignored.' message not in core
-  $ hg rebase -b '3' -d 4 --traceback
+  $ hg rebase -b '3' -d 4 --traceback --config experimental.rebaseskipobsolete=0
   rebasing 3:0d3f46688ccc "add obsol_c"
   rebasing 8:159dfc9fa5d3 "add obsol_d''" (tip)
   2 new divergent changesets
--- a/tests/test-sharing.t	Thu Mar 17 17:03:51 2016 -0700
+++ b/tests/test-sharing.t	Fri Mar 18 23:49:32 2016 -0700
@@ -89,6 +89,7 @@
   added 1 changesets with 1 changes to 1 files (+1 heads)
   2 new obsolescence markers
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  1 other heads for branch "default"
 
 Figure SG03
   $ hg shortlog --hidden -G
@@ -119,6 +120,7 @@
   $ cd ../test-repo
   $ hg update
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  1 other heads for branch "default"
   $ hg shortlog --hidden -G
   @  4:de6151c48e1c  draft  fix bug 37
   |
--- a/tests/test-stabilize-result.t	Thu Mar 17 17:03:51 2016 -0700
+++ b/tests/test-stabilize-result.t	Fri Mar 18 23:49:32 2016 -0700
@@ -366,6 +366,6 @@
   /!\ * hg up to the parent of the amended changeset (which are named W and Z)
   /!\ * hg revert --all -r X
   /!\ * hg ci -m "same message as the amended changeset" => new cset Y
-  /!\ * hg kill -n Y W Z
+  /!\ * hg prune -n Y W Z
   )
   [255]