##// END OF EJS Templates
narrow: send specs as bundle2 data instead of param (issue5952) (issue6019)...
narrow: send specs as bundle2 data instead of param (issue5952) (issue6019) Before this patch, when ACL is involved, narrowspecs are send as bundle2 parameter for narrow:spec bundle2 part. The limitation of bundle2 parts are they cannot send data larger than 255 bytes. Includes and excludes in narrow are not limited by size and they can grow over 255 bytes. This patch start sending them as bundle2 data. After this change, we try to read specs both from parameters and data, making it compatible with older servers. Differential Revision: https://phab.mercurial-scm.org/D6218

File last commit:

r40794:691c68bc default
r42307:8a37c9b6 default
Show More
logtoprocess.py
75 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
Matt Harbison
py3: convert arguments, cwd and env to native strings when spawning subprocess...
r39851 from mercurial.utils import (
procutil,
)
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
extensions: change magic "shipped with hg" string...
r29841 testedwith = 'ships-with-hg-core'
Martijn Pieters
logtoprocess: new experimental extension...
r28901
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
env.update((b'OPT_%s' % key.upper(), value)
Yuya Nishihara
ui: pass in bytes opts dict to logger.log()...
r40794 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)
Yuya Nishihara
ui: manage logger instances and event filtering by core ui...
r40761 def uipopulate(ui):
ui.setlogger(b'logtoprocess', processlogger(ui))