adding reviewed-by tags (semi)automatically
Michael Adam
obnox at samba.org
Wed Nov 7 14:06:20 MST 2012
Update:
This version of the commit-msg and prepare-commit-msg
add a "Signed-off-by" tag for the author if the variable
SIGN is set in the environment. This is sometimes handy
when applying a patch of another author who forgot to
add his sign-off and you want to push the patch with
signoff and review tags:
REVIEW=1 SIGN=1 git am patchfile
or
REVIEW=1 SIGN=1 git ci --amend
for amending.
(It works without setting REVIEW, too, of course.)
Cheers - Michael
On 2012-11-02 at 16:48 +0100, Michael Adam wrote:
> Hi,
>
> I was looking for a means of easily adding Reviewed-by: tags
> to commit messages without the need to do a lot of typing.
>
> There is no parameter like -s/--signoff to git, so we need
> something else.
>
> Firstly, I suggest to have a local git clone for
> reviews. Then you don't have to interrupt your development work
> by switching branches for doing reviews.
>
> Attached are two git hook scripts that I am currently
> experimenting with. There are three hooks involved:
>
> - The prepare-commit-msg hook script is invoked by "git commit"
> before you enter the editor.
> - The commit-msg hook is invoked by "git commit" after you finished
> editing the commit message.
> - The applypatch-msg is invoked by "git am".
> I did not attach it: the default sample, if activated, invokes
> the commit-msg script if present.
>
> The hooks must be placed into the .git/hooks directory
> of your git checkout and made executable. The ".obnox" suffix
> must be stripped from the scripts I attached.
>
> Then the attached "prepare-commit-msg" script and "commit-msg"
> scripts both add the Reviewed-by: Tag of the committer if it
> is not already present in the message. In order for them to
> add the tag, you have to set the environment variable REVIEW to some
> value.
>
> - If you want to see the Reviewed-by Tag in you editor (for e.g.
> "git commit --amend"), you should enable the prepare-commit-msg hook.
> - If you want to do non-editing amends, e.g. with "git commit
> --amend --no-edit", then you should activate the commit-msg
> hook.
> - If you want "git am" to add the tag, you should activate the
> commit-msg hook and the default applypatch-msg hook.
>
> Examples:
>
> $ REVIEW=1 git commit --amend
> $ REVIEW=1 git commit --amend --no-edit
> $ REVIEW=1 EDITOR=/bin/true git commit --amend
> $ REVIEW=1 git am patcfile
>
>
> Note: if you activate both prepare-commit-msg and commit-msg
> and call
>
> $ REVIEW=1 git commit --amend
>
> you'll see the tag in the editor, but if you remove it
> then the commit-msg hook will re-add it...
>
>
> If you want to modify various commit messages, you can use
> this with the "x" feature of "git rebase -i".
>
> In the editor offered by (e.g.) "git commit -i origin/master",
> add this line after each commit you want to modify:
>
> x REVIEW=1 git commit --amend --no-edit
>
> And this should do the trick..
>
> Cheers - Michael
>
> #!/bin/sh
> #
> # An example hook script to check the commit log message.
> # 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.
> #
> # To enable this hook, rename this file to "commit-msg".
>
> # Uncomment the below to add a Signed-off-by line to the message.
> # Doing this in a hook is a bad idea in general, but the prepare-commit-msg
> # hook is more suited to it.
> #
> # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
> # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
>
> # This example catches duplicate Signed-off-by lines.
>
> #test "" = "$(grep '^Signed-off-by: ' "$1" |
> # sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || {
> # echo >&2 Duplicate Signed-off-by lines.
> # exit 1
> #}
>
>
> # if a the environment variable "REVIEW" is set,
> # then add a Reviewed-by: tag to the commit message,
> # if it is not already present:
>
> test "x$REVIEW" = "x" || {
> echo "commit-msg: REVIEW is set"
> RB=$(git var GIT_COMMITTER_IDENT | sed -n 's/^\(.*>\).*$/Reviewed-by: \1/p')
> grep -qs "^$RB" "$1" || { \
> echo "$RB" >> $1 ;
> }
> }
>
> #!/bin/sh
> #
> # An example hook script to prepare the commit log message.
> # 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.
> #
> # To enable this hook, rename this file to "prepare-commit-msg".
>
> # This hook includes three examples. The first comments out the
> # "Conflicts:" part of a merge commit.
> #
> # The second includes the output of "git diff --name-status -r"
> # into the message, just before the "git status" output. It is
> # commented because it doesn't cope with --amend or with squashed
> # commits.
> #
> # The third example adds a Signed-off-by line to the message, that can
> # still be edited. This is rarely a good idea.
>
> ### case "$2,$3" in
> ### merge,)
> ### perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;;
> ###
> ### # ,|template,)
> ### # perl -i.bak -pe '
> ### # print "\n" . `git diff --cached --name-status -r`
> ### # if /^#/ && $first++ == 0' "$1" ;;
> ###
> ### *) ;;
> ### esac
>
> # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
> # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
>
> # if a the environment variable "REVIEW" is set,
> # then add a Reviewed-by: tag to the commit message,
> # if it is not already present:
>
> test "x$REVIEW" = "x" || {
> RB=$(git var GIT_COMMITTER_IDENT | sed -n 's/^\(.*>\).*$/Reviewed-by: \1/p')
> grep -qs "^$RB" "$1" || \
> perl -i.bak -pe 'if (/^#/ && $first++ == 0) {
> $rb = `git var GIT_COMMITTER_IDENT` ;
> $rb =~ s/^(.*>).*$/Reviewed-by: $1/ ;
> print "$rb\n";
> }' "$1"
> }
>
-------------- next part --------------
#!/bin/sh
#
# An example hook script to check the commit log message.
# 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.
#
# To enable this hook, rename this file to "commit-msg".
# Uncomment the below to add a Signed-off-by line to the message.
# Doing this in a hook is a bad idea in general, but the prepare-commit-msg
# hook is more suited to it.
#
# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
# This example catches duplicate Signed-off-by lines.
#test "" = "$(grep '^Signed-off-by: ' "$1" |
# sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || {
# echo >&2 Duplicate Signed-off-by lines.
# exit 1
#}
# if a the environment variable "SIGN" is set,
# then add the author's Signed-off-by: tag to the
# commit message, if it is not already present:
test "x$SIGN" = "x" || {
#echo "commit-msg: SIGN is set"
SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
grep -qs "^$SOB" "$1" || {
echo "\n$SOB" >> $1 ;
}
}
# if a the environment variable "REVIEW" is set,
# then add a Reviewed-by: tag to the commit message,
# if it is not already present:
test "x$REVIEW" = "x" || {
#echo "commit-msg: REVIEW is set"
RB=$(git var GIT_COMMITTER_IDENT | sed -n 's/^\(.*>\).*$/Reviewed-by: \1/p')
grep -qs "^$RB" "$1" || {
echo "$RB" >> $1 ;
}
}
-------------- next part --------------
#!/bin/sh
#
# An example hook script to prepare the commit log message.
# 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.
#
# To enable this hook, rename this file to "prepare-commit-msg".
# This hook includes three examples. The first comments out the
# "Conflicts:" part of a merge commit.
#
# The second includes the output of "git diff --name-status -r"
# into the message, just before the "git status" output. It is
# commented because it doesn't cope with --amend or with squashed
# commits.
#
# The third example adds a Signed-off-by line to the message, that can
# still be edited. This is rarely a good idea.
### case "$2,$3" in
### merge,)
### perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;;
###
### # ,|template,)
### # perl -i.bak -pe '
### # print "\n" . `git diff --cached --name-status -r`
### # if /^#/ && $first++ == 0' "$1" ;;
###
### *) ;;
### esac
# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
# if a the environment variable "SIGN" is set,
# then add the autor's Signed-off-by: tag to the
# commit message, if it is not already present:
test "x$SIGN" = "x" || {
SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
grep -qs "^$SOB" "$1" || \
perl -i.bak -pe 'if (/^#/ && $first++ == 0) {
$sob = `git var GIT_AUTHOR_IDENT` ;
$sob =~ s/^(.*>).*$/Signed-off-by: $1/ ;
print "\n$sob\n";
}' "$1"
}
# if a the environment variable "REVIEW" is set,
# then add a Reviewed-by: tag to the commit message,
# if it is not already present:
test "x$REVIEW" = "x" || {
RB=$(git var GIT_COMMITTER_IDENT | sed -n 's/^\(.*>\).*$/Reviewed-by: \1/p')
grep -qs "^$RB" "$1" || \
perl -i.bak -pe 'if (/^#/ && $first++ == 0) {
$rb = `git var GIT_COMMITTER_IDENT` ;
$rb =~ s/^(.*>).*$/Reviewed-by: $1/ ;
print "$rb\n";
}' "$1"
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 206 bytes
Desc: not available
URL: <http://lists.samba.org/pipermail/samba-technical/attachments/20121107/1ef8f5b2/attachment.pgp>
More information about the samba-technical
mailing list