annotate hgext/inotify/__init__.py @ 8556:f5fae700cc00

inotify: set a flag so a failed inotify query doesn't get repeated. If, for some reason, we can't get the inotify server to start, it's better to disable inotify queries for the instance to avoid trying over and over to start the server, which takes time. Just fall back on repo.status()
author Nicolas Dumazet <nicdumz.commits@gmail.com>
date Wed, 06 May 2009 01:40:03 +0900
parents 3e09bc5fee12
children 67f76a4463ef
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
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
8552
06561793778e inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8551
diff changeset
16 import os, 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
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
26 class service:
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 # Set to True if we're the inotify server, so we don't attempt
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
63 # to recurse.
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
64 inotifyserver = False
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
65
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
66 # 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
67 # 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
68 # 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
69 _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
70
6753
ed5ffb2c12f3 repo.status: eliminate list_
Matt Mackall <mpm@selenic.com>
parents: 6603
diff changeset
71 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
72 files = match.files()
7393
92c952c4470c inotify: fix status . in repo.root
Brendan Cully <brendan@kublai.com>
parents: 7329
diff changeset
73 if '.' in files:
7434
cf7741aa1e96 kill some trailing spaces
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7393
diff changeset
74 files = []
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
75 if self._inotifyon and not ignored and not self.inotifyserver:
8552
06561793778e inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8551
diff changeset
76 cli = client(ui, repo)
06561793778e inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8551
diff changeset
77 try:
8551
7089d9727867 inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8385
diff changeset
78 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
79 clean, unknown)
06561793778e inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8551
diff changeset
80 except QueryFailed, instr:
06561793778e inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8551
diff changeset
81 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
82 # 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
83 inotifydirstate._inotifyon = False
8552
06561793778e inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8551
diff changeset
84 pass
06561793778e inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8551
diff changeset
85 else:
06561793778e inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8551
diff changeset
86 if ui.config('inotify', 'debug'):
7219
1f6d2e487135 inotify: add debugging mode to inotify
Matt Mackall <mpm@selenic.com>
parents: 7218
diff changeset
87 r2 = super(inotifydirstate, self).status(
1f6d2e487135 inotify: add debugging mode to inotify
Matt Mackall <mpm@selenic.com>
parents: 7218
diff changeset
88 match, False, clean, unknown)
1f6d2e487135 inotify: add debugging mode to inotify
Matt Mackall <mpm@selenic.com>
parents: 7218
diff changeset
89 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
90 for f in a:
1f6d2e487135 inotify: add debugging mode to inotify
Matt Mackall <mpm@selenic.com>
parents: 7218
diff changeset
91 if f not in b:
1f6d2e487135 inotify: add debugging mode to inotify
Matt Mackall <mpm@selenic.com>
parents: 7218
diff changeset
92 ui.warn('*** inotify: %s +%s\n' % (c, f))
1f6d2e487135 inotify: add debugging mode to inotify
Matt Mackall <mpm@selenic.com>
parents: 7218
diff changeset
93 for f in b:
1f6d2e487135 inotify: add debugging mode to inotify
Matt Mackall <mpm@selenic.com>
parents: 7218
diff changeset
94 if f not in a:
7304
68374f1c8c87 inotify: fix bug in formatting
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7225
diff changeset
95 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
96 result = r2
8552
06561793778e inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8551
diff changeset
97 return result
6239
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
98 return super(inotifydirstate, self).status(
6753
ed5ffb2c12f3 repo.status: eliminate list_
Matt Mackall <mpm@selenic.com>
parents: 6603
diff changeset
99 match, ignored, clean, unknown)
6239
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
100
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
101 repo.dirstate.__class__ = inotifydirstate
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
102
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
103 cmdtable = {
8555
3e09bc5fee12 inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8552
diff changeset
104 'debuginotify':
3e09bc5fee12 inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8552
diff changeset
105 (debuginotify, [], ('hg debuginotify')),
6239
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
106 '^inserve':
8555
3e09bc5fee12 inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8552
diff changeset
107 (serve,
3e09bc5fee12 inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8552
diff changeset
108 [('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
109 ('', '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
110 ('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
111 ('', '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
112 _('hg inserve [OPT]...')),
6239
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
113 }