logtoprocess.py
76 lines
| 2.7 KiB
| text/x-python
|
PythonLexer
/ hgext / logtoprocess.py
Martijn Pieters
|
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
|
r31601 | """send ui.log() data to a subprocess (EXPERIMENTAL) | ||
Martijn Pieters
|
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
|
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
|
r28901 | |||
Yuya Nishihara
|
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
|
r28901 | |||
Scripts are configured in the `[logtoprocess]` section, each key an event name. | ||||
For example:: | ||||
[logtoprocess] | ||||
Yuya Nishihara
|
r40656 | commandexception = echo "$MSG1" > /var/log/mercurial_exceptions.log | ||
Martijn Pieters
|
r28901 | |||
would log the warning message and traceback of any failed command dispatch. | ||||
Mads Kiilerich
|
r30332 | Scripts are run asynchronously as detached daemon processes; mercurial will | ||
Martijn Pieters
|
r28901 | not ensure that they exit cleanly. | ||
""" | ||||
from __future__ import absolute_import | ||||
import os | ||||
Pulkit Goyal
|
r30638 | |||
Yuya Nishihara
|
r40654 | from mercurial import ( | ||
pycompat, | ||||
) | ||||
Matt Harbison
|
r39851 | from mercurial.utils import ( | ||
procutil, | ||||
) | ||||
Augie Fackler
|
r29841 | # Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for | ||
Martijn Pieters
|
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
|
r29841 | testedwith = 'ships-with-hg-core' | ||
Martijn Pieters
|
r28901 | |||
def uisetup(ui): | ||||
class logtoprocessui(ui.__class__): | ||||
def log(self, event, *msg, **opts): | ||||
"""Map log events to external commands | ||||
Arguments are passed on as environment variables. | ||||
""" | ||||
Jun Wu
|
r29463 | script = self.config('logtoprocess', event) | ||
Martijn Pieters
|
r28901 | if script: | ||
Yuya Nishihara
|
r40654 | env = { | ||
b'EVENT': event, | ||||
b'HGPID': os.getpid(), | ||||
Yuya Nishihara
|
r40656 | b'MSG1': msg[0] % msg[1:], | ||
Yuya Nishihara
|
r40654 | } | ||
Martijn Pieters
|
r28901 | # keyword arguments get prefixed with OPT_ and uppercased | ||
Yuya Nishihara
|
r40654 | env.update((b'OPT_%s' % key.upper(), value) | ||
for key, value in pycompat.byteskwargs(opts).items()) | ||||
Yuya Nishihara
|
r40653 | fullenv = procutil.shellenviron(env) | ||
procutil.runbgcommand(script, fullenv, shell=True) | ||||
Martijn Pieters
|
r28901 | return super(logtoprocessui, self).log(event, *msg, **opts) | ||
# Replace the class for this instance and all clones created from it: | ||||
ui.__class__ = logtoprocessui | ||||