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

Alexander Solovyov alexander at solovyov.net
Thu Mar 17 18:06:38 CDT 2011


# HG changeset patch
# User Alexander Solovyov <alexander at solovyov.net>
# Date 1300028018 -3600
# Node ID f052d129cb2eb523fd3758b430e48f03e7b54380
# Parent  f0a2aa60aea919957c47518e73c1d7903c7f793d
graphlog: add revsets support (and convert usual options to revset)

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,12 +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'))
-                raise
+            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
@@ -628,7 +628,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,18 +678,438 @@ File glog:
      summary:     (0) root
   
 
-Unused arguments:
-  $ hg glog -q foo bar
-  hg glog: invalid arguments
-  hg glog [OPTION]... [FILE]
+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
   
-  show revision history alongside an ASCII revision graph
-  [255]
 
-Only one file is allowed:
-  $ hg log -G foo bar
-  abort: --graph option allows at most one file
-  [255]
+
+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
+  | | | | |
+
 
 Empty revision range - display nothing:
   $ hg glog -r 1..0
@@ -733,10 +1153,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 +1288,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 +1316,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


More information about the Mercurial-devel mailing list