hgdemandimport/tracing.py
author Gregory Szorc <gregory.szorc@gmail.com>
Fri, 25 Jan 2019 16:00:34 -0800
changeset 41406 b141b5243b37
parent 39424 452790284a15
child 42492 d0b8a3cfd732
permissions -rw-r--r--
util: cast memoryview to bytes Python 3 uses readinto() instead of read() in places. And taking a slice of the buffer passed to readinto() will produce a memoryview. _writedata() then gets confused when testing for `b'\n' in data` because memoryview is an iterable over ints instead of 1 character bytes. We work around by casting a memoryview to bytes. Differential Revision: https://phab.mercurial-scm.org/D5704
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
39282
284440041141 tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff changeset
     1
# Support code for event tracing in Mercurial. Lives in demandimport
284440041141 tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff changeset
     2
# so it can also be used in demandimport.
284440041141 tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff changeset
     3
#
284440041141 tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff changeset
     4
# Copyright 2018 Google LLC.
284440041141 tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff changeset
     5
#
284440041141 tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff changeset
     6
# This software may be used and distributed according to the terms of the
284440041141 tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff changeset
     7
# GNU General Public License version 2 or any later version.
284440041141 tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff changeset
     8
from __future__ import absolute_import
284440041141 tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff changeset
     9
284440041141 tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff changeset
    10
import contextlib
284440041141 tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff changeset
    11
import os
284440041141 tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff changeset
    12
284440041141 tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff changeset
    13
_pipe = None
284440041141 tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff changeset
    14
_checked = False
284440041141 tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff changeset
    15
284440041141 tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff changeset
    16
@contextlib.contextmanager
284440041141 tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff changeset
    17
def log(whencefmt, *whenceargs):
284440041141 tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff changeset
    18
    global _pipe, _session, _checked
284440041141 tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff changeset
    19
    if _pipe is None:
284440041141 tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff changeset
    20
        if _checked:
284440041141 tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff changeset
    21
            yield
284440041141 tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff changeset
    22
            return
284440041141 tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff changeset
    23
        _checked = True
284440041141 tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff changeset
    24
        if 'HGCATAPULTSERVERPIPE' not in os.environ:
284440041141 tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff changeset
    25
            yield
284440041141 tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff changeset
    26
            return
284440041141 tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff changeset
    27
        _pipe = open(os.environ['HGCATAPULTSERVERPIPE'], 'w', 1)
284440041141 tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff changeset
    28
        _session = os.environ.get('HGCATAPULTSESSION', 'none')
284440041141 tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff changeset
    29
    whence = whencefmt % whenceargs
284440041141 tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff changeset
    30
    try:
39424
452790284a15 tracing: ignore any IOErrors when writing to pipe
Augie Fackler <augie@google.com>
parents: 39282
diff changeset
    31
        # Both writes to the pipe are wrapped in try/except to ignore
452790284a15 tracing: ignore any IOErrors when writing to pipe
Augie Fackler <augie@google.com>
parents: 39282
diff changeset
    32
        # errors, as we can see mysterious errors in here if the pager
452790284a15 tracing: ignore any IOErrors when writing to pipe
Augie Fackler <augie@google.com>
parents: 39282
diff changeset
    33
        # is active. Presumably other conditions could trigger
452790284a15 tracing: ignore any IOErrors when writing to pipe
Augie Fackler <augie@google.com>
parents: 39282
diff changeset
    34
        # problems too.
452790284a15 tracing: ignore any IOErrors when writing to pipe
Augie Fackler <augie@google.com>
parents: 39282
diff changeset
    35
        try:
452790284a15 tracing: ignore any IOErrors when writing to pipe
Augie Fackler <augie@google.com>
parents: 39282
diff changeset
    36
            _pipe.write('START %s %s\n' % (_session, whence))
452790284a15 tracing: ignore any IOErrors when writing to pipe
Augie Fackler <augie@google.com>
parents: 39282
diff changeset
    37
        except IOError:
452790284a15 tracing: ignore any IOErrors when writing to pipe
Augie Fackler <augie@google.com>
parents: 39282
diff changeset
    38
            pass
39282
284440041141 tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff changeset
    39
        yield
284440041141 tracing: new module to make tracing events in hg easier
Augie Fackler <augie@google.com>
parents:
diff changeset
    40
    finally:
39424
452790284a15 tracing: ignore any IOErrors when writing to pipe
Augie Fackler <augie@google.com>
parents: 39282
diff changeset
    41
        try:
452790284a15 tracing: ignore any IOErrors when writing to pipe
Augie Fackler <augie@google.com>
parents: 39282
diff changeset
    42
            _pipe.write('END %s %s\n' % (_session, whence))
452790284a15 tracing: ignore any IOErrors when writing to pipe
Augie Fackler <augie@google.com>
parents: 39282
diff changeset
    43
        except IOError:
452790284a15 tracing: ignore any IOErrors when writing to pipe
Augie Fackler <augie@google.com>
parents: 39282
diff changeset
    44
            pass