[Pkg-bazaar-commits] ./bzr/unstable r204: Revfile:- new find-sha command and implementation- new _check_index helper

mbp at sourcefrog.net mbp at sourcefrog.net
Fri Apr 10 07:51:25 UTC 2009


------------------------------------------------------------
revno: 204
committer: mbp at sourcefrog.net
timestamp: Sat 2005-04-09 14:01:25 +1000
message:
  Revfile:- new find-sha command and implementation- new _check_index helper
modified:
  bzrlib/revfile.py
-------------- next part --------------
=== modified file 'bzrlib/revfile.py'
--- a/bzrlib/revfile.py	2005-04-09 03:50:18 +0000
+++ b/bzrlib/revfile.py	2005-04-09 04:01:25 +0000
@@ -71,7 +71,7 @@
 
 
 import sys, zlib, struct, mdiff, stat, os, sha
-from binascii import hexlify
+from binascii import hexlify, unhexlify
 
 factor = 10
 
@@ -79,7 +79,7 @@
 
 _HEADER = "bzr revfile v1\n"
 _HEADER = _HEADER + ('\xff' * (_RECORDSIZE - len(_HEADER)))
-_NO_BASE = 0xFFFFFFFFL
+_NO_RECORD = 0xFFFFFFFFL
 
 # fields in the index record
 I_SHA = 0
@@ -150,7 +150,7 @@
         return text    
 
 
-    def add_full_text(self, t):
+    def _add_full_text(self, t):
         """Add a full text to the file.
 
         This is not compressed against any reference version.
@@ -177,10 +177,54 @@
         return idx
 
 
+    def _check_index(self, idx):
+        if idx < 0 or idx > len(self):
+            raise RevfileError("invalid index %r" % idx)
+
+
+    def find_sha(self, s):
+        assert isinstance(s, str)
+        assert len(s) == 20
+        
+        for idx, idxrec in enumerate(self):
+            if idxrec[I_SHA] == s:
+                return idx
+        else:
+            return _NO_RECORD        
+
+
+    def _add_diff(self, text, base):
+        """Add a text stored relative to a previous text."""
+        self._check_index(base)
+        text_sha = sha.new(text).digest()
+
+        
+    def addrevision(self, text, changeset):
+        t = self.tip()
+        n = t + 1
+
+        if not n % factor:
+            data = zlib.compress(text)
+            base = n
+        else:
+            prev = self.revision(t)
+            data = zlib.compress(mdiff.bdiff(prev, text))
+            base = self.index[t][0]
+
+        offset = 0
+        if t >= 0:
+            offset = self.index[t][1] + self.index[t][2]
+
+        self.index.append((base, offset, len(data), changeset))
+        entry = struct.pack(">llll", base, offset, len(data), changeset)
+
+        open(self.indexfile(), "a").write(entry)
+        open(self.datafile(), "a").write(data)
+
     def _get_full_text(self, idx):
         idxrec = self[idx]
         assert idxrec[I_FLAGS] == 0
-        assert idxrec[I_BASE] == _NO_BASE
+        assert idxrec[I_BASE] == _NO_RECORD
 
         l = idxrec[I_LEN]
         if l == 0:
@@ -193,6 +237,10 @@
             raise RevfileError("short read %d of %d "
                                "getting text for record %d in %r"
                                % (len(text), l, idx, self.basename))
+
+        if sha.new(text).digest() != idxrec[I_SHA]:
+            raise RevfileError("corrupt SHA-1 digest on record %d"
+                               % idx)
         
         return text
 
@@ -209,6 +257,7 @@
 
     def __getitem__(self, idx):
         """Index by sequence id returns the index field"""
+        ## TODO: Can avoid seek if we just moved there...
         self._seek_index(idx)
         return self._read_next_index()
 
@@ -228,29 +277,6 @@
         return struct.unpack(">20sIIII12x", rec)
 
         
-        
-    def addrevision(self, text, changeset):
-        t = self.tip()
-        n = t + 1
-
-        if not n % factor:
-            data = zlib.compress(text)
-            base = n
-        else:
-            prev = self.revision(t)
-            data = zlib.compress(mdiff.bdiff(prev, text))
-            base = self.index[t][0]
-
-        offset = 0
-        if t >= 0:
-            offset = self.index[t][1] + self.index[t][2]
-
-        self.index.append((base, offset, len(data), changeset))
-        entry = struct.pack(">llll", base, offset, len(data), changeset)
-
-        open(self.indexfile(), "a").write(entry)
-        open(self.datafile(), "a").write(data)
-
     def dump(self, f=sys.stdout):
         f.write('%-8s %-40s %-8s %-8s %-8s %-8s\n' 
                 % tuple('idx sha1 base flags offset len'.split()))
@@ -259,7 +285,7 @@
 
         for i, rec in enumerate(self):
             f.write("#%-7d %40s " % (i, hexlify(rec[0])))
-            if rec[1] == _NO_BASE:
+            if rec[1] == _NO_RECORD:
                 f.write("(none)   ")
             else:
                 f.write("#%-7d " % rec[1])
@@ -276,12 +302,13 @@
     except IndexError:
         sys.stderr.write("usage: revfile dump\n"
                          "       revfile add\n"
-                         "       revfile get IDX\n")
+                         "       revfile get IDX\n"
+                         "       revfile find-sha HEX\n")
         return 1
         
 
     if cmd == 'add':
-        new_idx = r.add_full_text(sys.stdin.read())
+        new_idx = r._add_full_text(sys.stdin.read())
         print 'added idx %d' % new_idx
     elif cmd == 'dump':
         r.dump()
@@ -297,6 +324,20 @@
             return 1
 
         sys.stdout.write(r._get_full_text(idx))
+    elif cmd == 'find-sha':
+        try:
+            s = unhexlify(argv[2])
+        except IndexError:
+            sys.stderr.write("usage: revfile find-sha HEX\n")
+            return 1
+
+        idx = r.find_sha(s)
+        if idx == _NO_RECORD:
+            sys.stderr.write("no such record\n")
+            return 1
+        else:
+            print idx
+            
     else:
         sys.stderr.write("unknown command %r\n" % cmd)
         return 1



More information about the Pkg-bazaar-commits mailing list