def publish(self): super(PyFS, self).publish() deploy_fs = OSFS(self.site.config.deploy_root_path.path) for (dirnm, local_filenms) in deploy_fs.walk(): logger.info("Making directory: %s", dirnm) self.fs.makedir(dirnm, allow_recreate=True) remote_fileinfos = self.fs.listdirinfo(dirnm, files_only=True) # Process each local file, to see if it needs updating. for filenm in local_filenms: filepath = pathjoin(dirnm, filenm) # Try to find an existing remote file, to compare metadata. for (nm, info) in remote_fileinfos: if nm == filenm: break else: info = {} # Skip it if the etags match if self.check_etag and "etag" in info: with deploy_fs.open(filepath, "rb") as f: local_etag = self._calculate_etag(f) if info["etag"] == local_etag: logger.info("Skipping file [etag]: %s", filepath) continue # Skip it if the mtime is more recent remotely. if self.check_mtime and "modified_time" in info: local_mtime = deploy_fs.getinfo(filepath)["modified_time"] if info["modified_time"] > local_mtime: logger.info("Skipping file [mtime]: %s", filepath) continue # Upload it to the remote filesystem. logger.info("Uploading file: %s", filepath) with deploy_fs.open(filepath, "rb") as f: self.fs.setcontents(filepath, f) # Process each remote file, to see if it needs deleting. for (filenm, info) in remote_fileinfos: filepath = pathjoin(dirnm, filenm) if filenm not in local_filenms: logger.info("Removing file: %s", filepath) self.fs.remove(filepath)