view hgext/beautifygraph.py @ 40753:9199548525fc

subrepo-git: use an official origvfs when appropriate The origvfs has the auditor properly set and can move file without issue. The current code is currently working without errors because rename are not audited, yet.
author Boris Feld <boris.feld@octobus.net>
date Thu, 22 Nov 2018 20:01:28 +0100
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)