| # DExTer : Debugging Experience Tester |
| # ~~~~~~ ~ ~~ ~ ~~ |
| # |
| # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| # See https://llvm.org/LICENSE.txt for license information. |
| # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| """Create/set a temporary working directory for some operations.""" |
| |
| import os |
| import shutil |
| import tempfile |
| import time |
| |
| from dex.utils.Exceptions import Error |
| from dex.utils.Warning import warn |
| |
| class WorkingDirectory(object): |
| def __init__(self, context, *args, **kwargs): |
| self.context = context |
| self.orig_cwd = os.getcwd() |
| |
| dir_ = kwargs.get('dir', None) |
| if dir_ and not os.path.isdir(dir_): |
| os.makedirs(dir_, exist_ok=True) |
| self.path = tempfile.mkdtemp(*args, **kwargs) |
| |
| def __enter__(self): |
| os.chdir(self.path) |
| return self |
| |
| def __exit__(self, *args): |
| os.chdir(self.orig_cwd) |
| if self.context.options.save_temps: |
| self.context.o.blue('"{}" left in place [--save-temps]\n'.format( |
| self.path)) |
| return |
| |
| for _ in range(100): |
| try: |
| shutil.rmtree(self.path) |
| return |
| except OSError: |
| time.sleep(0.1) |
| |
| warn(self.context, '"{}" left in place (couldn\'t delete)\n'.format(self.path)) |
| return |