Find an archive member by name from bottom to top. If tarinfo is given, it is used as the starting point.
(self, name, tarinfo=None, normalize=False)
| 2646 | # Little helper methods: |
| 2647 | |
| 2648 | def _getmember(self, name, tarinfo=None, normalize=False): |
| 2649 | """Find an archive member by name from bottom to top. |
| 2650 | If tarinfo is given, it is used as the starting point. |
| 2651 | """ |
| 2652 | # Ensure that all members have been loaded. |
| 2653 | members = self.getmembers() |
| 2654 | |
| 2655 | # Limit the member search list up to tarinfo. |
| 2656 | skipping = False |
| 2657 | if tarinfo is not None: |
| 2658 | try: |
| 2659 | index = members.index(tarinfo) |
| 2660 | except ValueError: |
| 2661 | # The given starting point might be a (modified) copy. |
| 2662 | # We'll later skip members until we find an equivalent. |
| 2663 | skipping = True |
| 2664 | else: |
| 2665 | # Happy fast path |
| 2666 | members = members[:index] |
| 2667 | |
| 2668 | if normalize: |
| 2669 | name = os.path.normpath(name) |
| 2670 | |
| 2671 | for member in reversed(members): |
| 2672 | if skipping: |
| 2673 | if tarinfo.offset == member.offset: |
| 2674 | skipping = False |
| 2675 | continue |
| 2676 | if normalize: |
| 2677 | member_name = os.path.normpath(member.name) |
| 2678 | else: |
| 2679 | member_name = member.name |
| 2680 | |
| 2681 | if name == member_name: |
| 2682 | return member |
| 2683 | |
| 2684 | if skipping: |
| 2685 | # Starting point was not found |
| 2686 | raise ValueError(tarinfo) |
| 2687 | |
| 2688 | def _load(self): |
| 2689 | """Read through the entire archive file and look for readable |
no test coverage detected