changeset 2613:3d432af2f6cd stable

merge with default Integrate new development around obsfate.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Fri, 16 Jun 2017 19:22:38 +0200
parents a3fbe5293bf6 (current diff) fd35b428edfc (diff)
children 01e32f11f1ef 26f6bdfe2155
files hgext3rd/evolve/templatekw.py tests/test-evolve-templates.t
diffstat 3 files changed, 147 insertions(+), 80 deletions(-) [+]
line wrap: on
line diff
--- a/hgext3rd/evolve/obshistory.py	Fri Jun 16 11:32:21 2017 +0200
+++ b/hgext3rd/evolve/obshistory.py	Fri Jun 16 19:22:38 2017 +0200
@@ -629,11 +629,13 @@
 def _successorsetverb(successorset, markers):
     """ Return the verb summarizing the successorset
     """
-    # XXX we need to handle prune markers at some point.
-    if not markers:
-        return {'verb': 'pruned'}
-
-    return {'verb': 'rewritten'}
+    if not successorset:
+        verb = 'pruned'
+    elif len(successorset) == 1:
+        verb = 'rewritten'
+    else:
+        verb = 'split'
+    return {'verb': verb}
 
 FORMATSSETSFUNCTIONS = [
     _successorsetdates,
@@ -641,7 +643,7 @@
     _successorsetverb
 ]
 
-def _successorsetallmarkers(successorset, pathscache):
+def successorsetallmarkers(successorset, pathscache):
     """compute all successors of a successorset.
 
     pathscache must contains all successors starting from selected nodes
@@ -669,11 +671,24 @@
 
     return markers
 
-def _preparesuccessorset(successorset, pathscache):
+def preparesuccessorset(successorset, rawmarkers):
     """ For a successor set, get all related markers, compute the set of user,
     the min date and the max date
     """
-    markers = _successorsetallmarkers(successorset, pathscache)
+    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 = {
--- a/hgext3rd/evolve/templatekw.py	Fri Jun 16 11:32:21 2017 +0200
+++ b/hgext3rd/evolve/templatekw.py	Fri Jun 16 19:22:38 2017 +0200
@@ -9,6 +9,7 @@
 """
 
 from . import (
+    error,
     exthelper,
     obshistory
 )
@@ -65,18 +66,18 @@
 
 @eh.templatekw("precursors")
 def shownextvisibleprecursors(repo, ctx, **args):
-    """Returns a string containing the list if the closest successors
-    displayed
+    """Returns a string containing the list of the closest precursors
     """
     precursors = sorted(closestprecursors(repo, ctx.node()))
+    precursors = [node.hex(p) for p in precursors]
 
     # <= hg-4.1 requires an explicite gen.
     # we can use None once the support is dropped
     #
     # They also requires an iterator instead of an iterable.
-    gen = iter(" ".join(map(node.short, precursors)))
+    gen = iter(" ".join(p[:12] for p in precursors))
     return templatekw._hybrid(gen.__iter__(), precursors, lambda x: {'precursor': x},
-                              lambda d: "%s" % node.short(d['precursor']))
+                              lambda d: d['precursor'][:12])
 
 def closestsuccessors(repo, nodeid):
     """ returns the closest visible successors sets instead.
@@ -85,18 +86,20 @@
 
 @eh.templatekw("successors")
 def shownextvisiblesuccessors(repo, ctx, templ, **args):
-    """Returns a string of sets of successors for a changectx in this format:
-    [ctx1, ctx2], [ctx3] if ctx has been splitted into ctx1 and ctx2 while
-    also diverged into ctx3"""
+    """Returns a string of sets of successors for a changectx
+
+    Format used is: [ctx1, ctx2], [ctx3] if ctx has been splitted into ctx1 and
+    ctx2 while also diverged into ctx3"""
     if not ctx.obsolete():
         return ''
 
     ssets, _ = closestsuccessors(repo, ctx.node())
+    ssets = [[node.hex(n) for n in ss] for ss in ssets]
 
     data = []
     gen = []
     for ss in ssets:
-        subgen = '[%s]' % ', '.join(map(node.short, ss))
+        subgen = '[%s]' % ', '.join(n[:12] for n in ss)
         gen.append(subgen)
         h = templatekw._hybrid(iter(subgen), ss, lambda x: {'successor': x},
                                lambda d: "%s" % d["successor"])
@@ -106,7 +109,14 @@
     return templatekw._hybrid(iter(gen), data, lambda x: {'successorset': x},
                               lambda d: d["successorset"])
 
-def obsfatedefaulttempl():
+def _getusername(ui):
+    """the default username in the config or None"""
+    try:
+        return ui.username()
+    except error.Abort: # no easy way to avoid ui raising Abort here :-/
+        return None
+
+def obsfatedefaulttempl(ui):
     """ Returns a dict with the default templates for obs fate
     """
     # Prepare templates
