view hgext/beautifygraph.py @ 45433:324ad3e7ef41

localrepo: warn if we are writing to cache without a lock From quite sometime we have two types of cache, `cache` and `wcache`. The later one is a working copy cache and the first one is a store cache. Let's add a check for warning if we are missing store lock while writing to these caches. This is inspired from some tag cache breakage which is observed when multiple shares are in play. The interesting part is that although we are still taking wlock to write store caches at many places, but still the test pases. Differential Revision: https://phab.mercurial-scm.org/D9000
author Pulkit Goyal <7895pulkit@gmail.com>
date Tue, 08 Sep 2020 18:46:01 +0530
parents 14d0e89520a2
children 36c05ab02232
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 = b'ships-with-hg-core'


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


def convertedges(line):
    line = b' %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 b''.join(pretty)


def getprettygraphnode(orig, *args, **kwargs):
    node = orig(*args, **kwargs)
    if node == b'o':
        return b'\xE2\x97\x8B'  # U+25CB ○
    if node == b'@':
        return b'\xE2\x97\x8D'  # U+25CD ◍
    if node == b'%':
        return b'\xE2\x97\x8D'  # U+25CE ◎
    if node == b'*':
        return b'\xE2\x88\x97'  # U+2217 ∗
    if node == b'x':
        return b'\xE2\x97\x8C'  # U+25CC ◌
    if node == b'_':
        return b'\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(b'graph'):
        return

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

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

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