| # Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
| # Use of this source code is governed by a BSD-style license that can be | |
| # found in the LICENSE file. | |
| import errno | |
| import os | |
| import uuid | |
| """Creates a directory and its parents (i.e. `mkdir -p`). | |
| If the directory already exists, does nothing.""" | |
| def mkdir_p(path): | |
| try: | |
| os.makedirs(path) | |
| except OSError as exc: | |
| if exc.errno == errno.EEXIST and os.path.isdir(path): | |
| pass | |
| else: | |
| raise | |
| """Creates or ovewrites a symlink from `link` to `target`.""" | |
| def symlink(target, link): | |
| mkdir_p(os.path.dirname(link)) | |
| tmp_link = link + '.tmp.' + uuid.uuid4().hex | |
| try: | |
| os.remove(tmp_link) | |
| except OSError: | |
| pass | |
| os.symlink(target, tmp_link) | |
| try: | |
| os.rename(tmp_link, link) | |
| except FileExistsError: | |
| try: | |
| os.remove(tmp_link) | |
| except OSError: | |
| pass |