关于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仓库的目录。
改进后的脚本如下:

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
97
98
# file name: local_ver_build.sh
# copyleft by Late Lee 2013~2014 

#!/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版本号 
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仓库

1
2
3
4
5
6
7
./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仓库

1
2
3
4
5
6
7
./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日凌晨