##// END OF EJS Templates
git: skeleton of a new extension to _directly_ operate on git repos...
git: skeleton of a new extension to _directly_ operate on git repos This is based in part of work I did years ago in hgit, but it's mostly new code since I'm using pygit2 instead of dulwich and the hg storage interfaces have improved. Some cleanup of old hgit code by Pulkit, which I greatly appreciate. test-git-interop.t does not cover a whole lot of cases, but it passes. It includes status, diff, making a new commit, and `hg annotate` working on the git repository. This is _not_ (yet) production quality code: this is an experiment. Known technical debt lurking in this implementation: * Writing bookmarks just totally ignores transactions. * The way progress is threaded down into the gitstore is awful. * Ideally we'd find a way to incrementally reindex DAGs. I'm not sure how to do that efficiently, so we might need a "known only fast-forwards" mode on the DAG indexer for use on `hg commit` and friends. * We don't even _try_ to do anything reasonable for `hg pull` or `hg push`. * Mercurial need an interface for the changelog type. Tests currently require git 2.24 as far as I'm aware: `git status` has some changed output that I didn't try and handle in a compatible way. This patch has produced some interesting cleanups, most recently on the manifest type. I expect continuing down this road will produce other meritorious cleanups throughout our code. Differential Revision: https://phab.mercurial-scm.org/D6734

File last commit:

r44900:69392460 default
r44961:ad718271 default
Show More
logtoprocess.py
83 lines | 2.8 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]
Valentin Gatien-Baron
logtoprocess: avoid traceback when running long commands...
r44904 maxmsg = 100000
if len(msg) > maxmsg:
# Each env var has a 128KiB limit on linux. msg can be long, in
# particular for command event, where it's the full command line.
# Prefer truncating the message than raising "Argument list too
# long" error.
msg = msg[:maxmsg] + b' (truncated)'
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))