diff options
author | Joris Vink <joris@cvs.openbsd.org> | 2005-10-06 12:56:50 +0000 |
---|---|---|
committer | Joris Vink <joris@cvs.openbsd.org> | 2005-10-06 12:56:50 +0000 |
commit | 38bdea7d82565c61023e7241e97701733b5858be (patch) | |
tree | eaae87a98c4e1adab27d7fb41c0f14386eebf67a /usr.bin | |
parent | a2db1ca77ed7eb494ae5fba312bb158b293af776 (diff) |
support rlog command;
Diffstat (limited to 'usr.bin')
-rw-r--r-- | usr.bin/rcs/Makefile | 4 | ||||
-rw-r--r-- | usr.bin/rcs/rcsprog.c | 3 | ||||
-rw-r--r-- | usr.bin/rcs/rcsprog.h | 4 | ||||
-rw-r--r-- | usr.bin/rcs/rlog.c | 173 |
4 files changed, 180 insertions, 4 deletions
diff --git a/usr.bin/rcs/Makefile b/usr.bin/rcs/Makefile index b1852d3a845..16999b31e2c 100644 --- a/usr.bin/rcs/Makefile +++ b/usr.bin/rcs/Makefile @@ -1,11 +1,11 @@ -# $OpenBSD: Makefile,v 1.10 2005/10/06 02:00:04 joris Exp $ +# $OpenBSD: Makefile,v 1.11 2005/10/06 12:56:49 joris Exp $ .PATH: ${.CURDIR}/../cvs PROG= rcs MAN= rcs.1 -SRCS= ci.c co.c rcsclean.c rcsdiff.c rcsprog.c buf.c diff.c \ +SRCS= ci.c co.c rcsclean.c rcsdiff.c rcsprog.c rlog.c buf.c diff.c \ log.c rcs.c rcsnum.c strtab.c CFLAGS+=-I${.CURDIR}/../cvs diff --git a/usr.bin/rcs/rcsprog.c b/usr.bin/rcs/rcsprog.c index ddd7bdcaca7..a227ada53a9 100644 --- a/usr.bin/rcs/rcsprog.c +++ b/usr.bin/rcs/rcsprog.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rcsprog.c,v 1.20 2005/10/06 02:00:05 joris Exp $ */ +/* $OpenBSD: rcsprog.c,v 1.21 2005/10/06 12:56:49 joris Exp $ */ /* * Copyright (c) 2005 Jean-Francois Brousseau <jfb@openbsd.org> * All rights reserved. @@ -56,6 +56,7 @@ struct rcs_prog { { "co", checkout_main, checkout_usage }, { "rcsclean", rcsclean_main, rcsclean_usage }, { "rcsdiff", rcsdiff_main, rcsdiff_usage }, + { "rlog", rlog_main, rlog_usage }, { "ident", NULL, NULL }, }; diff --git a/usr.bin/rcs/rcsprog.h b/usr.bin/rcs/rcsprog.h index 9d07837686a..f79de9640b4 100644 --- a/usr.bin/rcs/rcsprog.h +++ b/usr.bin/rcs/rcsprog.h @@ -1,4 +1,4 @@ -/* $OpenBSD: rcsprog.h,v 1.6 2005/10/06 02:00:05 joris Exp $ */ +/* $OpenBSD: rcsprog.h,v 1.7 2005/10/06 12:56:49 joris Exp $ */ /* * Copyright (c) 2005 Joris Vink <joris@openbsd.org> * All rights reserved. @@ -36,6 +36,7 @@ void checkout_usage(void); void checkin_usage(void); void rcsdiff_usage(void); void rcsclean_usage(void); +void rlog_usage(void); void (*usage)(void); int rcs_statfile(char *, char *, size_t); @@ -44,5 +45,6 @@ int checkin_main(int, char **); int rcs_main(int, char **); int rcsdiff_main(int, char **); int rcsclean_main(int, char **); +int rlog_main(int, char **); #endif /* RCSPROG_H */ diff --git a/usr.bin/rcs/rlog.c b/usr.bin/rcs/rlog.c new file mode 100644 index 00000000000..1929077392a --- /dev/null +++ b/usr.bin/rcs/rlog.c @@ -0,0 +1,173 @@ +/* $OpenBSD: rlog.c,v 1.1 2005/10/06 12:56:49 joris Exp $ */ +/* + * Copyright (c) 2005 Joris Vink <joris@openbsd.org> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/param.h> +#include <sys/stat.h> + +#include <dirent.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#include "diff.h" +#include "log.h" +#include "rcs.h" +#include "rcsprog.h" + +extern char *__progname; +static int rlog_file(const char *, const char *, RCSFILE *); + +#define REVSEP "----------------------------" +#define REVEND \ + "============================================================================" + +static int hflag; +static int tflag; +static int Nflag; + +int +rlog_main(int argc, char **argv) +{ + int Rflag; + int i, ch; + char fpath[MAXPATHLEN]; + RCSFILE *file; + + hflag = Rflag = 0; + while ((ch = getopt(argc, argv, "hNqRtV")) != -1) { + switch (ch) { + case 'h': + hflag = 1; + break; + case 'N': + Nflag = 1; + break; + case 'q': + verbose = 0; + break; + case 'R': + Rflag = 1; + break; + case 't': + tflag = 1; + break; + case 'V': + printf("%s\n", rcs_version); + exit(0); + default: + break; + } + } + + argc -= optind; + argv += optind; + + if (argc == 0) { + cvs_log(LP_ERR, "no input file"); + (usage)(); + exit(1); + } + + for (i = 0; i < argc; i++) { + if (rcs_statfile(argv[i], fpath, sizeof(fpath)) < 0) + continue; + + if ((file = rcs_open(fpath, RCS_READ)) == NULL) + continue; + + if (Rflag == 0) + rlog_file(argv[i], fpath, file); + rcs_close(file); + } + + return (0); +} + +void +rlog_usage(void) +{ + fprintf(stderr, "usage %s [-qV] file ...\n", __progname); +} + +static int +rlog_file(const char *fname, const char *fpath, RCSFILE *file) +{ + char numb[64]; + struct rcs_sym *sym; + struct rcs_delta *rdp; + struct rcs_access *acp; + + printf("Working file: %s", fname); + printf("\nhead:"); + if (file->rf_head != NULL) + printf(" %s", rcsnum_tostr(file->rf_head, numb, sizeof(numb))); + + printf("\nbranch:"); + if (rcs_branch_get(file) != NULL) { + printf(" %s", rcsnum_tostr(rcs_branch_get(file), + numb, sizeof(numb))); + } + + printf("\nlocks: %s", (file->rf_flags & RCS_SLOCK) ? "strict" : ""); + printf("\naccess list:\n"); + TAILQ_FOREACH(acp, &(file->rf_access), ra_list) + printf("\t%s\n", acp->ra_name); + + if (Nflag == 0) { + printf("symbolic names:\n"); + TAILQ_FOREACH(sym, &(file->rf_symbols), rs_list) { + printf("\t%s: %s\n", sym->rs_name, + rcsnum_tostr(sym->rs_num, numb, sizeof(numb))); + } + } + + printf("keyword substitution: %s\n", + file->rf_expand == NULL ? "kv" : file->rf_expand); + + printf("total revisions: %u\n", file->rf_ndelta); + + if ((hflag == 0) || (tflag == 1)) + printf("description: %s\n", file->rf_desc); + + if ((hflag == 0) && (tflag == 0)) { + TAILQ_FOREACH(rdp, &(file->rf_delta), rd_list) { + rcsnum_tostr(rdp->rd_num, numb, sizeof(numb)); + printf("%s\nrevision %s\n", REVSEP, numb); + printf("date: %d/%02d/%02d %02d:%02d:%02d;" + " author: %s; state: %s;\n", + rdp->rd_date.tm_year + 1900, + rdp->rd_date.tm_mon + 1, + rdp->rd_date.tm_mday, rdp->rd_date.tm_hour, + rdp->rd_date.tm_min, rdp->rd_date.tm_sec, + rdp->rd_author, rdp->rd_state); + printf("%s", rdp->rd_log); + } + } + + printf("%s\n", REVEND); + return (0); +} |