view mercurial/utils/repoviewutil.py @ 52164:e01e84e5e426

rust-revlog: add a Rust-only `InnerRevlog` This mirrors the Python `InnerRevlog` and will be used in a future patch to replace said Python implementation. This allows us to start doing more things in pure Rust, in particular reading and writing operations. A lot of changes have to be introduced all at once, it wouldn't be very useful to separate this patch IMO since all of them are either interlocked or only useful with the rest.
author Raphaël Gomès <rgomes@octobus.net>
date Thu, 10 Oct 2024 10:34:51 +0200
parents f4733654f144
children
line wrap: on
line source

# repoviewutil.py - constaints data relevant to repoview.py and other module
#
# Copyright 2012 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
#                Logilab SA        <contact@logilab.fr>
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.

from __future__ import annotations

from .. import error

### Nearest subset relation
# Nearest subset of filter X is a filter Y so that:
# * Y is included in X,
# * X - Y is as small as possible.
# This create and ordering used for branchmap purpose.
# the ordering may be partial
subsettable = {
    None: b'visible',
    b'visible-hidden': b'visible',
    b'visible': b'served',
    b'served.hidden': b'served',
    b'served': b'immutable',
    b'immutable': b'base',
}


def get_ordered_subset():
    """return a list of subset name from dependencies to dependents"""
    _unfinalized = set(subsettable.values())
    ordered = []

    # the subset table is expected to be small so we do the stupid N² version
    # of the algorithm
    while _unfinalized:
        this_level = []
        for candidate in _unfinalized:
            dependency = subsettable.get(candidate)
            if dependency not in _unfinalized:
                this_level.append(candidate)

        if not this_level:
            msg = "cyclic dependencies in repoview subset %r"
            msg %= subsettable
            raise error.ProgrammingError(msg)

        this_level.sort(key=lambda x: x if x is not None else '')

        ordered.extend(this_level)
        _unfinalized.difference_update(this_level)

    return ordered