summaryrefslogtreecommitdiffstats
path: root/contrib/cvs/src/patch.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/cvs/src/patch.c')
-rw-r--r--contrib/cvs/src/patch.c105
1 files changed, 73 insertions, 32 deletions
diff --git a/contrib/cvs/src/patch.c b/contrib/cvs/src/patch.c
index 194999b..9d091c3 100644
--- a/contrib/cvs/src/patch.c
+++ b/contrib/cvs/src/patch.c
@@ -3,7 +3,7 @@
* Copyright (c) 1989-1992, Brian Berliner
*
* You may distribute under the terms of the GNU General Public License as
- * specified in the README file that comes with the CVS 1.4 kit.
+ * specified in the README file that comes with the CVS source distribution.
*
* Patch
*
@@ -54,6 +54,7 @@ static const char *const patch_usage[] =
"\t-D date\tDate.\n",
"\t-r rev\tRevision - symbolic or numeric.\n",
"\t-V vers\tUse RCS Version \"vers\" for keyword expansion.\n",
+ "(Specify the --help global option for a list of other help options)\n",
NULL
};
@@ -385,6 +386,7 @@ patch_fileproc (callerdat, finfo)
size_t line2_chars_allocated;
char *cp1, *cp2;
FILE *fp;
+ int line_length;
line1 = NULL;
line1_chars_allocated = 0;
@@ -461,23 +463,39 @@ patch_fileproc (callerdat, finfo)
if (patch_short)
{
- (void) printf ("File %s ", finfo->fullname);
+ cvs_output ("File ", 0);
+ cvs_output (finfo->fullname, 0);
if (vers_tag == NULL)
- (void) printf ("is new; current revision %s\n", vers_head);
+ {
+ cvs_output (" is new; current revision ", 0);
+ cvs_output (vers_head, 0);
+ cvs_output ("\n", 1);
+ }
else if (vers_head == NULL)
{
- (void) printf ("is removed; not included in ");
+ cvs_output (" is removed; not included in ", 0);
if (rev2 != NULL)
- (void) printf ("release tag %s", rev2);
+ {
+ cvs_output ("release tag ", 0);
+ cvs_output (rev2, 0);
+ }
else if (date2 != NULL)
- (void) printf ("release date %s", date2);
+ {
+ cvs_output ("release date ", 0);
+ cvs_output (date2, 0);
+ }
else
- (void) printf ("current release");
- (void) printf ("\n");
+ cvs_output ("current release", 0);
+ cvs_output ("\n", 1);
}
else
- (void) printf ("changed from revision %s to %s\n",
- vers_tag, vers_head);
+ {
+ cvs_output (" changed from revision ", 0);
+ cvs_output (vers_tag, 0);
+ cvs_output (" to ", 0);
+ cvs_output (vers_head, 0);
+ cvs_output ("\n", 1);
+ }
ret = 0;
goto out2;
}
@@ -542,11 +560,8 @@ patch_fileproc (callerdat, finfo)
and therefore should be on the server, not the client. */
(void) utime (tmpfile2, &t);
}
- run_setup ("%s -%c", DIFF, unidiff ? 'u' : 'c');
- run_arg (tmpfile1);
- run_arg (tmpfile2);
- switch (run_exec (RUN_TTY, tmpfile3, RUN_TTY, RUN_REALLY))
+ switch (diff_exec (tmpfile1, tmpfile2, unidiff ? "-u" : "-c", tmpfile3))
{
case -1: /* fork/wait failure */
error (1, errno, "fork for diff failed on %s", rcs);
@@ -561,9 +576,9 @@ patch_fileproc (callerdat, finfo)
*/
/* Output an "Index:" line for patch to use */
- (void) fflush (stdout);
- (void) printf ("Index: %s\n", finfo->fullname);
- (void) fflush (stdout);
+ cvs_output ("Index: ", 0);
+ cvs_output (finfo->fullname, 0);
+ cvs_output ("\n", 1);
fp = open_file (tmpfile3, "r");
if (getline (&line1, &line1_chars_allocated, fp) < 0 ||
@@ -628,25 +643,49 @@ patch_fileproc (callerdat, finfo)
(void) sprintf (file2, "%s:%s", finfo->fullname,
vers_head ? vers_head : "removed");
- /* Note that this prints "diff" not DIFF. The format of a diff
- does not depend on the name of the program which happens to
- have produced it. */
+ /* Note that the string "diff" is specified by POSIX (for -c)
+ and is part of the diff output format, not the name of a
+ program. */
if (unidiff)
{
- (void) printf ("diff -u %s %s\n", file1, file2);
- (void) printf ("--- %s%s+++ ", file1, cp1);
+ cvs_output ("diff -u ", 0);
+ cvs_output (file1, 0);
+ cvs_output (" ", 1);
+ cvs_output (file2, 0);
+ cvs_output ("\n", 1);
+
+ cvs_output ("--- ", 0);
+ cvs_output (file1, 0);
+ cvs_output (cp1, 0);
+ cvs_output ("+++ ", 0);
}
else
{
- (void) printf ("diff -c %s %s\n", file1, file2);
- (void) printf ("*** %s%s--- ", file1, cp1);
+ cvs_output ("diff -c ", 0);
+ cvs_output (file1, 0);
+ cvs_output (" ", 1);
+ cvs_output (file2, 0);
+ cvs_output ("\n", 1);
+
+ cvs_output ("*** ", 0);
+ cvs_output (file1, 0);
+ cvs_output (cp1, 0);
+ cvs_output ("--- ", 0);
}
- (void) printf ("%s%s", finfo->fullname, cp2);
+ cvs_output (finfo->fullname, 0);
+ cvs_output (cp2, 0);
+
/* spew the rest of the diff out */
- while (getline (&line1, &line1_chars_allocated, fp) >= 0)
- (void) fputs (line1, stdout);
- (void) fclose (fp);
+ while ((line_length
+ = getline (&line1, &line1_chars_allocated, fp))
+ >= 0)
+ cvs_output (line1, 0);
+ if (line_length < 0 && !feof (fp))
+ error (0, errno, "cannot read %s", tmpfile3);
+
+ if (fclose (fp) < 0)
+ error (0, errno, "cannot close %s", tmpfile3);
free (file1);
free (file2);
break;
@@ -658,10 +697,12 @@ patch_fileproc (callerdat, finfo)
free (line1);
if (line2)
free (line2);
- /* FIXME: should be checking for errors. */
- (void) CVS_UNLINK (tmpfile1);
- (void) CVS_UNLINK (tmpfile2);
- (void) CVS_UNLINK (tmpfile3);
+ if (CVS_UNLINK (tmpfile1) < 0)
+ error (0, errno, "cannot unlink %s", tmpfile1);
+ if (CVS_UNLINK (tmpfile2) < 0)
+ error (0, errno, "cannot unlink %s", tmpfile2);
+ if (CVS_UNLINK (tmpfile3) < 0)
+ error (0, errno, "cannot unlink %s", tmpfile3);
free (tmpfile1);
free (tmpfile2);
free (tmpfile3);
OpenPOWER on IntegriCloud