# Copyright (C) 2013 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from os import path

REPO_ROOTS = {
  'GERRIT': 'https://gerrit-maven.storage.googleapis.com',
  'GERRIT_API': 'https://gerrit-api.commondatastorage.googleapis.com/release',
  'MAVEN_CENTRAL': 'https://repo1.maven.org/maven2',
  'MAVEN_LOCAL': 'file://' + path.expanduser('~/.m2/repository'),
  'MAVEN_SNAPSHOT': 'https://oss.sonatype.org/content/repositories/snapshots',
}


def resolve_url(url, redirects):
  """ Resolve URL of a Maven artifact.

  prefix:path is passed as URL. prefix identifies known or custom
  repositories that can be rewritten in redirects set, passed as
  second arguments.

  A special case is supported, when prefix neither exists in
  REPO_ROOTS, no in redirects set: the url is returned as is.
  This enables plugins to pass custom maven_repository URL as is
  directly to maven_jar().

  Returns a resolved path for Maven artifact.
  """
  s = url.find(':')
  if s < 0:
    return url
  scheme, rest = url[:s], url[s+1:]
  if scheme in redirects:
    root = redirects[scheme]
  elif scheme in REPO_ROOTS:
    root = REPO_ROOTS[scheme]
  else:
    return url
  root = root.rstrip('/')
  rest = rest.lstrip('/')
  return '/'.join([root, rest])


def hash_file(hash_obj, path):
  """Hash the contents of a file.

  Args:
    hash_obj: an open hash object, e.g. hashlib.sha1().
    path: path to the file to hash.

  Returns:
    The passed-in hash_obj.
  """
  with open(path, 'rb') as f:
    while True:
      b = f.read(8192)
      if not b:
        break
      hash_obj.update(b)
  return hash_obj
