Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: support more arguments to diff



On 17 Apr, Eitan Adler wrote:
> FreeBSD is in the process of converting to a new diff implementation.
> This resulted in me seeing a huge difference with this patch.

Running the FreeBSD 12 alpha in a jail worked just about well enough for
me to be able to run the new diff in order to adapt the completion to
it. It is mostly similar to GNU diff which is no surprise given that it
likely needed to be backward compatible with the old diff.

I also rearranged a few other options and made some descriptions more
consistent.

Oliver

diff --git a/Completion/Unix/Type/_diff_options b/Completion/Unix/Type/_diff_options
index 55ddecd2a..4fd27442e 100644
--- a/Completion/Unix/Type/_diff_options
+++ b/Completion/Unix/Type/_diff_options
@@ -1,6 +1,6 @@
 #autoload
 
-local of ofwuc ouc oss ofwy ofwg ofwl cmd
+local of ofwuc ouc oss ofwy ofwg ofwl cmd variant
 local -a args
 
 cmd="$1"
@@ -25,16 +25,16 @@ _diff_palette() {
   return ret
 }
 
-if _pick_variant -c $cmd gnu=GNU unix -v; then
+if _pick_variant -r variant -c $cmd gnu=GNU unix -v || [[ $OSTYPE = freebsd<12->.* ]]; then
   # output formats
   of="-y --side-by-side -n --rcs -e -f --ed -q --brief -c -C --context -u -U \
   --unified --old-group-format --new-group-format --changed-group-format \
   --unchanged-group-format --line-format --old-line-format --new-line-format \
-  --unchanged-line-format --normal -D --ifdef"
+  --unchanged-line-format -D --ifdef"
 
   # output formats w/o unified and context
   ofwuc="-y --side-by-side -n --rcs -e -f --ed -q --brief --old-group-format \
-  --new-group-format --changed-group-format --unchanged-group-format --normal \
+  --new-group-format --changed-group-format --unchanged-group-format \
   --line-format --old-line-format --new-line-format --unchanged-line-format \
   -D --ifdef"
 
@@ -48,26 +48,50 @@ if _pick_variant -c $cmd gnu=GNU unix -v; then
   ofwy="-n --rcs -e -f --ed -q --brief -c -C --context -u -U --unified \
   --old-group-format --new-group-format --changed-group-format \
   --unchanged-group-format --line-format --old-line-format \
-  --new-line-format --unchanged-line-format --normal -D --ifdef"
+  --new-line-format --unchanged-line-format -D --ifdef"
 
   # output formats w/o group format
-  ofwg="-n --rcs -e -f --ed -q --brief -c -C --context -u -U --unified --normal \
+  ofwg="-n --rcs -e -f --ed -q --brief -c -C --context -u -U --unified \
   --line-format --old-line-format --new-line-format --unchanged-line-format
   -D --ifdef"
 
   # output formats w/o line format
   ofwl="-n --rcs -e -f --ed -q --brief -c -C --context -u -U --unified \
-  --old-group-format --new-group-format --changed-group-format --normal \
+  --old-group-format --new-group-format --changed-group-format \
   --unchanged-group-format"
 
