diff -r 2d3837a4bded -r 923fa9e06ea0 mercurial/revset.py --- a/mercurial/revset.py Thu Mar 24 22:55:56 2016 +0900 +++ b/mercurial/revset.py Sat Apr 23 16:09:30 2016 +0900 @@ -1859,9 +1859,6 @@ s = l[0] keys = keys.split() - l = [] - def invert(s): - return "".join(chr(255 - ord(c)) for c in s) revs = getset(repo, subset, s) if keys == ["rev"]: revs.sort() @@ -1869,36 +1866,33 @@ elif keys == ["-rev"]: revs.sort(reverse=True) return revs - for r in revs: - c = repo[r] - e = [] - for k in keys: + # sort() is guaranteed to be stable + ctxs = [repo[r] for r in revs] + if True: + for k in reversed(keys): if k == 'rev': - e.append(r) + ctxs.sort(key=lambda c: c.rev()) elif k == '-rev': - e.append(-r) + ctxs.sort(key=lambda c: c.rev(), reverse=True) elif k == 'branch': - e.append(c.branch()) + ctxs.sort(key=lambda c: c.branch()) elif k == '-branch': - e.append(invert(c.branch())) + ctxs.sort(key=lambda c: c.branch(), reverse=True) elif k == 'desc': - e.append(c.description()) + ctxs.sort(key=lambda c: c.description()) elif k == '-desc': - e.append(invert(c.description())) + ctxs.sort(key=lambda c: c.description(), reverse=True) elif k in 'user author': - e.append(c.user()) + ctxs.sort(key=lambda c: c.user()) elif k in '-user -author': - e.append(invert(c.user())) + ctxs.sort(key=lambda c: c.user(), reverse=True) elif k == 'date': - e.append(c.date()[0]) + ctxs.sort(key=lambda c: c.date()[0]) elif k == '-date': - e.append(-c.date()[0]) + ctxs.sort(key=lambda c: c.date()[0], reverse=True) else: raise error.ParseError(_("unknown sort key %r") % k) - e.append(r) - l.append(e) - l.sort() - return baseset([e[-1] for e in l]) + return baseset([c.rev() for c in ctxs]) @predicate('subrepo([pattern])') def subrepo(repo, subset, x):