hgext3rd/topic/revset.py
author Sushil khanchi <sushilkhanchi97@gmail.com>
Mon, 04 Mar 2019 03:16:51 +0530
branchstable
changeset 4420 6a20e0e9b957
parent 4339 0f015fe4f71f
child 4369 75276f858444
permissions -rw-r--r--
evolve: make sure user can recover from conflict (issue6053) we make sure while continuing interrupted evolve it reach to right code This patch fix the issue6053 which is about falling evolve into unrecoverable state and this is how it call fall into it: If after some rewrite operations we reach to a point where resparent for two content divergent csets is obsolete and we hit a conflict in relocation, so now if you run `hg evolve --continue` after resolving the conflict: code execution would check if wdir parent is obsolete and run solveobswdp() rather than going to continueevolve() part and there we will hit by a "abort: outstanding uncommitted merge" And same for `--abort` or `--stop` flags. Changes in tests reflect the fixed behaviour.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1935
11d740319280 revset: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1923
diff changeset
     1
from __future__ import absolute_import
11d740319280 revset: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1923
diff changeset
     2
11d740319280 revset: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1923
diff changeset
     3
from mercurial import (
4058
90783c9c8609 topic: prepare to handle non-string arguments to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4057
diff changeset
     4
    error,
2924
430fb1758d28 topic: use registrar.revsetpredicate to register revset predicate functions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2915
diff changeset
     5
    registrar,
1935
11d740319280 revset: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1923
diff changeset
     6
    revset,
11d740319280 revset: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1923
diff changeset
     7
    util,
11d740319280 revset: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1923
diff changeset
     8
)
1843
0ba067a97d06 revset: add a topic() revset for querying topics
Augie Fackler <augie@google.com>
parents:
diff changeset
     9
1935
11d740319280 revset: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1923
diff changeset
    10
from . import (
11d740319280 revset: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1923
diff changeset
    11
    destination,
11d740319280 revset: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1923
diff changeset
    12
    stack,
11d740319280 revset: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1923
diff changeset
    13
)
1845
24d8053020a2 constants: extract key for extra into a constant
Augie Fackler <augie@google.com>
parents: 1843
diff changeset
    14
1865
558dd43b599d topic: work around stringmatcher moving during development of hg 3.6
Augie Fackler <raf@durin42.com>
parents: 1864
diff changeset
    15
try:
558dd43b599d topic: work around stringmatcher moving during development of hg 3.6
Augie Fackler <raf@durin42.com>
parents: 1864
diff changeset
    16
    mkmatcher = revset._stringmatcher
558dd43b599d topic: work around stringmatcher moving during development of hg 3.6
Augie Fackler <raf@durin42.com>
parents: 1864
diff changeset
    17
except AttributeError:
3613
bf583a8dc637 compat: search for stringmatcher in the new location
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3156
diff changeset
    18
    try:
bf583a8dc637 compat: search for stringmatcher in the new location
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3156
diff changeset
    19
        from mercurial.utils import stringutil
bf583a8dc637 compat: search for stringmatcher in the new location
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3156
diff changeset
    20
        mkmatcher = stringutil.stringmatcher
bf583a8dc637 compat: search for stringmatcher in the new location
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3156
diff changeset
    21
    except (ImportError, AttributeError):
bf583a8dc637 compat: search for stringmatcher in the new location
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3156
diff changeset
    22
        mkmatcher = util.stringmatcher
1865
558dd43b599d topic: work around stringmatcher moving during development of hg 3.6
Augie Fackler <raf@durin42.com>
parents: 1864
diff changeset
    23
2924
430fb1758d28 topic: use registrar.revsetpredicate to register revset predicate functions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2915
diff changeset
    24
revsetpredicate = registrar.revsetpredicate()
1865
558dd43b599d topic: work around stringmatcher moving during development of hg 3.6
Augie Fackler <raf@durin42.com>
parents: 1864
diff changeset
    25
4063
00c65abf99cd topic-revset: strictly read string
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4061
diff changeset
    26
def getstringstrict(x, err):
4095
aabf436c11cb topic: refactor revset.py slightly
Anton Shestakov <av6@dwimlabs.net>
parents: 4064
diff changeset
    27
    if x and x[0] == 'string':
4063
00c65abf99cd topic-revset: strictly read string
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4061
diff changeset
    28
        return x[1]
00c65abf99cd topic-revset: strictly read string
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4061
diff changeset
    29
    raise error.ParseError(err)
00c65abf99cd topic-revset: strictly read string
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4061
diff changeset
    30
4060
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
    31
