Forráskód Böngészése

Add the first 8 bytes of the git commit digest to our versions.

Note that unlike subversion revision numbers, it isn't meaningful to
compare these for anything but equality.  We define a sort-order anyway,
in case one of these accidentally slips into a recommended-versions
list.
Nick Mathewson 15 éve
szülő
commit
daa0326aaa
8 módosított fájl, 58 hozzáadás és 55 törlés
  1. 2 0
      ChangeLog
  2. 11 45
      src/or/Makefile.am
  3. 4 4
      src/or/config.c
  4. 3 0
      src/or/or.h
  5. 0 2
      src/or/router.c
  6. 23 2
      src/or/routerparse.c
  7. 14 1
      src/or/test.c
  8. 1 1
      src/or/tor_main.c

+ 2 - 0
ChangeLog

@@ -38,6 +38,8 @@ Changes in version 0.2.2.1-alpha - 2009-0?-??
       setting FetchDirInfoEarly to 1. Previous behavior will stay the same
       setting FetchDirInfoEarly to 1. Previous behavior will stay the same
       as only certain clients who must have this information sooner should
       as only certain clients who must have this information sooner should
       set this option.
       set this option.
+    - Instead of adding the svn revision to the Tor version string, report
+      the git commit (when we're building from a git checkout).
 
 
   o Minor bugfixes:
   o Minor bugfixes:
     - If any the v3 certs we download are unparseable, we should actually
     - If any the v3 certs we download are unparseable, we should actually

+ 11 - 45
src/or/Makefile.am

@@ -57,52 +57,18 @@ config_codedigest.o: or_sha1.i
 tor_main.o: micro-revision.i
 tor_main.o: micro-revision.i
 
 
 micro-revision.i: FORCE
 micro-revision.i: FORCE
-	@svkdir=$$SVKROOT; 					\
-	if test "x$$svkdir" = x ; then 				\
-	  svkdir=$$HOME/.svk; 					\
-	fi; 							\
-	if test -d ../../.git && test -x "`which git 2>&1;true`" ; then \
-	  if test -d ../../.git/svn && test -x "`which git-svn 2>&1;true`" ; then \
-	    git-svn info ../../README | 			\
-	    sed -n 's/^Revision: \([0-9][0-9]*\).*/"\1"/p'      \
-	                                   > micro-revision.tmp \
-	        || true; 					\
-	  fi; 							\
-	elif test -d ../../.svn && test -x "`which svn 2>&1;true`" ; then \
-	  svn info ../.. |					\
-	  sed -n 's/^Revision: \([0-9][0-9]*\).*/"\1"/p' > micro-revision.tmp \
-	     || true;						\
-	elif test -x "`which svk 2>&1;true`" && test -d $$svkdir/local; then \
-	  location=../..;					\
-	  rev=x;						\
-	  while test x$$rev = xx; do				\
-	    x=`svk info $$location |				\
-	      sed -n 's/^Mirrored From:.*, Rev\. \([0-9][0-9]*\)/\1/p'`; \
-	    if test x$$x != x; then				\
-	      rev=$$x;						\
-	      break;						\
-	    else						\
-	      loc=`svk info $$location |			\
-		sed -n 's/^Copied From: \(.*\), Rev\. [0-9][0-9]*/\1/p' | \
-	        head -1`;					\
-	      if test x$$loc = x; then				\
-		break;						\
-	      else						\
-		location=/$$loc;				\
-	      fi;						\
-	    fi;							\
-	  done;							\
-	  if test x$$rev != xx; then				\
-	    echo \"$$rev\" > micro-revision.tmp;		\
-	  fi;							\
-	fi;							\
-	if test ! -f micro-revision.tmp ; then			\
-	  if test ! -f micro-revision.i ; then			\
-	    echo '""' > micro-revision.i;			\
-	  fi;							\
-	elif test ! -f micro-revision.i ||			\
+	@rm -f micro-revision.tmp;					\
+	if test -d ../../.git && test -x "`which git 2>&1;true`"; then 	\
+	  HASH="`git rev-parse --short=16 HEAD`"; 			\
+	  echo \"$$HASH\" > micro-revision.tmp; 			\
+        fi;								\
+	if test ! -f micro-revision.tmp ; then				\
+	  if test ! -f micro-revision.i ; then				\
+	    echo '""' > micro-revision.i;				\
+	  fi;								\
+	elif test ! -f micro-revision.i ||				\
 	  test x"`cat micro-revision.tmp`" != x"`cat micro-revision.i`"; then \
 	  test x"`cat micro-revision.tmp`" != x"`cat micro-revision.i`"; then \
-	  mv micro-revision.tmp micro-revision.i;		\
+	  mv micro-revision.tmp micro-revision.i;			\
 	fi; true
 	fi; true
 
 
 or_sha1.i: $(tor_SOURCES) test_data.c test.c
 or_sha1.i: $(tor_SOURCES) test_data.c test.c

+ 4 - 4
src/or/config.c

@@ -817,7 +817,7 @@ set_options(or_options_t *new_val, char **msg)
   return 0;
   return 0;
 }
 }
 
 
