Include svn revision in build string
Modified: trunk/reactos/tools/buildno.c

Modified: trunk/reactos/tools/buildno.c
--- trunk/reactos/tools/buildno.c	2005-02-18 21:20:01 UTC (rev 13637)
+++ trunk/reactos/tools/buildno.c	2005-02-18 22:46:49 UTC (rev 13638)
@@ -53,28 +53,8 @@
 }
 #endif
 
-
-int
-elapsed_days (
-	time_t	t_today,
-	time_t	t_release_day
-	)
-{
-	double	seconds = difftime (t_today, t_release_day);
-	double	days = seconds / (double) 86400.0;
-	char	buf [32];
-	char	* dot = buf;
-
-	sprintf (buf, "%f", days );
-
-	while ( *dot && *dot != '.') ++dot;
-	*dot = '\0';
-	
-	return atol (buf);
-}
-
 void
-write_h (int build)
+write_h (int build, char *buildstr)
 {
   FILE	*h = NULL;
   char* s;
@@ -90,8 +70,8 @@
   s = s + sprintf (s, "#define _INC_REACTOS_BUILDNO\n" );
   
   s = s + sprintf (s, "#define KERNEL_VERSION_BUILD\t%d\n", build);
-  s = s + sprintf (s, "#define KERNEL_VERSION_BUILD_STR\t\"%d\"\n", build);
-  s = s + sprintf (s, "#define KERNEL_VERSION_BUILD_RC\t\"%d\\0\"\n", build);
+  s = s + sprintf (s, "#define KERNEL_VERSION_BUILD_STR\t\"%s\"\n", buildstr);
+  s = s + sprintf (s, "#define KERNEL_VERSION_BUILD_RC\t\"%s\\0\"\n", buildstr);
   s = s + sprintf (s, "#define KERNEL_RELEASE_RC\t\"%d.%d",
 		   KERNEL_VERSION_MAJOR, KERNEL_VERSION_MINOR);
   if (0 != KERNEL_VERSION_PATCH_LEVEL)
@@ -191,6 +171,48 @@
   fclose (h);
 }
 
+char *
+GetRev(void)
+{
+  static char Unknown[] = "UNKNOWN";
+  static char Rev[10]; /* 999999999 revisions should be enough for everyone... */
+  FILE *SvnCmd;
+  char Line[256];
+  char *p;
+
+  SvnCmd = popen("svn info", "r");
+  if (NULL == SvnCmd)
+    {
+      fprintf(stderr, "Failed to run \"svn info\" command\n");
+      return Unknown;
+    }
+  while (! feof(SvnCmd) && ! ferror(SvnCmd))
+    {
+      if (NULL == fgets(Line, sizeof(Line), SvnCmd))
+        {
+          break;
+        }
+      if (0 == strncmp(Line, "Revision: ", 10))
+        {
+          pclose(SvnCmd);
+          p = Line + 10;
+          if (sizeof(Rev) < strlen(p))
+            {
+              fprintf(stderr, "Weird SVN revision number %s", p);
+              return Unknown;
+            }
+          strncpy(Rev, p, strlen(p) - 1);
+          Rev[strlen(p) - 1] = '\0';
+          return Rev;
+        }
+    }
+
+  pclose(SvnCmd);
+
+  return Unknown;
+}
+
+
 void
 usage (void)
 {
@@ -210,6 +232,7 @@
 	int		quiet = FALSE;
 
 	int		build = 0;
+	char		buildstr[64];
 
 	time_t		t1 = 0;
 	struct tm	* t1_tm = NULL;
@@ -251,7 +274,7 @@
 	/*
 	 * We are building TODAY!
 	 */
-	if (FALSE == quiet)
+	if (! quiet)
 	{
 		printf ( "\nReactOS Build Number Generator\n\n");
 	}
@@ -266,7 +289,7 @@
 #ifdef DBG
 	tm_dump ("t1", t1_tm);
 #endif
-	if (FALSE == quiet)
+	if (! quiet)
 	{
 		printf ( 
 			"Current date: %4d-%02d-%02d\n\n",
@@ -280,7 +303,9 @@
 	 */
 	build =	t1_tm->tm_year * 10000 + (t1_tm->tm_mon + 1) * 100 + t1_tm->tm_mday;
 
-	if (FALSE == quiet)
+	sprintf(buildstr, "%d-r%s", build, GetRev());
+
+	if (! quiet)
 	{
 		printf (
 			"ROS Version : %d.%d",
@@ -291,15 +316,15 @@
 		{
 			printf(".%d", KERNEL_VERSION_PATCH_LEVEL);
 		}
-		printf("-%S (Build %d)\n\n", KERNEL_VERSION_BUILD_TYPE, build);
+		printf("-%S (Build %s)\n\n", KERNEL_VERSION_BUILD_TYPE, buildstr);
 	}
 	/*
 	 * (Over)write the include file, unless
 	 * the user switched on -p.
 	 */
-	if (FALSE == print_only)
+	if (! print_only)
 	{
-		write_h (build);
+		write_h (build, buildstr);
 	}
 	else
 	{