Mercurial > ~astiob > upreckon > hgweb
changeset 246:1bc89faac941 2.04
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.
author | Oleg Oshmyan <chortos@inbox.lv> |
---|---|
date | Thu, 03 Oct 2013 01:19:09 +0300 |
parents | 08ffa5a975e8 |
children | f5847d29e838 bbd735702dc4 |
files | upreckon/files.py |
diffstat | 1 files changed, 24 insertions(+), 18 deletions(-) [+] |
line wrap: on
line diff
--- 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