-extern const char tor_svn_revision[]; /* from tor_main.c */
+extern const char tor_git_revision[]; /* from tor_main.c */
 
 
 /** The version of this Tor process, as parsed. */
 /** The version of this Tor process, as parsed. */
 static char *_version = NULL;
 static char *_version = NULL;
@@ -827,10 +827,10 @@ const char *
 get_version(void)
 get_version(void)
 {
 {
   if (_version == NULL) {
   if (_version == NULL) {
-    if (strlen(tor_svn_revision)) {
-      size_t len = strlen(VERSION)+strlen(tor_svn_revision)+8;
+    if (strlen(tor_git_revision)) {
+      size_t len = strlen(VERSION)+strlen(tor_git_revision)+16;
       _version = tor_malloc(len);
       _version = tor_malloc(len);
-      tor_snprintf(_version, len, "%s (r%s)", VERSION, tor_svn_revision);
+      tor_snprintf(_version, len, "%s (git-%s)", VERSION, tor_git_revision);
     } else {
     } else {
       _version = tor_strdup(VERSION);
       _version = tor_strdup(VERSION);
     }
     }

+ 3 - 0
src/or/or.h

@@ -4698,6 +4698,9 @@ typedef struct tor_version_t {
   int patchlevel;
   int patchlevel;
   char status_tag[MAX_STATUS_TAG_LEN];
   char status_tag[MAX_STATUS_TAG_LEN];
   int svn_revision;
   int svn_revision;
+
+  int git_tag_len;
+  char git_tag[DIGEST_LEN];
 } tor_version_t;
 } tor_version_t;
 
 
 int router_get_router_hash(const char *s, char *digest);
 int router_get_router_hash(const char *s, char *digest);

+ 0 - 2
src/or/router.c

@@ -1608,8 +1608,6 @@ router_guess_address_from_dir_headers(uint32_t *guess)
   return -1;
   return -1;
 }
 }
 
 
-extern const char tor_svn_revision[]; /* from tor_main.c */
-
 /** Set <b>platform</b> (max length <b>len</b>) to a NUL-terminated short
 /** Set <b>platform</b> (max length <b>len</b>) to a NUL-terminated short
  * string describing the version of Tor and the operating system we're
  * string describing the version of Tor and the operating system we're
  * currently running on.
  * currently running on.

+ 23 - 2
src/or/routerparse.c

@@ -3325,7 +3325,7 @@ tor_version_as_new_as(const char *platform, const char *cutoff)
   if (!*start) return 0;
   if (!*start) return 0;
   s = (char *)find_whitespace(start); /* also finds '\0', which is fine */
   s = (char *)find_whitespace(start); /* also finds '\0', which is fine */
   s2 = (char*)eat_whitespace(s);
   s2 = (char*)eat_whitespace(s);
-  if (!strcmpstart(s2, "(r"))
+  if (!strcmpstart(s2, "(r") || !strcmpstart(s2, "(git-"))
     s = (char*)find_whitespace(s2);
     s = (char*)find_whitespace(s2);
 
 
   if ((size_t)(s-start+1) >= sizeof(tmp)) /* too big, no */
   if ((size_t)(s-start+1) >= sizeof(tmp)) /* too big, no */
@@ -3421,6 +3421,21 @@ tor_version_parse(const char *s, tor_version_t *out)
   if (!strcmpstart(cp, "(r")) {
   if (!strcmpstart(cp, "(r")) {
     cp += 2;
     cp += 2;
     out->svn_revision = (int) strtol(cp,&eos,10);
     out->svn_revision = (int) strtol(cp,&eos,10);
+  } else if (!strcmpstart(cp, "(git-")) {
+    char *close_paren = strchr(cp, ')');
+    int hexlen;
+    char digest[DIGEST_LEN];
+    if (! close_paren)
+      return -1;
+    cp += 5;
+    hexlen = (close_paren-cp);
+    memset(digest, 0, sizeof(digest));
+    if (hexlen > HEX_DIGEST_LEN || hexlen == 0 || (hexlen % 2) == 1)
+      return -1;
+    if (base16_decode(digest, hexlen/2, cp, hexlen))
+      return -1;
+    memcpy(out->git_tag, digest, hexlen/2);
+    out->git_tag_len = hexlen/2;
   }
   }
 
 
   return 0;
   return 0;
@@ -3446,8 +3461,14 @@ tor_version_compare(tor_version_t *a, tor_version_t *b)
     return i;
     return i;
   else if ((i = strcmp(a->status_tag, b->status_tag)))
   else if ((i = strcmp(a->status_tag, b->status_tag)))
     return i;
     return i;
+  else if ((i = a->svn_revision - b->svn_revision))
+    return i;
+  else if ((i = a->git_tag_len - b->git_tag_len))
+    return i;
+  else if (a->git_tag_len)
+    return memcmp(a->git_tag, b->git_tag, a->git_tag_len);
   else
   else
-    return a->svn_revision - b->svn_revision;
+    return 0;
 }
 }
 
 
 /** Return true iff versions <b>a</b> and <b>b</b> belong to the same series.
 /** Return true iff versions <b>a</b> and <b>b</b> belong to the same series.

+ 14 - 1
src/or/test.c

@@ -5,7 +5,7 @@
 
 
 /* Ordinarily defined in tor_main.c; this bit is just here to provide one
 /* Ordinarily defined in tor_main.c; this bit is just here to provide one
  * since we're not linking to tor_main.c */
  * since we're not linking to tor_main.c */
