#!/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 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 = stdin.replace(pattern, replacement)

    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())
