之前写了篇文章介绍使用脚本生成SVN、GIT版本号的SVN、GIT生成版本号,获取SVN版本号的方法有些不恰当,在不同版本的SVN上会出现问题。这里再对此进行完善。
之前的脚本是通过下面的命令获取当前的SVN的提交版本号:
1 |
LOCALVER=`svn info | cat -n | awk '{if($1==5)print $3}'` |
示例可以参考前面写的文章,意思是获取第5行第3列的数字,这个数字就是提交代码的SVN号。关键的问题是,不同版本的SVN是不是都是第5行是版本号?非也。不同版本是不同的。所以上面的命令就有局限性。我尝试搜索相关资料,但没找到好的方法。于是只好继续沿用上面的方法。但多了对不同的SVN版本作判断。
下面给出结合了SVN、GIT两种版本号生成脚本。脚本中会判断是否存在.git或.svn目录,如果都存在,则将两个版本号写到一起,如只存在其中一个,则生成对应的版本号。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
# file name: local_ver_build.sh #!/bin/sh if [ $# != 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版本号 if [ -d .git ] 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版本号 if [ -d .svn ] then # 根据不同的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 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 2 3 4 |
#ifndef PROJECT_VERSION_H #define PROJECT_VERSION_H #define VERSION_NUMBER “Git: r1 7b09fe3 , SVN: v19 built: 2013-09-11 12:03:24″ #endif |
补充:
原来的脚本关于SVN版本号有一个小小的bug。现在已经修改文章了。
原来是VER16=svn –version | grep 1.6
,“1.6”会匹配“数字1+任意字符+数字6”,比如它会匹配“1.6”、“126”。如果svn –version输出的信息中不包含“1.6”,但包含了“126”,则VER16是不为空的,脚本会认为是svn的1.6版本。这是不正确的。这是由于同事安装了1.6版本的SVN,但build版本恰好有“128”字符导致上述脚本判断出错而发现的(这种情况下,脚本认为是1.8版本的SVN)。
改为VER16=svn –version | grep “1\.6″
就能精确地匹配“1.6”,而不是其它的字符。
对此造成的误解十分抱歉。
发表评论
要发表评论,您必须先登录。