-const char tor_svn_revision[] = "";
+const char tor_git_revision[] = "";
 
 
 /**
 /**
  * \file test.c
  * \file test.c
@@ -3212,6 +3212,19 @@ test_dir_format(void)
                                    "Tor 0.2.1.0-dev (r99)"));
                                    "Tor 0.2.1.0-dev (r99)"));
   test_eq(1, tor_version_as_new_as("Tor 0.2.1.1",
   test_eq(1, tor_version_as_new_as("Tor 0.2.1.1",
                                    "Tor 0.2.1.0-dev (r99)"));
                                    "Tor 0.2.1.0-dev (r99)"));
+
+  /* Now try git revisions */
+  test_eq(0, tor_version_parse("0.5.6.7 (git-ff00ff)", &ver1));
+  test_eq(0, ver1.major);
+  test_eq(5, ver1.minor);
+  test_eq(6, ver1.micro);
+  test_eq(7, ver1.patchlevel);
+  test_eq(3, ver1.git_tag_len);
+  test_memeq(ver1.git_tag, "\xff\x00\xff", 3);
+  test_eq(-1, tor_version_parse("0.5.6.7 (git-ff00xx)", &ver1));
+  test_eq(-1, tor_version_parse("0.5.6.7 (git-ff00fff)", &ver1));
+  test_eq(0, tor_version_parse("0.5.6.7 (git ff00fff)", &ver1));
+
  done:
  done:
   if (r1)
   if (r1)
     routerinfo_free(r1);
     routerinfo_free(r1);

+ 1 - 1
src/or/tor_main.c

@@ -7,7 +7,7 @@
  * built from.  This string is generated by a bit of shell kludging int
  * built from.  This string is generated by a bit of shell kludging int
  * src/or/Makefile.am, and is usually right.
  * src/or/Makefile.am, and is usually right.
  */
  */
-const char tor_svn_revision[] =
+const char tor_git_revision[] =
 #ifndef _MSC_VER
 #ifndef _MSC_VER
 #include "micro-revision.i"
 #include "micro-revision.i"
 #endif
 #endif