diff --git a/mercurial/destutil.py b/mercurial/destutil.py --- a/mercurial/destutil.py +++ b/mercurial/destutil.py @@ -359,7 +359,7 @@ def desthistedit(ui, repo): def stackbase(ui, repo): revs = stack.getstack(repo) - return revs.last() if revs else None + return revs.first() if revs else None def _statusotherbook(ui, repo): bmheads = bookmarks.headsforactive(repo) diff --git a/mercurial/stack.py b/mercurial/stack.py --- a/mercurial/stack.py +++ b/mercurial/stack.py @@ -13,8 +13,8 @@ from . import ( ) def getstack(repo, rev=None): - """return a smartrev of the stack containing either rev if it is not None - or the current working directory parent. + """return a sorted smartrev of the stack containing either rev if it is + not None or the current working directory parent. The stack will always contain all drafts changesets which are ancestors to the revision and are not merges. @@ -24,4 +24,6 @@ def getstack(repo, rev=None): revspec = 'reverse(only(%s) and not public() and not ::merge())' revset = revsetlang.formatspec(revspec, rev) - return scmutil.revrange(repo, [revset]) + revisions = scmutil.revrange(repo, [revset]) + revisions.sort() + return revisions diff --git a/tests/test-stack.t b/tests/test-stack.t --- a/tests/test-stack.t +++ b/tests/test-stack.t @@ -205,13 +205,13 @@ Test output ~ Check the stack order $ hg log -r "first(stack())" - 10 foo draft c_h + 9 foo draft c_g $ hg log -r "first(stack(10))" - 10 foo draft c_h + 9 foo draft c_g $ hg log -r "first(stack(8))" - 8 foo draft c_f + 7 foo draft c_e $ hg log -r "first(stack(head()))" - 8 foo draft c_f + 7 foo draft c_e Case with multiple heads with unstability involved --------------------------------------------------