#!/usr/bin/env fuchsia-vendored-python
#
# Copyright 2017 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# A script to check for missing LICENSE files when vendoring Rust crates

# Should be run from top-level of third_party/rust_crates repository.

import argparse
import os
import sys

def die(reason):
    raise Exception(reason)


def check_subdir_license(subdir):
    if subdir.startswith('.') or not os.path.isdir(subdir):
        return

    license_files = [
        file for file in os.listdir(subdir) if file.startswith('LICENSE') or
        file.startswith('LICENCE') or file.startswith('license')
    ]
    if not license_files: # FIXME better way to track whether one exists
        die('Missing license for %s' % subdir)


def check_licenses(directory):
    success = True
    os.chdir(directory)
    subdirs = sorted(os.listdir(os.getcwd()))
    for subdir in subdirs:
        try:
            check_subdir_license(subdir)
        except Exception as err:
            print('ERROR    %s' % err)
            success = False
    print("Done checking licenses.")
    return success


def main():
    parser = argparse.ArgumentParser(
        'Verifies licenses for third-party Rust crates')
    parser.add_argument(
        '--directory',
        help='Directory containing the crates',
        default=os.getcwd())
    args = parser.parse_args()
    if not check_licenses(args.directory):
        sys.exit(1)


if __name__ == '__main__':
    main()
