[PATCH] graphlog: add revsets support (and convert usual options to revset)

Matt Mackall mpm at selenic.com
Wed Mar 16 22:21:21 UTC 2011


On Tue, 2011-03-15 at 09:30 +0100, Alexander Solovyov wrote:
> # HG changeset patch
> # User Alexander Solovyov <alexander at solovyov.net>
> # Date 1300028018 -3600
> # Node ID 8f29edb674ab941f03b11d542aeceb71fcbd6de8
> # Parent  595dba23d33780a5f2752a837898861704ef18bf
> graphlog: add revsets support (and convert usual options to revset)

Is this the version of the patch I queued yesterday that actually passes
tests?

> Thanks for the idea and most of the implementation to Klaus Koch
> 
> Replaces graphmod.revisions with version which can iterate through arbitrary
> list of revisions instead of strict one by one iteration from start to
> stop. When a gap occurs in a revisions (i.e. in file log or in merge-only
> display), the next topological parent within the revset is searched and the
> connection to it is printed in the ascii graph.
> 
> File graph can draw sometimes more connections than previous version, because
> graph is produced according to the revset, not according to a file's filelog.
> 
> In case the graph contains several branches where the left parent is null, the
> graphs for each are printed sequentially, not in parallel as it was a case
> earlier (see for example the graph for README in hg-dev).
> 
> diff --git a/hgext/graphlog.py b/hgext/graphlog.py
> --- a/hgext/graphlog.py
> +++ b/hgext/graphlog.py
> @@ -12,7 +12,6 @@ commands. When this options is given, an
>  revision graph is also shown.
>  '''
>  
> -import os
>  from mercurial.cmdutil import revrange, show_changeset
>  from mercurial.commands import templateopts
>  from mercurial.i18n import _
> @@ -216,13 +215,46 @@ def get_revs(repo, rev_opt):
>          return (len(repo) - 1, 0)
>  
>  def check_unsupported_flags(opts):
> -    for op in ["follow", "follow_first", "date", "copies", "keyword", "remove",
> -               "only_merges", "user", "branch", "only_branch", "prune",
> -               "newest_first", "no_merges", "include", "exclude"]:
> +    for op in ["follow_first", "copies", "newest_first"]:
>          if op in opts and opts[op]:
> -            raise util.Abort(_("--graph option is incompatible with --%s")
> +            raise util.Abort(_("-G/--graph option is incompatible with --%s")
>                               % op.replace("_", "-"))
>  
> +def revset(pats, opts):
> +    """Return revset str built of revisions, log options and file patterns.
> +    """
> +    opt2revset = dict(only_merges='merge',
> +                      only_branch='branch',
> +                      no_merges='not merge',
> +                      include='file',
> +                      exclude='not file',
> +                      prune='not follow')
> +    revset = []
> +    for op, val in opts.iteritems():
> +        if not val:
> +            continue
> +        revop = opt2revset.get(op, op)
> +        if op in ('follow', 'only_merges', 'no_merges'):
> +            revset.append('%s()' % revop)
> +        elif op in ("date", "keyword", "remove", "user", "branch",
> +                    "only_branch", "prune"):
> +            revset.append('%s(%s)' % (op, val))
> +        elif op in ('include', 'exclude'):
> +            for f in val:
> +                revset.append('%s(%r)' % (op, f))
> +        elif op == 'rev':
> +            revset.extend(val)
> +
> +    for path in pats:
> +        revset.append('file(%r)' % path)
> +
> +    revset = ' and '.join(revset) or 'all()'
> +    # we want reverted revset to build graph
> +    revset = 'reverse(%s)' % revset
> +    if opts['limit']:
> +        revset = 'limit(%s, %s)' % (revset, opts['limit'])
> +    return revset
> +
>  def generate(ui, dag, displayer, showparents, edgefn):
>      seen, state = [], asciistate()
>      for rev, type, ctx, parents in dag:
> @@ -233,7 +265,7 @@ def generate(ui, dag, displayer, showpar
>          ascii(ui, state, type, char, lines, edgefn(seen, rev, parents))
>      displayer.close()
>  
> -def graphlog(ui, repo, path=None, **opts):
> +def graphlog(ui, repo, *pats, **opts):
>      """show revision history alongside an ASCII revision graph
>  
>      Print a revision history alongside a revision graph drawn with
> @@ -244,19 +276,9 @@ def graphlog(ui, repo, path=None, **opts
>      """
>  
>      check_unsupported_flags(opts)
> -    limit = cmdutil.loglimit(opts)
> -    start, stop = get_revs(repo, opts["rev"])
> -    if start == nullrev:
> -        return
>  
> -    if path:
> -        path = util.canonpath(repo.root, os.getcwd(), path)
> -    if path: # could be reset in canonpath
> -        revdag = graphmod.filerevs(repo, path, start, stop, limit)
> -    else:
> -        if limit is not None:
> -            stop = max(stop, start - limit + 1)
> -        revdag = graphmod.revisions(repo, start, stop)
> +    revs = revrange(repo, [revset(pats, opts)])
> +    revdag = graphmod.revisions(repo, revs)
>  
>      displayer = show_changeset(ui, repo, opts, buffered=True)
>      showparents = [ctx.node() for ctx in repo[None].parents()]
> @@ -319,11 +341,7 @@ def _wrapcmd(ui, cmd, table, wrapfn):
>      '''wrap the command'''
>      def graph(orig, *args, **kwargs):
>          if kwargs['graph']:
> -            try:
> -                return wrapfn(*args, **kwargs)
> -            except TypeError, e:
> -                if len(args) > wrapfn.func_code.co_argcount:
> -                    raise util.Abort(_('--graph option allows at most one file'))
> +            return wrapfn(*args, **kwargs)
>          return orig(*args, **kwargs)
>      entry = extensions.wrapcommand(table, cmd, graph)
>      entry[1].append(('G', 'graph', None, _("show the revision DAG")))
> diff --git a/mercurial/graphmod.py b/mercurial/graphmod.py
> --- a/mercurial/graphmod.py
> +++ b/mercurial/graphmod.py
> @@ -21,40 +21,48 @@ from mercurial.node import nullrev
>  
>  CHANGESET = 'C'
>  
> -def revisions(repo, start, stop):
> +def revisions(repo, revs):
>      """cset DAG generator yielding (id, CHANGESET, ctx, [parentids]) tuples
>  
> -    This generator function walks through the revision history from revision
> -    start to revision stop (which must be less than or equal to start). It
> -    returns a tuple for each node. The node and parent ids are arbitrary
> -    integers which identify a node in the context of the graph returned.
> +    This generator function walks through revisions (which should be ordered
> +    from bigger to lower). It returns a tuple for each node. The node and parent
> +    ids are arbitrary integers which identify a node in the context of the graph
> +    returned.
>      """
> -    cur = start
> -    while cur >= stop:
> -        ctx = repo[cur]
> -        parents = set([p.rev() for p in ctx.parents() if p.rev() != nullrev])
> -        yield (cur, CHANGESET, ctx, sorted(parents))
> -        cur -= 1
> +    if not revs:
> +        return []
>  
> -def filerevs(repo, path, start, stop, limit=None):
> -    """file cset DAG generator yielding (id, CHANGESET, ctx, [parentids]) tuples
> +    ns = [repo[r].node() for r in revs]
> +    revdag = list(nodes(repo, ns))
>  
> -    This generator function walks through the revision history of a single
> -    file from revision start down to revision stop.
> -    """
> -    filerev = len(repo.file(path)) - 1
> -    rev = stop + 1
> -    count = 0
> -    while filerev >= 0 and rev > stop:
> -        fctx = repo.filectx(path, fileid=filerev)
> -        parents = set([f.linkrev() for f in fctx.parents() if f.path() == path])
> -        rev = fctx.rev()
> -        if rev <= start:
> -            yield (rev, CHANGESET, fctx.changectx(), sorted(parents))
> -            count += 1
> -            if count == limit:
> -                break
> -        filerev -= 1
> +    cl = repo.changelog
> +    lowestrev = min(revs)
> +    gpcache = {}
> +    leafs = {}
> +
> +    for i, (id, c, ctx, parents) in enumerate(revdag):
> +        mpars = [p.rev() for p in ctx.parents() if
> +                 p.rev() != nullrev and p.rev() not in parents]
> +        grandparents = []
> +
> +        for mpar in mpars:
> +            gp = gpcache.get(mpar) or grandparent(cl, lowestrev, revs, mpar)
> +            gpcache[mpar] = gp
> +            if gp is None:
> +                leafs.setdefault(mpar, []).append((i, ctx))
> +            else:
> +                grandparents.append(gp)
> +
> +        if grandparents:
> +            for gp in grandparents:
> +                if gp not in revdag[i][3]:
> +                    revdag[i][3].append(gp)
> +
> +    for parent, leafs in leafs.iteritems():
> +        for i, ctx in leafs:
> +            revdag[i][3].append(parent)
> +
> +    return revdag
>  
>  def nodes(repo, nodes):
>      """cset DAG generator yielding (id, CHANGESET, ctx, [parentids]) tuples
> @@ -120,3 +128,78 @@ def colored(dag):
>          # Yield and move on
>          yield (cur, type, data, (col, color), edges)
>          seen = next
> +
> +
> +def grandparent(cl, lowestrev, roots, head):
> +    """Return closest 'root' rev in topological path from 'roots' to 'head'.
> +
> +    Derived from revlog.revlog.nodesbetween, but only returns next rev
> +    of topologically sorted list of all nodes N that satisfy of these
> +    constraints:
> +
> +    1. N is a descendant of some node in 'roots'
> +    2. N is an ancestor of 'head'
> +    3. N is some node in 'roots' or nullrev
> +
> +    Every node is considered to be both a descendant and an ancestor
> +    of itself, so every reachable node in 'roots' and 'head' will be
> +    included in 'nodes'.
> +    """
> +    ancestors = set()
> +    # Start at the top and keep marking parents until we're done.
> +    revstotag = set([head])
> +    revstotag.discard(nullrev)
> +    llowestrev = max(nullrev, lowestrev)
> +
> +    while revstotag:
> +        r = revstotag.pop()
> +        # A node's revision number represents its place in a
> +        # topologically sorted list of nodes.
> +        if r >= llowestrev:
> +            if r not in ancestors:
> +                # If we are possibly a descendent of one of the roots
> +                # and we haven't already been marked as an ancestor
> +                ancestors.add(r) # Mark as ancestor
> +                # Add non-nullrev parents to list of nodes to tag.
> +                revstotag.update([p for p in cl.parentrevs(r)])
> +
> +    if not ancestors:
> +        return
> +    # Now that we have our set of ancestors, we want to remove any
> +    # roots that are not ancestors.
> +
> +    # If one of the roots was nullrev, everything is included anyway.
> +    if lowestrev > nullrev:
> +        # But, since we weren't, let's recompute the lowest rev to not
> +        # include roots that aren't ancestors.
> +
> +        # Filter out roots that aren't ancestors of heads
> +        _roots = ancestors.intersection(roots)
> +        if not _roots:
> +            return
> +        # Recompute the lowest revision
> +        lowestrev = min(roots)
> +    else:
> +        # We are descending from nullrev, and don't need to care about
> +        # any other roots.
> +        lowestrev = nullrev
> +        _roots = [nullrev]
> +
> +    # The roots are just the descendants.
> +    # Don't start at nullrev since we don't want nullrev in our output list,
> +    # and if nullrev shows up in descedents, empty parents will look like
> +    # they're descendents.
> +    lowestrevisnullrev = (lowestrev == nullrev)
> +    for r in xrange(head - 1, max(lowestrev, -1) - 1, -1):
> +        if lowestrevisnullrev or r in _roots:
> +            pass
> +        elif _roots.issuperset(cl.parentrevs(r)):
> +            # A node is a descendent if either of its parents are
> +            # descendents.  (We seeded the dependents list with the roots
> +            # up there, remember?)
> +            _roots.add(r)
> +        else:
> +            continue
> +        if r in ancestors:
> +            # Only include nodes that are both descendents and ancestors.
> +            return r
> diff --git a/mercurial/hgweb/webcommands.py b/mercurial/hgweb/webcommands.py
> --- a/mercurial/hgweb/webcommands.py
> +++ b/mercurial/hgweb/webcommands.py
> @@ -736,7 +736,7 @@ def graph(web, req, tmpl):
>      count = len(web.repo)
>      changenav = webutil.revnavgen(rev, revcount, count, web.repo.changectx)
>  
> -    dag = graphmod.revisions(web.repo, rev, downrev)
> +    dag = graphmod.revisions(web.repo, range(rev, downrev - 1, -1))
>      tree = list(graphmod.colored(dag))
>      canvasheight = (len(tree) + 1) * bg_height - 27
>      data = []
> diff --git a/mercurial/revset.py b/mercurial/revset.py
> --- a/mercurial/revset.py
> +++ b/mercurial/revset.py
> @@ -630,7 +630,7 @@ def outgoing(repo, subset, x):
>      """
>      import hg # avoid start-up nasties
>      # i18n: "outgoing" is a keyword
> -    l = getargs(x, 0, 1, _("outgoing requires a repository path"))
> +    l = getargs(x, 0, 2, _("outgoing requires a repository path"))
>      # i18n: "outgoing" is a keyword
>      dest = l and getstring(l[0], _("outgoing requires a repository path")) or ''
>      dest = repo.ui.expandpath(dest or 'default-push', dest or 'default')
> diff --git a/tests/test-glog.t b/tests/test-glog.t
> --- a/tests/test-glog.t
> +++ b/tests/test-glog.t
> @@ -463,115 +463,115 @@ File glog:
>    | | |  date:        Thu Jan 01 00:00:32 1970 +0000
>    | | |  summary:     (32) expand
>    | | |
> -  | o |  changeset:   31:621d83e11f67
> -  | | |  parent:      21:d42a756af44d
> -  | | |  parent:      30:6e11cd4b648f
> -  | | |  user:        test
> -  | | |  date:        Thu Jan 01 00:00:31 1970 +0000
> -  | | |  summary:     (31) expand
> -  | | |
> -  | o |    changeset:   30:6e11cd4b648f
> -  | |\ \   parent:      28:44ecd0b9ae99
> -  | | | |  parent:      29:cd9bb2be7593
> +  | o |    changeset:   31:621d83e11f67
> +  | |\ \   parent:      21:d42a756af44d
> +  | | | |  parent:      30:6e11cd4b648f
>    | | | |  user:        test
> -  | | | |  date:        Thu Jan 01 00:00:30 1970 +0000
> -  | | | |  summary:     (30) expand
> +  | | | |  date:        Thu Jan 01 00:00:31 1970 +0000
> +  | | | |  summary:     (31) expand
>    | | | |
> -  | | o |  changeset:   29:cd9bb2be7593
> -  | | | |  parent:      0:e6eb3150255d
> -  | | | |  user:        test
> -  | | | |  date:        Thu Jan 01 00:00:29 1970 +0000
> -  | | | |  summary:     (29) regular commit
> +  | | o |    changeset:   30:6e11cd4b648f
> +  | | |\ \   parent:      28:44ecd0b9ae99
> +  | | | | |  parent:      29:cd9bb2be7593
> +  | | | | |  user:        test
> +  | | | | |  date:        Thu Jan 01 00:00:30 1970 +0000
> +  | | | | |  summary:     (30) expand
> +  | | | | |
> +  | | | o |  changeset:   29:cd9bb2be7593
> +  | | | | |  parent:      0:e6eb3150255d
> +  | | | | |  user:        test
> +  | | | | |  date:        Thu Jan 01 00:00:29 1970 +0000
> +  | | | | |  summary:     (29) regular commit
> +  | | | | |
> +  | | o | |    changeset:   28:44ecd0b9ae99
> +  | | |\ \ \   parent:      1:6db2ef61d156
> +  | | | | | |  parent:      26:7f25b6c2f0b9
> +  | | | | | |  user:        test
> +  | | | | | |  date:        Thu Jan 01 00:00:28 1970 +0000
> +  | | | | | |  summary:     (28) merge zero known
> +  | | | | | |
> +  o | | | | |  changeset:   27:886ed638191b
> +  |/ / / / /   parent:      21:d42a756af44d
> +  | | | | |    user:        test
> +  | | | | |    date:        Thu Jan 01 00:00:27 1970 +0000
> +  | | | | |    summary:     (27) collapse
> +  | | | | |
> +  | | o---+  changeset:   26:7f25b6c2f0b9
> +  | | | | |  parent:      18:1aa84d96232a
> +  | | | | |  parent:      25:91da8ed57247
> +  | | | | |  user:        test
> +  | | | | |  date:        Thu Jan 01 00:00:26 1970 +0000
> +  | | | | |  summary:     (26) merge one known; far right
> +  | | | | |
> +  +---o | |  changeset:   25:91da8ed57247
> +  | | | | |  parent:      21:d42a756af44d
> +  | | | | |  parent:      24:a9c19a3d96b7
> +  | | | | |  user:        test
> +  | | | | |  date:        Thu Jan 01 00:00:25 1970 +0000
> +  | | | | |  summary:     (25) merge one known; far left
> +  | | | | |
> +  | | o | |  changeset:   24:a9c19a3d96b7
> +  | | |\| |  parent:      0:e6eb3150255d
> +  | | | | |  parent:      23:a01cddf0766d
> +  | | | | |  user:        test
> +  | | | | |  date:        Thu Jan 01 00:00:24 1970 +0000
> +  | | | | |  summary:     (24) merge one known; immediate right
> +  | | | | |
> +  | | o | |  changeset:   23:a01cddf0766d
> +  | |/| | |  parent:      1:6db2ef61d156
> +  | | | | |  parent:      22:e0d9cccacb5d
> +  | | | | |  user:        test
> +  | | | | |  date:        Thu Jan 01 00:00:23 1970 +0000
> +  | | | | |  summary:     (23) merge one known; immediate left
> +  | | | | |
> +  +---o---+  changeset:   22:e0d9cccacb5d
> +  | |   | |  parent:      18:1aa84d96232a
> +  | |  / /   parent:      21:d42a756af44d
> +  | | | |    user:        test
> +  | | | |    date:        Thu Jan 01 00:00:22 1970 +0000
> +  | | | |    summary:     (22) merge two known; one far left, one far right
>    | | | |
> -  | o | |  changeset:   28:44ecd0b9ae99
> -  | | | |  parent:      1:6db2ef61d156
> -  | | | |  parent:      26:7f25b6c2f0b9
> -  | | | |  user:        test
> -  | | | |  date:        Thu Jan 01 00:00:28 1970 +0000
> -  | | | |  summary:     (28) merge zero known
> +  o | | |    changeset:   21:d42a756af44d
> +  |\ \ \ \   parent:      19:31ddc2c1573b
> +  | | | | |  parent:      20:d30ed6450e32
> +  | | | | |  user:        test
> +  | | | | |  date:        Thu Jan 01 00:00:21 1970 +0000
> +  | | | | |  summary:     (21) expand
> +  | | | | |
> +  | o---+-+  changeset:   20:d30ed6450e32
> +  |   | | |  parent:      0:e6eb3150255d
> +  |  / / /   parent:      18:1aa84d96232a
> +  | | | |    user:        test
> +  | | | |    date:        Thu Jan 01 00:00:20 1970 +0000
> +  | | | |    summary:     (20) merge two known; two far right
>    | | | |
> -  o | | |  changeset:   27:886ed638191b
> -  | | | |  parent:      21:d42a756af44d
> -  | | | |  user:        test
> -  | | | |  date:        Thu Jan 01 00:00:27 1970 +0000
> -  | | | |  summary:     (27) collapse
> +  o | | |    changeset:   19:31ddc2c1573b
> +  |\ \ \ \   parent:      15:1dda3f72782d
> +  | | | | |  parent:      17:44765d7c06e0
> +  | | | | |  user:        test
> +  | | | | |  date:        Thu Jan 01 00:00:19 1970 +0000
> +  | | | | |  summary:     (19) expand
> +  | | | | |
> +  +---+---o  changeset:   18:1aa84d96232a
> +  | | | |    parent:      1:6db2ef61d156
> +  | | | |    parent:      15:1dda3f72782d
> +  | | | |    user:        test
> +  | | | |    date:        Thu Jan 01 00:00:18 1970 +0000
> +  | | | |    summary:     (18) merge two known; two far left
>    | | | |
> -  | o | |  changeset:   26:7f25b6c2f0b9
> -  | | | |  parent:      18:1aa84d96232a
> -  | | | |  parent:      25:91da8ed57247
> -  | | | |  user:        test
> -  | | | |  date:        Thu Jan 01 00:00:26 1970 +0000
> -  | | | |  summary:     (26) merge one known; far right
> -  | | | |
> -  | o | |  changeset:   25:91da8ed57247
> -  | | | |  parent:      21:d42a756af44d
> -  | | | |  parent:      24:a9c19a3d96b7
> -  | | | |  user:        test
> -  | | | |  date:        Thu Jan 01 00:00:25 1970 +0000
> -  | | | |  summary:     (25) merge one known; far left
> -  | | | |
> -  | o | |  changeset:   24:a9c19a3d96b7
> -  | | | |  parent:      0:e6eb3150255d
> -  | | | |  parent:      23:a01cddf0766d
> -  | | | |  user:        test
> -  | | | |  date:        Thu Jan 01 00:00:24 1970 +0000
> -  | | | |  summary:     (24) merge one known; immediate right
> -  | | | |
> -  | o | |  changeset:   23:a01cddf0766d
> -  | | | |  parent:      1:6db2ef61d156
> -  | | | |  parent:      22:e0d9cccacb5d
> -  | | | |  user:        test
> -  | | | |  date:        Thu Jan 01 00:00:23 1970 +0000
> -  | | | |  summary:     (23) merge one known; immediate left
> -  | | | |
> -  | o | |  changeset:   22:e0d9cccacb5d
> -  |/ / /   parent:      18:1aa84d96232a
> -  | | |    parent:      21:d42a756af44d
> -  | | |    user:        test
> -  | | |    date:        Thu Jan 01 00:00:22 1970 +0000
> -  | | |    summary:     (22) merge two known; one far left, one far right
> -  | | |
> -  o | |    changeset:   21:d42a756af44d
> -  |\ \ \   parent:      19:31ddc2c1573b
> -  | | | |  parent:      20:d30ed6450e32
> -  | | | |  user:        test
> -  | | | |  date:        Thu Jan 01 00:00:21 1970 +0000
> -  | | | |  summary:     (21) expand
> -  | | | |
> -  | o---+  changeset:   20:d30ed6450e32
> -  |   | |  parent:      0:e6eb3150255d
> -  |  / /   parent:      18:1aa84d96232a
> -  | | |    user:        test
> -  | | |    date:        Thu Jan 01 00:00:20 1970 +0000
> -  | | |    summary:     (20) merge two known; two far right
> -  | | |
> -  o | |    changeset:   19:31ddc2c1573b
> -  |\ \ \   parent:      15:1dda3f72782d
> -  | | | |  parent:      17:44765d7c06e0
> -  | | | |  user:        test
> -  | | | |  date:        Thu Jan 01 00:00:19 1970 +0000
> -  | | | |  summary:     (19) expand
> -  | | | |
> -  +-----o  changeset:   18:1aa84d96232a
> -  | | |    parent:      1:6db2ef61d156
> -  | | |    parent:      15:1dda3f72782d
> -  | | |    user:        test
> -  | | |    date:        Thu Jan 01 00:00:18 1970 +0000
> -  | | |    summary:     (18) merge two known; two far left
> -  | | |
> -  | o |    changeset:   17:44765d7c06e0
> -  | |\ \   parent:      12:86b91144a6e9
> -  | | | |  parent:      16:3677d192927d
> -  | | | |  user:        test
> -  | | | |  date:        Thu Jan 01 00:00:17 1970 +0000
> -  | | | |  summary:     (17) expand
> -  | | | |
> -  | | o |  changeset:   16:3677d192927d
> -  | | | |  parent:      0:e6eb3150255d
> -  | | | |  parent:      1:6db2ef61d156
> -  | | | |  user:        test
> -  | | | |  date:        Thu Jan 01 00:00:16 1970 +0000
> -  | | | |  summary:     (16) merge two known; one immediate right, one near right
> +  | o | |    changeset:   17:44765d7c06e0
> +  | |\ \ \   parent:      12:86b91144a6e9
> +  | | | | |  parent:      16:3677d192927d
> +  | | | | |  user:        test
> +  | | | | |  date:        Thu Jan 01 00:00:17 1970 +0000
> +  | | | | |  summary:     (17) expand
> +  | | | | |
> +  | | o---+  changeset:   16:3677d192927d
> +  | | | | |  parent:      0:e6eb3150255d
> +  | | |/ /   parent:      1:6db2ef61d156
> +  | | | |    user:        test
> +  | | | |    date:        Thu Jan 01 00:00:16 1970 +0000
> +  | | | |    summary:     (16) merge two known; one immediate right, one near right
>    | | | |
>    o | | |    changeset:   15:1dda3f72782d
>    |\ \ \ \   parent:      13:22d8966a97e3
> @@ -580,9 +580,9 @@ File glog:
>    | | | | |  date:        Thu Jan 01 00:00:15 1970 +0000
>    | | | | |  summary:     (15) expand
>    | | | | |
> -  | o | | |  changeset:   14:8eac370358ef
> -  | |/ / /   parent:      0:e6eb3150255d
> -  | | | |    parent:      12:86b91144a6e9
> +  | o-----+  changeset:   14:8eac370358ef
> +  | | | | |  parent:      0:e6eb3150255d
> +  | |/ / /   parent:      12:86b91144a6e9
>    | | | |    user:        test
>    | | | |    date:        Thu Jan 01 00:00:14 1970 +0000
>    | | | |    summary:     (14) merge two known; one immediate right, one far right
> @@ -595,72 +595,72 @@ File glog:
>    | | | | |  summary:     (13) expand
>    | | | | |
>    +---o | |  changeset:   12:86b91144a6e9
> -  | |  / /   parent:      1:6db2ef61d156
> +  | | |/ /   parent:      1:6db2ef61d156
>    | | | |    parent:      9:7010c0af0a35
>    | | | |    user:        test
>    | | | |    date:        Thu Jan 01 00:00:12 1970 +0000
>    | | | |    summary:     (12) merge two known; one immediate right, one far left
>    | | | |
> -  | o | |  changeset:   11:832d76e6bdf2
> -  | | | |  parent:      6:b105a072e251
> -  | | | |  parent:      10:74c64d036d72
> -  | | | |  user:        test
> -  | | | |  date:        Thu Jan 01 00:00:11 1970 +0000
> -  | | | |  summary:     (11) expand
> +  | o | |    changeset:   11:832d76e6bdf2
> +  | |\ \ \   parent:      6:b105a072e251
> +  | | | | |  parent:      10:74c64d036d72
> +  | | | | |  user:        test
> +  | | | | |  date:        Thu Jan 01 00:00:11 1970 +0000
> +  | | | | |  summary:     (11) expand
> +  | | | | |
> +  | | o---+  changeset:   10:74c64d036d72
> +  | | | | |  parent:      0:e6eb3150255d
> +  | |/ / /   parent:      6:b105a072e251
> +  | | | |    user:        test
> +  | | | |    date:        Thu Jan 01 00:00:10 1970 +0000
> +  | | | |    summary:     (10) merge two known; one immediate left, one near right
>    | | | |
> -  | o | |  changeset:   10:74c64d036d72
> -  | | | |  parent:      0:e6eb3150255d
> -  | | | |  parent:      6:b105a072e251
> -  | | | |  user:        test
> -  | | | |  date:        Thu Jan 01 00:00:10 1970 +0000
> -  | | | |  summary:     (10) merge two known; one immediate left, one near right
> +  o | | |    changeset:   9:7010c0af0a35
> +  |\ \ \ \   parent:      7:b632bb1b1224
> +  | | | | |  parent:      8:7a0b11f71937
> +  | | | | |  user:        test
> +  | | | | |  date:        Thu Jan 01 00:00:09 1970 +0000
> +  | | | | |  summary:     (9) expand
> +  | | | | |
> +  | o-----+  changeset:   8:7a0b11f71937
> +  | | | | |  parent:      0:e6eb3150255d
> +  |/ / / /   parent:      7:b632bb1b1224
> +  | | | |    user:        test
> +  | | | |    date:        Thu Jan 01 00:00:08 1970 +0000
> +  | | | |    summary:     (8) merge two known; one immediate left, one far right
>    | | | |
> -  o | | |  changeset:   9:7010c0af0a35
> -  | | | |  parent:      7:b632bb1b1224
> -  | | | |  parent:      8:7a0b11f71937
> -  | | | |  user:        test
> -  | | | |  date:        Thu Jan 01 00:00:09 1970 +0000
> -  | | | |  summary:     (9) expand
> +  o | | |    changeset:   7:b632bb1b1224
> +  |\ \ \ \   parent:      2:3d9a33b8d1e1
> +  | | | | |  parent:      5:4409d547b708
> +  | | | | |  user:        test
> +  | | | | |  date:        Thu Jan 01 00:00:07 1970 +0000
> +  | | | | |  summary:     (7) expand
> +  | | | | |
> +  +---o | |  changeset:   6:b105a072e251
> +  | |/ / /   parent:      2:3d9a33b8d1e1
> +  | | | |    parent:      5:4409d547b708
> +  | | | |    user:        test
> +  | | | |    date:        Thu Jan 01 00:00:06 1970 +0000
> +  | | | |    summary:     (6) merge two known; one immediate left, one far left
>    | | | |
> -  o | | |  changeset:   8:7a0b11f71937
> -  | | | |  parent:      0:e6eb3150255d
> -  | | | |  parent:      7:b632bb1b1224
> -  | | | |  user:        test
> -  | | | |  date:        Thu Jan 01 00:00:08 1970 +0000
> -  | | | |  summary:     (8) merge two known; one immediate left, one far right
> +  | o | |    changeset:   5:4409d547b708
> +  | |\ \ \   parent:      3:27eef8ed80b4
> +  | | | | |  parent:      4:26a8bac39d9f
> +  | | | | |  user:        test
> +  | | | | |  date:        Thu Jan 01 00:00:05 1970 +0000
> +  | | | | |  summary:     (5) expand
> +  | | | | |
> +  | | o | |  changeset:   4:26a8bac39d9f
> +  | |/|/ /   parent:      1:6db2ef61d156
> +  | | | |    parent:      3:27eef8ed80b4
> +  | | | |    user:        test
> +  | | | |    date:        Thu Jan 01 00:00:04 1970 +0000
> +  | | | |    summary:     (4) merge two known; one immediate left, one immediate right
>    | | | |
> -  o | | |  changeset:   7:b632bb1b1224
> -  | | | |  parent:      2:3d9a33b8d1e1
> -  | | | |  parent:      5:4409d547b708
> -  | | | |  user:        test
> -  | | | |  date:        Thu Jan 01 00:00:07 1970 +0000
> -  | | | |  summary:     (7) expand
> -  | | | |
> -  | o | |  changeset:   6:b105a072e251
> -  |/ / /   parent:      2:3d9a33b8d1e1
> -  | | |    parent:      5:4409d547b708
> -  | | |    user:        test
> -  | | |    date:        Thu Jan 01 00:00:06 1970 +0000
> -  | | |    summary:     (6) merge two known; one immediate left, one far left
> -  | | |
> -  o | |  changeset:   5:4409d547b708
> -  | | |  parent:      3:27eef8ed80b4
> -  | | |  parent:      4:26a8bac39d9f
> -  | | |  user:        test
> -  | | |  date:        Thu Jan 01 00:00:05 1970 +0000
> -  | | |  summary:     (5) expand
> -  | | |
> -  o | |  changeset:   4:26a8bac39d9f
> -  | | |  parent:      1:6db2ef61d156
> -  | | |  parent:      3:27eef8ed80b4
> -  | | |  user:        test
> -  | | |  date:        Thu Jan 01 00:00:04 1970 +0000
> -  | | |  summary:     (4) merge two known; one immediate left, one immediate right
> -  | | |
> -  o | |  changeset:   3:27eef8ed80b4
> -  | | |  user:        test
> -  | | |  date:        Thu Jan 01 00:00:03 1970 +0000
> -  | | |  summary:     (3) collapse
> +  | o | |  changeset:   3:27eef8ed80b4
> +  |/ / /   user:        test
> +  | | |    date:        Thu Jan 01 00:00:03 1970 +0000
> +  | | |    summary:     (3) collapse
>    | | |
>    o | |  changeset:   2:3d9a33b8d1e1
>    |/ /   user:        test
> @@ -678,6 +678,439 @@ File glog:
>       summary:     (0) root
>    
>  
> +File glog per revset:
> +
> +  $ hg glog -r 'file("a")'
> +  @  changeset:   34:fea3ac5810e0
> +  |  tag:         tip
> +  |  parent:      32:d06dffa21a31
> +  |  user:        test
> +  |  date:        Thu Jan 01 00:00:34 1970 +0000
> +  |  summary:     (34) head
> +  |
> +  | o  changeset:   33:68608f5145f9
> +  | |  parent:      18:1aa84d96232a
> +  | |  user:        test
> +  | |  date:        Thu Jan 01 00:00:33 1970 +0000
> +  | |  summary:     (33) head
> +  | |
> +  o |    changeset:   32:d06dffa21a31
> +  |\ \   parent:      27:886ed638191b
> +  | | |  parent:      31:621d83e11f67
> +  | | |  user:        test
> +  | | |  date:        Thu Jan 01 00:00:32 1970 +0000
> +  | | |  summary:     (32) expand
> +  | | |
> +  | o |    changeset:   31:621d83e11f67
> +  | |\ \   parent:      21:d42a756af44d
> +  | | | |  parent:      30:6e11cd4b648f
> +  | | | |  user:        test
> +  | | | |  date:        Thu Jan 01 00:00:31 1970 +0000
> +  | | | |  summary:     (31) expand
> +  | | | |
> +  | | o |    changeset:   30:6e11cd4b648f
> +  | | |\ \   parent:      28:44ecd0b9ae99
> +  | | | | |  parent:      29:cd9bb2be7593
> +  | | | | |  user:        test
> +  | | | | |  date:        Thu Jan 01 00:00:30 1970 +0000
> +  | | | | |  summary:     (30) expand
> +  | | | | |
> +  | | | o |  changeset:   29:cd9bb2be7593
> +  | | | | |  parent:      0:e6eb3150255d
> +  | | | | |  user:        test
> +  | | | | |  date:        Thu Jan 01 00:00:29 1970 +0000
> +  | | | | |  summary:     (29) regular commit
> +  | | | | |
> +  | | o | |    changeset:   28:44ecd0b9ae99
> +  | | |\ \ \   parent:      1:6db2ef61d156
> +  | | | | | |  parent:      26:7f25b6c2f0b9
> +  | | | | | |  user:        test
> +  | | | | | |  date:        Thu Jan 01 00:00:28 1970 +0000
> +  | | | | | |  summary:     (28) merge zero known
> +  | | | | | |
> +  o | | | | |  changeset:   27:886ed638191b
> +  |/ / / / /   parent:      21:d42a756af44d
> +  | | | | |    user:        test
> +  | | | | |    date:        Thu Jan 01 00:00:27 1970 +0000
> +  | | | | |    summary:     (27) collapse
> +  | | | | |
> +  | | o---+  changeset:   26:7f25b6c2f0b9
> +  | | | | |  parent:      18:1aa84d96232a
> +  | | | | |  parent:      25:91da8ed57247
> +  | | | | |  user:        test
> +  | | | | |  date:        Thu Jan 01 00:00:26 1970 +0000
> +  | | | | |  summary:     (26) merge one known; far right
> +  | | | | |
> +  +---o | |  changeset:   25:91da8ed57247
> +  | | | | |  parent:      21:d42a756af44d
> +  | | | | |  parent:      24:a9c19a3d96b7
> +  | | | | |  user:        test
> +  | | | | |  date:        Thu Jan 01 00:00:25 1970 +0000
> +  | | | | |  summary:     (25) merge one known; far left
> +  | | | | |
> +  | | o | |  changeset:   24:a9c19a3d96b7
> +  | | |\| |  parent:      0:e6eb3150255d
> +  | | | | |  parent:      23:a01cddf0766d
> +  | | | | |  user:        test
> +  | | | | |  date:        Thu Jan 01 00:00:24 1970 +0000
> +  | | | | |  summary:     (24) merge one known; immediate right
> +  | | | | |
> +  | | o | |  changeset:   23:a01cddf0766d
> +  | |/| | |  parent:      1:6db2ef61d156
> +  | | | | |  parent:      22:e0d9cccacb5d
> +  | | | | |  user:        test
> +  | | | | |  date:        Thu Jan 01 00:00:23 1970 +0000
> +  | | | | |  summary:     (23) merge one known; immediate left
> +  | | | | |
> +  +---o---+  changeset:   22:e0d9cccacb5d
> +  | |   | |  parent:      18:1aa84d96232a
> +  | |  / /   parent:      21:d42a756af44d
> +  | | | |    user:        test
> +  | | | |    date:        Thu Jan 01 00:00:22 1970 +0000
> +  | | | |    summary:     (22) merge two known; one far left, one far right
> +  | | | |
> +  o | | |    changeset:   21:d42a756af44d
> +  |\ \ \ \   parent:      19:31ddc2c1573b
> +  | | | | |  parent:      20:d30ed6450e32
> +  | | | | |  user:        test
> +  | | | | |  date:        Thu Jan 01 00:00:21 1970 +0000
> +  | | | | |  summary:     (21) expand
> +  | | | | |
> +  | o---+-+  changeset:   20:d30ed6450e32
> +  |   | | |  parent:      0:e6eb3150255d
> +  |  / / /   parent:      18:1aa84d96232a
> +  | | | |    user:        test
> +  | | | |    date:        Thu Jan 01 00:00:20 1970 +0000
> +  | | | |    summary:     (20) merge two known; two far right
> +  | | | |
> +  o | | |    changeset:   19:31ddc2c1573b
> +  |\ \ \ \   parent:      15:1dda3f72782d
> +  | | | | |  parent:      17:44765d7c06e0
> +  | | | | |  user:        test
> +  | | | | |  date:        Thu Jan 01 00:00:19 1970 +0000
> +  | | | | |  summary:     (19) expand
> +  | | | | |
> +  +---+---o  changeset:   18:1aa84d96232a
> +  | | | |    parent:      1:6db2ef61d156
> +  | | | |    parent:      15:1dda3f72782d
> +  | | | |    user:        test
> +  | | | |    date:        Thu Jan 01 00:00:18 1970 +0000
> +  | | | |    summary:     (18) merge two known; two far left
> +  | | | |
> +  | o | |    changeset:   17:44765d7c06e0
> +  | |\ \ \   parent:      12:86b91144a6e9
> +  | | | | |  parent:      16:3677d192927d
> +  | | | | |  user:        test
> +  | | | | |  date:        Thu Jan 01 00:00:17 1970 +0000
> +  | | | | |  summary:     (17) expand
> +  | | | | |
> +  | | o---+  changeset:   16:3677d192927d
> +  | | | | |  parent:      0:e6eb3150255d
> +  | | |/ /   parent:      1:6db2ef61d156
> +  | | | |    user:        test
> +  | | | |    date:        Thu Jan 01 00:00:16 1970 +0000
> +  | | | |    summary:     (16) merge two known; one immediate right, one near right
> +  | | | |
> +  o | | |    changeset:   15:1dda3f72782d
> +  |\ \ \ \   parent:      13:22d8966a97e3
> +  | | | | |  parent:      14:8eac370358ef
> +  | | | | |  user:        test
> +  | | | | |  date:        Thu Jan 01 00:00:15 1970 +0000
> +  | | | | |  summary:     (15) expand
> +  | | | | |
> +  | o-----+  changeset:   14:8eac370358ef
> +  | | | | |  parent:      0:e6eb3150255d
> +  | |/ / /   parent:      12:86b91144a6e9
> +  | | | |    user:        test
> +  | | | |    date:        Thu Jan 01 00:00:14 1970 +0000
> +  | | | |    summary:     (14) merge two known; one immediate right, one far right
> +  | | | |
> +  o | | |    changeset:   13:22d8966a97e3
> +  |\ \ \ \   parent:      9:7010c0af0a35
> +  | | | | |  parent:      11:832d76e6bdf2
> +  | | | | |  user:        test
> +  | | | | |  date:        Thu Jan 01 00:00:13 1970 +0000
> +  | | | | |  summary:     (13) expand
> +  | | | | |
> +  +---o | |  changeset:   12:86b91144a6e9
> +  | | |/ /   parent:      1:6db2ef61d156
> +  | | | |    parent:      9:7010c0af0a35
> +  | | | |    user:        test
> +  | | | |    date:        Thu Jan 01 00:00:12 1970 +0000
> +  | | | |    summary:     (12) merge two known; one immediate right, one far left
> +  | | | |
> +  | o | |    changeset:   11:832d76e6bdf2
> +  | |\ \ \   parent:      6:b105a072e251
> +  | | | | |  parent:      10:74c64d036d72
> +  | | | | |  user:        test
> +  | | | | |  date:        Thu Jan 01 00:00:11 1970 +0000
> +  | | | | |  summary:     (11) expand
> +  | | | | |
> +  | | o---+  changeset:   10:74c64d036d72
> +  | | | | |  parent:      0:e6eb3150255d
> +  | |/ / /   parent:      6:b105a072e251
> +  | | | |    user:        test
> +  | | | |    date:        Thu Jan 01 00:00:10 1970 +0000
> +  | | | |    summary:     (10) merge two known; one immediate left, one near right
> +  | | | |
> +  o | | |    changeset:   9:7010c0af0a35
> +  |\ \ \ \   parent:      7:b632bb1b1224
> +  | | | | |  parent:      8:7a0b11f71937
> +  | | | | |  user:        test
> +  | | | | |  date:        Thu Jan 01 00:00:09 1970 +0000
> +  | | | | |  summary:     (9) expand
> +  | | | | |
> +  | o-----+  changeset:   8:7a0b11f71937
> +  | | | | |  parent:      0:e6eb3150255d
> +  |/ / / /   parent:      7:b632bb1b1224
> +  | | | |    user:        test
> +  | | | |    date:        Thu Jan 01 00:00:08 1970 +0000
> +  | | | |    summary:     (8) merge two known; one immediate left, one far right
> +  | | | |
> +  o | | |    changeset:   7:b632bb1b1224
> +  |\ \ \ \   parent:      2:3d9a33b8d1e1
> +  | | | | |  parent:      5:4409d547b708
> +  | | | | |  user:        test
> +  | | | | |  date:        Thu Jan 01 00:00:07 1970 +0000
> +  | | | | |  summary:     (7) expand
> +  | | | | |
> +  +---o | |  changeset:   6:b105a072e251
> +  | |/ / /   parent:      2:3d9a33b8d1e1
> +  | | | |    parent:      5:4409d547b708
> +  | | | |    user:        test
> +  | | | |    date:        Thu Jan 01 00:00:06 1970 +0000
> +  | | | |    summary:     (6) merge two known; one immediate left, one far left
> +  | | | |
> +  | o | |    changeset:   5:4409d547b708
> +  | |\ \ \   parent:      3:27eef8ed80b4
> +  | | | | |  parent:      4:26a8bac39d9f
> +  | | | | |  user:        test
> +  | | | | |  date:        Thu Jan 01 00:00:05 1970 +0000
> +  | | | | |  summary:     (5) expand
> +  | | | | |
> +  | | o | |  changeset:   4:26a8bac39d9f
> +  | |/|/ /   parent:      1:6db2ef61d156
> +  | | | |    parent:      3:27eef8ed80b4
> +  | | | |    user:        test
> +  | | | |    date:        Thu Jan 01 00:00:04 1970 +0000
> +  | | | |    summary:     (4) merge two known; one immediate left, one immediate right
> +  | | | |
> +  | o | |  changeset:   3:27eef8ed80b4
> +  |/ / /   user:        test
> +  | | |    date:        Thu Jan 01 00:00:03 1970 +0000
> +  | | |    summary:     (3) collapse
> +  | | |
> +  o | |  changeset:   2:3d9a33b8d1e1
> +  |/ /   user:        test
> +  | |    date:        Thu Jan 01 00:00:02 1970 +0000
> +  | |    summary:     (2) collapse
> +  | |
> +  o |  changeset:   1:6db2ef61d156
> +  |/   user:        test
> +  |    date:        Thu Jan 01 00:00:01 1970 +0000
> +  |    summary:     (1) collapse
> +  |
> +  o  changeset:   0:e6eb3150255d
> +     user:        test
> +     date:        Thu Jan 01 00:00:00 1970 +0000
> +     summary:     (0) root
> +  
> +
> +
> +File glog per revset (only merges):
> +
> +  $ hg log -G -r 'file("a")' -m
> +  o    changeset:   32:d06dffa21a31
> +  |\   parent:      27:886ed638191b
> +  | |  parent:      31:621d83e11f67
> +  | |  user:        test
> +  | |  date:        Thu Jan 01 00:00:32 1970 +0000
> +  | |  summary:     (32) expand
> +  | |
> +  o |  changeset:   31:621d83e11f67
> +  |\|  parent:      21:d42a756af44d
> +  | |  parent:      30:6e11cd4b648f
> +  | |  user:        test
> +  | |  date:        Thu Jan 01 00:00:31 1970 +0000
> +  | |  summary:     (31) expand
> +  | |
> +  o |    changeset:   30:6e11cd4b648f
> +  |\ \   parent:      28:44ecd0b9ae99
> +  | | |  parent:      29:cd9bb2be7593
> +  | | |  user:        test
> +  | | |  date:        Thu Jan 01 00:00:30 1970 +0000
> +  | | |  summary:     (30) expand
> +  | | |
> +  o | |    changeset:   28:44ecd0b9ae99
> +  |\ \ \   parent:      1:6db2ef61d156
> +  | | | |  parent:      26:7f25b6c2f0b9
> +  | | | |  user:        test
> +  | | | |  date:        Thu Jan 01 00:00:28 1970 +0000
> +  | | | |  summary:     (28) merge zero known
> +  | | | |
> +  o | | |    changeset:   26:7f25b6c2f0b9
> +  |\ \ \ \   parent:      18:1aa84d96232a
> +  | | | | |  parent:      25:91da8ed57247
> +  | | | | |  user:        test
> +  | | | | |  date:        Thu Jan 01 00:00:26 1970 +0000
> +  | | | | |  summary:     (26) merge one known; far right
> +  | | | | |
> +  | o-----+  changeset:   25:91da8ed57247
> +  | | | | |  parent:      21:d42a756af44d
> +  | | | | |  parent:      24:a9c19a3d96b7
> +  | | | | |  user:        test
> +  | | | | |  date:        Thu Jan 01 00:00:25 1970 +0000
> +  | | | | |  summary:     (25) merge one known; far left
> +  | | | | |
> +  | o | | |    changeset:   24:a9c19a3d96b7
> +  | |\ \ \ \   parent:      0:e6eb3150255d
> +  | | | | | |  parent:      23:a01cddf0766d
> +  | | | | | |  user:        test
> +  | | | | | |  date:        Thu Jan 01 00:00:24 1970 +0000
> +  | | | | | |  summary:     (24) merge one known; immediate right
> +  | | | | | |
> +  | o---+ | |  changeset:   23:a01cddf0766d
> +  | | | | | |  parent:      1:6db2ef61d156
> +  | | | | | |  parent:      22:e0d9cccacb5d
> +  | | | | | |  user:        test
> +  | | | | | |  date:        Thu Jan 01 00:00:23 1970 +0000
> +  | | | | | |  summary:     (23) merge one known; immediate left
> +  | | | | | |
> +  | o-------+  changeset:   22:e0d9cccacb5d
> +  | | | | | |  parent:      18:1aa84d96232a
> +  |/ / / / /   parent:      21:d42a756af44d
> +  | | | | |    user:        test
> +  | | | | |    date:        Thu Jan 01 00:00:22 1970 +0000
> +  | | | | |    summary:     (22) merge two known; one far left, one far right
> +  | | | | |
> +  | | | | o    changeset:   21:d42a756af44d
> +  | | | | |\   parent:      19:31ddc2c1573b
> +  | | | | | |  parent:      20:d30ed6450e32
> +  | | | | | |  user:        test
> +  | | | | | |  date:        Thu Jan 01 00:00:21 1970 +0000
> +  | | | | | |  summary:     (21) expand
> +  | | | | | |
> +  +-+-------o  changeset:   20:d30ed6450e32
> +  | | | | |    parent:      0:e6eb3150255d
> +  | | | | |    parent:      18:1aa84d96232a
> +  | | | | |    user:        test
> +  | | | | |    date:        Thu Jan 01 00:00:20 1970 +0000
> +  | | | | |    summary:     (20) merge two known; two far right
> +  | | | | |
> +  | | | | o    changeset:   19:31ddc2c1573b
> +  | | | | |\   parent:      15:1dda3f72782d
> +  | | | | | |  parent:      17:44765d7c06e0
> +  | | | | | |  user:        test
> +  | | | | | |  date:        Thu Jan 01 00:00:19 1970 +0000
> +  | | | | | |  summary:     (19) expand
> +  | | | | | |
> +  o---+---+ |  changeset:   18:1aa84d96232a
> +    | | | | |  parent:      1:6db2ef61d156
> +   / / / / /   parent:      15:1dda3f72782d
> +  | | | | |    user:        test
> +  | | | | |    date:        Thu Jan 01 00:00:18 1970 +0000
> +  | | | | |    summary:     (18) merge two known; two far left
> +  | | | | |
> +  | | | | o    changeset:   17:44765d7c06e0
> +  | | | | |\   parent:      12:86b91144a6e9
> +  | | | | | |  parent:      16:3677d192927d
> +  | | | | | |  user:        test
> +  | | | | | |  date:        Thu Jan 01 00:00:17 1970 +0000
> +  | | | | | |  summary:     (17) expand
> +  | | | | | |
> +  +-+-------o  changeset:   16:3677d192927d
> +  | | | | |    parent:      0:e6eb3150255d
> +  | | | | |    parent:      1:6db2ef61d156
> +  | | | | |    user:        test
> +  | | | | |    date:        Thu Jan 01 00:00:16 1970 +0000
> +  | | | | |    summary:     (16) merge two known; one immediate right, one near right
> +  | | | | |
> +  | | | o |    changeset:   15:1dda3f72782d
> +  | | | |\ \   parent:      13:22d8966a97e3
> +  | | | | | |  parent:      14:8eac370358ef
> +  | | | | | |  user:        test
> +  | | | | | |  date:        Thu Jan 01 00:00:15 1970 +0000
> +  | | | | | |  summary:     (15) expand
> +  | | | | | |
> +  +-------o |  changeset:   14:8eac370358ef
> +  | | | | |/   parent:      0:e6eb3150255d
> +  | | | | |    parent:      12:86b91144a6e9
> +  | | | | |    user:        test
> +  | | | | |    date:        Thu Jan 01 00:00:14 1970 +0000
> +  | | | | |    summary:     (14) merge two known; one immediate right, one far right
> +  | | | | |
> +  | | | o |    changeset:   13:22d8966a97e3
> +  | | | |\ \   parent:      9:7010c0af0a35
> +  | | | | | |  parent:      11:832d76e6bdf2
> +  | | | | | |  user:        test
> +  | | | | | |  date:        Thu Jan 01 00:00:13 1970 +0000
> +  | | | | | |  summary:     (13) expand
> +  | | | | | |
> +  | +---+---o  changeset:   12:86b91144a6e9
> +  | | | | |    parent:      1:6db2ef61d156
> +  | | | | |    parent:      9:7010c0af0a35
> +  | | | | |    user:        test
> +  | | | | |    date:        Thu Jan 01 00:00:12 1970 +0000
> +  | | | | |    summary:     (12) merge two known; one immediate right, one far left
> +  | | | | |
> +  | | | | o    changeset:   11:832d76e6bdf2
> +  | | | | |\   parent:      6:b105a072e251
> +  | | | | | |  parent:      10:74c64d036d72
> +  | | | | | |  user:        test
> +  | | | | | |  date:        Thu Jan 01 00:00:11 1970 +0000
> +  | | | | | |  summary:     (11) expand
> +  | | | | | |
> +  +---------o  changeset:   10:74c64d036d72
> +  | | | | |/   parent:      0:e6eb3150255d
> +  | | | | |    parent:      6:b105a072e251
> +  | | | | |    user:        test
> +  | | | | |    date:        Thu Jan 01 00:00:10 1970 +0000
> +  | | | | |    summary:     (10) merge two known; one immediate left, one near right
> +  | | | | |
> +  | | | o |    changeset:   9:7010c0af0a35
> +  | | | |\ \   parent:      7:b632bb1b1224
> +  | | | | | |  parent:      8:7a0b11f71937
> +  | | | | | |  user:        test
> +  | | | | | |  date:        Thu Jan 01 00:00:09 1970 +0000
> +  | | | | | |  summary:     (9) expand
> +  | | | | | |
> +  +-------o |  changeset:   8:7a0b11f71937
> +  | | | |/ /   parent:      0:e6eb3150255d
> +  | | | | |    parent:      7:b632bb1b1224
> +  | | | | |    user:        test
> +  | | | | |    date:        Thu Jan 01 00:00:08 1970 +0000
> +  | | | | |    summary:     (8) merge two known; one immediate left, one far right
> +  | | | | |
> +  | | | o |    changeset:   7:b632bb1b1224
> +  | | | |\ \   parent:      2:3d9a33b8d1e1
> +  | | | | | |  parent:      5:4409d547b708
> +  | | | | | |  user:        test
> +  | | | | | |  date:        Thu Jan 01 00:00:07 1970 +0000
> +  | | | | | |  summary:     (7) expand
> +  | | | | | |
> +  | | | +---o  changeset:   6:b105a072e251
> +  | | | | |/   parent:      2:3d9a33b8d1e1
> +  | | | | |    parent:      5:4409d547b708
> +  | | | | |    user:        test
> +  | | | | |    date:        Thu Jan 01 00:00:06 1970 +0000
> +  | | | | |    summary:     (6) merge two known; one immediate left, one far left
> +  | | | | |
> +  | | | o |    changeset:   5:4409d547b708
> +  | | | |\ \   parent:      3:27eef8ed80b4
> +  | | | | | |  parent:      4:26a8bac39d9f
> +  | | | | | |  user:        test
> +  | | | | | |  date:        Thu Jan 01 00:00:05 1970 +0000
> +  | | | | | |  summary:     (5) expand
> +  | | | | | |
> +  | +---o | |  changeset:   4:26a8bac39d9f
> +  | | | |/ /   parent:      1:6db2ef61d156
> +  | | | | |    parent:      3:27eef8ed80b4
> +  | | | | |    user:        test
> +  | | | | |    date:        Thu Jan 01 00:00:04 1970 +0000
> +  | | | | |    summary:     (4) merge two known; one immediate left, one immediate right
> +  | | | | |
> +
> +
>  Unused arguments:
>    $ hg glog -q foo bar
>    hg glog: invalid arguments
> @@ -733,10 +1166,10 @@ File log with revs != cset revs:
>    |  summary:     more
>    |
>    o  changeset:   1:5ac72c0599bf
> -     user:        test
> -     date:        Thu Jan 01 00:00:00 1970 +0000
> -     summary:     two
> -  
> +  |  user:        test
> +  |  date:        Thu Jan 01 00:00:00 1970 +0000
> +  |  summary:     two
> +  |
>  
>  Issue1896: File log with explicit style
>    $ hg glog --style=default one
> @@ -868,7 +1301,26 @@ File + limit + -ra:b, (b - a) < limit:
>    | | |  summary:     (32) expand
>    | | |
>  
> +Point out a common and an uncommon unshown parent
> +
> +  $ hg glog -r 'rev(8) or rev(9)'
> +  o    changeset:   9:7010c0af0a35
> +  |\   parent:      7:b632bb1b1224
> +  | |  parent:      8:7a0b11f71937
> +  | |  user:        test
> +  | |  date:        Thu Jan 01 00:00:09 1970 +0000
> +  | |  summary:     (9) expand
> +  | |
> +  o |  changeset:   8:7a0b11f71937
> +  |\|  parent:      0:e6eb3150255d
> +  | |  parent:      7:b632bb1b1224
> +  | |  user:        test
> +  | |  date:        Thu Jan 01 00:00:08 1970 +0000
> +  | |  summary:     (8) merge two known; one immediate left, one far right
> +  | |
> +
>  File + limit + -ra:b, b < tip:
> +
>    $ hg glog -l1 -r32:34 a
>    o  changeset:   34:fea3ac5810e0
>    |  parent:      32:d06dffa21a31
> @@ -877,7 +1329,33 @@ File + limit + -ra:b, b < tip:
>    |  summary:     (34) head
>    |
>  
> +file(File) + limit + -ra:b, b < tip:
> +
> +  $ hg glog -l1 -r32:34 -r 'file("a")'
> +  o  changeset:   34:fea3ac5810e0
> +  |  parent:      32:d06dffa21a31
> +  |  user:        test
> +  |  date:        Thu Jan 01 00:00:34 1970 +0000
> +  |  summary:     (34) head
> +  |
> +
> +limit(file(File) and a::b), b < tip:
> +
> +  $ hg glog -r 'limit(file("a") and 32::34, 1)'
> +  o    changeset:   32:d06dffa21a31
> +  |\   parent:      27:886ed638191b
> +  | |  parent:      31:621d83e11f67
> +  | |  user:        test
> +  | |  date:        Thu Jan 01 00:00:32 1970 +0000
> +  | |  summary:     (32) expand
> +  | |
> +
> +File + limit + -ra:b, b < tip:
> +
> +  $ hg glog -r 'limit(file("a") and 34::32, 1)'
> +
>  File + limit + -ra:b, b < tip, (b - a) < limit:
> +
>    $ hg glog -l10 -r33:34 a
>    o  changeset:   34:fea3ac5810e0
>    |  parent:      32:d06dffa21a31
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel


-- 
Mathematics is the supreme nostalgia of our time.





More information about the Mercurial-devel mailing list