From fece189bdb9270b929820ecf890bacd81efeee56 Mon Sep 17 00:00:00 2001 From: Randy Heit Date: Sat, 22 Jun 2013 20:49:38 -0500 Subject: [PATCH] - Change updaterevision to use git instead of svnversion --- tools/updaterevision/updaterevision.c | 103 +++++++++++++++----------- 1 file changed, 60 insertions(+), 43 deletions(-) diff --git a/tools/updaterevision/updaterevision.c b/tools/updaterevision/updaterevision.c index 55e81bc405..c1e3ccc8fa 100644 --- a/tools/updaterevision/updaterevision.c +++ b/tools/updaterevision/updaterevision.c @@ -1,8 +1,9 @@ /* updaterevision.c * - * Public domain. This program uses the svnversion command to get the - * repository revision for a particular directory and writes it into - * a header file so that it can be used as a project's build number. + * Public domain. This program uses git commands command to get + * various bits of repository status for a particular directory + * and writes it into a header file so that it can be used for a + * project's versioning. */ #define _CRT_SECURE_NO_DEPRECATE @@ -13,24 +14,41 @@ #include #include +// Used to strip newline characters from lines read by fgets. +void stripnl(char *str) +{ + if (*str != '\0') + { + size_t len = strlen(str); + if (str[len - 1] == '\n') + { + str[len - 1] = '\0'; + } + } +} + int main(int argc, char **argv) { char *name; - char currev[64], lastrev[64], run[256], *rev; - unsigned long urev; + char vertag[64], lastlog[64], lasthash[64], run[256], *hash = NULL; FILE *stream = NULL; int gotrev = 0, needupdate = 1; + vertag[0] = '\0'; + lastlog[0] = '\0'; + if (argc != 3) { - fprintf (stderr, "Usage: %s \n", argv[0]); + fprintf(stderr, "Usage: %s \n", argv[0]); return 1; } - // Use svnversion to get the revision number. If that fails, pretend it's - // revision 0. Note that this requires you have the command-line svn tools installed. - sprintf (run, "svnversion -cn %s", argv[1]); - if ((name = tempnam(NULL, "svnout")) != NULL) + // Use git describe --tags to get a version string. If we are sitting directly + // on a tag, it returns that tag. Otherwise it returns --. + // Use git log to get the time of the latest commit in ISO 8601 format and its full hash. + sprintf(run, "git describe --tags && git log -1 --format=%%ai*%%H", argv[1]); + if ((name = tempnam(NULL, "gitout")) != NULL) { #ifdef __APPLE__ // tempnam will return errno of 2 even though it is successful for our purposes. @@ -40,39 +58,41 @@ int main(int argc, char **argv) system(run) == 0 && errno == 0 && fseek(stream, 0, SEEK_SET) == 0 && - fgets(currev, sizeof currev, stream) == currev && - (isdigit(currev[0]) || (currev[0] == '-' && currev[1] == '1'))) + fgets(vertag, sizeof vertag, stream) == vertag && + fgets(lastlog, sizeof lastlog, stream) == lastlog) { + stripnl(vertag); + stripnl(lastlog); gotrev = 1; } } if (stream != NULL) { - fclose (stream); - remove (name); + fclose(stream); + remove(name); } if (name != NULL) { - free (name); + free(name); } - if (!gotrev) + if (gotrev) { - fprintf (stderr, "Failed to get current revision: %s\n", strerror(errno)); - strcpy (currev, "0"); - rev = currev; + hash = strchr(lastlog, '*'); + if (hash != NULL) + { + *hash = '\0'; + hash++; + } } - else + if (hash == NULL) { - rev = strchr (currev, ':'); - if (rev == NULL) - { - rev = currev; - } - else - { - rev += 1; - } + fprintf(stderr, "Failed to get commit info: %s\n", strerror(errno)); + strcpy(vertag, ""); + lastlog[0] = '\0'; + lastlog[1] = '0'; + lastlog[2] = '\0'; + hash = lastlog + 1; } stream = fopen (argv[2], "r"); @@ -86,13 +106,10 @@ int main(int argc, char **argv) // Read the revision that's in this file already. If it's the same as // what we've got, then we don't need to modify it and can avoid rebuilding // dependant files. - if (fgets(lastrev, sizeof lastrev, stream) == lastrev) + if (fgets(lasthash, sizeof lasthash, stream) == lasthash) { - if (lastrev[0] != '\0') - { // Strip trailing \n - lastrev[strlen(lastrev) - 1] = '\0'; - } - if (strcmp(rev, lastrev + 3) == 0) + stripnl(lasthash); + if (strcmp(hash, lasthash + 3) == 0) { needupdate = 0; } @@ -107,22 +124,22 @@ int main(int argc, char **argv) { return 1; } - urev = strtoul(rev, NULL, 10); - fprintf (stream, + fprintf(stream, "// %s\n" "//\n" "// This file was automatically generated by the\n" "// updaterevision tool. Do not edit by hand.\n" "\n" -"#define SVN_REVISION_STRING \"%s\"\n" -"#define SVN_REVISION_NUMBER %lu\n", - rev, rev, urev); - fclose (stream); - fprintf (stderr, "%s updated to revision %s.\n", argv[2], rev); +"#define GIT_DESCRIPTION \"%s\"\n" +"#define GIT_HASH \"%s\"\n" +"#define GIT_TIME \"%s\"\n", + hash, vertag, hash, lastlog); + fclose(stream); + fprintf(stderr, "%s updated to commit %s.\n", argv[2], vertag); } else { - fprintf (stderr, "%s is up to date at revision %s.\n", argv[2], rev); + fprintf (stderr, "%s is up to date at commit %s.\n", argv[2], vertag); } return 0;