[webkit-dev] Using cvsps-2.1 with WebKit

David D. Kilzer ddkilzer at kilzer.net
Tue Jun 21 12:09:21 PDT 2005


If anyone is interested in using cvsps-2.1 to pull patchsets (or
patchset info) from CVS for WebKit (very handy for backing out entire
commits using "patch --reverse"), I created a couple of patches to fix
issues I found when running cvsps against anoncvs.opensource.apple.com.

  http://www.cobite.com/cvsps/

The attached patches do the following:

  cvsps-2.1-alloc-logbuff-dynamically.diff
    - Dynamically allocate a char* buffer for log entries.  Previously,
      at least one of the log entries in WebCore was being truncated
      because it was longer than 32K.

  cvsps-2.1-ignore-TRUNK-branch.diff
    - Ignore the TRUNK pseudo-branch when reading in revisions for a
      file.

If you're using fink, the cvsps.info and cvsps.patch files may be
downloaded from here:

  http://sourceforge.net/tracker/index.php?func=detail&aid=1098684&group_id=17203&atid=414256

The patches have also been posted to the Debian Bug Tracking System and
sent to the author.

Dave
-------------- next part --------------
diff -urN cvsps-2.1.orig/cache.c cvsps-2.1/cache.c
--- cvsps-2.1.orig/cache.c	2005-05-25 22:39:40.000000000 -0500
+++ cvsps-2.1/cache.c	2005-06-19 21:41:25.000000000 -0500
@@ -108,10 +108,19 @@
     int tag_flags = 0;
     char branchbuff[LOG_STR_MAX] = "";
     int branch_add = 0;
-    char logbuff[LOG_STR_MAX] = "";
+    int logbufflen = LOG_STR_MAX + 1;
+    char * logbuff = malloc(logbufflen);
     time_t cache_date = -1;
     int read_version;
 
+    if (logbuff == NULL)
+    {
+	debug(DEBUG_SYSERROR, "could not malloc %d bytes for logbuff in read_cache", logbufflen);
+	exit(1);
+    }
+
+    logbuff[0] = 0;
+
     if (!(fp = cache_open("r")))
 	goto out;
 
@@ -299,8 +308,19 @@
 	    else
 	    {
 		/* Make sure we have enough in the buffer */
-		if (strlen(logbuff)+strlen(buff)<LOG_STR_MAX)
-		    strcat(logbuff, buff);
+		int len = strlen(buff);
+		if (strlen(logbuff) + len >= LOG_STR_MAX)
+		{
+		    logbufflen += (len > LOG_STR_MAX ? len : LOG_STR_MAX);
+		    char * newlogbuff = realloc(logbuff, logbufflen);
+		    if (newlogbuff == NULL)
+		    {
+			debug(DEBUG_SYSERROR, "could not realloc %d bytes for logbuff in read_cache", logbufflen);
+			exit(1);
+		    }
+		    logbuff = newlogbuff;
+		}
+		strcat(logbuff, buff);
 	    }
 	    break;
 	case CACHE_NEED_PS_MEMBERS:
@@ -332,6 +352,7 @@
  out_close:
     fclose(fp);
  out:
+    free(logbuff);
     return cache_date;
 }
 
diff -urN cvsps-2.1.orig/cvsps.c cvsps-2.1/cvsps.c
--- cvsps-2.1.orig/cvsps.c	2005-05-25 22:39:40.000000000 -0500
+++ cvsps-2.1/cvsps.c	2005-06-19 23:07:20.000000000 -0500
@@ -265,7 +265,8 @@
     PatchSetMember * psm = NULL;
     char datebuff[20];
     char authbuff[AUTH_STR_MAX];
-    char logbuff[LOG_STR_MAX + 1];
+    int logbufflen = LOG_STR_MAX + 1;
+    char * logbuff = malloc(logbufflen);
     int loglen = 0;
     int have_log = 0;
     char cmd[BUFSIZ];
@@ -273,6 +274,12 @@
     char use_rep_buff[PATH_MAX];
     char * ltype;
 
+    if (logbuff == NULL)
+    {
+	debug(DEBUG_SYSERROR, "could not malloc %d bytes for logbuff in load_from_cvs", logbufflen);
+	exit(1);
+    }
+
     if (!no_rlog && !test_log_file && cvs_check_cap(CAP_HAVE_RLOG))
     {
 	ltype = "rlog";
@@ -480,24 +487,22 @@
 		 */
 		if (have_log || !is_revision_metadata(buff))
 		{
-		    /* if the log buffer is full, that's it.  
-		     * 
-		     * Also, read lines (fgets) always have \n in them
-		     * which we count on.  So if truncation happens,
-		     * be careful to put a \n on.
-		     * 
-		     * Buffer has LOG_STR_MAX + 1 for room for \0 if
-		     * necessary
-		     */
-		    if (loglen < LOG_STR_MAX)
+		    /* If the log buffer is full, try to reallocate more. */
+		    if (loglen < logbufflen)
 		    {
 			int len = strlen(buff);
 			
-			if (len >= LOG_STR_MAX - loglen)
+			if (len >= logbufflen - loglen)
 			{
-			    debug(DEBUG_APPMSG1, "WARNING: maximum log length exceeded, truncating log");
-			    len = LOG_STR_MAX - loglen;
-			    buff[len - 1] = '\n';
+			    debug(DEBUG_STATUS, "reallocating logbufflen to %d bytes for file %s", logbufflen, file->filename);
+			    logbufflen += (len > LOG_STR_MAX ? len : LOG_STR_MAX);
+			    char * newlogbuff = realloc(logbuff, logbufflen);
+			    if (newlogbuff == NULL)
+			    {
+				debug(DEBUG_SYSERROR, "could not realloc %d bytes for logbuff in load_from_cvs", logbufflen);
+				exit(1);
+			    }
+			    logbuff = newlogbuff;
 			}
 
 			debug(DEBUG_STATUS, "appending %s to log", buff);
-------------- next part --------------
diff -urN cvsps-2.1.orig/cvsps.c cvsps-2.1/cvsps.c
--- cvsps-2.1.orig/cvsps.c	2005-05-25 22:39:40.000000000 -0500
+++ cvsps-2.1/cvsps.c	2005-06-19 23:07:20.000000000 -0500
@@ -2104,6 +2109,11 @@
     
     if (!get_branch_ext(rev, eot, &leaf))
     {
+	if (strcmp(tag, "TRUNK") == 0)
+	{
+	    debug(DEBUG_STATUS, "ignoring the TRUNK branch/tag");
+	    return;
+	}
 	debug(DEBUG_APPERROR, "malformed revision");
 	exit(1);
     }


More information about the webkit-dev mailing list