CodeReview Tools

From SambaWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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.