visit() now returns paths in depth-first order. fixes issue #47
--HG-- branch : trunk
This commit is contained in:
		
							parent
							
								
									e3b34c9da3
								
							
						
					
					
						commit
						6ddea4a1bc
					
				|  | @ -278,20 +278,20 @@ newline will be removed from the end of each line. """ | |||
|         if rec:  | ||||
|             if isinstance(rec, str): | ||||
|                 rec = fnmatch(fil) | ||||
|             elif not py.builtin.callable(rec):  | ||||
|                 rec = lambda x: True  | ||||
|         reclist = [self] | ||||
|         while reclist:  | ||||
|             current = reclist.pop(0) | ||||
|             try: | ||||
|                 dirlist = current.listdir()  | ||||
|             except ignore: | ||||
|                 return | ||||
|             for p in dirlist: | ||||
|                 if fil is None or fil(p): | ||||
|                     yield p | ||||
|                 if p.check(dir=1) and (rec is None or rec(p)): | ||||
|                     reclist.append(p) | ||||
|             elif not hasattr(rec, '__call__'): | ||||
|                 rec = None | ||||
|         try: | ||||
|             entries = self.listdir() | ||||
|         except ignore: | ||||
|             return | ||||
|         dirs = [p for p in entries  | ||||
|                     if p.check(dir=1) and (rec is None or rec(p))] | ||||
|         for subdir in dirs: | ||||
|             for p in subdir.visit(fil=fil, rec=rec, ignore=ignore): | ||||
|                 yield p | ||||
|         for p in entries: | ||||
|             if fil is None or fil(p): | ||||
|                 yield p | ||||
| 
 | ||||
|     def _sortlist(self, res, sort): | ||||
|         if sort: | ||||
|  |  | |||
|  | @ -334,12 +334,12 @@ class LocalPath(FSBase): | |||
|             assert self!=target | ||||
|             copychunked(self, target) | ||||
|         else: | ||||
|             target.ensure(dir=1) | ||||
|             def rec(p): | ||||
|                 return p.check(link=0) | ||||
|             for x in self.visit(rec=rec): | ||||
|                 relpath = x.relto(self) | ||||
|                 newx = target.join(relpath) | ||||
|                 newx.dirpath().ensure(dir=1) | ||||
|                 if x.check(link=1): | ||||
|                     newx.mksymlinkto(x.readlink()) | ||||
|                 elif x.check(file=1): | ||||
|  |  | |||
|  | @ -198,6 +198,15 @@ class TestLocalPath(common.CommonFSTests): | |||
|         l2 = tmpdir.join(newfilename) | ||||
|         assert l2.read() == 'foo' | ||||
| 
 | ||||
|     def test_visit_depth_first(self, tmpdir): | ||||
|         p1 = tmpdir.ensure("a","1") | ||||
|         p2 = tmpdir.ensure("b","2") | ||||
|         p3 = tmpdir.ensure("breadth") | ||||
|         l = list(tmpdir.visit(lambda x: x.check(file=1))) | ||||
|         assert l[0] == p1 | ||||
|         assert l[1] == p2  | ||||
|         assert l[2] == p3 | ||||
| 
 | ||||
| class TestExecutionOnWindows: | ||||
|     disabled = py.std.sys.platform != 'win32' | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue