changeset 290:86281f8eef44

Include the filename instead of the absolute file path in MD5 files, so that the snapshots directory can be moved without invalidating all the archives already created.
author cmlenz
date Thu, 20 Oct 2005 13:50:59 +0000
parents 9d93e622f963
children d83208ed2db9
files bitten/util/md5sum.py bitten/util/tests/md5sum.py
diffstat 2 files changed, 26 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/bitten/util/md5sum.py
+++ b/bitten/util/md5sum.py
@@ -23,17 +23,17 @@
     @param filename: the absolute path to the file
     @return: string containing the checksum
     """
-    md5sum = md5.new()
+    checksum = md5.new()
     fileobj = file(filename, 'rb')
     try:
         while True:
             chunk = fileobj.read(4096)
             if not chunk:
                 break
-            md5sum.update(chunk)
+            checksum.update(chunk)
     finally:
         fileobj.close()
-    return md5sum.hexdigest() + '  ' + filename
+    return checksum.hexdigest()
 
 def write(filename, md5file=None):
     """Write an MD5 checksum file for the specified file.
@@ -50,7 +50,7 @@
 
     fileobj = file(md5file, 'w')
     try:
-        fileobj.write(generate(filename))
+        fileobj.write(generate(filename) + '  ' + os.path.basename(filename))
     finally:
         fileobj.close()
     return md5file
@@ -76,9 +76,15 @@
                 raise IntegrityError, 'Checksum file not found'
         fileobj = file(md5file, 'r')
         try:
-            checksum = fileobj.read()
+            content = fileobj.read()
         finally:
             fileobj.close()
+        try:
+            checksum, path = content.split('  ')
+        except ValueError:
+            raise IntegrityError, 'Checksum file invalid'
+        if path != os.path.basename(filename):
+            raise IntegrityError, 'Checksum for a different file'
 
     expected = generate(filename)
     if expected != checksum:
--- a/bitten/util/tests/md5sum.py
+++ b/bitten/util/tests/md5sum.py
@@ -34,9 +34,8 @@
 
     def test_generate(self):
         filename = self._create_file('test.xyz', 'Foo bar')
-        checksum = md5sum.generate(filename).split('  ')
-        self.assertEqual(md5.new('Foo bar').hexdigest(), checksum[0])
-        self.assertEqual(filename, checksum[1])
+        checksum = md5sum.generate(filename)
+        self.assertEqual(md5.new('Foo bar').hexdigest(), checksum)
 
     def test_write(self):
         filename = self._create_file('test.xyz', 'Foo bar')
@@ -44,11 +43,11 @@
         self.assertEqual(filename + '.md5', md5file)
         fileobj = file(md5file, 'r')
         try:
-            checksum = fileobj.read().split('  ')
+            checksum, path = fileobj.read().split('  ')
         finally:
             fileobj.close()
-        self.assertEqual(md5.new('Foo bar').hexdigest(), checksum[0])
-        self.assertEqual(filename, checksum[1])
+        self.assertEqual(md5.new('Foo bar').hexdigest(), checksum)
+        self.assertEqual('test.xyz', path)
 
     def test_write_with_md5file(self):
         filename = self._create_file('test.xyz', 'Foo bar')
@@ -56,11 +55,11 @@
         self.assertEqual(md5file, md5sum.write(filename, md5file=md5file))
         fileobj = file(md5file, 'r')
         try:
-            checksum = fileobj.read().split('  ')
+            checksum, path = fileobj.read().split('  ')
         finally:
             fileobj.close()
-        self.assertEqual(md5.new('Foo bar').hexdigest(), checksum[0])
-        self.assertEqual(filename, checksum[1])
+        self.assertEqual(md5.new('Foo bar').hexdigest(), checksum)
+        self.assertEqual('test.xyz', path)
 
     def test_validate_missing(self):
         filename = self._create_file('test.xyz', 'Foo bar')
@@ -72,6 +71,12 @@
         md5file = self._create_file('test.xyz.md5', checksum)
         self.assertRaises(md5sum.IntegrityError, md5sum.validate, filename)
 
+    def test_validate_invalid_format(self):
+        filename = self._create_file('test.xyz', 'Foo bar')
+        checksum = md5.new('Foo bar').hexdigest() + ',' + filename
+        md5file = self._create_file('test.xyz.md5', checksum)
+        self.assertRaises(md5sum.IntegrityError, md5sum.validate, filename)
+
     def test_validate_incorrect_path(self):
         filename = self._create_file('test.xyz', 'Foo bar')
         checksum = md5.new('Foo bar').hexdigest() + '  ' + '/etc/test'
@@ -80,8 +85,7 @@
 
     def test_validate_with_checksum(self):
         filename = self._create_file('test.xyz', 'Foo bar')
-        checksum = md5.new('Foo bar').hexdigest() + '  ' + filename
-        md5sum.validate(filename, checksum)
+        md5sum.validate(filename, md5.new('Foo bar').hexdigest())
 
 
 def suite():
Copyright (C) 2012-2017 Edgewall Software