diff options
-rw-r--r-- | usr.bin/cvs/commit.c | 16 | ||||
-rw-r--r-- | usr.bin/cvs/cvs.h | 4 | ||||
-rw-r--r-- | usr.bin/cvs/logmsg.c | 66 |
3 files changed, 52 insertions, 34 deletions
diff --git a/usr.bin/cvs/commit.c b/usr.bin/cvs/commit.c index 3e45dfc6d05..1528ddde12f 100644 --- a/usr.bin/cvs/commit.c +++ b/usr.bin/cvs/commit.c @@ -1,4 +1,4 @@ -/* $OpenBSD: commit.c,v 1.9 2004/12/07 17:10:56 tedu Exp $ */ +/* $OpenBSD: commit.c,v 1.10 2004/12/08 17:22:48 jfb Exp $ */ /* * Copyright (c) 2004 Jean-Francois Brousseau <jfb@openbsd.org> * All rights reserved. @@ -56,33 +56,33 @@ int cvs_commit_file (CVSFILE *, void *); int cvs_commit(int argc, char **argv) { - int i, ch, recurse, flags; + int i, ch, flags; char *msg, *mfile; struct cvs_flist cl; struct cvsroot *root; flags = CF_RECURSE|CF_IGNORE|CF_SORT; - recurse = 1; mfile = NULL; msg = NULL; TAILQ_INIT(&cl); - while ((ch = getopt(argc, argv, "F:flm:R")) != -1) { + while ((ch = getopt(argc, argv, "F:flm:Rr:")) != -1) { switch (ch) { case 'F': mfile = optarg; break; case 'f': - recurse = 0; + /* XXX half-implemented */ + flags &= ~CF_RECURSE; break; case 'l': - recurse = 0; + flags &= ~CF_RECURSE; break; case 'm': msg = optarg; break; case 'R': - recurse = 1; + flags |= CF_RECURSE; break; default: return (EX_USAGE); @@ -111,7 +111,7 @@ cvs_commit(int argc, char **argv) cvs_file_examine(cvs_files, cvs_commit_prepare, &cl); if (msg == NULL) { - msg = cvs_logmsg_get(CVS_FILE_NAME(cvs_files), &cl); + msg = cvs_logmsg_get(CVS_FILE_NAME(cvs_files), NULL, &cl, NULL); if (msg == NULL) return (1); } diff --git a/usr.bin/cvs/cvs.h b/usr.bin/cvs/cvs.h index 1c6d8370ecf..54c09dc980a 100644 --- a/usr.bin/cvs/cvs.h +++ b/usr.bin/cvs/cvs.h @@ -1,4 +1,4 @@ -/* $OpenBSD: cvs.h,v 1.36 2004/12/08 16:07:43 jfb Exp $ */ +/* $OpenBSD: cvs.h,v 1.37 2004/12/08 17:22:48 jfb Exp $ */ /* * Copyright (c) 2004 Jean-Francois Brousseau <jfb@openbsd.org> * All rights reserved. @@ -282,7 +282,7 @@ int cvs_hist_append (CVSHIST *, struct cvs_hent *); /* from logmsg.c */ char* cvs_logmsg_open (const char *); -char* cvs_logmsg_get (const char *, struct cvs_flist *); +char* cvs_logmsg_get (const char *, struct cvs_flist *, struct cvs_flist *, struct cvs_flist *); int cvs_logmsg_send (struct cvsroot *, const char *); /* from util.c */ diff --git a/usr.bin/cvs/logmsg.c b/usr.bin/cvs/logmsg.c index 625ecd110af..ced24f38d52 100644 --- a/usr.bin/cvs/logmsg.c +++ b/usr.bin/cvs/logmsg.c @@ -1,4 +1,4 @@ -/* $OpenBSD: logmsg.c,v 1.7 2004/12/07 17:10:56 tedu Exp $ */ +/* $OpenBSD: logmsg.c,v 1.8 2004/12/08 17:22:48 jfb Exp $ */ /* * Copyright (c) 2004 Jean-Francois Brousseau <jfb@openbsd.org> * All rights reserved. @@ -42,10 +42,15 @@ #define CVS_LOGMSG_BIGMSG 32000 #define CVS_LOGMSG_FTMPL "/tmp/cvsXXXXXXXXXX" #define CVS_LOGMSG_PREFIX "CVS:" -#define CVS_LOGMSG_LOGLINE \ +#define CVS_LOGMSG_LINE \ "----------------------------------------------------------------------" +static const char *cvs_logmsg_ops[3] = { + "Added", "Modified", "Removed", +}; + + /* * cvs_logmsg_open() * @@ -140,19 +145,29 @@ cvs_logmsg_open(const char *path) /* * cvs_logmsg_get() * - * Get a log message by forking and executing the user's editor. + * Get a log message by forking and executing the user's editor. The <dir> + * argument is a relative path to the directory for which the log message + * applies, and the 3 tail queue arguemnts contains all the files for which the + * log message will apply. Any of these arguments can be set to NULL in the + * case where there is no information to display. * Returns the message in a dynamically allocated string on success, NULL on * failure. */ char* -cvs_logmsg_get(const char *dir, struct cvs_flist *files) +cvs_logmsg_get(const char *dir, struct cvs_flist *added, + struct cvs_flist *modified, struct cvs_flist *removed) { - int ret, fd, argc, fds[3], nl; + int i, fd, argc, fds[3], nl; size_t len, tlen; char *argv[4], buf[16], path[MAXPATHLEN], fpath[MAXPATHLEN], *msg; FILE *fp; CVSFILE *cvsfp; struct stat st1, st2; + struct cvs_flist *files[3]; + + files[0] = added; + files[1] = modified; + files[2] = removed; msg = NULL; fds[0] = -1; @@ -176,20 +191,24 @@ cvs_logmsg_get(const char *dir, struct cvs_flist *files) if (unlink(path) == -1) cvs_log(LP_ERRNO, "failed to unlink temporary file"); return (NULL); - } else { - fprintf(fp, - "\n%s %s\n%s Enter Log. Lines beginning with `%s' are " - "removed automatically\n%s\n%s Commiting in %s\n" - "%s\n", - CVS_LOGMSG_PREFIX, CVS_LOGMSG_LOGLINE, - CVS_LOGMSG_PREFIX, CVS_LOGMSG_PREFIX, - CVS_LOGMSG_PREFIX, CVS_LOGMSG_PREFIX, - dir, CVS_LOGMSG_PREFIX); - - /* XXX list files here */ - fprintf(fp, "%s Modified Files:", CVS_LOGMSG_PREFIX); + } + + fprintf(fp, "\n%s %s\n%s Enter Log. Lines beginning with `%s' are " + "removed automatically\n%s\n", CVS_LOGMSG_PREFIX, CVS_LOGMSG_LINE, + CVS_LOGMSG_PREFIX, CVS_LOGMSG_PREFIX, CVS_LOGMSG_PREFIX); + + if (dir != NULL) + fprintf(fp, "%s Commiting in %s\n%s\n", CVS_LOGMSG_PREFIX, dir, + CVS_LOGMSG_PREFIX); + + for (i = 0; i < 3; i++) { + if (files[i] == NULL) + continue; + + fprintf(fp, "%s %s Files:", CVS_LOGMSG_PREFIX, + cvs_logmsg_ops[i]); nl = 1; - TAILQ_FOREACH(cvsfp, files, cf_list) { + TAILQ_FOREACH(cvsfp, files[i], cf_list) { /* take the space into account */ cvs_file_getpath(cvsfp, fpath, sizeof(fpath)); len = strlen(fpath) + 1; @@ -206,8 +225,7 @@ cvs_logmsg_get(const char *dir, struct cvs_flist *files) tlen += len; } - fprintf(fp, "\n%s %s\n", CVS_LOGMSG_PREFIX, - CVS_LOGMSG_LOGLINE); + fprintf(fp, "\n%s %s\n", CVS_LOGMSG_PREFIX, CVS_LOGMSG_LINE); } (void)fflush(fp); @@ -221,9 +239,9 @@ cvs_logmsg_get(const char *dir, struct cvs_flist *files) } for (;;) { - ret = cvs_exec(argc, argv, fds); - if (ret == -1) + if (cvs_exec(argc, argv, fds) < 0) break; + if (fstat(fd, &st2) == -1) { cvs_log(LP_ERRNO, "failed to stat log message file"); break; @@ -256,9 +274,9 @@ cvs_logmsg_get(const char *dir, struct cvs_flist *files) /* empty message */ msg = strdup(""); break; - } else if (ret == 'e') + } else if (buf[0] == 'e') continue; - else if (ret == '!') { + else if (buf[0] == '!') { /* XXX do something */ } } |