Mercurial > hg
annotate hgext/inotify/client.py @ 10428:e553a425751d stable
convert: differentiate between IOError and OSError on commitctx()
The IOError exception is overloaded to mean 'this file was deleted in
the current commit'. Separate the code that handles IOError and file
deletion from general OSError exceptions. The latter are real errors,
but IOError is not always a throwable error.
This solves the accidental marking of files as 'deleted' in commits that
try to write for example in .hg/store/data revlogs that the current user
has no permission to modify (a normal OSError that should abort the
current commit).
Changed by pmezard: use getattr() to be on the safe side.
author | Giorgos Keramidas <keramida@ceid.upatras.gr> |
---|---|
date | Thu, 11 Feb 2010 23:15:42 +0200 |
parents | 25e572394f5c |
children | 08a0f04b56bd |
rev | line source |
---|---|
6239 | 1 # client.py - inotify status client |
2 # | |
3 # Copyright 2006, 2007, 2008 Bryan O'Sullivan <bos@serpentine.com> | |
4 # Copyright 2007, 2008 Brendan Cully <brendan@kublai.com> | |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
5 # Copyright 2009 Nicolas Dumazet <nicdumz@gmail.com> |
6239 | 6 # |
8225
46293a0c7e9f
updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents:
8067
diff
changeset
|
7 # This software may be used and distributed according to the terms of the |
10263 | 8 # GNU General Public License version 2 or any later version. |
6239 | 9 |
7225
59b4ae211584
i18n: import _ instead of gettext
Martin Geisler <mg@daimi.au.dk>
parents:
7145
diff
changeset
|
10 from mercurial.i18n import _ |
8552
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
11 import common, server |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
12 import errno, os, socket, struct |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
13 |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
14 class QueryFailed(Exception): pass |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
15 |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
16 def start_server(function): |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
17 """ |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
18 Decorator. |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
19 Tries to call function, if it fails, try to (re)start inotify server. |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
20 Raise QueryFailed if something went wrong |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
21 """ |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
22 def decorated_function(self, *args): |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
23 result = None |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
24 try: |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
25 return function(self, *args) |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
26 except (OSError, socket.error), err: |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
27 autostart = self.ui.configbool('inotify', 'autostart', True) |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
28 |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
29 if err[0] == errno.ECONNREFUSED: |
9900
8939900073a8
inotify: improve error messages
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9854
diff
changeset
|
30 self.ui.warn(_('inotify-client: found dead inotify server ' |
8939900073a8
inotify: improve error messages
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9854
diff
changeset
|
31 'socket; removing it\n')) |
9351
206f7f4c5c2a
inotify: client: no repo use
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8788
diff
changeset
|
32 os.unlink(os.path.join(self.root, '.hg', 'inotify.sock')) |
8552
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
33 if err[0] in (errno.ECONNREFUSED, errno.ENOENT) and autostart: |
9467
4c041f1ee1b4
do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents:
9351
diff
changeset
|
34 self.ui.debug('(starting inotify server)\n') |
8552
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
35 try: |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
36 try: |
9514
7c01599dd340
inotify: use cmdutil.service instead of local daemonizing code
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9467
diff
changeset
|
37 server.start(self.ui, self.dirstate, self.root, |
7c01599dd340
inotify: use cmdutil.service instead of local daemonizing code
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9467
diff
changeset
|
38 dict(daemon=True, daemon_pipefds='')) |
8552
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
39 except server.AlreadyStartedException, inst: |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
40 # another process may have started its own |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
41 # inotify server while this one was starting. |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
42 self.ui.debug(str(inst)) |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
43 except Exception, inst: |
9900
8939900073a8
inotify: improve error messages
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9854
diff
changeset
|
44 self.ui.warn(_('inotify-client: could not start inotify ' |
8939900073a8
inotify: improve error messages
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9854
diff
changeset
|
45 'server: %s\n') % inst) |
8552
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
46 else: |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
47 try: |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
48 return function(self, *args) |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
49 except socket.error, err: |
9900
8939900073a8
inotify: improve error messages
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9854
diff
changeset
|
50 self.ui.warn(_('inotify-client: could not talk to new ' |
8939900073a8
inotify: improve error messages
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9854
diff
changeset
|
51 'inotify server: %s\n') % err[-1]) |
8552
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
52 elif err[0] in (errno.ECONNREFUSED, errno.ENOENT): |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
53 # silently ignore normal errors if autostart is False |
9467
4c041f1ee1b4
do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents:
9351
diff
changeset
|
54 self.ui.debug('(inotify server not running)\n') |
8552
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
55 else: |
9900
8939900073a8
inotify: improve error messages
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9854
diff
changeset
|
56 self.ui.warn(_('inotify-client: failed to contact inotify ' |
8939900073a8
inotify: improve error messages
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9854
diff
changeset
|
57 'server: %s\n') % err[-1]) |
8552
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
58 |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
59 self.ui.traceback() |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
60 raise QueryFailed('inotify query failed') |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
61 |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
62 return decorated_function |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
63 |
6239 | 64 |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
65 class client(object): |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
66 def __init__(self, ui, repo): |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
67 self.ui = ui |
9351
206f7f4c5c2a
inotify: client: no repo use
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8788
diff
changeset
|
68 self.dirstate = repo.dirstate |
206f7f4c5c2a
inotify: client: no repo use
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8788
diff
changeset
|
69 self.root = repo.root |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
70 self.sock = socket.socket(socket.AF_UNIX) |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
71 |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
72 def _connect(self): |
9351
206f7f4c5c2a
inotify: client: no repo use
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8788
diff
changeset
|
73 sockpath = os.path.join(self.root, '.hg', 'inotify.sock') |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
74 try: |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
75 self.sock.connect(sockpath) |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
76 except socket.error, err: |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
77 if err[0] == "AF_UNIX path too long": |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
78 sockpath = os.readlink(sockpath) |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
79 self.sock.connect(sockpath) |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
80 else: |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
81 raise |
6239 | 82 |
8553
e387ecd7a6ed
inotify: change protocol so that different query types can be supported.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
83 def _send(self, type, data): |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
84 """Sends protocol version number, and the data""" |
8553
e387ecd7a6ed
inotify: change protocol so that different query types can be supported.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
85 self.sock.sendall(chr(common.version) + type + data) |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
86 |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
87 self.sock.shutdown(socket.SHUT_WR) |
6239 | 88 |
8553
e387ecd7a6ed
inotify: change protocol so that different query types can be supported.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
89 def _receive(self, type): |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
90 """ |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
91 Read data, check version number, extract headers, |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
92 and returns a tuple (data descriptor, header) |
8552
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
93 Raises QueryFailed on error |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
94 """ |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
95 cs = common.recvcs(self.sock) |
8788
5d8021ac0e19
inotify: raise QueryFailed when the server crash
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8555
diff
changeset
|
96 try: |
5d8021ac0e19
inotify: raise QueryFailed when the server crash
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8555
diff
changeset
|
97 version = ord(cs.read(1)) |
5d8021ac0e19
inotify: raise QueryFailed when the server crash
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8555
diff
changeset
|
98 except TypeError: |
5d8021ac0e19
inotify: raise QueryFailed when the server crash
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8555
diff
changeset
|
99 # empty answer, assume the server crashed |
9900
8939900073a8
inotify: improve error messages
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9854
diff
changeset
|
100 self.ui.warn(_('inotify-client: received empty answer from inotify ' |
8939900073a8
inotify: improve error messages
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9854
diff
changeset
|
101 'server')) |
8788
5d8021ac0e19
inotify: raise QueryFailed when the server crash
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8555
diff
changeset
|
102 raise QueryFailed('server crashed') |
5d8021ac0e19
inotify: raise QueryFailed when the server crash
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8555
diff
changeset
|
103 |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
104 if version != common.version: |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
105 self.ui.warn(_('(inotify: received response from incompatible ' |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
106 'server version %d)\n') % version) |
8552
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
107 raise QueryFailed('incompatible server version') |
6239 | 108 |
8553
e387ecd7a6ed
inotify: change protocol so that different query types can be supported.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
109 readtype = cs.read(4) |
e387ecd7a6ed
inotify: change protocol so that different query types can be supported.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
110 if readtype != type: |
e387ecd7a6ed
inotify: change protocol so that different query types can be supported.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
111 self.ui.warn(_('(inotify: received \'%s\' response when expecting' |
e387ecd7a6ed
inotify: change protocol so that different query types can be supported.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
112 ' \'%s\')\n') % (readtype, type)) |
e387ecd7a6ed
inotify: change protocol so that different query types can be supported.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
113 raise QueryFailed('wrong response type') |
e387ecd7a6ed
inotify: change protocol so that different query types can be supported.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
114 |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
115 hdrfmt = common.resphdrfmts[type] |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
116 hdrsize = common.resphdrsizes[type] |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
117 try: |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
118 resphdr = struct.unpack(hdrfmt, cs.read(hdrsize)) |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
119 except struct.error: |
8552
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
120 raise QueryFailed('unable to retrieve query response headers') |
6239 | 121 |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
122 return cs, resphdr |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
123 |
8553
e387ecd7a6ed
inotify: change protocol so that different query types can be supported.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
124 def query(self, type, req): |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
125 self._connect() |
6239 | 126 |
8553
e387ecd7a6ed
inotify: change protocol so that different query types can be supported.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
127 self._send(type, req) |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
128 |
8553
e387ecd7a6ed
inotify: change protocol so that different query types can be supported.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
129 return self._receive(type) |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
130 |
8552
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
131 @start_server |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
132 def statusquery(self, names, match, ignored, clean, unknown=True): |
6239 | 133 |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
134 def genquery(): |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
135 for n in names: |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
136 yield n |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
137 states = 'almrx!' |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
138 if ignored: |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
139 raise ValueError('this is insanity') |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
140 if clean: states += 'c' |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
141 if unknown: states += '?' |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
142 yield states |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
143 |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
144 req = '\0'.join(genquery()) |
6239 | 145 |
8553
e387ecd7a6ed
inotify: change protocol so that different query types can be supported.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
146 cs, resphdr = self.query('STAT', req) |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
147 |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
148 def readnames(nbytes): |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
149 if nbytes: |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
150 names = cs.read(nbytes) |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
151 if names: |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
152 return filter(match, names.split('\0')) |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
153 return [] |
9854
95e1867f765b
inotify: mark directories visited during lookup (issue1844)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9514
diff
changeset
|
154 results = map(readnames, resphdr[:-1]) |
95e1867f765b
inotify: mark directories visited during lookup (issue1844)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9514
diff
changeset
|
155 |
95e1867f765b
inotify: mark directories visited during lookup (issue1844)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9514
diff
changeset
|
156 if names: |
95e1867f765b
inotify: mark directories visited during lookup (issue1844)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9514
diff
changeset
|
157 nbytes = resphdr[-1] |
95e1867f765b
inotify: mark directories visited during lookup (issue1844)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9514
diff
changeset
|
158 vdirs = cs.read(nbytes) |
95e1867f765b
inotify: mark directories visited during lookup (issue1844)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9514
diff
changeset
|
159 if vdirs: |
95e1867f765b
inotify: mark directories visited during lookup (issue1844)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9514
diff
changeset
|
160 for vdir in vdirs.split('\0'): |
95e1867f765b
inotify: mark directories visited during lookup (issue1844)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9514
diff
changeset
|
161 match.dir(vdir) |
95e1867f765b
inotify: mark directories visited during lookup (issue1844)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9514
diff
changeset
|
162 |
95e1867f765b
inotify: mark directories visited during lookup (issue1844)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9514
diff
changeset
|
163 return results |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
164 |
8555
3e09bc5fee12
inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8553
diff
changeset
|
165 @start_server |
3e09bc5fee12
inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8553
diff
changeset
|
166 def debugquery(self): |
3e09bc5fee12
inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8553
diff
changeset
|
167 cs, resphdr = self.query('DBUG', '') |
3e09bc5fee12
inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8553
diff
changeset
|
168 |
3e09bc5fee12
inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8553
diff
changeset
|
169 nbytes = resphdr[0] |
3e09bc5fee12
inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8553
diff
changeset
|
170 names = cs.read(nbytes) |
3e09bc5fee12
inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8553
diff
changeset
|
171 return names.split('\0') |