svn commit: r185592 - projects/csup_cvsmode/contrib/csup
Ulf Lilleengen
lulf at FreeBSD.org
Wed Dec 3 14:47:34 PST 2008
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;
More information about the svn-src-projects
mailing list