/* * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include <fstream> #include <sstream> #pragma warning(disable:4996) int main(int argc, char **argv) { std::string path; if(argc >= 1 && argv[1] ) { path = argv[1]; if(path.size() > 0 && (path[path.size()-1]!='/' || path[path.size()-1]!='//')) path += '/'; } FILE* EntriesFile = fopen((path+".svn/entries").c_str(), "r"); if(!EntriesFile) EntriesFile = fopen((path+"_svn/entries").c_str(), "r"); std::ostringstream newData; if(!EntriesFile) { newData << "#ifndef __SVN_REVISION_H__" << std::endl; newData << "#define __SVN_REVISION_H__" << std::endl; newData << " #define SVN_REVISION /"Unknown/"" << std::endl; newData << " #define SVN_DATE /"Unknown/"" << std::endl; newData << " #define SVN_TIME /"Unknown/""<< std::endl; newData << "#endif // __SVN_REVISION_H__" << std::endl; } else { char buf[200]; int revision; char date_str[200]; char time_str[200]; fgets(buf,200,EntriesFile); fgets(buf,200,EntriesFile); fgets(buf,200,EntriesFile); fscanf(EntriesFile,"%i",&revision); fgets(buf,200,EntriesFile); fgets(buf,200,EntriesFile); fgets(buf,200,EntriesFile); fgets(buf,200,EntriesFile); fgets(buf,200,EntriesFile); fscanf(EntriesFile,"%10sT%8s",date_str,time_str); newData << "#ifndef __SVN_REVISION_H__" << std::endl; newData << "#define __SVN_REVISION_H__" << std::endl; newData << " #define SVN_REVISION /"" << revision << "/"" << std::endl; newData << " #define SVN_REVISIONSTR /"" << revision/1000 << "." << revision%1000/100 << "." << revision%100/10 << "." << revision%10 << "/"" << std::endl; newData << " #define SVN_FILESTR " << revision/1000 << "," << revision%1000/100 << "," << revision%100/10 << "," << revision%10 << std::endl; newData << " #define SVN_DATE /"" << date_str << "/"" << std::endl; newData << " #define SVN_TIME /"" << time_str << "/""<< std::endl; newData << "#endif // __SVN_REVISION_H__" << std::endl; fclose(EntriesFile); } std::string oldData; if(FILE* HeaderFile = fopen((path+"svn_revision.h").c_str(),"rb")) { while(!feof(HeaderFile)) { int c = fgetc(HeaderFile); if(c < 0) break; oldData += (char)c; } fclose(HeaderFile); } if(newData.str() != oldData) { if(FILE* OutputFile = fopen((path+"svn_revision.h").c_str(),"wb")) { fprintf(OutputFile,"%s",newData.str().c_str()); fclose(OutputFile); } } return 0; }
在vc的precompile步骤里面调用gensvnrevision,生成svn_revision.h, 如:
#ifndef __SVN_REVISION_H__ #define __SVN_REVISION_H__ #define SVN_REVISION "1707" #define SVN_REVISIONSTR "1.7.0.7" #define SVN_FILESTR 1,7,0,7 #define SVN_DATE "2010-02-02" #define SVN_TIME "01:36:29" #endif // __SVN_REVISION_H__
在 project.rc2里面添加include "svn_revision.h", 在版本里面用SVN_REVISIONSTR和SVN_FILESTR替换ProductVersion、FileVersion和 FILEVERSION 、PRODUCTVERSION 。
搞定!使用tsvn的童鞋们可以用第一种方法,要方便很 多!;-)