-
-
Notifications
You must be signed in to change notification settings - Fork 25.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix(cli): fix edge cases in
omz plugin disable
command (#12401)
Also introduces tests, which will be refactored into the proper place when a test system is finally designed. Fixes #12400
- Loading branch information
Showing
2 changed files
with
180 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,169 @@ | ||
#!/usr/bin/zsh -df | ||
|
||
run_awk() { | ||
local -a dis_plugins=(${=1}) | ||
local input_text="$2" | ||
|
||
(( ! DEBUG )) || set -xv | ||
|
||
local awk_subst_plugins="\ | ||
gsub(/[ \t]+(${(j:|:)dis_plugins})[ \t]+/, \" \") # with spaces before or after | ||
gsub(/[ \t]+(${(j:|:)dis_plugins})$/, \"\") # with spaces before and EOL | ||
gsub(/^(${(j:|:)dis_plugins})[ \t]+/, \"\") # with BOL and spaces after | ||
gsub(/\((${(j:|:)dis_plugins})[ \t]+/, \"(\") # with parenthesis before and spaces after | ||
gsub(/[ \t]+(${(j:|:)dis_plugins})\)/, \")\") # with spaces before or parenthesis after | ||
gsub(/\((${(j:|:)dis_plugins})\)/, \"()\") # with only parentheses | ||
gsub(/^(${(j:|:)dis_plugins})\)/, \")\") # with BOL and closing parenthesis | ||
gsub(/\((${(j:|:)dis_plugins})$/, \"(\") # with opening parenthesis and EOL | ||
" | ||
# Disable plugins awk script | ||
local awk_script=" | ||
# if plugins=() is in oneline form, substitute disabled plugins and go to next line | ||
/^[ \t]*plugins=\([^#]+\).*\$/ { | ||
$awk_subst_plugins | ||
print \$0 | ||
next | ||
} | ||
# if plugins=() is in multiline form, enable multi flag and disable plugins if they're there | ||
/^[ \t]*plugins=\(/ { | ||
multi=1 | ||
$awk_subst_plugins | ||
print \$0 | ||
next | ||
} | ||
# if multi flag is enabled and we find a valid closing parenthesis, remove plugins and disable multi flag | ||
multi == 1 && /^[^#]*\)/ { | ||
multi=0 | ||
$awk_subst_plugins | ||
print \$0 | ||
next | ||
} | ||
multi == 1 && length(\$0) > 0 { | ||
$awk_subst_plugins | ||
if (length(\$0) > 0) print \$0 | ||
next | ||
} | ||
{ print \$0 } | ||
" | ||
|
||
command awk "$awk_script" <<< "$input_text" | ||
|
||
(( ! DEBUG )) || set +xv | ||
} | ||
|
||
# runs awk against stdin, checks if the resulting file is not empty and then checks if the file has valid zsh syntax | ||
run_awk_and_test() { | ||
local description="$1" | ||
local plugins_to_disable="$2" | ||
local input_text="$3" | ||
local expected_output="$4" | ||
|
||
local tmpfile==(:) | ||
|
||
{ | ||
print -u2 "Test: $description" | ||
DEBUG=0 run_awk "$plugins_to_disable" "$input_text" >| $tmpfile | ||
|
||
if [[ ! -s "$tmpfile" ]]; then | ||
print -u2 "\e[31mError\e[0m: output file empty" | ||
return 1 | ||
fi | ||
|
||
if ! zsh -n $tmpfile; then | ||
print -u2 "\e[31mError\e[0m: zsh syntax error" | ||
diff -u $tmpfile <(echo "$expected_output") | ||
return 1 | ||
fi | ||
|
||
if ! diff -u --color=always $tmpfile <(echo "$expected_output"); then | ||
if (( DEBUG )); then | ||
print -u2 "" | ||
DEBUG=1 run_awk "$plugins_to_disable" "$input_text" | ||
print -u2 "" | ||
fi | ||
print -u2 "\e[31mError\e[0m: output file does not match expected output" | ||
return 1 | ||
fi | ||
|
||
print -u2 "\e[32mSuccess\e[0m" | ||
} always { | ||
print -u2 "" | ||
command rm -f "$tmpfile" | ||
} | ||
} | ||
|
||
# These tests are for the `omz plugin disable` command | ||
run_awk_and_test \ | ||
"it should delete a single plugin in oneline format" \ | ||
"git" \ | ||
"plugins=(git)" \ | ||
"plugins=()" | ||
|
||
run_awk_and_test \ | ||
"it should delete a single plugin in multiline format" \ | ||
"github" \ | ||
"plugins=( | ||
github | ||
)" \ | ||
"plugins=( | ||
)" | ||
|
||
run_awk_and_test \ | ||
"it should delete multiple plugins in oneline format" \ | ||
"github git z" \ | ||
"plugins=(github git z)" \ | ||
"plugins=()" | ||
|
||
run_awk_and_test \ | ||
"it should delete multiple plugins in multiline format" \ | ||
"github git z" \ | ||
"plugins=( | ||
github | ||
git | ||
z | ||
)" \ | ||
"plugins=( | ||
)" | ||
|
||
run_awk_and_test \ | ||
"it should delete a single plugin among multiple in oneline format" \ | ||
"git" \ | ||
"plugins=(github git z)" \ | ||
"plugins=(github z)" | ||
|
||
run_awk_and_test \ | ||
"it should delete a single plugin among multiple in multiline format" \ | ||
"git" \ | ||
"plugins=( | ||
github | ||
git | ||
z | ||
)" \ | ||
"plugins=( | ||
github | ||
z | ||
)" | ||
|
||
run_awk_and_test \ | ||
"it should delete multiple plugins in mixed format" \ | ||
"git z" \ | ||
"plugins=(github | ||
git z)" \ | ||
"plugins=(github | ||
)" | ||
|
||
run_awk_and_test \ | ||
"it should delete multiple plugins in mixed format 2" \ | ||
"github z" \ | ||
"plugins=(github | ||
git | ||
z)" \ | ||
"plugins=( | ||
git | ||
)" |