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