123

#!/bin/bash
#created by h03566 2017.04.28
#diff func added by h03566 2017.06.03
#slove chinese encode problem by h03566 2018.04.16

DEBUG=1
DEBUG=yes

WORK_COPY=
SVN_PATH=

BUGID=
AUTHOR=
BEGIN_REV=
END_REV=

NEED_LOCAL_DIR=

SVN_ROOT=http://10.220.3.241/UWARE_CODE/
SVN_TRUNK=trunk/
TOP_DIR=UWARE

SEARCH_BUGID=
SEARCH_AUTHOR=

get_svn_path()
{
* * * TMP=
* * * LIST=
* * * IDX=
* * * TEST=
* * * DIR=

* * * echo "please input svn fullpath or input directory as given. blank for default path: "$SVN_ROOT$SVN_TRUNK
* * * while true
* * * do
* * * * * * * echo "current path: "$SVN_ROOT$DIR" sub directory list: "
* * * * * * * LIST=$(svn list $SVN_ROOT$DIR)
* * * * * * * IDX=0
* * * * * * * for TMP in $LIST
* * * * * * * do
* * * * * * * * * * * let IDX=$IDX+1
* * * * * * * * * * * echo $IDX". "$TMP
* * * * * * * done
* * * * * * * read SEL
* * * * * * * if [ "$SEL" == "" * -a "$DIR" == "" ]; then
* * * * * * * * * * * DIR=$SVN_TRUNK
* * * * * * * * * * * break
* * * * * * * else
* * * * * * * * * * * expr $SEL + 0 &>/dev/null
* * * * * * * * * * * if [ $? -eq 0 ]; then
* * * * * * * * * * * * * * * DIR=$DIR$(echo $LIST | awk -F\ * -v idx=$SEL '{print $(idx)}')
* * * * * * * * * * * else
* * * * * * * * * * * * * * * svn info $SVN_ROOT$DIR$SEL > /dev/null
* * * * * * * * * * * * * * * if [ $? -eq 0 ]; then
* * * * * * * * * * * * * * * * * * * DIR=$DIR$SEL"/"
* * * * * * * * * * * * * * * else
* * * * * * * * * * * * * * * * * * * echo "wrong svn path. please check u input"
* * * * * * * * * * * * * * * fi
* * * * * * * * * * * fi
* * * * * * * * * * * if [ ! -z $(echo $DIR | grep $TOP_DIR) ]; then
* * * * * * * * * * * * * * * break
* * * * * * * * * * * fi
* * * * * * * fi
* * * done
* * * SVN_PATH=$SVN_ROOT$DIR
* * * echo "======== svn path is " $SVN_PATH
}

get_work_copy()
{
* * * echo "please input working copy directory. blank for no local directory"
* * * echo "recommand use top level path i.e. xxx/UWARE/"
* * * read WORK_COPY
* * * if [ -z $WORK_COPY ]; then
* * * * * * * if [ $NEED_LOCAL_DIR -eq 1 ]; then
* * * * * * * * * * * echo "get param [working copy directory] fail!"
* * * * * * * * * * * exit 1
* * * * * * * else
* * * * * * * * * * * echo "no [working copy directory] input. try get svn path instead"
* * * * * * * * * * * get_svn_path;
* * * * * * * * * * * return
* * * * * * * fi
* * * fi
* * * #fixme: confused why need change "~" to $HOME otherwise excute svn up in shellscript will fail(while success in command mode)
* * * HOME_PREFIX=$(echo $WORK_COPY | awk -F\~ '{if ($1~/*/){print $0}else{print $2}}')
* * * if [ ! -z $HOME_PREFIX ]; then
* * * * * * * WORK_COPY=$HOME$HOME_PREFIX
* * * fi
* * * SVN_PATH=$(svn info $WORK_COPY | awk -F\ * '{if($1=="URL:"){print $2}}')
* * * if [ -z $SVN_PATH ]; then
* * * * * * * echo "get wrong svn path. please check working copy dir"
* * * * * * * exit 1
* * * fi
* * * echo "======== working copy is " $WORK_COPY
* * * echo "======== svn path is " $SVN_PATH
}

