File commitid.diff of Package cvsps

diff --git a/cache.c b/cache.c
index 5f67a7c..762cfb7 100644
--- a/cache.c
+++ b/cache.c
@@ -89,6 +89,7 @@ enum
     CACHE_NEED_PS_TAG_FLAGS,
     CACHE_NEED_PS_BRANCH,
     CACHE_NEED_PS_BRANCH_ADD,
+    CACHE_NEED_PS_COMMITID_OR_DESCR,
     CACHE_NEED_PS_DESCR,
     CACHE_NEED_PS_EOD,
     CACHE_NEED_PS_MEMBERS,
@@ -108,6 +109,7 @@ time_t read_cache()
     int tag_flags = 0;
     char branchbuff[LOG_STR_MAX] = "";
     int branch_add = 0;
+    char cidbuff[CID_STR_MAX] = "";
     int logbufflen = LOG_STR_MAX + 1;
     char * logbuff = malloc(logbufflen);
     time_t cache_date = -1;
@@ -286,9 +288,19 @@ time_t read_cache()
 		/* remove prefix "branch_add: " and LF from len */
 		len -= 12;
 		branch_add = atoi(buff + 12);
-		state = CACHE_NEED_PS_DESCR;
+		state = CACHE_NEED_PS_COMMITID_OR_DESCR;
 	    }
 	    break;
+	case CACHE_NEED_PS_COMMITID_OR_DESCR:
+	    if (strncmp(buff, "commitid:", 9) == 0)
+	    {
+		/* remove prefix "commitid: " and LF from len */
+		len -= 10;
+		strzncpy(cidbuff, buff + 10, MIN(len, CID_STR_MAX));
+		state = CACHE_NEED_PS_DESCR;
+		break;
+	    }
+	    /* FALLTHROUGH */
 	case CACHE_NEED_PS_DESCR:
 	    if (strncmp(buff, "descr:", 6) == 0)
 		state = CACHE_NEED_PS_EOD;
@@ -296,8 +308,8 @@ time_t read_cache()
 	case CACHE_NEED_PS_EOD:
 	    if (strcmp(buff, CACHE_DESCR_BOUNDARY) == 0)
 	    {
-		debug(DEBUG_STATUS, "patch set %s %s %s %s", datebuff, authbuff, logbuff, branchbuff);
-		ps = get_patch_set(datebuff, logbuff, authbuff, branchbuff, NULL);
+		debug(DEBUG_STATUS, "patch set %s %s %s %s %s", datebuff, authbuff, logbuff, branchbuff, cidbuff);
+		ps = get_patch_set(datebuff, logbuff, authbuff, branchbuff, cidbuff, NULL);
 		/* the tag and tag_flags will be assigned by the resolve_global_symbols code 
 		 * ps->tag = (strlen(tagbuff)) ? get_string(tagbuff) : NULL;
 		 * ps->tag_flags = tag_flags;
@@ -336,6 +348,7 @@ time_t read_cache()
 		tag_flags = 0;
 		branchbuff[0] = 0;
 		branch_add = 0;
+		cidbuff[0] = 0;
 		logbuff[0] = 0;
 		state = CACHE_NEED_PS;
 	    }
@@ -523,6 +536,8 @@ static void dump_patch_set(FILE * fp, PatchSet * ps)
     fprintf(fp, "tag_flags: %d\n", ps->tag_flags);
     fprintf(fp, "branch: %s\n", ps->branch);
     fprintf(fp, "branch_add: %d\n", ps->branch_add);
+    if (ps->commitid[0])
+	fprintf(fp, "commitid: %s\n", ps->commitid);
     fprintf(fp, "descr:\n%s", ps->descr); /* descr is guaranteed to end with LF */
     fprintf(fp, CACHE_DESCR_BOUNDARY);
     fprintf(fp, "members:\n");
diff --git a/cvsps.c b/cvsps.c
index 981cd78..b91f0c7 100644
--- a/cvsps.c
+++ b/cvsps.c
@@ -268,6 +268,7 @@ static void load_from_cvs()
     PatchSetMember * psm = NULL;
     char datebuff[20];
     char authbuff[AUTH_STR_MAX];
+    char cidbuff[CID_STR_MAX];
     int logbufflen = LOG_STR_MAX + 1;
     char * logbuff = malloc(logbufflen);
     int loglen = 0;
@@ -466,6 +467,19 @@ static void load_from_cvs()
 			    psm->post_rev->dead = 1;
 		}
 
+		cidbuff[0] = 0;
+		p = strstr(buff, "commitid: ");
+		if (p)
+		{
+		    char * op;
+		    p += 10;
+		    op = strchr(p, ';');
+		    if (op)
+		    {
+			strzncpy(cidbuff, p, op - p + 1);
+		    }
+		}
+		
 		state = NEED_EOM;
 	    }
 	    break;
