[PATCH 4 of 7] obsolete: add a function to compute "exclusive-markers" for a set of nodes
Sean Farley
sean at farley.io
Thu Jun 1 20:19:47 UTC 2017
Pierre-Yves David <pierre-yves.david at ens-lyon.org> writes:
> # HG changeset patch
> # User Pierre-Yves David <pierre-yves.david at octobus.net>
> # Date 1495285350 -7200
> # Sat May 20 15:02:30 2017 +0200
> # Node ID 4e41314bde029bf730b5a669fbf8cf13b743396f
> # Parent d433507372b128fedd128bce0b724fca4fa78d87
> # EXP-Topic obsstrip
> # Available At https://www.mercurial-scm.org/repo/users/marmoute/mercurial/
> # hg pull https://www.mercurial-scm.org/repo/users/marmoute/mercurial/ -r 4e41314bde02
> obsolete: add a function to compute "exclusive-markers" for a set of nodes
>
> This set will be used to select the obsmarkers to be stripped alongside the
> stripped changesets. See the function docstring for details.
>
> More advanced testing is introduced in the next changesets to keep this one
> simpler. That extra testing provides more example.
Really like where this is going.
> diff --git a/mercurial/debugcommands.py b/mercurial/debugcommands.py
> --- a/mercurial/debugcommands.py
> +++ b/mercurial/debugcommands.py
> @@ -1313,6 +1313,8 @@ def debugnamecomplete(ui, repo, *args):
> ('', 'record-parents', False,
> _('record parent information for the precursor')),
> ('r', 'rev', [], _('display markers relevant to REV')),
> + ('', 'exclusive', False, _('restrict display to markers only '
> + 'relevant to REV')),
> ('', 'index', False, _('display index of the marker')),
> ('', 'delete', [], _('delete markers specified by indices')),
> ] + cmdutil.commitopts2 + cmdutil.formatteropts,
> @@ -1391,7 +1393,8 @@ def debugobsolete(ui, repo, precursor=No
> if opts['rev']:
> revs = scmutil.revrange(repo, opts['rev'])
> nodes = [repo[r].node() for r in revs]
> - markers = list(obsolete.getmarkers(repo, nodes=nodes))
> + markers = list(obsolete.getmarkers(repo, nodes=nodes,
> + exclusive=opts['exclusive']))
> markers.sort(key=lambda x: x._data)
> else:
> markers = obsolete.getmarkers(repo)
> diff --git a/mercurial/obsolete.py b/mercurial/obsolete.py
> --- a/mercurial/obsolete.py
> +++ b/mercurial/obsolete.py
> @@ -737,6 +737,129 @@ class obsstore(object):
> seennodes |= pendingnodes
> return seenmarkers
>
> +def _filterprunes(markers):
> + """return a set with no prune markers"""
> + return set(m for m in markers if m[1])
> +
> +def exclusivemarkers(repo, nodes):
> + """set of markers relevant to "nodes" but no other locally-known nodes
> +
> + This function compute the set of markers "exclusive" to a locally-known
> + node. This means we walk the markers starting from <nodes> until we reach a
> + locally-known precursors outside of <nodes>. Element of <nodes> with
> + locally-known successors outside of <nodes> are ignored (since their
> + precursors markers are also relevant to these successors).
> +
> + For example:
> +
> + # (A0 rewritten as A1)
> + #
> + # A0 <-1- A1 # Marker "1" is exclusive to A1
> +
> + or
> +
> + # (A0 rewritten as AX; AX rewritten as A1; AX is unkown locally)
> + #
> + # <-1- A0 <-2- AX <-3- A1 # Marker "2,3" are exclusive to A1
> +
> + or
> +
> + # (A0 has unknown precursors, A0 rewritten as A1 and A2 (divergence))
> + #
> + # <-2- A1 # Marker "2" is exclusive to A0,A1
> + # /
> + # <-1- A0
> + # \
> + # <-3- A2 # Marker "3" is exclusive to A0,A2
> + #
> + # in addition:
> + #
> + # Markers "2,3" are exclusive to A1,A2
> + # Markers "1,2,3" are exclusive to A0,A1,A2
> +
> + An example usage is strip. When stripping a changeset, we also want to
> + strip the markers exclusive to this changeset. Otherwise we would have
> + "dangling"" obsolescence markers from its precursors: Obsolescence markers
> + marking a node as obsolete without any successors available locally.
> +
> + As for relevant markers, the prune markers for children will be followed.
> + Of course, they will only be followed if the pruned children is
> + locally-known. Since the prune markers are relevant to the pruned node.
> + However, while prune markers are considered relevant to the parent of the
> + pruned changesets, prune markers for locally-known changeset (with no
> + successors) are considered exclusive to the pruned nodes. This allows
> + to strip the prune markers (with the rest of the exclusive chain) alongside
> + the pruned changesets.
I think I follow this method; thanks! I might do some English nitpicking
on the doc string, though.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 800 bytes
Desc: not available
URL: <http://lists.mercurial-scm.org/pipermail/mercurial-devel/attachments/20170601/e8707f6c/attachment.asc>
More information about the Mercurial-devel
mailing list