#!/usr/bin/env python
# utils/PathSanitizingFileCheck -*- python -*-
#
# This source file is part of the Swift.org open source project
#
# Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
# Licensed under Apache License v2.0 with Runtime Library Exception
#
# See https://swift.org/LICENSE.txt for license information
# See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors

from __future__ import print_function

import argparse
import re
import subprocess
import sys


def main():
    parser = argparse.ArgumentParser(
        formatter_class=argparse.RawDescriptionHelpFormatter,
        description="""
PathSanitizingFileCheck is a wrapper around LLVM's FileCheck.  In addition
to all FileCheck features, PathSanitizingFileCheck can replace given
strings in the input with other strings.  This feature is used to replace
paths to the source and build directories with path-independent
constants.""")

    parser.add_argument(
        "--sanitize",
        help="replace the given string with another string",
        metavar="REPLACEMENT=SOURCE",
        action="append",
        dest="sanitize_strings",
        default=[])

    parser.add_argument(
        "--use-filecheck",
        help="path to LLVM FileCheck executable",
        metavar="PATH",
        action="store",
        dest="file_check_path",
        default="FileCheck")

    parser.add_argument(
        "--enable-windows-compatibility",
        help="Enable Windows path compatibility, which checks against both "
             "forward slashes and backward slashes.",
        action="store_true")

    parser.add_argument(
        "--enable-yaml-compatibility",
        help="Enable YAML path compatibility. Since YAML double escapes "
             "backward slashes, we need to check for them escaped. Only "
             "available if Windows compatibility is enabled.",
        action="store_true")

    args, unknown_args = parser.parse_known_args()

    if args.enable_windows_compatibility:
        if args.enable_yaml_compatibility:
            slashes_re = r'(/|\\\\|\\\\\\\\)'
        else:
            slashes_re = r'(/|\\\\)'
    else:
        slashes_re = r'/'

    stdin = sys.stdin.read()
    for s in args.sanitize_strings:
        replacement, pattern = s.split('=', 1)
        # We are replacing the Unix path separators in the paths passed as
        # arguments with a broader pattern to also allow forward slashes and
        # double escaped slashes in the result that we are checking. Sigh.
        stdin = re.sub(re.sub(r'/', slashes_re, pattern), replacement, stdin)

    p = subprocess.Popen(
        [args.file_check_path] + unknown_args, stdin=subprocess.PIPE)
    stdout, stderr = p.communicate(stdin)
    if stdout is not None:
        print(stdout)
    if stderr is not None:
        print(stderr, file=sys.stderr)
    return p.wait()


if __name__ == '__main__':
    exit(main())
