diff --git a/mercurial/revset.py b/mercurial/revset.py --- a/mercurial/revset.py +++ b/mercurial/revset.py @@ -129,11 +129,24 @@ def symbolset(repo, subset, x): return stringset(repo, subset, x) def rangeset(repo, subset, x, y): - m = getset(repo, subset, x)[0] - n = getset(repo, subset, y)[-1] + m = getset(repo, subset, x) + if not m: + m = getset(repo, range(len(repo)), x) + + n = getset(repo, subset, y) + if not n: + n = getset(repo, range(len(repo)), y) + + if not m or not n: + return [] + m, n = m[0], n[-1] + if m < n: - return range(m, n + 1) - return range(m, n - 1, -1) + r = range(m, n + 1) + else: + r = range(m, n - 1, -1) + s = set(subset) + return [x for x in r if x in s] def andset(repo, subset, x, y): return getset(repo, getset(repo, subset, x), y) @@ -222,11 +235,15 @@ def ancestor(repo, subset, x): def ancestors(repo, subset, x): args = getset(repo, range(len(repo)), x) + if not args: + return [] s = set(repo.changelog.ancestors(*args)) | set(args) return [r for r in subset if r in s] def descendants(repo, subset, x): args = getset(repo, range(len(repo)), x) + if not args: + return [] s = set(repo.changelog.descendants(*args)) | set(args) return [r for r in subset if r in s] diff --git a/tests/test-revset b/tests/test-revset --- a/tests/test-revset +++ b/tests/test-revset @@ -126,3 +126,10 @@ log '4::8' log '4:8' log 'sort(!merge() & (modifies(b) | user(bob) | keyword(bug) | keyword(issue) & 1::9), "-date")' + +log 'not 0 and 0:2' +log 'not 1 and 0:2' +log 'not 2 and 0:2' +log '(1 and 2)::' +log '(1 and 2):' +log '(1 and 2):3' diff --git a/tests/test-revset.out b/tests/test-revset.out --- a/tests/test-revset.out +++ b/tests/test-revset.out @@ -198,3 +198,15 @@ 8 4 2 5 +% log 'not 0 and 0:2' +1 +2 +% log 'not 1 and 0:2' +0 +2 +% log 'not 2 and 0:2' +0 +1 +% log '(1 and 2)::' +% log '(1 and 2):' +% log '(1 and 2):3'