diff --git a/mercurial/configitems.py b/mercurial/configitems.py --- a/mercurial/configitems.py +++ b/mercurial/configitems.py @@ -532,6 +532,9 @@ coreconfigitem('experimental', 'evolution.track-operation', default=True, ) +coreconfigitem('experimental', 'log.topo', + default=False, +) coreconfigitem('experimental', 'maxdeltachainspan', default=-1, ) diff --git a/mercurial/logcmdutil.py b/mercurial/logcmdutil.py --- a/mercurial/logcmdutil.py +++ b/mercurial/logcmdutil.py @@ -717,6 +717,13 @@ revs.reverse() return revs +def _maybetoposort(repo, revs, opts): + if opts.get('graph') and repo.ui.configbool('experimental', 'log.topo'): + revs = dagop.toposort(revs, repo.changelog.parentrevs) + # TODO: try to iterate the set lazily + revs = revset.baseset(list(revs)) + return revs + def getrevs(repo, pats, opts): """Return (revs, differ) where revs is a smartset @@ -727,7 +734,7 @@ limit = getlimit(opts) revs = _initialrevs(repo, opts) if not revs: - return smartset.baseset(), None + return _maybetoposort(repo, smartset.baseset(), opts), None match, pats, slowpath = _makematcher(repo, revs, pats, opts) filematcher = None if follow: @@ -756,7 +763,7 @@ differ = changesetdiffer() differ._makefilematcher = filematcher - return revs, differ + return _maybetoposort(repo, revs, opts), differ def _parselinerangeopt(repo, opts): """Parse --line-range log option and return a list of tuples (filename, diff --git a/tests/test-glog-topological.t b/tests/test-glog-topological.t --- a/tests/test-glog-topological.t +++ b/tests/test-glog-topological.t @@ -114,3 +114,41 @@ |/ o 0 + +Topological sort can be turned on via config + + $ cat >> $HGRCPATH << EOF + > [experimental] + > log.topo=true + > EOF + + $ hg log -G + o 8 + | + o 3 + | + o 2 + | + o 1 + | + | o 7 + | | + | o 6 + | | + | o 5 + | | + | o 4 + |/ + o 0 + +Does not affect non-graph log + $ hg log -T '{rev}\n' + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 + 0