view hgext/beautifygraph.py @ 41719:5f9d057ba28c

changegroup: don't try to prune manifest nodes if not ellipses In non-ellipses case, the number of manifest nodes can be very big, and finding whether one of them can be pruned or not is very costly. For each node, we try to find the rev and the linkrev, which is expensive. Sending bit more manifest nodes seems better and much faster here. On our internal repository, this saves around 5 seconds on `hg tracked --addinclude <some_path>` on a narrow repo with ellipses disabled. Differential Revision: https://phab.mercurial-scm.org/D5782
author Pulkit Goyal <pulkit@yandex-team.ru>
date Thu, 31 Jan 2019 20:11:16 +0300
parents c2a0bc6412db
children 2372284d9457
line wrap: on
line source

# -*- coding: UTF-8 -*-
# beautifygraph.py - improve graph output by using Unicode characters
#
# Copyright 2018 John Stiles <johnstiles@gmail.com>
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.

'''beautify log -G output by using Unicode characters (EXPERIMENTAL)

   A terminal with UTF-8 support and monospace narrow text are required.
'''

from __future__ import absolute_import

from mercurial.i18n import _
from mercurial import (
    encoding,
    extensions,
    graphmod,
    pycompat,
    templatekw,
)

# Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
# extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
# be specifying the version(s) of Mercurial they are tested with, or
# leave the attribute unspecified.
testedwith = 'ships-with-hg-core'

def prettyedge(before, edge, after):
    if edge == '~':
        return '\xE2\x95\xA7' # U+2567 ╧
    if edge == '/':
        return '\xE2\x95\xB1' # U+2571 ╱
    if edge == '-':
        return '\xE2\x94\x80' # U+2500 ─
    if edge == '|':
        return '\xE2\x94\x82' # U+2502 │
    if edge == ':':
        return '\xE2\x94\x86' # U+2506 ┆
    if edge == '\\':
        return '\xE2\x95\xB2' # U+2572 ╲
    if edge == '+':
        if before == ' ' and not after  == ' ':
            return '\xE2\x94\x9C' # U+251C ├
        if after  == ' ' and not before == ' ':
            return '\xE2\x94\xA4' # U+2524 ┤
        return '\xE2\x94\xBC' # U+253C ┼
    return edge

def convertedges(line):
    line = ' %s ' % line
    pretty = []
    for idx in pycompat.xrange(len(line) - 2):
        pretty.append(prettyedge(line[idx:idx + 1],
                                 line[idx + 1:idx + 2],
                                 line[idx + 2:idx + 3]))
    return ''.join(pretty)

def getprettygraphnode(orig, *args, **kwargs):
    node = orig(*args, **kwargs)
    if node == 'o':
        return '\xE2\x97\x8B' # U+25CB ○
    if node == '@':
        return '\xE2\x97\x8D' # U+25CD ◍
    if node == '*':
        return '\xE2\x88\x97' # U+2217 ∗
    if node == 'x':
        return '\xE2\x97\x8C' # U+25CC ◌
    if node == '_':
        return '\xE2\x95\xA4' # U+2564 ╤
    return node

def outputprettygraph(orig, ui, graph, *args, **kwargs):
    (edges, text) = zip(*graph)
    graph = zip([convertedges(e) for e in edges], text)
    return orig(ui, graph, *args, **kwargs)

def extsetup(ui):
    if ui.plain('graph'):
        return

    if encoding.encoding != 'UTF-8':
        ui.warn(_('beautifygraph: unsupported encoding, UTF-8 required\n'))
        return

    if r'A' in encoding._wide:
        ui.warn(_('beautifygraph: unsupported terminal settings, '
                  'monospace narrow text required\n'))
        return

    extensions.wrapfunction(graphmod, 'outputgraph', outputprettygraph)
    extensions.wrapfunction(templatekw, 'getgraphnode', getprettygraphnode)