##// END OF EJS Templates
fsmonitor: refresh pywatchman with upstream...
fsmonitor: refresh pywatchman with upstream This commit vendors pywatchman commit 259dc66dc9591f9b7ce76d0275bb1065f390c9b1 from upstream without modifications. The previously vendored pywatchman from changeset 16f4b341288d was from Git commit c77452. This commit effectively undoes the following Mercurial changesets: * dd35abc409ee fsmonitor: correct an error message * b1f62cd39b5c fsmonitor: layer on another hack in bser.c for os.stat() compat (issue5811) * c31ce080eb75 py3: convert arguments, cwd and env to native strings when spawning subprocess * 876494fd967d cleanup: delete lots of unused local variables * 57264906a996 watchman: add the possibility to set the exact watchman binary location The newly-vendored code has support for specifying the binary location, so 57264906a996 does not need applied. But we do need to modify our code to specify a proper argument name. 876494fd967d is not important, so it will be ignored. c31ce080eb75 globally changed the code base to always pass str to subprocess. But pywatchman's code is Python 3 clean, so we don't need to do this. This leaves dd35abc409ee and b1f62cd39b5c, which will be re-applied in subsequent commits. Differential Revision: https://phab.mercurial-scm.org/D7201

File last commit:

r43347:687b865b default
r43703:6469c23a stable
Show More
logtoprocess.py
76 lines | 2.5 KiB | text/x-python | PythonLexer
Martijn Pieters
logtoprocess: new experimental extension...
r28901 # logtoprocess.py - send ui.log() data to a subprocess
#
# Copyright 2016 Facebook, Inc.
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
Jun Wu
logtoprocess: use lowercase for docstring title
r31601 """send ui.log() data to a subprocess (EXPERIMENTAL)
Martijn Pieters
logtoprocess: new experimental extension...
r28901
This extension lets you specify a shell command per ui.log() event,
sending all remaining arguments to as environment variables to that command.
Yuya Nishihara
logtoprocess: drop support for ui.log() call with invalid msg arguments (BC)...
r40656 Positional arguments construct a log message, which is passed in the `MSG1`
environment variables. Each keyword argument is set as a `OPT_UPPERCASE_KEY`
variable (so the key is uppercased, and prefixed with `OPT_`). The original
event name is passed in the `EVENT` environment variable, and the process ID
of mercurial is given in `HGPID`.
Martijn Pieters
logtoprocess: new experimental extension...
r28901
Yuya Nishihara
logtoprocess: drop support for ui.log() call with invalid msg arguments (BC)...
r40656 So given a call `ui.log('foo', 'bar %s\n', 'baz', spam='eggs'), a script
configured for the `foo` event can expect an environment with `MSG1=bar baz`,
and `OPT_SPAM=eggs`.
Martijn Pieters
logtoprocess: new experimental extension...
r28901
Scripts are configured in the `[logtoprocess]` section, each key an event name.
For example::
[logtoprocess]
Yuya Nishihara
logtoprocess: drop support for ui.log() call with invalid msg arguments (BC)...
r40656 commandexception = echo "$MSG1" > /var/log/mercurial_exceptions.log
Martijn Pieters
logtoprocess: new experimental extension...
r28901
would log the warning message and traceback of any failed command dispatch.
Mads Kiilerich
spelling: fixes of non-dictionary words
r30332 Scripts are run asynchronously as detached daemon processes; mercurial will
Martijn Pieters
logtoprocess: new experimental extension...
r28901 not ensure that they exit cleanly.
"""
from __future__ import absolute_import
import os
Pulkit Goyal
py3: replace os.environ with encoding.environ (part 5 of 5)
r30638
Augie Fackler
formatting: blacken the codebase...
r43346 from mercurial.utils import procutil
Matt Harbison
py3: convert arguments, cwd and env to native strings when spawning subprocess...
r39851
Augie Fackler
extensions: change magic "shipped with hg" string...
r29841 # Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
Martijn Pieters
logtoprocess: new experimental extension...
r28901 # 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.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 testedwith = b'ships-with-hg-core'
Martijn Pieters
logtoprocess: new experimental extension...
r28901
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
logtoprocess: extract logger class from ui wrapper...
r40713 class processlogger(object):
"""Map log events to external commands
Arguments are passed on as environment variables.
"""
def __init__(self, ui):
self._scripts = dict(ui.configitems(b'logtoprocess'))
def tracked(self, event):
return bool(self._scripts.get(event))
def log(self, ui, event, msg, opts):
Yuya Nishihara
ui: manage logger instances and event filtering by core ui...
r40761 script = self._scripts[event]
Yuya Nishihara
logtoprocess: extract logger class from ui wrapper...
r40713 env = {
b'EVENT': event,
b'HGPID': os.getpid(),
Yuya Nishihara
ui: pass in formatted message to logger.log()...
r40793 b'MSG1': msg,
Yuya Nishihara
logtoprocess: extract logger class from ui wrapper...
r40713 }
# keyword arguments get prefixed with OPT_ and uppercased
Augie Fackler
formatting: blacken the codebase...
r43346 env.update(
(b'OPT_%s' % key.upper(), value) for key, value in opts.items()
)
Yuya Nishihara
logtoprocess: extract logger class from ui wrapper...
r40713 fullenv = procutil.shellenviron(env)
procutil.runbgcommand(script, fullenv, shell=True)
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
ui: manage logger instances and event filtering by core ui...
r40761 def uipopulate(ui):
ui.setlogger(b'logtoprocess', processlogger(ui))