get_param()
{
* * * STOP_FLAG=

* * * get_work_copy;

* * * echo "please input search range or keyword: begin & end revision or bug id / author"
* * * echo "if u want every commit between begin & end revision just input revision number otherwise input bug id or author"
* * * echo "please input begin revision and end revision. leave blank will automatic search latest 2000 revision"
* * * read BEGIN_REV
* * * if [ -z $BEGIN_REV ]; then
* * * * * * * echo "no begin revision given"
* * * else
* * * * * * * echo "svn revision begin with "$BEGIN_REV
* * * fi
* * * read END_REV
* * * if [ -z $END_REV ]; then
* * * * * * * echo "no end revision given"
* * * else
* * * * * * * echo "svn revision end with "$END_REV
* * * fi
* * * if [ "$BEGIN_REV" != "" -a "$END_REV" != "" ]; then
* * * * * * * #as we all stop on copy this flag is unused for now
* * * * * * * STOP_FLAG=--stop-on-copy
* * * elif [ "$BEGIN_REV" != "" -o "$END_REV" != "" ]; then
* * * * * * * expr $BEGIN_REV + $END_REV &>/dev/null
* * * * * * * if [ $? -ne 0 ]; then
* * * * * * * * * * * echo "wrong revision input. begin "$BEGIN_REV"end "$END_REV
* * * * * * * * * * * exit 1
* * * * * * * fi
* * * fi

* * * echo "please input bug trece id i.e. IVSD00000"
* * * read BUGID
* * * if [ -z $BUGID ]; then
* * * * * * * echo "caution no trace id limited"
* * * else
* * * * * * * echo "bug trace id is" $BUGID
* * * fi

* * * echo "please input author id i.e. h03566"
* * * read AUTHOR
* * * if [ -z $AUTHOR ]; then
* * * * * * * echo "caution no author limited"
* * * else
* * * * * * * echo "author id is" $AUTHOR
* * * fi

* * * if [ "$BEGIN_REV" == "" -o "$END_REV" == "" ]; then
* * * * * * * if [ "$BUGID" == "" -a "$AUTHOR" == "" ]; then
* * * * * * * * * * * echo "required at least one param: [BUGID] or [AUTHOR] to search log!"
* * * * * * * * * * * exit 1
* * * * * * * fi

* * * * * * * #only input BUGID or AUTHOR need add search option
* * * * * * * SEARCH_PREFIX=--search
* * * * * * * if [ ! -z $BUGID ]; then
* * * * * * * * * * * SEARCH_BUGID=$SEARCH_PREFIX" "$BUGID
* * * * * * * * * * * SEARCH_PREFIX=$SEARCH_PREFIX"-and"
* * * * * * * fi
* * * * * * * if [ ! -z $AUTHOR ]; then
* * * * * * * * * * * SEARCH_AUTHOR=$SEARCH_PREFIX" "$AUTHOR
* * * * * * * fi

* * * * * * * #ugly: takes long time to search without limit log count
* * * * * * * echo "no search range given.auto search least 2000 history"
* * * * * * * END_REV=$(svn info $SVN_PATH | awk -F\ * '{if ($1~/^Revision:$/){print $2}}')
* * * * * * * BEGIN_REV=$END_REV
* * * * * * * CONFIRM=n
* * * * * * * while true
* * * * * * * do
* * * * * * * * * * * if [ "$CONFIRM" == "y" -o "$CONFIRM" == "Y" ]; then
* * * * * * * * * * * * * * * break
* * * * * * * * * * * else
* * * * * * * * * * * * * * * BEGIN_REV=$(expr $BEGIN_REV - 2000)
* * * * * * * * * * * * * * * CI_TIME=$(svn log -r $BEGIN_REV:$END_REV $SVN_PATH $SEARCH_BUGID $SEARCH_AUTHOR --stop-on-copy | awk -F\ * 'BEGIN{i=0}{if ($1~/r[0-9]+/){i++;}}END{print i}')
* * * * * * * * * * * * * * * echo "get" $CI_TIME "commit times from" $BEGIN_REV "to" $END_REV
* * * * * * * * * * * * * * * echo "print y to confirm or n to continue search"
* * * * * * * * * * * fi
* * * * * * * * * * * read CONFIRM
* * * * * * * done
* * * fi

* * * echo "======== search history "$BEGIN_REV" to "$END_REV
* * * echo "======== bug id is "$BUGID
* * * echo "======== author is "$AUTHOR
}

revert()
{
* * * TMP=
* * * REV=

* * * echo "begin to revert. update work dir first"
* * * #clean working copy
* * * svn up $WORK_COPY
* * * #svn revert $WORK_COPY -R

* * * if [ "$BUGID" != "" -o "$AUTHOR" != "" ]; then
* * * * * * * REV=$(svn log -r $BEGIN_REV:$END_REV $SVN_PATH $SEARCH_BUGID $SEARCH_AUTHOR --stop-on-copy | awk -F\ * '{if ($1~/r[0-9]+/){print $1;}}' | sed -n 's/r//p')
* * * * * * * if [ "$REV" == "" ]; then
* * * * * * * * * * * echo "can't get bug change history changed by "$AUTHOR" named by "$BUGID" svn path "$SVN_PATH
* * * * * * * * * * * exit 1
* * * * * * * fi

* * * * * * * for TMP in $REV; do
* * * * * * * * * * * echo "merge from rev "$TMP
* * * * * * * * * * * svn log -r $TMP -v $SVN_PATH
* * * * * * * * * * * svn merge -r $TMP:$(expr $TMP - 1) $SVN_PATH $WORK_COPY
* * * * * * * done
* * * else
* * * * * * * svn merge -r $END_REV:$BEGIN_REV $SVN_PATH $WORK_COPY
* * * fi

* * * echo "svn revert completed"
* * * svn st -q $WORK_COPY
}