@@ -118,10 +128,16 @@
     datetempl = '{if(max_date, "{ifeq(min_date, max_date, "%s", "%s")}")}' % (datetempleq, datetemplnoteq)
     newline = '\n'
 
+    optionalusertempl = usertempl
+    username = _getusername(ui)
+    if username is not None:
+        optionalusertempl = ('{ifeq(join(users, "\0"), "%s", "", "%s")}'
+                             % (username, usertempl))
+
     # Assemble them
     return {
         'obsfate_quiet': verbtempl + succtempl + newline,
-        'obsfate': verbtempl + usertempl + succtempl + newline,
+        'obsfate': verbtempl + optionalusertempl + succtempl + newline,
         'obsfate_verbose': verbtempl + usertempl + succtempl + datetempl + newline
     }
 
@@ -137,14 +153,31 @@
     if successorssets == []:
         successorssets = [[]]
 
+    succsmap = repo.obsstore.successors
+    fullsuccessorsets = [] # successor set + markers
+    for sset in successorssets:
+        if sset:
+            markers = obshistory.successorsetallmarkers(sset, pathcache)
+            fullsuccessorsets.append((sset, markers))
+        else:
+            # XXX we do not catch all prune markers (eg rewritten then pruned)
+            # (fix me later)
+            foundany = False
+            for mark in succsmap.get(ctx.node(), ()):
+                if not mark[1]:
+                    foundany = True
+                    fullsuccessorsets.append((sset, [mark]))
+            if not foundany:
+                fullsuccessorsets.append(([], []))
+
     values = []
-    for successorset in successorssets:
-        raw = obshistory._preparesuccessorset(successorset, pathcache)
+    for sset, rawmarkers in fullsuccessorsets:
+        raw = obshistory.preparesuccessorset(sset, rawmarkers)
 
         # As we can't do something like
         # "{join(map(nodeshort, successors), ', '}" in template, manually
         # create a correct textual representation
-        gen = ', '.join(map(node.short, raw['successors']))
+        gen = ', '.join(n[:12] for n in raw['successors'])
 
         makemap = lambda x: {'successor': x}
         joinfmt = lambda d: "%s" % d['successor']
@@ -154,7 +187,7 @@
         values.append(raw)
 
     # Insert default obsfate templates
-    args['templ'].cache.update(obsfatedefaulttempl())
+    args['templ'].cache.update(obsfatedefaulttempl(repo.ui))
 
     if repo.ui.quiet:
         name = "obsfate_quiet"
--- a/tests/test-evolve-templates.t	Fri Jun 16 11:32:21 2017 +0200
+++ b/tests/test-evolve-templates.t	Fri Jun 16 19:22:38 2017 +0200
@@ -117,6 +117,25 @@
   |
   o  ea207398892e
   
+
+(check json)
+
+  $ hg log -GT '{precursors|json}\n'
+  o  ["471f378eab4c5e25f6c77f785b27c936efb22874"]
+  |
+  | @  []
+  |/
+  o  []
+  
+
+  $ hg log -GT '{successors|json}\n'
+  o  ""
+  |
+  | @  [["d004c8f274b9ec480a47a93c10dac5eee63adb78"]]
+  |/
+  o  ""
+  
+
   $ hg up 'desc(A1)' --hidden
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   working directory parent is obsolete! (a468dc9b3633)
@@ -148,7 +167,7 @@
   |      Fate: rewritten by test2 as d004c8f274b9
   |
   | x  f137d23bb3e1
-  | |    Fate: pruned
+  | |    Fate: pruned by test1
   | |
   | x  471f378eab4c
   |/     Successors: [a468dc9b3633]
@@ -184,7 +203,7 @@
   |      Fate: rewritten by test2 as d004c8f274b9
   |
   | x  f137d23bb3e1
-  | |    Fate: pruned
+  | |    Fate: pruned by test1
   | |
   | x  471f378eab4c
   |/     Successors: [a468dc9b3633]
@@ -206,7 +225,7 @@
   |/     Obsfate: rewritten by test2 as d004c8f274b9 (at *) (glob)
   |
   | x  f137d23bb3e1
-  | |    Obsfate: pruned
+  | |    Obsfate: pruned by test1 (at *) (glob)
   | |
   | x  471f378eab4c
   |/     Obsfate: rewritten by test1 as a468dc9b3633 (at *) (glob)
@@ -217,11 +236,11 @@
   $ hg fatelogjson --hidden
   @  d004c8f274b9 ""
   |
