#!/usr/bin/env python # 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. """ This module contains miscellaneous tools. """ import os # Absolute path to the root of this Skia buildbot checkout. BUILDBOT_PATH = os.path.realpath(os.path.join( os.path.dirname(os.path.abspath(__file__)), os.pardir, os.pardir, os.pardir)) def ArgsToDict(argv): """ Collect command-line arguments of the form '--key value' into a dictionary. Fail if the arguments do not fit this format. """ dictionary = {} PREFIX = '--' # Expect the first arg to be the path to the script, which we don't want. argv = argv[1:] while argv: if argv[0].startswith(PREFIX): dictionary[argv[0][len(PREFIX):]] = argv[1] argv = argv[2:] else: raise Exception('Malformed input: %s' % argv) return dictionary def ConfirmOptionsSet(name_value_dict): """Raise an exception if any of the given command-line options were not set. name_value_dict: dictionary mapping option names to option values """ for (name, value) in name_value_dict.iteritems(): if value is None: raise Exception('missing command-line option %s; rerun with --help' % name) def GetAbsPath(relative_path): """My own implementation of os.path.abspath() that better handles paths which approach Window's 260-character limit. See https://code.google.com/p/skia/issues/detail?id=674 This implementation adds path components one at a time, resolving the absolute path each time, to take advantage of any chdirs into outer directories that will shorten the total path length. TODO(epoger): share a single implementation with bench_graph_svg.py, instead of pasting this same code into both files.""" if os.path.isabs(relative_path): return relative_path path_parts = relative_path.split(os.sep) abs_path = os.path.abspath('.') for path_part in path_parts: abs_path = os.path.abspath(os.path.join(abs_path, path_part)) return abs_path class ChDir(object): """Enter and exit the given directory appropriately.""" def __init__(self, directory, verbose=True): """Instantiate the ChDir. Args: directory: string; the directory to enter. verbose: bool; whether or not to print the directory changes. """ self._destination = directory self._origin = None self._verbose = verbose def __enter__(self): """Change to the destination directory. Does not check whether the directory exists. """ self._origin = os.getcwd() if self._verbose: print 'chdir %s' % self._destination os.chdir(self._destination) def __exit__(self, *args): """Change back to the original directory.""" if self._verbose: print 'chdir %s' % self._origin os.chdir(self._origin)