mirror of
https://github.com/mangosfour/server.git
synced 2025-12-13 13:37:05 +00:00
Implement git support in gensvnrevision tool and related changes in code.
gvnrevision still support svn version generation and have addition options now (see sources). gensvnrevision/svn_revision.h and other svn reference will fixed later. Now version strings include commit date/time that can be used in git case for fast find git commit without using git hash most time. In chat ".server info" output git hash can be copied by shift-click in chat and then copied to cliboard if need.
This commit is contained in:
parent
a0ab11bb17
commit
0874856e34
6 changed files with 248 additions and 52 deletions
|
|
@ -18,63 +18,249 @@
|
|||
|
||||
#include <fstream>
|
||||
#include <sstream>
|
||||
#include <time.h>
|
||||
|
||||
#pragma warning(disable:4996)
|
||||
|
||||
int main(int argc, char **argv)
|
||||
struct RawData
|
||||
{
|
||||
std::string path;
|
||||
char rev_str[200];
|
||||
char date_str[200];
|
||||
char time_str[200];
|
||||
};
|
||||
|
||||
if(argc >= 1 && argv[1] )
|
||||
void extractDataFromSvn(FILE* EntriesFile, bool url, RawData& data)
|
||||
{
|
||||
char buf[200];
|
||||
|
||||
char repo_str[200];
|
||||
char num_str[200];
|
||||
|
||||
fgets(buf,200,EntriesFile);
|
||||
fgets(buf,200,EntriesFile);
|
||||
fgets(buf,200,EntriesFile);
|
||||
fgets(buf,200,EntriesFile); sscanf(buf,"%s",num_str);
|
||||
fgets(buf,200,EntriesFile); sscanf(buf,"%s",repo_str);
|
||||
fgets(buf,200,EntriesFile);
|
||||
fgets(buf,200,EntriesFile);
|
||||
fgets(buf,200,EntriesFile);
|
||||
fgets(buf,200,EntriesFile);
|
||||
fgets(buf,200,EntriesFile); sscanf(buf,"%10sT%8s",data.date_str,data.time_str);
|
||||
|
||||
if(url)
|
||||
sprintf(data.rev_str,"%s at %s",num_str,repo_str);
|
||||
else
|
||||
strcpy(data.rev_str,num_str);
|
||||
}
|
||||
|
||||
void extractDataFromGit(FILE* EntriesFile, std::string path, bool url, RawData& data)
|
||||
{
|
||||
char buf[200];
|
||||
fgets(buf,200,EntriesFile);
|
||||
|
||||
char hash_str[200];
|
||||
char branch_str[200];
|
||||
char url_str[200];
|
||||
sscanf(buf,"%s branch %s of %s",hash_str,branch_str,url_str);
|
||||
|
||||
if(url)
|
||||
{
|
||||
path = argv[1];
|
||||
if(path.size() > 0 && (path[path.size()-1]!='/' || path[path.size()-1]!='\\'))
|
||||
path += '/';
|
||||
char* host_str = NULL;
|
||||
char* acc_str = NULL;
|
||||
char* repo_str = NULL;
|
||||
|
||||
// parse URL like git@github.com:mangos/mangos
|
||||
char url_buf[200];
|
||||
int res = sscanf(url_str,"git@%s",url_buf);
|
||||
if(res)
|
||||
{
|
||||
host_str = strtok(url_buf,":");
|
||||
acc_str = strtok(NULL,"/");
|
||||
repo_str = strtok(NULL," ");
|
||||
}
|
||||
else
|
||||
{
|
||||
int res = sscanf(url_str,"git://%s",url_buf);
|
||||
if(res)
|
||||
{
|
||||
host_str = strtok(url_buf,"/");
|
||||
acc_str = strtok(NULL,"/");
|
||||
repo_str = strtok(NULL,".");
|
||||
}
|
||||
}
|
||||
|
||||
// can generate nice link
|
||||
if(res)
|
||||
sprintf(data.rev_str,"http://%s/%s/%s/commit/%s",host_str,acc_str,repo_str,hash_str);
|
||||
// unknonw URL format, use as-is
|
||||
else
|
||||
sprintf(data.rev_str,"%s at %s",hash_str,url_str);
|
||||
}
|
||||
else
|
||||
strcpy(data.rev_str,hash_str);
|
||||
|
||||
FILE* EntriesFile = fopen((path+".svn/entries").c_str(), "r");
|
||||
if(!EntriesFile)
|
||||
EntriesFile = fopen((path+"_svn/entries").c_str(), "r");
|
||||
|
||||
std::ostringstream newData;
|
||||
|
||||
if(!EntriesFile)
|
||||
time_t rev_time = 0;
|
||||
// extracting date/time
|
||||
FILE* LogFile = fopen((path+".git/logs/HEAD").c_str(), "r");
|
||||
if(LogFile)
|
||||
{
|
||||
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;
|
||||
while(fgets(buf,200,LogFile))
|
||||
{
|
||||
char buf2[200];
|
||||
char new_hash[200];
|
||||
int unix_time = 0;
|
||||
int res2 = sscanf(buf,"%s %s %s %s %i",buf2,new_hash,buf2,buf2,&unix_time,buf2);
|
||||
if(res2!=5)
|
||||
continue;
|
||||
|
||||
if(strcmp(hash_str,new_hash))
|
||||
continue;
|
||||
|
||||
rev_time = unix_time;
|
||||
break;
|
||||
}
|
||||
|
||||
fclose(LogFile);
|
||||
|
||||
if(rev_time)
|
||||
{
|
||||
tm* aTm = localtime(&rev_time);
|
||||
// YYYY year
|
||||
// MM month (2 digits 01-12)
|
||||
// DD day (2 digits 01-31)
|
||||
// HH hour (2 digits 00-23)
|
||||
// MM minutes (2 digits 00-59)
|
||||
// SS seconds (2 digits 00-59)
|
||||
sprintf(data.date_str,"%04d-%02d-%02d",aTm->tm_year+1900,aTm->tm_mon+1,aTm->tm_mday);
|
||||
sprintf(data.time_str,"%02d:%02d:%02d",aTm->tm_hour,aTm->tm_min,aTm->tm_sec);
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(data.date_str,"Unknown");
|
||||
strcpy(data.time_str,"Unknown");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
char buf[200];
|
||||
int revision;
|
||||
char date_str[200];
|
||||
char time_str[200];
|
||||
strcpy(data.date_str,"Unknown");
|
||||
strcpy(data.time_str,"Unknown");
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
bool extractDataFromSvn(std::string filename, bool url, RawData& data)
|
||||
{
|
||||
FILE* EntriesFile = fopen(filename.c_str(), "r");
|
||||
if(!EntriesFile)
|
||||
return false;
|
||||
|
||||
newData << "#ifndef __SVN_REVISION_H__" << std::endl;
|
||||
newData << "#define __SVN_REVISION_H__" << std::endl;
|
||||
newData << " #define SVN_REVISION \"" << revision << "\"" << 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;
|
||||
extractDataFromSvn(EntriesFile,url,data);
|
||||
fclose(EntriesFile);
|
||||
return true;
|
||||
}
|
||||
|
||||
fclose(EntriesFile);
|
||||
bool extractDataFromGit(std::string filename, std::string path, bool url, RawData& data)
|
||||
{
|
||||
FILE* EntriesFile = fopen(filename.c_str(), "r");
|
||||
if(!EntriesFile)
|
||||
return false;
|
||||
|
||||
extractDataFromGit(EntriesFile,path,url,data);
|
||||
fclose(EntriesFile);
|
||||
return true;
|
||||
}
|
||||
|
||||
std::string generateHeader(char const* rev_str, char const* date_str, char const* time_str)
|
||||
{
|
||||
std::ostringstream newData;
|
||||
newData << "#ifndef __SVN_REVISION_H__" << std::endl;
|
||||
newData << "#define __SVN_REVISION_H__" << std::endl;
|
||||
newData << " #define SVN_REVISION \"" << rev_str << "\"" << 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;
|
||||
return newData.str();
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
bool use_url = false;
|
||||
bool svn_prefered = false;
|
||||
std::string path;
|
||||
|
||||
// Call: tool {options} [path]
|
||||
// -g use git prefered (default)
|
||||
// -s use svn prefered
|
||||
// -r use only revision (without repo URL) (default)
|
||||
// -u include repositire URL as commit URL or "rev at URL"
|
||||
for(int k = 1; k <= argc; ++k)
|
||||
{
|
||||
if(!argv[k] || !*argv[k])
|
||||
break;
|
||||
|
||||
if(argv[k][0]!='-')
|
||||
{
|
||||
path = argv[k];
|
||||
if(path.size() > 0 && (path[path.size()-1]!='/' || path[path.size()-1]!='\\'))
|
||||
path += '/';
|
||||
break;
|
||||
}
|
||||
|
||||
switch(argv[k][1])
|
||||
{
|
||||
case 'g':
|
||||
svn_prefered = false;
|
||||
continue;
|
||||
case 'r':
|
||||
use_url = false;
|
||||
continue;
|
||||
case 's':
|
||||
svn_prefered = true;
|
||||
continue;
|
||||
case 'u':
|
||||
use_url = true;
|
||||
continue;
|
||||
default:
|
||||
printf("Unknown option %s",argv[k]);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
/// new data extraction
|
||||
std::string newData;
|
||||
|
||||
{
|
||||
RawData data;
|
||||
|
||||
bool res = false;
|
||||
|
||||
if(svn_prefered)
|
||||
{
|
||||
/// SVN data
|
||||
res = extractDataFromSvn(path+".svn/entries",use_url,data);
|
||||
if (!res)
|
||||
res = extractDataFromSvn(path+"_svn/entries",use_url,data);
|
||||
// GIT data
|
||||
if (!res)
|
||||
res = extractDataFromGit(path+".git/FETCH_HEAD",path,use_url,data);
|
||||
}
|
||||
else
|
||||
{
|
||||
// GIT data
|
||||
res = extractDataFromGit(path+".git/FETCH_HEAD",path,use_url,data);
|
||||
/// SVN data
|
||||
if (!res)
|
||||
res = extractDataFromSvn(path+".svn/entries",use_url,data);
|
||||
if (!res)
|
||||
res = extractDataFromSvn(path+"_svn/entries",use_url,data);
|
||||
}
|
||||
|
||||
if(res)
|
||||
newData = generateHeader(data.rev_str,data.date_str,data.time_str);
|
||||
else
|
||||
newData = generateHeader("Unknown", "Unknown", "Unknown");
|
||||
}
|
||||
|
||||
/// get existed header data for compare
|
||||
std::string oldData;
|
||||
|
||||
if(FILE* HeaderFile = fopen("svn_revision.h","rb"))
|
||||
|
|
@ -90,11 +276,12 @@ int main(int argc, char **argv)
|
|||
fclose(HeaderFile);
|
||||
}
|
||||
|
||||
if(newData.str() != oldData)
|
||||
/// update header only if different data
|
||||
if(newData != oldData)
|
||||
{
|
||||
if(FILE* OutputFile = fopen("svn_revision.h","wb"))
|
||||
{
|
||||
fprintf(OutputFile,"%s",newData.str().c_str());
|
||||
fprintf(OutputFile,"%s",newData.c_str());
|
||||
fclose(OutputFile);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue