From 994c2230ac13d31ef581320969bf0faefb105033 Mon Sep 17 00:00:00 2001 From: Rob Browning Date: Sun, 26 Sep 2021 15:43:34 -0500 Subject: [PATCH] MetaStoreReader.__del__: replace with context management Signed-off-by: Rob Browning Tested-by: Rob Browning --- lib/bup/cmd/save.py | 25 ++++++++++++------------- lib/bup/index.py | 10 +++++++--- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/lib/bup/cmd/save.py b/lib/bup/cmd/save.py index f053b8a..3c889e2 100755 --- a/lib/bup/cmd/save.py +++ b/lib/bup/cmd/save.py @@ -109,7 +109,7 @@ def opts_from_cmdline(argv): return opt -def save_tree(opt, indexfile, hlink_db, w): +def save_tree(opt, indexfile, hlink_db, msr, w): # Metadata is stored in a file named .bupm in each directory. The # first metadata entry will be the metadata for the current directory. # The remaining entries will be for each of the other directory @@ -225,16 +225,6 @@ def save_tree(opt, indexfile, hlink_db, w): remainstr, kpsstr)) - r = index.Reader(indexfile) - try: - msr = index.MetaStoreReader(indexfile + b'.meta') - except IOError as ex: - if ex.errno != EACCES: - raise - log('error: cannot access %r; have you run bup index?' - % path_msg(indexfile)) - sys.exit(1) - def already_saved(ent): return ent.is_valid() and w.exists(ent.sha) and ent.sha @@ -251,6 +241,7 @@ def save_tree(opt, indexfile, hlink_db, w): return link_paths[0] return None + r = index.Reader(indexfile) total = ftotal = 0 if opt.progress: for transname, ent in r.filter(opt.sources, @@ -520,8 +511,16 @@ def main(argv): refname = parent = None indexfile = opt.indexfile or git.repo(b'bupindex') - with hlinkdb.HLinkDB(indexfile + b'.hlink') as hlink_db: - tree = save_tree(opt, indexfile, hlink_db, w) + try: + msr = index.MetaStoreReader(indexfile + b'.meta') + except IOError as ex: + if ex.errno != EACCES: + raise + log('error: cannot access %r; have you run bup index?' + % path_msg(indexfile)) + sys.exit(1) + with msr, hlinkdb.HLinkDB(indexfile + b'.hlink') as hlink_db: + tree = save_tree(opt, indexfile, hlink_db, msr, w) if opt.tree: out.write(hexlify(tree)) out.write(b'\n') diff --git a/lib/bup/index.py b/lib/bup/index.py index 8eae535..dd24d93 100644 --- a/lib/bup/index.py +++ b/lib/bup/index.py @@ -4,7 +4,7 @@ import errno, os, stat, struct, tempfile from bup import metadata, xstat from bup._helpers import UINT_MAX, bytescmp -from bup.compat import range +from bup.compat import pending_raise, range from bup.helpers import (add_error, log, merge_iter, mmap_readwrite, progress, qprogress, resolve_parent, slashappend) @@ -58,8 +58,12 @@ class MetaStoreReader: self._file.close() self._file = None - def __del__(self): - self.close() + def __enter__(self): + return self + + def __exit__(self, type, value, traceback): + with pending_raise(value, rethrow=True): + self.close() def metadata_at(self, ofs): self._file.seek(ofs) -- 2.39.2