]> arthur.barton.de Git - bup.git/blobdiff - lib/bup/midx.py
Fix tindex for python 3
[bup.git] / lib / bup / midx.py
index 3a06b733b9008affa934186ad497a8cc1fbcda30..9de3ae80d19ccd4651e2ec109315b2654d8bbdbe 100644 (file)
@@ -1,6 +1,11 @@
-import mmap
+
+from __future__ import absolute_import
+import glob, mmap, os, struct
+
 from bup import _helpers
-from bup.helpers import *
+from bup.compat import range
+from bup.helpers import log, mmap_read
+
 
 MIDX_VERSION = 4
 
@@ -18,6 +23,7 @@ class PackMidx:
     def __init__(self, filename):
         self.name = filename
         self.force_keep = False
+        self.map = None
         assert(filename.endswith('.midx'))
         self.map = mmap_read(open(filename))
         if str(self.map[0:4]) != 'MIDX':
@@ -46,11 +52,14 @@ class PackMidx:
         self.whichlist = buffer(self.map, self.which_ofs, nsha*4)
         self.idxnames = str(self.map[self.which_ofs + 4*nsha:]).split('\0')
 
+    def __del__(self):
+        self.close()
+
     def _init_failed(self):
         self.bits = 0
         self.entries = 1
-        self.fanout = buffer('\0\0\0\0')
-        self.shatable = buffer('\0'*20)
+        self.fanout = b'\0\0\0\0'
+        self.shatable = b'\0' * 20
         self.idxnames = []
 
     def _fanget(self, i):
@@ -67,6 +76,11 @@ class PackMidx:
     def _get_idxname(self, i):
         return self.idxnames[self._get_idx_i(i)]
 
+    def close(self):
+        if self.map is not None:
+            self.map.close()
+            self.map = None
+
     def exists(self, hash, want_source=False):
         """Return nonempty if the object exists in the index files."""
         global _total_searches, _total_steps
@@ -102,10 +116,14 @@ class PackMidx:
         return None
 
     def __iter__(self):
-        for i in xrange(self._fanget(self.entries-1)):
-            yield buffer(self.shatable, i*20, 20)
+        count = self._fanget(self.entries-1)
+        for ofs in range(0, count * 20, 20):
+            yield self.shatable[ofs : ofs + 20]
 
     def __len__(self):
         return int(self._fanget(self.entries-1))
 
 
+def clear_midxes(dir=None):
+    for midx in glob.glob(os.path.join(dir, '*.midx')):
+        os.unlink(midx)