# HG changeset patch # User Oleg Oshmyan # Date 1380752349 -10800 # Node ID 1bc89faac9418b3e57bc9520b92ba8512161c4d8 # Parent 08ffa5a975e8dbdb1e230ffd9419b99f0bdcbd76 Fixed: match='re' could produce duplicate test identifiers files.Files.regexp(pattern) now makes sure to return only one metafile for each matching virtual path, namely, the one that would be returned for that virtual path by files.Files.from_virtual_path. diff -r 08ffa5a975e8 -r 1bc89faac941 upreckon/files.py --- a/upreckon/files.py Tue Dec 11 03:16:48 2012 +0200 +++ b/upreckon/files.py Thu Oct 03 01:19:09 2013 +0300 @@ -297,6 +297,12 @@ for filename in archives: yield self.__add__(filename, False) + def _also_add_tests(self): + yield self + if not self._has_tests: + for metafile in self._add_tests(): + yield metafile + def _add_virtual(self, filename): return File(posixpath.join(self.virtual_path, filename), self._external_path, @@ -324,29 +330,29 @@ _has_tests=self._has_tests) @classmethod - def regexp(cls, pattern): + def regexp(cls, pattern, _unique=True): if not pattern: yield cls('', os.curdir) return dirname, basename = posixpath.split(pattern) - dirs = cls.regexp(dirname) + dirs = cls.regexp(dirname, False) reobj = re.compile(pattern + '$', re.UNICODE) + if _unique: + yielded = set() while dirs: newdirs = [] - for directory in dirs: - try: - names = directory.listdir() - except Exception: - continue - for name in names: - dir_entry = directory + name - if re.match(reobj, dir_entry.virtual_path): - yield dir_entry - if not directory._has_tests: - if name == 'tests': - dir_entry = directory.__add__(name, False) - dir_entry._has_tests = True - newdirs.append(dir_entry) - elif not directory.archive and name in archives: - newdirs.append(directory.__add__(name, False)) + for testless_directory in dirs: + for directory in testless_directory._also_add_tests(): + try: + names = directory.listdir() + except Exception: + continue + for name in names: + dir_entry = directory + name + if re.match(reobj, dir_entry.virtual_path): + if not _unique: + yield dir_entry + elif dir_entry.virtual_path not in yielded: + yield dir_entry + yielded.add(dir_entry.virtual_path) dirs = newdirs