svn commit: r360437 - in head/usr.bin/diff: . tests
Kyle Evans
kevans at FreeBSD.org
Tue Apr 28 14:33:34 UTC 2020
Author: kevans
Date: Tue Apr 28 14:33:33 2020
New Revision: 360437
URL: https://svnweb.freebsd.org/changeset/base/360437
Log:
diff(1): don't reject specifying the same format multiple times
This may happen, for instance, if one happens to have an alias of diff to
diff -up and attempts to specify the amount of context on top of that.
Aliases like this may cause other problems, but if they're really not ever
generating non-unified diffs then we should at least not break that
use-case.
In addition, we'll now pick up a format mismatch if -p is specified with
!contextual && !unified && !unset.
Fix up a small trailing whitespace nit in the tests while we're here, and
add tests to make sure that we can double up all the formatting options.
Reported by: jbeich
MFC after: 3 days
Modified:
head/usr.bin/diff/diff.c
head/usr.bin/diff/tests/diff_test.sh
Modified: head/usr.bin/diff/diff.c
==============================================================================
--- head/usr.bin/diff/diff.c Tue Apr 28 13:51:41 2020 (r360436)
+++ head/usr.bin/diff/diff.c Tue Apr 28 14:33:33 2020 (r360437)
@@ -122,6 +122,8 @@ main(int argc, char **argv)
newarg = 1;
diff_context = 3;
diff_format = D_UNSET;
+#define FORMAT_MISMATCHED(type) \
+ (diff_format != D_UNSET && diff_format != (type))
while ((ch = getopt_long(argc, argv, OPTIONS, longopts, NULL)) != -1) {
switch (ch) {
case '0': case '1': case '2': case '3': case '4':
@@ -142,7 +144,7 @@ main(int argc, char **argv)
break;
case 'C':
case 'c':
- if (diff_format != D_UNSET)
+ if (FORMAT_MISMATCHED(D_CONTEXT))
conflicting_format();
cflag = 1;
diff_format = D_CONTEXT;
@@ -157,18 +159,18 @@ main(int argc, char **argv)
dflags |= D_MINIMAL;
break;
case 'D':
- if (diff_format != D_UNSET)
+ if (FORMAT_MISMATCHED(D_IFDEF))
conflicting_format();
diff_format = D_IFDEF;
ifdefname = optarg;
break;
case 'e':
- if (diff_format != D_UNSET)
+ if (FORMAT_MISMATCHED(D_EDIT))
conflicting_format();
diff_format = D_EDIT;
break;
case 'f':
- if (diff_format != D_UNSET)
+ if (FORMAT_MISMATCHED(D_REVERSE))
conflicting_format();
diff_format = D_REVERSE;
break;
@@ -202,11 +204,20 @@ main(int argc, char **argv)
Nflag = 1;
break;
case 'n':
- if (diff_format != D_UNSET)
+ if (FORMAT_MISMATCHED(D_NREVERSE))
conflicting_format();
diff_format = D_NREVERSE;
break;
case 'p':
+ /*
+ * If it's not unset and it's not set to context or
+ * unified, we'll error out here as a conflicting
+ * format. If it's unset, we'll go ahead and set it to
+ * context.
+ */
+ if (FORMAT_MISMATCHED(D_CONTEXT) &&
+ FORMAT_MISMATCHED(D_UNIFIED))
+ conflicting_format();
if (diff_format == D_UNSET)
diff_format = D_CONTEXT;
dflags |= D_PROTOTYPE;
@@ -218,7 +229,7 @@ main(int argc, char **argv)
rflag = 1;
break;
case 'q':
- if (diff_format != D_UNSET)
+ if (FORMAT_MISMATCHED(D_BRIEF))
conflicting_format();
diff_format = D_BRIEF;
break;
@@ -236,7 +247,7 @@ main(int argc, char **argv)
break;
case 'U':
case 'u':
- if (diff_format != D_UNSET)
+ if (FORMAT_MISMATCHED(D_UNIFIED))
conflicting_format();
diff_format = D_UNIFIED;
if (optarg != NULL) {
@@ -264,12 +275,12 @@ main(int argc, char **argv)
push_excludes(optarg);
break;
case 'y':
- if (diff_format != D_UNSET)
+ if (FORMAT_MISMATCHED(D_SIDEBYSIDE))
conflicting_format();
diff_format = D_SIDEBYSIDE;
break;
case OPT_CHANGED_GROUP_FORMAT:
- if (diff_format != D_UNSET)
+ if (FORMAT_MISMATCHED(D_GFORMAT))
conflicting_format();
diff_format = D_GFORMAT;
group_format = optarg;
@@ -283,7 +294,7 @@ main(int argc, char **argv)
ignore_file_case = 0;
break;
case OPT_NORMAL:
- if (diff_format != D_UNSET)
+ if (FORMAT_MISMATCHED(D_NORMAL))
conflicting_format();
diff_format = D_NORMAL;
break;
Modified: head/usr.bin/diff/tests/diff_test.sh
==============================================================================
--- head/usr.bin/diff/tests/diff_test.sh Tue Apr 28 13:51:41 2020 (r360436)
+++ head/usr.bin/diff/tests/diff_test.sh Tue Apr 28 14:33:33 2020 (r360437)
@@ -186,6 +186,13 @@ conflicting_format_body()
atf_check -s exit:2 -e ignore diff -q -c A B
atf_check -s exit:2 -e ignore diff --normal -c A B
atf_check -s exit:2 -e ignore diff -c --normal A B
+
+ atf_check -s exit:1 -o ignore -e ignore diff -u -u A B
+ atf_check -s exit:1 -o ignore -e ignore diff -e -e A B
+ atf_check -s exit:1 -o ignore -e ignore diff -y -y A B
+ atf_check -s exit:1 -o ignore -e ignore diff -q -q A B
+ atf_check -s exit:1 -o ignore -e ignore diff -c -c A B
+ atf_check -s exit:1 -o ignore -e ignore diff --normal --normal A B
}
atf_init_test_cases()
@@ -201,5 +208,5 @@ atf_init_test_cases()
atf_add_test_case b230049
atf_add_test_case Bflag
atf_add_test_case tabsize
- atf_add_test_case conflicting_format
+ atf_add_test_case conflicting_format
}
More information about the svn-src-head
mailing list