--- /dev/null
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0-only
+
+#
+# This file is part of Lustre, http://www.lustre.org/
+#
+# contrib/git-cmds/git-checkpatch
+#
+# Check the progress of checkpatch.pl fixes in the
+# Lustre tree. Modified from git-tabcheck.
+#
+# Author: Andreas Dilger <adilger@whamcloud.com>
+# Modified by: Timothy Day <timday@amazon.com>
+#
+
+export CHECKPATCH=${CHECKPATCH:-"./contrib/scripts/checkpatch.pl"}
+
+DIRS="$*"
+[ -z "$DIRS" ] && DIRS="ls -d */"
+
+for D in $DIRS; do
+ [ ! -d "$D" ] && continue
+ FILES=$(find "$D" -name "*.[ch]")
+
+ [ -z "$FILES" ] && continue
+ TOT="$(echo "$FILES" | xargs cat | wc -l)"
+
+ [ -z "$TOT" ] && continue
+ CNT="$(echo "$FILES" | xargs -I{} bash -c '$CHECKPATCH --terse -f $1' _ {} | grep -v "total:" | wc -l)"
+
+ D=$(basename "$D")
+
+ printf "%-16s %-10s %-11s \n" \
+ "$D:" "loc=$TOT" "errors/warnings=$CNT"
+done
--- /dev/null
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0-only
+
+#
+# This file is part of Lustre, http://www.lustre.org/
+#
+# contrib/git-cmds/git-tabcheck
+#
+# Check the progress of space -> tab conversion in the
+# Lustre tree.
+#
+# Author: Andreas Dilger <adilger@whamcloud.com>
+#
+
+DIRS="$*"
+[ -z "$DIRS" ] && DIRS="ls -d */"
+
+for D in $DIRS; do
+ [ ! -d "$D" ] && continue
+ FILES=$(find "$D" -name "*.[ch]" -o -name "*.sh")
+
+ [ -z "$FILES" ] && continue
+ TOT="$(echo "$FILES" | xargs cat | wc -l)"
+
+ [ -z "$TOT" ] && continue
+ TAB="$(echo "$FILES" | xargs grep "\t" | wc -l)"
+ SPC="$(echo "$FILES" | xargs grep "^ " | wc -l)"
+
+ PCB=$(((TAB * 1000 + 5) / TOT / 10))
+ PCS=$(((SPC * 1000 + 5) / TOT / 10))
+ PCT=$(((TAB * 1000 + 5) / (TAB + SPC) / 10))
+
+ D=$(basename "$D")
+
+ printf "%-16s %-10s %-11s %6s %-11s %6s %-10s\n" \
+ "$D:" "loc=$TOT" "tabs=$TAB" "($PCB%)" "space=$SPC" "($PCS%)" "$PCT%"
+done