diff --git a/bin/dotfiles b/bin/dotfiles index 98e9825eca..58f27836cd 100755 --- a/bin/dotfiles +++ b/bin/dotfiles @@ -132,17 +132,24 @@ function _prompt_menu_add() { # (and not in a good way). # From http://stackoverflow.com/a/1617303/142339 function setdiff() { - local debug oldifs A B C x + local debug skip a b if [[ "$1" == 1 ]]; then debug=1; shift; fi - # Convert args to arrays. - A=($1); B=($2); C=() - for x in "${A[@]}"; do - [[ "${B[*]}" =~ (^| )$x($| ) ]] || C=("${C[@]}" "$x") + if [[ "$1" ]]; then + local setdiffA setdiffB setdiffC + setdiffA=($1); setdiffB=($2) + fi + setdiffC=() + for a in "${setdiffA[@]}"; do + skip= + for b in "${setdiffB[@]}"; do + [[ "$a" == "$b" ]] && skip=1 && break + done + [[ "$skip" ]] || setdiffC=("${setdiffC[@]}" "$a") done - [[ "$debug" ]] && for x in A B C; do - echo "$x ($(eval echo "\${#$x[*]}")) $(eval echo "\${$x[*]}")" 1>&2 + [[ "$debug" ]] && for a in setdiffA setdiffB setdiffC; do + echo "$a ($(eval echo "\${#$a[*]}")) $(eval echo "\${$a[*]}")" 1>&2 done - echo "${C[@]}" + [[ "$1" ]] && echo "${setdiffC[@]}" } # If this file was being sourced, exit now. diff --git a/test/test_setdiff.sh b/test/test_setdiff.sh index 0cb5653164..e9569d46be 100755 --- a/test/test_setdiff.sh +++ b/test/test_setdiff.sh @@ -22,3 +22,27 @@ desired=(a a-b); installed=(a-b a); assert "" my_test desired=(a-b a); installed=(a-b a); assert "" my_test desired=(a a-b); installed=(a a-b); assert "" my_test desired=(a-b a); installed=(a a-b); assert "" my_test + +unset setdiffA setdiffB setdiffC +setdiff "a b c" "" >/dev/null +assert "0" echo "${#setdiffC[@]}" + +unset setdiffA setdiffB setdiffC; setdiffA=(a b c); setdiffB=(); setdiff +assert "3" echo "${#setdiffC[@]}" +assert "a b c" echo "${setdiffC[*]}" + +unset setdiffA setdiffB setdiffC; setdiffA=(a b c); setdiffB=(a); setdiff +assert "2" echo "${#setdiffC[@]}" +assert "b c" echo "${setdiffC[*]}" + +unset setdiffA setdiffB setdiffC; setdiffA=(a b c); setdiffB=(c a); setdiff +assert "1" echo "${#setdiffC[@]}" +assert "b" echo "${setdiffC[*]}" + +unset setdiffA setdiffB setdiffC; setdiffA=("a b" c); setdiffB=(a b c); setdiff +assert "1" echo "${#setdiffC[@]}" +assert "a b" echo "${setdiffC[*]}" + +unset setdiffA setdiffB setdiffC; setdiffA=(a b "a b" c "c d"); setdiffB=(a c); setdiff +assert "3" echo "${#setdiffC[@]}" +assert "b a b c d" echo "${setdiffC[*]}"