class Process(pyi.ProcessEvent): def __init__(self, server, name): self.server = server self.name = name self.db = Database(server=server, name=name) def process_IN_DELETE(self, event): if event.is_dir: return path = os.path.join(event.path, event.name) print "Removing %s..." % path self.db.remove(path) def process_IN_MOVED_TO(self, event): if not event.is_dir: self.process_default(event) return path = os.path.join(event.path, event.name) print "Slurping %s..." % path Slurp([path], server=self.server, name=self.name, progress=False).run() def process_IN_MOVED_FROM(self, event): if not event.is_dir: self.process_IN_DELETE(self, event) path = os.path.join(event.path, event.name) print "Removing %s..." % path self.db.remove_docs(self.db.docs_beneath(path)) def process_default(self, event): if event.is_dir: return path = os.path.join(event.path, event.name) print "Updating %s..." % path for attempt in range(10): try: self.db.add(path) break except EOFError: if attempt < 9: print "File not yet written, waiting a second..." time.sleep(1) else: print "Giving up."
class Check: def __init__(self, server, name, progress=True): self.current_files = 0 self.db = Database(server, name) self.progress = progress self.view = self.db.db.view('_view/update/check') if self.progress: sys.stderr.write("Counting files...\r") self.total_files = len(self.view) self.bar = ProgressBar(self.total_files) else: self.total_files = sys.maxint def run(self): if self.progress: self.bar.start() mount_errors = set() for i, doc in enumerate(row.value for row in self.view): if "mountpoint" in doc: mountpoint = util.qencode(doc["mountpoint"]) if not os.path.ismount(mountpoint): if not mountpoint in mount_errors: sys.stderr.write("Error: %s isn't mounted\n" % mountpoint) if self.progress: sys.stderr.write("\n\n") mount_errors.add(mountpoint) continue filename = util.qencode(doc["filename"]) try: if not os.path.isfile(filename): self.db.remove(filename) elif util.mtime(filename) > doc["mtime"]: self.db.update(doc, filename) except Exception: print "Error when updating %s:" % filename traceback.print_exc() if self.progress: sys.stderr.write("\n\n") if self.progress: self.bar.update(i) if self.progress: self.bar.finish()