Date: Wed, 3 Dec 2008 22:47:33 +0000 (UTC) From: Ulf Lilleengen <lulf@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r185592 - projects/csup_cvsmode/contrib/csup Message-ID: <200812032247.mB3MlX8o003646@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: lulf Date: Wed Dec 3 22:47:33 2008 New Revision: 185592 URL: http://svn.freebsd.org/changeset/base/185592 Log: A few bugfixes: - Instead of including protocol info in diffs, strip them before adding deltatext and take this into account when applying the diff later. - Don't use strlen when the string in the RCS file may contain garbage. This got caught in the checksumming before, but was not fixed until now. Instead of using strlen, pass the token length when adding log and text entries to a delta. Add an extra length parameter to duptext() to record the token length. - When adding new branches to a file, add them in at the tail instead of the head of the list to get correct ordering when writing out. - Input stream when diffing was opened twice. - Don't expand keywords in diffs between deltas. Modified: projects/csup_cvsmode/contrib/csup/diff.c projects/csup_cvsmode/contrib/csup/rcsfile.c projects/csup_cvsmode/contrib/csup/rcsfile.h projects/csup_cvsmode/contrib/csup/rcsparse.c projects/csup_cvsmode/contrib/csup/updater.c Modified: projects/csup_cvsmode/contrib/csup/diff.c ============================================================================== --- projects/csup_cvsmode/contrib/csup/diff.c Wed Dec 3 20:28:32 2008 (r185591) +++ projects/csup_cvsmode/contrib/csup/diff.c Wed Dec 3 22:47:33 2008 (r185592) @@ -140,10 +140,10 @@ diff_apply(struct stream *rd, struct str } line = stream_getln(rd, NULL); } - if (line == NULL) + if (comode && line == NULL) return (-1); /* If we got ".+", there's no ending newline. */ - if (strcmp(line, ".+") == 0 && !empty) + if (comode && strcmp(line, ".+") == 0 && !empty) noeol = 1; ec.where = 0; while ((line = stream_getln(orig, &size)) != NULL) Modified: projects/csup_cvsmode/contrib/csup/rcsfile.c ============================================================================== --- projects/csup_cvsmode/contrib/csup/rcsfile.c Wed Dec 3 20:28:32 2008 (r185591) +++ projects/csup_cvsmode/contrib/csup/rcsfile.c Wed Dec 3 22:47:33 2008 (r185592) @@ -204,7 +204,7 @@ rcsfile_frompath(char *path, char *name, rf->branch = NULL; rf->strictlock = 0; rf->comment = NULL; - rf->expand = -1; + rf->expand = EXPAND_DEFAULT; rf->desc = NULL; infp = fopen(path, "r"); @@ -263,7 +263,7 @@ rcsfile_send_details(struct rcsfile *rf, if (error) return(error); /* Write expand. */ - if (rf->expand >= 0) { + if (rf->expand != EXPAND_DEFAULT) { error = proto_printf(wr, "E %s\n", keyword_encode_expand(rf->expand)); if (error) @@ -561,7 +561,6 @@ rcsfile_puttext(struct rcsfile *rf, stru error = -1; goto cleanup; } - rd = stream_open_buf(diffbase->text); di->di_rcsfile = rf->name; di->di_cvsroot = rf->cvsroot; di->di_revnum = d->revnum; @@ -569,9 +568,9 @@ rcsfile_puttext(struct rcsfile *rf, stru di->di_author = d->author; di->di_tag = rf->colltag; di->di_state = d->state; - di->di_expand = rf->expand; + di->di_expand = EXPAND_OLD; k = keyword_new(); - + rd = stream_open_buf(diffbase->text); error = diff_reverse(rd, orig, dest, k, di); if (error) { @@ -634,7 +633,7 @@ rcsfile_getdeltatext(struct rcsfile *rf, di->di_author = d->author; di->di_tag = rf->colltag; di->di_state = d->state; - di->di_expand = rf->expand; + di->di_expand = EXPAND_OLD; rd = stream_open_buf(d->text); k = keyword_new(); error = diff_apply(rd, orig, dest, k, di, 0); @@ -1010,7 +1009,7 @@ rcsfile_addelta(struct rcsfile *rf, char b = xmalloc(sizeof(struct branch)); b->revnum = brev; LIST_INIT(&b->deltalist); - STAILQ_INSERT_HEAD(&d_bp->branchlist, b, branch_next); + STAILQ_INSERT_TAIL(&d_bp->branchlist, b, branch_next); } /* Insert both into the tree, and into the lookup list. */ @@ -1222,32 +1221,35 @@ rcsfile_insertdelta(struct branch *b, st /* Add logtext to a delta. Assume the delta already exists. */ int -rcsdelta_addlog(struct delta *d, char *log) +rcsdelta_addlog(struct delta *d, char *log, int len) { struct stream *dest; assert(d != NULL); + /* Strip away '@' at beginning and end. */ log++; - log[strlen(log) - 1] = '\0'; - + len--; + log[len - 1] = '\0'; dest = stream_open_buf(d->log); - stream_write(dest, log, strlen(log)); + stream_write(dest, log, len - 1); stream_close(dest); return (0); } /* Add deltatext to a delta. Assume the delta already exists. */ int -rcsdelta_addtext(struct delta *d, char *text) +rcsdelta_addtext(struct delta *d, char *text, int len) { struct stream *dest; assert(d != NULL); + /* Strip away '@' at beginning and end. */ text++; - text[strlen(text) - 1] = '\0'; + len--; + text[len - 1] = '\0'; dest = stream_open_buf(d->text); - stream_write(dest, text, strlen(text)); + stream_write(dest, text, len - 1); stream_close(dest); return (0); } Modified: projects/csup_cvsmode/contrib/csup/rcsfile.h ============================================================================== --- projects/csup_cvsmode/contrib/csup/rcsfile.h Wed Dec 3 20:28:32 2008 (r185591) +++ projects/csup_cvsmode/contrib/csup/rcsfile.h Wed Dec 3 22:47:33 2008 (r185592) @@ -63,8 +63,8 @@ struct delta *rcsfile_addelta(struct rcs void rcsfile_importdelta(struct rcsfile *, char *, char *, char *, char *, char *); -int rcsdelta_addlog(struct delta *, char *); -int rcsdelta_addtext(struct delta *, char *); +int rcsdelta_addlog(struct delta *, char *, int); +int rcsdelta_addtext(struct delta *, char *, int); void rcsdelta_appendlog(struct delta *, char *, size_t); void rcsdelta_appendtext(struct delta *, char *, size_t); void rcsdelta_setstate(struct delta *, char *); Modified: projects/csup_cvsmode/contrib/csup/rcsparse.c ============================================================================== --- projects/csup_cvsmode/contrib/csup/rcsparse.c Wed Dec 3 20:28:32 2008 (r185591) +++ projects/csup_cvsmode/contrib/csup/rcsparse.c Wed Dec 3 22:47:33 2008 (r185592) @@ -45,7 +45,7 @@ static void asserttoken(yyscan_t *, int) static int parse_admin(struct rcsfile *, yyscan_t *); static int parse_deltas(struct rcsfile *, yyscan_t *, int); static int parse_deltatexts(struct rcsfile *, yyscan_t *, int); -static char *duptext(yyscan_t *); +static char *duptext(yyscan_t *, int *); struct string { char *str; @@ -63,15 +63,18 @@ asserttoken(yyscan_t *sp, int token) } static char * -duptext(yyscan_t *sp) +duptext(yyscan_t *sp, int *arglen) { char *tmp, *val; int len; tmp = rcsget_text(*sp); len = rcsget_leng(*sp); - val = xmalloc(len + 2); - strlcpy(val, tmp, len + 1); + val = xmalloc(len + 1); + memcpy(val, tmp, len); + val[len] = '\0'; + if (arglen != NULL) + *arglen = len; return (val); } @@ -92,7 +95,7 @@ rcsparse_run(struct rcsfile *rf, FILE *i tok = parse_deltas(rf, &scanner, tok); assert(tok == KEYWORD); asserttoken(&scanner, STRING); - desc = duptext(&scanner); + desc = duptext(&scanner, NULL); rcsfile_setval(rf, RCSFILE_DESC, desc); free(desc); tok = rcslex(scanner); @@ -118,7 +121,7 @@ parse_admin(struct rcsfile *rf, yyscan_t /* head {num}; */ asserttoken(sp, KEYWORD); asserttoken(sp, NUM); - head = duptext(sp); + head = duptext(sp, NULL); rcsfile_setval(rf, RCSFILE_HEAD, head); free(head); asserttoken(sp, SEMIC); @@ -127,7 +130,7 @@ parse_admin(struct rcsfile *rf, yyscan_t token = rcslex(*sp); if (token == KEYWORD_TWO) { asserttoken(sp, NUM); - branch = duptext(sp); + branch = duptext(sp, NULL); rcsfile_setval(rf, RCSFILE_BRANCH, branch); free(branch); asserttoken(sp, SEMIC); @@ -138,7 +141,7 @@ parse_admin(struct rcsfile *rf, yyscan_t assert(token == KEYWORD); token = rcslex(*sp); while (token == ID) { - id = duptext(sp); + id = duptext(sp, NULL); rcsfile_addaccess(rf, id); free(id); token = rcslex(*sp); @@ -149,10 +152,10 @@ parse_admin(struct rcsfile *rf, yyscan_t asserttoken(sp, KEYWORD); token = rcslex(*sp); while (token == ID) { - tag = duptext(sp); + tag = duptext(sp, NULL); asserttoken(sp, COLON); asserttoken(sp, NUM); - revnum = duptext(sp); + revnum = duptext(sp, NULL); rcsfile_importtag(rf, tag, revnum); free(tag); free(revnum); @@ -182,7 +185,7 @@ parse_admin(struct rcsfile *rf, yyscan_t } else if (!strcmp(tmp, "comment")) { token = rcslex(*sp); if (token == STRING) { - comment = duptext(sp); + comment = duptext(sp, NULL); rcsfile_setval(rf, RCSFILE_COMMENT, comment); free(comment); } @@ -191,7 +194,7 @@ parse_admin(struct rcsfile *rf, yyscan_t } else if (!strcmp(tmp, "expand")) { token = rcslex(*sp); if (token == STRING) { - expand = duptext(sp); + expand = duptext(sp, NULL); rcsfile_setval(rf, RCSFILE_EXPAND, expand); free(expand); } @@ -231,22 +234,22 @@ parse_deltas(struct rcsfile *rf, yyscan_ /* num */ assert(token == NUM); - revnum = duptext(sp); + revnum = duptext(sp, NULL); /* date num; */ asserttoken(sp, KEYWORD); asserttoken(sp, NUM); - revdate = duptext(sp); + revdate = duptext(sp, NULL); asserttoken(sp, SEMIC); /* author id; */ asserttoken(sp, KEYWORD); asserttoken(sp, ID); - author = duptext(sp); + author = duptext(sp, NULL); asserttoken(sp, SEMIC); /* state {id}; */ asserttoken(sp, KEYWORD); token = rcslex(*sp); if (token == ID) { - state = duptext(sp); + state = duptext(sp, NULL); token = rcslex(*sp); } assert(token == SEMIC); @@ -261,7 +264,7 @@ parse_deltas(struct rcsfile *rf, yyscan_ asserttoken(sp, KEYWORD); token = rcslex(*sp); if (token == NUM) { - next = duptext(sp); + next = duptext(sp, NULL); token = rcslex(*sp); } assert(token == SEMIC); @@ -298,7 +301,7 @@ parse_deltatexts(struct rcsfile *rf, yys { struct delta *d; char *log, *revnum, *text; - int error; + int error, len; error = 0; /* In case we don't have deltatexts. */ @@ -307,7 +310,7 @@ parse_deltatexts(struct rcsfile *rf, yys do { /* num */ assert(token == NUM); - revnum = duptext(sp); + revnum = duptext(sp, NULL); /* Get delta we're adding text to. */ d = rcsfile_getdelta(rf, revnum); free(revnum); @@ -315,8 +318,8 @@ parse_deltatexts(struct rcsfile *rf, yys /* log string */ asserttoken(sp, KEYWORD); asserttoken(sp, STRING); - log = duptext(sp); - error = rcsdelta_addlog(d, log); + log = duptext(sp, &len); + error = rcsdelta_addlog(d, log, len); free(log); if (error) return (-1); @@ -335,8 +338,8 @@ parse_deltatexts(struct rcsfile *rf, yys /* text string */ assert(token == KEYWORD); asserttoken(sp, STRING); - text = duptext(sp); - error = rcsdelta_addtext(d, text); + text = duptext(sp, &len); + error = rcsdelta_addtext(d, text, len); /* * If this happens, something is wrong with the RCS file, and it * should be resent. Modified: projects/csup_cvsmode/contrib/csup/updater.c ============================================================================== --- projects/csup_cvsmode/contrib/csup/updater.c Wed Dec 3 20:28:32 2008 (r185591) +++ projects/csup_cvsmode/contrib/csup/updater.c Wed Dec 3 22:47:33 2008 (r185592) @@ -1724,7 +1724,6 @@ updater_addelta(struct rcsfile *rf, stru { struct delta *d; size_t size; - int stop; char *author, *cmd, *diffbase, *line, *logline; char *revdate, *revnum, *state, *textline; @@ -1780,15 +1779,15 @@ updater_addelta(struct rcsfile *rf, stru break; case 'T': /* Do the same as in 'C' command. */ - stop = 0; textline = stream_getln(rd, &size); while (textline != NULL) { if (size == 2 && *textline == '.') - stop = 1; + break; if (size == 3 && memcmp(textline, ".+", 2) == 0) { /* Truncate newline. */ - stop = 1; + rcsdelta_truncatetext(d, -1); + break; } if (size >= 3 && memcmp(textline, "..", 2) == 0) { @@ -1796,8 +1795,6 @@ updater_addelta(struct rcsfile *rf, stru textline++; } rcsdelta_appendtext(d, textline, size); - if (stop) - break; textline = stream_getln(rd, &size); } break;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200812032247.mB3MlX8o003646>