-  | x  a468dc9b3633 [{"markers": [["\udca4h\u071b63\udc8b\u0014\udcfd\udcb7\udc82_U\udcce=\udcf4\udce7\u0015\u0017\udcad", ["\udcd0\u0004\udcc8\udcf2t\udcb9\udcecH\nG\udca9\u003c\u0010\udcda\udcc5\udcee\udce6:\udcdbx"], 0, [["ef1", "1"], ["user", "test2"]], [*, 0], null]], "max_date": [*, 0], "min_date": [*, 0], "successors": ["\udcd0\u0004\udcc8\udcf2t\udcb9\udcecH\nG\udca9\u003c\u0010\udcda\udcc5\udcee\udce6:\udcdbx"], "users": ["test2"], "verb": "rewritten"}] (glob)
+  | x  a468dc9b3633 [{"markers": [["a468dc9b36338b14fdb7825f55ce3df4e71517ad", ["d004c8f274b9ec480a47a93c10dac5eee63adb78"], 0, [["ef1", "1"], ["user", "test2"]], [*, *], null]], "max_date": [*, *], "min_date": [*, *], "successors": ["d004c8f274b9ec480a47a93c10dac5eee63adb78"], "users": ["test2"], "verb": "rewritten"}] (glob)
   |/
-  | x  f137d23bb3e1 [{"markers": [], "successors": [], "verb": "pruned"}]
+  | x  f137d23bb3e1 [{"markers": [["f137d23bb3e11dc1daeb6264fac9cb2433782e15", [], 0, [["ef1", "0"], ["user", "test1"]], [*, *], ["471f378eab4c5e25f6c77f785b27c936efb22874"]]], "max_date": [*, *], "min_date": [*, *], "successors": [], "users": ["test1"], "verb": "pruned"}] (glob)
   | |
-  | x  471f378eab4c [{"markers": [["G\u001f7\udc8e\udcabL^%\udcf6\udcc7\u007fx['\udcc96\udcef\udcb2(t", ["\udca4h\u071b63\udc8b\u0014\udcfd\udcb7\udc82_U\udcce=\udcf4\udce7\u0015\u0017\udcad"], 0, [["ef1", "9"], ["user", "test1"]], [*, 0], null]], "max_date": [*, 0], "min_date": [*, 0], "successors": ["\udca4h\u071b63\udc8b\u0014\udcfd\udcb7\udc82_U\udcce=\udcf4\udce7\u0015\u0017\udcad"], "users": ["test1"], "verb": "rewritten"}] (glob)
+  | x  471f378eab4c [{"markers": [["471f378eab4c5e25f6c77f785b27c936efb22874", ["a468dc9b36338b14fdb7825f55ce3df4e71517ad"], 0, [["ef1", "9"], ["user", "test1"]], [*, *], null]], "max_date": [*, *], "min_date": [*, *], "successors": ["a468dc9b36338b14fdb7825f55ce3df4e71517ad"], "users": ["test1"], "verb": "rewritten"}] (glob)
   |/
   o  ea207398892e ""
   
@@ -327,7 +346,7 @@
   | @  471597cad322
   |/     Successors: [337fec4d2edc, f257fde29c7a]
   |      semi-colon: [337fec4d2edc, f257fde29c7a]
-  |      Fate: rewritten by test as 337fec4d2edc, f257fde29c7a
+  |      Fate: split as 337fec4d2edc, f257fde29c7a
   |
   o  ea207398892e
   
@@ -337,7 +356,7 @@
   o  337fec4d2edc
   |
   | @  471597cad322
-  |/     Obsfate: rewritten by test as 337fec4d2edc, f257fde29c7a
+  |/     Obsfate: split as 337fec4d2edc, f257fde29c7a
   |
   o  ea207398892e
   
@@ -366,7 +385,7 @@
   | x  471597cad322
   |/     Successors: [337fec4d2edc, f257fde29c7a]
   |      semi-colon: [337fec4d2edc, f257fde29c7a]
-  |      Fate: rewritten by test as 337fec4d2edc, f257fde29c7a
+  |      Fate: split as 337fec4d2edc, f257fde29c7a
   |
   o  ea207398892e
   
@@ -376,7 +395,7 @@
   o  337fec4d2edc
   |
   | x  471597cad322
-  |/     Obsfate: rewritten by test as 337fec4d2edc, f257fde29c7a
+  |/     Obsfate: split as 337fec4d2edc, f257fde29c7a
   |
   o  ea207398892e
   
@@ -386,7 +405,7 @@
   |
   o  337fec4d2edc ""
   |
