hgext/inotify/__init__.py
author Martin Geisler <mg@lazybytes.net>
Thu, 11 Jun 2009 17:19:48 +0200
changeset 8781 385a2d94885e
parent 8778 c5f36402daad
child 8790 72af80052bd9
permissions -rw-r--r--
hgrc.5: fix quoting of literal strings The quotes would go wrong in many places due to differences between asciidoc version 8.2.7 used by Benoit and 8.4.5 used by me. Between those versions asciidoc stopped interpreting the content of `quoted strings`, and so `*` would start bold text in the old version, but do nothing in the new version. To complicate things further, `\*` would escape the bold tag in the old version, but in the new version the backslash was inserted literally into the output (because the backtick quotes it). I've now replaced backticks with non-quoting plusses and escaped backslashes as appropriate.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6239
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
     1
# __init__.py - inotify-based status acceleration for Linux
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
     2
#
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
     3
# Copyright 2006, 2007, 2008 Bryan O'Sullivan <bos@serpentine.com>
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
     4
# Copyright 2007, 2008 Brendan Cully <brendan@kublai.com>
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
     5
#
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8206
diff changeset
     6
# This software may be used and distributed according to the terms of the
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8206
diff changeset
     7
# GNU General Public License version 2, incorporated herein by reference.
6239
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
     8
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
     9
'''inotify-based status acceleration for Linux systems
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    10
'''
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    11
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    12
# todo: socket permissions
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    13
7225
59b4ae211584 i18n: import _ instead of gettext
Martin Geisler <mg@daimi.au.dk>
parents: 7219
diff changeset
    14
from mercurial.i18n import _
6239
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    15
from mercurial import cmdutil, util
8656
284fda4cd093 removed unused imports
Martin Geisler <mg@lazybytes.net>
parents: 8557
diff changeset
    16
import server
6239
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    17
from weakref import proxy
8552
06561793778e inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8551
diff changeset
    18
from client import client, QueryFailed
6239
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    19
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    20
def serve(ui, repo, **opts):
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    21
    '''start an inotify server for this repository'''
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    22
    timeout = opts.get('timeout')
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    23
    if timeout:
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    24
        timeout = float(timeout) * 1e3
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    25
8778
c5f36402daad use new style classes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8656
diff changeset
    26
    class service(object):
6239
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    27
        def init(self):
6995
25619b72f86a inotify: fix traceback when the server has been already started
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6239
diff changeset
    28
            try:
8385
1536501ade62 inotify: Coding Style: name classes in lowercase.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8225
diff changeset
    29
                self.master = server.master(ui, repo, timeout)
6995
25619b72f86a inotify: fix traceback when the server has been already started
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6239
diff changeset
    30
            except server.AlreadyStartedException, inst:
25619b72f86a inotify: fix traceback when the server has been already started
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6239
diff changeset
    31
                raise util.Abort(str(inst))
6239
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    32
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    33
        def run(self):
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    34
            try:
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    35
                self.master.run()
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    36
            finally:
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    37
                self.master.shutdown()
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    38
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    39
    service = service()
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    40
    cmdutil.service(opts, initfn=service.init, runfn=service.run)
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    41
8555
3e09bc5fee12 inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8552
diff changeset
    42
def debuginotify(ui, repo, **opts):
3e09bc5fee12 inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8552
diff changeset
    43
    '''debugging information for inotify extension
3e09bc5fee12 inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8552
diff changeset
    44
3e09bc5fee12 inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8552
diff changeset
    45
    Prints the list of directories being watched by the inotify server.
3e09bc5fee12 inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8552
diff changeset
    46
    '''
3e09bc5fee12 inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8552
diff changeset
    47
    cli = client(ui, repo)
3e09bc5fee12 inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8552
diff changeset
    48
    response = cli.debugquery()
3e09bc5fee12 inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8552
diff changeset
    49
3e09bc5fee12 inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8552
diff changeset
    50
    ui.write(_('directories being watched:\n'))
3e09bc5fee12 inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8552
diff changeset
    51
    for path in response:
3e09bc5fee12 inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8552
diff changeset
    52
        ui.write(('  %s/\n') % path)
3e09bc5fee12 inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8552
diff changeset
    53
6239
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    54
def reposetup(ui, repo):
7522
2f4a399a8787 inotify: do not attempt to monkeypatch bundlerepos
Brendan Cully <brendan@kublai.com>
parents: 7452
diff changeset
    55
    if not hasattr(repo, 'dirstate'):
6239
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    56
        return
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    57
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    58
    # XXX: weakref until hg stops relying on __del__
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    59
    repo = proxy(repo)
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    60
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    61
    class inotifydirstate(repo.dirstate.__class__):
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    62
8556
f5fae700cc00 inotify: set a flag so a failed inotify query doesn't get repeated.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8555
diff changeset
    63
        # We'll set this to false after an unsuccessful attempt so that
f5fae700cc00 inotify: set a flag so a failed inotify query doesn't get repeated.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8555
diff changeset
    64
        # next calls of status() within the same instance don't try again
f5fae700cc00 inotify: set a flag so a failed inotify query doesn't get repeated.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8555
diff changeset
    65
        # to start an inotify server if it won't start.
f5fae700cc00 inotify: set a flag so a failed inotify query doesn't get repeated.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8555
diff changeset
    66
        _inotifyon = True
