roligugus created this revision. roligugus added reviewers: klimek, aheejin. Herald added a project: clang. Herald added a subscriber: cfe-commits.
[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. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D84375 Files: clang/tools/clang-format/git-clang-format Index: clang/tools/clang-format/git-clang-format =================================================================== --- clang/tools/clang-format/git-clang-format +++ clang/tools/clang-format/git-clang-format @@ -98,6 +98,8 @@ 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), @@ -172,6 +174,8 @@ 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) @@ -494,6 +498,17 @@ 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.
Index: clang/tools/clang-format/git-clang-format =================================================================== --- clang/tools/clang-format/git-clang-format +++ clang/tools/clang-format/git-clang-format @@ -98,6 +98,8 @@ 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), @@ -172,6 +174,8 @@ 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) @@ -494,6 +498,17 @@ 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.
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits