svn commit: r255232 - head/usr.bin/patch

Stefan Esser se at FreeBSD.org
Thu Sep 5 05:51:16 UTC 2013


Author: se
Date: Thu Sep  5 05:51:15 2013
New Revision: 255232
URL: http://svnweb.freebsd.org/changeset/base/255232

Log:
  Fix file selection logic for the RCS/SCCS case, as was done for the simple
  file case before. Bump version because of the changed behavior, which now
  matches the documentation.
  
  Reviewed by:	pfg

Modified:
  head/usr.bin/patch/pch.c
  head/usr.bin/patch/util.c

Modified: head/usr.bin/patch/pch.c
==============================================================================
--- head/usr.bin/patch/pch.c	Thu Sep  5 04:00:48 2013	(r255231)
+++ head/usr.bin/patch/pch.c	Thu Sep  5 05:51:15 2013	(r255232)
@@ -1516,15 +1516,12 @@ posix_name(const struct file_name *names
 	return path ? savestr(path) : NULL;
 }
 
-/*
- * Choose the name of the file to be patched based the "best" one
- * available.
- */
 static char *
-best_name(const struct file_name *names, bool assume_exists)
+compare_names(const struct file_name *names, bool assume_exists, int phase)
 {
 	size_t min_components, min_baselen, min_len, tmp;
 	char *best = NULL;
+	char *path;
 	int i;
 
 	/*
@@ -1536,47 +1533,43 @@ best_name(const struct file_name *names,
 	 */
 	min_components = min_baselen = min_len = SIZE_MAX;
 	for (i = INDEX_FILE; i >= OLD_FILE; i--) {
-		if (names[i].path == NULL ||
-		    (!names[i].exists && !assume_exists))
+		path = names[i].path;
+		if (path == NULL ||
+		    (phase == 1 && !names[i].exists && !assume_exists) ||
+		    (phase == 2 && checked_in(path) == NULL))
 			continue;
-		if ((tmp = num_components(names[i].path)) > min_components)
+		if ((tmp = num_components(path)) > min_components)
 			continue;
 		if (tmp < min_components) {
 			min_components = tmp;
-			best = names[i].path;
+			best = path;
 		}
-		if ((tmp = strlen(basename(names[i].path))) > min_baselen)
+		if ((tmp = strlen(basename(path))) > min_baselen)
 			continue;
 		if (tmp < min_baselen) {
 			min_baselen = tmp;
-			best = names[i].path;
+			best = path;
 		}
-		if ((tmp = strlen(names[i].path)) > min_len)
+		if ((tmp = strlen(path)) > min_len)
 			continue;
 		min_len = tmp;
-		best = names[i].path;
+		best = path;
 	}
+	return best;
+}
+
+/*
+ * Choose the name of the file to be patched based the "best" one
+ * available.
+ */
+static char *
+best_name(const struct file_name *names, bool assume_exists)
+{
+	char *best;
+
+	best = compare_names(names, assume_exists, 1);
 	if (best == NULL) {
-		/*
-		 * No files found, look for something we can checkout from
-		 * RCS/SCCS dirs.  Logic is identical to that above...
-		 */
-		min_components = min_baselen = min_len = SIZE_MAX;
-		for (i = INDEX_FILE; i >= OLD_FILE; i--) {
-			if (names[i].path == NULL ||
-			    checked_in(names[i].path) == NULL)
-				continue;
-			if ((tmp = num_components(names[i].path)) > min_components)
-				continue;
-			min_components = tmp;
-			if ((tmp = strlen(basename(names[i].path))) > min_baselen)
-				continue;
-			min_baselen = tmp;
-			if ((tmp = strlen(names[i].path)) > min_len)
-				continue;
-			min_len = tmp;
-			best = names[i].path;
-		}
+		best = compare_names(names, assume_exists, 2);
 		/*
 		 * Still no match?  Check to see if the diff could be creating
 		 * a new file.

Modified: head/usr.bin/patch/util.c
==============================================================================
--- head/usr.bin/patch/util.c	Thu Sep  5 04:00:48 2013	(r255231)
+++ head/usr.bin/patch/util.c	Thu Sep  5 05:51:15 2013	(r255232)
@@ -412,7 +412,7 @@ checked_in(char *file)
 void
 version(void)
 {
-	fprintf(stderr, "patch 2.0-12u8 FreeBSD\n");
+	fprintf(stderr, "patch 2.0-12u9 FreeBSD\n");
 	my_exit(EXIT_SUCCESS);
 }
 


More information about the svn-src-all mailing list