#!/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 repository is None:
            return to_return
        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 classifier():
    from webkitscmpy import CommitClassifier

    root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
    classifier = os.path.join(root, 'metadata', 'commit_classes.json')
    if not os.path.isfile(classifier):
        return None
    with open(classifier, 'r') as file:
        return CommitClassifier.load(file)


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'),
        hooks=os.path.join(os.path.abspath(os.path.join(os.path.dirname(__file__))), 'hooks'),
        classifier=is_webkit_filter(classifier()),
    ))

