当前位置: 首页 > GNU/Linux系统 > 正文

关于svn、git生成版本号脚本的再次改进

自从很久之前写了《SVN、GIT生成版本号》和《关于svn、git生成版本号脚本的改进》两篇文章后,自以为不会再修改了,结果却不如人意,里面的的脚本还是有bug,现在又要进行再次的修改。这个bug隐藏的比较深,而且要在一定场合下才出现。——其实最主要还是git和svn的判断方法有问题。
在低版本的svn(比如1.6),受控工程的所有目录下都会有.svn目录。而在高版本的svn中(比如1.8),只有顶层目录有一个.svn目录,其它子目录就没有了。假如要在子目录下生成版本号的话,就不能像之前那样判断.svn目录是否存在作为依据了。所以说,这是一个bug。
知道原因,就很好改了,把原来判断.svn目录的语句去掉if [ -d .svn ] 的判断,改成判断是哪一个版本的svn。之前的脚本已经使用VER16等来判断是哪一版本了,同时根据它来得到 SVNLOCALVER的值,因此,现在只需要知道SVNLOCALVER是否为空就知道当前目录是否有SVN仓库——而不是用它是在仓库的顶层目录还是其它的子目录。
同时,git也是类似处理。把if [ -d .git ]去掉,使用TESTGIT=`git rev-list HEAD`来判断当前目录是否是GIT仓库的目录。

改进后的脚本如下:

# file name: local_ver_build.sh# copyleft by Late Lee 2013~2014

#!/bin/shif [ $# != 2 ]

then

INC_DIR=.

FILENAME=version.h

else

INC_DIR=$1

FILENAME=$2

fi

VER_FILE=$INC_DIR/$FILENAME

GEN_DATE=`date +”built: %Y-%m-%d %k:%M:%S”`

# 读取Git版本号

TESTGIT=`git rev-list HEAD`

if [ “$TESTGIT” != “” ]

then

GITLOCALVER=`git rev-list HEAD | wc -l | awk ‘{print $1}’`

echo “Git Local version:” $GITLOCALVER

GIT_VER=r$GITLOCALVER

GIT_VER=“Git: $GIT_VER $(git rev-list HEAD -n 1 | cut -c 1-7)”

GIT_VERSION=$GIT_VER

VB_HASGITVER=1

else

echo “There is no Git version control.”

VB_HASGITVER=0

fi

#读取SVN版本号

# 根据不同的SVN版本得到仓库版本号

VER16=`svn –version | grep “1\.6″`

VER17=`svn –version | grep “1\.7″`

VER18=`svn –version | grep “1\.8″`

if [ “$VER16″ != “” ] ; then

SVNLOCALVER=`svn info | cat -n | awk ‘{if($1==5)print $3}’`

echo “1.6 version”

fi

if [ “$VER17″ != “” ] ; then

SVNLOCALVER=`svn info | cat -n | awk ‘{if($1==6)print $3}’`

echo “1.7 version”

fi

if [ “$VER18″ != “” ] ; then

SVNLOCALVER=`svn info | cat -n | awk ‘{if($1==7)print $3}’`

echo “1.8 version”

fi

if [ “$SVNLOCALVER” != “” ]

then

echo “SVN Local Version:” $SVNLOCALVER

SVN_VER=$SVNLOCALVER

SVN_VER=“SVN: v$SVN_VER”

SVN_VERSION=$SVN_VER

VB_HASSVNVER=1

echo “ALL SVN Version:” $SVN_VERSION

else

echo “There is no SVN version control.”

VB_HASSVNVER=0

fi

#生成版本信息文件

if [ $VB_HASGITVER = 0 ] && [ $VB_HASSVNVER = 0 ]

then

echo “There isn’t any version control.”

else

echo “Generated:” $VER_FILE

echo “#ifndef PROJECT_VERSION_H” > $VER_FILE

echo “#define PROJECT_VERSION_H” >> $VER_FILE

echo “” >> $VER_FILE

if [ $VB_HASGITVER = 1 ] && [ $VB_HASSVNVER = 0 ]

then

echo “Git version add.”

echo “#define VERSION_NUMBER \”$GIT_VERSION $GEN_DATE\“” >> $VER_FILE

fi

if [ $VB_HASGITVER = 0 ] && [ $VB_HASSVNVER = 1 ]

then

echo “SVN version add.”

echo “#define VERSION_NUMBER \”$SVN_VERSION $GEN_DATE\“” >> $VER_FILE

fi

if [ $VB_HASGITVER = 1 ] && [ $VB_HASSVNVER = 1 ]

then

echo “Git&SVN version both add.”

echo “#define VERSION_NUMBER \”$GIT_VERSION , $SVN_VERSION $GEN_DATE\“” >> $VER_FILE

fi

echo “” >> $VER_FILE

echo “#endif” >> $VER_FILE

fi

测试情况如下:
1、只有git仓库,没有svn仓库
./local_ver_build.sh
Git Local version: 32
svn: E155007: ‘/home/latelee/serial_test’ is not a working copy
1.8 version
There is no SVN version control.
Generated: ./version.h
Git version add.

2、同时存在git仓库和svn仓库
./local_ver_build.sh
Git Local version: 32
1.8 version
SVN Local Version: 229
ALL SVN Version: SVN: v229
Generated: ./version.h
Git&SVN version both add.

李迟,记于2014年9月20日凌晨

本文固定链接: http://www.latelee.org/using-gnu-linux/httpwww-latelee-orgusing-gnu-linuxgenerate-svn-git-version-iii-html.html

如无特别说明,迟思堂工作室文章均为原创,转载请注明: 关于svn、git生成版本号脚本的再次改进 | 迟思堂工作室

目前暂无评论

发表评论

*

快捷键:Ctrl+Enter