summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gemato/recursiveloader.py20
-rw-r--r--tests/test_recursiveloader.py6
2 files changed, 14 insertions, 12 deletions
diff --git a/gemato/recursiveloader.py b/gemato/recursiveloader.py
index 1387212..752ecf5 100644
--- a/gemato/recursiveloader.py
+++ b/gemato/recursiveloader.py
@@ -99,7 +99,7 @@ class ManifestRecursiveLoader(object):
"""
Iterate over loaded Manifests that can apply to path.
If @recursive is True, returns also Manifests for subdirectories
- of @path. Yields a tuple of (relative_path, manifest).
+ of @path. Yields a tuple of (manifest_path, dir_path, manifest).
The function guarantees that the Manifests for subdirectories
(more specific) will always be returned before the Manifests
@@ -110,9 +110,9 @@ class ManifestRecursiveLoader(object):
reverse=True):
d = os.path.dirname(k)
if gemato.util.path_starts_with(path, d):
- yield (d, v)
+ yield (k, d, v)
elif recursive and gemato.util.path_starts_with(d, path):
- yield (d, v)
+ yield (k, d, v)
def load_manifests_for_path(self, path, recursive=False):
"""
@@ -123,12 +123,13 @@ class ManifestRecursiveLoader(object):
# TODO: figure out how to avoid confusing uses of 'recursive'
while True:
to_load = []
- for relpath, m in self._iter_manifests_for_path(path, recursive):
+ for curmpath, relpath, m in self._iter_manifests_for_path(
+ path, recursive):
for e in m.entries:
if not isinstance(e, gemato.manifest.ManifestEntryMANIFEST):
continue
mpath = os.path.join(relpath, e.path)
- if mpath in self.loaded_manifests:
+ if curmpath == mpath or mpath in self.loaded_manifests:
continue
mdir = os.path.dirname(mpath)
if gemato.util.path_starts_with(path, mdir):
@@ -147,7 +148,7 @@ class ManifestRecursiveLoader(object):
"""
self.load_manifests_for_path('')
- for p, m in self._iter_manifests_for_path(''):
+ for mpath, p, m in self._iter_manifests_for_path(''):
for e in m.entries:
if isinstance(e, gemato.manifest.ManifestEntryTIMESTAMP):
return e
@@ -160,7 +161,7 @@ class ManifestRecursiveLoader(object):
"""
self.load_manifests_for_path(path)
- for relpath, m in self._iter_manifests_for_path(path):
+ for mpath, relpath, m in self._iter_manifests_for_path(path):
for e in m.entries:
if isinstance(e, gemato.manifest.ManifestEntryIGNORE):
# ignore matches recursively, so we process it separately
@@ -210,7 +211,7 @@ class ManifestRecursiveLoader(object):
"""
self.load_manifests_for_path(relpath+'/')
- for p, m in self._iter_manifests_for_path(relpath+'/'):
+ for mpath, p, m in self._iter_manifests_for_path(relpath+'/'):
for e in m.entries:
if isinstance(e, gemato.manifest.ManifestEntryDIST):
if e.path == filename:
@@ -226,7 +227,8 @@ class ManifestRecursiveLoader(object):
self.load_manifests_for_path(path, recursive=True)
out = {}
- for relpath, m in self._iter_manifests_for_path(path, recursive=True):
+ for mpath, relpath, m in self._iter_manifests_for_path(path,
+ recursive=True):
for e in m.entries:
if isinstance(e, gemato.manifest.ManifestEntryDIST):
# distfiles are not local files, so skip them
diff --git a/tests/test_recursiveloader.py b/tests/test_recursiveloader.py
index 3debeaa..e17f144 100644
--- a/tests/test_recursiveloader.py
+++ b/tests/test_recursiveloader.py
@@ -79,10 +79,10 @@ DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e
m = gemato.recursiveloader.ManifestRecursiveLoader(
os.path.join(self.dir, 'Manifest'))
m.load_manifests_for_path('', recursive=True)
- self.assertListEqual([d for d, k
+ self.assertListEqual([d for mpath, d, k
in m._iter_manifests_for_path('sub/deeper')],
['sub/deeper', 'sub', ''])
- self.assertListEqual([d for d, k
+ self.assertListEqual([d for mpath, d, k
in m._iter_manifests_for_path('other')],
['other', ''])
@@ -90,7 +90,7 @@ DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e
m = gemato.recursiveloader.ManifestRecursiveLoader(
os.path.join(self.dir, 'Manifest'))
m.load_manifests_for_path('', recursive=True)
- self.assertListEqual([d for d, k
+ self.assertListEqual([d for mpath, d, k
in m._iter_manifests_for_path('sub',
recursive=True)],
['sub/deeper', 'sub', ''])