在项目工作中经常需要审核代码,如此则需要从众多的提交者中筛选出指定的几个提交者,然后查看修改了哪些代码。但是svn log工具的搜索功能并没有提供或(eric或neil的提交)的功能。倒是提供了与(neil提交的并且log含有UI)的功能
--search ARG : use ARG as search pattern (glob syntax, case- and accent-insensitive, may require quotation marks to prevent shell expansion)
--search-and ARG : combine ARG with the previous search pattern
我自己利用shell扩展出一个svn功能。它本身是一个svn.sh文件。如下这种方式调用(两种方式的差异是管道符号|的转义)
./svn.sh log -r{2020-1-1}:{2020-1-3} --search neil\|eric
./svn.sh log -r{2020-1-1}:{2020-1-3} --search "neil|eric"
实现的诀窍是最大量使用原来的svn log参数。而在--search参数上做文章。如果是搜索一个提交者,用svn的--search就可以;如果搜索的提交者不止一位,则不使用--search功能而由awk工具完成筛选。源代码如下:
# 全部参数是$@
# 找到查找的字符串
search=`echo $@|grep -o '\-\-search \+\([^ ]*\)'|grep -o '[^ ]*$'`
#echo $search
# 拆分成数组
array=(${search//|/ })
if [ ${#array[@]} -gt 1 ]
then
# 参数不止一个。先不筛选log,然后在log中多次匹配
# search先擦除掉
param=`echo $@|sed 's/--search \+[^ \t]*//g'`
# 再由awk来筛选
`echo "svn $param"` | awk 'BEGIN{valid=0;split("'"$search"'",names,"|");}{if(match($1,"^r[0-9]+")!=0){one=0;for(i in names){if(match($0,names[i])!=0){one=1;}}valid=one} if(valid!=0)print $0}'
else
# 只有一个search参数就用原来的方式
`echo 'svn '`$@
fi
执行的效果如图
ps:如果使用的是cygwin需要先执行
export LANG=zh_CN.GBK
设置好编码,否则windows是乱码