Merge pull request #268 from adiaaida/ccFormatFull

Add formatall option to ccformat and prepare script for running in the lab
This commit is contained in:
Michelle McDaniel 2015-03-10 13:17:12 -07:00
Родитель 73ce7a1cee 0337a1873b
Коммит 629c139489
1 изменённых файлов: 79 добавлений и 6 удалений

Просмотреть файл

@ -5,6 +5,9 @@ import argparse
import os import os
import subprocess import subprocess
import platform import platform
import StringIO
import string
import difflib
def expandPath(path): def expandPath(path):
return os.path.abspath(os.path.expanduser(path)) return os.path.abspath(os.path.expanduser(path))
@ -110,9 +113,65 @@ def runTidy(args):
def runFormat(args): def runFormat(args):
formatFix = "-i" if args.fix else "" formatFix = "-i" if args.fix else ""
subprocess.call(" ".join(["git", "diff", args.base, "-U0", "2>" + os.devnull, returncode = 0
"|", args.clang_format_diff, "-p1", formatFix]), shell=True) llilcSrc = expandPath(args.llilc_source)
return 0
if args.formatall:
llilcSrc = expandPath(args.llilc_source)
for dirname,subdir,files in os.walk(llilcSrc):
if ".git" in dirname \
or dirname == os.path.join(llilcSrc, "include", "clr"):
continue
for filename in files:
if filename.endswith(".c") or filename.endswith(".cpp") or \
filename.endswith(".h"):
filepath=os.path.join(dirname, filename)
proc = subprocess.Popen(" ".join([args.clang_format, filepath,
formatFix, "2>" + os.devnull]), shell=True, stdout=subprocess.PIPE)
output,error = proc.communicate()
# Compute the diff if not fixing
if not args.fix:
with open(filepath) as f:
code = f.read().splitlines()
formatted_code = StringIO.StringIO(output).read().splitlines()
diff = difflib.unified_diff(code, formatted_code,
filepath, filepath,
'(before formatting)', '(after formatting)')
diff_string = string.join(diff, '\n')
if len(diff_string) > 0:
# If there was a diff, print out the file name.
print(filepath)
if args.print_diffs:
sys.stdout.write(diff_string)
returncode = -1
else:
noindex = ""
# base and no-index are mutually exclusive
base = "" if args.noindex else args.base
if args.noindex:
noindex = "--no-index"
if args.left == "" or args.right == "":
print("User must specify paths to repositories to be diffed with --no-index")
print("usage: ccformat.py --no-index --left <path to left> --right <path to right>")
return -2
proc = subprocess.Popen(" ".join(["git", "diff", base, "-U0", noindex,
args.left, args.right, "2>" + os.devnull, "|", args.clang_format_diff,
"-p1", formatFix]), shell=True, stdout=subprocess.PIPE)
output,error = proc.communicate()
if output != "":
if args.print_diffs:
sys.stdout.write(output)
returncode = -1
if returncode == -1:
print "There were formatting errors. Rerun with --fix"
return returncode
def main(argv): def main(argv):
llvmBuild = os.environ.get("LLVMBUILD") llvmBuild = os.environ.get("LLVMBUILD")
@ -125,6 +184,8 @@ def main(argv):
parser.add_argument("--clang-format-diff", metavar="PATH", parser.add_argument("--clang-format-diff", metavar="PATH",
default="clang-format-diff.py", default="clang-format-diff.py",
help="path to clang-format-diff tool") help="path to clang-format-diff tool")
parser.add_argument("--clang-format", metavar="PATH",
default="clang-format", help="path to clang-format binary")
parser.add_argument("--compile-commands", metavar="PATH", parser.add_argument("--compile-commands", metavar="PATH",
help="path to a directory containing a JSON compile commands " \ help="path to a directory containing a JSON compile commands " \
"database used to determine clang-tidy options") "database used to determine clang-tidy options")
@ -155,8 +216,19 @@ def main(argv):
parser.add_argument("--checks", default="llvm*,misc*,microsoft*,"\ parser.add_argument("--checks", default="llvm*,misc*,microsoft*,"\
"-llvm-header-guard,-llvm-include-order", "-llvm-header-guard,-llvm-include-order",
help="clang-tidy checks to run") help="clang-tidy checks to run")
parser.add_argument("--base", metavar="BRANCH", default="origin", group = parser.add_mutually_exclusive_group()
group.add_argument("--base", metavar="BRANCH", default="origin",
help="Base for obtaining diffs") help="Base for obtaining diffs")
group.add_argument("--noindex", action="store_true", default=False,
help="Run git diff with --no-index to compare two paths")
parser.add_argument("--formatall", action="store_true", default=False,
help="Run clang-format on all files")
parser.add_argument("--left", default="",
help="Path to compare against, used with --noindex")
parser.add_argument("--right", default="",
help="Path to be compared, used with --noindex")
parser.add_argument("--print-diffs", action="store_true", default=False,
help="Print formatting diffs if there are diffs")
args = parser.parse_args(argv) args = parser.parse_args(argv)
returncode=0 returncode=0
@ -166,9 +238,10 @@ def main(argv):
return returncode return returncode
if not args.noformat: if not args.noformat:
runFormat(args) returncode = runFormat(args)
return returncode return returncode
if __name__ == "__main__": if __name__ == "__main__":
main(sys.argv[1:]) returncode = main(sys.argv[1:])
sys.exit(returncode)