@revsetpredicate('topic([string or set])')
1843
0ba067a97d06 revset: add a topic() revset for querying topics
Augie Fackler <augie@google.com>
parents:
diff changeset
    32
def topicset(repo, subset, x):
4060
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
    33
    """All changesets with the specified topic or the topics of the given
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
    34
    changesets. Without the argument, all changesets with any topic specified.
1843
0ba067a97d06 revset: add a topic() revset for querying topics
Augie Fackler <augie@google.com>
parents:
diff changeset
    35
4060
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
    36
    If `string` starts with `re:` the remainder of the name is treated
1843
0ba067a97d06 revset: add a topic() revset for querying topics
Augie Fackler <augie@google.com>
parents:
diff changeset
    37
    as a regular expression.
0ba067a97d06 revset: add a topic() revset for querying topics
Augie Fackler <augie@google.com>
parents:
diff changeset
    38
    """
0ba067a97d06 revset: add a topic() revset for querying topics
Augie Fackler <augie@google.com>
parents:
diff changeset
    39
    args = revset.getargs(x, 0, 1, 'topic takes one or no arguments')
4057
054d288680b4 topic: return result early if there are no arguments to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 3613
diff changeset
    40
054d288680b4 topic: return result early if there are no arguments to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 3613
diff changeset
    41
    mutable = revset._notpublic(repo, revset.fullreposet(repo), ())
054d288680b4 topic: return result early if there are no arguments to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 3613
diff changeset
    42
054d288680b4 topic: return result early if there are no arguments to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 3613
diff changeset
    43
    if not args:
054d288680b4 topic: return result early if there are no arguments to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 3613
diff changeset
    44
        return (subset & mutable).filter(lambda r: bool(repo[r].topic()))
4058
90783c9c8609 topic: prepare to handle non-string arguments to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4057
diff changeset
    45
90783c9c8609 topic: prepare to handle non-string arguments to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4057
diff changeset
    46
    try:
4063
00c65abf99cd topic-revset: strictly read string
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4061
diff changeset
    47
        topic = getstringstrict(args[0], '')
4058
90783c9c8609 topic: prepare to handle non-string arguments to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4057
diff changeset
    48
    except error.ParseError:
90783c9c8609 topic: prepare to handle non-string arguments to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4057
diff changeset
    49
        # not a string, but another revset
4060
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
    50
        pass
4057
054d288680b4 topic: return result early if there are no arguments to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 3613
diff changeset
    51
    else:
4061
ad4194399b47 topic: handle ambiguous arguments to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4060
diff changeset
    52
        kind, pattern, matcher = mkmatcher(topic)
2651
6a3df2404472 topic-revset: update the revset to no longer build changectx
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2650
diff changeset
    53
4095
aabf436c11cb topic: refactor revset.py slightly
Anton Shestakov <av6@dwimlabs.net>
parents: 4064
diff changeset
    54
        if topic.startswith('literal:') and pattern not in repo.topics:
aabf436c11cb topic: refactor revset.py slightly
Anton Shestakov <av6@dwimlabs.net>
parents: 4064
diff changeset
    55
            raise error.RepoLookupError("topic '%s' does not exist" % pattern)
aabf436c11cb topic: refactor revset.py slightly
Anton Shestakov <av6@dwimlabs.net>
parents: 4064
diff changeset
    56
4059
1914a53fe792 topic: handle string argument to topic() revset earlier
Anton Shestakov <av6@dwimlabs.net>
parents: 4058
diff changeset
    57
        def matches(r):
1914a53fe792 topic: handle string argument to topic() revset earlier
Anton Shestakov <av6@dwimlabs.net>
parents: 4058
diff changeset
    58
            topic = repo[r].topic()
1914a53fe792 topic: handle string argument to topic() revset earlier
Anton Shestakov <av6@dwimlabs.net>
parents: 4058
diff changeset
    59
            if not topic:
1914a53fe792 topic: handle string argument to topic() revset earlier
Anton Shestakov <av6@dwimlabs.net>
parents: 4058
diff changeset
    60
                return False
1914a53fe792 topic: handle string argument to topic() revset earlier
Anton Shestakov <av6@dwimlabs.net>
parents: 4058
diff changeset
    61
            return matcher(topic)
1914a53fe792 topic: handle string argument to topic() revset earlier
Anton Shestakov <av6@dwimlabs.net>
parents: 4058
diff changeset
    62
4095
aabf436c11cb topic: refactor revset.py slightly
Anton Shestakov <av6@dwimlabs.net>
parents: 4064
diff changeset
    63
        return (subset & mutable).filter(matches)
4059
1914a53fe792 topic: handle string argument to topic() revset earlier
Anton Shestakov <av6@dwimlabs.net>
parents: 4058
diff changeset
    64
4060
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
    65
    s = revset.getset(repo, revset.fullreposet(repo), x)
4095
aabf436c11cb topic: refactor revset.py slightly
Anton Shestakov <av6@dwimlabs.net>
parents: 4064
diff changeset
    66
    topics = {repo[r].topic() for r in s}
4060
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
    67
    topics.discard('')
2651
6a3df2404472 topic-revset: update the revset to no longer build changectx
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2650
diff changeset
    68
4060
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
    69
    def matches(r):
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
    70
        if r in s:
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
    71
            return True
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
    72
        topic = repo[r].topic()
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
    73
        if not topic:
2651
6a3df2404472 topic-revset: update the revset to no longer build changectx
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2650
diff changeset
    74
            return False
4060
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
    75
        return topic in topics
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
    76
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
    77
    return (subset & mutable).filter(matches)
1843
0ba067a97d06 revset: add a topic() revset for querying topics
Augie Fackler <augie@google.com>
parents:
diff changeset
    78
2924
430fb1758d28 topic: use registrar.revsetpredicate to register revset predicate functions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2915
diff changeset
    79
@revsetpredicate('ngtip([branch])')
1870
8dd5200b4086 topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1865
diff changeset
    80
def ngtipset(repo, subset, x):
2924
430fb1758d28 topic: use registrar.revsetpredicate to register revset predicate functions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2915
diff changeset
    81
    """The untopiced tip.
1870
8dd5200b4086 topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1865
diff changeset
    82
8dd5200b4086 topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1865
diff changeset
    83
    Name is horrible so that people change it.
8dd5200b4086 topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1865
diff changeset
    84
    """
4290
09337aae08d4 topic: make revset argument messages be similar to such messages in core
Anton Shestakov <av6@dwimlabs.net>
parents: 4095
diff changeset
    85
    args = revset.getargs(x, 1, 1, 'ngtip takes one argument')
1870
8dd5200b4086 topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1865
diff changeset
    86
    # match a specific topic
4290
09337aae08d4 topic: make revset argument messages be similar to such messages in core
Anton Shestakov <av6@dwimlabs.net>
parents: 4095
diff changeset
    87
    branch = revset.getstring(args[0], 'ngtip requires a string')
1870
8dd5200b4086 topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1865
diff changeset
    88
    if branch == '.':
8dd5200b4086 topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1865
diff changeset
    89
        branch = repo['.'].branch()
1986
042356d5ba59 ngtip: rely on topicmap for 'ngtip'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1943
diff changeset
    90
    return subset & revset.baseset(destination.ngtip(repo, branch))
1870
8dd5200b4086 topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1865
diff changeset
    91
2924
430fb1758d28 topic: use registrar.revsetpredicate to register revset predicate functions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2915
diff changeset
    92
@revsetpredicate('stack()')
1910
24986e5a537c stack: add a 'stack()' revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1901
diff changeset
    93
def stackset(repo, subset, x):
2924
430fb1758d28 topic: use registrar.revsetpredicate to register revset predicate functions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2915
diff changeset
    94
    """All relevant changes in the current topic,
1910
24986e5a537c stack: add a 'stack()' revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1901
diff changeset
    95
24986e5a537c stack: add a 'stack()' revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1901
diff changeset
    96
    This is roughly equivalent to 'topic(.) - obsolete' with a sorting moving
24986e5a537c stack: add a 'stack()' revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1901
diff changeset
    97
    unstable changeset after there future parent (as if evolve where already
4290
09337aae08d4 topic: make revset argument messages be similar to such messages in core
Anton Shestakov <av6@dwimlabs.net>
parents: 4095
diff changeset
    98
    run).
09337aae08d4 topic: make revset argument messages be similar to such messages in core
Anton Shestakov <av6@dwimlabs.net>
parents: 4095
diff changeset
    99
    """
09337aae08d4 topic: make revset argument messages be similar to such messages in core
Anton Shestakov <av6@dwimlabs.net>
parents: 4095
diff changeset
   100
    err = 'stack takes no arguments, it works on current topic'
2681
aa4db71a6224 topics: return a parse error if stack() revset is passed with argument
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2669
diff changeset
   101
    revset.getargs(x, 0, 0, err)
2669
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
   102
    topic = None
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
   103
    branch = None
3156
31493a1b0e39 revset: clean up some messy logic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2924
diff changeset
   104
    if repo.currenttopic:
