__init__.py
90 lines
| 3.3 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 | ||
Matt Mackall
|
r10263 | # GNU General Public License version 2 or any later version. | ||
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 _ | ||
Augie Fackler
|
r14945 | from mercurial import util | ||
Martin Geisler
|
r8656 | import server | ||
Nicolas Dumazet
|
r8552 | from client import client, QueryFailed | ||
Bryan O'Sullivan
|
r6239 | |||
def serve(ui, repo, **opts): | ||||
'''start an inotify server for this repository''' | ||||
Nicolas Dumazet
|
r9514 | server.start(ui, repo.dirstate, repo.root, opts) | ||
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): | ||
Augie Fackler
|
r14945 | if not util.safehasattr(repo, 'dirstate'): | ||
Bryan O'Sullivan
|
r6239 | return | ||
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 | ||||
Greg Ward
|
r10605 | def status(self, match, subrepos, ignored, clean, unknown): | ||
Matt Mackall
|
r6603 | files = match.files() | ||
Brendan Cully
|
r7393 | if '.' in files: | ||
Dirkjan Ochtman
|
r7434 | files = [] | ||
Augie Fackler
|
r10176 | if self._inotifyon and not ignored and not subrepos and not self._dirty: | ||
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( | ||
Benoit Boissinot
|
r10493 | match, [], False, clean, unknown) | ||
Matt Mackall
|
r10282 | for c, a, b in zip('LMARDUIC', result, r2): | ||
Matt Mackall
|
r7219 | 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( | ||
Augie Fackler
|
r10176 | match, subrepos, 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')), | ||||
FUJIWARA Katsunori
|
r11321 | ('', 'daemon-pipefds', '', | ||
_('used internally by daemon mode'), _('NUM')), | ||||
('t', 'idle-timeout', '', | ||||
_('minutes to sit idle before exiting'), _('NUM')), | ||||
('', 'pid-file', '', | ||||
_('name of file to write process ID to'), _('FILE'))], | ||||
Martin Geisler
|
r8947 | _('hg inserve [OPTION]...')), | ||
Bryan O'Sullivan
|
r6239 | } | ||