[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[or-cvs] Implement new version format for post 0.1.



Update of /home/or/cvsroot/tor/src/or
In directory moria.mit.edu:/tmp/cvs-serv6295/src/or

Modified Files:
	or.h routerparse.c test.c 
Log Message:
Implement new version format for post 0.1.

Index: or.h
===================================================================
RCS file: /home/or/cvsroot/tor/src/or/or.h,v
retrieving revision 1.498
retrieving revision 1.499
diff -u -d -r1.498 -r1.499
--- or.h	29 Nov 2004 22:25:30 -0000	1.498
+++ or.h	29 Nov 2004 23:04:26 -0000	1.499
@@ -1614,13 +1614,52 @@
 
 /********************************* routerparse.c ************************/
 
+#define MAX_STATUS_TAG_LEN 32
+/** Structure to hold parsed Tor versions.  This is a little messier
+ * than we would like it to be, because we changed version schemes with 0.1.0.
+ *
+ * Before 0.1.0, versions were of the format:
+ *     MAJOR.MINOR.MICRO(status(PATCHLEVEL))?(-cvs)?
+ * where MAJOR, MINOR, MICRO, and PATCHLEVEL are numbers, status is one of
+ * "pre" (for an alpha release), "rc" (for a release candidate), or "." for a
+ * release.  As a special case, "a.b.c" was equivalent to "a.b.c.0".  We
+ * compare the elements in order (major, minor, micro, status, patchlevel,
+ * cvs), with "cvs" preceding non-cvs.
+ *
+ * We would start each development branch with a final version in mind: say,
+ * "0.0.8".  Our first pre-release would be "0.0.8pre1", followed by (for
+ * example) "0.0.8pre2-cvs", "0.0.8pre2", "0.0.8pre3-cvs", "0.0.8rc1",
+ * "0.0.8rc2-cvs", and "0.0.8rc2".  Finally, we'd release 0.0.8.  The stable
+ * CVS branch would then be versioned "0.0.8.1-cvs", and any eventual bugfix
+ * release would be "0.0.8.1".
+ *
+ * After 0.1.0, versions are of the format:
+ *    MAJOR.MINOR.MICRO(.PATCHLEVEL([-.]status_tag)?)?
+ * As before, MAJOR, MINOR, MICRO, and PATCHLEVEL are numbers, with an absent
+ * number equivalent to 0.  All versions _should_ be distinguishable purely by
+ * those four numbers; the status tag is purely informational.  If we *do*
+ * encounter two versions that differ only by status tag, we compare them
+ * lexically.
+ *
+ * Now, we start each development branch with (say) 0.1.1.1-cvs.  The
+ * patchlevel increments consistently as the status tag changes, for example,
+ * as in: 0.1.1.2-alpha, 0.1.1.3-cvs, 0.1.1.4-alpha, 0.1.1.5-cvs, 0.1.1.6-rc
+ * 0.1.1.7-cvs, 0.1.1.8-rc, 0.1.1.9-cvs.  Eventually, we release 0.1.1.10.
+ * The stable CVS repository gets the version 0.1.1.11-maint_cvs; the
+ * next patch release is 0.1.1.12.
+ */
 typedef struct tor_version_t {
   int major;
   int minor;
   int micro;
-  enum { VER_PRE=0, VER_RC=1, VER_RELEASE=2 } status;
+  /** Release status.  For version in the post-0.1 format, this is always
+   * VER_RELEASE. */
+  enum { VER_PRE=0, VER_RC=1, VER_RELEASE=2, } status;
   int patchlevel;
+  /** CVS status.  For version in the post-0.1 format, this is always
+   * IS_NOT_CVS */
   enum { IS_CVS=0, IS_NOT_CVS=1} cvs;
+  char status_tag[MAX_STATUS_TAG_LEN];
 } tor_version_t;
 
 int router_get_router_hash(const char *s, char *digest);

Index: routerparse.c
===================================================================
RCS file: /home/or/cvsroot/tor/src/or/routerparse.c,v
retrieving revision 1.88
retrieving revision 1.89
diff -u -d -r1.88 -r1.89
--- routerparse.c	29 Nov 2004 22:25:30 -0000	1.88
+++ routerparse.c	29 Nov 2004 23:04:26 -0000	1.89
@@ -1440,6 +1440,7 @@
    */
   tor_assert(s);
   tor_assert(out);
+
   memset(out, 0, sizeof(tor_version_t));
 
   /* Get major. */
@@ -1482,13 +1483,14 @@
   if (!eos || eos==cp) return -1;
   cp = eos;
 
-  /* Get cvs status. */
-  if (!*eos) {
-    out->cvs = IS_NOT_CVS;
-  } else if (0==strcmp(cp, "-cvs")) {
+  /* Get cvs status and status tag. */
+  if (*cp == '-' || *cp == '.')
+    ++cp;
+  strlcpy(out->status_tag, cp, sizeof(out->status_tag));
+  if (0==strcmp(cp, "cvs") && out->major == 0 && out->minor == 0) {
     out->cvs = IS_CVS;
   } else {
-    return -1;
+    out->cvs = IS_NOT_CVS;
   }
 
   return 0;
@@ -1511,9 +1513,11 @@
     return i;
   else if ((i = a->patchlevel - b->patchlevel))
     return i;
-  else if ((i = a->cvs - b->cvs))
-    return i;
-  else
-    return 0;
+
+  if (a->major > 0 || a->minor > 0) {
+    return strcmp(a->status_tag, b->status_tag);
+  } else {
+    return (a->cvs - b->cvs);
+  }
 }
 

Index: test.c
===================================================================
RCS file: /home/or/cvsroot/tor/src/or/test.c,v
retrieving revision 1.154
retrieving revision 1.155
diff -u -d -r1.154 -r1.155
--- test.c	29 Nov 2004 22:25:30 -0000	1.154
+++ test.c	29 Nov 2004 23:04:26 -0000	1.155
@@ -1157,6 +1157,22 @@
   test_eq(VER_RELEASE, ver1.status);
   test_eq(999, ver1.patchlevel);
   test_eq(IS_NOT_CVS, ver1.cvs);
+  test_eq(0, tor_version_parse("0.1.2.4-alpha", &ver1));
+  test_eq(0, ver1.major);
+  test_eq(1, ver1.minor);
+  test_eq(2, ver1.micro);
+  test_eq(4, ver1.patchlevel);
+  test_eq(VER_RELEASE, ver1.status);
+  test_eq(IS_NOT_CVS, ver1.cvs);
+  test_streq("alpha", ver1.status_tag);
+  test_eq(0, tor_version_parse("0.1.2.4", &ver1));
+  test_eq(0, ver1.major);
+  test_eq(1, ver1.minor);
+  test_eq(2, ver1.micro);
+  test_eq(4, ver1.patchlevel);
+  test_eq(VER_RELEASE, ver1.status);
+  test_eq(IS_NOT_CVS, ver1.cvs);
+  test_streq("", ver1.status_tag);
 
   /* make sure is_obsolete_version() works */
   test_eq(1, is_obsolete_version("0.0.1", "Tor 0.0.2"));