diff --git a/mercurial/revset.py b/mercurial/revset.py --- a/mercurial/revset.py +++ b/mercurial/revset.py @@ -202,9 +202,12 @@ def rev(repo, subset, x): return [r for r in subset if r == l] def p1(repo, subset, x): - """``p1(set)`` - First parent of changesets in set. + """``p1([set])`` + First parent of changesets in set, or the working directory. """ + if x is None: + return [repo[x].parents()[0].rev()] + ps = set() cl = repo.changelog for r in getset(repo, range(len(repo)), x): @@ -212,9 +215,16 @@ def p1(repo, subset, x): return [r for r in subset if r in ps] def p2(repo, subset, x): - """``p2(set)`` - Second parent of changesets in set. + """``p2([set])`` + Second parent of changesets in set, or the working directory. """ + if x is None: + ps = repo[x].parents() + try: + return [ps[1].rev()] + except IndexError: + return [] + ps = set() cl = repo.changelog for r in getset(repo, range(len(repo)), x): diff --git a/tests/test-revset-dirstate-parents.t b/tests/test-revset-dirstate-parents.t new file mode 100644 --- /dev/null +++ b/tests/test-revset-dirstate-parents.t @@ -0,0 +1,42 @@ + $ HGENCODING=utf-8 + $ export HGENCODING + + $ try() { + > hg debugrevspec --debug $@ + > } + + $ log() { + > hg log --template '{rev}\n' -r "$1" + > } + + $ hg init repo + $ cd repo + + $ try 'p1()' + ('func', ('symbol', 'p1'), None) + -1 + $ try 'p2()' + ('func', ('symbol', 'p2'), None) + +null revision + $ log 'p1()' + $ log 'p2()' + +working dir with a single parent + $ echo a > a + $ hg ci -Aqm0 + $ log 'p1()' + 0 + $ log 'p2()' + +merge in progress + $ echo b > b + $ hg ci -Aqm1 + $ hg up -q 0 + $ echo c > c + $ hg ci -Aqm2 + $ hg merge -q + $ log 'p1()' + 2 + $ log 'p2()' + 1