src/topic/revset.py
author Pierre-Yves David <pierre-yves.david@fb.com>
Mon, 14 Mar 2016 17:48:31 +0000
changeset 1896 4ae421cbb07c
parent 1870 8dd5200b4086
permissions -rw-r--r--
stack: exclude obsolete changeset from the set We care about relevant changeset, obsolete have a new version somewhere and we don't care about the old one in our display. In case of unstability, the ordering used is still wrong.

from mercurial import revset
from mercurial import util

from . import constants, destination

try:
    mkmatcher = revset._stringmatcher
except AttributeError:
    mkmatcher = util.stringmatcher


def topicset(repo, subset, x):
    """`topic([topic])`
    Specified topic or all changes with any topic specified.

    If `topic` starts with `re:` the remainder of the name is treated
    as a regular expression.

    TODO: make `topic(revset)` work the same as `branch(revset)`.
    """
    args = revset.getargs(x, 0, 1, 'topic takes one or no arguments')
    if args:
        # match a specific topic
        topic = revset.getstring(args[0], 'topic() argument must be a string')
        if topic == '.':
            topic = repo['.'].extra().get('topic', '')
        _kind, _pattern, matcher = mkmatcher(topic)
    else:
        matcher = lambda t: bool(t)
    drafts = subset.filter(lambda r: repo[r].mutable())
    return drafts.filter(
        lambda r: matcher(repo[r].extra().get(constants.extrakey, '')))

def ngtipset(repo, subset, x):
    """`ngtip([branch])`

    The untopiced tip.

    Name is horrible so that people change it.
    """
    args = revset.getargs(x, 1, 1, 'topic takes one')
    # match a specific topic
    branch = revset.getstring(args[0], 'ngtip() argument must be a string')
    if branch == '.':
        branch = repo['.'].branch()
    return subset & destination.ngtip(repo, branch)

def modsetup():
    revset.symbols.update({'topic': topicset})
    revset.symbols.update({'ngtip': ngtipset})