count()
{
* * * TMP=
* * * REV=
* * * CI_CNT=0
* * * ADD_LINE=
* * * DEL_LINE=
* * * IDX=0

* * * if [ -e ./svn.tmp ]; then
* * * * * * * rm ./svn.tmp
* * * fi

* * * if [ "$BUGID" != "" -o "$AUTHOR" != "" ]; then
* * * * * * * REV=$(svn log -r $BEGIN_REV:$END_REV $SVN_PATH $SEARCH_BUGID $SEARCH_AUTHOR --stop-on-copy | awk -F\ * '{if ($1~/r[0-9]+/){print $1;}}' | sed -n 's/r//p')
* * * * * * * if [ "$REV" == "" ]; then
* * * * * * * * * * * echo "can't get bug change history changed by "$AUTHOR" named by "$BUGID" svn path "$SVN_PATH
* * * * * * * * * * * exit 1
* * * * * * * fi

* * * * * * * for TMP in $REV; do
* * * * * * * * * * * echo "counting change from rev " $TMP
* * * * * * * * * * * CI_CNT=$[CI_CNT + 1]
* * * * * * * * * * * svn diff $SVN_PATH -r $(expr $TMP - 1):$TMP -x --ignore-eol-style -x -w | awk -F "\n" -v file="./svn.tmp" 'BEGIN{OFS="\n";al=0;dl=0;getline al < file;getline dl < file;}{if($1~/^+($|[^+]+.*)/){al++;}if($1~/^-($|[^-]+.*)/){dl++;}}END{print al, dl > file}'
* * * * * * * done
* * * else
* * * * * * * CI_CNT=$(svn log -r $BEGIN_REV:$END_REV $SVN_PATH | awk -F\ * 'BEGIN{ci=0;}{if($1~/^r[0-9]+/){ci++;}}END{print ci}')
* * * * * * * svn diff $SVN_PATH -r $BEGIN_REV:$END_REV -x --ignore-eol-style -x -w | awk -F "\n" -v file="./svn.tmp" 'BEGIN{OFS="\n";al=0;dl=0;getline al < file;getline dl < file;}{if($1~/^+($|[^+]+.*)/){al++;}if($1~/^-($|[^-]+.*)/){dl++;}}END{print al, dl > file}'
* * * fi

* * * while read TMP
* * * do
* * * * * * * if [ $IDX -eq 0 ]; then
* * * * * * * * * * * ADD_LINE=$TMP
* * * * * * * * * * * IDX=1
* * * * * * * else
* * * * * * * * * * * DEL_LINE=$TMP
* * * * * * * fi
* * * done < ./svn.tmp
* * * rm ./svn.tmp

* * * echo "========================================"
* * * echo "svn commit log for BUGID " $BUGID "AUTHOR " $AUTHOR
* * * echo "commit count: " $CI_CNT
* * * echo "add line: " $ADD_LINE
* * * echo "del line: " $DEL_LINE
* * * echo "========================================"
}

