Mercurial > public > mercurial-scm > hg
diff hgext/inotify/client.py @ 6239:39cfcef4f463
Add inotify extension
author | Bryan O'Sullivan <bos@serpentine.com> |
---|---|
date | Wed, 12 Mar 2008 15:30:11 -0700 |
parents | |
children | ed5ffb2c12f3 ee308d44ad76 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hgext/inotify/client.py Wed Mar 12 15:30:11 2008 -0700 @@ -0,0 +1,55 @@ +# 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. + +from mercurial.i18n import gettext as _ +from mercurial import ui +import common +import os, select, socket, stat, struct, sys + +def query(ui, repo, names, match, list_ignored, list_clean, list_unknown=True): + sock = socket.socket(socket.AF_UNIX) + sockpath = repo.join('inotify.sock') + sock.connect(sockpath) + + def genquery(): + for n in names or []: + yield n + states = 'almrx!' + if list_ignored: + raise ValueError('this is insanity') + if list_clean: states += 'n' + if list_unknown: states += '?' + 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)