2669
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
   105
        topic = repo.currenttopic
3156
31493a1b0e39 revset: clean up some messy logic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2924
diff changeset
   106
    else:
2669
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
   107
        branch = repo[None].branch()
2915
b3abdb3d819e stack: replace 'getstack' with direct call to 'stack'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2712
diff changeset
   108
    return revset.baseset(stack.stack(repo, branch=branch, topic=topic)[1:]) & subset
4322
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
   109
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
   110
if util.safehasattr(revset, 'subscriptrelations'):
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
   111
    def stackrel(repo, subset, x, rel, n, order):
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
   112
        """This is a revset-flavored implementation of stack aliases.
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
   113
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
   114
        The syntax is: rev#stack[n] or rev#s[n]. Plenty of logic is borrowed
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
   115
        from topic._namemap, but unlike that function, which prefers to abort
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
   116
        (e.g. when stack index is too high), this returns empty set to be more
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
   117
        revset-friendly.
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
   118
        """
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
   119
        s = revset.getset(repo, revset.fullreposet(repo), x)
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
   120
        if not s:
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
   121
            return revset.baseset()
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
   122
        revs = []
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
   123
        for r in s:
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
   124
            topic = repo[r].topic()
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
   125
            if topic:
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
   126
                st = stack.stack(repo, topic=topic)
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
   127
            else:
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
   128
                st = stack.stack(repo, branch=repo[r].branch())
4323
482992803db6 topic: make revsets like foo#stack[-1] work too
Anton Shestakov <av6@dwimlabs.net>
parents: 4322
diff changeset
   129
            if n < 0:
482992803db6 topic: make revsets like foo#stack[-1] work too
Anton Shestakov <av6@dwimlabs.net>
parents: 4322
diff changeset
   130
                st = list(st)[1:]
482992803db6 topic: make revsets like foo#stack[-1] work too
Anton Shestakov <av6@dwimlabs.net>
parents: 4322
diff changeset
   131
            else:
482992803db6 topic: make revsets like foo#stack[-1] work too
Anton Shestakov <av6@dwimlabs.net>
parents: 4322
diff changeset
   132
                st = list(st)
4322
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
   133
            try:
4323
482992803db6 topic: make revsets like foo#stack[-1] work too
Anton Shestakov <av6@dwimlabs.net>
parents: 4322
diff changeset
   134
                rev = st[n]
4322
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
   135
            except IndexError:
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
   136
                continue
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
   137
            if rev == -1 and n == 0:
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
   138
                continue
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
   139
            if rev not in revs:
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
   140
                revs.append(rev)
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
   141
        return subset & revset.baseset(revs)
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
   142
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
   143
    revset.subscriptrelations['stack'] = stackrel
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
   144
    revset.subscriptrelations['s'] = stackrel
4339
0f015fe4f71f topic: make revsets like 'foo#topic[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4323
diff changeset
   145
0f015fe4f71f topic: make revsets like 'foo#topic[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4323
diff changeset
   146
    def topicrel(repo, subset, x, rel, n, order):
0f015fe4f71f topic: make revsets like 'foo#topic[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4323
diff changeset
   147
        ancestors = revset._ancestors
0f015fe4f71f topic: make revsets like 'foo#topic[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4323
diff changeset
   148
        descendants = revset._descendants
0f015fe4f71f topic: make revsets like 'foo#topic[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4323
diff changeset
   149
        subset = topicset(repo, subset, x)
0f015fe4f71f topic: make revsets like 'foo#topic[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4323
diff changeset
   150
        if n <= 0:
0f015fe4f71f topic: make revsets like 'foo#topic[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4323
diff changeset
   151
            n = -n
0f015fe4f71f topic: make revsets like 'foo#topic[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4323
diff changeset
   152
            return ancestors(repo, subset, x, startdepth=n, stopdepth=n + 1)
0f015fe4f71f topic: make revsets like 'foo#topic[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4323
diff changeset
   153
        else:
0f015fe4f71f topic: make revsets like 'foo#topic[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4323
diff changeset
   154
            return descendants(repo, subset, x, startdepth=n, stopdepth=n + 1)
0f015fe4f71f topic: make revsets like 'foo#topic[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4323
diff changeset
   155
0f015fe4f71f topic: make revsets like 'foo#topic[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4323
diff changeset
   156
    revset.subscriptrelations['topic'] = topicrel
0f015fe4f71f topic: make revsets like 'foo#topic[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4323
diff changeset
   157
    revset.subscriptrelations['t'] = topicrel