changeset 40188:2c5316796f45

absorb: print summary of changesets affected Differential Revision: https://phab.mercurial-scm.org/D4998
author Mark Thomas <mbthomas@fb.com>
date Fri, 12 Oct 2018 15:46:51 +0000
parents dcda50856843
children 9458dbfa7f33
files hgext/absorb.py tests/test-absorb-rename.t tests/test-absorb.t
diffstat 3 files changed, 72 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/hgext/absorb.py	Fri Oct 12 13:35:58 2018 +0000
+++ b/hgext/absorb.py	Fri Oct 12 15:46:51 2018 +0000
@@ -21,6 +21,7 @@
     amend-flag = correlated
 
     [color]
+    absorb.description = yellow
     absorb.node = blue bold
     absorb.path = bold
 """
@@ -74,6 +75,7 @@
 configitem('absorb', 'max-stack-size', default=50)
 
 colortable = {
+    'absorb.description': 'yellow',
     'absorb.node': 'blue bold',
     'absorb.path': 'bold',
 }
@@ -297,6 +299,7 @@
         self.targetlines = [] # [str]
         self.fixups = [] # [(linelog rev, a1, a2, b1, b2)]
         self.finalcontents = [] # [str]
+        self.ctxaffected = set()
 
     def diffwith(self, targetfctx, fm=None):
         """calculate fixups needed by examining the differences between
@@ -577,6 +580,7 @@
                 ctx = self.fctxs[idx]
                 fm.context(fctx=ctx)
                 node = ctx.hex()
+                self.ctxaffected.add(ctx.changectx())
             fm.write('node', '%-7.7s ', node, label='absorb.node')
             fm.write('diffchar ' + linetype, '%s%s\n', diffchar, line,
                      label=linelabel)
@@ -621,6 +625,7 @@
         self.fixupmap = {} # {path: filefixupstate}
         self.replacemap = {} # {oldnode: newnode or None}
         self.finalnode = None # head after all fixups
+        self.ctxaffected = set() # ctx that will be absorbed into
 
     def diffwith(self, targetctx, match=None, fm=None):
         """diff and prepare fixups. update self.fixupmap, self.paths"""
@@ -660,6 +665,7 @@
             fstate.diffwith(targetfctx, fm)
             self.fixupmap[path] = fstate
             self.paths.append(path)
+            self.ctxaffected.update(fstate.ctxaffected)
 
     def apply(self):
         """apply fixups to individual filefixupstates"""
@@ -950,6 +956,19 @@
         fm = ui.formatter('absorb', opts)
     state.diffwith(targetctx, matcher, fm)
     if fm is not None:
+        fm.startitem()
+        fm.write("count", "\n%d changesets affected\n", len(state.ctxaffected))
+        fm.data(linetype='summary')
+        for ctx in reversed(stack):
+            if ctx not in state.ctxaffected:
+                continue
+            fm.startitem()
+            fm.context(ctx=ctx)
+            fm.data(linetype='changeset')
+            fm.write('node', '%-7.7s ', ctx.hex(), label='absorb.node')
+            descfirstline = ctx.description().splitlines()[0]
+            fm.write('descfirstline', '%s\n', descfirstline,
+                     label='absorb.description')
         fm.end()
     if not opts.get('dry_run'):
         state.apply()
--- a/tests/test-absorb-rename.t	Fri Oct 12 13:35:58 2018 +0000
+++ b/tests/test-absorb-rename.t	Fri Oct 12 15:46:51 2018 +0000
@@ -43,6 +43,11 @@
   eff892d +1a
   bf56e1f +2a
   0b888b0 +3a
+  
+  3 changesets affected
+  0b888b0 3
+  bf56e1f 2
+  eff892d 1
 
   $ hg status
 
@@ -66,6 +71,10 @@
           +1A
   9a14ffe +2A
   9191d12 +3A
+  
+  2 changesets affected
+  9191d12 3
+  9a14ffe 2
 
   $ hg diff
   diff --git a/a b/a
@@ -107,6 +116,10 @@
   17b7212 -2
           +1b
   17b7212 +2b
+  
+  2 changesets affected
+  17b7212 2
+  eff892d 1
 
   $ hg diff
   diff --git a/b b/b
@@ -147,6 +160,10 @@
           @@ -0,1 +0,1 @@
   55105f9 -1
   55105f9 +1a
+  
+  2 changesets affected
+  e62c256 2
+  55105f9 1
 
   $ hg diff
   diff --git a/a b/a
@@ -192,6 +209,10 @@
   366daad -3
           +1c
   366daad +3c
+  
+  2 changesets affected
+  366daad cp
+  55105f9 1
 
   $ hg log -G -p -T '{rev}:{node|short} {desc}\n'
   @  1:70606019f91b cp
@@ -228,6 +249,9 @@
           @@ -0,1 +0,1 @@
   7060601 -1
   7060601 +1c
+  
+  1 changesets affected
+  7060601 cp
 
   $ hg log -G -p -T '{rev}:{node|short} {desc}\n'
   @  1:8bd536cce368 cp
@@ -298,6 +322,10 @@
   7bc3d43 -2
           +1e
   7bc3d43 +2e
+  
+  2 changesets affected
+  7bc3d43 cp
+  55105f9 1
 
   $ hg diff
   diff --git a/e b/e
--- a/tests/test-absorb.t	Fri Oct 12 13:35:58 2018 +0000
+++ b/tests/test-absorb.t	Fri Oct 12 15:46:51 2018 +0000
@@ -59,6 +59,12 @@
   4f55fa6 -5
   ad8b8b7 +4d
   4f55fa6 +5e
+  
+  4 changesets affected
+  4f55fa6 commit 5
+  ad8b8b7 commit 4
+  5c5f952 commit 2
+  4ec16f8 commit 1
 
 Run absorb:
 
@@ -173,6 +179,9 @@
           @@ -3,1 +3,1 @@
   85b4e0e -Insert aftert 4d
   85b4e0e +insert aftert 4d
+  
+  1 changesets affected
+  85b4e0e commit 4
   $ hg absorb
   saved backup bundle to * (glob)
   1 of 2 chunk(s) applied
@@ -290,6 +299,9 @@
   712d16a -b Line 2
           +b line 1
   712d16a +b line 2
+  
+  1 changesets affected
+  712d16a commit b 2
 
 Test obsolete markers creation:
 
@@ -352,6 +364,9 @@
           @@ -0,1 +0,1 @@
   99b4ae7 -
   99b4ae7 +bla
+  
+  1 changesets affected
+  99b4ae7 foo
   $ hg absorb
   1 of 1 chunk(s) applied
   $ hg diff -c .
@@ -393,6 +408,12 @@
   1154859 -2
   30970db -3
   a393a58 -4
+  
+  4 changesets affected
+  a393a58 b4
+  30970db b3
+  1154859 b12
+  bfafb49 a12
   $ hg absorb -v | grep became
   0:bfafb49242db: 1 file(s) changed, became 4:1a2de97fc652
   1:115485984805: 2 file(s) changed, became 5:0c930dfab74c
@@ -443,6 +464,10 @@
           @@ -2,2 +2,0 @@
   f1c23dd -3
   82dbe7f -4
+  
+  2 changesets affected
+  82dbe7f a1234
+  f1c23dd a123
   $ hg absorb --verbose
   1:f1c23dd5d08d: became empty and was dropped
   2:82dbe7fd19f0: became empty and was dropped