view hgdemandimport/tracing.py @ 44111:2928d5af6281

py3: string normalization and I/O tweaks in test-lfs.t The print was inserting b'' on Python 3. In addition, since we weren't writing to the ui instance (which isn't readily available in this function), output order could get mixed up. We add some pycompat casts and a stdout flush to make the test happy on all Python versions. Differential Revision: https://phab.mercurial-scm.org/D7938
author Gregory Szorc <gregory.szorc@gmail.com>
date Fri, 17 Jan 2020 22:24:27 -0800
parents 2372284d9457
children 6000f5b25c9b
line wrap: on
line source

# Support code for event tracing in Mercurial. Lives in demandimport
# so it can also be used in demandimport.
#
# Copyright 2018 Google LLC.
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
from __future__ import absolute_import

import contextlib
import os

_pipe = None
_checked = False
_session = 'none'


def _isactive():
    global _pipe, _session, _checked
    if _pipe is None:
        if _checked:
            return False
        _checked = True
        if 'HGCATAPULTSERVERPIPE' not in os.environ:
            return False
        _pipe = open(os.environ['HGCATAPULTSERVERPIPE'], 'w', 1)
        _session = os.environ.get('HGCATAPULTSESSION', 'none')
    return True


@contextlib.contextmanager
def log(whencefmt, *whenceargs):
    if not _isactive():
        yield
        return
    whence = whencefmt % whenceargs
    try:
        # Both writes to the pipe are wrapped in try/except to ignore
        # errors, as we can see mysterious errors in here if the pager
        # is active. Presumably other conditions could trigger
        # problems too.
        try:
            _pipe.write('START %s %s\n' % (_session, whence))
        except IOError:
            pass
        yield
    finally:
        try:
            _pipe.write('END %s %s\n' % (_session, whence))
        except IOError:
            pass


def counter(label, amount, *labelargs):
    if not _isactive():
        return
    l = label % labelargs
    # See above in log() for why this is in a try/except.
    try:
        _pipe.write('COUNTER %s %d %s\n' % (_session, amount, l))
    except IOError:
        pass