mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
The `__future__` we relied on is now, where the 3 specific things are all included [since Python 3.0](https://docs.python.org/3/library/__future__.html): * absolute_import * print_function * unicode_literals * division These import statements are no-ops and are no longer necessary.
101 lines
3.3 KiB
Python
Executable File
101 lines
3.3 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# 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
|
|
|
|
import argparse
|
|
import io
|
|
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")
|
|
|
|
parser.add_argument(
|
|
"--dry-run",
|
|
help="Apply the replacements to the input and print the result "
|
|
"to standard output",
|
|
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 = io.open(sys.stdin.fileno(), 'r', encoding='utf-8', errors='ignore').read()
|
|
|
|
for s in args.sanitize_strings:
|
|
replacement, pattern = s.split('=', 1)
|
|
# Since we want to use pattern as a regex in some platforms, we need
|
|
# to escape it first, and then replace the escaped slash
|
|
# literal (r'\\/') for our platform-dependent slash regex.
|
|
stdin = re.sub(re.sub(r'\\/' if sys.version_info[0] < 3 else r'/',
|
|
slashes_re, re.escape(pattern)),
|
|
replacement, stdin)
|
|
|
|
if args.dry_run:
|
|
print(stdin)
|
|
return 0
|
|
else:
|
|
p = subprocess.Popen(
|
|
[args.file_check_path] + unknown_args, stdin=subprocess.PIPE)
|
|
stdout, stderr = p.communicate(stdin.encode('utf-8'))
|
|
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())
|