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