summaryrefslogtreecommitdiffstats
path: root/usr.bin
diff options
context:
space:
mode:
authorse <se@FreeBSD.org>2013-09-05 05:51:15 +0000
committerse <se@FreeBSD.org>2013-09-05 05:51:15 +0000
commitf83bb7c481b0e94032788cc80620b4c0c41f71f3 (patch)
treedc68a728f68ce4c126458ae614259b3686d8274d /usr.bin
parentbf3232d8bba436553c7aaba2fe78952c25c7dfa1 (diff)
downloadFreeBSD-src-f83bb7c481b0e94032788cc80620b4c0c41f71f3.zip
FreeBSD-src-f83bb7c481b0e94032788cc80620b4c0c41f71f3.tar.gz
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
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/patch/pch.c59
-rw-r--r--usr.bin/patch/util.c2
2 files changed, 27 insertions, 34 deletions
diff --git a/usr.bin/patch/pch.c b/usr.bin/patch/pch.c
index c6224e7..eca12ad 100644
--- a/usr.bin/patch/pch.c
+++ b/usr.bin/patch/pch.c
@@ -1516,15 +1516,12 @@ posix_name(const struct file_name *names, bool assume_exists)
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, bool assume_exists)
*/
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.
diff --git a/usr.bin/patch/util.c b/usr.bin/patch/util.c
index 28a3cb0..c19918b 100644
--- a/usr.bin/patch/util.c
+++ b/usr.bin/patch/util.c
@@ -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);
}
OpenPOWER on IntegriCloud