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
 }
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to