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

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

之前写了篇文章介绍使用脚本生成SVN、GIT版本号的《SVN、GIT生成版本号》,获取SVN版本号的方法有些不恰当,在不同版本的SVN上会出现问题。这里再对此进行完善。
之前的脚本是通过下面的命令获取当前的SVN的提交版本号:
LOCALVER=`svn info | cat -n | awk ‘{if($1==5)print $3}’`
示例可以参考前面写的文章,意思是获取第5行第3列的数字,这个数字就是提交代码的SVN号。关键的问题是,不同版本的SVN是不是都是第5行是版本号?非也。不同版本是不同的。所以上面的命令就有局限性。我尝试搜索相关资料,但没找到好的方法。于是只好继续沿用上面的方法。但多了对不同的SVN版本作判断。
下面给出结合了SVN、GIT两种版本号生成脚本。脚本中会判断是否存在.git或.svn目录,如果都存在,则将两个版本号写到一起,如只存在其中一个,则生成对应的版本号。
# 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
生成的文件内容如下:
#ifndef PROJECT_VERSION_H
#define PROJECT_VERSION_H
#define VERSION_NUMBER “Git: r1 7b09fe3 , SVN: v19 built: 2013-09-11 12:03:24″
#endif

迟,于2013年9月11日中午小憩前

2014.05.20补充:
原来的脚本关于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”,而不是其它的字符。
对此造成的误解十分抱歉。

本文固定链接: http://www.latelee.org/using-gnu-linux/generate-svn-git-version-ii.html

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

目前暂无评论

发表评论

*

快捷键:Ctrl+Enter