# Copyright 2014 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.

"""Public buildspec to GIT mapping."""

import re
from deps2git import SplitScmUrl

GIT_HOST = 'https://chromium.googlesource.com/'
webkit_git = GIT_HOST + 'chromium/blink.git'

# Remove the ffmpeg overrides, since the buildspec DEPS have stripped out these
# (and other) vars that they don't use, and without them in the DEPS, deps2git
# complains about missing vars.
DEPS_OVERRIDES = {
  'src/third_party/ffmpeg': None
}


# pylint: disable=W0613
def CleanDeps(deps, deps_os, include_rules, skip_child_includes, hooks):
  global webkit_git
  webkit_rev = None
  for os, deps_section in ([(None, deps)] +
                           [(os, deps_os[os]) for os in deps_os]):
    del_deps = []
    add_deps = {}
    for dep, dep_url in deps_section.iteritems():
      # Skip 'None' exclusion entries.
      if not dep_url:
        continue

      url, rev = SplitScmUrl(dep_url)

      # Some m27 DEPS have blink entries that are just paths. Prepend the host
      # info so the rest of the processing can proceed as normal.
      m = re.match('/branches/chromium/[^/]+/'
                   '(LayoutTests|Source|Tools)(/.*)?$', url)
      if m:
        dep_url = 'https://src.chromium.org/blink' + dep_url
        deps_section[dep] = dep_url
        url, rev = SplitScmUrl(dep_url)

      # During m29 (and maybe earlier), there was some fetching (and branching)
      # of just blink LayoutTests, rather than the whole repo, with entries to
      # checkout a bunch of individual sub-paths to
      # 'src/content/test/data/layout_tests/*'.
      # Consolidate all of those deps into a single, top-level 'layout_tests'
      # entry so the whole blink repo can be checkout out there (putting
      # LayoutTests in the expected 'layout_tests/LayoutTests/' path).
      m = re.match('^https?://src.chromium.org/blink/'
                   '(trunk|branches/chromium/[^/]+)/LayoutTests(/.*)?', url)
      if m:
        if not add_deps.get('src/content/test/data/layout_tests'):
          add_deps['src/content/test/data/layout_tests'] = dep_url
        del_deps.append(dep)
        continue

      # Ignore webkit sub-path entries since git checks out all in one repo,
      is_webkit = False
      if url.startswith('/trunk/deps/third_party/WebKit/'):
        is_webkit = True
      else:
        m = re.match('https?://(svn.webkit.org/repository/webkit|'
                     'src.chromium.org/blink)'
                     '/(trunk|branches/chromium/[^/]+)/', url)
        if m:
          # Don't remove 'ios' sub-path entries, which are set explicitly to
          # just pull the headers or something. Unfortunately, the sub-path
          # repos don't mirror the branches, so if the dep is for a branch, even
          # 'ios' will have to pull the full WebKit.
          if os == 'ios' and m.group(2) == 'trunk':
            continue
          is_webkit = True
          # If svn DEPS refers to the webkit.org repo, rather than blink, use
          # the old mirror of that repo instead of blink.git.
          if 'svn.webkit.org' in m.group(1):
            webkit_git = GIT_HOST + 'external/WebKit_trimmed.git'
      if is_webkit:
        if not webkit_rev:
          webkit_rev = rev
        else:
          # All the sub-path repos should be pinned to the same revision. If
          # they're not, then not sure how to decide what revision to use for
          # the umbrella git repo.
          if rev != webkit_rev:
            raise Exception('WebKit entry revision mismatch: %s != %s' %
                            (rev, webkit_rev))
        del_deps.append(dep)
        continue

      # Some older DEPS have a split selenium py/test|selenium checkout but the
      # git selenium py repo encompasses both, so delete everything except the
      # base checkout to python/selenium.
      if dep.startswith('src/third_party/webdriver/python/selenium/'):
        del_deps.append(dep)
        continue

      # Ugh. For a while during m29, there was an entry with an incomplete URL
      # and incorrect path. How this worked even once, let alone through
      # multiple releases, is a mystery.
      if url.startswith('sctp-refimpl'):
        dep_url = 'https://' + dep_url.replace('/snv/', '/svn/')
        deps_section[dep] = dep_url
        continue

    for dep in del_deps:
      del deps_section[dep]
    deps_section.update(add_deps)

  # Make sure the top-level webkit entry that's left refers to the common
  # revision from the sub-path entries, and not to the revision of the
  # top-level "placeholder" repository. webkit_rev won't be set for recent
  # DEPS, since they use the blink repo and have no webkit sub-path entries.
  if webkit_rev:
    dep_url = deps['src/third_party/WebKit']
    url, rev = SplitScmUrl(dep_url)
    deps['src/third_party/WebKit'] = '%s@%s' % (url, webkit_rev)