report()
{
* * * TMP=
* * * REV=

* * * if [ -e ./output.tmp ]; then
* * * * * * * rm ./output.tmp
* * * fi

* * * if [ -e ./svn.tmp ]; then
* * * * * * * rm ./svn.tmp
* * * fi

* * * if [ -z $BUGID ]; then
* * * * * * * echo "no BUGID given. exit!"
* * * * * * * exit 1
* * * fi

* * * #svn log print revision from latest to oldest so swap BEGIN_REV & END_REV to ensure commit order
* * * REV=$(svn log -r $END_REV:$BEGIN_REV $SVN_PATH $SEARCH_BUGID $SEARCH_AUTHOR --stop-on-copy | awk -F\ * '{if ($1~/r[0-9]+/){print $1;}}' | sed -n 's/r//p')
* * * if [ "$REV" == "" ]; then
* * * * * * * echo "can't get bug change history changed by "$AUTHOR" named by "$BUGID" svn path "$SVN_PATH
* * * * * * * exit 1
* * * fi

* * * for TMP in $REV; do
* * * * * * * echo "counting change from rev " $TMP
* * * * * * * svn diff $SVN_PATH -r $(expr $TMP - 1):$TMP -x --ignore-eol-style -x -w >> ./svn.tmp
* * * done
* * * if [ $DEBUG == "yes" ]; then
* * * * * * * cp ./svn.tmp ./svn.tmp.bak
* * * fi

* * * #added by h03566 2017.8.29 for get rid of "\r"
* * * dos2unix svn.tmp
* * * if [ $DEBUG == "yes" ]; then
* * * * * * * cp ./svn.tmp ./svn.tmp.bak2
* * * fi

* * * #convert GB2312 to UTF8 in case of unrecognizable characters
* * * iconv -f GBK -t UTF-8 ./svn.tmp -o ./svn.tmp.conv

* * * OUTPUT=$BUGID"_Report.html"

* * * #change utf-8 nobom to utf-8 to avoid unicode problem and clean(if exist) or create(if not) file
* * * echo -e -n "\xef\xbb\xbf" > $OUTPUT

* * * echo "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">" >> $OUTPUT
* * * echo "<html>" >> $OUTPUT
* * * echo "<head>" >> $OUTPUT
* * * echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">" >> $OUTPUT
* * * echo "<style>" >> $OUTPUT
* * * echo ".AlignLeft { text-align: left; }" >> $OUTPUT
* * * echo ".AlignCenter { text-align: center; }" >> $OUTPUT
* * * echo ".AlignRight { text-align: right; }" >> $OUTPUT
* * * echo ".Wrap { white-space: nowrap; }" >> $OUTPUT
* * * echo "body { font-family: sans-serif; font-size: 11pt; }" >> $OUTPUT
* * * echo "td { vertical-align: top; padding-left: 4px; padding-right: 4px; }" >> $OUTPUT

* * * echo "tr.SectionGap td { font-size: 4px; border-left: none; border-top: none; border-bottom: 1px solid Black; border-right: 1px solid Black; }" >> $OUTPUT
* * * echo "tr.SectionAll td { border-left: none; border-top: none; border-bottom: 1px solid Black; border-right: 1px solid Black; }" >> $OUTPUT
* * * echo "tr.SectionBegin td { border-left: none; border-top: none; border-right: 1px solid Black; }" >> $OUTPUT
* * * echo "tr.SectionEnd td { border-left: none; border-top: none; border-bottom: 1px solid Black; border-right: 1px solid Black; }" >> $OUTPUT
* * * echo "tr.SectionMiddle td { border-left: none; border-top: none; border-right: 1px solid Black; }" >> $OUTPUT
* * * echo "tr.SubsectionAll td { border-left: none; border-top: none; border-bottom: 1px solid Gray; border-right: 1px solid Black; }" >> $OUTPUT
* * * echo "tr.SubsectionEnd td { border-left: none; border-top: none; border-bottom: 1px solid Gray; border-right: 1px solid Black; }" >> $OUTPUT
* * * echo "table.fc { border-top: 1px solid Black; border-left: 1px solid Black; width: 100%; font-family: monospace; font-size: 10pt; }" >> $OUTPUT
* * * echo "td.TextItemInsigAdd { color: #000000; background-color: #EFEFFF; }" >> $OUTPUT
* * * echo "td.TextItemInsigDel { color: #000000; background-color: #EFEFFF; text-decoration: line-through; }" >> $OUTPUT
* * * echo "td.TextItemInsigDiffMod { color: #000000; background-color: #EFEFFF; }" >> $OUTPUT
* * * echo "td.TextItemInsigLeftMod { color: #000000; background-color: #EFEFFF; }" >> $OUTPUT
* * * echo "td.TextItemInsigRightMod { color: #000000; background-color: #EFEFFF; }" >> $OUTPUT
* * * echo "td.TextItemNum { color: #827357; background-color: #F2F2F2; }" >> $OUTPUT
* * * echo "td.TextItemSame { color: #000000; background-color: #FFFFFF; }" >> $OUTPUT
* * * echo "td.TextItemSigAdd { color: #000000; background-color: #FFE3E3; }" >> $OUTPUT
* * * echo "td.TextItemSigDel { color: #000000; background-color: #FFE3E3; text-decoration: line-through; }" >> $OUTPUT
* * * echo "td.TextItemSigDiffMod { color: #000000; background-color: #FFE3E3; }" >> $OUTPUT
* * * echo "td.TextItemSigLeftMod { color: #000000; background-color: #FFE3E3; }" >> $OUTPUT
* * * echo "td.TextItemSigRightMod { color: #000000; background-color: #FFE3E3; }" >> $OUTPUT
* * * echo ".TextSegInsigDiff { color: #0000FF; }" >> $OUTPUT
* * * echo ".TextSegReplacedDiff { color: #0000FF; font-style: italic; }" >> $OUTPUT
* * * echo ".TextSegSigDiff { color: #FF0000; }" >> $OUTPUT
* * * echo ".TextSegElement_229_133_179_233_148_174_229_173_151 { font-weight: bold; }" >> $OUTPUT
* * * echo ".TextSegElement_230_160_135_232_175_134_231_172_166 { }" >> $OUTPUT
* * * echo ".TextSegElement_230_149_176_229_173_151 { color: #2E9269; }" >> $OUTPUT
* * * echo ".TextSegElement_230_179_168_233_135_138 { color: #786A41; }" >> $OUTPUT
* * * echo ".TextSegElement_232_191_144_231_174_151_231_172_166 { }" >> $OUTPUT
* * * echo "</style>" >> $OUTPUT
* * * echo "<title>文本比较</title>" >> $OUTPUT
* * * echo "</head>" >> $OUTPUT
* * * echo "</head>" >> $OUTPUT
* * * echo "<body>文本比较<br/>" >> $OUTPUT
* * * echo "<br/>" >> $OUTPUT
* * * date >> $OUTPUT
* * * echo "<br/>" >> $OUTPUT
* * * echo "<br/>模式:&nbsp; 差异, 有上下文 &nbsp;<br/>" >> $OUTPUT

* * * awk -F "\n" 'BEGIN {
* * * * * * * * * * * OUTPUT = "./output.tmp"; templine[6] = 0; step = 0; leftlines[2]; rightlines[2];
* * * * * * * * * * * samesection = 0; prevline = 0; thisline[2] = 0; prevlineonleft = 0; thislineonleft = 0;
* * * * * * * * * * * prev2lineisdiff = 0; prevlineisdiff = 0; thislineisdiff = 0; comparesymbol = 0; deblank[2] = 0;
* * * * * * * } {
* * * * * * * * * * * switch (step) {
* * * * * * * * * * * case 0:
* * * * * * * * * * * * * * * if ($1 ~ /^Index:.*/) {
* * * * * * * * * * * * * * * * * * * step = 1;
* * * * * * * * * * * * * * * }
* * * * * * * * * * * * * * * break;
* * * * * * * * * * * case 1:
* * * * * * * * * * * * * * * if ($1 ~ /^Cannot.*/) {
* * * * * * * * * * * * * * * * * * * step = 0;
* * * * * * * * * * * * * * * } else if ($1 ~ /^---.*/) {
* * * * * * * * * * * * * * * * * * * match($1, /^---(.*)/, templine);
* * * * * * * * * * * * * * * * * * * print "<br/>Left: " templine[1] > OUTPUT;
* * * * * * * * * * * * * * * } else if ($1 ~ /^+++.*/) {
* * * * * * * * * * * * * * * * * * * match($1, /^+++(.*)/, templine);
* * * * * * * * * * * * * * * * * * * print "<br/>Right: " templine[1] "<br/>" > OUTPUT;
* * * * * * * * * * * * * * * * * * * step = 2;

* * * * * * * * * * * * * * * * * * * prevline = 0;
* * * * * * * * * * * * * * * * * * * thisline[0] = 0;
* * * * * * * * * * * * * * * * * * * prev2lineisdiff = -1;
* * * * * * * * * * * * * * * * * * * prevlineisdiff = -1;
* * * * * * * * * * * * * * * * * * * thislineisdiff = -1;
* * * * * * * * * * * * * * * * * * * print "<table class=\"fc\" cellspacing=\"0\" cellpadding=\"0\">" > OUTPUT;
* * * * * * * * * * * * * * * }
* * * * * * * * * * * * * * * break;
* * * * * * * * * * * case 2:
* * * * * * * * * * * * * * * if ($1 ~ /^Index:.*/) {
* * * * * * * * * * * * * * * * * * * step = 1;
* * * * * * * * * * * * * * * * * * * print "<tr class=\"SectionEnd\">" > OUTPUT;
* * * * * * * * * * * * * * * }
* * * * * * * * * * * * * * * else {
* * * * * * * * * * * * * * * * * * * if ($1 ~ /^@@.*@@$/) {
* * * * * * * * * * * * * * * * * * * * * * * match($1, /@@ -(.*),(.*) +(.*),(.*) @@$/, templine);
* * * * * * * * * * * * * * * * * * * * * * * leftlines[0] = templine[1];
* * * * * * * * * * * * * * * * * * * * * * * leftlines[1] = templine[2];
* * * * * * * * * * * * * * * * * * * * * * * rightlines[0] = templine[3];
* * * * * * * * * * * * * * * * * * * * * * * rightlines[1] = templine[4];
* * * * * * * * * * * * * * * * * * * * * * * if (leftlines[0] == rightlines[0] && leftlines[1] == rightlines[1]) {
* * * * * * * * * * * * * * * * * * * * * * * * * * * samesection = 1;
* * * * * * * * * * * * * * * * * * * * * * * } else {
* * * * * * * * * * * * * * * * * * * * * * * * * * * samesection = 0;
* * * * * * * * * * * * * * * * * * * * * * * }
* * * * * * * * * * * * * * * * * * * * * * * if (prevline == 0) {
* * * * * * * * * * * * * * * * * * * * * * * * * * * break;
* * * * * * * * * * * * * * * * * * * * * * * } else {
* * * * * * * * * * * * * * * * * * * * * * * * * * * thisline[0] = 0;
* * * * * * * * * * * * * * * * * * * * * * * * * * * thisline[1] = 0;
* * * * * * * * * * * * * * * * * * * * * * * * * * * thislineisdiff = prevlineisdiff;
* * * * * * * * * * * * * * * * * * * * * * * }
* * * * * * * * * * * * * * * * * * * } else if ($1 ~ /^##.*##/) {
* * * * * * * * * * * * * * * * * * * * * * * step = 0;
* * * * * * * * * * * * * * * * * * * * * * * break;
* * * * * * * * * * * * * * * * * * * } else if ($1 ~ /^[-+].*/) {
* * * * * * * * * * * * * * * * * * * * * * * match($1, /^[-+](.*)/, thisline);
* * * * * * * * * * * * * * * * * * * * * * * thislineisdiff = 1;
* * * * * * * * * * * * * * * * * * * * * * * if ($1 ~ /^-.*/) {
* * * * * * * * * * * * * * * * * * * * * * * * * * * thislineonleft = 1;
* * * * * * * * * * * * * * * * * * * * * * * } else {
* * * * * * * * * * * * * * * * * * * * * * * * * * * thislineonleft = 0;
* * * * * * * * * * * * * * * * * * * * * * * }
* * * * * * * * * * * * * * * * * * * } else {
* * * * * * * * * * * * * * * * * * * * * * * match($1, /^\s(.*)/, thisline);
* * * * * * * * * * * * * * * * * * * * * * * thislineisdiff = 0;
* * * * * * * * * * * * * * * * * * * }

* * * * * * * * * * * * * * * * * * * if (prevline == 0) {
* * * * * * * * * * * * * * * * * * * * * * * prevline = thisline[1];
* * * * * * * * * * * * * * * * * * * * * * * prevlineisdiff = thislineisdiff;
* * * * * * * * * * * * * * * * * * * * * * * prevlineonleft = thislineonleft;
* * * * * * * * * * * * * * * * * * * * * * * break;
* * * * * * * * * * * * * * * * * * * } else if (prev2lineisdiff == -1) {
* * * * * * * * * * * * * * * * * * * * * * * print "<tr class=\"SectionBegin\">" > OUTPUT;
* * * * * * * * * * * * * * * * * * * * * * * if (prevlineisdiff) {
* * * * * * * * * * * * * * * * * * * * * * * * * * * comparesymbol = "-+";
* * * * * * * * * * * * * * * * * * * * * * * } else {
* * * * * * * * * * * * * * * * * * * * * * * * * * * comparesymbol = "=";
* * * * * * * * * * * * * * * * * * * * * * * }
* * * * * * * * * * * * * * * * * * * } else if (prev2lineisdiff != prevlineisdiff) {
* * * * * * * * * * * * * * * * * * * * * * * if (prevlineisdiff != thislineisdiff) {
* * * * * * * * * * * * * * * * * * * * * * * * * * * print "<tr class=\"SectionAll\">" > OUTPUT;
* * * * * * * * * * * * * * * * * * * * * * * * * * * comparesymbol = "&nbsp;";
* * * * * * * * * * * * * * * * * * * * * * * } else {
* * * * * * * * * * * * * * * * * * * * * * * * * * * print "<tr class=\"SectionBegin\">" > OUTPUT;
* * * * * * * * * * * * * * * * * * * * * * * * * * * if (prevlineisdiff) {
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * comparesymbol = "-+";
* * * * * * * * * * * * * * * * * * * * * * * * * * * } else {
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * comparesymbol = "=";
* * * * * * * * * * * * * * * * * * * * * * * * * * * }
* * * * * * * * * * * * * * * * * * * * * * * }
* * * * * * * * * * * * * * * * * * * } else {
* * * * * * * * * * * * * * * * * * * * * * * if (prevlineisdiff != thislineisdiff) {
* * * * * * * * * * * * * * * * * * * * * * * * * * * print "<tr class=\"SectionEnd\">" > OUTPUT;
* * * * * * * * * * * * * * * * * * * * * * * * * * * comparesymbol = "&nbsp;";
* * * * * * * * * * * * * * * * * * * * * * * } else {
* * * * * * * * * * * * * * * * * * * * * * * * * * * print "<tr class=\"SectionMiddle\">" > OUTPUT;
* * * * * * * * * * * * * * * * * * * * * * * * * * * comparesymbol = "&nbsp;";
* * * * * * * * * * * * * * * * * * * * * * * }
* * * * * * * * * * * * * * * * * * * }
* * * * * * * * * * * * * * * }

* * * * * * * * * * * * * * * deblank[0] = prevline;
* * * * * * * * * * * * * * * deblank[1] = prevline;
* * * * * * * * * * * * * * * prevline = "";
* * * * * * * * * * * * * * * while (deblank[1]~/^\t|^\s{4}/) {
* * * * * * * * * * * * * * * * * * * match(deblank[1], /^\t{1}(.*)|^\s{4}(.*)/, deblank);
* * * * * * * * * * * * * * * * * * * if (deblank[1] == "") {
* * * * * * * * * * * * * * * * * * * * * * * deblank[1] = deblank[2];
* * * * * * * * * * * * * * * * * * * }

* * * * * * * * * * * * * * * * * * * prevline = "&nbsp; " prevline;
* * * * * * * * * * * * * * * }
* * * * * * * * * * * * * * * prevline = prevline deblank[1];

* * * * * * * * * * * * * * * if (prevlineisdiff) {
* * * * * * * * * * * * * * * * * * * if (prevlineonleft) {
* * * * * * * * * * * * * * * * * * * * * * * print "<td class=\"TextItemNum AlignRight Wrap\">" leftlines[1] "</td>" > OUTPUT;
* * * * * * * * * * * * * * * * * * * * * * * leftlines[1]++;
* * * * * * * * * * * * * * * * * * * * * * * print "<td class=\"TextItemSigRightMod Wrap\"><span class=\"TextSegSigDiff\">" prevline "</span></td>" > OUTPUT;
* * * * * * * * * * * * * * * * * * * } else {
* * * * * * * * * * * * * * * * * * * * * * * print "<td class=\"TextItemNum AlignRight Wrap\">&nbsp;</td>" > OUTPUT;
* * * * * * * * * * * * * * * * * * * * * * * print "<td class=\"TextItemNum AlignRight Wrap\">&nbsp;</td>" > OUTPUT;
* * * * * * * * * * * * * * * * * * * }
* * * * * * * * * * * * * * * } else {
* * * * * * * * * * * * * * * * * * * print "<td class=\"TextItemNum AlignRight Wrap\">" leftlines[1] "</td>" > OUTPUT;
* * * * * * * * * * * * * * * * * * * leftlines[1]++;
* * * * * * * * * * * * * * * * * * * print "<td class=\"TextItemSame Wrap\">" prevline "</td>" > OUTPUT;
* * * * * * * * * * * * * * * }
* * * * * * * * * * * * * * * print "<td class=\"AlignCenter Wrap\">" comparesymbol "</td>" > OUTPUT
* * * * * * * * * * * * * * * if (prevlineisdiff) {
* * * * * * * * * * * * * * * * * * * if (prevlineonleft) {
* * * * * * * * * * * * * * * * * * * * * * * print "<td class=\"TextItemNum AlignRight Wrap\">&nbsp;</td>" > OUTPUT;
* * * * * * * * * * * * * * * * * * * * * * * print "<td class=\"TextItemNum AlignRight Wrap\">&nbsp;</td>" > OUTPUT;
* * * * * * * * * * * * * * * * * * * } else {
* * * * * * * * * * * * * * * * * * * * * * * print "<td class=\"TextItemNum AlignRight Wrap\">" rightlines[1] "</td>" > OUTPUT;
* * * * * * * * * * * * * * * * * * * * * * * rightlines[1]++;
* * * * * * * * * * * * * * * * * * * * * * * print "<td class=\"TextItemSigRightMod Wrap\"><span class=\"TextSegSigDiff\">" prevline "</span></td>" > OUTPUT;
* * * * * * * * * * * * * * * * * * * }
* * * * * * * * * * * * * * * } else {
* * * * * * * * * * * * * * * * * * * print "<td class=\"TextItemNum AlignRight Wrap\">" rightlines[1] "</td>" > OUTPUT;
* * * * * * * * * * * * * * * * * * * rightlines[1]++;
* * * * * * * * * * * * * * * * * * * print "<td class=\"TextItemSame Wrap\">" prevline "</td>" > OUTPUT;
* * * * * * * * * * * * * * * }
* * * * * * * * * * * * * * * print "</tr>" > OUTPUT;

* * * * * * * * * * * * * * * if (step == 2) {
* * * * * * * * * * * * * * * * * * * prevline = thisline[1];
* * * * * * * * * * * * * * * * * * * prev2lineisdiff = prevlineisdiff;
* * * * * * * * * * * * * * * * * * * prevlineisdiff = thislineisdiff;
* * * * * * * * * * * * * * * * * * * prevlineonleft = thislineonleft;
* * * * * * * * * * * * * * * } else {
* * * * * * * * * * * * * * * * * * * print "</table>" > OUTPUT;
* * * * * * * * * * * * * * * }
* * * * * * * * * * * * * * * break;
* * * * * * * * * * * default:
* * * * * * * * * * * * * * * break;
* * * * * * * * * * * }
* * * * * * * } END {
* * * * * * * * * * * print "<tr class=\"SectionEnd\">" > OUTPUT;
* * * * * * * * * * * deblank[0] = prevline;
* * * * * * * * * * * deblank[1] = prevline;
* * * * * * * * * * * prevline = "";
* * * * * * * * * * * while (deblank[1]~/^[\t| * * * ]/) {
* * * * * * * * * * * * * * * match(deblank[1], /^[\t| * * * ](.*)/, deblank);
* * * * * * * * * * * * * * * prevline = "&nbsp; " prevline;
* * * * * * * * * * * }
* * * * * * * * * * * prevline = prevline deblank[1];

* * * * * * * * * * * print "<td class=\"TextItemNum AlignRight Wrap\"> "leftlines[1] "</td>" > OUTPUT;
* * * * * * * * * * * leftlines[1]++;
* * * * * * * * * * * if (prevlineisdiff) {
* * * * * * * * * * * * * * * if (prevlineonleft) {
* * * * * * * * * * * * * * * * * * * print "<td class=\"TextItemSigRightMod Wrap\"><span class=\"TextSegSigDiff\">" prevline "</span></td>" > OUTPUT;
* * * * * * * * * * * * * * * } else {
* * * * * * * * * * * * * * * * * * * print "<td class=\"TextItemNum AlignRight Wrap\">&nbsp;</td>" > OUTPUT;
* * * * * * * * * * * * * * * }
* * * * * * * * * * * } else {
* * * * * * * * * * * * * * * print "<td class=\"TextItemSame Wrap\">" prevline "</td>" > OUTPUT;
* * * * * * * * * * * }
* * * * * * * * * * * print "<td class=\"AlignCenter Wrap\">" comparesymbol "</td>" > OUTPUT
* * * * * * * * * * * print "<td class=\"TextItemNum AlignRight Wrap\">" rightlines[1] "</td>" > OUTPUT;
* * * * * * * * * * * rightlines[1]++;
* * * * * * * * * * * if (prevlineisdiff) {
* * * * * * * * * * * * * * * if (prevlineonleft) {
* * * * * * * * * * * * * * * * * * * print "<td class=\"TextItemNum AlignRight Wrap\">&nbsp;</td>" > OUTPUT;
* * * * * * * * * * * * * * * } else {
* * * * * * * * * * * * * * * * * * * print "<td class=\"TextItemSigRightMod Wrap\"><span class=\"TextSegSigDiff\">" prevline "</span></td>" > OUTPUT;
* * * * * * * * * * * * * * * }
* * * * * * * * * * * } else {
* * * * * * * * * * * * * * * print "<td class=\"TextItemSame Wrap\">" prevline "</td>" > OUTPUT;
* * * * * * * * * * * }
* * * * * * * * * * * print "</tr>" > OUTPUT;
* * * * * * * * * * * print "</table>" > OUTPUT;
* * * * * * * * * * * print "</body>" > OUTPUT;
* * * * * * * * * * * print "</html>" > OUTPUT;
* * * * * * * * * * * print "complete!"
* * * * * * * }' ./svn.tmp.conv

* * * cat ./output.tmp >> $OUTPUT
}

case $1 in
* * * revert)
* * * * * * * echo "./svn.sh revert: revert commit history"
* * * * * * * echo "================================"
* * * * * * * NEED_LOCAL_DIR=1;
* * * * * * * get_param;
* * * * * * * revert;
* * * * * * * ;;
* * * count)
* * * * * * * echo "./svn.sh count: count commit code"
* * * * * * * echo "================================"
* * * * * * * NEED_LOCAL_DIR=0;
* * * * * * * get_param;
* * * * * * * count;
* * * * * * * ;;
* * * report)
* * * * * * * echo "./svn.sh report: output diff report"
* * * * * * * echo "================================"
* * * * * * * NEED_LOCAL_DIR=0;
* * * * * * * get_param;
* * * * * * * report;
* * * * * * * ;;
* * * *)
* * * * * * * echo "usage: ./svn.sh [action]"
* * * * * * * echo "[action] - revert / count / report ..."
* * * * * * * echo "revert: revert commit history by [begin, end] range or bugid / author"
* * * * * * * echo "count: count commit lines and times by [begin, end] range or bugid / author"
* * * * * * * echo "report: diff commit and make report by bugid"
* * * * * * * echo "================================"
* * * * * * * exit 1
* * * * * * * ;;
esac

猜你喜欢

转载自www.cnblogs.com/Five100Miles/p/8858378.html
123