Skip to content

Commit

Permalink
[git-clang-format] Add --diffstat parameter
Browse files Browse the repository at this point in the history
[git-clang-format][PR46815] Add diffstat functionality

Adding a --diffstat parameter to git-clang-format that essentially uses git diff --stat, i.e. lists the files needing
formatting. This is useful for CI integration or manual usage where one wants to list the files not properly formatted.

I use it for the Suricata project's github action (CI) integration that verifies proper formatting of a pull request
according to project guidelines where it's very helpful to say which files are not properly formatted. I find the list
of files much more useful than e.g. showing the diff in this case using git-clang-format --diff.

An alternative would be to take an additional parameter to diff, e.g. git-clang-format --diff --stat

The goal is not to provide the whole git diff --stat=... parameter functionality, just plain git diff --stat.

Reviewed By: MyDeveloperDay, JakeMerdichAMD

Differential Revision: https://reviews.llvm.org/D84375
  • Loading branch information
roligugus authored and mydeveloperday committed Oct 15, 2021
1 parent a92cf5a commit 191a395
Showing 1 changed file with 15 additions and 0 deletions.
15 changes: 15 additions & 0 deletions clang/tools/clang-format/git-clang-format
Expand Up @@ -99,6 +99,8 @@ def main():
help='default commit to use if none is specified'),
p.add_argument('--diff', action='store_true',
help='print a diff instead of applying the changes')
p.add_argument('--diffstat', action='store_true',
help='print a diffstat instead of applying the changes')
p.add_argument('--extensions',
default=config.get('clangformat.extensions',
default_extensions),
Expand Down Expand Up @@ -176,6 +178,8 @@ def main():
print('clang-format did not modify any files')
elif opts.diff:
print_diff(old_tree, new_tree)
elif opts.diffstat:
print_diffstat(old_tree, new_tree)
else:
changed_files = apply_changes(old_tree, new_tree, force=opts.force,
patch_mode=opts.patch)
Expand Down Expand Up @@ -506,6 +510,17 @@ def print_diff(old_tree, new_tree):
subprocess.check_call(['git', 'diff', '--diff-filter=M', old_tree, new_tree,
'--'])

def print_diffstat(old_tree, new_tree):
"""Print the diffstat between the two trees to stdout."""
# We use the porcelain 'diff' and not plumbing 'diff-tree' because the output
# is expected to be viewed by the user, and only the former does nice things
# like color and pagination.
#
# We also only print modified files since `new_tree` only contains the files
# that were modified, so unmodified files would show as deleted without the
# filter.
subprocess.check_call(['git', 'diff', '--diff-filter=M', '--stat', old_tree, new_tree,
'--'])

def apply_changes(old_tree, new_tree, force=False, patch_mode=False):
"""Apply the changes in `new_tree` to the working directory.
Expand Down

0 comments on commit 191a395

Please sign in to comment.