将subversion存储库编号转换为代码

时间:2008-08-19 14:19:06

标签: svn debugging testing revision versions

我想实现一种在代码中记录项目版本的方法,以便在测试时使用它并帮助跟踪错误。 似乎使用的最佳版本号只是Subversion的当前版本号。有没有一种简单的方法可以将这个数字挂钩到(我的情况下是C ++)头文件或其他什么东西,然后我可以在代码中找到它?我想这是一个帖子提交钩子还是什么?

有没有人有实现这个的经验(请分享代码,请?),或者可以提出更好的选择? 感谢。

6 个答案:

答案 0 :(得分:27)

两种方式:

在代码中嵌入 $ Id $ $ Revision $ 。然后在文件上设置 svn:keywords =“Id Revision”属性。这将为您提供该源文件的最后修改版本。适用于较小的项目和脚本。

或者,使用Makefile驱动的进程和命令行工具svnversion。 (特定于语言 - 这适用于C / C ++)

echo -n "#define VERSION 1.0.1-" > version.h
svnversion -n . >> version.h

或者一些更复杂的构建脚本,包含sed和version.h.in。然后只需 #include version.h

这将为您提供存储库版本号,该版本号将随每次提交/更新而更改,并且对于大多数项目而言可能是更合适的版本号。

注意:我还使用了手动更新的人类可读版本字符串。该示例将给出:版本:1.0.1-r13445

〜Ĵ

答案 1 :(得分:14)

虽然漂亮,但版本关键字技巧只会在该版本中更改文件时更新文件 - 如果您不更改文件,则它将继续反映旧版本。

如果您希望软件始终反映整体修订版号,那么您将需要深入研究relevant SVN entries file并提取它,这并不太难(这是一个XML文件)。

Wikipedia在their version page上执行此操作,以指示正在运行的软件的修订版; the code is here - 查找 getSvnRevision()方法。

答案 2 :(得分:13)

您也可以使用SubWCRev,它是TortoiseSVN的一部分。

SubWCRev是Windows控制台程序,可用于读取Subversion工作副本的状态,并可选择在模板文件中执行关键字替换。这通常用作构建过程的一部分,作为将工作副本信息合并到正在构建的对象中的一种方法。通常,它可能用于在“关于”框中包含修订号。

http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-subwcrev.html

答案 3 :(得分:6)

在Makefile中,添加:

SVNDEV := -D'SVN_REV="$(shell svnversion -n .)"'
CFLAGS := $(SVNDEV) ...

然后您可以在代码中的任何位置使用宏SVN_REV,例如:

printf ("Version: SVN %s\n", SVN_REV);

答案 4 :(得分:4)

您可以使用svn:keywords属性启用Rev关键字。

然后您可以在代码中使用$Rev$,SVN会在更新到$Rev: 256 $后自动展开,然后可以解析......

More info on the Subversion manual

答案 5 :(得分:0)

一个很好的最新解决方案:

创建包含以下行的Makefile(与YourFile.dox位于同一文件夹中):

sed "s~RevNumber~$(shell svnversion ../)~g" YourFile.dox > YourFileDummy.dox; doxygen YourFileDummy.dox

YourFile.dox应包含此内容:

...
PROJECT_NUMBER         = "Revision RevNumber"
...

现在:

  1. sed将.dox中的RevNumber替换为svnversion的输出(在您的存储库的主文件夹中执行),并将修改后的文件保存到YourFileDummy.dox
  2. doxygenYourFileDummy.dox上执行以生成文档
  3. 您的文档现在将包含修订号!