__init__.py
111 lines
| 3.9 KiB
| text/x-python
|
PythonLexer
Bryan O'Sullivan
|
r6239 | # __init__.py - inotify-based status acceleration for Linux | ||
# | ||||
# Copyright 2006, 2007, 2008 Bryan O'Sullivan <bos@serpentine.com> | ||||
# Copyright 2007, 2008 Brendan Cully <brendan@kublai.com> | ||||
# | ||||
Martin Geisler
|
r8225 | # This software may be used and distributed according to the terms of the | ||
# GNU General Public License version 2, incorporated herein by reference. | ||||
Bryan O'Sullivan
|
r6239 | |||
Dirkjan Ochtman
|
r8932 | '''accelerate status report using Linux's inotify service''' | ||
Bryan O'Sullivan
|
r6239 | |||
# todo: socket permissions | ||||
Martin Geisler
|
r7225 | from mercurial.i18n import _ | ||
Bryan O'Sullivan
|
r6239 | from mercurial import cmdutil, util | ||
Martin Geisler
|
r8656 | import server | ||
Bryan O'Sullivan
|
r6239 | from weakref import proxy | ||
Nicolas Dumazet
|
r8552 | from client import client, QueryFailed | ||
Bryan O'Sullivan
|
r6239 | |||
def serve(ui, repo, **opts): | ||||
'''start an inotify server for this repository''' | ||||
timeout = opts.get('timeout') | ||||
if timeout: | ||||
timeout = float(timeout) * 1e3 | ||||
Benoit Boissinot
|
r8778 | class service(object): | ||
Bryan O'Sullivan
|
r6239 | def init(self): | ||
Benoit Boissinot
|
r6995 | try: | ||
Nicolas Dumazet
|
r8385 | self.master = server.master(ui, repo, timeout) | ||
Benoit Boissinot
|
r6995 | except server.AlreadyStartedException, inst: | ||
raise util.Abort(str(inst)) | ||||
Bryan O'Sullivan
|
r6239 | |||
def run(self): | ||||
try: | ||||
self.master.run() | ||||
finally: | ||||
self.master.shutdown() | ||||
service = service() | ||||
Nicolas Dumazet
|
r8790 | logfile = ui.config('inotify', 'log') | ||
cmdutil.service(opts, initfn=service.init, runfn=service.run, | ||||
logfile=logfile) | ||||
Bryan O'Sullivan
|
r6239 | |||
Nicolas Dumazet
|
r8555 | def debuginotify(ui, repo, **opts): | ||
'''debugging information for inotify extension | ||||
Prints the list of directories being watched by the inotify server. | ||||
''' | ||||
cli = client(ui, repo) | ||||
response = cli.debugquery() | ||||
ui.write(_('directories being watched:\n')) | ||||
for path in response: | ||||
ui.write((' %s/\n') % path) | ||||
Bryan O'Sullivan
|
r6239 | def reposetup(ui, repo): | ||
Brendan Cully
|
r7522 | if not hasattr(repo, 'dirstate'): | ||
Bryan O'Sullivan
|
r6239 | return | ||
# XXX: weakref until hg stops relying on __del__ | ||||
repo = proxy(repo) | ||||
class inotifydirstate(repo.dirstate.__class__): | ||||
Nicolas Dumazet
|
r8556 | # We'll set this to false after an unsuccessful attempt so that | ||
# next calls of status() within the same instance don't try again | ||||
# to start an inotify server if it won't start. | ||||
_inotifyon = True | ||||
Matt Mackall
|
r6753 | def status(self, match, ignored, clean, unknown=True): | ||
Matt Mackall
|
r6603 | files = match.files() | ||
Brendan Cully
|
r7393 | if '.' in files: | ||
Dirkjan Ochtman
|
r7434 | files = [] | ||
Nicolas Dumazet
|
r8557 | if self._inotifyon and not ignored: | ||
Nicolas Dumazet
|
r8552 | cli = client(ui, repo) | ||
try: | ||||
Nicolas Dumazet
|
r8551 | result = cli.statusquery(files, match, False, | ||
Nicolas Dumazet
|
r8552 | clean, unknown) | ||
except QueryFailed, instr: | ||||
ui.debug(str(instr)) | ||||
Nicolas Dumazet
|
r8556 | # don't retry within the same hg instance | ||
inotifydirstate._inotifyon = False | ||||
Nicolas Dumazet
|
r8552 | pass | ||
else: | ||||
if ui.config('inotify', 'debug'): | ||||
Matt Mackall
|
r7219 | r2 = super(inotifydirstate, self).status( | ||
match, False, clean, unknown) | ||||
for c,a,b in zip('LMARDUIC', result, r2): | ||||
for f in a: | ||||
if f not in b: | ||||
ui.warn('*** inotify: %s +%s\n' % (c, f)) | ||||
for f in b: | ||||
if f not in a: | ||||
Benoit Boissinot
|
r7304 | ui.warn('*** inotify: %s -%s\n' % (c, f)) | ||
Matt Mackall
|
r7219 | result = r2 | ||
Nicolas Dumazet
|
r8552 | return result | ||
Bryan O'Sullivan
|
r6239 | return super(inotifydirstate, self).status( | ||
Matt Mackall
|
r6753 | match, ignored, clean, unknown) | ||
Bryan O'Sullivan
|
r6239 | |||
repo.dirstate.__class__ = inotifydirstate | ||||
cmdtable = { | ||||
Nicolas Dumazet
|
r8555 | 'debuginotify': | ||
(debuginotify, [], ('hg debuginotify')), | ||||
Bryan O'Sullivan
|
r6239 | '^inserve': | ||
Nicolas Dumazet
|
r8555 | (serve, | ||
[('d', 'daemon', None, _('run server in background')), | ||||
('', 'daemon-pipefds', '', _('used internally by daemon mode')), | ||||
('t', 'idle-timeout', '', _('minutes to sit idle before exiting')), | ||||
('', 'pid-file', '', _('name of file to write process ID to'))], | ||||
Martin Geisler
|
r8947 | _('hg inserve [OPTION]...')), | ||
Bryan O'Sullivan
|
r6239 | } | ||