# HG changeset patch
# User Boris Feld <boris.f...@octobus.net>
# Date 1499176225 -7200
#      Tue Jul 04 15:50:25 2017 +0200
# Node ID 7fba236b2b17fd83a6b6446aaa84b14c65820aee
# Parent  7e5752579378680270dd356f4e56fd7795109c5d
# EXP-Topic obsfatetemplate
template: add minimal obsfate template

Obsfate is a template that display each changeset evolved in a clean and
human-readable way.

Introduce an obsfateprinter that display only the successors for the moment.
More informations will be added later.

We don't use _hybrid objects nor the templating engine yet as it introduce much
more complexity and some hacks. The tail of the series will replace
obsfateprinter by _hybrid objects.

diff -r 7e5752579378 -r 7fba236b2b17 mercurial/obsutil.py
--- a/mercurial/obsutil.py      Mon Jul 03 03:27:58 2017 +0200
+++ b/mercurial/obsutil.py      Tue Jul 04 15:50:25 2017 +0200
@@ -8,6 +8,7 @@
 from __future__ import absolute_import
 
 from . import (
+    node as nodemod,
     phases,
 )
 
@@ -551,3 +552,46 @@
                 final.reverse() # put small successors set first
                 cache[current] = final
     return cache[initialnode]
+
+def preparesuccessorset(successorset, rawmarkers):
+    """ For a successor set, get all related markers and convert every nodeid
+    into its hexadecimal form.
+    """
+    hex = nodemod.hex
+
+    successorset = [hex(n) for n in successorset]
+
+    # hex the binary nodes in the markers
+    markers = []
+    for m in rawmarkers:
+        hexprec = hex(m[0])
+        hexsucs = tuple(hex(n) for n in m[1])
+        hexparents = None
+        if m[5] is not None:
+            hexparents = tuple(hex(n) for n in m[5])
+        newmarker = (hexprec, hexsucs) + m[2:5] + (hexparents,) + m[6:]
+        markers.append(newmarker)
+
+    # Format basic data
+    data = {
+        "successors": sorted(successorset),
+        "markers": sorted(markers)
+    }
+
+    return data
+
+def obsfatedata(repo, ctx):
+    """compute the raw data needed for computing obsfate
+    Returns a list of dict, one dict per successors set
+    """
+    if not ctx.obsolete():
+        return None
+
+    ssets = successorssets(repo, ctx.node(), closest=True)
+
+    values = []
+    for sset in ssets:
+        raw = preparesuccessorset(sset, sset.markers)
+        values.append(raw)
+
+    return values
diff -r 7e5752579378 -r 7fba236b2b17 mercurial/templatekw.py
--- a/mercurial/templatekw.py   Mon Jul 03 03:27:58 2017 +0200
+++ b/mercurial/templatekw.py   Tue Jul 04 15:50:25 2017 +0200
@@ -634,6 +634,57 @@
     return _hybrid(gen(data), data, lambda x: {'successorset': x},
                    lambda d: d["successorset"])
 
