summaryrefslogtreecommitdiff
path: root/usr.bin
diff options
context:
space:
mode:
authorJoris Vink <joris@cvs.openbsd.org>2005-10-06 12:56:50 +0000
committerJoris Vink <joris@cvs.openbsd.org>2005-10-06 12:56:50 +0000
commit38bdea7d82565c61023e7241e97701733b5858be (patch)
treeeaae87a98c4e1adab27d7fb41c0f14386eebf67a /usr.bin
parenta2db1ca77ed7eb494ae5fba312bb158b293af776 (diff)
support rlog command;
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/rcs/Makefile4
-rw-r--r--usr.bin/rcs/rcsprog.c3
-rw-r--r--usr.bin/rcs/rcsprog.h4
-rw-r--r--usr.bin/rcs/rlog.c173
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);
+}