diff options
author | krapht <krapht@cvs.openbsd.org> | 2004-11-09 20:59:32 +0000 |
---|---|---|
committer | krapht <krapht@cvs.openbsd.org> | 2004-11-09 20:59:32 +0000 |
commit | 9d6e4cf789fc3d693100b41d4e1d9b9d0893939a (patch) | |
tree | e8bcd328e2e6c69a4f6a50b6f2d91e8ed62b50a9 | |
parent | e7a10f30692ed4f4500051860d655fafa749d8e2 (diff) |
Editor invocation code, still needs some work
-rw-r--r-- | usr.bin/cvs/commit.c | 138 |
1 files changed, 133 insertions, 5 deletions
diff --git a/usr.bin/cvs/commit.c b/usr.bin/cvs/commit.c index 263da620078..88f03c4b755 100644 --- a/usr.bin/cvs/commit.c +++ b/usr.bin/cvs/commit.c @@ -1,4 +1,4 @@ -/* $OpenBSD: commit.c,v 1.2 2004/07/30 01:49:22 jfb Exp $ */ +/* $OpenBSD: commit.c,v 1.3 2004/11/09 20:59:31 krapht Exp $ */ /* * Copyright (c) 2004 Jean-Francois Brousseau <jfb@openbsd.org> * All rights reserved. @@ -40,11 +40,16 @@ #include "proto.h" +#define CVS_COMMIT_BIGMSG 8000 +#define CVS_COMMIT_FTMPL "/tmp/cvsXXXXXXXXXX" +#define CVS_COMMIT_LOGPREFIX "CVS:" +#define CVS_COMMIT_LOGLINE \ +"----------------------------------------------------------------------" -static char* cvs_commit_openmsg (const char *); - +static char* cvs_commit_openmsg (const char *); +static char* cvs_commit_getmsg (const char *); /* @@ -63,6 +68,10 @@ cvs_commit(int argc, char **argv) mfile = NULL; msg = NULL; +#if 0 + cvs_commit_getmsg("."); +#endif + while ((ch = getopt(argc, argv, "F:flm:R")) != -1) { switch (ch) { case 'F': @@ -112,9 +121,9 @@ cvs_commit(int argc, char **argv) static char* cvs_commit_openmsg(const char *path) { - int fd; + int fd, ch; size_t sz; - char *msg; + char buf[32], *msg; struct stat st; if (stat(path, &st) == -1) { @@ -122,6 +131,35 @@ cvs_commit_openmsg(const char *path) return (NULL); } + if (!S_ISREG(st.st_mode)) { + cvs_log(LP_ERR, "message file must be a regular file"); + return (NULL); + } + + if (st.st_size > CVS_COMMIT_BIGMSG) { + do { + fprintf(stderr, + "The specified message file seems big. " + "Proceed anyways? (y/n) "); + if (fgets(buf, sizeof(buf), stdin) == NULL) { + cvs_log(LP_ERRNO, + "failed to read from standard input"); + return (NULL); + } + + sz = strlen(buf); + if ((sz == 0) || (sz > 2)) { + continue; + } + + cvs_log(LP_ERR, "aborted by user"); + return (NULL); + } + + fprintf(stderr, "Invalid character\n"); + } while (1); + } + sz = st.st_size + 1; msg = (char *)malloc(sz); @@ -144,3 +182,93 @@ cvs_commit_openmsg(const char *path) return (msg); } + + +/* + * cvs_commit_getmsg() + * + * Get a commit log message by forking the user's editor. + * Returns the message in a dynamically allocated string on success, NULL on + * failure. + */ + +static char* +cvs_commit_getmsg(const char *dir) +{ + int ret, fd, argc, fds[3]; + char *argv[4], path[MAXPATHLEN], *msg; + FILE *fp; + + fds[0] = -1; + fds[1] = -1; + fds[2] = -1; + strlcpy(path, CVS_COMMIT_FTMPL, sizeof(path)); + argc = 0; + argv[argc++] = cvs_editor; + argv[argc++] = path; + argv[argc] = NULL; + + if ((fd = mkstemp(path)) == -1) { + cvs_log(LP_ERRNO, "failed to create temporary file"); + return (NULL); + } + + fp = fdopen(fd, "w"); + if (fp == NULL) { + cvs_log(LP_ERRNO, "failed to fdopen"); + exit(1); + } 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%s Modified Files:\n", + CVS_COMMIT_LOGPREFIX, CVS_COMMIT_LOGLINE, + CVS_COMMIT_LOGPREFIX, CVS_COMMIT_LOGPREFIX, + CVS_COMMIT_LOGPREFIX, CVS_COMMIT_LOGPREFIX, + dir, CVS_COMMIT_LOGPREFIX, CVS_COMMIT_LOGPREFIX); + + /* XXX list files here */ + + fprintf(fp, "%s %s\n", CVS_COMMIT_LOGPREFIX, + CVS_COMMIT_LOGLINE); + } + (void)fflush(fp); + (void)fclose(fp); + + do { + ret = cvs_exec(argc, argv, fds); + if (ret == -1) { + fprintf(stderr, + "Log message unchanged or not specified\n" + "a)bort, c)ontinue, e)dit, !)reuse this message " + "unchanged for remaining dirs\nAction: () "); + + ret = getchar(); + if (ret == 'a') { + cvs_log(LP_ERR, "aborted by user"); + break; + } else if (ret == 'c') { + } else if (ret == 'e') { + } else if (ret == '!') { + } + + } + } while (0); + + (void)close(fd); + + return (msg); +} + + +/* + * cvs_commit_gettmpl() + * + * Get the template to display when invoking the editor to get a commit + * message. + */ + +cvs_commit_gettmpl(void) +{ + +} |