From c77da8061677d6b6d224fa4c2ab0bb6fd4982e66 Mon Sep 17 00:00:00 2001 From: stfx Date: Tue, 1 Sep 2015 19:04:56 +0200 Subject: [PATCH] Use git_id for sql updates only This tool hinders workflow and is only useful for database updates. git_id will now silently exit except if new sql updates are found in which case it does the usual git_id sql magic. Notes for devs: * You need to rebuild git_id.exe * Keep in mind that as before you need to push to remote between commits with sql updates as the last version is checked using the git remote * There is no longer any version check between script library (ScriptDev2) and core Advantages: * Reduce amount of change conflicts * Able to merge PRs using github UI * Less of a hassle when working in git with rebases, branches, etc. * Make backporting easier and more fun --- contrib/git_id/git_id.cpp | 526 +++++++++------------------ src/game/Level0.cpp | 5 +- src/game/ScriptMgr.cpp | 9 - src/mangosd/Main.cpp | 5 +- src/realmd/Main.cpp | 5 +- src/shared/CMakeLists.txt | 1 - src/shared/SystemConfig.h.in | 6 +- src/shared/WheatyExceptionReport.cpp | 3 +- src/shared/revision_nr.h | 4 - win/VC100/shared.vcxproj | 1 - win/VC100/shared.vcxproj.filters | 1 - win/VC110/shared.vcxproj | 1 - win/VC110/shared.vcxproj.filters | 1 - win/VC120/shared.vcxproj | 1 - win/VC120/shared.vcxproj.filters | 1 - 15 files changed, 188 insertions(+), 382 deletions(-) delete mode 100644 src/shared/revision_nr.h diff --git a/contrib/git_id/git_id.cpp b/contrib/git_id/git_id.cpp index 4d6f61ccff4..7343dda6c55 100644 --- a/contrib/git_id/git_id.cpp +++ b/contrib/git_id/git_id.cpp @@ -53,53 +53,59 @@ #define NUM_REMOTES 2 #define NUM_DATABASES 3 -char remotes[NUM_REMOTES][MAX_REMOTE] = { +char remotes[NUM_REMOTES][MAX_REMOTE] = +{ "git@github.com:cmangos/mangos-wotlk.git", "git://github.com/cmangos/mangos-wotlk.git" // used for fetch if present }; char remote_branch[MAX_REMOTE] = "master"; -char rev_nr_file[MAX_PATH] = "src/shared/revision_nr.h"; char rev_sql_file[MAX_PATH] = "src/shared/revision_sql.h"; char sql_update_dir[MAX_PATH] = "sql/updates"; char new_index_file[MAX_PATH] = ".git/git_id_index"; -char databases[NUM_DATABASES][MAX_DB] = { +char databases[NUM_DATABASES][MAX_DB] = +{ "characters", "mangos", "realmd" }; -char db_version_table[NUM_DATABASES][MAX_DB] = { +char db_version_table[NUM_DATABASES][MAX_DB] = +{ "character_db_version", "db_version", "realmd_db_version", }; -char db_sql_file[NUM_DATABASES][MAX_PATH] = { +char db_sql_file[NUM_DATABASES][MAX_PATH] = +{ "sql/characters.sql", "sql/mangos.sql", "sql/realmd.sql" }; -char db_sql_rev_field[NUM_DATABASES][MAX_PATH] = { +char db_sql_rev_field[NUM_DATABASES][MAX_PATH] = +{ "REVISION_DB_CHARACTERS", "REVISION_DB_MANGOS", "REVISION_DB_REALMD" }; +#define REV_PREFIX "" +#define REV_SCAN REV_PREFIX "%d" +#define REV_PRINT REV_PREFIX "%04d" +#define REV_FORMAT "[" REV_PRINT "]" + bool allow_replace = false; -bool local = false; bool do_fetch = false; -bool do_sql = false; bool use_new_index = true; -bool generate_makefile = false; // not need for cmake build systems // aux char origins[NUM_REMOTES][MAX_REMOTE]; int rev; -int last_sql_rev[NUM_DATABASES] = {0,0,0}; -int last_sql_nr[NUM_DATABASES] = {0,0,0}; +int last_sql_rev[NUM_DATABASES] = {0, 0, 0}; +int last_sql_nr[NUM_DATABASES] = {0, 0, 0}; char head_message[MAX_MSG]; char path_prefix[MAX_PATH] = ""; @@ -113,18 +119,17 @@ char new_index_cmd[MAX_CMD]; std::set new_sql_updates; -FILE *cmd_pipe; +FILE* cmd_pipe; bool find_path() { - printf("+ finding path\n"); - char *ptr; + char* ptr; char cur_path[MAX_PATH]; getcwd(cur_path, MAX_PATH); size_t len = strlen(cur_path); - strncpy(base_path, cur_path, len+1); + strncpy(base_path, cur_path, len + 1); - if(cur_path[len-1] == '/' || cur_path[len-1] == '\\') + if (cur_path[len - 1] == '/' || cur_path[len - 1] == '\\') { // we're in root, don't bother return false; @@ -132,15 +137,15 @@ bool find_path() // don't count the root int count_fwd = 0, count_back = 0; - for(ptr = cur_path-1; ptr = strchr(ptr+1, '/'); count_fwd++); - for(ptr = cur_path-1; ptr = strchr(ptr+1, '\\'); count_back++); + for (ptr = cur_path - 1; ptr = strchr(ptr + 1, '/'); count_fwd++); + for (ptr = cur_path - 1; ptr = strchr(ptr + 1, '\\'); count_back++); int count = std::max(count_fwd, count_back); char path[MAX_PATH]; - for(int i = 0; i < count; i++) + for (int i = 0; i < count; i++) { snprintf(path, MAX_PATH, "%s.git", path_prefix); - if(0 == chdir(path)) + if (0 == chdir(path)) { chdir(cur_path); return true; @@ -148,11 +153,11 @@ bool find_path() strncat(path_prefix, "../", MAX_PATH); ptr = strrchr(base_path, '\\'); - if(ptr) *ptr = '\0'; + if (ptr) *ptr = '\0'; else { ptr = strrchr(base_path, '/'); - if(ptr) *ptr = '\0'; + if (ptr) *ptr = '\0'; } } @@ -161,18 +166,17 @@ bool find_path() bool find_origin() { - printf("+ finding origin\n"); - if( (cmd_pipe = popen( "git remote -v", "r" )) == NULL ) + if ((cmd_pipe = popen("git remote -v", "r")) == NULL) return false; bool ret = false; - while(fgets(buffer, MAX_BUF, cmd_pipe)) + while (fgets(buffer, MAX_BUF, cmd_pipe)) { char name[256], remote[MAX_REMOTE]; sscanf(buffer, "%s %s", name, remote); - for(int i = 0; i < NUM_REMOTES; i++) + for (int i = 0; i < NUM_REMOTES; i++) { - if(strcmp(remote, remotes[i]) == 0) + if (strcmp(remote, remotes[i]) == 0) { strncpy(origins[i], name, MAX_REMOTE); ret = true; @@ -185,7 +189,6 @@ bool find_origin() bool fetch_origin() { - printf("+ fetching origin\n"); // use the public clone url if present because the private may require a password snprintf(cmd, MAX_CMD, "git fetch %s %s", (origins[1][0] ? origins[1] : origins[0]), remote_branch); int ret = system(cmd); @@ -194,23 +197,22 @@ bool fetch_origin() bool check_fwd() { - printf("+ checking fast forward\n"); snprintf(cmd, MAX_CMD, "git log -n 1 --pretty=\"format:%%H\" %s/%s", (origins[1][0] ? origins[1] : origins[0]), remote_branch); - if( (cmd_pipe = popen( cmd, "r" )) == NULL ) + if ((cmd_pipe = popen(cmd, "r")) == NULL) return false; - if(!fgets(buffer, MAX_BUF, cmd_pipe)) return false; + if (!fgets(buffer, MAX_BUF, cmd_pipe)) return false; strncpy(origin_hash, buffer, MAX_HASH); pclose(cmd_pipe); - if( (cmd_pipe = popen( "git log --pretty=\"format:%H\"", "r" )) == NULL ) + if ((cmd_pipe = popen("git log --pretty=\"format:%H\"", "r")) == NULL) return false; bool found = false; - while(fgets(buffer, MAX_BUF, cmd_pipe)) + while (fgets(buffer, MAX_BUF, cmd_pipe)) { buffer[strlen(buffer) - 1] = '\0'; - if(strncmp(origin_hash, buffer, MAX_BUF) == 0) + if (strncmp(origin_hash, buffer, MAX_BUF) == 0) { found = true; break; @@ -218,124 +220,86 @@ bool check_fwd() } pclose(cmd_pipe); - if(!found) + if (!found) { // with fetch you still get the latest rev, you just rebase afterwards and push // without it you may not get the right rev - if(do_fetch) printf("WARNING: non-fastforward, use rebase!\n"); - else { printf("ERROR: non-fastforward, use rebase!\n"); return false; } + if (do_fetch) printf("WARNING: non-fastforward, use rebase\n"); + else { printf("ERROR: non-fastforward, use rebase\n"); return false; } } return true; } -int get_rev(const char *from_msg) +int get_rev(const char* from_msg) { // accept only the rev number format, not the sql update format char nr_str[256]; - if(sscanf(from_msg, "[%[0123456789]]", nr_str) != 1) return 0; - if(from_msg[strlen(nr_str)+1] != ']') return 0; + if (sscanf(from_msg, "[" REV_PREFIX "%[0123456789]]", nr_str) != 1) return 0; + if (from_msg[strlen(nr_str) + strlen(REV_PREFIX) + 2 - 1] != ']') return 0; + return atoi(nr_str); } bool find_rev() { - printf("+ finding next revision number\n"); // find the highest rev number on either of the remotes - for(int i = 0; i < NUM_REMOTES; i++) + for (int i = 0; i < NUM_REMOTES; i++) { - if(!local && !origins[i][0]) continue; + if (!origins[i][0]) continue; - if(local) snprintf(cmd, MAX_CMD, "git log HEAD --pretty=\"format:%%s\""); - else sprintf(cmd, "git log %s/%s --pretty=\"format:%%s\"", origins[i], remote_branch); - if( (cmd_pipe = popen( cmd, "r" )) == NULL ) + sprintf(cmd, "git log %s/%s --pretty=\"format:%%s\"", origins[i], remote_branch); + if ((cmd_pipe = popen(cmd, "r")) == NULL) continue; int nr; - while(fgets(buffer, MAX_BUF, cmd_pipe)) + while (fgets(buffer, MAX_BUF, cmd_pipe)) { nr = get_rev(buffer); - if(nr >= rev) - rev = nr+1; + if (nr >= rev) + rev = nr + 1; } pclose(cmd_pipe); } - if(rev > 0) printf("Found [%d].\n", rev); - return rev > 0; } -std::string generateNrHeader(char const* rev_str) -{ - std::ostringstream newData; - newData << "#ifndef __REVISION_NR_H__" << std::endl; - newData << "#define __REVISION_NR_H__" << std::endl; - newData << " #define REVISION_NR \"" << rev_str << "\"" << std::endl; - newData << "#endif // __REVISION_NR_H__" << std::endl; - return newData.str(); -} - std::string generateSqlHeader() { std::ostringstream newData; newData << "#ifndef __REVISION_SQL_H__" << std::endl; newData << "#define __REVISION_SQL_H__" << std::endl; - for(int i = 0; i < NUM_DATABASES; ++i) + for (int i = 0; i < NUM_DATABASES; ++i) + { newData << " #define " << db_sql_rev_field[i] << " \"required_" << last_sql_update[i] << "\"" << std::endl; + } newData << "#endif // __REVISION_SQL_H__" << std::endl; return newData.str(); } -void system_switch_index(const char *cmd) +void system_switch_index(const char* cmd) { // do the command for the original index and then for the new index // both need to be updated with the changes before commit // but the new index will contains only the desired changes // while the old may contain others system(cmd); - if(!use_new_index) return; - if(putenv(new_index_cmd) != 0) return; + if (!use_new_index) return; + if (putenv(new_index_cmd) != 0) return; system(cmd); - if(putenv(old_index_cmd) != 0) return; -} - -bool write_rev_nr() -{ - printf("+ writing revision_nr.h\n"); - char rev_str[256]; - sprintf(rev_str, "%d", rev); - std::string header = generateNrHeader(rev_str); - - char prefixed_file[MAX_PATH]; - snprintf(prefixed_file, MAX_PATH, "%s%s", path_prefix, rev_nr_file); - - if(FILE* OutputFile = fopen(prefixed_file, "wb")) - { - fprintf(OutputFile,"%s", header.c_str()); - fclose(OutputFile); - - // add the file to both indices, to be committed later - snprintf(cmd, MAX_CMD, "git add %s", prefixed_file); - system_switch_index(cmd); - - return true; - } - - return false; + if (putenv(old_index_cmd) != 0) return; } bool write_rev_sql() { - if(new_sql_updates.empty()) return true; - printf("+ writing revision_sql.h\n"); std::string header = generateSqlHeader(); char prefixed_file[MAX_PATH]; snprintf(prefixed_file, MAX_PATH, "%s%s", path_prefix, rev_sql_file); - if(FILE* OutputFile = fopen(prefixed_file, "wb")) + if (FILE* OutputFile = fopen(prefixed_file, "wb")) { - fprintf(OutputFile,"%s", header.c_str()); + fprintf(OutputFile, "%s", header.c_str()); fclose(OutputFile); // add the file to both indices, to be committed later @@ -350,29 +314,28 @@ bool write_rev_sql() bool find_head_msg() { - printf("+ finding last message on HEAD\n"); - if( (cmd_pipe = popen( "git log -n 1 --pretty=\"format:%s%n%n%b\"", "r" )) == NULL ) + if ((cmd_pipe = popen("git log -n 1 --pretty=\"format:%s%n%n%b\"", "r")) == NULL) return false; int poz = 0; - while(poz < 16384-1 && EOF != (head_message[poz++] = fgetc(cmd_pipe))); - head_message[poz-1] = '\0'; + while (poz < 16384 - 1 && EOF != (head_message[poz++] = fgetc(cmd_pipe))); + head_message[poz - 1] = '\0'; pclose(cmd_pipe); - if(int head_rev = get_rev(head_message)) + if (int head_rev = get_rev(head_message)) { - if(!allow_replace) + if (!allow_replace) { - printf("Last commit on HEAD is [%d]. Use -r to replace it with [%d].\n", head_rev, rev); + printf("Last sql version found is " REV_FORMAT ". Use -r to replace it with " REV_FORMAT ".\n", head_rev, rev); return false; } // skip the rev number in the commit - char *p = strchr(head_message, ']'), *q = head_message; - assert(p && *(p+1)); - p+=2; - while(*p) *q = *p, p++, q++; + char* p = strchr(head_message, ']'), *q = head_message; + assert(p && *(p + 1)); + p += 2; + while (*p) *q = *p, p++, q++; *q = 0; return true; } @@ -382,17 +345,15 @@ bool find_head_msg() bool amend_commit() { - printf("+ amending last commit\n"); - // commit the contents of the (new) index - if(use_new_index && putenv(new_index_cmd) != 0) return false; + if (use_new_index && putenv(new_index_cmd) != 0) return false; snprintf(cmd, MAX_CMD, "git commit --amend -F-"); - if( (cmd_pipe = popen( cmd, "w" )) == NULL ) + if ((cmd_pipe = popen(cmd, "w")) == NULL) return false; - fprintf(cmd_pipe, "[%d] %s", rev, head_message); + fprintf(cmd_pipe, REV_FORMAT " %s", rev, head_message); pclose(cmd_pipe); - if(use_new_index && putenv(old_index_cmd) != 0) return false; + if (use_new_index && putenv(old_index_cmd) != 0) return false; return true; } @@ -407,51 +368,49 @@ struct sql_update_info bool has_table; }; -bool get_sql_update_info(const char *buffer, sql_update_info &info) +bool get_sql_update_info(const char* buffer, sql_update_info& info) { info.table[0] = '\0'; int dummy[3]; - if(sscanf(buffer, "%d_%d_%d", &dummy[0], &dummy[1], &dummy[2]) == 3) + if (sscanf(buffer, REV_SCAN "_%d_%d", &dummy[0], &dummy[1], &dummy[2]) == 3) return false; - if(sscanf(buffer, "%d_%d_%[^_]_%[^.].sql", &info.rev, &info.nr, info.db, info.table) != 4 && - sscanf(buffer, "%d_%d_%[^.].sql", &info.rev, &info.nr, info.db) != 3) + if (sscanf(buffer, REV_SCAN "_%d_%[^_]_%[^.].sql", &info.rev, &info.nr, info.db, info.table) != 4 && + sscanf(buffer, REV_SCAN "_%d_%[^.].sql", &info.rev, &info.nr, info.db) != 3) { - info.rev = 0; // this may be set by the first scans, even if they fail - if(sscanf(buffer, "%d_%[^_]_%[^.].sql", &info.nr, info.db, info.table) != 3 && - sscanf(buffer, "%d_%[^.].sql", &info.nr, info.db) != 2) + if (sscanf(buffer, REV_SCAN "_%[^_]_%[^.].sql", &info.nr, info.db, info.table) != 3 && + sscanf(buffer, REV_SCAN "_%[^.].sql", &info.nr, info.db) != 2) return false; } - for(info.db_idx = 0; info.db_idx < NUM_DATABASES; info.db_idx++) - if(strncmp(info.db, databases[info.db_idx], MAX_DB) == 0) break; + for (info.db_idx = 0; info.db_idx < NUM_DATABASES; info.db_idx++) + if (strncmp(info.db, databases[info.db_idx], MAX_DB) == 0) break; info.has_table = (info.table[0] != '\0'); return true; } bool find_sql_updates() { - printf("+ finding new sql updates on HEAD\n"); // add all updates from HEAD snprintf(cmd, MAX_CMD, "git show HEAD:%s", sql_update_dir); - if( (cmd_pipe = popen( cmd, "r" )) == NULL ) + if ((cmd_pipe = popen(cmd, "r")) == NULL) return false; // skip first two lines - if(!fgets(buffer, MAX_BUF, cmd_pipe)) { pclose(cmd_pipe); return false; } - if(!fgets(buffer, MAX_BUF, cmd_pipe)) { pclose(cmd_pipe); return false; } + if (!fgets(buffer, MAX_BUF, cmd_pipe)) { pclose(cmd_pipe); return false; } + if (!fgets(buffer, MAX_BUF, cmd_pipe)) { pclose(cmd_pipe); return false; } sql_update_info info; - while(fgets(buffer, MAX_BUF, cmd_pipe)) + while (fgets(buffer, MAX_BUF, cmd_pipe)) { buffer[strlen(buffer) - 1] = '\0'; - if(!get_sql_update_info(buffer, info)) continue; + if (!get_sql_update_info(buffer, info)) continue; - if(info.db_idx == NUM_DATABASES) + if (info.db_idx == NUM_DATABASES) { - if(info.rev > 0) printf("WARNING: incorrect database name for sql update %s\n", buffer); - continue; + if (info.rev > 0) printf("WARNING: incorrect database name for sql update %s\n", buffer); + continue; } new_sql_updates.insert(buffer); @@ -469,25 +428,25 @@ bool find_sql_updates() // remove updates from the last commit also found on origin snprintf(cmd, MAX_CMD, "git show %s:%s", origin_hash, sql_update_dir); - if( (cmd_pipe = popen( cmd, "r" )) == NULL ) + if ((cmd_pipe = popen(cmd, "r")) == NULL) return false; // skip first two lines - if(!fgets(buffer, MAX_BUF, cmd_pipe)) { pclose(cmd_pipe); return false; } - if(!fgets(buffer, MAX_BUF, cmd_pipe)) { pclose(cmd_pipe); return false; } + if (!fgets(buffer, MAX_BUF, cmd_pipe)) { pclose(cmd_pipe); return false; } + if (!fgets(buffer, MAX_BUF, cmd_pipe)) { pclose(cmd_pipe); return false; } - while(fgets(buffer, MAX_BUF, cmd_pipe)) + while (fgets(buffer, MAX_BUF, cmd_pipe)) { buffer[strlen(buffer) - 1] = '\0'; - if(!get_sql_update_info(buffer, info)) continue; + if (!get_sql_update_info(buffer, info)) continue; // find the old update with the highest rev for each database // (will be the required version for the new update) std::set::iterator itr = new_sql_updates.find(buffer); - if(itr != new_sql_updates.end() ) + if (itr != new_sql_updates.end()) { - if(info.rev > 0 && (info.rev > last_sql_rev[info.db_idx] || - (info.rev == last_sql_rev[info.db_idx] && info.nr > last_sql_nr[info.db_idx]))) + if (info.rev > 0 && (info.rev > last_sql_rev[info.db_idx] || + (info.rev == last_sql_rev[info.db_idx] && info.nr > last_sql_nr[info.db_idx]))) { last_sql_rev[info.db_idx] = info.rev; last_sql_nr[info.db_idx] = info.nr; @@ -499,25 +458,23 @@ bool find_sql_updates() pclose(cmd_pipe); - if(!new_sql_updates.empty()) + if (!new_sql_updates.empty()) { - for(std::set::iterator itr = new_sql_updates.begin(); itr != new_sql_updates.end(); ++itr) + for (std::set::iterator itr = new_sql_updates.begin(); itr != new_sql_updates.end(); ++itr) printf("%s\n", itr->c_str()); } - else - printf("WARNING: no new sql updates found.\n"); return true; } -bool copy_file(const char *src_file, const char *dst_file) +bool copy_file(const char* src_file, const char* dst_file) { - FILE * fin = fopen( src_file, "rb" ); - if(!fin) return false; - FILE * fout = fopen( dst_file, "wb" ); - if(!fout) { fclose(fin); return false; } + FILE* fin = fopen(src_file, "rb"); + if (!fin) return false; + FILE* fout = fopen(dst_file, "wb"); + if (!fout) { fclose(fin); return false; } - for(char c = getc(fin); !feof(fin); putc(c, fout), c = getc(fin)); + for (char c = getc(fin); !feof(fin); putc(c, fout), c = getc(fin)); fclose(fin); fclose(fout); @@ -526,25 +483,21 @@ bool copy_file(const char *src_file, const char *dst_file) bool convert_sql_updates() { - if(new_sql_updates.empty()) return true; - - printf("+ converting sql updates\n"); - // rename the sql update files and add the required update statement - for(std::set::iterator itr = new_sql_updates.begin(); itr != new_sql_updates.end(); ++itr) + for (std::set::iterator itr = new_sql_updates.begin(); itr != new_sql_updates.end(); ++itr) { sql_update_info info; - if(!get_sql_update_info(itr->c_str(), info)) return false; - if(info.db_idx == NUM_DATABASES) return false; + if (!get_sql_update_info(itr->c_str(), info)) return false; + if (info.db_idx == NUM_DATABASES) return false; // generating the new name should work for updates with or without a rev char src_file[MAX_PATH], new_name[MAX_PATH], dst_file[MAX_PATH]; snprintf(src_file, MAX_PATH, "%s%s/%s", path_prefix, sql_update_dir, itr->c_str()); - snprintf(new_name, MAX_PATH, "%d_%0*d_%s%s%s", rev, 2, info.nr, info.db, info.has_table ? "_" : "", info.table); + snprintf(new_name, MAX_PATH, REV_PRINT "_%0*d_%s%s%s", rev, 2, info.nr, info.db, info.has_table ? "_" : "", info.table); snprintf(dst_file, MAX_PATH, "%s%s/%s.sql", path_prefix, sql_update_dir, new_name); - FILE * fin = fopen( src_file, "r" ); - if(!fin) return false; + FILE* fin = fopen(src_file, "r"); + if (!fin) return false; std::ostringstream out_buff; @@ -555,12 +508,12 @@ bool convert_sql_updates() // skip the first one or two lines from the input // if it already contains update requirements - if(fgets(buffer, MAX_BUF, fin)) + if (fgets(buffer, MAX_BUF, fin)) { char dummy[MAX_BUF]; - if(sscanf(buffer, "ALTER TABLE %s CHANGE COLUMN required_%s required_%s bit", dummy, dummy, dummy) == 3) + if (sscanf(buffer, "ALTER TABLE %s CHANGE COLUMN required_%s required_%s bit", dummy, dummy, dummy) == 3) { - if(fgets(buffer, MAX_BUF, fin) && buffer[0] != '\n') + if (fgets(buffer, MAX_BUF, fin) && buffer[0] != '\n') out_buff << buffer; } else @@ -568,15 +521,15 @@ bool convert_sql_updates() } // copy the rest of the file - while(fgets(buffer, MAX_BUF, fin)) + while (fgets(buffer, MAX_BUF, fin)) out_buff << buffer; fclose(fin); - FILE * fout = fopen( dst_file, "w" ); - if(!fout) { fclose(fin); return false; } + FILE* fout = fopen(dst_file, "w"); + if (!fout) { fclose(fin); return false; } - fprintf(fout, "%s",out_buff.str().c_str()); + fprintf(fout, "%s", out_buff.str().c_str()); fclose(fout); @@ -585,7 +538,7 @@ bool convert_sql_updates() system_switch_index(cmd); // delete src file if it different by name from dst file - if(strncmp(src_file,dst_file,MAX_PATH)) + if (strncmp(src_file, dst_file, MAX_PATH)) { snprintf(cmd, MAX_CMD, "git rm --quiet %s", src_file); system_switch_index(cmd); @@ -598,115 +551,13 @@ bool convert_sql_updates() return true; } -bool generate_sql_makefile() -{ - if(new_sql_updates.empty()) return true; - - // find all files in the update dir - snprintf(cmd, MAX_CMD, "git show HEAD:%s", sql_update_dir); - if( (cmd_pipe = popen( cmd, "r" )) == NULL ) - return false; - - // skip first two lines - if(!fgets(buffer, MAX_BUF, cmd_pipe)) { pclose(cmd_pipe); return false; } - if(!fgets(buffer, MAX_BUF, cmd_pipe)) { pclose(cmd_pipe); return false; } - - char newname[MAX_PATH]; - std::set file_list; - sql_update_info info; - - while(fgets(buffer, MAX_BUF, cmd_pipe)) - { - buffer[strlen(buffer) - 1] = '\0'; - if(buffer[strlen(buffer) - 1] != '/' && - strncmp(buffer, "Makefile.am", MAX_BUF) != 0) - { - if(new_sql_updates.find(buffer) != new_sql_updates.end()) - { - if(!get_sql_update_info(buffer, info)) return false; - snprintf(newname, MAX_PATH, "%d_%0*d_%s%s%s.sql", rev, 2, info.nr, info.db, info.has_table ? "_" : "", info.table); - file_list.insert(newname); - } - else - file_list.insert(buffer); - } - } - - pclose(cmd_pipe); - - // write the makefile - char file_name[MAX_PATH]; - snprintf(file_name, MAX_PATH, "%s%s/Makefile.am", path_prefix, sql_update_dir); - FILE *fout = fopen(file_name, "w"); - if(!fout) { pclose(cmd_pipe); return false; } - - fprintf(fout, - "# This file is part of the CMaNGOS Project. See AUTHORS file for Copyright information\n" - "#\n" - "# This program is free software; you can redistribute it and/or modify\n" - "# it under the terms of the GNU General Public License as published by\n" - "# the Free Software Foundation; either version 2 of the License, or\n" - "# (at your option) any later version.\n" - "#\n" - "# This program is distributed in the hope that it will be useful,\n" - "# but WITHOUT ANY WARRANTY; without even the implied warranty of\n" - "# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" - "# GNU General Public License for more details.\n" - "#\n" - "# You should have received a copy of the GNU General Public License\n" - "# along with this program; if not, write to the Free Software\n" - "# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n" - "\n" - "## Process this file with automake to produce Makefile.in\n" - "\n" - "## Sub-directories to parse\n" - "\n" - "## Change installation location\n" - "# datadir = mangos/%s\n" - "pkgdatadir = $(datadir)/mangos/%s\n" - "\n" - "## Files to be installed\n" - "# Install basic SQL files to datadir\n" - "pkgdata_DATA = \\\n", - sql_update_dir, sql_update_dir - ); - - for(std::set::iterator itr = file_list.begin(), next; itr != file_list.end(); ++itr) - { - next = itr; ++next; - fprintf(fout, "\t%s%s\n", itr->c_str(), next == file_list.end() ? "" : " \\"); - } - - fprintf(fout, - "\n## Additional files to include when running 'make dist'\n" - "# SQL update files, to upgrade database schema from older revisions\n" - "EXTRA_DIST = \\\n" - ); - - for(std::set::iterator itr = file_list.begin(), next; itr != file_list.end(); ++itr) - { - next = itr; ++next; - fprintf(fout, "\t%s%s\n", itr->c_str(), next == file_list.end() ? "" : " \\"); - } - - fclose(fout); - - snprintf(cmd, MAX_CMD, "git add %s%s/Makefile.am", path_prefix, sql_update_dir); - system_switch_index(cmd); - - return true; -} - bool change_sql_database() { - if(new_sql_updates.empty()) return true; - printf("+ changing database sql files\n"); - // rename the database files, copy their contents back // and change the required update line - for(int i = 0; i < NUM_DATABASES; i++) + for (int i = 0; i < NUM_DATABASES; i++) { - if(last_sql_update[i][0] == '\0') continue; + if (last_sql_update[i][0] == '\0') continue; char old_file[MAX_PATH], tmp_file[MAX_PATH], dummy[MAX_BUF]; @@ -715,28 +566,29 @@ bool change_sql_database() rename(old_file, tmp_file); - FILE *fin = fopen( tmp_file, "r" ); - if(!fin) return false; - FILE *fout = fopen( old_file, "w" ); - if(!fout) return false; + FILE* fin = fopen(tmp_file, "r"); + if (!fin) return false; + FILE* fout = fopen(old_file, "w"); + if (!fout) return false; snprintf(dummy, MAX_CMD, "CREATE TABLE `%s` (\n", db_version_table[i]); - while(fgets(buffer, MAX_BUF, fin)) + while (fgets(buffer, MAX_BUF, fin)) { fputs(buffer, fout); - if(strncmp(buffer, dummy, MAX_BUF) == 0) + if (strncmp(buffer, dummy, MAX_BUF) == 0) break; } - while(1) + while (1) { - if(!fgets(buffer, MAX_BUF, fin)) return false; - if(sscanf(buffer, " `required_%s`", dummy) == 1) break; + if (!fgets(buffer, MAX_BUF, fin)) return false; + if (sscanf(buffer, " `required_%s`", dummy) == 1) break; fputs(buffer, fout); } fprintf(fout, " `required_%s` bit(1) DEFAULT NULL\n", last_sql_update[i]); - while(fgets(buffer, MAX_BUF, fin)) + + while (fgets(buffer, MAX_BUF, fin)) fputs(buffer, fout); fclose(fin); @@ -752,26 +604,26 @@ bool change_sql_database() bool change_sql_history() { snprintf(cmd, MAX_CMD, "git log HEAD --pretty=\"format:%%H\""); - if( (cmd_pipe = popen( cmd, "r" )) == NULL ) + if ((cmd_pipe = popen(cmd, "r")) == NULL) return false; std::list hashes; - while(fgets(buffer, MAX_BUF, cmd_pipe)) + while (fgets(buffer, MAX_BUF, cmd_pipe)) { buffer[strlen(buffer) - 1] = '\0'; - if(strncmp(origin_hash, buffer, MAX_HASH) == 0) + if (strncmp(origin_hash, buffer, MAX_HASH) == 0) break; hashes.push_back(buffer); } pclose(cmd_pipe); - if(hashes.empty()) return false; // must have at least one commit - if(hashes.size() < 2) return true; // only one commit, ok but nothing to do + if (hashes.empty()) return false; // must have at least one commit + if (hashes.size() < 2) return true; // only one commit, ok but nothing to do snprintf(cmd, MAX_CMD, "git reset --hard %s", origin_hash); system(cmd); - for(std::list::reverse_iterator next = hashes.rbegin(), itr = next++; next != hashes.rend(); ++itr, ++next) + for (std::list::reverse_iterator next = hashes.rbegin(), itr = next++; next != hashes.rend(); ++itr, ++next) { // stage the changes from the orignal commit snprintf(cmd, MAX_CMD, "git cherry-pick -n %s", itr->c_str()); @@ -783,10 +635,10 @@ bool change_sql_history() // remove the newly added files snprintf(cmd, MAX_CMD, "git diff --cached --diff-filter=A --name-only %s%s", path_prefix, sql_update_dir); - if( (cmd_pipe = popen( cmd, "r" )) == NULL ) + if ((cmd_pipe = popen(cmd, "r")) == NULL) return false; - while(fgets(buffer, MAX_BUF, cmd_pipe)) + while (fgets(buffer, MAX_BUF, cmd_pipe)) { buffer[strlen(buffer) - 1] = '\0'; snprintf(cmd, MAX_CMD, "git rm -f --quiet %s%s", path_prefix, buffer); @@ -809,15 +661,16 @@ bool change_sql_history() bool prepare_new_index() { - if(!use_new_index) return true; + if (!use_new_index) return true; // only use a new index if there are staged changes that should be preserved - if( (cmd_pipe = popen( "git diff --cached", "r" )) == NULL ) { + if ((cmd_pipe = popen("git diff --cached", "r")) == NULL) + { use_new_index = false; return false; } - if(!fgets(buffer, MAX_BUF, cmd_pipe)) + if (!fgets(buffer, MAX_BUF, cmd_pipe)) { use_new_index = false; pclose(cmd_pipe); @@ -826,108 +679,85 @@ bool prepare_new_index() pclose(cmd_pipe); - printf("+ preparing new index\n"); - // copy the existing index file to a new one char src_file[MAX_PATH], dst_file[MAX_PATH]; - char *old_index = getenv("GIT_INDEX_FILE"); - if(old_index) strncpy(src_file, old_index, MAX_PATH); + char* old_index = getenv("GIT_INDEX_FILE"); + if (old_index) strncpy(src_file, old_index, MAX_PATH); else snprintf(src_file, MAX_PATH, "%s.git/index", path_prefix); snprintf(dst_file, MAX_PATH, "%s%s", path_prefix, new_index_file); - if(!copy_file(src_file, dst_file)) return false; + if (!copy_file(src_file, dst_file)) return false; // doesn't seem to work with path_prefix snprintf(new_index_cmd, MAX_CMD, "GIT_INDEX_FILE=%s/%s", base_path, new_index_file); - if(putenv(new_index_cmd) != 0) return false; + if (putenv(new_index_cmd) != 0) return false; // clear the new index system("git reset -q --mixed HEAD"); // revert to old index snprintf(old_index_cmd, MAX_CMD, "GIT_INDEX_FILE="); - if(putenv(old_index_cmd) != 0) return false; + if (putenv(old_index_cmd) != 0) return false; return true; } bool cleanup_new_index() { - if(!use_new_index) return true; - printf("+ cleaning up the new index\n"); + if (!use_new_index) return true; char idx_file[MAX_PATH]; snprintf(idx_file, MAX_PATH, "%s%s", path_prefix, new_index_file); remove(idx_file); return true; } -#define DO(cmd) if(!cmd) { printf("FAILED\n"); return 1; } +#define DO(CMD) if (!CMD()) { printf("FAILED at " #CMD "\n"); return 1; } -int main(int argc, char *argv[]) +int main(int argc, char* argv[]) { - for(int i = 1; i < argc; i++) + for (int i = 1; i < argc; i++) { - if(argv[i] == NULL) continue; - if(strncmp(argv[i], "-r", 2) == 0 || strncmp(argv[i], "--replace", 9) == 0) + if (argv[i] == NULL) continue; + if (strncmp(argv[i], "-r", 2) == 0 || strncmp(argv[i], "--replace", 9) == 0) allow_replace = true; - else if(strncmp(argv[i], "-l", 2) == 0 || strncmp(argv[i], "--local", 7) == 0) - local = true; - else if(strncmp(argv[i], "-f", 2) == 0 || strncmp(argv[i], "--fetch", 7) == 0) + else if (strncmp(argv[i], "-f", 2) == 0 || strncmp(argv[i], "--fetch", 7) == 0) do_fetch = true; - else if(strncmp(argv[i], "-s", 2) == 0 || strncmp(argv[i], "--sql", 5) == 0) - do_sql = true; - else if(strncmp(argv[i], "--branch=", 9) == 0) + else if (strncmp(argv[i], "--branch=", 9) == 0) snprintf(remote_branch, MAX_REMOTE, "%s", argv[i] + 9); - else if(strncmp(argv[i], "-h", 2) == 0 || strncmp(argv[i], "--help", 6) == 0) + else if (strncmp(argv[i], "-h", 2) == 0 || strncmp(argv[i], "--help", 6) == 0) { printf("Usage: git_id [OPTION]\n"); - printf("Generates a new rev number and updates revision_nr.h and the commit message.\n"); + printf("Generates a new sql revision number.\n"); printf("Should be used just before push.\n"); printf(" -h, --help show the usage\n"); printf(" -r, --replace replace the rev number if it was already applied\n"); printf(" to the last commit\n"); - printf(" -l, --local search for the highest rev number on HEAD\n"); printf(" -f, --fetch fetch from origin before searching for the new rev\n"); - printf(" -s, --sql search for new sql updates and do all of the changes\n"); - printf(" for the new rev\n"); printf(" --branch=BRANCH specify which remote branch to use\n"); return 0; } } - if (local && do_sql) - { - printf("Options -l/--local and -s/--sql can't be used in same time currently.\n"); - printf("FAILED\n"); - return 1; - } + DO(find_path); - DO( find_path() ); - if(!local) - { - DO( find_origin() ); - if(do_fetch) - DO( fetch_origin() ); - DO( check_fwd() ); - } - DO( find_rev() ); - DO( find_head_msg() ); - if(do_sql) - DO( find_sql_updates() ); - DO( prepare_new_index() ); - DO( write_rev_nr() ); - if(do_sql) - { - DO( convert_sql_updates() ); - if (generate_makefile) - DO( generate_sql_makefile() ); - DO( change_sql_database() ); - DO( write_rev_sql() ); - } - DO( amend_commit() ); - DO( cleanup_new_index() ); - //if(do_sql) - // DO( change_sql_history() ); + DO(find_origin); + if (do_fetch) + DO(fetch_origin); + DO(check_fwd); + + DO(find_rev); + DO(find_head_msg); + DO(find_sql_updates); + + if (new_sql_updates.empty()) + return 0; + + DO(prepare_new_index); + DO(convert_sql_updates); + DO(change_sql_database); + DO(write_rev_sql); + DO(amend_commit); + DO(cleanup_new_index); return 0; } diff --git a/src/game/Level0.cpp b/src/game/Level0.cpp index 468c41f6fe4..1d40b34398b 100644 --- a/src/game/Level0.cpp +++ b/src/game/Level0.cpp @@ -28,7 +28,6 @@ #include "ScriptMgr.h" #include "SystemConfig.h" #include "revision.h" -#include "revision_nr.h" #include "Util.h" bool ChatHandler::HandleHelpCommand(char* args) @@ -97,9 +96,9 @@ bool ChatHandler::HandleServerInfoCommand(char* /*args*/) char const* full; if (m_session) - full = _FULLVERSION(REVISION_DATE, REVISION_TIME, REVISION_NR, "|cffffffff|Hurl:" REVISION_ID "|h" REVISION_ID "|h|r"); + full = _FULLVERSION(REVISION_DATE, REVISION_TIME, "|cffffffff|Hurl:" REVISION_ID "|h" REVISION_ID "|h|r"); else - full = _FULLVERSION(REVISION_DATE, REVISION_TIME, REVISION_NR, REVISION_ID); + full = _FULLVERSION(REVISION_DATE, REVISION_TIME, REVISION_ID); SendSysMessage(full); if (sScriptMgr.IsScriptLibraryLoaded()) diff --git a/src/game/ScriptMgr.cpp b/src/game/ScriptMgr.cpp index ce26bb27d0a..e4da97ebc2f 100644 --- a/src/game/ScriptMgr.cpp +++ b/src/game/ScriptMgr.cpp @@ -33,8 +33,6 @@ #include "WaypointMovementGenerator.h" #include "Mail.h" -#include "revision_nr.h" - ScriptMapMapName sQuestEndScripts; ScriptMapMapName sQuestStartScripts; ScriptMapMapName sSpellScripts; @@ -2387,13 +2385,6 @@ ScriptLoadResult ScriptMgr::LoadScriptLibrary(const char* libName) # undef GET_SCRIPT_HOOK_PTR - if (strcmp(pGetMangosRevStr(), REVISION_NR) != 0) - { - m_pOnFreeScriptLibrary = NULL; // prevent call before init - UnloadScriptLibrary(); - return SCRIPT_LOAD_ERR_OUTDATED; - } - m_pOnInitScriptLibrary(); return SCRIPT_LOAD_OK; } diff --git a/src/mangosd/Main.cpp b/src/mangosd/Main.cpp index 286ba82557c..8ff4e9604c0 100644 --- a/src/mangosd/Main.cpp +++ b/src/mangosd/Main.cpp @@ -29,7 +29,6 @@ #include "SystemConfig.h" #include "AuctionHouseBot/AuctionHouseBot.h" #include "revision.h" -#include "revision_nr.h" #include #include #include @@ -103,7 +102,7 @@ extern int main(int argc, char** argv) cfg_file = cmd_opts.opt_arg(); break; case 'v': - printf("%s\n", _FULLVERSION(REVISION_DATE, REVISION_TIME, REVISION_NR, REVISION_ID)); + printf("%s\n", _FULLVERSION(REVISION_DATE, REVISION_TIME, REVISION_ID)); return 0; case 's': { @@ -178,7 +177,7 @@ extern int main(int argc, char** argv) } #endif - sLog.outString("%s [world-daemon]", _FULLVERSION(REVISION_DATE, REVISION_TIME, REVISION_NR, REVISION_ID)); + sLog.outString("%s [world-daemon]", _FULLVERSION(REVISION_DATE, REVISION_TIME, REVISION_ID)); sLog.outString(" to stop."); sLog.outString("\n\n" " _____ __ __ _ _ _____ ____ _____ \n" diff --git a/src/realmd/Main.cpp b/src/realmd/Main.cpp index 69798dadcc6..ef79331095e 100644 --- a/src/realmd/Main.cpp +++ b/src/realmd/Main.cpp @@ -29,7 +29,6 @@ #include "AuthSocket.h" #include "SystemConfig.h" #include "revision.h" -#include "revision_nr.h" #include "revision_sql.h" #include "Util.h" #include @@ -107,7 +106,7 @@ extern int main(int argc, char** argv) cfg_file = cmd_opts.opt_arg(); break; case 'v': - printf("%s\n", _FULLVERSION(REVISION_DATE, REVISION_TIME, REVISION_NR, REVISION_ID)); + printf("%s\n", _FULLVERSION(REVISION_DATE, REVISION_TIME, REVISION_ID)); return 0; case 's': @@ -185,7 +184,7 @@ extern int main(int argc, char** argv) sLog.Initialize(); - sLog.outString("%s [realm-daemon]", _FULLVERSION(REVISION_DATE, REVISION_TIME, REVISION_NR, REVISION_ID)); + sLog.outString("%s [realm-daemon]", _FULLVERSION(REVISION_DATE, REVISION_TIME, REVISION_ID)); sLog.outString(" to stop.\n"); sLog.outString("Using configuration file %s.", cfg_file); diff --git a/src/shared/CMakeLists.txt b/src/shared/CMakeLists.txt index 89d32077837..72cd00ed09e 100644 --- a/src/shared/CMakeLists.txt +++ b/src/shared/CMakeLists.txt @@ -100,7 +100,6 @@ set(LIBRARY_SRCS Common.cpp Common.h LockedQueue.h - revision_nr.h revision_sql.h SystemConfig.h Threading.cpp diff --git a/src/shared/SystemConfig.h.in b/src/shared/SystemConfig.h.in index e84492c4e2c..7b48c1578a1 100644 --- a/src/shared/SystemConfig.h.in +++ b/src/shared/SystemConfig.h.in @@ -27,9 +27,9 @@ #ifndef _VERSION #if PLATFORM == PLATFORM_WINDOWS -# define _VERSION(REVD,REVT,REVN,REVH) "0.17" " (" REVD " " REVT " Revision " REVN " - " REVH ")" +# define _VERSION(REVD,REVT,REVH) "0.17" " (" REVD " " REVT " - " REVH ")" #else -# define _VERSION(REVD,REVT,REVN,REVH) "@VERSION@" " (" REVD " " REVT " Revision " REVN " - " REVH ")" +# define _VERSION(REVD,REVT,REVH) "@VERSION@" " (" REVD " " REVT " - " REVH ")" #endif #endif @@ -93,7 +93,7 @@ # define _AUCTIONHOUSEBOT_CONFIG SYSCONFDIR"ahbot.conf" #endif -#define _FULLVERSION(REVD,REVT,REVN,REVH) _PACKAGENAME "/" _VERSION(REVD,REVT,REVN,REVH) " for " _ENDIAN_PLATFORM +#define _FULLVERSION(REVD,REVT,REVH) _PACKAGENAME "/" _VERSION(REVD,REVT,REVH) " for " _ENDIAN_PLATFORM #define DEFAULT_PLAYER_LIMIT 100 #define DEFAULT_WORLDSERVER_PORT 8085 //8129 diff --git a/src/shared/WheatyExceptionReport.cpp b/src/shared/WheatyExceptionReport.cpp index d0afd13ff4a..899b9417553 100644 --- a/src/shared/WheatyExceptionReport.cpp +++ b/src/shared/WheatyExceptionReport.cpp @@ -15,7 +15,6 @@ #include #include "WheatyExceptionReport.h" #include "revision.h" -#include "revision_nr.h" #define CrashFolder _T("Crashes") //#pragma comment(linker, "/defaultlib:dbghelp.lib") @@ -299,7 +298,7 @@ void WheatyExceptionReport::GenerateExceptionReport( GetLocalTime(&systime); // Start out with a banner - _tprintf(_T("Revision: %s %s %s %s\r\n"), REVISION_DATE, REVISION_TIME, REVISION_NR, REVISION_ID); + _tprintf(_T("Revision: %s %s %s\r\n"), REVISION_DATE, REVISION_TIME, REVISION_ID); _tprintf(_T("Date %u:%u:%u. Time %u:%u \r\n"), systime.wDay, systime.wMonth, systime.wYear, systime.wHour, systime.wMinute); PEXCEPTION_RECORD pExceptionRecord = pExceptionInfo->ExceptionRecord; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h deleted file mode 100644 index 3840155ad57..00000000000 --- a/src/shared/revision_nr.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef __REVISION_NR_H__ -#define __REVISION_NR_H__ - #define REVISION_NR "12935" -#endif // __REVISION_NR_H__ diff --git a/win/VC100/shared.vcxproj b/win/VC100/shared.vcxproj index d5712246977..30b9127b311 100644 --- a/win/VC100/shared.vcxproj +++ b/win/VC100/shared.vcxproj @@ -482,7 +482,6 @@ - diff --git a/win/VC100/shared.vcxproj.filters b/win/VC100/shared.vcxproj.filters index 47e125816e4..312917c4d71 100644 --- a/win/VC100/shared.vcxproj.filters +++ b/win/VC100/shared.vcxproj.filters @@ -172,7 +172,6 @@ - diff --git a/win/VC110/shared.vcxproj b/win/VC110/shared.vcxproj index 4b0c8c88b87..726a6252d2a 100644 --- a/win/VC110/shared.vcxproj +++ b/win/VC110/shared.vcxproj @@ -488,7 +488,6 @@ - diff --git a/win/VC110/shared.vcxproj.filters b/win/VC110/shared.vcxproj.filters index 47e125816e4..312917c4d71 100644 --- a/win/VC110/shared.vcxproj.filters +++ b/win/VC110/shared.vcxproj.filters @@ -172,7 +172,6 @@ - diff --git a/win/VC120/shared.vcxproj b/win/VC120/shared.vcxproj index 2e7f142a459..2b0c6d49d8f 100644 --- a/win/VC120/shared.vcxproj +++ b/win/VC120/shared.vcxproj @@ -488,7 +488,6 @@ - diff --git a/win/VC120/shared.vcxproj.filters b/win/VC120/shared.vcxproj.filters index 94d5f1f7d19..872ca2067f7 100644 --- a/win/VC120/shared.vcxproj.filters +++ b/win/VC120/shared.vcxproj.filters @@ -172,7 +172,6 @@ -