-  | x  471597cad322 [{"markers": [["G\\u0015\\udc97\\udcca\\udcd3\\"\\udcd1\\udcf6Y\\udcbb\\u0016\\udc97Q\\udcbe\\udc913\\udcda\\udcd9.\\udcf3", ["3\\u007f\\udcecM.\\udcdc\\udcf0\\udce7\\udca4g\\udce3_\\udc81\\udc824\\udcbcb\\u0000h\\udcb5", "\\udcf2W\\udcfd\\udce2\\udc9cz\\udc84|\\udc9b`\\u007fn\\udc95\\udc86V\\udcd0\\udcdf\\u000f\\udcb1\\\\"], 0, [["ef1", "12"], ["user", "test"]], [*, 0], null]], "max_date": [*, 0], "min_date": [*, 0], "successors": ["3\\u007f\\udcecM.\\udcdc\\udcf0\\udce7\\udca4g\\udce3_\\udc81\\udc824\\udcbcb\\u0000h\\udcb5", "\\udcf2W\\udcfd\\udce2\\udc9cz\\udc84|\\udc9b`\\u007fn\\udc95\\udc86V\\udcd0\\udcdf\\u000f\\udcb1\\\\"], "users": ["test"], "verb": "rewritten"}] (glob)
+  | x  471597cad322 [{"markers": [["471597cad322d1f659bb169751be9133dad92ef3", ["337fec4d2edcf0e7a467e35f818234bc620068b5", "f257fde29c7a847c9b607f6e958656d0df0fb15c"], 0, [["ef1", "12"], ["user", "test"]], [*, *], null]], "max_date": [*, *], "min_date": [*, *], "successors": ["337fec4d2edcf0e7a467e35f818234bc620068b5", "f257fde29c7a847c9b607f6e958656d0df0fb15c"], "users": ["test"], "verb": "split"}] (glob)
   |/
   o  ea207398892e ""
   
@@ -461,7 +480,7 @@
   | @  471f378eab4c
   |/     Successors: [eb5a0daa2192]
   |      semi-colon: [eb5a0daa2192]
-  |      Fate: rewritten by test as eb5a0daa2192
+  |      Fate: rewritten as eb5a0daa2192
   |
   o  ea207398892e
   
@@ -469,7 +488,7 @@
   o  eb5a0daa2192
   |
   | @  471f378eab4c
-  |/     Obsfate: rewritten by test as eb5a0daa2192
+  |/     Obsfate: rewritten as eb5a0daa2192
   |
   o  ea207398892e
   
@@ -487,12 +506,12 @@
   | @  0dec01379d3b
   | |    Successors: [eb5a0daa2192]
   | |    semi-colon: [eb5a0daa2192]
-  | |    Fate: rewritten by test as eb5a0daa2192
+  | |    Fate: rewritten as eb5a0daa2192
   | |
   | x  471f378eab4c
   |/     Successors: [eb5a0daa2192]
   |      semi-colon: [eb5a0daa2192]
-  |      Fate: rewritten by test as eb5a0daa2192
+  |      Fate: rewritten as eb5a0daa2192
   |
   o  ea207398892e
   
@@ -500,10 +519,10 @@
   o  eb5a0daa2192
   |
   | @  0dec01379d3b
-  | |    Obsfate: rewritten by test as eb5a0daa2192
+  | |    Obsfate: rewritten as eb5a0daa2192
   | |
   | x  471f378eab4c
-  |/     Obsfate: rewritten by test as eb5a0daa2192
+  |/     Obsfate: rewritten as eb5a0daa2192
   |
   o  ea207398892e
   
@@ -527,12 +546,12 @@
   | x  0dec01379d3b
   | |    Successors: [eb5a0daa2192]
   | |    semi-colon: [eb5a0daa2192]
-  | |    Fate: rewritten by test as eb5a0daa2192
+  | |    Fate: rewritten as eb5a0daa2192
   | |
   | x  471f378eab4c
   |/     Successors: [eb5a0daa2192]
   |      semi-colon: [eb5a0daa2192]
-  |      Fate: rewritten by test as eb5a0daa2192
+  |      Fate: rewritten as eb5a0daa2192
   |
   o  ea207398892e
   
@@ -540,10 +559,10 @@
   @  eb5a0daa2192
   |
   | x  0dec01379d3b
-  | |    Obsfate: rewritten by test as eb5a0daa2192
+  | |    Obsfate: rewritten as eb5a0daa2192
   | |
   | x  471f378eab4c
-  |/     Obsfate: rewritten by test as eb5a0daa2192
+  |/     Obsfate: rewritten as eb5a0daa2192
   |
   o  ea207398892e
   
@@ -551,9 +570,9 @@
   $ hg fatelogjson --hidden
   @  eb5a0daa2192 ""
   |
-  | x  0dec01379d3b [{"markers": [["\r\udcec\u00017\udc9d;\udce61\udc8cG\u000e\udcad1\udcb1\udcfez\udce7\udccbS\udcd5", ["\udcebZ\r\udcaa!\udc92;\udcbf\udc8c\udcae\udcb2\udcc4 \udc85\udcb9\udce4c\udc86\u001f\udcd0"], 0, [["ef1", "13"], ["user", "test"]], [*, 0], null]], "max_date": [*, 0], "min_date": [*, 0], "successors": ["\udcebZ\r\udcaa!\udc92;\udcbf\udc8c\udcae\udcb2\udcc4 \udc85\udcb9\udce4c\udc86\u001f\udcd0"], "users": ["test"], "verb": "rewritten"}] (glob)
+  | x  0dec01379d3b [{"markers": [["0dec01379d3be6318c470ead31b1fe7ae7cb53d5", ["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"], 0, [["ef1", "13"], ["user", "test"]], [*, *], null]], "max_date": [*, *], "min_date": [*, *], "successors": ["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"], "users": ["test"], "verb": "rewritten"}] (glob)
   | |
-  | x  471f378eab4c [{"markers": [["G\u001f7\udc8e\udcabL^%\udcf6\udcc7\u007fx['\udcc96\udcef\udcb2(t", ["\udcebZ\r\udcaa!\udc92;\udcbf\udc8c\udcae\udcb2\udcc4 \udc85\udcb9\udce4c\udc86\u001f\udcd0"], 0, [["ef1", "9"], ["user", "test"]], [*, 0], null]], "max_date": [*, 0], "min_date": [*, 0], "successors": ["\udcebZ\r\udcaa!\udc92;\udcbf\udc8c\udcae\udcb2\udcc4 \udc85\udcb9\udce4c\udc86\u001f\udcd0"], "users": ["test"], "verb": "rewritten"}] (glob)
+  | x  471f378eab4c [{"markers": [["471f378eab4c5e25f6c77f785b27c936efb22874", ["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"], 0, [["ef1", "9"], ["user", "test"]], [*, *], null]], "max_date": [*, *], "min_date": [*, *], "successors": ["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"], "users": ["test"], "verb": "rewritten"}] (glob)
   |/
   o  ea207398892e ""
   
@@ -640,8 +659,8 @@
   | @  471f378eab4c
   |/     Successors: [fdf9bde5129a], [019fadeab383]
   |      semi-colon: [fdf9bde5129a]; [019fadeab383]
-  |      Fate: rewritten by test as fdf9bde5129a
-  |    rewritten by test as 019fadeab383
+  |      Fate: rewritten as fdf9bde5129a
+  |    rewritten as 019fadeab383
   |
   o  ea207398892e
   
@@ -651,8 +670,8 @@
   | o  fdf9bde5129a
   |/
   | @  471f378eab4c
-  |/     Obsfate: rewritten by test as fdf9bde5129a
-  |    rewritten by test as 019fadeab383
+  |/     Obsfate: rewritten as fdf9bde5129a
+  |    rewritten as 019fadeab383
   |
   o  ea207398892e
   
@@ -686,7 +705,7 @@
   |      semi-colon: 471f378eab4c
   |      Successors: [019fadeab383]
   |      semi-colon: [019fadeab383]
-  |      Fate: rewritten by test as 019fadeab383
+  |      Fate: rewritten as 019fadeab383
   |
   | @  fdf9bde5129a
   |/     Precursors: 471f378eab4c
@@ -694,8 +713,8 @@
   | x  471f378eab4c
   |/     Successors: [fdf9bde5129a], [65b757b745b9]
   |      semi-colon: [fdf9bde5129a]; [65b757b745b9]
-  |      Fate: rewritten by test as fdf9bde5129a
-  |    rewritten by test as 65b757b745b9
+  |      Fate: rewritten as fdf9bde5129a
+  |    rewritten as 65b757b745b9
   |
   o  ea207398892e
   
@@ -703,13 +722,13 @@
   o  019fadeab383
   |
   | x  65b757b745b9
-  |/     Obsfate: rewritten by test as 019fadeab383
+  |/     Obsfate: rewritten as 019fadeab383
   |
   | @  fdf9bde5129a
   |/
   | x  471f378eab4c
-  |/     Obsfate: rewritten by test as fdf9bde5129a
-  |    rewritten by test as 65b757b745b9
+  |/     Obsfate: rewritten as fdf9bde5129a
+  |    rewritten as 65b757b745b9
   |
   o  ea207398892e
   
@@ -717,11 +736,11 @@
   $ hg fatelogjson --hidden
   o  019fadeab383 ""
   |
-  | x  65b757b745b9 [{"markers": [["e\udcb7W\udcb7E\udcb95\t\u003c\udc87\udca2\udcbc\u0347u!\udccc\udccf\udcfc\udcbd", ["\u0001\udc9f\udcad\uacc3\udcf6i\udc9f\udca8:\u05fd\udcb4\udcd8.\udcd2\udcc0\udce5\udcab"], 0, [["ef1", "1"], ["user", "test"]], [*, 0], null]], "max_date": [*, 0], "min_date": [*, 0], "successors": ["\u0001\udc9f\udcad\uacc3\udcf6i\udc9f\udca8:\u05fd\udcb4\udcd8.\udcd2\udcc0\udce5\udcab"], "users": ["test"], "verb": "rewritten"}] (glob)
+  | x  65b757b745b9 [{"markers": [["65b757b745b935093c87a2bccd877521cccffcbd", ["019fadeab383f6699fa83ad7bdb4d82ed2c0e5ab"], 0, [["ef1", "1"], ["user", "test"]], [*, *], null]], "max_date": [*, *], "min_date": [*, *], "successors": ["019fadeab383f6699fa83ad7bdb4d82ed2c0e5ab"], "users": ["test"], "verb": "rewritten"}] (glob)
   |/
   | @  fdf9bde5129a ""
   |/
-  | x  471f378eab4c [{"markers": [["G\\u001f7\\udc8e\\udcabL^%\\udcf6\\udcc7\\u007fx['\\udcc96\\udcef\\udcb2(t", ["\\udcfd\\udcf9\\udcbd\\udce5\\u0012\\udc9a(\\udcd4T\\udc8f\\udcad\\udcd3\\udcf6+&\\\\\\udcdd;z."], 0, [["ef1", "1"], ["user", "test"]], [*, 0], null]], "max_date": [*, 0], "min_date": [*, 0], "successors": ["\\udcfd\\udcf9\\udcbd\\udce5\\u0012\\udc9a(\\udcd4T\\udc8f\\udcad\\udcd3\\udcf6+&\\\\\\udcdd;z."], "users": ["test"], "verb": "rewritten"}, {"markers": [["G\\u001f7\\udc8e\\udcabL^%\\udcf6\\udcc7\\u007fx['\\udcc96\\udcef\\udcb2(t", ["e\\udcb7W\\udcb7E\\udcb95\\t\\u003c\\udc87\\udca2\\udcbc\\u0347u!\\udccc\\udccf\\udcfc\\udcbd"], 0, [["ef1", "1"], ["user", "test"]], [*, 0], null]], "max_date": [*, 0], "min_date": [*, 0], "successors": ["e\\udcb7W\\udcb7E\\udcb95\\t\\u003c\\udc87\\udca2\\udcbc\\u0347u!\\udccc\\udccf\\udcfc\\udcbd"], "users": ["test"], "verb": "rewritten"}] (glob)
+  | x  471f378eab4c [{"markers": [["471f378eab4c5e25f6c77f785b27c936efb22874", ["fdf9bde5129a28d4548fadd3f62b265cdd3b7a2e"], 0, [["ef1", "1"], ["user", "test"]], [*, *], null]], "max_date": [*, *], "min_date": [*, *], "successors": ["fdf9bde5129a28d4548fadd3f62b265cdd3b7a2e"], "users": ["test"], "verb": "rewritten"}, {"markers": [["471f378eab4c5e25f6c77f785b27c936efb22874", ["65b757b745b935093c87a2bccd877521cccffcbd"], 0, [["ef1", "1"], ["user", "test"]], [*, *], null]], "max_date": [*, *], "min_date": [*, *], "successors": ["65b757b745b935093c87a2bccd877521cccffcbd"], "users": ["test"], "verb": "rewritten"}] (glob)
   |/
   o  ea207398892e ""
   
@@ -807,7 +826,7 @@
   | @  471f378eab4c
   |/     Successors: [eb5a0daa2192]
   |      semi-colon: [eb5a0daa2192]
-  |      Fate: rewritten by test as eb5a0daa2192
+  |      Fate: rewritten as eb5a0daa2192
   |
   o  ea207398892e
   
@@ -815,7 +834,7 @@
   o  eb5a0daa2192
   |
   | @  471f378eab4c
-  |/     Obsfate: rewritten by test as eb5a0daa2192
+  |/     Obsfate: rewritten as eb5a0daa2192
   |
   o  ea207398892e
   
@@ -830,12 +849,12 @@
   | @  0dec01379d3b
   | |    Successors: [eb5a0daa2192]
   | |    semi-colon: [eb5a0daa2192]
-  | |    Fate: rewritten by test as eb5a0daa2192
+  | |    Fate: rewritten as eb5a0daa2192
   | |
   | x  471f378eab4c
   |/     Successors: [eb5a0daa2192]
   |      semi-colon: [eb5a0daa2192]
-  |      Fate: rewritten by test as eb5a0daa2192
+  |      Fate: rewritten as eb5a0daa2192
   |
   o  ea207398892e
   
@@ -843,10 +862,10 @@
   o  eb5a0daa2192
   |
   | @  0dec01379d3b
-  | |    Obsfate: rewritten by test as eb5a0daa2192
+  | |    Obsfate: rewritten as eb5a0daa2192
   | |
   | x  471f378eab4c
-  |/     Obsfate: rewritten by test as eb5a0daa2192
+  |/     Obsfate: rewritten as eb5a0daa2192
   |
   o  ea207398892e
   
@@ -862,12 +881,12 @@
   | @  b7ea6d14e664
   | |    Successors: [eb5a0daa2192]
   | |    semi-colon: [eb5a0daa2192]
-  | |    Fate: rewritten by test as eb5a0daa2192
+  | |    Fate: rewritten as eb5a0daa2192
   | |
   | x  471f378eab4c
   |/     Successors: [eb5a0daa2192]
   |      semi-colon: [eb5a0daa2192]
-  |      Fate: rewritten by test as eb5a0daa2192
+  |      Fate: rewritten as eb5a0daa2192
   |
   o  ea207398892e
   
@@ -875,10 +894,10 @@
   o  eb5a0daa2192
   |
   | @  b7ea6d14e664
-  | |    Obsfate: rewritten by test as eb5a0daa2192
+  | |    Obsfate: rewritten as eb5a0daa2192
   | |
   | x  471f378eab4c
-  |/     Obsfate: rewritten by test as eb5a0daa2192
+  |/     Obsfate: rewritten as eb5a0daa2192
   |
   o  ea207398892e
   
@@ -899,17 +918,17 @@
   | |    semi-colon: 0dec01379d3b
   | |    Successors: [eb5a0daa2192]
   | |    semi-colon: [eb5a0daa2192]
-  | |    Fate: rewritten by test as eb5a0daa2192
+  | |    Fate: rewritten as eb5a0daa2192
   | |
   | | x  0dec01379d3b
   | |/     Successors: [b7ea6d14e664]
   | |      semi-colon: [b7ea6d14e664]
-  | |      Fate: rewritten by test as b7ea6d14e664
+  | |      Fate: rewritten as b7ea6d14e664
   | |
   | x  471f378eab4c
   |/     Successors: [eb5a0daa2192]
   |      semi-colon: [eb5a0daa2192]
-  |      Fate: rewritten by test as eb5a0daa2192
+  |      Fate: rewritten as eb5a0daa2192
   |
   o  ea207398892e
   
@@ -917,24 +936,24 @@
   @  eb5a0daa2192
   |
   | x  b7ea6d14e664
-  | |    Obsfate: rewritten by test as eb5a0daa2192
+  | |    Obsfate: rewritten as eb5a0daa2192
   | |
   | | x  0dec01379d3b
-  | |/     Obsfate: rewritten by test as b7ea6d14e664
+  | |/     Obsfate: rewritten as b7ea6d14e664
   | |
   | x  471f378eab4c
-  |/     Obsfate: rewritten by test as eb5a0daa2192
+  |/     Obsfate: rewritten as eb5a0daa2192
   |
   o  ea207398892e
   
   $ hg fatelogjson --hidden
   @  eb5a0daa2192 ""
   |
-  | x  b7ea6d14e664 [{"markers": [["\udcb7\udceam\u0014\udce6d\udcbd\u0212\"!\udcf7\udc99&1\udcb5\r\udca3\udcfb\u0007", ["\udcebZ\r\udcaa!\udc92;\udcbf\udc8c\udcae\udcb2\udcc4 \udc85\udcb9\udce4c\udc86\u001f\udcd0"], 0, [["ef1", "13"], ["user", "test"]], [*, 0], null]], "max_date": [*, 0], "min_date": [*, 0], "successors": ["\udcebZ\r\udcaa!\udc92;\udcbf\udc8c\udcae\udcb2\udcc4 \udc85\udcb9\udce4c\udc86\u001f\udcd0"], "users": ["test"], "verb": "rewritten"}] (glob)
+  | x  b7ea6d14e664 [{"markers": [["b7ea6d14e664bdc8922221f7992631b50da3fb07", ["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"], 0, [["ef1", "13"], ["user", "test"]], [*, *], null]], "max_date": [*, *], "min_date": [*, *], "successors": ["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"], "users": ["test"], "verb": "rewritten"}] (glob)
   | |
-  | | x  0dec01379d3b [{"markers": [["\r\udcec\u00017\udc9d;\udce61\udc8cG\u000e\udcad1\udcb1\udcfez\udce7\udccbS\udcd5", ["\udcb7\udceam\u0014\udce6d\udcbd\u0212\"!\udcf7\udc99&1\udcb5\r\udca3\udcfb\u0007"], 0, [["ef1", "1"], ["user", "test"]], [*, 0], null]], "max_date": [*, 0], "min_date": [*, 0], "successors": ["\udcb7\udceam\u0014\udce6d\udcbd\u0212\"!\udcf7\udc99&1\udcb5\r\udca3\udcfb\u0007"], "users": ["test"], "verb": "rewritten"}] (glob)
+  | | x  0dec01379d3b [{"markers": [["0dec01379d3be6318c470ead31b1fe7ae7cb53d5", ["b7ea6d14e664bdc8922221f7992631b50da3fb07"], 0, [["ef1", "1"], ["user", "test"]], [*, *], null]], "max_date": [*, *], "min_date": [*, *], "successors": ["b7ea6d14e664bdc8922221f7992631b50da3fb07"], "users": ["test"], "verb": "rewritten"}] (glob)
   | |/
-  | x  471f378eab4c [{"markers": [["G\u001f7\udc8e\udcabL^%\udcf6\udcc7\u007fx['\udcc96\udcef\udcb2(t", ["\udcebZ\r\udcaa!\udc92;\udcbf\udc8c\udcae\udcb2\udcc4 \udc85\udcb9\udce4c\udc86\u001f\udcd0"], 0, [["ef1", "9"], ["user", "test"]], [*, 0], null]], "max_date": [*, 0], "min_date": [*, 0], "successors": ["\udcebZ\r\udcaa!\udc92;\udcbf\udc8c\udcae\udcb2\udcc4 \udc85\udcb9\udce4c\udc86\u001f\udcd0"], "users": ["test"], "verb": "rewritten"}] (glob)
+  | x  471f378eab4c [{"markers": [["471f378eab4c5e25f6c77f785b27c936efb22874", ["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"], 0, [["ef1", "9"], ["user", "test"]], [*, *], null]], "max_date": [*, *], "min_date": [*, *], "successors": ["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"], "users": ["test"], "verb": "rewritten"}] (glob)
   |/
   o  ea207398892e ""
   
@@ -1032,7 +1051,7 @@
   | @  471f378eab4c
   |/     Successors: [7a230b46bf61]
   |      semi-colon: [7a230b46bf61]
-  |      Fate: rewritten by test as 7a230b46bf61
+  |      Fate: rewritten as 7a230b46bf61
   |
   o  ea207398892e
   
@@ -1063,7 +1082,7 @@
   | x  471f378eab4c
   |/     Successors: [7a230b46bf61]
   |      semi-colon: [7a230b46bf61]
-  |      Fate: rewritten by test as 7a230b46bf61
+  |      Fate: rewritten as 7a230b46bf61
   |
   o  ea207398892e
   
@@ -1079,7 +1098,7 @@
   $ hg fatelogjson --hidden
   @  7a230b46bf61 ""
   |
-  | x  471f378eab4c [{"markers": [["G\\u001f7\\udc8e\\udcabL^%\\udcf6\\udcc7\\u007fx['\\udcc96\\udcef\\udcb2(t", ["\\udcfd\\udcf9\\udcbd\\udce5\\u0012\\udc9a(\\udcd4T\\udc8f\\udcad\\udcd3\\udcf6+&\\\\\\udcdd;z."], 0, [["ef1", "1"], ["user", "test"]], [*, 0], null], ["\\udcfd\\udcf9\\udcbd\\udce5\\u0012\\udc9a(\\udcd4T\\udc8f\\udcad\\udcd3\\udcf6+&\\\\\\udcdd;z.", ["z#\\u000bF\\udcbfa\\udce5\\u000b00\\udc8cl\\udcfd{\\udcd1&\\udc9e\\udcf5G\\u0002"], 0, [["ef1", "1"], ["user", "test"]], [*, 0], null]], "max_date": [*, 0], "min_date": [*, 0], "successors": ["z#\\u000bF\\udcbfa\\udce5\\u000b00\\udc8cl\\udcfd{\\udcd1&\\udc9e\\udcf5G\\u0002"], "users": ["test"], "verb": "rewritten"}] (glob)
+  | x  471f378eab4c [{"markers": [["471f378eab4c5e25f6c77f785b27c936efb22874", ["fdf9bde5129a28d4548fadd3f62b265cdd3b7a2e"], 0, [["ef1", "1"], ["user", "test"]], [*, *], null], ["fdf9bde5129a28d4548fadd3f62b265cdd3b7a2e", ["7a230b46bf61e50b30308c6cfd7bd1269ef54702"], 0, [["ef1", "1"], ["user", "test"]], [*, *], null]], "max_date": [*, *], "min_date": [*, *], "successors": ["7a230b46bf61e50b30308c6cfd7bd1269ef54702"], "users": ["test"], "verb": "rewritten"}] (glob)
   |/
   o  ea207398892e ""
   
@@ -1114,7 +1133,7 @@
   
   $ hg fatelog -v
   @  471f378eab4c
-  |    Obsfate: pruned
+  |    Obsfate: pruned by test (at *) (glob)
   |
   o  ea207398892e