coderev-0.1/coderev.sh
coderev-0.2/coderev.sh
f1#!/bin/bashf1#!/bin/bash
2#2#
3# Homepage: http://code.google.com/p/coderev3# Homepage: http://code.google.com/p/coderev
4# License: GPLv2, see "COPYING"4# License: GPLv2, see "COPYING"
5#5#
6# Generate code review page of <workspace> vs <workspace>@HEAD, by using6# Generate code review page of <workspace> vs <workspace>@HEAD, by using
7# `codediff.py' - a standalone diff tool7# `codediff.py' - a standalone diff tool
8#8#
n9# Usage: coderev.sh [file|subdir ...]n9# Usage: cd your-workspace; coderev.sh [file|subdir ...]
10#10#
n11# $Id: coderev.sh 4 2008-08-19 05:24:24Z mattwyl $n11# $Id: coderev.sh 10 2008-08-23 09:02:26Z mattwyl $
1212
13PROG_NAME=$(basename $0)13PROG_NAME=$(basename $0)
nn14BINDIR=$(cd $(dirname $0) && pwd -L) || exit 1
15CODEDIFF=$BINDIR/codediff.py
1416
15function help17function help
16{18{
17    cat << EOF19    cat << EOF
1820
19Usage:21Usage:
n20    $PROG_NAME [-r revsion] [file|subdir ...]n22    $PROG_NAME [-r revsion] [-w width] [file|subdir ...]
2123
n22    \`revision' is a revision number, or symbol (PREV, BASE, HEAD), see svnn24    \`revision' is a revision number, or symbol (PREV, BASE, HEAD) in svn,
23    books for details.  Default revision is revision of your working copy25    see svn books for details.  Default revision is revision of your working
24    (aka. BASE)26    copy
27 
28    \`width' is a number to make code review pages wrap in specific column
2529
26    Default \`subdir' is working dir.30    Default \`subdir' is working dir.
2731
28Example 1:32Example 1:
n29    $PROG_NAME bin libn33    $PROG_NAME -w80 bin lib
3034
n31    Generate coderev based on your working copy.  If you are working on then35    Generate coderev based on your working copy, web pages wrap in column 80.
32    most up-to-date version, this is suggested way (faster).36    If you are working on the most up-to-date version, this is suggested way
37    (faster).
3338
n34Example 2:n39Example 2 (for SVN):
35    $PROG_NAME -r HEAD bin lib40    $PROG_NAME -r HEAD bin lib
3641
37    Generate coderev based on HEAD revision (up-to-date version in repository),42    Generate coderev based on HEAD revision (up-to-date version in repository),
38    this will retrive diffs from SVN server so it's slower, but most safely.43    this will retrive diffs from SVN server so it's slower, but most safely.
3944
40EOF45EOF
4146
42    return 047    return 0
43}48}
4449
nn50####################  VCS Operations Begin #################### 
51 
52# Return code: 0 - Unknown, 1 - SVN, 2 - CVS
53#
54function detect_vcs
55{
56    [[ -f .svn/entries ]] && return 1
57    [[ -f CVS/Entries ]] && return 2
58    return 0
59}
60 
61function set_vcs_ops
62{
63    local i=${1?}
64    local vcs_opt=${VCS_OPS_TABLE[i]}
65 
66    eval vcs_get_banner=\${$vcs_opt[0]}
67    eval vcs_get_repository=\${$vcs_opt[1]}
68    eval vcs_get_project_path=\${$vcs_opt[2]}
69    eval vcs_get_working_revision=\${$vcs_opt[3]}
70    eval vcs_get_active_list=\${$vcs_opt[4]}
71    eval vcs_get_diff=\${$vcs_opt[5]}
72    eval vcs_get_diff_opt=\${$vcs_opt[6]}
73}
74 
75# VCS Operations: 
76#   get_banner                        - print banner, return 1 if not supported
77#   get_repository                    - print repository
78#   get_project_path                  - print project path without repository
79#   get_working_revision pathname ... - print working revision
80#   get_active_list pathname ...      - print active file list
81#   get_diff [diff_opt] pathname ...  - get diffs for active files
82#   get_diff_opt                      - print diff option and args
83 
84# Unknown ops just defined here, others see libxxx.sh
85#
86UNKNOWN_OPS=( unknown_get_banner : : : : : : )
87 
88function unknown_get_banner
89{
90    echo "unknown"
91    return 1
92}
93 
94VCS_OPS_TABLE=( UNKNOWN_OPS  SVN_OPS  CVS_OPS )
95 
96. $BINDIR/libsvn.sh || exit 1
97. $BINDIR/libcvs.sh || exit 1
98 
99# Detect VCS (Version Control System) and set handler
100#
101detect_vcs
102set_vcs_ops $?
103 
104####################  VCS Operations End #################### 
105 
106# Main Proc
107#
45while getopts "r:h" op; do108while getopts "hr:w:" op; do
46    case $op in109    case $op in
n47        r) REV="$OPTARG" ;;n
48        h) help; exit 0 ;;110        h) help; exit 0 ;;
nn111        r) REV_ARG="$OPTARG" ;;
112        w) CODEDIFF_OPT="-w $OPTARG" ;;
49        ?) help; exit 1 ;;113        ?) help; exit 1 ;;
50    esac114    esac
51done115done
nn116shift $((OPTIND - 1))
117PATHNAME="${@:-.}"
52118
n53shift $((OPTIND - 1))n119BANNER=$($vcs_get_banner) || {
54SUBDIRS="$@"120    echo "Unsupported version control system ($BANNER)." >&2
121    exit 1
122}
123echo "Version control system \"$BANNER\" detected."
55124
n56[[ -n "$REV" ]] && SVN_OPT="-r $REV"n125# Retrive information
57 
58# Get codediff path
59#126#
n60BINDIR=$(cd $(dirname $0) && pwd -L) || exit 1n
61CODEDIFF=$BINDIR/codediff.py
62 
63# Retrive SVN information
64#
65echo "Retriving SVN information ..."127echo "Retriving information ..."
66URL=$(svn info | grep '^URL:' | awk '{print $2}') || exit 1128PROJ_PATH=$($vcs_get_project_path)
67WS_NAME=$(basename "$URL")129WS_NAME=$(basename $PROJ_PATH)
68WS_REV=$(svn info | grep 'Revision:' | awk '{print $2}') || exit 1130WS_REV=$($vcs_get_working_revision $PATHNAME)
69BASE_REV=$(svn info $SVN_OPT | grep 'Revision:' | awk '{print $2}') || exit 1131echo "Repository       : $($vcs_get_repository)"
70echo "URL     : $URL"132echo "Project path     : $PROJ_PATH"
71echo "WS_REV  : $WS_REV"133echo "Working revision : $WS_REV"
72echo "BASE_REV: $BASE_REV"
73 
74134
75# Prepare file list and base source135# Prepare file list and base source
76#136#
n77LIST=$(mktemp /tmp/list.XXXXXX) || exit 1n
78DIFF=$(mktemp /tmp/diff.XXXXXX) || exit 1137TMPDIR=$(mktemp -d /tmp/coderev.XXXXXX) || exit 1
79BASE_SRC="/tmp/${WS_NAME}@${BASE_REV}"138LIST="$TMPDIR/activelist"
139DIFF="$TMPDIR/diffs"
140BASE_SRC="$TMPDIR/$WS_NAME-base"
80141
n81for file in $(svn st $SUBDIRS | grep '^[A-Z]' | awk '{print $2}'); don142$vcs_get_active_list $PATHNAME > $LIST || exit 1
82    [[ -d $file ]] && continue143echo "==========  Active file list  =========="
83    echo $file >> $LIST || exit 1144cat $LIST
84done145echo "========================================"
85146
n86echo "Active file list:"n147# Generate $BASE_SRC
87echo "============================"
88cat $LIST
89echo "============================"
90 
91# Generate $base_src
92#148#
93mkdir -p $BASE_SRC || exit 1149mkdir -p $BASE_SRC || exit 1
94tar -cf - $(cat $LIST) | tar -C $BASE_SRC -xf - || exit 1150tar -cf - $(cat $LIST) | tar -C $BASE_SRC -xf - || exit 1
95151
96echo "Retriving diffs ..."152echo "Retriving diffs ..."
nn153VCS_REV_OPT=""
154[[ -n $REV_ARG ]] && VCS_REV_OPT="$($vcs_get_diff_opt $REV_ARG)"
97svn diff $SVN_OPT $(cat $LIST) > $DIFF || exit 1155$vcs_get_diff $VCS_REV_OPT $(cat $LIST) > $DIFF || exit 1
98cat $DIFF | patch -NER -p0 -d $BASE_SRC || exit 1156patch -NER -p0 -d $BASE_SRC < $DIFF || exit 1
99157
100# Generate coderev158# Generate coderev
101#159#
n102CODEREV=/tmp/${WS_NAME}-diff-${BASE_REV}n160echo "Generating code review ..."
103cat $LIST | $CODEDIFF -o $CODEREV -w80 -y -f- $BASE_SRC . || exit 1161CODEREV=$TMPDIR/${WS_NAME}-r${WS_REV}-diff
104 162$CODEDIFF $CODEDIFF_OPT -o $CODEREV -y -f- $BASE_SRC . < $LIST || exit 1
105echo
106echo "Coderev generated under $CODEREV"163echo "Coderev pages generated at $CODEREV"
107echo164echo
108165
109# Cleanup166# Cleanup
110#167#
111rm -rf $LIST $DIFF $BASE_SRC168rm -rf $LIST $DIFF $BASE_SRC
112169
nn170# Copy to web host
171#
172[[ -r ~/.coderevrc ]] || {
173    echo "[*] Hint: if you want to copy coderev pages to a remote host"
174    echo "    automatically, see coderevrc.sample"
175    echo
176    exit 0
177}
113178
n114##############################################################################n179. ~/.coderevrc || {
115#180    echo "Reading ~/.coderevrc failed." >&2
116# Customize your webdir to save coderev:181    exit 1
117#182}
118# 1. define WEBHOST, SSH_USER, HOST_DIR and WEBDIR
119# 2. Comment out the line ":<< \__copy_to_webserver__" below
120#
121##############################################################################
122183
n123: << __copy_to_webserver__n184: ${WEB_HOST?"WEB_HOST not defined."}
185: ${SSH_USER?"SSH_USER not defined."}
186: ${HOST_DIR?"HOST_DIR not defined."}
187: ${WEB_URL?"WEB_URL not defined."}
124188
n125WEBHOST=example.orgn
126SSH_USER=me
127HOST_DIR='~/public_html/coderev'
128WEBDIR="http://$WEBHOST/~$SSH_USER/coderev"
129 
130scp -r $CODEREV ${SSH_USER}@${WEBHOST}:$HOST_DIR/ || exit 1189scp -r $CODEREV ${SSH_USER}@${WEB_HOST}:$HOST_DIR/ || exit 1
131190
132echo191echo
133echo "Coderev link:"192echo "Coderev link:"
n134echo "$WEBDIR/$(basename $CODEREV)"n193echo "$WEB_URL/$(basename $CODEREV)"
135echo194echo
136195
137exit 0196exit 0
t138 t
139__copy_to_webserver__
Legends
Colors
 Added 
Changed
Deleted
Links
(f)irst change
(n)ext change
(t)op