| # Copyright 2019 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Helper context wrapper for diagnosing crbug.com/1001171. |
| |
| This module and all uses thereof can and should be removed once |
| crbug.com/1001171 has been resolved. |
| """ |
| |
| from __future__ import print_function |
| |
| import contextlib |
| import os |
| import sys |
| |
| |
| @contextlib.contextmanager |
| def DumpStateOnLookupError(): |
| """Prints potentially useful state info in the event of a LookupError.""" |
| try: |
| yield |
| except LookupError: |
| print('LookupError diagnosis for crbug.com/1001171:') |
| for path_index, path_entry in enumerate(sys.path): |
| desc = 'unknown' |
| if not os.path.exists(path_entry): |
| desc = 'missing' |
| elif os.path.islink(path_entry): |
| desc = 'link -> %s' % os.path.realpath(path_entry) |
| elif os.path.isfile(path_entry): |
| desc = 'file' |
| elif os.path.isdir(path_entry): |
| desc = 'dir' |
| print(' sys.path[%d]: %s (%s)' % (path_index, path_entry, desc)) |
| |
| real_path_entry = os.path.realpath(path_entry) |
| if (path_entry.endswith(os.path.join('lib', 'python2.7')) |
| and os.path.isdir(real_path_entry)): |
| encodings_dir = os.path.realpath( |
| os.path.join(real_path_entry, 'encodings')) |
| if os.path.exists(encodings_dir): |
| if os.path.isdir(encodings_dir): |
| print(' %s contents: %s' % (encodings_dir, |
| str(os.listdir(encodings_dir)))) |
| else: |
| print(' %s exists but is not a directory' % encodings_dir) |
| else: |
| print(' %s missing' % encodings_dir) |
| |
| raise |