Skip to content

Commit

Permalink
[CI] enable code format check
Browse files Browse the repository at this point in the history
  • Loading branch information
DiweiSun committed Jun 6, 2024
1 parent 27f9974 commit 6433114
Show file tree
Hide file tree
Showing 2 changed files with 219 additions and 0 deletions.
43 changes: 43 additions & 0 deletions .github/workflows/format-check.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
name: format-check

on:
pull_request:
branches:
- main
- xpu-main

concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
cancel-in-progress: true

permissions: read-all

jobs:
format-check:
# Don't run on forked repos
# if: github.repository_owner == 'intel'
name: format-check
runs-on: ubuntu-latest
steps:
- name: Checkout intel_extension_for_pytorch
uses: actions/checkout@v2

- name: Checkout submodules
run: |
git submodule update --init --recursive
- name: flake8-check
run: |
pwd
pip install lintrunner pip install lintrunner-adapters
lintrunner init
python scripts/tools/setup/flake8.py
- name: clang-check
run: |
pwd
python -m pip install clang-format==12.0.1
git diff -U0 --no-color ${{ github.event.pull_request.base.ref }} | python scripts/tools/setup/clang-format-diff.py -p1
176 changes: 176 additions & 0 deletions scripts/tools/setup/clang-format-diff.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
#!/usr/bin/env python
#
# ===- clang-format-diff.py - ClangFormat Diff Reformatter ----*- python -*--===#
#
# The LLVM Compiler Infrastructure
#
# This file is distributed under the University of Illinois Open Source
# License. See LICENSE.TXT for details.
#
# ===------------------------------------------------------------------------===#

r"""
ClangFormat Diff Reformatter
============================
This script reads input from a unified diff and reformats all the changed
lines. This is useful to reformat all the lines touched by a specific patch.
Example usage for git/svn users:
git diff -U0 --no-color HEAD^ | clang-format-diff.py -p1 -i
svn diff --diff-cmd=diff -x-U0 | clang-format-diff.py -i
"""
from __future__ import absolute_import, division, print_function

import argparse
import difflib
import re
import subprocess
import sys

if sys.version_info.major >= 3:
from io import StringIO
else:
from io import BytesIO as StringIO


def main():
parser = argparse.ArgumentParser(
description="Reformat changed lines in diff. Without -i "
"option just output the diff that would be "
"introduced."
)
parser.add_argument(
"-i",
action="store_true",
default=False,
help="apply edits to files instead of displaying a diff",
)
parser.add_argument(
"-p",
metavar="NUM",
default=0,
help="strip the smallest prefix containing P slashes",
)
parser.add_argument(
"-regex",
metavar="PATTERN",
default=None,
help="custom pattern selecting file paths to reformat "
"(case sensitive, overrides -iregex)",
)
parser.add_argument(
"-iregex",
metavar="PATTERN",
default=r".*\.(cpp|cc|c\+\+|cxx|c|cl|h|hpp|m|mm|inc|js|ts|proto"
r"|protodevel|java)",
help="custom pattern selecting file paths to reformat "
"(case insensitive, overridden by -regex)",
)
parser.add_argument(
"-sort-includes",
action="store_true",
default=False,
help="let clang-format sort include blocks",
)
parser.add_argument(
"-v",
"--verbose",
action="store_true",
help="be more verbose, ineffective without -i",
)
parser.add_argument(
"-style",
help="formatting style to apply (LLVM, Google, Chromium, " "Mozilla, WebKit)",
)
parser.add_argument(
"-binary",
default="clang-format",
help="location of binary to use for clang-format",
)
args = parser.parse_args()

# Extract changed lines for each file.
filename = None
lines_by_file = {}
for line in sys.stdin:
match = re.search("^\\+\\+\\+\\ (.*?/){%s}(\\S*)" % args.p, line)
if match:
filename = match.group(2)
if filename is None:
continue

if args.regex is not None:
if not re.match("^%s$" % args.regex, filename):
continue
else:
if not re.match("^%s$" % args.iregex, filename, re.IGNORECASE):
continue

match = re.search("^@@.*\\+(\\d+)(,(\\d+))?", line)
if match:
start_line = int(match.group(1))
line_count = 1
if match.group(3):
line_count = int(match.group(3))
if line_count == 0:
continue
end_line = start_line + line_count - 1
lines_by_file.setdefault(filename, []).extend(
["-lines", str(start_line) + ":" + str(end_line)]
)

nerr = 0
# Reformat files containing changes in place.
for filename, lines in lines_by_file.items():
if args.i and args.verbose:
print("Formatting {}".format(filename))
command = [args.binary, filename]
if args.i:
command.append("-i")
if args.sort_includes:
command.append("-sort-includes")
command.extend(lines)
if args.style:
command.extend(["-style", args.style])
p = subprocess.Popen(
command,
stdout=subprocess.PIPE,
stderr=None,
stdin=subprocess.PIPE,
universal_newlines=True,
)
stdout, stderr = p.communicate()
if p.returncode != 0:
sys.exit(p.returncode)

if not args.i:
with open(filename) as f:
code = f.readlines()
formatted_code = StringIO(stdout).readlines()
diff = difflib.unified_diff(
code,
formatted_code,
filename,
filename,
"(before formatting)",
"(after formatting)",
)
diff_string = "".join(diff)
if len(diff_string) > 0:
sys.stdout.write(diff_string)
nerr += 1

if nerr > 0:
sys.stdout.write(
"\nFormatter check failed. Please format the code"
" changes accoding to the formatting advice above.\n"
)
sys.exit(1)
else:
sys.exit(0)


if __name__ == "__main__":
main()

0 comments on commit 6433114

Please sign in to comment.