diff hgext3rd/topic/stack.py @ 2669:b933a8068c17

topic: add some initial support for using stack on named branch Stack is a useful command that can make sense in other context. The current support is hacky and awful, but we have something!
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Wed, 28 Jun 2017 02:45:57 +0200
parents 1d2c66dc4ee3
children f5d52fa1cd55
line wrap: on
line diff
--- a/hgext3rd/topic/stack.py	Wed Jun 28 01:58:09 2017 +0200
+++ b/hgext3rd/topic/stack.py	Wed Jun 28 02:45:57 2017 +0200
@@ -10,9 +10,16 @@
 )
 from .evolvebits import builddependencies, _orderrevs, _singlesuccessor
 
-def getstack(repo, topic=None):
+def getstack(repo, branch=None, topic=None):
     # XXX need sorting
-    trevs = repo.revs("topic(%s) - obsolete()", topic)
+    if topic is not None and branch is not None:
+        raise error.ProgrammingError('both branch and topic specified (not defined yet)')
+    elif topic is not None:
+        trevs = repo.revs("topic(%s) - obsolete()", topic)
+    elif branch is not None:
+        trevs = repo.revs("branch(%s) - obsolete()", branch)
+    else:
+        raise error.ProgrammingError('neither branch and topic specified (not defined yet)')
     return _orderrevs(repo, trevs)
 
 def labelsgen(prefix, labelssuffix):
@@ -21,12 +28,22 @@
     """
     return ' '.join(prefix % suffix for suffix in labelssuffix)
 
-def showstack(ui, repo, topic=None, opts=None):
+def showstack(ui, repo, branch=None, topic=None, opts=None):
     if opts is None:
         opts = {}
 
-    if topic not in repo.topics:
-        raise error.Abort(_('cannot resolve "%s": no such topic found') % topic)
+    if topic is not None and branch is not None:
+        msg = 'both branch and topic specified [%s]{%s}(not defined yet)'
+        msg %= (branch, topic)
+        raise error.ProgrammingError(msg)
+    elif topic is not None:
+        prefix = 't'
+        if topic not in repo.topics:
+            raise error.Abort(_('cannot resolve "%s": no such topic found') % topic)
+    elif branch is not None:
+        prefix = 'b'
+    else:
+        raise error.ProgrammingError('neither branch and topic specified (not defined yet)')
 
     fm = ui.formatter('topicstack', opts)
     prev = None
@@ -37,7 +54,7 @@
     if topic == repo.currenttopic:
         label = 'topic.active'
 
-    data = stackdata(repo, topic=topic)
+    data = stackdata(repo, branch=branch, topic=topic)
     fm.plain(_('### topic: %s') % ui.label(topic, label),
              label='topic.stack.summary.topic')
 
@@ -58,7 +75,7 @@
         fm.plain('%d behind' % data['behindcount'], label='topic.stack.summary.behindcount')
     fm.plain('\n')
 
-    for idx, r in enumerate(getstack(repo, topic=topic), 1):
+    for idx, r in enumerate(getstack(repo, branch=branch, topic=topic), 1):
         ctx = repo[r]
         p1 = ctx.p1()
         if p1.obsolete():
@@ -100,7 +117,7 @@
         if idx is None:
             fm.plain('  ')
         else:
-            fm.write('topic.stack.index', 't%d', idx,
+            fm.write('topic.stack.index', '%s%%d' % prefix, idx,
                      label='topic.stack.index ' + labelsgen('topic.stack.index.%s', states))
         fm.write('topic.stack.state.symbol', '%s', symbol,
                  label='topic.stack.state ' + labelsgen('topic.stack.state.%s', states))
@@ -113,7 +130,7 @@
         fm.plain('\n')
     fm.end()
 
-def stackdata(repo, topic=None):
+def stackdata(repo, branch=None, topic=None):
     """get various data about a stack
 
     :changesetcount: number of non-obsolete changesets in the stack
@@ -122,7 +139,7 @@
     :behindcount: number of changeset on rebase destination
     """
     data = {}
-    revs = repo.revs("topic(%s) - obsolete()", topic)
+    revs = getstack(repo, branch, topic)
     data['changesetcount'] = len(revs)
     data['troubledcount'] = len([r for r in revs if repo[r].troubled()])
     deps, rdeps = builddependencies(repo, revs)