@@ -474,7 +488,7 @@ static void load_from_cvs()
 	    {
 		if (psm)
 		{
-		    PatchSet * ps = get_patch_set(datebuff, logbuff, authbuff, psm->post_rev->branch, psm);
+		    PatchSet * ps = get_patch_set(datebuff, logbuff, authbuff, psm->post_rev->branch, cidbuff, psm);
 		    patch_set_add_member(ps, psm);
 		}
 
@@ -487,7 +501,7 @@ static void load_from_cvs()
 	    {
 		if (psm)
 		{
-		    PatchSet * ps = get_patch_set(datebuff, logbuff, authbuff, psm->post_rev->branch, psm);
+		    PatchSet * ps = get_patch_set(datebuff, logbuff, authbuff, psm->post_rev->branch, cidbuff, psm);
 		    patch_set_add_member(ps, psm);
 		    assign_pre_revision(psm, NULL);
 		}
@@ -1199,7 +1213,7 @@ static CvsFile * build_file_by_name(const char * fn)
     return retval;
 }
 
-PatchSet * get_patch_set(const char * dte, const char * log, const char * author, const char * branch, PatchSetMember * psm)
+PatchSet * get_patch_set(const char * dte, const char * log, const char * author, const char * branch, const char *commitid, PatchSetMember * psm)
 {
     PatchSet * retval = NULL, **find = NULL;
     int (*cmp1)(const void *,const void*) = (bkcvs) ? compare_patch_sets_bk : compare_patch_sets;
@@ -1212,6 +1226,7 @@ PatchSet * get_patch_set(const char * dte, const char * log, const char * author
 
     convert_date(&retval->date, dte);
     retval->author = get_string(author);
+    retval->commitid = get_string(commitid);
     retval->descr = xstrdup(log);
     retval->branch = get_string(branch);
     
@@ -1267,7 +1282,7 @@ PatchSet * get_patch_set(const char * dte, const char * log, const char * author
     else
     {
 	debug(DEBUG_STATUS, "new patch set!");
-	debug(DEBUG_STATUS, "%s %s %s", retval->author, retval->descr, dte);
+	debug(DEBUG_STATUS, "%s %s %s %s", retval->author, retval->descr, retval->commitid, dte);
 
 	retval->min_date = retval->date - timestamp_fuzz_factor;
 	retval->max_date = retval->date + timestamp_fuzz_factor;
@@ -1639,7 +1654,7 @@ static int compare_patch_sets(const void * v_ps1, const void * v_ps2)
     int ret;
     time_t d, min, max;
 
-    /* We order by (author, descr, branch, members, date), but because of the fuzz factor
+    /* We order by (author, descr, branch, commitid, members, date), but because of the fuzz factor
      * we treat times within a certain distance as equal IFF the author
      * and descr match.
      */
@@ -1656,6 +1671,10 @@ static int compare_patch_sets(const void * v_ps1, const void * v_ps2)
     if (ret)
 	return ret;
 
+    ret = strcmp(ps1->commitid, ps2->commitid);
+    if (ret)
+	return ret;
+
     ret = compare_patch_sets_by_members(ps1, ps2);
     if (ret)
 	return ret;
@@ -1724,6 +1743,10 @@ static int compare_patch_sets_bytime(const PatchSet * ps1, const PatchSet * ps2)
 	return ret;
 
     ret = strcmp(ps1->branch, ps2->branch);
+    if (ret)
+	return ret;
+
+    ret = strcmp(ps1->commitid, ps2->commitid);
     return ret;
 }
 
@@ -2072,6 +2095,7 @@ static PatchSet * create_patch_set()
 	ps->tag = NULL;
 	ps->tag_flags = 0;
 	ps->branch_add = 0;
+	ps->commitid = "";
 	ps->funk_factor = 0;
 	ps->ancestor_branch = NULL;
 	CLEAR_LIST_NODE(&ps->collision_link);
diff --git a/cvsps.h b/cvsps.h
index 280a253..2638ebe 100644
--- a/cvsps.h
+++ b/cvsps.h
@@ -25,7 +25,7 @@ CvsFile * create_cvsfile();
 CvsFileRevision * cvs_file_add_revision(CvsFile *, const char *);
 void cvs_file_add_symbol(CvsFile * file, const char * rev, const char * tag);
 char * cvs_file_add_branch(CvsFile *, const char *, const char *);
-PatchSet * get_patch_set(const char *, const char *, const char *, const char *, PatchSetMember *);
+PatchSet * get_patch_set(const char *, const char *, const char *, const char *, const char *, PatchSetMember *);
 PatchSetMember * create_patch_set_member();
 CvsFileRevision * file_get_revision(CvsFile *, const char *);
 void patch_set_add_member(PatchSet * ps, PatchSetMember * psm);
diff --git a/cvsps_types.h b/cvsps_types.h
index dba145d..f3cc33f 100644
--- a/cvsps_types.h
+++ b/cvsps_types.h
@@ -10,6 +10,7 @@
 
 #define LOG_STR_MAX 65536
 #define AUTH_STR_MAX 64
+#define CID_STR_MAX 64
 #define REV_STR_MAX 64
 #define MIN(a, b) ((a) < (b) ? (a) : (b))
 #define MAX(a, b) ((a) > (b) ? (a) : (b))
@@ -113,6 +114,7 @@ struct _PatchSet
     char *descr;
     char *author;
     char *tag;
+    char *commitid;
     int tag_flags;
     char *branch;
     char *ancestor_branch;