blob: c3e4dc89108c063e46eb89aa79f4a2b6026d8911 [file] [log] [blame]
#!/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)