From e678759c309d8840ca620c77e6a6668b704c3220 Mon Sep 17 00:00:00 2001 From: Xin LI Date: Sat, 15 Aug 2015 00:42:33 +0000 Subject: [PATCH] Remove automatic checkout feature. Obtained from: DragonFly via OpenBSD Relnotes: yes MFC: never --- usr.bin/patch/common.h | 6 --- usr.bin/patch/inp.c | 97 ++---------------------------------------- usr.bin/patch/patch.1 | 19 +++------ usr.bin/patch/pch.c | 35 ++++----------- usr.bin/patch/util.c | 28 +----------- usr.bin/patch/util.h | 1 - 6 files changed, 19 insertions(+), 167 deletions(-) diff --git a/usr.bin/patch/common.h b/usr.bin/patch/common.h index f33abcfd79e2..2cdeaffc7618 100644 --- a/usr.bin/patch/common.h +++ b/usr.bin/patch/common.h @@ -42,12 +42,6 @@ #define BUFFERSIZE 4096 #define LINENUM_MAX LONG_MAX -#define SCCSPREFIX "s." - -#define RCSSUFFIX ",v" -#define CHECKOUT "/usr/bin/co" -#define RCSDIFF "/usr/bin/rcsdiff" - #define ORIGEXT ".orig" #define REJEXT ".rej" diff --git a/usr.bin/patch/inp.c b/usr.bin/patch/inp.c index f4daeae389cd..19536da0f5f8 100644 --- a/usr.bin/patch/inp.c +++ b/usr.bin/patch/inp.c @@ -137,13 +137,12 @@ reallocate_lines(size_t *lines_allocated) static bool plan_a(const char *filename) { - int ifd, statfailed, pstat; - char *p, *s, lbuf[INITLINELEN]; + int ifd, statfailed; + char *p, *s; struct stat filestat; ptrdiff_t sz; size_t i; size_t iline, lines_allocated; - pid_t pid; #ifdef DEBUGGING if (debug & 8) @@ -169,96 +168,8 @@ plan_a(const char *filename) close(creat(filename, 0666)); statfailed = stat(filename, &filestat); } - if (statfailed && check_only) - fatal("%s not found, -C mode, can't probe further\n", filename); - /* For nonexistent or read-only files, look for RCS versions. */ - - if (statfailed || - /* No one can write to it. */ - (filestat.st_mode & 0222) == 0 || - /* I can't write to it. */ - ((filestat.st_mode & 0022) == 0 && filestat.st_uid != getuid())) { - char *filebase, *filedir; - struct stat cstat; - char *tmp_filename1, *tmp_filename2; - char *argp[4] = { NULL }; - posix_spawn_file_actions_t file_actions; - - tmp_filename1 = strdup(filename); - tmp_filename2 = strdup(filename); - if (tmp_filename1 == NULL || tmp_filename2 == NULL) - fatal("strdupping filename"); - - filebase = basename(tmp_filename1); - filedir = dirname(tmp_filename2); - - memset(argp, 0, sizeof(argp)); - -#define try(f, a1, a2, a3) \ - (snprintf(lbuf, sizeof(lbuf), f, a1, a2, a3), stat(lbuf, &cstat) == 0) - - /* - * else we can't write to it but it's not under a version - * control system, so just proceed. - */ - if (try("%s/RCS/%s%s", filedir, filebase, RCSSUFFIX) || - try("%s/RCS/%s%s", filedir, filebase, "") || - try("%s/%s%s", filedir, filebase, RCSSUFFIX)) { - if (!statfailed) { - if ((filestat.st_mode & 0222) != 0) - /* The owner can write to it. */ - fatal("file %s seems to be locked " - "by somebody else under RCS\n", - filename); - /* - * It might be checked out unlocked. See if - * it's safe to check out the default version - * locked. - */ - if (verbose) - say("Comparing file %s to default " - "RCS version...\n", filename); - - argp[0] = __DECONST(char *, RCSDIFF); - argp[1] = __DECONST(char *, filename); - posix_spawn_file_actions_init(&file_actions); - posix_spawn_file_actions_addopen(&file_actions, - STDOUT_FILENO, _PATH_DEVNULL, O_WRONLY, 0); - if (posix_spawn(&pid, RCSDIFF, &file_actions, - NULL, argp, NULL) == 0) { - pid = waitpid(pid, &pstat, 0); - if (pid == -1 || WEXITSTATUS(pstat) != 0) - fatal("can't check out file %s: " - "differs from default RCS version\n", - filename); - } else - fatal("posix_spawn: %s\n", strerror(errno)); - posix_spawn_file_actions_destroy(&file_actions); - } - - if (verbose) - say("Checking out file %s from RCS...\n", - filename); - - argp[0] = __DECONST(char *, CHECKOUT); - argp[1] = __DECONST(char *, "-l"); - argp[2] = __DECONST(char *, filename); - if (posix_spawn(&pid, CHECKOUT, NULL, NULL, argp, - NULL) == 0) { - pid = waitpid(pid, &pstat, 0); - if (pid == -1 || WEXITSTATUS(pstat) != 0 || - stat(filename, &filestat)) - fatal("can't check out file %s from RCS\n", - filename); - } else - fatal("posix_spawn: %s\n", strerror(errno)); - } else if (statfailed) { - fatal("can't find %s\n", filename); - } - free(tmp_filename1); - free(tmp_filename2); - } - + if (statfailed) + fatal("can't find %s\n", filename); filemode = filestat.st_mode; if (!S_ISREG(filemode)) fatal("%s is not a normal file--can't patch\n", filename); diff --git a/usr.bin/patch/patch.1 b/usr.bin/patch/patch.1 index 25adf5f9237a..e8478fc0438e 100644 --- a/usr.bin/patch/patch.1 +++ b/usr.bin/patch/patch.1 @@ -21,7 +21,7 @@ .\" .\" $OpenBSD: patch.1,v 1.27 2014/04/15 06:26:54 jmc Exp $ .\" $FreeBSD$ -.Dd July 21, 2015 +.Dd August 15, 2015 .Dt PATCH 1 .Os .Sh NAME @@ -175,7 +175,7 @@ for that. .Fl Fl input Ar patchfile .Xc Causes the next argument to be interpreted as the input file name -(i.e. a patchfile). +(i.e., a patchfile). This option may be specified multiple times. .It Fl l , Fl Fl ignore-whitespace Causes the pattern matching to be done loosely, in case the tabs and @@ -245,7 +245,7 @@ option. Tells .Nm that this patch was created with the old and new files swapped. -(Yes, I'm afraid that does happen occasionally, human nature being what it +(Yes, I am afraid that does happen occasionally, human nature being what it is.) .Nm will attempt to swap each hunk around before applying it. @@ -263,7 +263,7 @@ If it can, you will be asked if you want to have the option set. If it cannot, the patch will continue to be applied normally. (Note: this method cannot detect a reversed patch if it is a normal diff -and if the first command is an append (i.e. it should have been a delete) +and if the first command is an append (i.e., it should have been a delete) since appends always succeed, due to the fact that a null context will match anywhere. Luckily, most patches add or change lines rather than delete them, so most @@ -387,7 +387,7 @@ given in the hunk. First .Nm looks for a place where all lines of the context match. -If no such place is found, and it's a context diff, and the maximum fuzz factor +If no such place is found, and it is a context diff, and the maximum fuzz factor is set to 1 or more, then another scan takes place ignoring the first and last line of context. If that fails, and the maximum fuzz factor is set to 2 or more, @@ -483,15 +483,6 @@ file names or, for a non-context diff, the file name, and choose the file name with the fewest path components, the shortest basename, and the shortest total file name length (in that order). .It -If no file exists, -.Nm -checks for the existence of the files in an SCCS or RCS directory -(using the appropriate prefix or suffix) using the criteria specified -above. -If found, -.Nm -will attempt to get or check out the file. -.It If no suitable file was found to patch, the patch file is a context or unified diff, and the old file was zero length, the new file name is created and used. diff --git a/usr.bin/patch/pch.c b/usr.bin/patch/pch.c index 5fadf6292f67..cae7bf44354b 100644 --- a/usr.bin/patch/pch.c +++ b/usr.bin/patch/pch.c @@ -1501,17 +1501,8 @@ posix_name(const struct file_name *names, bool assume_exists) } if (path == NULL && !assume_exists) { /* - * No files found, look for something we can checkout from - * RCS/SCCS dirs. Same order as above. - */ - for (i = 0; i < MAX_FILE; i++) { - if (names[i].path != NULL && - (path = checked_in(names[i].path)) != NULL) - break; - } - /* - * Still no match? Check to see if the diff could be creating - * a new file. + * No files found, check to see if the diff could be + * creating a new file. */ if (path == NULL && ok_to_create_file && names[NEW_FILE].path != NULL) @@ -1522,7 +1513,7 @@ posix_name(const struct file_name *names, bool assume_exists) } static char * -compare_names(const struct file_name *names, bool assume_exists, int phase) +compare_names(const struct file_name *names, bool assume_exists) { size_t min_components, min_baselen, min_len, tmp; char *best = NULL; @@ -1539,9 +1530,7 @@ compare_names(const struct file_name *names, bool assume_exists, int phase) min_components = min_baselen = min_len = SIZE_MAX; for (i = INDEX_FILE; i >= OLD_FILE; i--) { path = names[i].path; - if (path == NULL || - (phase == 1 && !names[i].exists && !assume_exists) || - (phase == 2 && checked_in(path) == NULL)) + if (path == NULL || (!names[i].exists && !assume_exists)) continue; if ((tmp = num_components(path)) > min_components) continue; @@ -1572,17 +1561,11 @@ best_name(const struct file_name *names, bool assume_exists) { char *best; - best = compare_names(names, assume_exists, 1); - if (best == NULL) { - best = compare_names(names, assume_exists, 2); - /* - * Still no match? Check to see if the diff could be creating - * a new file. - */ - if (best == NULL && ok_to_create_file && - names[NEW_FILE].path != NULL) - best = names[NEW_FILE].path; - } + best = compare_names(names, assume_exists); + + /* No match? Check to see if the diff could be creating a new file. */ + if (best == NULL && ok_to_create_file) + best = names[NEW_FILE].path; return best ? xstrdup(best) : NULL; } diff --git a/usr.bin/patch/util.c b/usr.bin/patch/util.c index 1859e17e25ef..39a2eedec357 100644 --- a/usr.bin/patch/util.c +++ b/usr.bin/patch/util.c @@ -399,36 +399,10 @@ fetchname(const char *at, bool *exists, int strip_leading) return name; } -/* - * Takes the name returned by fetchname and looks in RCS/SCCS directories - * for a checked in version. - */ -char * -checked_in(char *file) -{ - char *filebase, *filedir, tmpbuf[PATH_MAX]; - struct stat filestat; - - filebase = basename(file); - filedir = dirname(file); - -#define try(f, a1, a2, a3) \ -(snprintf(tmpbuf, sizeof tmpbuf, f, a1, a2, a3), stat(tmpbuf, &filestat) == 0) - - if (try("%s/RCS/%s%s", filedir, filebase, RCSSUFFIX) || - try("%s/RCS/%s%s", filedir, filebase, "") || - try("%s/%s%s", filedir, filebase, RCSSUFFIX) || - try("%s/SCCS/%s%s", filedir, SCCSPREFIX, filebase) || - try("%s/%s%s", filedir, SCCSPREFIX, filebase)) - return file; - - return NULL; -} - void version(void) { - printf("patch 2.0-12u10 FreeBSD\n"); + printf("patch 2.0-12u11 FreeBSD\n"); my_exit(EXIT_SUCCESS); } diff --git a/usr.bin/patch/util.h b/usr.bin/patch/util.h index ff2feabebfae..2ef6b2f3ec18 100644 --- a/usr.bin/patch/util.h +++ b/usr.bin/patch/util.h @@ -28,7 +28,6 @@ */ char *fetchname(const char *, bool *, int); -char *checked_in(char *); int backup_file(const char *); int move_file(const char *, const char *); int copy_file(const char *, const char *);