#!/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)
