diff options
author | 2007-01-07 02:39:24 +0000 | |
---|---|---|
committer | 2007-01-07 02:39:24 +0000 | |
commit | db758d52025f7b3e72501a37981191cded1f2b82 (patch) | |
tree | 6acf282adf4a5e069af25bf81ccbd024a9a830cc /usr.bin/cvs | |
parent | zap-o-matic 2007: (diff) | |
download | wireguard-openbsd-db758d52025f7b3e72501a37981191cded1f2b82.tar.xz wireguard-openbsd-db758d52025f7b3e72501a37981191cded1f2b82.zip |
rewrite of the logmessage code, which allows you to
enter a logmessage into your favorite editor when commiting.
Diffstat (limited to 'usr.bin/cvs')
-rw-r--r-- | usr.bin/cvs/Makefile | 8 | ||||
-rw-r--r-- | usr.bin/cvs/commit.c | 83 | ||||
-rw-r--r-- | usr.bin/cvs/cvs.h | 7 | ||||
-rw-r--r-- | usr.bin/cvs/logmsg.c | 193 |
4 files changed, 254 insertions, 37 deletions
diff --git a/usr.bin/cvs/Makefile b/usr.bin/cvs/Makefile index cd7a67873bd..b7f66594e71 100644 --- a/usr.bin/cvs/Makefile +++ b/usr.bin/cvs/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.33 2006/11/27 14:19:53 xsa Exp $ +# $OpenBSD: Makefile,v 1.34 2007/01/07 02:39:24 joris Exp $ PROG= opencvs MAN= cvs.1 cvsignore.5 cvsrc.5 cvswrappers.5 cvsintro.7 @@ -6,9 +6,9 @@ CPPFLAGS+=-I${.CURDIR} SRCS= cvs.c add.c admin.c annotate.c commit.c config.c checkout.c client.c \ buf.c cmd.c date.y diff.c diff3.c diff_internals.c entries.c fatal.c \ - file.c getlog.c log.c import.c init.c remove.c repository.c rcs.c \ - rcsnum.c rcstime.c remote.c root.c server.c status.c tag.c \ - worklist.c util.c update.c version.c xmalloc.c + file.c getlog.c log.c logmsg.c import.c init.c remove.c \ + repository.c rcs.c rcsnum.c rcstime.c remote.c root.c server.c \ + status.c tag.c worklist.c util.c update.c version.c xmalloc.c CFLAGS+=-Wall CFLAGS+=-Wstrict-prototypes -Wmissing-prototypes diff --git a/usr.bin/cvs/commit.c b/usr.bin/cvs/commit.c index 29c5aeab00c..68e21a047ae 100644 --- a/usr.bin/cvs/commit.c +++ b/usr.bin/cvs/commit.c @@ -1,4 +1,4 @@ -/* $OpenBSD: commit.c,v 1.85 2007/01/03 22:28:30 joris Exp $ */ +/* $OpenBSD: commit.c,v 1.86 2007/01/07 02:39:24 joris Exp $ */ /* * Copyright (c) 2006 Joris Vink <joris@openbsd.org> * Copyright (c) 2006 Xavier Santolaria <xsa@openbsd.org> @@ -24,14 +24,18 @@ #include "remote.h" void cvs_commit_local(struct cvs_file *); -void cvs_commit_check_conflicts(struct cvs_file *); +void cvs_commit_check_files(struct cvs_file *); static char *commit_diff_file(struct cvs_file *); static void commit_desc_set(struct cvs_file *); struct cvs_flisthead files_affected; +struct cvs_flisthead files_added; +struct cvs_flisthead files_removed; +struct cvs_flisthead files_modified; + int conflicts_found; -char *logmsg; +char *logmsg = NULL; struct cvs_cmd cvs_cmd_commit = { CVS_OP_COMMIT, 0, "commit", @@ -83,15 +87,36 @@ cvs_commit(int argc, char **argv) argc -= optind; argv += optind; - /* XXX */ + TAILQ_INIT(&files_affected); + TAILQ_INIT(&files_added); + TAILQ_INIT(&files_removed); + TAILQ_INIT(&files_modified); + conflicts_found = 0; + + cr.enterdir = NULL; + cr.leavedir = NULL; + cr.fileproc = cvs_commit_check_files; + cr.flags = flags; + + if (argc > 0) + cvs_file_run(argc, argv, &cr); + else + cvs_file_run(1, &arg, &cr); + + if (conflicts_found != 0) + fatal("%d conflicts found, please correct these first", + conflicts_found); + + if (logmsg == NULL && cvs_server_active == 0) { + logmsg = cvs_logmsg_create(&files_added, &files_removed, + &files_modified); + } + if (logmsg == NULL) - fatal("please use -m or -F to specify a log message for now"); + fatal("This shouldnt happen, honestly!"); if (current_cvsroot->cr_method != CVS_METHOD_LOCAL) { - cr.enterdir = NULL; - cr.leavedir = NULL; cr.fileproc = cvs_client_sendfile; - cr.flags = flags; if (argc > 0) cvs_file_run(argc, argv, &cr); @@ -104,37 +129,19 @@ cvs_commit(int argc, char **argv) cvs_client_senddir("."); cvs_client_send_request("ci"); cvs_client_get_responses(); - return (0); + } else { + cr.fileproc = cvs_commit_local; + cvs_file_walklist(&files_affected, &cr); + cvs_file_freelist(&files_affected); } - TAILQ_INIT(&files_affected); - conflicts_found = 0; - - cr.enterdir = NULL; - cr.leavedir = NULL; - cr.fileproc = cvs_commit_check_conflicts; - cr.flags = flags; - - if (argc > 0) - cvs_file_run(argc, argv, &cr); - else - cvs_file_run(1, &arg, &cr); - - if (conflicts_found != 0) - fatal("%d conflicts found, please correct these first", - conflicts_found); - - cr.fileproc = cvs_commit_local; - cvs_file_walklist(&files_affected, &cr); - cvs_file_freelist(&files_affected); - return (0); } void -cvs_commit_check_conflicts(struct cvs_file *cf) +cvs_commit_check_files(struct cvs_file *cf) { - cvs_log(LP_TRACE, "cvs_commit_check_conflicts(%s)", cf->file_path); + cvs_log(LP_TRACE, "cvs_commit_check_files(%s)", cf->file_path); /* * cvs_file_classify makes the noise for us @@ -176,6 +183,18 @@ cvs_commit_check_conflicts(struct cvs_file *cf) cf->file_status == FILE_REMOVED || cf->file_status == FILE_MODIFIED) cvs_file_get(cf->file_path, &files_affected); + + switch (cf->file_status) { + case FILE_ADDED: + cvs_file_get(cf->file_path, &files_added); + break; + case FILE_REMOVED: + cvs_file_get(cf->file_path, &files_removed); + break; + case FILE_MODIFIED: + cvs_file_get(cf->file_path, &files_modified); + break; + } } void diff --git a/usr.bin/cvs/cvs.h b/usr.bin/cvs/cvs.h index 6b0cca10679..d4cadd4a7e5 100644 --- a/usr.bin/cvs/cvs.h +++ b/usr.bin/cvs/cvs.h @@ -1,4 +1,4 @@ -/* $OpenBSD: cvs.h,v 1.125 2007/01/03 20:48:26 joris Exp $ */ +/* $OpenBSD: cvs.h,v 1.126 2007/01/07 02:39:24 joris Exp $ */ /* * Copyright (c) 2004 Jean-Francois Brousseau <jfb@openbsd.org> * All rights reserved. @@ -352,6 +352,11 @@ struct cvsroot *cvsroot_parse(const char *); struct cvsroot *cvsroot_get(const char *); void cvsroot_remove(struct cvsroot *); +/* logmsg.c */ +char * cvs_logmsg_read(const char *path); +char * cvs_logmsg_create(struct cvs_flisthead *, struct cvs_flisthead *, + struct cvs_flisthead *); + /* misc stuff */ void cvs_update_local(struct cvs_file *); void cvs_update_enterdir(struct cvs_file *); diff --git a/usr.bin/cvs/logmsg.c b/usr.bin/cvs/logmsg.c new file mode 100644 index 00000000000..cc54e899551 --- /dev/null +++ b/usr.bin/cvs/logmsg.c @@ -0,0 +1,193 @@ +/* $OpenBSD: logmsg.c,v 1.30 2007/01/07 02:39:24 joris Exp $ */ +/* + * Copyright (c) 2007 Joris Vink <joris@openbsd.org> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "includes.h" + +#include "cvs.h" +#include "file.h" +#include "log.h" +#include "worklist.h" + +#define CVS_LOGMSG_PREFIX "CVS:" +#define CVS_LOGMSG_LINE \ +"----------------------------------------------------------------------" + +char * +cvs_logmsg_read(const char *path) +{ + int fd; + BUF *bp; + FILE *fp; + size_t len; + struct stat st; + char *buf, *lbuf; + + if ((fd = open(path, O_RDONLY)) == -1) + fatal("cvs_logmsg_read: open %s", strerror(errno)); + + if (fstat(fd, &st) == -1) + fatal("cvs_logmsg_read: fstat %s", strerror(errno)); + + if (!S_ISREG(st.st_mode)) + fatal("cvs_logmsg_read: file is not a regular file"); + + if ((fp = fdopen(fd, "r")) == NULL) + fatal("cvs_logmsg_read: fdopen %s", strerror(errno)); + + lbuf = NULL; + bp = cvs_buf_alloc(st.st_size, BUF_AUTOEXT); + while ((buf = fgetln(fp, &len))) { + if (buf[len - 1] == '\n') { + buf[len - 1] = '\0'; + } else { + lbuf = xmalloc(len + 1); + strlcpy(lbuf, buf, len); + buf = lbuf; + } + + len = strlen(buf); + if (len == 0) + continue; + + if (!strncmp(buf, CVS_LOGMSG_PREFIX, + strlen(CVS_LOGMSG_PREFIX))) + continue; + + cvs_buf_append(bp, buf, len); + cvs_buf_putc(bp, '\n'); + } + + if (lbuf != NULL) + xfree(lbuf); + + (void)fclose(fp); + (void)close(fd); + + cvs_buf_putc(bp, '\0'); + return (cvs_buf_release(bp)); +} + +char * +cvs_logmsg_create(struct cvs_flisthead *added, struct cvs_flisthead *removed, + struct cvs_flisthead *modified) +{ + FILE *fp; + size_t len; + int c, fd, argc; + struct cvs_filelist *cf; + struct stat st1, st2; + char *fpath, *logmsg, *argv[4]; + + fpath = xmalloc(MAXPATHLEN); + len = strlcpy(fpath, cvs_tmpdir, MAXPATHLEN); + if (len >= MAXPATHLEN) + fatal("cvs_logmsg_create: truncation"); + + len = strlcat(fpath, "/cvsXXXXXXXXXX", MAXPATHLEN); + if (len >= MAXPATHLEN) + fatal("cvs_logmsg_create: truncation"); + + if ((fd = mkstemp(fpath)) == NULL) + fatal("cvs_logmsg_create: mkstemp %s", strerror(errno)); + + if ((fp = fdopen(fd, "w")) == NULL) { + (void)unlink(fpath); + fatal("cvs_logmsg_create: fdopen %s", strerror(errno)); + } + + 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 (!TAILQ_EMPTY(added)) { + fprintf(fp, "%s Added Files:", CVS_LOGMSG_PREFIX); + TAILQ_FOREACH(cf, added, flist) + fprintf(fp, "\n%s\t%s", + CVS_LOGMSG_PREFIX, cf->file_path); + fputs("\n", fp); + } + + if (!TAILQ_EMPTY(removed)) { + fprintf(fp, "%s Removed Files:", CVS_LOGMSG_PREFIX); + TAILQ_FOREACH(cf, removed, flist) + fprintf(fp, "\n%s\t%s", + CVS_LOGMSG_PREFIX, cf->file_path); + fputs("\n", fp); + } + + if (!TAILQ_EMPTY(modified)) { + fprintf(fp, "%s Modified Files:", CVS_LOGMSG_PREFIX); + TAILQ_FOREACH(cf, modified, flist) + fprintf(fp, "\n%s\t%s", + CVS_LOGMSG_PREFIX, cf->file_path); + fputs("\n", fp); + } + + fprintf(fp, "%s %s\n", CVS_LOGMSG_PREFIX, CVS_LOGMSG_LINE); + (void)fflush(fp); + + if (fstat(fd, &st1) == -1) { + (void)unlink(fpath); + fatal("cvs_logmsg_create: fstat %s", strerror(errno)); + } + + argc = 0; + argv[argc++] = cvs_editor; + argv[argc++] = fpath; + argv[argc] = NULL; + + logmsg = NULL; + + for (;;) { + if (cvs_exec(argc, argv) < 0) + break; + + if (fstat(fd, &st2) == -1) { + (void)unlink(fpath); + fatal("cvs_logmsg_create: fstat %s", strerror(errno)); + } + + if (st1.st_mtime != st2.st_mtime) { + logmsg = cvs_logmsg_read(fpath); + break; + } + + printf("\nLog message unchanged or not specified\n" + "a)bort, c)ontinue, e(dit)\nAction: (continue) "); + (void)fflush(stdout); + + c = getc(stdin); + if (c == 'a') { + fatal("Aborted by user"); + } else if (c == '\n' || c == 'c') { + logmsg = xstrdup(""); + break; + } else if (c == 'e') { + continue; + } else { + cvs_log(LP_ERR, "invalid input"); + continue; + } + } + + (void)fclose(fp); + (void)close(fd); + (void)unlink(fpath); + xfree(fpath); + + return (logmsg); +} |