Mercurial > hg > mercurial-crew-with-dirclash
comparison mercurial/dirstate.py @ 5003:4d079df2871a
dirstate: speed up sorting in findfiles
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Thu, 26 Jul 2007 12:02:58 -0500 |
parents | 62e3fd2baca4 |
children | 4b1acb3ecb3c |
comparison
equal
deleted
inserted
replaced
5002:62e3fd2baca4 | 5003:4d079df2871a |
---|---|
377 known = {'.hg': 1} | 377 known = {'.hg': 1} |
378 | 378 |
379 # recursion free walker, faster than os.walk. | 379 # recursion free walker, faster than os.walk. |
380 def findfiles(s): | 380 def findfiles(s): |
381 work = [s] | 381 work = [s] |
382 wadd = work.append | |
383 found = [] | |
384 add = found.append | |
382 if directories: | 385 if directories: |
383 yield 'd', normpath(s[common_prefix_len:]), lstat(s) | 386 add((normpath(s[common_prefix_len:]), 'd', lstat(s))) |
384 while work: | 387 while work: |
385 top = work.pop() | 388 top = work.pop() |
386 names = listdir(top) | 389 names = listdir(top) |
387 names.sort() | 390 names.sort() |
388 # nd is the top of the repository dir tree | 391 # nd is the top of the repository dir tree |
405 p = join(top, f) | 408 p = join(top, f) |
406 # don't trip over symlinks | 409 # don't trip over symlinks |
407 st = lstat(p) | 410 st = lstat(p) |
408 if s_isdir(st.st_mode): | 411 if s_isdir(st.st_mode): |
409 if not ignore(np): | 412 if not ignore(np): |
410 work.append(p) | 413 wadd(p) |
411 if directories: | 414 if directories: |
412 yield 'd', np, st | 415 add((np, 'd', st)) |
413 if np in dc and match(np): | 416 if np in dc and match(np): |
414 yield 'm', np, st | 417 add((np, 'm', st)) |
415 elif imatch(np): | 418 elif imatch(np): |
416 if supported(np, st.st_mode): | 419 if supported(np, st.st_mode): |
417 yield 'f', np, st | 420 add((np, 'f', st)) |
418 elif np in dc: | 421 elif np in dc: |
419 yield 'm', np, st | 422 add((np, 'm', st)) |
423 found.sort() | |
424 return found | |
420 | 425 |
421 # step one, find all files that match our criteria | 426 # step one, find all files that match our criteria |
422 files.sort() | 427 files.sort() |
423 for ff in files: | 428 for ff in files: |
424 nf = normpath(ff) | 429 nf = normpath(ff) |
437 (self.pathto(ff), inst.strerror)) | 442 (self.pathto(ff), inst.strerror)) |
438 elif badmatch and badmatch(ff) and imatch(nf): | 443 elif badmatch and badmatch(ff) and imatch(nf): |
439 yield 'b', ff, None | 444 yield 'b', ff, None |
440 continue | 445 continue |
441 if s_isdir(st.st_mode): | 446 if s_isdir(st.st_mode): |
442 cmp1 = (lambda x, y: cmp(x[1], y[1])) | 447 for f, src, st in findfiles(f): |
443 sorted_ = [ x for x in findfiles(f) ] | 448 yield src, f, st |
444 sorted_.sort(cmp1) | |
445 for e in sorted_: | |
446 yield e | |
447 else: | 449 else: |
448 if nf in known: | 450 if nf in known: |
449 continue | 451 continue |
450 known[nf] = 1 | 452 known[nf] = 1 |
451 if match(nf): | 453 if match(nf): |