svn再封装
一、 由来
做小项目时不太注意,但是在做平台时,当几个文件修改且目录跨度很大,但是又有一堆文件不用上传,此时,上传文件,需要在一堆文件中选出修改的文件就比较麻烦了,以下是两个命令的使用对比:
原命令:svn st | grep “^M”| awk ‘{print $2}’ | svn ci –m “修改bug”
封装命令:bsvnfile M | svnci –m “修改bug”
使用原命令有一个缺陷,当文件名有空格时,必须手动选择。因此,为了解决频繁的敲写命令和避免一些特殊麻烦,封装命令bsvnst和bsvnfile。
欲知后续使用情况,请看下文。
二、 使用方法
1、 命令说明
有两个命令,bsvnst和 bsvnfile。Bsvnst用于查看文件状态,如修改、删除、未增加等svn文件状态。Bsvnfile用于只显示文件,且文件用单引号包着(主要用于避免文件名有空格时的麻烦),方便用于文件上传。使用方法如下(命令用command代替):
Command [status] [directory]
Status状态有M ? A D AD ADM ! ?M M! ?M!
M 已修改
? 未上传
A 未提交但已svn add
D 未提交但已svn delete
AD 未提交,但已add和delete
ADM 已修改、add、delete,未提交
! 本地删除了的已上传的文件
?M 未add及修改了的文件
M! 本地修改、删除了的文件
?M! 未add、修改、删除了的文件
directory是相对目录。
命令可以没有参数。当没有参数时,bsvnst不会过滤任何文件,当有参数时,针对Android工程,已过滤out和.ccache目录。脚本中,除了几个关键点,其余都比较简单,可以根据自己需求,修改过滤的文件和增删需要的状态。
三、 环境配置
第一次按照以下目录配置好后,重新登录,就可以使用命令了。以后不用再配置和重新登录。
1、 在工作目录“~”下创建.bin文件夹,tool_svn.sh放入.bin目录
2、 在linux环境工作目录下修改.bashrc文件
3、 在文件末尾增加如下内容
4、配置完成,重新登录
四、 使用示例
查看有哪些可使用status
查看当前目录文件状态
查看指定目录文件状态
查看看指定状态的文件
上传指定状态的文件
五、源代码
ALL_CHOICE=(M \? A D AD ADM \! \?M M\! \?\! \?M\!)
function __checkparam() {
for t in ${ALL_CHOICE[*]}
do
if [ x"$1" == x$t ];then
return 0
fi
done
return 1
}
function __per_dir_do() {
local func=$1
local target=$2
shift 2
local dirs=$@
if [ $# -eq 0 ];then
dirs=./
fi
for dir in $dirs
do
i=0
len=`echo $target | wc -L`
while [ $i -lt $len ]
do
t=${target:$i:1}
$func $t $dir
let i++
done
echo
done
}
function __bsvnst() {
local files=$2
if [ $files == \. ];then
files=`ls -l | grep -v "^d" | cut -c 54-`
if [ -z "$files" ];then
return
fi
fi
case $1 in
M)
svn st $files | grep "^M";;
A)
svn st $files | grep "^A";;
D)
svn st $files | grep "^D";;
\?)
svn st --no-ignore $files | grep "^[I?]" | grep -vE "(\<out\>|\.ccache\>)";;
!)
svn st $files | grep "^!";;
*)
echo \"$1\": param error!!!
esac
}
function bsvnst() {
if [ $# -eq 0 ] || [ -d $1 ];then
svn st --no-ignore $1
return 0
fi
__checkparam $1
if [ $? -ne 0 ];then
echo -e "\e[33Usage: bsvnst [M|\?|A|D|AD|ADM|\!|\?M|M\!|\?\!|\?M\!] [directory]\e[0m"
return 0
fi
__per_dir_do '__bsvnst' $@ | sed -e '/^$/d'
}
function bsvnfile() {
bsvnst $@ | sed -e "s/^[^ \t][ \t]*/\'/g;s/$/\'/g"
}
function bsvnmerge() {
if [ $# -lt 2 ];then
echo error:params is not enough
echo Usage:bsvnmeger latest:old dir
return 1
fi
if [[ ! $1 =~ ":" ]];then
echo error:param \"$1\" is not right
return 1
fi
if [ ! -e $2 ];then
echo error:Not exist file or dirctory \"$2\"
return 1
fi
local version=$1
local files=$2
shift
echo "svn diff -r $version $files | grep "^Index:" | awk '{print \$2}' | xargs -n 1 svn merge -r $version"
svn diff -r $version $files | grep "^Index:" | awk '{print $2}' | xargs -n 1 svn merge -r $version
}
function _list_all_choice() {
COMPREPLY=()
local cur="${COMP_WORDS[COMP_CWORD]}"
COMPREPLY=( $(compgen -W "${ALL_CHOICE[*]}" -- ${cur}) )
}
complete -F _list_all_choice bsvnst
complete -F _list_all_choice bsvnfile