您的位置:首页 > 运维架构 > Linux

svn再封装

2017-01-14 19:01 225 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  svn linux