| Index: tools/drmemory/scripts/path_utils.py
|
| diff --git a/tools/drmemory/scripts/path_utils.py b/tools/drmemory/scripts/path_utils.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..6ab43120434256459f0c9bac2c764698a017ba09
|
| --- /dev/null
|
| +++ b/tools/drmemory/scripts/path_utils.py
|
| @@ -0,0 +1,84 @@
|
| +# Copyright (c) 2011 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.
|
| +
|
| +"""Some utility methods for getting and manipulating paths."""
|
| +
|
| +# TODO(pamg): Have the buildbot use these, too.
|
| +
|
| +
|
| +import errno
|
| +import os
|
| +import sys
|
| +
|
| +class PathNotFound(Exception): pass
|
| +
|
| +def ScriptDir():
|
| + """Get the full path to the directory containing the current script."""
|
| + script_filename = os.path.abspath(sys.argv[0])
|
| + return os.path.dirname(script_filename)
|
| +
|
| +def FindAncestor(start_dir, ancestor):
|
| + """Finds an ancestor dir in a path.
|
| +
|
| + For example, FindAncestor('c:\foo\bar\baz', 'bar') would return
|
| + 'c:\foo\bar'. Unlike FindUpward*, this only looks at direct path ancestors.
|
| + """
|
| + start_dir = os.path.abspath(start_dir)
|
| + path = start_dir
|
| + while True:
|
| + (parent, tail) = os.path.split(path)
|
| + if tail == ancestor:
|
| + return path
|
| + if not tail:
|
| + break
|
| + path = parent
|
| + raise PathNotFound("Unable to find ancestor %s in %s" % (ancestor, start_dir))
|
| +
|
| +def FindUpwardParent(start_dir, *desired_list):
|
| + """Finds the desired object's parent, searching upward from the start_dir.
|
| +
|
| + Searches start_dir and all its parents looking for the desired directory
|
| + or file, which may be given in one or more path components. Returns the
|
| + first directory in which the top desired path component was found, or raises
|
| + PathNotFound if it wasn't.
|
| + """
|
| + desired_path = os.path.join(*desired_list)
|
| + last_dir = ''
|
| + cur_dir = start_dir
|
| + found_path = os.path.join(cur_dir, desired_path)
|
| + while not os.path.exists(found_path):
|
| + last_dir = cur_dir
|
| + cur_dir = os.path.dirname(cur_dir)
|
| + if last_dir == cur_dir:
|
| + raise PathNotFound('Unable to find %s above %s' %
|
| + (desired_path, start_dir))
|
| + found_path = os.path.join(cur_dir, desired_path)
|
| + # Strip the entire original desired path from the end of the one found
|
| + # and remove a trailing path separator, if present.
|
| + found_path = found_path[:len(found_path) - len(desired_path)]
|
| + if found_path.endswith(os.sep):
|
| + found_path = found_path[:len(found_path) - 1]
|
| + return found_path
|
| +
|
| +
|
| +def FindUpward(start_dir, *desired_list):
|
| + """Returns a path to the desired directory or file, searching upward.
|
| +
|
| + Searches start_dir and all its parents looking for the desired directory
|
| + or file, which may be given in one or more path components. Returns the full
|
| + path to the desired object, or raises PathNotFound if it wasn't found.
|
| + """
|
| + parent = FindUpwardParent(start_dir, *desired_list)
|
| + return os.path.join(parent, *desired_list)
|
| +
|
| +
|
| +def MaybeMakeDirectory(*path):
|
| + """Creates an entire path, if it doesn't already exist."""
|
| + file_path = os.path.join(*path)
|
| + try:
|
| + os.makedirs(file_path)
|
| + except OSError, e:
|
| + # errno.EEXIST is "File exists". If we see another error, re-raise.
|
| + if e.errno != errno.EEXIST:
|
| + raise
|
|
|