def open(self, path, mode, perm=None, dir_perm=None, cache=None, **kwargs): if self.cache is None: cache = False elif cache is None: cache = self.use_cache else: cache = bool(cache) yield_path = kwargs.pop("_yield_path", False) path = self.abspath(path) tmp = None read_mode = mode.startswith("r") if read_mode: if cache: lpath = self._cached_copy(path, None, cache=cache, **kwargs) else: tmp = LocalFileTarget(is_tmp=self.ext(path, n=0) or True) lpath = self.copy(path, tmp.uri(), cache=cache, **kwargs) lpath = remove_scheme(lpath) def cleanup(): if not cache and tmp and tmp.exists(): tmp.remove() f = lpath if yield_path else open(lpath, mode) return RemoteFileProxy(f, success_fn=cleanup, failure_fn=cleanup) else: # write or update tmp = LocalFileTarget(is_tmp=self.ext(path, n=0) or True) lpath = tmp.path def cleanup(): tmp.remove(silent=True) def copy_and_cleanup(): exists = True try: exists = tmp.exists() if exists: self.copy(tmp.uri(), path, perm=perm, dir_perm=dir_perm, cache=cache, **kwargs) finally: if exists: tmp.remove(silent=True) f = lpath if yield_path else open(lpath, mode) return RemoteFileProxy(f, success_fn=copy_and_cleanup, failure_fn=cleanup)
def open(self, path, mode, cache=None, **kwargs): cache = self._eval_use_cache(cache) yield_path = kwargs.pop("_yield_path", False) path = self.abspath(path) tmp = None if mode == "r": if cache: lpath = self._cached_copy(path, None, cache=True, **kwargs) lpath = remove_scheme(lpath) else: tmp = LocalFileTarget(is_tmp=self.ext(path, n=0) or True) self.copy(path, tmp.uri(), cache=False, **kwargs) def cleanup(): if not cache and tmp.exists(): tmp.remove() f = lpath if yield_path else open(lpath, "r") return RemoteFileProxy(f, success_fn=cleanup, failure_fn=cleanup) elif mode == "w": tmp = LocalFileTarget(is_tmp=self.ext(path, n=0) or True) lpath = tmp.path def cleanup(): if tmp.exists(): tmp.remove() def copy_and_cleanup(): try: if tmp.exists(): self.copy(tmp.uri(), path, cache=cache, **kwargs) finally: cleanup() f = lpath if yield_path else open(lpath, "w") return RemoteFileProxy(f, success_fn=copy_and_cleanup, failure_fn=cleanup) else: raise Exception("unknown mode {}, use r or w".format(mode))