#!/usr/bin/env python3

# Copyright (C) 2020, 2021 Apple Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1.  Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2.  Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

import os
import sys

import webkitpy
from webkitcorepy import run
from webkitscmpy import local, program, remote, Contributor, log


def is_webkit_filter(to_return):
    def callback(repository):
        if isinstance(repository, local.Scm):
            repository = repository.remote()
        if not isinstance(repository, remote.Scm):
            return None
        if getattr(repository, 'name', None) == 'WebKit':
            return to_return
        url = getattr(repository, 'url', '')
        if 'svn.webkit.org' in url or 'git.webkit.org' in url:
            return to_return
        return None

    return callback


def additional_setup(args, repository):
    if not isinstance(repository, local.Git):
        return 0

    log.warning('Setting merging behavior for changelogs...')
    if run([
        repository.executable(),
        'config', 'merge.changelog.driver',
        'perl {} --merge-driver -c %O %A %B'.format(os.path.join(
            os.path.abspath(os.path.dirname(os.path.dirname(os.path.dirname(__file__)))),
            'Tools', 'Scripts', 'resolve-ChangeLogs',
        )),
    ], capture_output=True, cwd=repository.root_path).returncode:
        sys.stderr.write('Failed to set the git merging behaivor for changelogs...\n')
        return 1
    log.warning('Set merging behavior for changelogs!')
    return 0


if '__main__' == __name__:
    sys.exit(program.main(
        identifier_template=is_webkit_filter('Canonical link: https://commits.webkit.org/{}'),
        subversion=is_webkit_filter('https://svn.webkit.org/repository/webkit'),
        additional_setup=is_webkit_filter(additional_setup),
        hooks=os.path.join(os.path.abspath(os.path.join(os.path.dirname(__file__))), 'hooks'),
        canonical_svn=is_webkit_filter(True),
    ))

