src/topic/revset.py
author Augie Fackler <raf@durin42.com>
Fri, 11 Dec 2015 12:53:20 -0500
changeset 1874 ec28b6c3414a
parent 1870 8dd5200b4086
permissions -rw-r--r--
topic: fix changing topics of commits that have an amend_source Includes a test for this specific case, but we should probably spend more time squinting at the interactions between the current topic wrapper function and commitctx for memctx instances.

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})