Patch #1676 2006-11-30 21:23

sethjackson

Autorevision
Download
1676-Autorevision.patch (6.7 KB)
Category
Application::Refinement
Status
Rejected
Close date
2006-12-07 13:45
Assigned to
 
Index: src/build_tools/autorevision/autorevision.cpp
===================================================================
--- src/build_tools/autorevision/autorevision.cpp    (revision 3316)
+++ src/build_tools/autorevision/autorevision.cpp    (working copy)
@@ -26,8 +26,8 @@
     inline void set_env(const char* k, const char* v) { setenv(k, v, 1); };
 #endif
 
-bool QuerySvn(const string& workingDir, string& revision, string &date);
-bool ParseFile(const string& docFile, string& revision, string &date);
+bool QuerySvn(const string& workingDir, string& revision, string& date);
+bool ParseFile(const string& docFile, string& revision, string& date);
 bool WriteOutput(const string& outputFile, string& revision, string& date);
 int main(int argc, char** argv);
 
@@ -43,7 +43,6 @@
     string outputFile;
     string workingDir;
 
-
     for(int i = 1; i < argc; ++i)
     {
         if(strcmp("+int", argv[i]) == 0)
@@ -99,43 +98,47 @@
     return 0;
 }
 
-
-
-bool QuerySvn(const string& workingDir, string& revision, string &date)
+bool QuerySvn(const string& workingDir, string& revision, string& date)
 {
     string svncmd("svn info ");
     svncmd.append(workingDir);
     set_env("LANG", "en_US");
-    FILE *svn = popen(svncmd.c_str(), "r");
 
-    if(svn)
+    ifstream svn(svncmd.c_str());
+
+    if (svn)
     {
         char buf[1024];
+
         string line;
-        while(fgets(buf, 4095, svn))
+
+        while (svn.get(buf, 1024))
         {
             line.assign(buf);
-            if(line.find("Revision:") != string::npos)
+
+            if (line.find("Revision:") != string::npos)
             {
                 revision = line.substr(strlen("Revision: "));
 
-                    string lbreak("\r\n");
-                    size_t i;
-                    while((i = revision.find_first_of(lbreak)) != string::npos)
-                        revision.erase(revision.length()-1);
+                string lbreak("\r\n");
+
+                size_t i;
+
+                while ((i = revision.find_first_of(lbreak)) != string::npos)
+                    revision.erase(revision.length() - 1);
             }
-            if(line.find("Last Changed Date: ") != string::npos)
-            {
-                    date = line.substr(strlen("Last Changed Date: "), strlen("2006-01-01 12:34:56"));
-            }
+
+            if (line.find("Last Changed Date: ") != string::npos)
+                date = line.substr(strlen("Last Changed Date: "), strlen("2006-01-01 12:34:56"));
         }
     }
-    pclose(svn);
+
+    svn.close();
+
     return !revision.empty();
 }
 
-
-bool ParseFile(const string& docFile, string& revision, string &date)
+bool ParseFile(const string& docFile, string& revision, string& date)
 {
     string token[6];
     date.clear();
@@ -143,13 +146,13 @@
     int c = 0;
 
     ifstream inFile(docFile.c_str());
+
     if (!inFile)
-    {
         return false;
-    }
+
     else
     {
-        while(!inFile.eof() && c < 6)
+        while (!inFile.eof() && c < 6)
             inFile >> token[c++];
 
         revision = token[2];
@@ -160,7 +163,6 @@
     }
 }
 
-
 bool WriteOutput(const string& outputFile, string& revision, string& date)
 {
     string old;
@@ -168,70 +170,80 @@
     comment.append(revision);
     comment.append("*/");
 
+    ifstream in(outputFile.c_str());
+
+    if (!in.bad() && !in.eof())
     {
-        ifstream in(outputFile.c_str());
-        if (!in.bad() && !in.eof())
+        in >> old;
+
+        if (old == comment)
         {
-            in >> old;
-            if(old == comment)
-            {
-                if(be_verbose)
-                    printf("Revision unchanged (%s). Skipping.", revision.c_str());
-                in.close();
-                return false;
-            }
+            if (be_verbose)
+                printf("Revision unchanged (%s). Skipping.", revision.c_str());
+
+            in.close();
+
+            return false;
         }
-        in.close();
     }
 
+    in.close();
 
-    FILE *header = fopen(outputFile.c_str(), "wb");
-    if(!header)
+    ofstream header(outputFile.c_str());
+
+    if (!header)
     {
         puts("Error: Could not open output file.");
+
         return false;
     }
 
-    fprintf(header, "%s\n", comment.c_str());
-    fprintf(header, "#ifndef AUTOREVISION_H\n");
-    fprintf(header, "#define AUTOREVISION_H\n\n\n");
+    header << noskipws;
 
-    if(do_std)
-        fprintf(header, "#include <string>\n");
-    if(do_wx)
-        fprintf(header, "#include <wx/string.h>\n");
+    header << comment << "\n";
+    header << "#ifndef AUTOREVISION_H\n";
+    header << "#define AUTOREVISION_H\n\n";
 
-    fprintf(header, "\n#define SVN_REVISION \"%s\"\n", revision.c_str());
-    fprintf(header, "\n#define SVN_DATE     \"%s\"\n\n", date.c_str());
+    if (do_std)
+        header << "#include <string>\n";
 
-    if(do_int || do_std || do_wx)
-        fprintf(header, "namespace autorevision\n{\n");
+    if (do_wx)
+        header <<
download for full patch...
sethjackson 2006-11-30 21:24

Autorevision now uses C++ file I/O everywere instead of mixed. Minor change to ConfigManager::GetRevisionString().

thomasdenk 2006-12-07 13:45

Sorry Seth, have to turn this one down.

The change to ConfigManager::GetRevisionNumber() is not a minor change, but one that breaks functionality ;)

The string returned is purposely constructed from a macro constant, as it will otherwise not work.

The const wxString version generated by autorevision (other than the const int and the macros) can only be used in the same module (to make it work, one would need to add an implementation file and change the type to extern dllexport).

The only reason it is still there is for historical reasons, nobody ever removed the "+wx" option from the commandline.

Also, using C++ file I/O everywhere is not an advantage to me, I'd rather prefer getting rid of it alltogether ;)

The only reason for touching C++ I/O at all was me being too lazy to write a tokenizer when hand-parsing the existing header ;)

And finally, we have that modified version of autorevision working on xml out there which Yiannis hopefully still has on his hard drive (because I don't know where I keep my copy) which is not committed yet. I don't remember everything that was changed, but quite likely a lot of the changes in those two modifications will clash.