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)
| 2907 | # Little helper methods: |
| 2908 | |
| 2909 | def _getmember(self, name, tarinfo=None, normalize=False): |
| 2910 | """Find an archive member by name from bottom to top. |
| 2911 | If tarinfo is given, it is used as the starting point. |
| 2912 | """ |
| 2913 | # Ensure that all members have been loaded. |
| 2914 | members = self.getmembers() |
| 2915 | |
| 2916 | # Limit the member search list up to tarinfo. |
| 2917 | skipping = False |
| 2918 | if tarinfo is not None: |
| 2919 | try: |
| 2920 | index = members.index(tarinfo) |
| 2921 | except ValueError: |
| 2922 | # The given starting point might be a (modified) copy. |
| 2923 | # We'll later skip members until we find an equivalent. |
| 2924 | skipping = True |
| 2925 | else: |
| 2926 | # Happy fast path |
| 2927 | members = members[:index] |
| 2928 | |
| 2929 | if normalize: |
| 2930 | name = os.path.normpath(name) |
| 2931 | |
| 2932 | for member in reversed(members): |
| 2933 | if skipping: |
| 2934 | if tarinfo.offset == member.offset: |
| 2935 | skipping = False |
| 2936 | continue |
| 2937 | if normalize: |
| 2938 | member_name = os.path.normpath(member.name) |
| 2939 | else: |
| 2940 | member_name = member.name |
| 2941 | |
| 2942 | if name == member_name: |
| 2943 | return member |
| 2944 | |
| 2945 | if skipping: |
| 2946 | # Starting point was not found |
| 2947 | raise ValueError(tarinfo) |
| 2948 | |
| 2949 | def _load(self): |
| 2950 | """Read through the entire archive file and look for readable |
no test coverage detected