def test_written_detection(self): # Test detection of weave file corruption. # # Make sure that we can detect if a weave file has # been corrupted. This doesn't test all forms of corruption, # but it at least helps verify the data you get, is what you want. from cStringIO import StringIO w = Weave() w.add_lines('v1', [], ['hello\n']) w.add_lines('v2', ['v1'], ['hello\n', 'there\n']) tmpf = StringIO() write_weave(w, tmpf) # Because we are corrupting, we need to make sure we have the exact text self.assertEqual('# bzr weave file v5\n' 'i\n1 f572d396fae9206628714fb2ce00f72e94f2258f\nn v1\n\n' 'i 0\n1 90f265c6e75f1c8f9ab76dcf85528352c5f215ef\nn v2\n\n' 'w\n{ 0\n. hello\n}\n{ 1\n. there\n}\nW\n', tmpf.getvalue()) # Change a single letter tmpf = StringIO('# bzr weave file v5\n' 'i\n1 f572d396fae9206628714fb2ce00f72e94f2258f\nn v1\n\n' 'i 0\n1 90f265c6e75f1c8f9ab76dcf85528352c5f215ef\nn v2\n\n' 'w\n{ 0\n. hello\n}\n{ 1\n. There\n}\nW\n') w = read_weave(tmpf) self.assertEqual('hello\n', w.get_text('v1')) self.assertRaises(errors.WeaveInvalidChecksum, w.get_text, 'v2') self.assertRaises(errors.WeaveInvalidChecksum, w.get_lines, 'v2') self.assertRaises(errors.WeaveInvalidChecksum, w.check) # Change the sha checksum tmpf = StringIO('# bzr weave file v5\n' 'i\n1 f572d396fae9206628714fb2ce00f72e94f2258f\nn v1\n\n' 'i 0\n1 f0f265c6e75f1c8f9ab76dcf85528352c5f215ef\nn v2\n\n' 'w\n{ 0\n. hello\n}\n{ 1\n. there\n}\nW\n') w = read_weave(tmpf) self.assertEqual('hello\n', w.get_text('v1')) self.assertRaises(errors.WeaveInvalidChecksum, w.get_text, 'v2') self.assertRaises(errors.WeaveInvalidChecksum, w.get_lines, 'v2') self.assertRaises(errors.WeaveInvalidChecksum, w.check)
def test_written_detection(self): # Test detection of weave file corruption. # # Make sure that we can detect if a weave file has # been corrupted. This doesn't test all forms of corruption, # but it at least helps verify the data you get, is what you want. from cStringIO import StringIO w = Weave() w.add_lines('v1', [], ['hello\n']) w.add_lines('v2', ['v1'], ['hello\n', 'there\n']) tmpf = StringIO() write_weave(w, tmpf) # Because we are corrupting, we need to make sure we have the exact text self.assertEquals('# bzr weave file v5\n' 'i\n1 f572d396fae9206628714fb2ce00f72e94f2258f\nn v1\n\n' 'i 0\n1 90f265c6e75f1c8f9ab76dcf85528352c5f215ef\nn v2\n\n' 'w\n{ 0\n. hello\n}\n{ 1\n. there\n}\nW\n', tmpf.getvalue()) # Change a single letter tmpf = StringIO('# bzr weave file v5\n' 'i\n1 f572d396fae9206628714fb2ce00f72e94f2258f\nn v1\n\n' 'i 0\n1 90f265c6e75f1c8f9ab76dcf85528352c5f215ef\nn v2\n\n' 'w\n{ 0\n. hello\n}\n{ 1\n. There\n}\nW\n') w = read_weave(tmpf) self.assertEqual('hello\n', w.get_text('v1')) self.assertRaises(errors.WeaveInvalidChecksum, w.get_text, 'v2') self.assertRaises(errors.WeaveInvalidChecksum, w.get_lines, 'v2') self.assertRaises(errors.WeaveInvalidChecksum, w.check) # Change the sha checksum tmpf = StringIO('# bzr weave file v5\n' 'i\n1 f572d396fae9206628714fb2ce00f72e94f2258f\nn v1\n\n' 'i 0\n1 f0f265c6e75f1c8f9ab76dcf85528352c5f215ef\nn v2\n\n' 'w\n{ 0\n. hello\n}\n{ 1\n. there\n}\nW\n') w = read_weave(tmpf) self.assertEqual('hello\n', w.get_text('v1')) self.assertRaises(errors.WeaveInvalidChecksum, w.get_text, 'v2') self.assertRaises(errors.WeaveInvalidChecksum, w.get_lines, 'v2') self.assertRaises(errors.WeaveInvalidChecksum, w.check)
def check_read_write(self, k): """Check the weave k can be written & re-read.""" from tempfile import TemporaryFile tf = TemporaryFile() write_weave(k, tf) tf.seek(0) k2 = read_weave(tf) if k != k2: tf.seek(0) self.log('serialized weave:') self.log(tf.read()) self.log('') self.log('parents: %s' % (k._parents == k2._parents)) self.log(' %r' % k._parents) self.log(' %r' % k2._parents) self.log('') self.fail('read/write check failed')
def main(argv): import sys import os try: import bzrlib except ImportError: # in case we're run directly from the subdirectory sys.path.append('..') import bzrlib from bzrlib.weavefile import write_weave, read_weave from bzrlib.progress import ProgressBar try: import psyco psyco.full() except ImportError: pass if len(argv) < 2: usage() return 0 cmd = argv[1] def readit(): return read_weave(file(argv[2], 'rb')) if cmd == 'help': usage() elif cmd == 'add': w = readit() # at the moment, based on everything in the file name = argv[3] parents = map(int, argv[4:]) lines = sys.stdin.readlines() ver = w.add(name, parents, lines) write_weave(w, file(argv[2], 'wb')) print 'added version %r %d' % (name, ver) elif cmd == 'init': fn = argv[2] if os.path.exists(fn): raise IOError("file exists") w = Weave() write_weave(w, file(fn, 'wb')) elif cmd == 'get': # get one version w = readit() sys.stdout.writelines(w.get_iter(int(argv[3]))) elif cmd == 'diff': w = readit() fn = argv[2] v1, v2 = map(int, argv[3:5]) lines1 = w.get(v1) lines2 = w.get(v2) diff_gen = bzrlib.patiencediff.unified_diff(lines1, lines2, '%s version %d' % (fn, v1), '%s version %d' % (fn, v2)) sys.stdout.writelines(diff_gen) elif cmd == 'annotate': w = readit() # newline is added to all lines regardless; too hard to get # reasonable formatting otherwise lasto = None for origin, text in w.annotate(int(argv[3])): text = text.rstrip('\r\n') if origin == lasto: print ' | %s' % (text) else: print '%5d | %s' % (origin, text) lasto = origin elif cmd == 'toc': weave_toc(readit()) elif cmd == 'stats': weave_stats(argv[2], ProgressBar()) elif cmd == 'check': w = readit() pb = ProgressBar() w.check(pb) pb.clear() print '%d versions ok' % w.num_versions() elif cmd == 'inclusions': w = readit() print ' '.join(map(str, w.inclusions([int(argv[3])]))) elif cmd == 'parents': w = readit() print ' '.join(map(str, w._parents[int(argv[3])])) elif cmd == 'plan-merge': # replaced by 'bzr weave-plan-merge' w = readit() for state, line in w.plan_merge(int(argv[3]), int(argv[4])): if line: print '%14s | %s' % (state, line), elif cmd == 'merge': # replaced by 'bzr weave-merge-text' w = readit() p = w.plan_merge(int(argv[3]), int(argv[4])) sys.stdout.writelines(w.weave_merge(p)) else: raise ValueError('unknown command %r' % cmd)