#!/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")

    args, unknown_args = parser.parse_known_args()

    stdin = sys.stdin.read()
    for s in args.sanitize_strings:
        replacement, pattern = s.split('=', 1)
        stdin = re.sub(re.sub(r'/', r'[/\\\\]', 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())
