D6331: log: add config for making `hg log -G` always topo-sorted

Yuya Nishihara yuya at tcha.org
Tue May 14 08:34:34 EDT 2019


> +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

Nit: no need to sort an empty set.

> @@ -756,7 +763,7 @@
>  
>      differ = changesetdiffer()
>      differ._makefilematcher = filematcher
> -    return revs, differ
> +    return _maybetoposort(repo, revs, opts), differ

Maybe this can be merged with the `if opts.get('graph')` block above.

```
# I think "and opts.get('rev')" can be removed since revs.isdescending()
# would be true if --follow without --rev.
if opts.get('graph'):
    if experimental.log.topo:
        if not topo yet:
            toposort(revs)
    elif not (revs.isdescending() or revs.istopo()):
        revs.sort(reverse=True)
```


More information about the Mercurial-devel mailing list