CodeReview Tools

From SambaWiki

Code Review Tools

~/.vimrc

Here is a sample of a configuration snippet for use with vim:

function! CommitMessages()
    let g:git_ci_msg_user = substitute(system("git config --get user.name"), '\n$', '', '')
    let g:git_ci_msg_email = substitute(system("git config --get user.email"), '\n$', '', '')

    nmap S oSigned-off-by: <C-R>=printf("%s <%s>", g:git_ci_msg_user, g:git_ci_msg_email)<CR><CR><ESC>
    nmap R oReviewed-by: <C-R>=printf("%s <%s>", g:git_ci_msg_user, g:git_ci_msg_email)<CR><ESC>
    iab #S Signed-off-by: <C-R>=printf("%s <%s>", g:git_ci_msg_user, g:git_ci_msg_email)<CR>
    iab #R Reviewed-by: <C-R>=printf("%s <%s>", g:git_ci_msg_user, g:git_ci_msg_email)<CR>
    iab #O Signed-off-by:
    iab #V Reviewed-by:
    iab #P Pair-Programmed-With:
    iab ME <C-R>=printf("%s <%s>", g:git_ci_msg_user, g:git_ci_msg_email)<CR>
    iab ASN Andreas<SPACE>Schneider<SPACE><asn@samba.org>
    iab AB Alexander<SPACE>Bokovoy<SPACE><ab@samba.org>
    iab OBNOX Michael<SPACE>Adam<SPACE><obnox@samba.org>
    iab VL Volker<SPACE>Lendecke<SPACE><vl@samba.org>
    iab METZE Stefan<SPACE>Metzmacher<SPACE><metze@samba.org>
    iab GD Guenther<SPACE>Deschner<SPACE><gd@samba.org>
    iab JRA Jeremy<SPACE>Allison<SPACE><jra@samba.org>
    iab JHROZEK Jakub<SPACE>Hrozek<SPACE><jhrozek@redhat.com>
    iab ARIS Aris<SPACE>Adamantiadis<SPACE><aris@0xbadc0de.be>
endf
autocmd BufWinEnter COMMIT_EDITMSG,*.diff,*.patch,*.patches.txt call CommitMessages()

~/.gitconfig

Here are a few git aliases for code review:

[alias]
  author   = !"SEARCH=${@:-`git config user.email`}; set --; git log --format='%aN <%aE>' | uniq | grep -m 1 \"$SEARCH\""
  authors  = !"SEARCH=${@:-`git config user.email`}; set --; git log --format='%aN <%aE>' | grep \"$SEARCH\" | uniq | awk '!a[$0]++'"
  reviewed = !"BRANCH=${1:-master}; shift; AUTHORS=\"~/git-reviewed.sh\"; for A in \"${@:-`git config user.email`}\"; do AUTHORS=$AUTHORS\" \\\"`git author $A`\\\"\"; done; set --; git rebase -i -x \"$AUTHORS\" $BRANCH"
git author [<search>]
Search for the latest author tag (a string in the format of "Full Name <email@example.com>") matching a given search term. If no <search> is provided, return the latest author tag that uses the current value of "git config user.email".
git authors [<search>]
Similar to "git author", except returns all author tags that match the search term. Useful in cases where a particular author has multiple e-mail addresses or multiple spellings to their name.
git reviewed [<branch> [<author> ...]]
Run a "git rebase -i <branch>" command that is configured to insert Reviewed-by tags for every <author> listed. <author> must be a search term as used in "git author" above. If no <author> is provided, uses the value of "git config user.email". If no <branch> is provided, "master" is used.
NOTE: <branch> is expected as the first argument, if it exists at all, as such it must be specified before any <author> parameter.
NOTE: This alias requires the user to have the git-reviewed.sh script (see below) saved in their home directory and set executable. If you save the script to a different location, modify the above alias so that "~/git-reviewed.sh" is changed to the location of the script.

git-reviewed.sh

#!/bin/bash

# git-reviewed.sh <AUTHOR> ...
#
# A git utility script to append review tags to the current commit's message
# Each tag takes the format of "Reviewed-by: <AUTHOR>". Each parameter to this
# script is treated as a separate <AUTHOR> which will have its own tag.
# Each <AUTHOR> is taken as a literal string, so if <AUTHOR> has spaces be
# sure to enclose it in double quotes.

if [[ $# -eq 0 ]] ; then
  echo "ERROR: Must provide at least one author."
  exit 1
fi

AUTHORS=()

while [[ $# -gt 0 ]]; do
  AUTHORS+=("$1")
  shift
done

MSG_FILE=".git/COMMIT_EDITMSG"

MSG=$(git log -1 --pretty=%B)
TAGS=""

for AUTHOR in "${AUTHORS[@]}"; do
  RB="Reviewed-by: "$AUTHOR
  if !(echo -e "$MSG" | grep -qs "^$RB"); then
    TAGS=${TAGS}${RB}"\n"
  fi
done

if [ -n "$TAGS" ]; then
  echo "$MSG" > $MSG_FILE
  sed -i "\$a$TAGS" $MSG_FILE
  git commit --amend -F $MSG_FILE --cleanup=strip
fi

~/.tigrc

tig is a text-based, vim-like interface/browser for use with git. It is also fairly extensible. The following is a simple example of a tig configuration file (~/.tigrc) that triggers 'git reviewed' against the currently selected branch HEAD in the refs view when the user enters 4. This rebases the current checked-out branch against the selected branch and marks all rebased commits as Reviewed-by for the author:

bind refs 4     !git reviewed %(branch)

git-review-by and git-review-by-me

Both these scripts require the git_review.msg-filter.awk AWK script and require GNU awk as awk.

These scripts operate on a the set of patches since origin/master adding Reviewed-By to all Signed-Off-By commits. The git-review-by-me script does a rebase and build first to avoid embarrassment.