Index: third_party/buildbot_7_12/buildbot/changes/maildir.py |
diff --git a/third_party/buildbot_7_12/buildbot/changes/maildir.py b/third_party/buildbot_7_12/buildbot/changes/maildir.py |
deleted file mode 100644 |
index 2e4a7069fe79b347526a209b627832230fa766a5..0000000000000000000000000000000000000000 |
--- a/third_party/buildbot_7_12/buildbot/changes/maildir.py |
+++ /dev/null |
@@ -1,116 +0,0 @@ |
- |
-# This is a class which watches a maildir for new messages. It uses the |
-# linux dirwatcher API (if available) to look for new files. The |
-# .messageReceived method is invoked with the filename of the new message, |
-# relative to the top of the maildir (so it will look like "new/blahblah"). |
- |
-import os |
-from twisted.python import log |
-from twisted.application import service, internet |
-from twisted.internet import reactor |
-dnotify = None |
-try: |
- import dnotify |
-except: |
- # I'm not actually sure this log message gets recorded |
- log.msg("unable to import dnotify, so Maildir will use polling instead") |
- |
-class NoSuchMaildir(Exception): |
- pass |
- |
-class MaildirService(service.MultiService): |
- """I watch a maildir for new messages. I should be placed as the service |
- child of some MultiService instance. When running, I use the linux |
- dirwatcher API (if available) or poll for new files in the 'new' |
- subdirectory of my maildir path. When I discover a new message, I invoke |
- my .messageReceived() method with the short filename of the new message, |
- so the full name of the new file can be obtained with |
- os.path.join(maildir, 'new', filename). messageReceived() should be |
- overridden by a subclass to do something useful. I will not move or |
- delete the file on my own: the subclass's messageReceived() should |
- probably do that. |
- """ |
- pollinterval = 10 # only used if we don't have DNotify |
- |
- def __init__(self, basedir=None): |
- """Create the Maildir watcher. BASEDIR is the maildir directory (the |
- one which contains new/ and tmp/) |
- """ |
- service.MultiService.__init__(self) |
- self.basedir = basedir |
- self.files = [] |
- self.dnotify = None |
- |
- def setBasedir(self, basedir): |
- # some users of MaildirService (scheduler.Try_Jobdir, in particular) |
- # don't know their basedir until setServiceParent, since it is |
- # relative to the buildmaster's basedir. So let them set it late. We |
- # don't actually need it until our own startService. |
- self.basedir = basedir |
- |
- def startService(self): |
- service.MultiService.startService(self) |
- self.newdir = os.path.join(self.basedir, "new") |
- if not os.path.isdir(self.basedir) or not os.path.isdir(self.newdir): |
- raise NoSuchMaildir("invalid maildir '%s'" % self.basedir) |
- try: |
- if dnotify: |
- # we must hold an fd open on the directory, so we can get |
- # notified when it changes. |
- self.dnotify = dnotify.DNotify(self.newdir, |
- self.dnotify_callback, |
- [dnotify.DNotify.DN_CREATE]) |
- except (IOError, OverflowError): |
- # IOError is probably linux<2.4.19, which doesn't support |
- # dnotify. OverflowError will occur on some 64-bit machines |
- # because of a python bug |
- log.msg("DNotify failed, falling back to polling") |
- if not self.dnotify: |
- t = internet.TimerService(self.pollinterval, self.poll) |
- t.setServiceParent(self) |
- self.poll() |
- |
- def dnotify_callback(self): |
- log.msg("dnotify noticed something, now polling") |
- |
- # give it a moment. I found that qmail had problems when the message |
- # was removed from the maildir instantly. It shouldn't, that's what |
- # maildirs are made for. I wasn't able to eyeball any reason for the |
- # problem, and safecat didn't behave the same way, but qmail reports |
- # "Temporary_error_on_maildir_delivery" (qmail-local.c:165, |
- # maildir_child() process exited with rc not in 0,2,3,4). Not sure |
- # why, and I'd have to hack qmail to investigate further, so it's |
- # easier to just wait a second before yanking the message out of new/ |
- |
- reactor.callLater(0.1, self.poll) |
- |
- |
- def stopService(self): |
- if self.dnotify: |
- self.dnotify.remove() |
- self.dnotify = None |
- return service.MultiService.stopService(self) |
- |
- def poll(self): |
- assert self.basedir |
- # see what's new |
- for f in self.files: |
- if not os.path.isfile(os.path.join(self.newdir, f)): |
- self.files.remove(f) |
- newfiles = [] |
- for f in os.listdir(self.newdir): |
- if not f in self.files: |
- newfiles.append(f) |
- self.files.extend(newfiles) |
- # TODO: sort by ctime, then filename, since safecat uses a rather |
- # fine-grained timestamp in the filename |
- for n in newfiles: |
- # TODO: consider catching exceptions in messageReceived |
- self.messageReceived(n) |
- |
- def messageReceived(self, filename): |
- """Called when a new file is noticed. Will call |
- self.parent.messageReceived() with a path relative to maildir/new. |
- Should probably be overridden in subclasses.""" |
- self.parent.messageReceived(filename) |
- |