Module Name:    src
Committed By:   christos
Date:           Sun Mar 11 14:59:41 UTC 2018

Modified Files:
        src/usr.bin/cvslatest: cvslatest.c

Log Message:
deal with cvs meta-data directories not called CVS.


To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 src/usr.bin/cvslatest/cvslatest.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.bin/cvslatest/cvslatest.c
diff -u src/usr.bin/cvslatest/cvslatest.c:1.6 src/usr.bin/cvslatest/cvslatest.c:1.7
--- src/usr.bin/cvslatest/cvslatest.c:1.6	Sun Sep 24 05:43:27 2017
+++ src/usr.bin/cvslatest/cvslatest.c	Sun Mar 11 10:59:41 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: cvslatest.c,v 1.6 2017/09/24 09:43:27 joerg Exp $	*/
+/*	$NetBSD: cvslatest.c,v 1.7 2018/03/11 14:59:41 christos Exp $	*/
 
 /*-
  * Copyright (c) 2016 The NetBSD Foundation, Inc.
@@ -38,7 +38,7 @@
 #endif
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: cvslatest.c,v 1.6 2017/09/24 09:43:27 joerg Exp $");
+__RCSID("$NetBSD: cvslatest.c,v 1.7 2018/03/11 14:59:41 christos Exp $");
 
 /*
  * Find the latest timestamp in a set of CVS trees, by examining the
@@ -52,6 +52,7 @@ __RCSID("$NetBSD: cvslatest.c,v 1.6 2017
 #include <string.h>
 #include <stdlib.h>
 #include <unistd.h>
+#include <dirent.h>
 #include <err.h>
 #include <fts.h>
 #include <time.h>
@@ -174,11 +175,55 @@ usage(void)
 	exit(EXIT_FAILURE);
 }
 
+static int
+checkDir(char *path, size_t pathlen, const char *name)
+{
+	static const char *files[] = {
+		"Entries", "Root", "Repository",
+	};
+	size_t i;
+
+	for (i = 0; i < __arraycount(files); i++) {
+		snprintf(path, pathlen, "%s/%s", name, files[i]);
+		if (access(path, F_OK) == -1)
+			return 0;
+	}
+
+	return 1;
+}
+
+static const char *
+findCVSDir(char *path, size_t pathlen, const char *name)
+{
+	DIR *dirp;
+	struct dirent *dp;
+	const char *n;
+
+	if ((dirp = opendir(name)) == NULL)
+		err(EXIT_FAILURE, "Can't open `%s'", name);
+
+	while ((dp = readdir(dirp)) != NULL) {
+		n = dp->d_name;
+		if (n[0] == '.' && (n[1] == '\0' ||
+		    (n[1] == '.' && n[2] == '\0')))
+			continue;
+		if (checkDir(path, pathlen, n))
+			goto out;
+	}
+	n = "CVS";
+out:
+	closedir(dirp);
+	strlcpy(path, n, pathlen);
+	return path;
+}
+
+
 int
 main(int argc, char *argv[])
 {
 	struct latest lat;
-	const char *name = "CVS";
+	const char *name = NULL;
+	char path[MAXPATHLEN];
 	int c;
 
 	while ((c = getopt(argc, argv, "din:")) != -1)
@@ -202,6 +247,9 @@ main(int argc, char *argv[])
 	// So that mktime behaves consistently
 	setenv("TZ", "UTC", 1);
 
+	if (name == NULL)
+		name = findCVSDir(path, sizeof(path), argv[optind]);
+
 	cvsscan(argv + optind, name, &lat);
 	if (debug)
 		printlat(&lat);

Reply via email to