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

之前写了篇文章介绍使用脚本生成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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# 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
5
6
#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”,而不是其它的字符。
对此造成的误解十分抱歉。