hg view vs. hg glog

Alpár Jüttner alpar at cs.elte.hu
Sun Nov 9 01:04:44 CST 2008


> I was thinking of something like this (output from a hacked version of
> hg; patch is inlined below):
> 
> $ hg glog -l20 -c1

It looks good, but does not help much in my problem. I would really
prefer to start with the heads. Anyway, the original changeset order is
quite irrelevant. It doesn't even follow the time line of the commits
and it can be very different in otherwise synchronized repositories.

In fact, it would be event better if glog would reorder the changesets,
but this reordering would depend only on the changesets and would be
independent from the changeset order.

Another feature I really miss is some kind of glog equivalent of 'hg in'
and 'hg out'.

Regards,
Alpar



> o  7331	Keep sessionvars with repository links added in a0843c82d1a2
> [] thomas 22 hours
> |
> .  ... (12 skipped)
> |
> o    7318	merge bookmarks [] benoit 2 days
> |\
> | o  7317	bookmarks: Test if rebase works with bookmarks [] piranha 2 days
> | |
> | o  7316	bookmarks: Use dirstate to determine the current node in
> addchangegroup [] dsp 3 days
> | |
> o |  7315	tests: run svn tests only with svn bindings >1.3 [] dirkjan 2 days
> | |
> . |  ... (2 skipped)
> |/
> o  7312	Shorten sleep in inotify test [] mpm 4 days
> |
> 
> As opposed to:
> 
> $ hg glog -l20
> o  7331	Keep sessionvars with repository links added in a0843c82d1a2
> [] thomas 22 hours
> |
> o  7330	Fix test output for updated gitdiffs help and web template
> cleanups [] thomas 22 hours
> |
> o  7329	Do not abort with inotify extension enabled, but not supported
> by the system. [] thomas 22 hours
> |
> o  7328	Enhance gitdiffs help text [] thomas 22 hours
> |
> o  7327	Kill trailing whitespace in templates [] thomas 22 hours
> |
> o  7326	graphlog: move functions around, eliminate helper function []
> dirkjan 24 hours
> |
> o  7325	graphlog: split the actual DAG grapher out into a separate
> method [] peter 25 hours
> |
> o  7324	graphlog: rename some vars prior to refactoring [] peter 25 hours
> |
> o  7323	graphlog: make some comment lines more like others in
> punctuation [] peter 25 hours
> |
> o  7322	patchbomb: fix indentation [] peter 25 hours
> |
> o  7321	patchbomb: move exportee class to top level [] peter 25 hours
> |
> o  7320	ui: log non-interactive default response to stdout when
> verbose [] peter 25 hours
> |
> o  7319	export: fixed silent output file overwriting [] Ronny 2 days
> |
> o    7318	merge bookmarks [] benoit 2 days
> |\
> | o  7317	bookmarks: Test if rebase works with bookmarks [] piranha 2 days
> | |
> | o  7316	bookmarks: Use dirstate to determine the current node in
> addchangegroup [] dsp 3 days
> | |
> o |  7315	tests: run svn tests only with svn bindings >1.3 [] dirkjan 2 days
> | |
> o |  7314	coal/paper: link repo name to hgweb root [] dirkjan 3 days
> | |
> o |  7313	paper: don't keep the menu affixed to the top [] dirkjan 3 days
> |/
> o  7312	Shorten sleep in inotify test [] mpm 4 days
> |
> 
> 
> Patch for this (applies on top of my latest submitted patch series for
> graphlog.py):
> 
> diff --git a/hgext/graphlog.py b/hgext/graphlog.py
> --- a/hgext/graphlog.py
> +++ b/hgext/graphlog.py
> @@ -30,6 +30,73 @@
>          yield (curr_rev, node, parents)
>          curr_rev -= 1
> 
> +def cset_nodes_summary(repo, startrev, stoprev, limitruns):
> +    """cset DAG generator yielding (rev, node, [parents]) tuples
> +
> +    Like cset_nodes(), but limits linear runs to at most limitruns nodes.
> +    Yields number of elided nodes as node when skipping linear runs.
> +    """
> +    assert startrev >= stoprev
> +
> +    expecting = {}
> +    def expect(rev, parents):
> +        for p in parents:
> +            if not expecting.get(p):
> +                expecting[p] = rev
> +
> +    skipfirstrev = None
> +    skiplastparents = []
> +    skiplen = 0
> +    runlen = 0
> +    prevrev = None
> +    prevloneparentrev = None
> +    currrev = startrev
> +    while currrev >= stoprev:
> +        skip = False
> +        expectedby = expecting.get(currrev)
> +        if expectedby:
> +            del expecting[currrev]
> +        parents = [x for x in repo.changelog.parentrevs(currrev) if x
> != nullrev]
> +        if len(parents) > 1:
> +            parents.sort()
> +            prevloneparentrev = None
> +        else:
> +            skip = (currrev == prevloneparentrev
> +                    and (not expectedby or expectedby == prevrev))
> +            if len(parents) > 0:
> +                prevloneparentrev = parents[0]
> +            else:
> +                prevloneparentrev = None
> +        if skip:
> +            if skipfirstrev:
> +                skiplastparents = parents
> +                skiplen += 1
> +                #print "-- ", currrev, " -> ", parents
> +            else:
> +                runlen += 1
> +                if runlen >= limitruns:
> +                    #print "-< ", currrev, " -> ", parents
> +                    skipfirstrev = currrev
> +                    skiplastparents = parents
> +                    skiplen = 1
> +        else:
> +            runlen = 0
> +            if skipfirstrev:
> +                if skiplen < 2:
> +                    node = repo.changelog.node(skipfirstrev)
> +                else:
> +                    node = skiplen # signal skip
> +                    #print "-> ", eliding, " -> ", elisionparents
> +                yield (skipfirstrev, node, skiplastparents)
> +                expect(skipfirstrev, skiplastparents)
> +                skipfirstrev = None
> +        if not skipfirstrev:
> +            node = repo.changelog.node(currrev)
> +            yield (currrev, node, parents)
> +            expect(currrev, parents)
> +        prevrev = currrev
> +        currrev -= 1
> +
>  def file_nodes(repo, path, start_rev, stop_rev):
>      """file cset DAG generator yielding (rev, node, [parents]) tuples
> 
> @@ -298,6 +365,7 @@
>      """
> 
>      limit = get_limit(opts["limit"])
> +    collapse = get_limit(opts["collapse_linear"])
>      (start_rev, stop_rev) = get_revs(repo, opts["rev"])
>      stop_rev = max(stop_rev, start_rev - limit + 1)
>      if start_rev == nullrev:
> @@ -306,6 +374,8 @@
>          path = canonpath(repo.root, os.getcwd(), path)
>      if path:
>          revdag = file_nodes(repo, path, start_rev, stop_rev)
> +    elif collapse < sys.maxint:
> +        revdag = cset_nodes_summary(repo, start_rev, stop_rev, collapse)
>      else:
>          revdag = cset_nodes(repo, start_rev, stop_rev)
> 
> @@ -313,15 +383,19 @@
>      cs_printer = show_changeset(ui, repo, opts)
>      def graphabledag():
>          for (rev, node, parents) in revdag:
> -            # log_strings is the list of all log strings to draw alongside
> -            # the graph.
> -            ui.pushbuffer()
> -            cs_printer.show(rev, node)
> -            log_strings = ui.popbuffer().split("\n")[:-1]
> -            if node in repo_parents:
> -                node_ch = "@"
> +            if isinstance(node, int):
> +                node_ch = '.'
> +                log_strings = [_('... (%i skipped)') % node]
>              else:
> -                node_ch = "o"
> +                # log_strings is the list of all log strings to draw alongside
> +                # the graph.
> +                ui.pushbuffer()
> +                cs_printer.show(rev, node)
> +                log_strings = ui.popbuffer().split("\n")[:-1]
> +                if node in repo_parents:
> +                    node_ch = "@"
> +                else:
> +                    node_ch = "o"
>              yield (rev, parents, node_ch, log_strings)
> 
>      ascii(ui, nodegrapher(graphabledag()))
> @@ -332,6 +406,7 @@
>           [('l', 'limit', '', _('limit number of changes displayed')),
>            ('p', 'patch', False, _('show patch')),
>            ('r', 'rev', [], _('show the specified revision or range')),
> +          ('c', 'collapse-linear', '', _('limit number of nodes for
> linear runs')),
>           ] + templateopts,
>           _('hg glog [OPTION]... [FILE]')),
>      # "debuggraph": (debugnodegraph, [], ''),



More information about the Mercurial mailing list