summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichał Górny <mgorny@gentoo.org>2017-10-29 09:25:27 +0100
committerMichał Górny <mgorny@gentoo.org>2017-10-29 09:25:27 +0100
commit8f78c62730a468baf4ff1e9328a89f57bbbfb246 (patch)
tree7ac53394a059aa033c0397bea24b95bd06cfd6a7
parentf67c7a02467f0e5975905504995f8c599bc323e5 (diff)
downloadgemato-8f78c62730a468baf4ff1e9328a89f57bbbfb246.tar.gz
recursiveloader: Fix ordering compressed Manifests
-rw-r--r--gemato/recursiveloader.py16
-rw-r--r--tests/test_recursiveloader.py52
2 files changed, 64 insertions, 4 deletions
diff --git a/gemato/recursiveloader.py b/gemato/recursiveloader.py
index be3b738..3a4aeb2 100644
--- a/gemato/recursiveloader.py
+++ b/gemato/recursiveloader.py
@@ -109,6 +109,15 @@ class ManifestRecursiveLoader(object):
openpgp_env=self.openpgp_env,
openpgp_keyid=self.openpgp_keyid)
+ def _iter_manifests(self):
+ """
+ Iterate over all loaded Manifests, in any order. Yields a tuple
+ of (manifest_path, dir_path, manifest).
+ """
+ for k, v in self.loaded_manifests.items():
+ d = os.path.dirname(k)
+ yield (k, d, v)
+
def _iter_manifests_for_path(self, path, recursive=False):
"""
Iterate over loaded Manifests that can apply to path.
@@ -119,10 +128,9 @@ class ManifestRecursiveLoader(object):
(more specific) will always be returned before the Manifests
for parent directories. The order is otherwise undefined.
"""
- for k, v in sorted(self.loaded_manifests.items(),
- key=lambda x: len(x[0]),
- reverse=True):
- d = os.path.dirname(k)
+ for k, d, v in sorted(self._iter_manifests(),
+ key=lambda kdv: len(kdv[1]),
+ reverse=True):
if gemato.util.path_starts_with(path, d):
yield (k, d, v)
elif recursive and gemato.util.path_starts_with(d, path):
diff --git a/tests/test_recursiveloader.py b/tests/test_recursiveloader.py
index ccab094..5631458 100644
--- a/tests/test_recursiveloader.py
+++ b/tests/test_recursiveloader.py
@@ -1895,3 +1895,55 @@ MANIFEST sub/Manifest.gz 78 MD5 9c158f87b2445279d7c8aac439612fba
self.assertNotEqual(f.read(),
base64.b64decode(self.SUB_MANIFEST))
m.assert_directory_verifies()
+
+
+class CompressedManifestOrderingTest(TempDirTestCase):
+ """
+ Compressed Manifest paths can be shorter than regular, resulting
+ in wrong sort order.
+ """
+
+ MANIFEST = b'''
+MANIFEST a/Manifest 0 MD5 d41d8cd98f00b204e9800998ecf8427e
+'''
+ DIRS = ['a']
+ FILES = {
+ 'a/Manifest': u'',
+ 'a/stray': u'',
+ }
+
+ def setUp(self):
+ super(CompressedManifestOrderingTest, self).setUp()
+ self.manifest_gz = os.path.join(self.dir, 'Manifest.gz')
+ with gzip.GzipFile(self.manifest_gz, 'wb') as f:
+ f.write(self.MANIFEST)
+
+ def tearDown(self):
+ os.unlink(self.manifest_gz)
+ super(CompressedManifestOrderingTest, self).tearDown()
+
+ def test__iter_manifests_for_path_order(self):
+ m = gemato.recursiveloader.ManifestRecursiveLoader(
+ self.manifest_gz)
+ m.load_manifests_for_path('', recursive=True)
+ self.assertListEqual([d for mpath, d, k
+ in m._iter_manifests_for_path('a')],
+ ['a', ''])
+
+ def test_update_entries_for_directory(self):
+ m = gemato.recursiveloader.ManifestRecursiveLoader(
+ self.manifest_gz)
+ m.update_entries_for_directory('', hashes=['SHA256', 'SHA512'])
+ self.assertIsInstance(m.find_path_entry('a/stray'),
+ gemato.manifest.ManifestEntryDATA)
+ m.save_manifests()
+ m.assert_directory_verifies()
+
+ def test_cli_update(self):
+ self.assertEqual(
+ gemato.cli.main(['gemato', 'update', '--hashes=SHA256 SHA512',
+ self.dir]),
+ 0)
+ self.assertEqual(
+ gemato.cli.main(['gemato', 'verify', self.dir]),
+ 0)