Skip to content

Commit

Permalink
lint: don't fail workflow on indent fail
Browse files Browse the repository at this point in the history
There are multiple cases where good human readable code block is
converted to an unreadable mess by clang-format, so we don't want to
rely on clang-format completely. Also there is no way, as far as I can
see, to make clang-format only fix what we want it to fix without
breaking something.

So let's just display hints inline where clang-format is unhappy. When
reviewer sees such a warning it's a good sign that something is broken
in codding style around this warning.

We add special script which parses diff generated by indent and
generates warning for each hunk.

Signed-off-by: Pavel Tikhomirov <[email protected]>
  • Loading branch information
Snorch committed Aug 24, 2023
1 parent 5fedcaa commit 56e0cbb
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 9 deletions.
18 changes: 9 additions & 9 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,15 +26,15 @@ jobs:
run: make lint

- name: Run make indent
run: >
continue-on-error: true
run: |
if [ -z "${{github.base_ref}}" ]; then
git fetch --deepen=1 &&
if ! make indent OPTS=--diff; then
exit 1
fi
git fetch --deepen=1
make indent
else
git fetch origin ${{github.base_ref}} &&
if ! make indent OPTS=--diff BASE=origin/${{github.base_ref}}; then
exit 1
fi
git fetch origin ${{github.base_ref}}
make indent BASE=origin/${{github.base_ref}}
fi
- name: Raise in-line make indent warnings
run: |
git diff | ./scripts/github-indent-warnings.py
28 changes: 28 additions & 0 deletions scripts/github-indent-warnings.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
#!/usr/bin/python3
import sys, re

re_file = r'^diff --git a/(\S\S*)\s.*$'
re_line = r'^@@ -(\d\d*)\D.*@@.*$'

if __name__ == '__main__':
if len(sys.argv) != 1 and len(sys.argv) != 2:
print(f'usage: {sys.argv[0]} <path/to/file>')
print(f'usage: <command> | {sys.argv[0]}')
exit(1)

with open(sys.stdin.fileno() if len(sys.argv) == 1 else sys.argv[1], 'r') as fi:
file_name = None
line_number = None
for line in fi:
file_matches = re.findall(re_file, line)
if len(file_matches) == 1:
file_name = file_matches[0]
continue

if file_name is None:
continue

line_matches = re.findall(re_line, line)
if len(line_matches) == 1:
line_number = int(line_matches[0]) + 3
print(f'::warning file={file_name},line={line_number}::clang-format: Possible codding-style problem')

0 comments on commit 56e0cbb

Please sign in to comment.