hgext3rd/topic/__init__.py
branchmercurial-4.8
changeset 4356 a71f2271ed76
parent 4320 b4bc185bcefb
child 4365 8c4289d0e91e
--- a/hgext3rd/topic/__init__.py	Tue Jan 22 10:43:44 2019 -0500
+++ b/hgext3rd/topic/__init__.py	Tue Jan 22 10:46:02 2019 -0500
@@ -177,10 +177,10 @@
               'topic.active': 'green',
              }
 
-__version__ = '0.12.4.dev'
+__version__ = '0.13.0.dev'
 
-testedwith = '4.3.3 4.4.2 4.5.2 4.6.2 4.7 4.8'
-minimumhgversion = '4.3'
+testedwith = '4.4.2 4.5.2 4.6.2 4.7 4.8'
+minimumhgversion = '4.4'
 buglink = 'https://bz.mercurial-scm.org/'
 
 if util.safehasattr(registrar, 'configitem'):
@@ -680,7 +680,11 @@
             txn = repo.transaction('rewrite-topics')
             rewrote = _changetopics(ui, repo, touchedrevs, topic)
             txn.close()
-            ui.status('changed topic on %d changes\n' % rewrote)
+            if topic is None:
+                ui.status('cleared topic on %d changesets\n' % rewrote)
+            else:
+                ui.status('changed topic on %d changesets to "%s"\n' % (rewrote,
+                                                                        topic))
         finally:
             lockmod.release(txn, lock, wl)
             repo.invalidate()
@@ -717,6 +721,8 @@
     return ret
 
 @command('stack', [
+        ('c', 'children', None,
+            _('display data about children outside of the stack'))
     ] + commands.formatteropts,
     _('hg stack [TOPIC]'))
 def cmdstack(ui, repo, topic='', **opts):
@@ -950,17 +956,21 @@
 
 def _listtopics(ui, repo, opts):
     fm = ui.formatter('topics', opts)
-    showlast = opts.get('age')
-    if showlast:
-        # we have a new function as plugging logic into existing function is
-        # pretty much difficult
-        return _showlasttouched(repo, fm, opts)
     activetopic = repo.currenttopic
     namemask = '%s'
     if repo.topics:
         maxwidth = max(len(t) for t in repo.topics)
         namemask = '%%-%is' % maxwidth
-    for topic in sorted(repo.topics):
+    if opts.get('age'):
+        # here we sort by age and topic name
+        topicsdata = sorted(_getlasttouched(repo, repo.topics))
+    else:
+        # here we sort by topic name only
+        topicsdata = (
+            (None, topic, None, None)
+            for topic in sorted(repo.topics)
+        )
+    for age, topic, date, user in topicsdata:
         fm.startitem()
         marker = ' '
         label = 'topic'
@@ -977,8 +987,18 @@
         if ui.quiet:
             fm.plain('\n')
             continue
+        fm.plain(' (')
+        if date:
+            if age == -1:
+                timestr = 'empty and active'
+            else:
+                timestr = templatefilters.age(date)
+            fm.write('lasttouched', '%s', timestr, label='topic.list.time')
+        if user:
+            fm.write('usertouched', ' by %s', user, label='topic.list.user')
+        if date:
+            fm.plain(', ')
         data = stack.stack(repo, topic=topic)
-        fm.plain(' (')
         if ui.verbose:
             fm.write('branches+', 'on branch: %s',
                      '+'.join(data.branches), # XXX use list directly after 4.0 is released
@@ -1018,52 +1038,17 @@
         fm.plain(')\n')
     fm.end()
 
-def _showlasttouched(repo, fm, opts):
-    topics = repo.topics
-    timedict = _getlasttouched(repo, topics)
-    times = timedict.keys()
-    times.sort()
-    if topics:
-        maxwidth = max(len(t) for t in topics)
-        namemask = '%%-%is' % maxwidth
-    activetopic = repo.currenttopic
-    for timevalue in times:
-        curtopics = sorted(timedict[timevalue][1])
-        for topic, user in curtopics:
-            fm.startitem()
-            marker = ' '
-            label = 'topic'
-            active = (topic == activetopic)
-            if active:
-                marker = '*'
-                label = 'topic.active'
-            fm.plain(' %s ' % marker, label=label)
-            fm.write('topic', namemask, topic, label=label)
-            fm.data(active=active)
-            fm.plain(' (')
-            if timevalue == -1:
-                timestr = 'empty and active'
-            else:
-                timestr = templatefilters.age(timedict[timevalue][0])
-            fm.write('lasttouched', '%s', timestr, label='topic.list.time')
-            if user:
-                fm.write('usertouched', ' by %s', user, label='topic.list.user')
-            fm.plain(')')
-            fm.plain('\n')
-    fm.end()
-
 def _getlasttouched(repo, topics):
     """
-    Calculates the last time a topic was used. Returns a dictionary of seconds
-    passed from current time for a topic as keys and topic name as values.
+    Calculates the last time a topic was used. Returns a generator of 4-tuples:
+    (age in seconds, topic name, date, and user who last touched the topic).
     """
-    topicstime = {}
     curtime = time.time()
-    for t in topics:
-        secspassed = -1
+    for topic in topics:
+        age = -1
         user = None
         maxtime = (0, 0)
-        trevs = repo.revs("topic(%s)", t)
+        trevs = repo.revs("topic(%s)", topic)
         # Need to check for the time of all changesets in the topic, whether
         # they are obsolete of non-heads
         # XXX: can we just rely on the max rev number for this
@@ -1084,16 +1069,10 @@
                     maxtime = rt
 
         username = stack.parseusername(user)
-        topicuser = (t, username)
+        if trevs:
+            age = curtime - maxtime[0]
 
-        if trevs:
-            secspassed = (curtime - maxtime[0])
-        try:
-            topicstime[secspassed][1].append(topicuser)
-        except KeyError:
-            topicstime[secspassed] = (maxtime, [topicuser])
-
-    return topicstime
+        yield (age, topic, maxtime, username)
 
 def summaryhook(ui, repo):
     t = getattr(repo, 'currenttopic', '')