Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/util.py @ 15669:390bcd01775a stable
icasefs: use util.normcase() instead of lower() or os.path.normcase in fspath
this also avoids lower()-ing on each path components by reuse the path
normcase()-ed at beginning of function.
author | FUJIWARA Katsunori <foozy@lares.dti.ne.jp> |
---|---|
date | Fri, 16 Dec 2011 21:09:40 +0900 |
parents | eacfd851cb9e |
children | d6c19cfa03ce |
comparison
equal
deleted
inserted
replaced
15668:8e020155e76c | 15669:390bcd01775a |
---|---|
616 The name is either relative to root, or it is an absolute path starting | 616 The name is either relative to root, or it is an absolute path starting |
617 with root. Note that this function is unnecessary, and should not be | 617 with root. Note that this function is unnecessary, and should not be |
618 called, for case-sensitive filesystems (simply because it's expensive). | 618 called, for case-sensitive filesystems (simply because it's expensive). |
619 ''' | 619 ''' |
620 # If name is absolute, make it relative | 620 # If name is absolute, make it relative |
621 if name.lower().startswith(root.lower()): | 621 name = normcase(name) |
622 root = normcase(root) | |
623 if name.startswith(root): | |
622 l = len(root) | 624 l = len(root) |
623 if name[l] == os.sep or name[l] == os.altsep: | 625 if name[l] == os.sep or name[l] == os.altsep: |
624 l = l + 1 | 626 l = l + 1 |
625 name = name[l:] | 627 name = name[l:] |
626 | 628 |
631 if os.altsep: | 633 if os.altsep: |
632 seps = seps + os.altsep | 634 seps = seps + os.altsep |
633 # Protect backslashes. This gets silly very quickly. | 635 # Protect backslashes. This gets silly very quickly. |
634 seps.replace('\\','\\\\') | 636 seps.replace('\\','\\\\') |
635 pattern = re.compile(r'([^%s]+)|([%s]+)' % (seps, seps)) | 637 pattern = re.compile(r'([^%s]+)|([%s]+)' % (seps, seps)) |
636 dir = os.path.normcase(os.path.normpath(root)) | 638 dir = os.path.normpath(root) |
637 result = [] | 639 result = [] |
638 for part, sep in pattern.findall(name): | 640 for part, sep in pattern.findall(name): |
639 if sep: | 641 if sep: |
640 result.append(sep) | 642 result.append(sep) |
641 continue | 643 continue |
642 | 644 |
643 if dir not in _fspathcache: | 645 if dir not in _fspathcache: |
644 _fspathcache[dir] = os.listdir(dir) | 646 _fspathcache[dir] = os.listdir(dir) |
645 contents = _fspathcache[dir] | 647 contents = _fspathcache[dir] |
646 | 648 |
647 lpart = part.lower() | |
648 lenp = len(part) | 649 lenp = len(part) |
649 for n in contents: | 650 for n in contents: |
650 if lenp == len(n) and n.lower() == lpart: | 651 if lenp == len(n) and normcase(n) == part: |
651 result.append(n) | 652 result.append(n) |
652 break | 653 break |
653 else: | 654 else: |
654 # Cannot happen, as the file exists! | 655 # Cannot happen, as the file exists! |
655 result.append(part) | 656 result.append(part) |
656 dir = os.path.join(dir, lpart) | 657 dir = os.path.join(dir, part) |
657 | 658 |
658 return ''.join(result) | 659 return ''.join(result) |
659 | 660 |
660 def checknlink(testfile): | 661 def checknlink(testfile): |
661 '''check whether hardlink count reporting works properly''' | 662 '''check whether hardlink count reporting works properly''' |