]> arthur.barton.de Git - bup.git/commitdiff
MetaStoreReader.__del__: replace with context management
authorRob Browning <rlb@defaultvalue.org>
Sun, 26 Sep 2021 20:43:34 +0000 (15:43 -0500)
committerRob Browning <rlb@defaultvalue.org>
Mon, 22 Nov 2021 16:35:28 +0000 (10:35 -0600)
Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
lib/bup/cmd/save.py
lib/bup/index.py

index f053b8a40a0fdb0661f27aee1621253e250baef4..3c889e2b3b0200897bc5773ffb8bb3fe3afcf9f1 100755 (executable)
@@ -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')
index 8eae53572f9c5c1429b15e34cab96203a9f977f3..dd24d937064d9d1cb3296700d7745515b85b0ea0 100644 (file)
@@ -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)