f5fae700cc00 inotify: set a flag so a failed inotify query doesn't get repeated.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8555
diff changeset
    67
6753
ed5ffb2c12f3 repo.status: eliminate list_
Matt Mackall <mpm@selenic.com>
parents: 6603
diff changeset
    68
        def status(self, match, ignored, clean, unknown=True):
6603
41eb20cc1c02 match: remove files arg from repo.status and friends
Matt Mackall <mpm@selenic.com>
parents: 6239
diff changeset
    69
            files = match.files()
7393
92c952c4470c inotify: fix status . in repo.root
Brendan Cully <brendan@kublai.com>
parents: 7329
diff changeset
    70
            if '.' in files:
7434
cf7741aa1e96 kill some trailing spaces
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7393
diff changeset
    71
                files = []
8557
67f76a4463ef inotify: Removing the unnecessary "inotifyserver" class variable.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8556
diff changeset
    72
            if self._inotifyon and not ignored:
8552
06561793778e inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8551
diff changeset
    73
                cli = client(ui, repo)
06561793778e inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8551
diff changeset
    74
                try:
8551
7089d9727867 inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8385
diff changeset
    75
                    result = cli.statusquery(files, match, False,
8552
06561793778e inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8551
diff changeset
    76
                                            clean, unknown)
06561793778e inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8551
diff changeset
    77
                except QueryFailed, instr:
06561793778e inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8551
diff changeset
    78
                    ui.debug(str(instr))
8556
f5fae700cc00 inotify: set a flag so a failed inotify query doesn't get repeated.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8555
diff changeset
    79
                    # don't retry within the same hg instance
f5fae700cc00 inotify: set a flag so a failed inotify query doesn't get repeated.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8555
diff changeset
    80
                    inotifydirstate._inotifyon = False
8552
06561793778e inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8551
diff changeset
    81
                    pass
06561793778e inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8551
diff changeset
    82
                else:
06561793778e inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8551
diff changeset
    83
                    if ui.config('inotify', 'debug'):
7219
1f6d2e487135 inotify: add debugging mode to inotify
Matt Mackall <mpm@selenic.com>
parents: 7218
diff changeset
    84
                        r2 = super(inotifydirstate, self).status(
1f6d2e487135 inotify: add debugging mode to inotify
Matt Mackall <mpm@selenic.com>
parents: 7218
diff changeset
    85
                            match, False, clean, unknown)
1f6d2e487135 inotify: add debugging mode to inotify
Matt Mackall <mpm@selenic.com>
parents: 7218
diff changeset
    86
                        for c,a,b in zip('LMARDUIC', result, r2):
1f6d2e487135 inotify: add debugging mode to inotify
Matt Mackall <mpm@selenic.com>
parents: 7218
diff changeset
    87
                            for f in a:
1f6d2e487135 inotify: add debugging mode to inotify
Matt Mackall <mpm@selenic.com>
parents: 7218
diff changeset
    88
                                if f not in b:
1f6d2e487135 inotify: add debugging mode to inotify
Matt Mackall <mpm@selenic.com>
parents: 7218
diff changeset
    89
                                    ui.warn('*** inotify: %s +%s\n' % (c, f))
1f6d2e487135 inotify: add debugging mode to inotify
Matt Mackall <mpm@selenic.com>
parents: 7218
diff changeset
    90
                            for f in b:
1f6d2e487135 inotify: add debugging mode to inotify
Matt Mackall <mpm@selenic.com>
parents: 7218
diff changeset
    91
                                if f not in a:
7304
68374f1c8c87 inotify: fix bug in formatting
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7225
diff changeset
    92
                                    ui.warn('*** inotify: %s -%s\n' % (c, f))
7219
1f6d2e487135 inotify: add debugging mode to inotify
Matt Mackall <mpm@selenic.com>
parents: 7218
diff changeset
    93
                        result = r2
8552
06561793778e inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8551
diff changeset
    94
                    return result
6239
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    95
            return super(inotifydirstate, self).status(
6753
ed5ffb2c12f3 repo.status: eliminate list_
Matt Mackall <mpm@selenic.com>
parents: 6603
diff changeset
    96
                match, ignored, clean, unknown)
6239
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    97
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    98
    repo.dirstate.__class__ = inotifydirstate
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    99
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   100
cmdtable = {
8555
3e09bc5fee12 inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8552
diff changeset
   101
    'debuginotify':
3e09bc5fee12 inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8552
diff changeset
   102
        (debuginotify, [], ('hg debuginotify')),
6239
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   103
    '^inserve':
8555
3e09bc5fee12 inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8552
diff changeset
   104
        (serve,
3e09bc5fee12 inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8552
diff changeset
   105
         [('d', 'daemon', None, _('run server in background')),
3e09bc5fee12 inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8552
diff changeset
   106
          ('', 'daemon-pipefds', '', _('used internally by daemon mode')),
3e09bc5fee12 inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8552
diff changeset
   107
          ('t', 'idle-timeout', '', _('minutes to sit idle before exiting')),
3e09bc5fee12 inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8552
diff changeset
   108
          ('', 'pid-file', '', _('name of file to write process ID to'))],
3e09bc5fee12 inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8552
diff changeset
   109
         _('hg inserve [OPT]...')),
6239
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
   110
    }