+def _obsfatelineprinter(obsfateline, repo, ui):
+    """Format and display obsfate related data
+    """
+    quiet = ui.quiet
+    verbose = ui.verbose
+    normal = not verbose and not quiet
+
+    # Build the line step by step
+    line = []
+
+    # Verb
+    line.append("rewritten")
+
+    # Successors
+    successors = obsfateline["successors"]
+
+    if successors:
+        fmtsuccessors = map(lambda s: _formatrevnode(repo[s]), successors)
+        line.append(" as %s" % ", ".join(fmtsuccessors))
+
+    return "".join(line)
+
+def _obsfateprinter(obsfate, repo, ui, prefix=""):
+    """Generate a human-readable line per successorset of a changeset
+    """
+    lines = []
+    for raw in obsfate:
+        lines.append(_obsfatelineprinter(raw, repo, ui))
+
+    if prefix:
+        lines = [prefix + line for line in lines]
+
+    return "; ".join(lines)
+
+@templatekeyword("obsfate")
+def showobsfate(repo, ctx, **args):
+    """Returns a string describing how an obsolete changeset has evolved in a
+    human-readable format.
+
+    This line will contains these information:
+    - The list of closest successors in the log output
+    """
+
+    # Get the needed obsfate data
+    values = obsutil.obsfatedata(repo, ctx)
+
+    if values is None:
+        return ''
+
+    return _obsfateprinter(values, repo, repo.ui)
+
 @templatekeyword('p1rev')
 def showp1rev(repo, ctx, templ, **args):
     """Integer. The repository-local revision number of the changeset's
diff -r 7e5752579378 -r 7fba236b2b17 tests/test-obsmarker-template.t
--- a/tests/test-obsmarker-template.t   Mon Jul 03 03:27:58 2017 +0200
+++ b/tests/test-obsmarker-template.t   Tue Jul 04 15:50:25 2017 +0200
@@ -20,6 +20,7 @@
   >     {if(successorssets, "\n  Successors: {successorssets}")}\
   >     {if(successorssets, "\n  multi-line: {join(successorssets, "\n  
multi-line: ")}")}\
   >     {if(successorssets, "\n  json: {successorssets|json}")}\n'
+  > fatelog = log -G -T '{node|short}\n{if(obsfate, "  Obsfate: {obsfate}\n")}'
   > EOF
 
 Test templates on amended commit
@@ -33,8 +34,8 @@
   $ mkcommit ROOT
   $ mkcommit A0
   $ echo 42 >> A0
-  $ hg commit --amend -m "A1"
-  $ hg commit --amend -m "A2"
+  $ HGUSER=test1 hg commit --amend -m "A1" --config 
devel.default-date="1234567890 0"
+  $ HGUSER=test2 hg commit --amend -m "A2" --config 
devel.default-date="987654321 0"
 
   $ hg log --hidden -G
   @  changeset:   4:d004c8f274b9
@@ -83,6 +84,27 @@
   |      json: [["d004c8f274b9ec480a47a93c10dac5eee63adb78"]]
   o  ea207398892e
   
+  $ hg fatelog -q
+  o  d004c8f274b9
+  |
+  | @  471f378eab4c
+  |/     Obsfate: rewritten as 4:d004c8f274b9
+  o  ea207398892e
+  
+  $ hg fatelog
+  o  d004c8f274b9
+  |
+  | @  471f378eab4c
+  |/     Obsfate: rewritten as 4:d004c8f274b9
+  o  ea207398892e
+  
+  $ hg fatelog -v
+  o  d004c8f274b9
+  |
+  | @  471f378eab4c
+  |/     Obsfate: rewritten as 4:d004c8f274b9
+  o  ea207398892e
+  
   $ hg up 'desc(A1)' --hidden
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
 
@@ -99,6 +121,13 @@
   |      json: [["d004c8f274b9ec480a47a93c10dac5eee63adb78"]]
   o  ea207398892e
   
+  $ hg fatelog -v
+  o  d004c8f274b9
+  |
+  | @  a468dc9b3633
+  |/     Obsfate: rewritten as 4:d004c8f274b9
+  o  ea207398892e
+  
 Predecessors template should show all the predecessors as we force their 
display
 with --hidden
   $ hg tlog --hidden
@@ -123,6 +152,17 @@
   |      json: [["a468dc9b36338b14fdb7825f55ce3df4e71517ad"]]
   o  ea207398892e
   
+  $ hg fatelog --hidden -q
+  o  d004c8f274b9
+  |
+  | @  a468dc9b3633
+  |/     Obsfate: rewritten as 4:d004c8f274b9
+  | x  f137d23bb3e1
+  | |
+  | x  471f378eab4c
+  |/     Obsfate: rewritten as 3:a468dc9b3633
+  o  ea207398892e
+  
 
 Predecessors template shouldn't show anything as all obsolete commit are not
 visible.
@@ -155,6 +195,23 @@
   |      json: [["a468dc9b36338b14fdb7825f55ce3df4e71517ad"]]
   o  ea207398892e
   
+  $ hg fatelog -v
+  @  d004c8f274b9
+  |
+  o  ea207398892e
+  
+
+  $ hg fatelog -v --hidden
+  @  d004c8f274b9
+  |
+  | x  a468dc9b3633
+  |/     Obsfate: rewritten as 4:d004c8f274b9
+  | x  f137d23bb3e1
+  | |
+  | x  471f378eab4c
+  |/     Obsfate: rewritten as 3:a468dc9b3633
+  o  ea207398892e
+  
 
 Test templates with splitted commit
 ===================================
@@ -238,6 +295,16 @@
   |      json: [["337fec4d2edcf0e7a467e35f818234bc620068b5", 
"f257fde29c7a847c9b607f6e958656d0df0fb15c"]]
   o  ea207398892e
   
+
+  $ hg fatelog
+  o  f257fde29c7a
+  |
+  o  337fec4d2edc
+  |
+  | @  471597cad322
+  |/     Obsfate: rewritten as 2:337fec4d2edc, 3:f257fde29c7a
+  o  ea207398892e
+  
   $ hg up f257fde29c7a
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
 
@@ -269,6 +336,16 @@
   |      json: [["337fec4d2edcf0e7a467e35f818234bc620068b5", 
"f257fde29c7a847c9b607f6e958656d0df0fb15c"]]
   o  ea207398892e
   
+
+  $ hg fatelog --hidden
+  @  f257fde29c7a
+  |
+  o  337fec4d2edc
+  |
+  | x  471597cad322
+  |/     Obsfate: rewritten as 2:337fec4d2edc, 3:f257fde29c7a
+  o  ea207398892e
+  
 Test templates with folded commit
 =================================
 
@@ -351,6 +428,14 @@
   |      json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
   o  ea207398892e
   
+
+  $ hg fatelog
+  o  eb5a0daa2192
+  |
+  | @  471f378eab4c
+  |/     Obsfate: rewritten as 3:eb5a0daa2192
+  o  ea207398892e
+  
   $ hg up 'desc(B0)' --hidden
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
 
@@ -372,6 +457,16 @@
   |      json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
   o  ea207398892e
   
+
+  $ hg fatelog
+  o  eb5a0daa2192
+  |
+  | @  0dec01379d3b
+  | |    Obsfate: rewritten as 3:eb5a0daa2192
+  | x  471f378eab4c
+  |/     Obsfate: rewritten as 3:eb5a0daa2192
+  o  ea207398892e
+  
   $ hg up 'desc(C0)'
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
 
@@ -401,6 +496,15 @@
   o  ea207398892e
   
 
+  $ hg fatelog --hidden
+  @  eb5a0daa2192
+  |
+  | x  0dec01379d3b
+  | |    Obsfate: rewritten as 3:eb5a0daa2192
+  | x  471f378eab4c
+  |/     Obsfate: rewritten as 3:eb5a0daa2192
+  o  ea207398892e
+  
 Test templates with divergence
 ==============================
 
@@ -518,6 +622,15 @@
   |      json: [["fdf9bde5129a28d4548fadd3f62b265cdd3b7a2e"], 
["019fadeab383f6699fa83ad7bdb4d82ed2c0e5ab"]]
   o  ea207398892e
   
+  $ hg fatelog
+  o  019fadeab383
+  |
+  | o  fdf9bde5129a
+  |/
+  | @  471f378eab4c
+  |/     Obsfate: rewritten as 2:fdf9bde5129a; rewritten as 4:019fadeab383
+  o  ea207398892e
+  
   $ hg up 'desc(A1)'
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
 
@@ -530,6 +643,14 @@
   |/
   o  ea207398892e
   
+
+  $ hg fatelog
+  o  019fadeab383
+  |
+  | @  fdf9bde5129a
+  |/
+  o  ea207398892e
+  
 Predecessors template should the predecessors as we force their display with
 --hidden
   $ hg tlog --hidden
@@ -559,6 +680,17 @@
   o  ea207398892e
   
 
+  $ hg fatelog --hidden
+  o  019fadeab383
+  |
+  | x  65b757b745b9
+  |/     Obsfate: rewritten as 4:019fadeab383
+  | @  fdf9bde5129a
+  |/
+  | x  471f378eab4c
+  |/     Obsfate: rewritten as 2:fdf9bde5129a; rewritten as 3:65b757b745b9
+  o  ea207398892e
+  
 Test templates with amended + folded commit
 ===========================================
 
@@ -654,6 +786,14 @@
   |      json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
   o  ea207398892e
   
+
+  $ hg fatelog
+  o  eb5a0daa2192
+  |
+  | @  471f378eab4c
+  |/     Obsfate: rewritten as 4:eb5a0daa2192
+  o  ea207398892e
+  
   $ hg up 'desc(B0)' --hidden
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
 
@@ -674,6 +814,16 @@
   |      json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
   o  ea207398892e
   
+
+  $ hg fatelog
+  o  eb5a0daa2192
+  |
+  | @  0dec01379d3b
+  | |    Obsfate: rewritten as 4:eb5a0daa2192
+  | x  471f378eab4c
+  |/     Obsfate: rewritten as 4:eb5a0daa2192
+  o  ea207398892e
+  
   $ hg up 'desc(B1)' --hidden
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
 
@@ -694,6 +844,16 @@
   |      json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
   o  ea207398892e
   
+
+  $ hg fatelog
+  o  eb5a0daa2192
+  |
+  | @  b7ea6d14e664
+  | |    Obsfate: rewritten as 4:eb5a0daa2192
+  | x  471f378eab4c
+  |/     Obsfate: rewritten as 4:eb5a0daa2192
+  o  ea207398892e
+  
   $ hg up 'desc(C0)'
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
 
@@ -703,6 +863,12 @@
   |
   o  ea207398892e
   
+
+  $ hg fatelog
+  @  eb5a0daa2192
+  |
+  o  ea207398892e
+  
 Predecessors template should show all predecessors as we force their display
 with --hidden
   $ hg tlog --hidden
@@ -730,6 +896,17 @@
   o  ea207398892e
   
 
+  $ hg fatelog --hidden
+  @  eb5a0daa2192
+  |
+  | x  b7ea6d14e664
+  | |    Obsfate: rewritten as 4:eb5a0daa2192
+  | | x  0dec01379d3b
+  | |/     Obsfate: rewritten as 3:b7ea6d14e664
+  | x  471f378eab4c
+  |/     Obsfate: rewritten as 4:eb5a0daa2192
+  o  ea207398892e
+  
 Test template with pushed and pulled obs markers
 ================================================
 
@@ -833,6 +1010,14 @@
   |      json: [["7a230b46bf61e50b30308c6cfd7bd1269ef54702"]]
   o  ea207398892e
   
+
+  $ hg fatelog
+  o  7a230b46bf61
+  |
+  | @  471f378eab4c
+  |/     Obsfate: rewritten as 2:7a230b46bf61
+  o  ea207398892e
+  
   $ hg up 'desc(A2)'
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
 
@@ -842,6 +1027,12 @@
   |
   o  ea207398892e
   
+
+  $ hg fatelog
+  @  7a230b46bf61
+  |
+  o  ea207398892e
+  
 Predecessors template should show all predecessors as we force their display
 with --hidden
   $ hg tlog --hidden
@@ -857,6 +1048,14 @@
   o  ea207398892e
   
 
+  $ hg fatelog --hidden
+  @  7a230b46bf61
+  |
+  | x  471f378eab4c
+  |/     Obsfate: rewritten as 2:7a230b46bf61
+  o  ea207398892e
+  
+
 Test template with obsmarkers cycle
 ===================================
 
@@ -888,6 +1087,12 @@
   o  ea207398892e
   
 
+  $ hg fatelog
+  @  f897c6137566
+  |
+  o  ea207398892e
+  
+
   $ hg up -r "desc(B0)" --hidden
   2 files updated, 0 files merged, 1 files removed, 0 files unresolved
   $ hg tlog
@@ -916,6 +1121,16 @@
   o  ea207398892e
   
 
+  $ hg fatelog
+  o  f897c6137566
+  |
+  | @  0dec01379d3b
+  | |    Obsfate: rewritten as 3:f897c6137566; rewritten as 1:471f378eab4c
+  | x  471f378eab4c
+  |/     Obsfate: rewritten as 2:0dec01379d3b
+  o  ea207398892e
+  
+
   $ hg up -r "desc(A0)" --hidden
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
   $ hg tlog
@@ -929,6 +1144,14 @@
   o  ea207398892e
   
 
+  $ hg fatelog
+  o  f897c6137566
+  |
+  | @  471f378eab4c
+  |/
+  o  ea207398892e
+  
+
   $ hg up -r "desc(ROOT)" --hidden
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
   $ hg tlog
@@ -937,6 +1160,12 @@
   @  ea207398892e
   
 
+  $ hg fatelog
+  o  f897c6137566
+  |
+  @  ea207398892e
+  
+
   $ hg tlog --hidden
   o  f897c6137566
   |    Predecessors: 2:0dec01379d3b
@@ -1145,6 +1374,21 @@
   |
   o  ea207398892e
   
+  $ hg fatelog
+  @  0b997eb7ceee
+  |
+  | o  b18bc8331526
+  |/
+  | o  ba2ed02b0c9a
+  | |
+  | x  4a004186e638
+  |/     Obsfate: rewritten as 8:b18bc8331526; rewritten as 9:0b997eb7ceee
+  o  dd800401bd8c
+  |
+  o  f897c6137566
+  |
+  o  ea207398892e
+  
   $ hg tlog --hidden
   @  0b997eb7ceee
   |    Predecessors: 6:4a004186e638
@@ -1203,6 +1447,27 @@
   |      json: [["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]]
   o  ea207398892e
   
+  $ hg fatelog --hidden
+  @  0b997eb7ceee
+  |
+  | o  b18bc8331526
+  |/
+  | o  ba2ed02b0c9a
+  | |
+  | x  4a004186e638
+  |/     Obsfate: rewritten as 8:b18bc8331526; rewritten as 9:0b997eb7ceee
+  o  dd800401bd8c
+  |
+  | x  9bd10a0775e4
+  |/     Obsfate: rewritten as 6:4a004186e638, 7:ba2ed02b0c9a, 5:dd800401bd8c
+  o  f897c6137566
+  |
+  | x  0dec01379d3b
+  | |    Obsfate: rewritten as 3:f897c6137566; rewritten as 1:471f378eab4c
+  | x  471f378eab4c
+  |/     Obsfate: rewritten as 2:0dec01379d3b
+  o  ea207398892e
+  
   $ hg up --hidden 4
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ hg rebase -r 7 -d 8 --config extensions.rebase=
@@ -1237,6 +1502,22 @@
   |
   o  ea207398892e
   
+
+  $ hg fatelog
+  o  eceed8f98ffc
+  |
+  | o  0b997eb7ceee
+  | |
+  o |  b18bc8331526
+  |/
+  o  dd800401bd8c
+  |
+  | @  9bd10a0775e4
+  |/     Obsfate: rewritten as 9:0b997eb7ceee, 5:dd800401bd8c, 
10:eceed8f98ffc; rewritten as 8:b18bc8331526, 5:dd800401bd8c, 10:eceed8f98ffc
+  o  f897c6137566
+  |
+  o  ea207398892e
+  
 Test templates with pruned commits
 ==================================
 
@@ -1259,3 +1540,13 @@
   |
   o  ea207398892e
   
+  $ hg fatelog
+  @  471f378eab4c
+  |
+  o  ea207398892e
+  
+  $ hg fatelog -v
+  @  471f378eab4c
+  |
+  o  ea207398892e
+  
_______________________________________________
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel

Reply via email to