From 2ef59d1ec8dbb9d3d221309f04c71e2a562e771c Mon Sep 17 00:00:00 2001 From: Qin Zhao Date: Wed, 18 Nov 2015 17:21:48 -0500 Subject: Merge to XFA: Add Dr. Memory tool This CL adds DrMemory-Windows-sfx.exe into tools/drmemory. It also adds a set of scripts from chromium/src/tools/valgrind for running Dr. Memory. Now we can run pdfium tests with Dr. Memory: $ .\tools\drmemory\scripts\pdfium_tests.bat -b out\Debug -t pdfium_unittests More update on scripts is required, but this should be a good start. Changes from chromium/src/tools/valgrind - rename chrome_tests.py to pdfium_tests.py - update pdfium_tests.bat - remove chrome tests in pdfium_tests.py - remove memcheck code in valgrind_test.py R=thestig@chromium.org BUG=pdfium:238 Review URL: https://codereview.chromium.org/1452293002 . (cherry picked from commit 4dcf313c46c176e5afa1328f5f07fce4e614366d) Review URL: https://codereview.chromium.org/1452373004 . --- tools/drmemory/scripts/path_utils.py | 84 ++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 tools/drmemory/scripts/path_utils.py (limited to '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 0000000000..6ab4312043 --- /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 -- cgit v1.2.3