Mercurial > ~astiob > upreckon > hgweb
comparison upreckon/files.py @ 247:f5847d29e838
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 | 6dd29475ae9b 1bc89faac941 |
children | d32b14e5a43b |
comparison
equal
deleted
inserted
replaced
245:6dd29475ae9b | 247:f5847d29e838 |
---|---|
295 yield metafile | 295 yield metafile |
296 if not self.archive: | 296 if not self.archive: |
297 for filename in archives: | 297 for filename in archives: |
298 yield self.__add__(filename, False) | 298 yield self.__add__(filename, False) |
299 | 299 |
300 def _also_add_tests(self): | |
301 yield self | |
302 if not self._has_tests: | |
303 for metafile in self._add_tests(): | |
304 yield metafile | |
305 | |
300 def _add_virtual(self, filename): | 306 def _add_virtual(self, filename): |
301 return File(posixpath.join(self.virtual_path, filename), | 307 return File(posixpath.join(self.virtual_path, filename), |
302 self._external_path, | 308 self._external_path, |
303 self._internal_path, | 309 self._internal_path, |
304 self.archive, | 310 self.archive, |
322 return File(virtual_path, | 328 return File(virtual_path, |
323 os.path.join(self._external_path, filename), | 329 os.path.join(self._external_path, filename), |
324 _has_tests=self._has_tests) | 330 _has_tests=self._has_tests) |
325 | 331 |
326 @classmethod | 332 @classmethod |
327 def regexp(cls, pattern): | 333 def regexp(cls, pattern, _unique=True): |
328 if not pattern: | 334 if not pattern: |
329 yield cls('', os.curdir) | 335 yield cls('', os.curdir) |
330 return | 336 return |
331 dirname, basename = posixpath.split(pattern) | 337 dirname, basename = posixpath.split(pattern) |
332 dirs = cls.regexp(dirname) | 338 dirs = cls.regexp(dirname, False) |
333 reobj = re.compile(pattern + '$', re.UNICODE) | 339 reobj = re.compile(pattern + '$', re.UNICODE) |
340 if _unique: | |
341 yielded = set() | |
334 while dirs: | 342 while dirs: |
335 newdirs = [] | 343 newdirs = [] |
336 for directory in dirs: | 344 for testless_directory in dirs: |
337 try: | 345 for directory in testless_directory._also_add_tests(): |
338 names = directory.listdir() | 346 try: |
339 except Exception: | 347 names = directory.listdir() |
340 continue | 348 except Exception: |
341 for name in names: | 349 continue |
342 dir_entry = directory + name | 350 for name in names: |
343 if re.match(reobj, dir_entry.virtual_path): | 351 dir_entry = directory + name |
344 yield dir_entry | 352 if re.match(reobj, dir_entry.virtual_path): |
345 if not directory._has_tests: | 353 if not _unique: |
346 if name == 'tests': | 354 yield dir_entry |
347 dir_entry = directory.__add__(name, False) | 355 elif dir_entry.virtual_path not in yielded: |
348 dir_entry._has_tests = True | 356 yield dir_entry |
349 newdirs.append(dir_entry) | 357 yielded.add(dir_entry.virtual_path) |
350 elif not directory.archive and name in archives: | |
351 newdirs.append(directory.__add__(name, False)) | |
352 dirs = newdirs | 358 dirs = newdirs |