Mercurial > hg
annotate hgext/inotify/__init__.py @ 6995:25619b72f86a
inotify: fix traceback when the server has been already started
author | Benoit Boissinot <benoit.boissinot@ens-lyon.org> |
---|---|
date | Sat, 06 Sep 2008 12:48:52 +0200 |
parents | 39cfcef4f463 |
children | fecf060f32a1 |
rev | line source |
---|---|
6239 | 1 # __init__.py - inotify-based status acceleration for Linux |
2 # | |
3 # Copyright 2006, 2007, 2008 Bryan O'Sullivan <bos@serpentine.com> | |
4 # Copyright 2007, 2008 Brendan Cully <brendan@kublai.com> | |
5 # | |
6 # This software may be used and distributed according to the terms | |
7 # of the GNU General Public License, incorporated herein by reference. | |
8 | |
9 '''inotify-based status acceleration for Linux systems | |
10 ''' | |
11 | |
12 # todo: socket permissions | |
13 | |
14 from mercurial.i18n import gettext as _ | |
15 from mercurial import cmdutil, util | |
16 import client, errno, os, server, socket | |
17 from weakref import proxy | |
18 | |
19 def serve(ui, repo, **opts): | |
20 '''start an inotify server for this repository''' | |
21 timeout = opts.get('timeout') | |
22 if timeout: | |
23 timeout = float(timeout) * 1e3 | |
24 | |
25 class service: | |
26 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
|
27 try: |
25619b72f86a
inotify: fix traceback when the server has been already started
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
6239
diff
changeset
|
28 self.master = server.Master(ui, repo, timeout) |
25619b72f86a
inotify: fix traceback when the server has been already started
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
6239
diff
changeset
|
29 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
|
30 raise util.Abort(str(inst)) |
6239 | 31 |
32 def run(self): | |
33 try: | |
34 self.master.run() | |
35 finally: | |
36 self.master.shutdown() | |
37 | |
38 service = service() | |
39 cmdutil.service(opts, initfn=service.init, runfn=service.run) | |
40 | |
41 def reposetup(ui, repo): | |
42 if not repo.local(): | |
43 return | |
44 | |
45 # XXX: weakref until hg stops relying on __del__ | |
46 repo = proxy(repo) | |
47 | |
48 class inotifydirstate(repo.dirstate.__class__): | |
49 # Set to True if we're the inotify server, so we don't attempt | |
50 # to recurse. | |
51 inotifyserver = False | |
52 | |
53 def status(self, files, match, list_ignored, list_clean, | |
54 list_unknown=True): | |
55 try: | |
56 if not list_ignored and not self.inotifyserver: | |
57 result = client.query(ui, repo, files, match, False, | |
58 list_clean, list_unknown) | |
59 if result is not None: | |
60 return result | |
61 except socket.error, err: | |
62 if err[0] == errno.ECONNREFUSED: | |
63 ui.warn(_('(found dead inotify server socket; ' | |
64 'removing it)\n')) | |
65 os.unlink(repo.join('inotify.sock')) | |
66 elif err[0] != errno.ENOENT: | |
67 raise | |
68 if ui.configbool('inotify', 'autostart'): | |
69 query = None | |
70 ui.debug(_('(starting inotify server)\n')) | |
71 try: | |
72 server.start(ui, repo) | |
73 query = client.query | |
74 except server.AlreadyStartedException, inst: | |
75 # another process may have started its own | |
76 # inotify server while this one was starting. | |
77 ui.debug(str(inst)) | |
78 query = client.query | |
79 except Exception, inst: | |
80 ui.warn(_('could not start inotify server: ' | |
81 '%s\n') % inst) | |
82 ui.print_exc() | |
83 | |
84 if query: | |
85 try: | |
86 return query(ui, repo, files or [], match, | |
87 list_ignored, list_clean, list_unknown) | |
88 except socket.error, err: | |
89 ui.warn(_('could not talk to new inotify ' | |
90 'server: %s\n') % err[1]) | |
91 ui.print_exc() | |
92 | |
93 return super(inotifydirstate, self).status( | |
94 files, match or util.always, list_ignored, list_clean, | |
95 list_unknown) | |
96 | |
97 repo.dirstate.__class__ = inotifydirstate | |
98 | |
99 cmdtable = { | |
100 '^inserve': | |
101 (serve, | |
102 [('d', 'daemon', None, _('run server in background')), | |
103 ('', 'daemon-pipefds', '', _('used internally by daemon mode')), | |
104 ('t', 'idle-timeout', '', _('minutes to sit idle before exiting')), | |
105 ('', 'pid-file', '', _('name of file to write process ID to'))], | |
106 _('hg inserve [OPT]...')), | |
107 } |