hgext3rd/evolve/obshashtree.py
author Anton Shestakov <av6@dwimlabs.net>
Thu, 07 May 2020 01:29:24 +0200
changeset 5348 a9f9edb168a1
parent 4814 48b30ff742cb
permissions -rw-r--r--
obslog: add a --origin flag to show predecessors instead of successors This flag will be turned on by default in the next changeset.
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