-  _arguments -s \
+  if [[ $variant = gnu ]]; then
+    (( $#words > 2 )) || args+=(
+      '(-v --version)'{-v,--version}'[display version information]'
+      '--help[display usage information]'
+    )
+    args+=(
+      '(-H --speed-large-files)'{-H,--speed-large-files}'[assume large files and many small changes]'
+      '(-E --ignore-tab-expansion)'{-E,--ignore-tab-expansion}'[ignore changes due to tab expansion]'
+      '(-Z --ignore-trailing-space)'{-Z,--ignore-trailing-space}'[ignore white space at line end]'
+      "($ofwuc $oss -F --show-function-line)"{-F+,--show-function-line=}'[show the most recent line matching regex]:regex'
+      "($ofwy $ouc --width -W)"{--width=,-W+}'[set size of line]:number of characters per line'
+      "($ofwy $ouc)--left-column[output only left column of common lines]"
+      "($ofwy $ouc)--suppress-common-lines[do not output common lines]"
+      "($ofwg $ouc $oss)--old-group-format=[set old group format]:old group format"
+      "($ofwg $ouc $oss)--new-group-format=[set new group format]:new group format"
+      "($ofwl $ouc $oss)--unchanged-line-format=[set unchanged line format]:unchanged line format"
+      '(--to-file)--from-file=[compare specified file to all operands]:from file:_files' \
+      '(--from-file)--to-file=[compare all operands to specified file]:to file:_files' \
+      '--color=-[use colors in output]::when [auto]:(never always auto)'
+      '--palette=[specify colors to use]:color:_diff_palette'
+      "($of $ouc)--side-by-side[output in two columns]"
+      "($of $ouc)-y[output in two columns]"
+    )
+  else
+    args+=( '!--speed-large-files' )
+  fi
+
+  _arguments -s $args \
     '(-i --ignore-case)'{-i,--ignore-case}'[case insensitive]' \
-    '(--no-ignore-file-name-case)--ignore-file-name-case[ignore case when comparing file names]' \
-    '(--ignore-file-name-case)--no-ignore-file-name-case[consider case when comparing file names]' \
-    '(-E --ignore-tab-expansion)'{-E,--ignore-tab-expansion}'[ignore changes due to tab expansion]' \
-    '(-Z --ignore-trailing-space)'{-Z,--ignore-trailing-space}'[ignore white space at line end]' \
+    '--ignore-file-name-case[ignore case when comparing file names]' \
+    '!(--ignore-file-name-case)--no-ignore-file-name-case' \
     '(-b --ignore-space-change)'{-b,--ignore-space-change}'[ignore changes in the amount of white space]' \
-    '(--ignore-all-space -w)'{--ignore-all-space,-w}'[ignore all white space]' \
     '(-B --ignore-blank-lines)'{-B,--ignore-blank-lines}'[ignore lines that are all blank]' \
     '(-I --ignore-matching-lines)'{-I+,--ignore-matching-lines=}'[ignore lines that match regex]:line exclusion regex:' \
     '--strip-trailing-cr[strip trailing carriage return on input]' \
@@ -78,30 +102,18 @@ if _pick_variant -c $cmd gnu=GNU unix -v; then
     "($of $oss)-u[output a unified diff]" \
     "($ofwuc $oss)*"{-L+,--label=}'[set label to use instead of file name and timestamp]:label' \
     "($ofwuc $oss -p --show-c-function)"{-p,--show-c-function}'[show C function of each change]' \
-    "($ofwuc $oss -F --show-function-line)"{-F+,--show-function-line=}'[show the most recent line matching regex]:regex' \
-    "($of $ouc $oss)--brief[output only whether files differ]" \
-    "($of $ouc $oss)-q[output only whether files differ]" \
+    "($of $ouc $oss)"{-q,--brief}'[output only whether files differ]' \
     "($of $ouc $oss -e --ed)"{--ed,-e}'[output an ed script]' \
-    "($of $ouc $oss)--normal[output a normal diff]" \
-    "($of $ouc $oss)--forward-ed[output a reversed ed script]" \
-    "($of $ouc $oss)-f[output a reversed ed script]" \
-    "($of $ouc $oss)--rcs[RCS format diff]" \
-    "($of $ouc $oss)-n[RCS format diff]" \
-    "($of $ouc)--side-by-side[output in two columns]" \
-    "($of $ouc)-y[output in two columns]" \
-    "($ofwy $ouc --width -W)"{--width=,-W+}'[set size of line]:number of characters per line' \
-    "($ofwy $ouc)--left-column[output only left column of common lines]" \
-    "($ofwy $ouc)--suppress-common-lines[do not output common lines]" \
-    "($of $oss)"{-D,--ifdef=}'[output merged file with preprocessor directives]:preprocessor symbol' \
-    "($ofwg $ouc $oss)--old-group-format=[set old group format]:old group format" \
-    "($ofwg $ouc $oss)--new-group-format=[set new group format]:new group format" \
+    "!($of $ouc $oss)--normal" \
+    "($of $ouc $oss)"{-f,--forward-ed}'[output a reversed ed script]' \
+    "($of $ouc $oss)"{-n,--rcs}'[output an RCS format diff]' \
+    "($of $oss)"{-D+,--ifdef=}'[output merged file with preprocessor directives]:preprocessor symbol' \
     "($ofwg $ouc $oss)--changed-group-format=[set changed group format]:changed group format" \
     "($ofwg $ouc $oss)--unchanged-group-format=[set unchanged group format]:unchanged group format" \
     "($ofwl $ouc $oss)--line-format=[set line format]:line format" \
     "($ofwl $ouc $oss)--old-line-format=[set old line format]:old line format" \
     "($ofwl $ouc $oss)--new-line-format=[set new line format]:new line format" \
-    "($ofwl $ouc $oss)--unchanged-line-format=[set unchanged line format]:unchanged line format" \
-    '(-l --paginate)'{-l,--paginate}'[output through pr]' \
+    '(-l --paginate)'{-l,--paginate}'[long output format (paginate with pr(1))]' \
     '(-t --expand-tabs)'{-t,--expand-tabs}'[expand tabs to spaces]' \
     '(-T --initial-tab)'{-T,--initial-tab}'[prepend a tab]' \
     '--tabsize=[specify width of tab]:width [8]' \
@@ -111,66 +123,55 @@ if _pick_variant -c $cmd gnu=GNU unix -v; then
     '(-P --unidirectional-new-file)'{-P,--unidirectional-new-file}'[treat absent first files as empty]' \
     '(-s --report-identical-files)'{-s,--report-identical-files}'[report when two files are the same]' \
     \*{-x+,--exclude=}'[exclude files matching pattern]:exclusion pattern' \
-    '(-X --exclude-from)'{-X+,--exclude-from=}'[exclude files matching pattern in file]:exclude file:_files' \
+    \*{-X+,--exclude-from=}'[exclude files matching pattern in file]:exclude file:_files' \
     '(-S --starting-file)'{-S+,--starting-file=}'[set first file in comparison]:start with file:_files' \
-    '(--to-file)--from-file=[compare specified file to all operands]:from file:_files' \
-    '(--from-file)--to-file=[compare all operands to specified file]:to file:_files' \
     '--horizon-lines=[set number of lines to keep in prefix and suffix]:number of horizon lines' \
     '(-d --minimal)'{-d,--minimal}'[try to find a smaller set of changes]' \
-    '(-H --speed-large-files)'{-H,--speed-large-files}'[assume large files and many small changes]' \
-    '--color=-[use colors in output]::when [auto]:(never always auto)' \
-    '--palette=[specify colors to use]:color:_diff_palette' \
-    '(-v --version)'{-v,--version}'[display version info]' \
-    '--help[display help info]' \
     "$@"
 else
   of='-c -e -f'
   case $OSTYPE in
-    solaris2.<9->)
+    openbsd*|solaris2.<9->)
       of+=' -u -U'
