diff mercurial/scmutil.py @ 35709:1a09dad8b85a

evolution: report new unstable changesets This adds a transaction summary callback that reports the number of new orphan, content-divergent and phase-divergent changesets. The code for reporting it is based on the code from the evolve extension, but simplified a bit. It simply counts the numbers for each kind of instability before and after the transaction. That's obviously not very efficient, but it's easy to reason about, so I'm doing this as a first step that can make us quite confident about the test case changes. We can optimize it later and make sure that the tests are not affected. The code has been used in the evolve extension for a long time and has apparently been sufficiently fast, so it doesn't seem like a pressing issue. Unlike the evolve extension's version of this report, this version applies to all commands (or all transactions run as part of any command, to be exact). Differential Revision: https://phab.mercurial-scm.org/D1867
author Martin von Zweigbergk <martinvonz@google.com>
date Sun, 14 Jan 2018 23:59:17 -0800
parents b55a142f00c5
children 5cd60b0587a8
line wrap: on
line diff
--- a/mercurial/scmutil.py	Wed Jan 10 14:00:23 2018 -0800
+++ b/mercurial/scmutil.py	Sun Jan 14 23:59:17 2018 -0800
@@ -1222,6 +1222,9 @@
     'unbundle',
 ]
 
+# A marker that tells the evolve extension to suppress its own reporting
+_reportstroubledchangesets = True
+
 def registersummarycallback(repo, otr, txnname=''):
     """register a callback to issue a summary after the transaction is closed
     """
@@ -1257,6 +1260,32 @@
                 repo.ui.status(_('obsoleted %i changesets\n')
                                % len(obsoleted))
 
+    if obsolete.isenabled(repo, obsolete.createmarkersopt):
+        instabilitytypes = [
+            ('orphan', 'orphan'),
+            ('phase-divergent', 'phasedivergent'),
+            ('content-divergent', 'contentdivergent'),
+        ]
+
+        def getinstabilitycounts(repo):
+            filtered = repo.changelog.filteredrevs
+            counts = {}
+            for instability, revset in instabilitytypes:
+                counts[instability] = len(set(obsolete.getrevs(repo, revset)) -
+                                          filtered)
+            return counts
+
+        oldinstabilitycounts = getinstabilitycounts(repo)
+        @reportsummary
+        def reportnewinstabilities(repo, tr):
+            newinstabilitycounts = getinstabilitycounts(repo)
+            for instability, revset in instabilitytypes:
+                delta = (newinstabilitycounts[instability] -
+                         oldinstabilitycounts[instability])
+                if delta > 0:
+                    repo.ui.warn(_('%i new %s changesets\n') %
+                                 (delta, instability))
+
     if txmatch(_reportnewcssource):
         @reportsummary
         def reportnewcs(repo, tr):