Mercurial > hg
annotate hgext/inotify/client.py @ 11638:79231258503b stable
transplant: crash if repo.commit() finds nothing to commit
(makes issue2135, issue2264 more obvious, but does nothing to fix
either one)
This seems to happen in two distinct cases:
* patch.patch() claims success but changes nothing (e.g.
the transplanted changeset adds an empty file that already
exists)
* patch.patch() makes changes, but repo.status() fails to report them
Both of these seem like bugs in other parts of Mercurial, so arguably
it's not transplant's job to detect the failure to commit. However:
* detecting the problem as soon as possible is desirable
* it prevents a more obscure crash later, in transplants.write()
* there might be other lurking (or future) bugs that cause
repo.commit() to do nothing
Also, in the case of issue2264 (source changesets silently dropped by
transplant), the only way to spot the problem currently is the crash
in transplants.write(). Failure to transplant a patch should abort
immediately, whether it's user error (patch does not apply) or a
Mercurial bug (e.g. repo.status() failing to report changes).
author | Greg Ward <greg-hg@gerg.ca> |
---|---|
date | Sun, 18 Jul 2010 21:29:29 -0400 |
parents | 68a30daead3f |
children | 0c23085f051f |
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 |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10263
diff
changeset
|
14 class QueryFailed(Exception): |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10263
diff
changeset
|
15 pass |
8552
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
16 |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
17 def start_server(function): |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
18 """ |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
19 Decorator. |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
20 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
|
21 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
|
22 """ |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
23 def decorated_function(self, *args): |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
24 result = None |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
25 try: |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
26 return function(self, *args) |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
27 except (OSError, socket.error), err: |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
28 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
|
29 |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
30 if err[0] == errno.ECONNREFUSED: |
9900
8939900073a8
inotify: improve error messages
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9854
diff
changeset
|
31 self.ui.warn(_('inotify-client: found dead inotify server ' |
8939900073a8
inotify: improve error messages
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9854
diff
changeset
|
32 'socket; removing it\n')) |
9351
206f7f4c5c2a
inotify: client: no repo use
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8788
diff
changeset
|
33 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
|
34 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
|
35 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
|
36 try: |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
37 try: |
9514
7c01599dd340
inotify: use cmdutil.service instead of local daemonizing code
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9467
diff
changeset
|
38 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
|
39 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
|
40 except server.AlreadyStartedException, inst: |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
41 # 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
|
42 # 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
|
43 self.ui.debug(str(inst)) |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
44 except Exception, inst: |
9900
8939900073a8
inotify: improve error messages
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9854
diff
changeset
|
45 self.ui.warn(_('inotify-client: could not start inotify ' |
8939900073a8
inotify: improve error messages
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9854
diff
changeset
|
46 'server: %s\n') % inst) |
8552
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
47 else: |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
48 try: |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
49 return function(self, *args) |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
50 except socket.error, err: |
9900
8939900073a8
inotify: improve error messages
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9854
diff
changeset
|
51 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
|
52 '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
|
53 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
|
54 # 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
|
55 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
|
56 else: |
9900
8939900073a8
inotify: improve error messages
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9854
diff
changeset
|
57 self.ui.warn(_('inotify-client: failed to contact inotify ' |
8939900073a8
inotify: improve error messages
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9854
diff
changeset
|
58 '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
|
59 |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
60 self.ui.traceback() |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
61 raise QueryFailed('inotify query failed') |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
62 |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
63 return decorated_function |
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
64 |
6239 | 65 |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
66 class client(object): |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
67 def __init__(self, ui, repo): |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
68 self.ui = ui |
9351
206f7f4c5c2a
inotify: client: no repo use
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8788
diff
changeset
|
69 self.dirstate = repo.dirstate |
206f7f4c5c2a
inotify: client: no repo use
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8788
diff
changeset
|
70 self.root = repo.root |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
71 self.sock = socket.socket(socket.AF_UNIX) |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
72 |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
73 def _connect(self): |
9351
206f7f4c5c2a
inotify: client: no repo use
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8788
diff
changeset
|
74 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
|
75 try: |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
76 self.sock.connect(sockpath) |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
77 except socket.error, err: |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
78 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
|
79 sockpath = os.readlink(sockpath) |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
80 self.sock.connect(sockpath) |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
81 else: |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
82 raise |
6239 | 83 |
8553
e387ecd7a6ed
inotify: change protocol so that different query types can be supported.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
84 def _send(self, type, data): |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
85 """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
|
86 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
|
87 |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
88 self.sock.shutdown(socket.SHUT_WR) |
6239 | 89 |
8553
e387ecd7a6ed
inotify: change protocol so that different query types can be supported.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
90 def _receive(self, type): |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
91 """ |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
92 Read data, check version number, extract headers, |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
93 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
|
94 Raises QueryFailed on error |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
95 """ |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
96 cs = common.recvcs(self.sock) |
8788
5d8021ac0e19
inotify: raise QueryFailed when the server crash
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8555
diff
changeset
|
97 try: |
5d8021ac0e19
inotify: raise QueryFailed when the server crash
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8555
diff
changeset
|
98 version = ord(cs.read(1)) |
5d8021ac0e19
inotify: raise QueryFailed when the server crash
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8555
diff
changeset
|
99 except TypeError: |
5d8021ac0e19
inotify: raise QueryFailed when the server crash
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8555
diff
changeset
|
100 # empty answer, assume the server crashed |
9900
8939900073a8
inotify: improve error messages
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9854
diff
changeset
|
101 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
|
102 'server')) |
8788
5d8021ac0e19
inotify: raise QueryFailed when the server crash
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8555
diff
changeset
|
103 raise QueryFailed('server crashed') |
5d8021ac0e19
inotify: raise QueryFailed when the server crash
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8555
diff
changeset
|
104 |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
105 if version != common.version: |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
106 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
|
107 '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
|
108 raise QueryFailed('incompatible server version') |
6239 | 109 |
8553
e387ecd7a6ed
inotify: change protocol so that different query types can be supported.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
110 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
|
111 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
|
112 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
|
113 ' \'%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
|
114 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
|
115 |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
116 hdrfmt = common.resphdrfmts[type] |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
117 hdrsize = common.resphdrsizes[type] |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
118 try: |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
119 resphdr = struct.unpack(hdrfmt, cs.read(hdrsize)) |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
120 except struct.error: |
8552
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
121 raise QueryFailed('unable to retrieve query response headers') |
6239 | 122 |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
123 return cs, resphdr |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
124 |
8553
e387ecd7a6ed
inotify: change protocol so that different query types can be supported.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
125 def query(self, type, req): |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
126 self._connect() |
6239 | 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 self._send(type, req) |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
129 |
8553
e387ecd7a6ed
inotify: change protocol so that different query types can be supported.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
130 return self._receive(type) |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
131 |
8552
06561793778e
inotify: Separate query sending logic from Server starting.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8551
diff
changeset
|
132 @start_server |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
133 def statusquery(self, names, match, ignored, clean, unknown=True): |
6239 | 134 |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
135 def genquery(): |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
136 for n in names: |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
137 yield n |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
138 states = 'almrx!' |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
139 if ignored: |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
140 raise ValueError('this is insanity') |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10263
diff
changeset
|
141 if clean: |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10263
diff
changeset
|
142 states += 'c' |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10263
diff
changeset
|
143 if unknown: |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10263
diff
changeset
|
144 states += '?' |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
145 yield states |
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 req = '\0'.join(genquery()) |
6239 | 148 |
8553
e387ecd7a6ed
inotify: change protocol so that different query types can be supported.
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8552
diff
changeset
|
149 cs, resphdr = self.query('STAT', req) |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
150 |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
151 def readnames(nbytes): |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
152 if nbytes: |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
153 names = cs.read(nbytes) |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
154 if names: |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
155 return filter(match, names.split('\0')) |
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
156 return [] |
11628
68a30daead3f
inotify: make inotifydirstate.status() returns a tuple of lists.
Greg Ward <greg-hg@gerg.ca>
parents:
10282
diff
changeset
|
157 results = tuple(map(readnames, resphdr[:-1])) |
9854
95e1867f765b
inotify: mark directories visited during lookup (issue1844)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9514
diff
changeset
|
158 |
95e1867f765b
inotify: mark directories visited during lookup (issue1844)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9514
diff
changeset
|
159 if names: |
95e1867f765b
inotify: mark directories visited during lookup (issue1844)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9514
diff
changeset
|
160 nbytes = resphdr[-1] |
95e1867f765b
inotify: mark directories visited during lookup (issue1844)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9514
diff
changeset
|
161 vdirs = cs.read(nbytes) |
95e1867f765b
inotify: mark directories visited during lookup (issue1844)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9514
diff
changeset
|
162 if vdirs: |
95e1867f765b
inotify: mark directories visited during lookup (issue1844)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9514
diff
changeset
|
163 for vdir in vdirs.split('\0'): |
95e1867f765b
inotify: mark directories visited during lookup (issue1844)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9514
diff
changeset
|
164 match.dir(vdir) |
95e1867f765b
inotify: mark directories visited during lookup (issue1844)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9514
diff
changeset
|
165 |
95e1867f765b
inotify: mark directories visited during lookup (issue1844)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9514
diff
changeset
|
166 return results |
8551
7089d9727867
inotify: modular architecture for inotify clients
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8386
diff
changeset
|
167 |
8555
3e09bc5fee12
inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8553
diff
changeset
|
168 @start_server |
3e09bc5fee12
inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8553
diff
changeset
|
169 def debugquery(self): |
3e09bc5fee12
inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8553
diff
changeset
|
170 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
|
171 |
3e09bc5fee12
inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8553
diff
changeset
|
172 nbytes = resphdr[0] |
3e09bc5fee12
inotify: introduce debuginotify, which lists which paths are under watch
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8553
diff
changeset
|
173 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
|
174 return names.split('\0') |