client.py
61 lines
| 1.7 KiB
| text/x-python
|
PythonLexer
Bryan O'Sullivan
|
r6239 | # client.py - inotify status client | ||
# | ||||
# Copyright 2006, 2007, 2008 Bryan O'Sullivan <bos@serpentine.com> | ||||
# Copyright 2007, 2008 Brendan Cully <brendan@kublai.com> | ||||
# | ||||
# This software may be used and distributed according to the terms | ||||
# of the GNU General Public License, incorporated herein by reference. | ||||
Martin Geisler
|
r7225 | from mercurial.i18n import _ | ||
Bryan O'Sullivan
|
r6239 | import common | ||
Benoit Boissinot
|
r7280 | import os, socket, struct | ||
Bryan O'Sullivan
|
r6239 | |||
Matt Mackall
|
r6753 | def query(ui, repo, names, match, ignored, clean, unknown=True): | ||
Bryan O'Sullivan
|
r6239 | sock = socket.socket(socket.AF_UNIX) | ||
sockpath = repo.join('inotify.sock') | ||||
Benoit Boissinot
|
r7024 | try: | ||
sock.connect(sockpath) | ||||
except socket.error, err: | ||||
if err[0] == "AF_UNIX path too long": | ||||
sockpath = os.readlink(sockpath) | ||||
sock.connect(sockpath) | ||||
else: | ||||
raise | ||||
Bryan O'Sullivan
|
r6239 | |||
def genquery(): | ||||
Nicolas Dumazet
|
r8067 | for n in names: | ||
Bryan O'Sullivan
|
r6239 | yield n | ||
states = 'almrx!' | ||||
Matt Mackall
|
r6753 | if ignored: | ||
Bryan O'Sullivan
|
r6239 | raise ValueError('this is insanity') | ||
Benoit Boissinot
|
r7145 | if clean: states += 'c' | ||
Matt Mackall
|
r6753 | if unknown: states += '?' | ||
Bryan O'Sullivan
|
r6239 | yield states | ||
req = '\0'.join(genquery()) | ||||
sock.sendall(chr(common.version)) | ||||
sock.sendall(req) | ||||
sock.shutdown(socket.SHUT_WR) | ||||
cs = common.recvcs(sock) | ||||
version = ord(cs.read(1)) | ||||
if version != common.version: | ||||
ui.warn(_('(inotify: received response from incompatible server ' | ||||
'version %d)\n') % version) | ||||
return None | ||||
try: | ||||
resphdr = struct.unpack(common.resphdrfmt, cs.read(common.resphdrsize)) | ||||
except struct.error: | ||||
return None | ||||
def readnames(nbytes): | ||||
if nbytes: | ||||
names = cs.read(nbytes) | ||||
if names: | ||||
return filter(match, names.split('\0')) | ||||
return [] | ||||
return map(readnames, resphdr) | ||||