-      args=(
-	"($of)-u[output a unified diff]"
-	"($of)-U[output a unified diff]:lines of context"
-      )
-    ;&
-    solaris*)
-      of+=' -C -h -n -D'
       args+=(
-	'-i[case insensitive]'
-        '-t[expand tabs to spaces]'
-	'-w[ignore all white space]'
+	"($of)-u[output a unified diff]"
+	"($of)-U+[output a unified diff]:lines of context"
+      )
+    ;|
+    openbsd*|solaris*)
+      args+=(
 	"($of)-C+[output a context diff]:lines of context"
-	"($of)-h[do a fast, half-hearted job]"
-	"($of)-n[reversed ed script]"
-	"($of)-D[output merged file with preprocessor directives]:preprocessor symbol"
-        '-l[output through pr]'
+	"($of)-D+[output merged file with preprocessor directives]:preprocessor symbol"
+	'-i[case insensitive]'
+	'-l[long output format (paginate with pr(1))]'
 	'-s[report on identical files]'
+	'-t[expand tabs in output lines]'
+      )
+    ;|
+    solaris*)
+      of+=' -h -n'
+      args+=(
+	'-w[ignore all white space]'
+	"($of)-h[do a fast, half-hearted job]"
+	"($of)-n[output a reversed ed script]"
         '-S+[set first file in comparison]:start with file:_files'
       )
     ;;
     openbsd*)
       of+=' -n -q -u -C -D -U'
       args=(
-        "($of)-n[produce an rcsdiff(1)-compatible diff]"
+        "($of)-n[output an rcsdiff(1)-compatible diff]"
         "($of)-q[only print a line when the files differ; does not produce a list of changes]"
-        "($of)-u[produce a unified diff with 3 lines of context]"
-        "($of)-C+[produce a context diff]:number of lines of context"
-        "($of)-D[produce a merged file with preprocessor directives]:preprocessor symbol"
-        "($of)-U+[produce a unified diff]:number of lines of context"
         '-a[treat all files as ASCII text]'
         '-d[try to produce the smallest diff possible]'
         '-I[ignore changes whose lines match the extended regular expression]:extended regular expression pattern'
-        '-i[ignore case]'
         '*-L[print a label instead of the file name and time]:label'
-        '-l[long output format (paginate with pr(1))]'
         '-p[show characters from the last line before the context]'
         '-T[consistently align tabs]'
-        '-t[expand tabs in output lines]'
         '-w[like -b, but totally ignore whitespace]'
         '-N[treat absent files in either directory as if they were empty]'
         '-P[treat absent files in the second directory as if they were empty]'
         '-S[start a directory diff from a file name]:file name:_files'
-        '-s[report files that are the same]'
         '*-X[exclude files and subdirectories whose basenames match lines in a file]:file name:_files'
         '-x[exclude files and subdirectories whose basenames match a pattern]:pattern'
       )



Messages sorted by: Reverse Date, Date, Thread, Author