summaryrefslogtreecommitdiffstats
path: root/contrib/cvs/src
diff options
context:
space:
mode:
authorobrien <obrien@FreeBSD.org>2008-01-13 06:05:24 +0000
committerobrien <obrien@FreeBSD.org>2008-01-13 06:05:24 +0000
commit5ed02a66ebbfc54d53846f6a3b033d325c9ca3f0 (patch)
tree6a4d6a678736a6c72eb10dde6ef99415acc73bd0 /contrib/cvs/src
parentf8bcc52bc38fa4e66250b15d952f75630cd5ae47 (diff)
downloadFreeBSD-src-5ed02a66ebbfc54d53846f6a3b033d325c9ca3f0.zip
FreeBSD-src-5ed02a66ebbfc54d53846f6a3b033d325c9ca3f0.tar.gz
Merge rev 1.16: implement -j for cvs diff, allowing tag:date based diffs
into version 1.11.22.
Diffstat (limited to 'contrib/cvs/src')
-rw-r--r--contrib/cvs/src/diff.c166
1 files changed, 100 insertions, 66 deletions
diff --git a/contrib/cvs/src/diff.c b/contrib/cvs/src/diff.c
index 7faaae8..8a61f9a 100644
--- a/contrib/cvs/src/diff.c
+++ b/contrib/cvs/src/diff.c
@@ -1,6 +1,11 @@
/*
- * Copyright (c) 1992, Brian Berliner and Jeff Polk
- * Copyright (c) 1989-1992, Brian Berliner
+ * Copyright (C) 1986-2005 The Free Software Foundation, Inc.
+ *
+ * Portions Copyright (C) 1998-2005 Derek Price, Ximbiot <http://ximbiot.com>,
+ * and others.
+ *
+ * Portions Copyright (C) 1992, Brian Berliner and Jeff Polk
+ * Portions 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 source distribution.
@@ -63,8 +68,9 @@ static int have_rev1_label, have_rev2_label;
static char *user_file_rev;
static char *options;
-static char *opts;
-static size_t opts_allocated = 1;
+static char **diff_argv;
+static int diff_argc;
+static size_t diff_arg_allocated;
static int diff_errors;
static int empty_files = 0;
@@ -209,6 +215,54 @@ static struct option const longopts[] =
{0, 0, 0, 0}
};
+
+
+/* Add one of OPT or LONGOPT, and ARGUMENT, when present, to global DIFF_ARGV.
+ *
+ * INPUTS
+ * opt A character option representation.
+ * longopt A long option name.
+ * argument Optional option argument.
+ *
+ * GLOBALS
+ * diff_argc The number of arguments in DIFF_ARGV.
+ * diff_argv Array of argument strings.
+ * diff_arg_allocated Allocated length of DIFF_ARGV.
+ *
+ * NOTES
+ * Behavior when both OPT & LONGOPT are provided is undefined.
+ *
+ * RETURNS
+ * Nothing.
+ */
+static void
+add_diff_args (char opt, const char *longopt, const char *argument)
+{
+ char *tmp;
+
+ /* Add opt or longopt to diff_arv. */
+ assert (opt || (longopt && *longopt));
+ assert (!(opt && (longopt && *longopt)));
+ if (opt)
+ {
+ tmp = xmalloc (3);
+ sprintf (tmp, "-%c", opt);
+ }
+ else
+ {
+ tmp = xmalloc (3 + strlen (longopt));
+ sprintf (tmp, "--%s", longopt);
+ }
+ run_add_arg_p (&diff_argc, &diff_arg_allocated, &diff_argv, tmp);
+ free (tmp);
+
+ /* When present, add ARGUMENT to DIFF_ARGV. */
+ if (argument)
+ run_add_arg_p (&diff_argc, &diff_arg_allocated, &diff_argv, argument);
+}
+
+
+
/* CVS 1.9 and similar versions seemed to have pretty weird handling
of -y and -T. In the cases where it called rcsdiff,
they would have the meanings mentioned below. In the cases where it
@@ -245,7 +299,6 @@ diff (argc, argv)
int argc;
char **argv;
{
- char tmp[50];
int c, err = 0;
int local = 0;
int which;
@@ -265,12 +318,11 @@ diff (argc, argv)
/* Clean out our global variables (multiroot can call us multiple
times and the server can too, if the client sends several
diff commands). */
- if (opts == NULL)
+ if (diff_argc)
{
- opts_allocated = 1;
- opts = xmalloc (opts_allocated);
+ run_arg_free_p (diff_argc, diff_argv);
+ diff_argc = 0;
}
- opts[0] = '\0';
diff_rev1 = NULL;
diff_rev2 = NULL;
diff_date1 = NULL;
@@ -293,7 +345,7 @@ diff (argc, argv)
switch (c)
{
case 'y':
- xrealloc_and_strcat (&opts, &opts_allocated, " --side-by-side");
+ add_diff_args (0, "side-by-side", NULL);
break;
case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
case 'h': case 'i': case 'n': case 'p': case 's': case 't':
@@ -301,8 +353,7 @@ diff (argc, argv)
case '0': case '1': case '2': case '3': case '4': case '5':
case '6': case '7': case '8': case '9':
case 'B': case 'H': case 'T':
- (void) sprintf (tmp, " -%c", (char) c);
- xrealloc_and_strcat (&opts, &opts_allocated, tmp);
+ add_diff_args (c, NULL, NULL);
break;
case 'L':
if (have_rev1_label++)
@@ -311,33 +362,15 @@ diff (argc, argv)
error (0, 0, "extra -L arguments ignored");
break;
}
-
- xrealloc_and_strcat (&opts, &opts_allocated, " -L");
- xrealloc_and_strcat (&opts, &opts_allocated, optarg);
- break;
+ /* Fall through. */
case 'C': case 'F': case 'I': case 'U': case 'W':
- (void) sprintf (tmp, " -%c", (char) c);
- xrealloc_and_strcat (&opts, &opts_allocated, tmp);
- xrealloc_and_strcat (&opts, &opts_allocated, optarg);
- break;
- case 131:
- /* --ifdef. */
- xrealloc_and_strcat (&opts, &opts_allocated, " --ifdef=");
- xrealloc_and_strcat (&opts, &opts_allocated, optarg);
+ add_diff_args (c, NULL, optarg);
break;
- case 129: case 130: case 132: case 133: case 134:
+ case 129: case 130: case 131: case 132: case 133: case 134:
case 135: case 136: case 137: case 138: case 139: case 140:
case 141: case 142: case 143: case 145: case 146:
- xrealloc_and_strcat (&opts, &opts_allocated, " --");
- xrealloc_and_strcat (&opts, &opts_allocated,
- longopts[option_index].name);
- if (longopts[option_index].has_arg == 1
- || (longopts[option_index].has_arg == 2
- && optarg != NULL))
- {
- xrealloc_and_strcat (&opts, &opts_allocated, "=");
- xrealloc_and_strcat (&opts, &opts_allocated, optarg);
- }
+ add_diff_args (0, longopts[option_index].name,
+ longopts[option_index].has_arg ? optarg : NULL);
break;
case 'R':
local = 0;
@@ -416,7 +449,7 @@ diff (argc, argv)
send_arg("-l");
if (empty_files)
send_arg("-N");
- send_option_string (opts);
+ send_options (diff_argc, diff_argv);
if (options[0] != '\0')
send_arg (options);
if (diff_join1)
@@ -446,24 +479,24 @@ diff (argc, argv)
err = get_responses_and_close ();
} else
#endif
- {
- if (diff_rev1 != NULL)
- tag_check_valid (diff_rev1, argc, argv, local, 0, "");
- if (diff_rev2 != NULL)
- tag_check_valid (diff_rev2, argc, argv, local, 0, "");
-
- which = W_LOCAL;
- if (diff_rev1 != NULL || diff_date1 != NULL)
- which |= W_REPOS | W_ATTIC;
-
- wrap_setup ();
-
- /* start the recursion processor */
- err = start_recursion (diff_fileproc, diff_filesdoneproc, diff_dirproc,
- diff_dirleaveproc, NULL, argc, argv, local,
- which, 0, CVS_LOCK_READ, (char *) NULL, 1,
- (char *) NULL);
- }
+ { /* FreeBSD addition - warning idention not changed til matching-} */
+ if (diff_rev1 != NULL)
+ tag_check_valid (diff_rev1, argc, argv, local, 0, "");
+ if (diff_rev2 != NULL)
+ tag_check_valid (diff_rev2, argc, argv, local, 0, "");
+
+ which = W_LOCAL;
+ if (diff_rev1 != NULL || diff_date1 != NULL)
+ which |= W_REPOS | W_ATTIC;
+
+ wrap_setup ();
+
+ /* start the recursion processor */
+ err = start_recursion (diff_fileproc, diff_filesdoneproc, diff_dirproc,
+ diff_dirleaveproc, NULL, argc, argv, local,
+ which, 0, CVS_LOCK_READ, (char *) NULL, 1,
+ (char *) NULL);
+ } /* FreeBSD addition */
/* clean up */
free (options);
@@ -522,7 +555,7 @@ diff_fileproc (callerdat, finfo)
int exists;
exists = 0;
- /* special handling for TAG_HEAD XXX */
+ /* special handling for TAG_HEAD */
if (diff_rev1 && strcmp (diff_rev1, TAG_HEAD) == 0)
{
char *head =
@@ -733,8 +766,8 @@ RCS file: ", 0);
if (empty_file == DIFF_ADDED)
{
if (use_rev2 == NULL)
- status = diff_exec (DEVNULL, finfo->file, label1, label2, opts,
- RUN_TTY);
+ status = diff_exec (DEVNULL, finfo->file, label1, label2,
+ diff_argc, diff_argv, RUN_TTY);
else
{
int retcode;
@@ -750,7 +783,8 @@ RCS file: ", 0);
if( retcode != 0 )
goto out;
- status = diff_exec (DEVNULL, tmp, label1, label2, opts, RUN_TTY);
+ status = diff_exec (DEVNULL, tmp, label1, label2,
+ diff_argc, diff_argv, RUN_TTY);
}
}
else
@@ -766,16 +800,16 @@ RCS file: ", 0);
if (retcode != 0)
goto out;
- status = diff_exec (tmp, DEVNULL, label1, label2, opts, RUN_TTY);
+ status = diff_exec (tmp, DEVNULL, label1, label2,
+ diff_argc, diff_argv, RUN_TTY);
}
}
else
{
- status = RCS_exec_rcsdiff(vers->srcfile, opts,
- *options ? options : vers->options,
- use_rev1, rev1_cache, use_rev2,
- label1, label2,
- finfo->file);
+ status = RCS_exec_rcsdiff (vers->srcfile, diff_argc, diff_argv,
+ *options ? options : vers->options,
+ use_rev1, rev1_cache, use_rev2,
+ label1, label2, finfo->file);
}
@@ -919,7 +953,7 @@ diff_file_nodiff( finfo, vers, empty_file, rev1_cache )
if (diff_rev1 || diff_date1)
{
- /* special handling for TAG_HEAD XXX */
+ /* special handling for TAG_HEAD */
if (diff_rev1 && strcmp (diff_rev1, TAG_HEAD) == 0)
{
if (vers->vn_rcs != NULL && vers->srcfile != NULL)
@@ -935,7 +969,7 @@ diff_file_nodiff( finfo, vers, empty_file, rev1_cache )
}
if (diff_rev2 || diff_date2)
{
- /* special handling for TAG_HEAD XXX */
+ /* special handling for TAG_HEAD */
if (diff_rev2 && strcmp (diff_rev2, TAG_HEAD) == 0)
{
if (vers->vn_rcs != NULL && vers->srcfile != NULL)
OpenPOWER on IntegriCloud