def SvnUrlToGitUrl(path, svn_url):
  """Convert a chromium SVN URL to a chromium Git URL."""

  match = re.match(
      '(https?://src.chromium.org/svn|svn://svn.chromium.org/chrome)(/.*)',
      svn_url)
  if match:
    svn_url = match.group(2)

  # Handle the main 'src' repo which only appears in buildspecs.
  match = re.match('/(branches/(?P<branch>[^/]+)|trunk)/src$', svn_url)
  if match:
    if match.groupdict().get('branch'):
      return (path, GIT_HOST + 'chromium/src.git', GIT_HOST,
              match.groupdict().get('branch'))
    else:
      return (path, GIT_HOST + 'chromium/src.git', GIT_HOST)

  # libvpx branches in the chrome branches area.
  match = re.match('/branches/libvpx/(?P<branch>[^/]+)', svn_url)
  if match:
    return (path, GIT_HOST + 'chromium/deps/libvpx.git', GIT_HOST,
            match.group('branch'))

  # New location of libvpx branches.
  match = re.match('/branches/(?P<branch>[^/]+)/deps/third_party/libvpx',
                   svn_url)
  if match:
    return (path, GIT_HOST + 'chromium/deps/libvpx.git', GIT_HOST,
            match.group('branch'))

  # Since the ffmpeg overrides are gone, we can't use the upstream git repo
  # (which is what those overrides referenced), so use the mirror of the svn
  # repo.
  if svn_url == '/trunk/deps/third_party/ffmpeg':
    return (path, GIT_HOST + 'chromium/deps/ffmpeg.git', GIT_HOST)

  match = re.match('/branches/ffmpeg/(?P<branch>[^/]+)', svn_url)
  if match:
    return (path, GIT_HOST + 'chromium/deps/ffmpeg.git', GIT_HOST,
            match.group('branch'))

  # openssl branches
  match = re.match('/branches/third_party/openssl/(?P<branch>[^/]+)', svn_url)
  if match:
    return (path, GIT_HOST + 'chromium/deps/openssl.git', GIT_HOST,
            match.group('branch'))

  # The webrtc repo used to be mirrored into multiple stable/trunk repos,
  # but branches were mirrored to both, so either would work here.
  match = re.match('^https?://webrtc.googlecode.com/svn/branches/([^/]+)/(.*)',
                   svn_url)
  if match:
    branch = match.group(1)
    if match.group(2) == 'src':
      repo = 'webrtc/src.git'
    else:
      repo = 'webrtc/trunk/%s.git' % match.group(2)
    return (path, GIT_HOST + 'external/%s' % repo, GIT_HOST, branch)

  # Skia also split into multiple repos, and has unusual chrome-specific branch
  # naming.
  # https://chromium.googlesource.com/external/skia/m25_1364/src.git
  match = re.match('^https?://skia.googlecode.com/svn/branches/'
                   'chrome/([^/]+)/(?:trunk/)?(.*)', svn_url)
  if match:
    branch = match.group(1)
    repo = 'skia/%s.git' % match.group(2)
    return (path, GIT_HOST + 'external/%s' % repo, GIT_HOST, 'chrome/' + branch)

  # Make the top-level webkit entry checkout the full webkit git repository,
  # which replaces all the (non-iOS) sub-path entries.
  if svn_url == '/trunk/deps/third_party/WebKit':
    return (path, webkit_git, GIT_HOST)

  # Make the top-level python/selenium entry checkout the full selenium/py git
  # repository, which replaces all the sub-path entries.
  if svn_url == 'http://selenium.googlecode.com/svn/trunk/py/selenium':
    return (path, GIT_HOST + 'external/selenium/py.git', GIT_HOST)

  # Projects that are subdirectories of the native_client repository.
  match = re.match('^https?://src.chromium.org/native_client/branches/'
                   '(?P<branch>[^/]+)/(?P<path>.*)',
                   svn_url)
  if match:
    if match.group('path'):
      repo = '%s.git' % match.group('path')
    else:
      repo = 'src/native_client.git'
    return (path, GIT_HOST + 'native_client/%s' % repo, GIT_HOST,
            match.group('branch'))

  # blink LayoutTests.
  match = re.match('^https?://src.chromium.org/blink/'
                   '(trunk|branches/(?P<branch>chromium/[^/]+))/'
                   'LayoutTests(/.*)?',
                   svn_url)
  if match:
    repo = GIT_HOST + 'chromium/blink.git'
    if match.group('branch'):
      return (path, repo, GIT_HOST, match.group('branch'))
    else:
      return (path, repo, GIT_HOST)

  # blink branches.
  match = re.match('^https?://src.chromium.org/blink/branches/'
                   '(?P<branch>chromium/[^/]+)(?P<path>/public)?/?$',
                   svn_url)
  if match:
    # ios has a special headers-only repo
    if match.group('path'):
      repo = GIT_HOST + 'chromium/blink-public.git'
    else:
      repo = GIT_HOST + 'chromium/blink.git'
    return (path, repo, GIT_HOST, match.group('branch'))

  # reference builds
  # TODO(mmoss): This is no longer appropriate for current buildspecs, where
  # each platform has its own repo, as defined in git_updater. Not sure if
  # there's a way to detect and handle the current and the old repo configs at
  # the same time. Turning off for now, since we care more about current
  # configs.
  #if svn_url.startswith('/trunk/deps/reference_builds/chrome'):
  #  return (path, GIT_HOST + 'chromium/reference_builds/chrome.git',
  #          GIT_HOST)
