#!/usr/bin/env python
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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.

"""
Errors if a list of files spans across
the projects which make up mesos.
"""

from collections import defaultdict
import os
import subprocess
import sys

if len(sys.argv) < 2:
    print "Usage: ./mesos-split.py <filename>..."

BASE_PROJECT = "mesos"

SUBPROJECTS = {
    "libprocess": "3rdparty/libprocess",
    "stout": "3rdparty/stout"
}

ERROR = """ERROR: Commit spanning multiple projects.

Please use separate commits for mesos, libprocess and stout.

Paths grouped by project:"""


def find_project(filename):
    """Find a project using its filename."""

    # Find longest prefix match.
    found_path_len = 0
    found_project = BASE_PROJECT
    for project, path in SUBPROJECTS.iteritems():
        if filename.startswith(path) and len(path) > found_path_len:
            found_path_len = len(path)
            found_project = project

    return found_project


def main():
    """
    Expects a list of filenames on the command line.

    See `support/hooks/pre-commit` for the canonical usage of this method.
    """

    # TODO(ArmandGrillet): Remove this when we'll have switched to Python 3.
    dir_path = os.path.dirname(os.path.realpath(__file__))
    script_path = os.path.join(dir_path, 'check-python3.py')
    subprocess.call('python ' + script_path, shell=True, cwd=dir_path)

    touched_projects = defaultdict(list)
    for filename in sys.argv[1:]:
        touched_projects[find_project(filename)].append(filename)

    if len(touched_projects) > 1:
        print ERROR
        for project in touched_projects.iterkeys():
            print "%s:" % project
            for filename in touched_projects[project]:
                print "  %s" % filename
        sys.exit(1)

    sys.exit(0)

if __name__ == '__main__':
    main()
