-
Notifications
You must be signed in to change notification settings - Fork 38
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
LU-553 build: Lustre style commit hooks for Git
Adds recommended commit hooks for Lustre commit messages, that can/should be installed into lustre/.git/hooks for all Lustre trees. prepare-commit-msg: adds the output of checkpatch.pl as a comment to the commit message, to "soft" validate the new patch is matching the Lustre coding style. It doesn't check 100% of the Lustre coding style, but at least finds most of the obvious errors so that they can be fixed locally before any manual inspection time is spent on the patch. commit-msg: verifies the format of the commit message (somewhat). Checks that there is a valid-looking Signed-off-by: line. Adds the Gerrit Change-Id: line for change tracking. Signed-off-by: Andreas Dilger <[email protected]> Change-Id: I35fdfb8206d1f0efb3bb401522e8412c62b7c02a Reviewed-on: http://review.whamcloud.com/1296 Tested-by: Hudson Tested-by: Maloo <[email protected]> Reviewed-by: Oleg Drokin <[email protected]>
- Loading branch information
Showing
3 changed files
with
163 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,13 @@ | ||
Instructions for building, configuring and running Lustre can be found at: | ||
http://wiki.lustre.org/index.php/Use | ||
http://wiki.whamcloud.com/display/PUB/Submitting+Changes | ||
and: | ||
http://wiki.whamcloud.com/display/PUB/Using+Gerrit | ||
|
||
The Lustre Coding Style Guidelines can be found at: | ||
http://wiki.whamcloud.com/display/PUB/Coding+Guidelines | ||
|
||
In order to improve the quality of patches submitted to the Lustre tree, | ||
it is possible to automatically check every patch and commit against the | ||
Lustre Coding Guidelines. To do this, run in the top-level lustre/ tree: | ||
|
||
cp build/{prepare-,}commit-msg .git/hooks/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,119 @@ | ||
#!/bin/bash | ||
# | ||
# A hook script to check the commit log message to ensure that it has | ||
# a well-formed commit summary and body, a valid Signed-off-by: line, | ||
# and a Gerrit Change-Id: line (added automatically if missing). | ||
# | ||
# Called by git-commit with one argument, the name of the file | ||
# that has the commit message. The hook should exit with non-zero | ||
# status after issuing an appropriate message if it wants to stop the | ||
# commit. The hook is allowed to edit the commit message file. | ||
# | ||
# Should be installed as .git/hooks/commit-msg. | ||
# | ||
|
||
ORIGINAL="$1" | ||
REVISED="$(mktemp "$1.XXXXXX")" | ||
SIGNOFF="Signed-off-by:" | ||
CHANGEID="Change-Id:" | ||
|
||
# Check for, and add if missing, a unique Change-Id | ||
new_changeid() { | ||
{ | ||
git var GIT_AUTHOR_IDENT | ||
git var GIT_COMMITTER_IDENT | ||
git write-tree | ||
git rev-parse HEAD 2>/dev/null | ||
grep -v "$SIGNOFF" "$ORIGINAL" | git stripspace -s | ||
} | git hash-object -t commit --stdin | ||
} | ||
|
||
usage() { | ||
[ "$LINE" ] && echo "error:$NUM: $LINE" 1>&2 && echo "" 1>&2 | ||
|
||
cat 1>&2 <<- EOF | ||
Commit message $1 | ||
$2 | ||
See http://wiki.whamcloud.com/display/PUB/Submitting+Changes | ||
for full details. An example valid commit comment is: | ||
LU-nnn component: short description of change under 64 columns | ||
A more detailed explanation. This can be as detailed as you'd like. | ||
Please explain both what problem was solved and a good high-level | ||
description of how it was solved. Wrap lines at 70 columns or less. | ||
$SIGNOFF Your Real Name <[email protected]> | ||
$CHANGEID Ixxxx(added automatically if missing)xxxx | ||
EOF | ||
|
||
exit 1 | ||
} | ||
|
||
export HAS_SIGNOFF=false | ||
export HAS_SUMMARY=false | ||
export HAS_BLANK=false | ||
export HAS_COMMENTS=false | ||
|
||
grep -q "^$CHANGEID" "$ORIGINAL" && HAS_CHANGEID=true || HAS_CHANGEID=false | ||
|
||
export LINE="" | ||
export NUM=1 | ||
|
||
IFS="" | ||
while read LINE; do | ||
LENGTH=$(echo $LINE | wc -c) | ||
|
||
case "$LINE" in | ||
$SIGNOFF*) | ||
$HAS_SUMMARY || usage "missing summary before $SIGNOFF." | ||
$HAS_BLANK || usage "missing blank line before $SIGNOFF." | ||
GOOD=$(echo "$LINE" | grep "^$SIGNOFF .* .* <.*@.*>") | ||
[ -z "$GOOD" ] && | ||
usage "missing valid commit summary line to show" \ | ||
"agreement with code submission requirements at" | ||
HAS_SIGNOFF=true | ||
echo $LINE | ||
$HAS_CHANGEID || echo "$CHANGEID I$(new_changeid)" | ||
;; | ||
$CHANGEID*) | ||
$HAS_SUMMARY || usage "missing summary before $CHANGEID line." | ||
$HAS_BLANK || usage "missing blank line before $CHANGEID line." | ||
HAS_CHANGEID=true | ||
echo $LINE | ||
;; | ||
"") [ $HAS_SUMMARY -a $NUM -eq 2 ] && HAS_BLANK=true | ||
echo $LINE | ||
;; | ||
\#*) HAS_COMMENTS=true | ||
continue | ||
;; | ||
*) if [ $NUM -eq 1 ]; then | ||
FMT="^[A-Z]\{2,5\}-[0-9]\{1,5\} [-a-z0-9]\{2,9\}: " | ||
GOOD=$(echo "$LINE" | grep "$FMT") | ||
[ $LENGTH -gt 64 ] && | ||
usage "summary longer than 64 columns." | ||
if [ -z "$GOOD" ]; then | ||
FMT="^[A-Z]\{2,5\}-[0-9]\{1,5\} " | ||
NO_SUBSYS=$(echo "$LINE" | grep "$FMT") | ||
[ "$NO_SUBSYS" ] && | ||
usage "has no subsys: in commit summary" | ||
usage "missing valid commit summary line." | ||
fi | ||
HAS_SUMMARY=true | ||
elif [ $LENGTH -gt 70 ]; then | ||
usage "has lines longer than 70 columns." | ||
fi | ||
echo $LINE | ||
;; | ||
esac | ||
|
||
NUM=$((NUM + 1)) | ||
done < "$ORIGINAL" > "$REVISED" | ||
|
||
[ $NUM -eq 1 ] && exit 1 # empty file | ||
|
||
LINE="" | ||
$HAS_SUMMARY || usage "missing commit summary line." | ||
$HAS_SIGNOFF || usage "missing $SIGNOFF line." | ||
$HAS_CHANGEID && rm "$REVISED" || mv "$REVISED" "$ORIGINAL" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
#!/bin/bash | ||
# | ||
# A Git hook script to prepare the commit log message. Install into | ||
# lustre/.git/hooks/prepare-commit-msg to enable for Lustre commits. | ||
# | ||
# Called by git-commit with the name of the file that has the | ||
# commit message, followed by the description of the commit | ||
# message's source. The hook's purpose is to edit the commit | ||
# message file. If the hook fails with a non-zero status, | ||
# the commit is aborted. | ||
# | ||
# Commit hook to check the patch against the Lustre coding style. | ||
# It adds any checkpatch warnings/errors as commit comments, which | ||
# means that they can currently be ignored, but are at least visible. | ||
|
||
CHECKPATCH=build/checkpatch.pl | ||
CHECKPATCH_OPTS="--no-signoff --no-tree --no-tabs" | ||
[ -r "$CHECKPATCH" ] || exit 0 | ||
|
||
# If there are no comments in the commit, it is likely a rebase and | ||
# this shouldn't be adding new comments, or they appear in the commit. | ||
grep -q "^#" "$1" || exit 0 | ||
|
||
# Add a commented-out Signed-off-by: line. This shouldn't be added in an | ||
# uncommented form, otherwise sanity checking for an emtpy commit fails. | ||
SIGNOFF=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') | ||
grep -qs "^$SIGNOFF" "$1" || echo "# $SIGNOFF" >> "$1" | ||
|
||
# Add the checkpatch.pl output as comments, but don't cause a commit error | ||
# yet, until there is more certainty that it is working correctly. | ||
echo "" >> "$1" | ||
echo "#" >> "$1" | ||
git diff --cached | $CHECKPATCH $CHECKPATCH_OPTS - | sed -e 's/^/# /' >> "$1" |