[PATCH 4 of 9] template: add minimal obsfate template
Jun Wu
quark at fb.com
Thu Jul 6 20:05:01 EDT 2017
I'm not a big fan of this obsfate template approach. Ideally we could
extract information from an obsmarker using templates. Something like
"{marker.user} {marker.operation} {marker.xxxx}". That's much more flexible
and could work with colors trivially. The current template is binded to a
ctx. We could define some functions or introduce special synctax to make it
bind to an obsmarker.
Excerpts from Boris Feld's message of 2017-07-06 23:50:12 +0200:
> # HG changeset patch
> # User Boris Feld <boris.feld at 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)
> +
> + at 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
> +
More information about the Mercurial-devel
mailing list