[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 16:19:47 EDT 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://www.mercurial-scm.org/pipermail/mercurial-devel/attachments/20170601/e8707f6c/attachment.sig>


More information about the Mercurial-devel mailing list