# 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 = {
  'ECLIPSE': 'https://repo.eclipse.org/content/groups/releases',
  '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
