summary refs log tree commit diff
diff options
context:
space:
mode:
authorDaniel Hahler <git@thequod.de>2018-01-24 21:18:20 +0100
committerDaniel Hahler <git@thequod.de>2018-02-12 10:12:22 +0100
commit2bf952b102bce70b879c00d2476a9a74eab5cfaf (patch)
tree46ba89848c35597e6dab0806516625152303aa13
parentc18fe510f4321210ddb450cdfa08fbf2bae8a580 (diff)
downloadzsh-2bf952b102bce70b879c00d2476a9a74eab5cfaf.tar.gz
zsh-2bf952b102bce70b879c00d2476a9a74eab5cfaf.tar.xz
zsh-2bf952b102bce70b879c00d2476a9a74eab5cfaf.zip
42324: _git: handle mutually exclusive options
Currently `git show --stat -p` is not considered a valid completion and
prevents further completions like `--no-abbrev`.

It is a valid use case however to use `--stat` with `-p` (and there is a
synonym `--patch-with-stat` for it even).

This patch changes `__git_setup_diff_options` to only handle mutually
exclusive arguments reported by Git (as a fatal error) in a special way.
-rw-r--r--ChangeLog5
-rw-r--r--Completion/Unix/Command/_git33
2 files changed, 22 insertions, 16 deletions
diff --git a/ChangeLog b/ChangeLog
index 59430a64d..4cc7820d2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2018-02-12  Daniel Hahler  <zsh@thequod.de>
+
+	* 42324: Completion/Unix/Command/_git: _git: handle mutually exclusive
+	options.
+
 2018-02-11  Daniel Hahler  <zsh@thequod.de>
 
 	* 42327: Completion/Unix/Command/_make: _make: complete _files.
diff --git a/Completion/Unix/Command/_git b/Completion/Unix/Command/_git
index 002709a5f..9f0225fab 100644
--- a/Completion/Unix/Command/_git
+++ b/Completion/Unix/Command/_git
@@ -7028,14 +7028,15 @@ __git_setup_log_options () {
 
 (( $+functions[__git_setup_diff_options] )) ||
 __git_setup_diff_options () {
-  local diff_types='(-p -u --patch -U --unified --raw --patch-with-raw --stat --numstat --shortstat --dirstat --dirstat-by-file --summary --patch-with-stat --name-only --name-status --cumulative -s --no-patch)'
+  # According to Git: "fatal: --name-only, --name-status, --check and -s are mutually exclusive"
+  local exclusive_diff_options='(--name-only --name-status --check -s --no-patch)'
 
   diff_options=(
-    $diff_types{-p,-u,--patch}'[generate diff in patch format]'
-    $diff_types{-U,--unified=}'[generate diff with given lines of context]: :__git_guard_number lines'
-    $diff_types'--raw[generate default raw diff output]'
-    $diff_types'--patch-with-raw[generate patch but also keep the default raw diff output]'
-    $diff_types{-s,--no-patch}'[suppress diff output]'
+    {-p,-u,--patch}'[generate diff in patch format]'
+    {-U,--unified=}'[generate diff with given lines of context]: :__git_guard_number lines'
+    '--raw[generate default raw diff output]'
+    '--patch-with-raw[generate patch but also keep the default raw diff output]'
+    $exclusive_diff_options{-s,--no-patch}'[suppress diff output]'
     '(--minimal --patience --histogram --diff-algorithm)--minimal[spend extra time to make sure the smallest possible diff is produced]'
     '(--minimal --patience --histogram --diff-algorithm)--patience[generate diffs with patience algorithm]'
     '(--minimal --patience --histogram --diff-algorithm)--histogram[generate diffs with histogram algorithm]'
@@ -7044,16 +7045,16 @@ __git_setup_diff_options () {
                                                                                                                     minimal\:"spend extra time to make sure the smallest possible diff is produced"
                                                                                                                     patience\:"generate diffs with patience algorithm"
                                                                                                                     histogram\:"generate diffs with histogram algorithm"))'
-    $diff_types'--stat=-[generate diffstat instead of patch]:: :__git_guard_diff-stat-width'
-    $diff_types'--numstat[generate more machine-friendly diffstat]'
-    $diff_types'--shortstat[generate summary diffstat]'
-    $diff_types'--dirstat=-[generate dirstat by amount of changes]:: :__git_guard_number limit'
-    $diff_types'--dirstat-by-file=-[generate dirstat by number of files]:: :__git_guard_number limit'
-    $diff_types'--summary[generate condensed summary of extended header information]'
-    $diff_types'--patch-with-stat[generate patch and prepend its diffstat]'
+    '--stat=-[generate diffstat instead of patch]:: :__git_guard_diff-stat-width'
+    '--numstat[generate more machine-friendly diffstat]'
+    '--shortstat[generate summary diffstat]'
+    '--dirstat=-[generate dirstat by amount of changes]:: :__git_guard_number limit'
+    '--dirstat-by-file=-[generate dirstat by number of files]:: :__git_guard_number limit'
+    '--summary[generate condensed summary of extended header information]'
+    '--patch-with-stat[generate patch and prepend its diffstat]'
     '-z[use NUL termination on output]'
-    $diff_types'--name-only[show only names of changed files]'
-    $diff_types'--name-status[show only names and status of changed files]'
+    $exclusive_diff_options'--name-only[show only names of changed files]'
+    $exclusive_diff_options'--name-status[show only names and status of changed files]'
     '--submodule=-[select output format for submodule differences]::format:((short\:"show pairs of commit names"
 									     log\:"list commits like git submodule does"
 									     diff\:"show differences"))'
@@ -7066,7 +7067,7 @@ __git_setup_diff_options () {
     '--word-diff-regex=-[specify what constitutes a word]:word regex'
     '(--color --no-color              )--color-words=-[show colored-word diff]::word regex'
     '--no-renames[turn off rename detection]'
-    '--check[warn if changes introduce trailing whitespace or space/tab indents]'
+    $exclusive_diff_options'--check[warn if changes introduce trailing whitespace or space/tab indents]'
     '--full-index[show full object name of pre- and post-image blob]'
     '(--full-index)--binary[in addition to --full-index, output binary diffs for git-apply]'
     '--abbrev=[set minimum SHA1 display-length]: :__git_guard_number length'