aboutsummaryrefslogtreecommitdiff
path: root/contrib/csup
diff options
context:
space:
mode:
authorUlf Lilleengen <lulf@FreeBSD.org>2009-01-02 12:40:58 +0000
committerUlf Lilleengen <lulf@FreeBSD.org>2009-01-02 12:40:58 +0000
commitc81ea6003cebe1abfefa803db16c180409eb426b (patch)
treef553a0280d902cb49fd2c1b3dac838af19672bf9 /contrib/csup
parente0f42fb9828fc9bbfd064584ea128ac1ed761d58 (diff)
Notes
Diffstat (limited to 'contrib/csup')
-rw-r--r--contrib/csup/detailer.c2
-rw-r--r--contrib/csup/rcsfile.c34
-rw-r--r--contrib/csup/rcsfile.h2
-rw-r--r--contrib/csup/rcsparse.c11
-rw-r--r--contrib/csup/rcsparse.h2
-rw-r--r--contrib/csup/updater.c2
6 files changed, 36 insertions, 17 deletions
diff --git a/contrib/csup/detailer.c b/contrib/csup/detailer.c
index 20436c6a2129..c03d6d239c96 100644
--- a/contrib/csup/detailer.c
+++ b/contrib/csup/detailer.c
@@ -432,7 +432,7 @@ detailer_dofile_rcs(struct detailer *d, struct coll *coll, char *name,
return (0);
}
- rf = rcsfile_frompath(path, name, coll->co_cvsroot, coll->co_tag);
+ rf = rcsfile_frompath(path, name, coll->co_cvsroot, coll->co_tag, 1);
free(path);
if (rf == NULL) {
error = proto_printf(wr, "A %s\n", name);
diff --git a/contrib/csup/rcsfile.c b/contrib/csup/rcsfile.c
index ca9d58f3ff71..177ef1757e78 100644
--- a/contrib/csup/rcsfile.c
+++ b/contrib/csup/rcsfile.c
@@ -119,6 +119,7 @@ struct rcsfile {
int strictlock;
char *comment;
int expand;
+ int ro;
struct branch *trunk; /* The tip delta. */
LIST_HEAD(, delta) deltatable;
@@ -153,6 +154,7 @@ const char *state_space = "\t";
const char *next_space = "\t";
const char *branches_space = "\t";
const char *comment_space ="\t";
+const char *expand_space = "\t";
void print_stream(struct stream *);
@@ -174,7 +176,7 @@ print_stream(struct stream *s)
* Parse rcsfile from path and return a pointer to it.
*/
struct rcsfile *
-rcsfile_frompath(char *path, char *name, char *cvsroot, char *colltag)
+rcsfile_frompath(char *path, char *name, char *cvsroot, char *colltag, int ro)
{
struct rcsfile *rf;
FILE *infp;
@@ -206,6 +208,7 @@ rcsfile_frompath(char *path, char *name, char *cvsroot, char *colltag)
rf->comment = NULL;
rf->expand = EXPAND_DEFAULT;
rf->desc = NULL;
+ rf->ro = ro;
infp = fopen(path, "r");
if (infp == NULL) {
@@ -213,7 +216,7 @@ rcsfile_frompath(char *path, char *name, char *cvsroot, char *colltag)
rcsfile_free(rf);
return (NULL);
}
- error = rcsparse_run(rf, infp);
+ error = rcsparse_run(rf, infp, ro);
fclose(infp);
if (error) {
lprintf(-1, "Error parsing \"%s\"\n", name);
@@ -343,6 +346,9 @@ rcsfile_write(struct rcsfile *rf, struct stream *dest)
/* Write out the comment. */
if (rf->comment != NULL)
stream_printf(dest, "comment%s%s;\n", comment_space, rf->comment);
+ if (rf->expand != EXPAND_DEFAULT)
+ stream_printf(dest, "expand%s@%s@;\n", expand_space,
+ keyword_encode_expand(rf->expand));
stream_printf(dest, "\n\n");
@@ -694,7 +700,7 @@ rcsfile_print(struct rcsfile *rf)
lprintf(1, "Strict!\n");
if (rf->comment != NULL)
lprintf(1, "comment: '%s'\n", rf->comment);
- if (rf->expand >= 0)
+ if (rf->expand != EXPAND_DEFAULT);
lprintf(1, "expand: '%s'\n", keyword_encode_expand(rf->expand));
/* Print all deltas. */
@@ -769,7 +775,8 @@ rcsfile_free(struct rcsfile *rf)
/* Free all deltas in global list */
while (!LIST_EMPTY(&rf->deltatable)) {
d = LIST_FIRST(&rf->deltatable);
- LIST_REMOVE(d, delta_next);
+ if (!rf->ro)
+ LIST_REMOVE(d, delta_next);
LIST_REMOVE(d, table_next);
rcsfile_freedelta(d);
}
@@ -871,7 +878,8 @@ rcsfile_deleterev(struct rcsfile *rf, char *revname)
struct delta *d;
d = rcsfile_getdelta(rf, revname);
- LIST_REMOVE(d, delta_next);
+ if (!rf->ro)
+ LIST_REMOVE(d, delta_next);
LIST_REMOVE(d, table_next);
rcsfile_freedelta(d);
}
@@ -1065,6 +1073,17 @@ rcsfile_importdelta(struct rcsfile *rf, char *revnum, char *revdate, char *autho
d_next->diffbase = d;
}
+ /* If we're opening read-only, do minimal work. */
+ if (rf->ro) {
+ if (!d->placeholder)
+ rcsfile_insertsorteddelta(rf, d);
+ else
+ d->placeholder = 0;
+ if (d_next != NULL)
+ rcsfile_insertsorteddelta(rf, d_next);
+ return;
+ }
+
/* If it's trunk, insert it in the head branch list. */
b = rcsrev_istrunk(d->revnum) ? rf->trunk : rcsfile_getbranch(rf,
d->revnum);
@@ -1152,10 +1171,7 @@ rcsfile_getbranch(struct rcsfile *rf, char *revnum)
return (NULL);
}
-/*
- * Insert a delta into the correct place in the table of the rcsfile. Sorted by
- * date.
- */
+/* Insert a delta into the correct place in the table of the rcsfile. */
static void
rcsfile_insertsorteddelta(struct rcsfile *rf, struct delta *d)
{
diff --git a/contrib/csup/rcsfile.h b/contrib/csup/rcsfile.h
index 83887c7844a4..a2c3f710d0a4 100644
--- a/contrib/csup/rcsfile.h
+++ b/contrib/csup/rcsfile.h
@@ -42,7 +42,7 @@ struct delta;
struct stream;
/* Fetching, sending and writing an RCS file. */
-struct rcsfile *rcsfile_frompath(char *, char *, char *, char *);
+struct rcsfile *rcsfile_frompath(char *, char *, char *, char *, int);
int rcsfile_send_details(struct rcsfile *, struct stream *);
int rcsfile_write(struct rcsfile *, struct stream *);
void rcsfile_print(struct rcsfile *);
diff --git a/contrib/csup/rcsparse.c b/contrib/csup/rcsparse.c
index 1e855f98b0d4..19aa8b51a853 100644
--- a/contrib/csup/rcsparse.c
+++ b/contrib/csup/rcsparse.c
@@ -82,7 +82,7 @@ duptext(yyscan_t *sp, int *arglen)
* Start up parser, and use the rcsfile hook to add objects.
*/
int
-rcsparse_run(struct rcsfile *rf, FILE *infp)
+rcsparse_run(struct rcsfile *rf, FILE *infp, int ro)
{
yyscan_t scanner;
char *desc;
@@ -99,9 +99,12 @@ rcsparse_run(struct rcsfile *rf, FILE *infp)
rcsfile_setval(rf, RCSFILE_DESC, desc);
free(desc);
tok = rcslex(scanner);
- error = parse_deltatexts(rf, &scanner, tok);
- if (error)
- return (error);
+ /* Parse deltatexts if we need to edit. */
+ if (!ro) {
+ error = parse_deltatexts(rf, &scanner, tok);
+ if (error)
+ return (error);
+ }
rcslex_destroy(scanner);
return (0);
}
diff --git a/contrib/csup/rcsparse.h b/contrib/csup/rcsparse.h
index 21051e585c21..888d53d15761 100644
--- a/contrib/csup/rcsparse.h
+++ b/contrib/csup/rcsparse.h
@@ -37,5 +37,5 @@
#define COLON 6
struct rcsfile;
-int rcsparse_run(struct rcsfile *, FILE *);
+int rcsparse_run(struct rcsfile *, FILE *, int);
#endif /* !_RCSPARSE_H_ */
diff --git a/contrib/csup/updater.c b/contrib/csup/updater.c
index ff66c66ca071..d73775bed3e3 100644
--- a/contrib/csup/updater.c
+++ b/contrib/csup/updater.c
@@ -1575,7 +1575,7 @@ updater_rcsedit(struct updater *up, struct file_update *fup, char *name,
lprintf(1, " -> Attic"); \
lprintf(1, "\n"); \
(rf) = rcsfile_frompath((path), (name), (cvsroot), \
- (tag)); \
+ (tag), 0); \
if ((rf) == NULL) { \
xasprintf(&(up)->errmsg, \
"Error reading rcsfile %s\n", (name)); \