Mercurial > hg
annotate hgext/inotify/client.py @ 9854:95e1867f765b
inotify: mark directories visited during lookup (issue1844)
Emulate the match.dir calls that are made in dirstate.walk:
* first mark the visited directories on the server side
* then extend the transmitted response to include this directory list
* and lastly call match.dir on each directory
author | Nicolas Dumazet <nicdumz.commits@gmail.com> |
---|---|
date | Fri, 13 Nov 2009 08:31:10 +0900 |
parents | 7c01599dd340 |
children | 8939900073a8 |
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 |
46293a0c7e9f
updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents:
8067
diff
changeset
|
8 # GNU General Public License version 2, incorporated herein by reference. |
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: |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
30 self.ui.warn(_('(found dead inotify server socket; ' |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
31 '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: |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
44 self.ui.warn(_('could not start inotify server: ' |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
45 '%s\n') % inst) |
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: |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
50 self.ui.warn(_('could not talk to new inotify ' |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
51 'server: %s\n') % err[-1]) |
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: |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
56 self.ui.warn(_('failed to contact inotify server: %s\n') |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
57 % err[-1]) |
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 |
5d8021ac0e19
inotify: raise QueryFailed when the server crash
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8555
diff
changeset
|
100 self.ui.warn(_('received empty answer from inotify server')) |
5d8021ac0e19
inotify: raise QueryFailed when the server crash
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8555
diff
changeset
|
101 raise QueryFailed('server crashed') |
5d8021ac0e19
inotify: raise QueryFailed when the server crash
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8555
diff
changeset
|
102 |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
103 if version != common.version: |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
104 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
|
105 '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
|
106 raise QueryFailed('incompatible server version') |
6239 | 107 |
8553
e387ecd7a6ed
inotify: change protocol so that different query types can be supported.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
108 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
|
109 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
|
110 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
|
111 ' \'%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
|
112 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
|
113 |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
114 hdrfmt = common.resphdrfmts[type] |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
115 hdrsize = common.resphdrsizes[type] |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
116 try: |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
117 resphdr = struct.unpack(hdrfmt, cs.read(hdrsize)) |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
118 except struct.error: |
8552
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
119 raise QueryFailed('unable to retrieve query response headers') |
6239 | 120 |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
121 return cs, resphdr |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
122 |
8553
e387ecd7a6ed
inotify: change protocol so that different query types can be supported.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
123 def query(self, type, req): |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
124 self._connect() |
6239 | 125 |
8553
e387ecd7a6ed
inotify: change protocol so that different query types can be supported.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
126 self._send(type, req) |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
127 |
8553
e387ecd7a6ed
inotify: change protocol so that different query types can be supported.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
128 return self._receive(type) |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
129 |
8552
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
130 @start_server |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
131 def statusquery(self, names, match, ignored, clean, unknown=True): |
6239 | 132 |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
133 def genquery(): |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
134 for n in names: |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
135 yield n |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
136 states = 'almrx!' |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
137 if ignored: |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
138 raise ValueError('this is insanity') |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
139 if clean: states += 'c' |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
140 if unknown: states += '?' |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
141 yield states |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
142 |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
143 req = '\0'.join(genquery()) |
6239 | 144 |
8553
e387ecd7a6ed
inotify: change protocol so that different query types can be supported.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
145 cs, resphdr = self.query('STAT', req) |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
146 |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
147 def readnames(nbytes): |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
148 if nbytes: |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
149 names = cs.read(nbytes) |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
150 if names: |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
151 return filter(match, names.split('\0')) |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
152 return [] |
9854
95e1867f765b
inotify: mark directories visited during lookup (issue1844)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9514
diff
changeset
|
153 results = map(readnames, resphdr[:-1]) |
95e1867f765b
inotify: mark directories visited during lookup (issue1844)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9514
diff
changeset
|
154 |
95e1867f765b
inotify: mark directories visited during lookup (issue1844)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9514
diff
changeset
|
155 if names: |
95e1867f765b
inotify: mark directories visited during lookup (issue1844)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9514
diff
changeset
|
156 nbytes = resphdr[-1] |
95e1867f765b
inotify: mark directories visited during lookup (issue1844)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9514
diff
changeset
|
157 vdirs = cs.read(nbytes) |
95e1867f765b
inotify: mark directories visited during lookup (issue1844)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9514
diff
changeset
|
158 if vdirs: |
95e1867f765b
inotify: mark directories visited during lookup (issue1844)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9514
diff
changeset
|
159 for vdir in vdirs.split('\0'): |
95e1867f765b
inotify: mark directories visited during lookup (issue1844)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9514
diff
changeset
|
160 match.dir(vdir) |
95e1867f765b
inotify: mark directories visited during lookup (issue1844)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9514
diff
changeset
|
161 |
95e1867f765b
inotify: mark directories visited during lookup (issue1844)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9514
diff
changeset
|
162 return results |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
163 |
8555
3e09bc5fee12
inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8553
diff
changeset
|
164 @start_server |
3e09bc5fee12
inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8553
diff
changeset
|
165 def debugquery(self): |
3e09bc5fee12
inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8553
diff
changeset
|
166 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
|
167 |
3e09bc5fee12
inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8553
diff
changeset
|
168 nbytes = resphdr[0] |
3e09bc5fee12
inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8553
diff
changeset
|
169 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
|
170 return names.split('\0') |