[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