hgext3rd/evolve/obshashtree.py
author Martin von Zweigbergk <martinvonz@google.com>
Thu, 30 Apr 2020 10:05:14 -0700
changeset 5341 13376ca93fa3
parent 4814 48b30ff742cb
permissions -rw-r--r--
evolve: always create commit when resolving divergence When resolving content-divergence, the final commit we create may end up empty (which means that Mercurial won't even create it). We've had code for handling that in evolve ever since 41bf6c27a122 (evolve: stabilize now handle conflicting changeset, 2012-08-23). However, that resolved the issue by marking on the divergent commits as successor. As Pierre-Yves has pointed out (in other code reviews), we should instead be creating a new successor. So that's what this patch does. It does that by setting `ui.allowemptycommit` while creating the final commit. However, that is not enough, because we may end up creating the same nodeid as already existed (we'd then end up trying to mark the "new" commit a successor of itself). To solve that, we add some salt to the commit extras. That salt affects lots of tests.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4644
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     1
#############################
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     2
### Tree Hash computation ###
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     3
#############################
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     4
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     5
# Status: dropable
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     6
#
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     7
# This module don't need to be upstreamed and can be dropped if its maintenance
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     8
# become a burden
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     9
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    10
import hashlib
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    11
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    12
from mercurial import (
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    13
    error,
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    14
    node,
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    15
    obsolete,
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    16
)
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    17
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    18
from mercurial.i18n import _
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    19
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    20
from . import (
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    21
    compat,
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    22
    exthelper,
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    23
)
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    24
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    25
eh = exthelper.exthelper()
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    26
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    27
# Dash computed from a given changesets using all markers relevant to it and
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    28
# the obshash of its parents.  This is similar to what happend for changeset
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    29
# node where the parent is used in the computation
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    30
@eh.command(
4715
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4644
diff changeset
    31
    b'debugobsrelsethashtree',
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4644
diff changeset
    32
    [(b'', b'v0', None, b'hash on marker format "0"'),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4644
diff changeset
    33
     (b'', b'v1', None, b'hash on marker format "1" (default)')], _(b''))
4644
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    34
def debugobsrelsethashtree(ui, repo, v0=False, v1=False):
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    35
    """display Obsolete markers, Relevant Set, Hash Tree
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    36
    changeset-node obsrelsethashtree-node
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    37
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    38
    It computed form the "obs-hash-tree" value of its parent and markers
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    39
    relevant to the changeset itself.
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    40
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    41
    The obs-hash-tree is no longer used for any user facing logic. However the
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    42
    debug command stayed as an inspection tool. It does not seem supseful to
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    43
    upstream the command with the rest of evolve. We can safely drop it."""
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    44
    if v0 and v1:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4715
diff changeset
    45
        raise error.Abort(b'cannot only specify one format')
4644
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    46
    elif v0:
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    47
        treefunc = _obsrelsethashtreefm0
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    48
    else:
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    49
        treefunc = _obsrelsethashtreefm1
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    50
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    51
    for chg, obs in treefunc(repo):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4715
diff changeset
    52
        ui.status(b'%s %s\n' % (node.hex(chg), node.hex(obs)))
4644
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    53
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    54
def _obsrelsethashtreefm0(repo):
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    55
    return _obsrelsethashtree(repo, obsolete._fm0encodeonemarker)
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    56
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    57
def _obsrelsethashtreefm1(repo):
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    58
    return _obsrelsethashtree(repo, obsolete._fm1encodeonemarker)
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    59
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    60
def _obsrelsethashtree(repo, encodeonemarker):
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    61
    cache = []
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    62
    unfi = repo.unfiltered()
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    63
    markercache = {}
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4715
diff changeset
    64
    compat.progress(repo.ui, _(b"preparing locally"), 0, total=len(unfi),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4715
diff changeset
    65
                    unit=_(b"changesets"))
4644
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    66
    for i in unfi:
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    67
        ctx = unfi[i]
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    68
        entry = 0
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    69
        sha = hashlib.sha1()
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    70
        # add data from p1
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    71
        for p in ctx.parents():
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    72
            p = p.rev()
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    73
            if p < 0:
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    74
                p = node.nullid
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    75
            else:
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    76
                p = cache[p][1]
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    77
            if p != node.nullid:
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    78
                entry += 1
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    79
                sha.update(p)
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    80
        tmarkers = repo.obsstore.relevantmarkers([ctx.node()])
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    81
        if tmarkers:
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    82
            bmarkers = []
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    83
            for m in tmarkers:
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    84
                if m not in markercache:
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    85
                    markercache[m] = encodeonemarker(m)
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    86
                bmarkers.append(markercache[m])
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    87
            bmarkers.sort()
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    88
            for m in bmarkers:
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    89
                entry += 1
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    90
                sha.update(m)
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    91
        if entry:
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    92
            cache.append((ctx.node(), sha.digest()))
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    93
        else:
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    94
            cache.append((ctx.node(), node.nullid))
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4715
diff changeset
    95
        compat.progress(repo.ui, _(b"preparing locally"), i, total=len(unfi),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4715
diff changeset
    96
                        unit=_(b"changesets"))
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4715
diff changeset
    97
    compat.progress(repo.ui, _(b"preparing locally"), None)
4644
b228672b0ff9 obshashtree: move obshashtree in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    98
    return cache