关于svn、git生成版本号脚本的再次改进 | 迟思堂工作室
A-A+

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

2014-09-20 00:13 GNU/Linux系统 暂无评论 阅读 33,570 次

自从很久之前写了《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日凌晨



如果本文对阁下有帮助,不妨赞助笔者以输出更多好文章,谢谢!
donate




给我留言