Skip to content

Commit 576ebc3

Browse files
committed
Allow setdiff to work with actual arrays.
1 parent 4dee59a commit 576ebc3

File tree

2 files changed

+39
-8
lines changed

2 files changed

+39
-8
lines changed

bin/dotfiles

+15-8
Original file line numberDiff line numberDiff line change
@@ -132,17 +132,24 @@ function _prompt_menu_add() {
132132
# (and not in a good way).
133133
# From http://stackoverflow.com/a/1617303/142339
134134
function setdiff() {
135-
local debug oldifs A B C x
135+
local debug skip a b
136136
if [[ "$1" == 1 ]]; then debug=1; shift; fi
137-
# Convert args to arrays.
138-
A=($1); B=($2); C=()
139-
for x in "${A[@]}"; do
140-
[[ "${B[*]}" =~ (^| )$x($| ) ]] || C=("${C[@]}" "$x")
137+
if [[ "$1" ]]; then
138+
local setdiffA setdiffB setdiffC
139+
setdiffA=($1); setdiffB=($2)
140+
fi
141+
setdiffC=()
142+
for a in "${setdiffA[@]}"; do
143+
skip=
144+
for b in "${setdiffB[@]}"; do
145+
[[ "$a" == "$b" ]] && skip=1 && break
146+
done
147+
[[ "$skip" ]] || setdiffC=("${setdiffC[@]}" "$a")
141148
done
142-
[[ "$debug" ]] && for x in A B C; do
143-
echo "$x ($(eval echo "\${#$x[*]}")) $(eval echo "\${$x[*]}")" 1>&2
149+
[[ "$debug" ]] && for a in setdiffA setdiffB setdiffC; do
150+
echo "$a ($(eval echo "\${#$a[*]}")) $(eval echo "\${$a[*]}")" 1>&2
144151
done
145-
echo "${C[@]}"
152+
[[ "$1" ]] && echo "${setdiffC[@]}"
146153
}
147154

148155
# If this file was being sourced, exit now.

test/test_setdiff.sh

+24
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,27 @@ desired=(a a-b); installed=(a-b a); assert "" my_test
2222
desired=(a-b a); installed=(a-b a); assert "" my_test
2323
desired=(a a-b); installed=(a a-b); assert "" my_test
2424
desired=(a-b a); installed=(a a-b); assert "" my_test
25+
26+
unset setdiffA setdiffB setdiffC
27+
setdiff "a b c" "" >/dev/null
28+
assert "0" echo "${#setdiffC[@]}"
29+
30+
unset setdiffA setdiffB setdiffC; setdiffA=(a b c); setdiffB=(); setdiff
31+
assert "3" echo "${#setdiffC[@]}"
32+
assert "a b c" echo "${setdiffC[*]}"
33+
34+
unset setdiffA setdiffB setdiffC; setdiffA=(a b c); setdiffB=(a); setdiff
35+
assert "2" echo "${#setdiffC[@]}"
36+
assert "b c" echo "${setdiffC[*]}"
37+
38+
unset setdiffA setdiffB setdiffC; setdiffA=(a b c); setdiffB=(c a); setdiff
39+
assert "1" echo "${#setdiffC[@]}"
40+
assert "b" echo "${setdiffC[*]}"
41+
42+
unset setdiffA setdiffB setdiffC; setdiffA=("a b" c); setdiffB=(a b c); setdiff
43+
assert "1" echo "${#setdiffC[@]}"
44+
assert "a b" echo "${setdiffC[*]}"
45+
46+
unset setdiffA setdiffB setdiffC; setdiffA=(a b "a b" c "c d"); setdiffB=(a c); setdiff
47+
assert "3" echo "${#setdiffC[@]}"
48+
assert "b a b c d" echo "${setdiffC[*]}"

0 commit comments

Comments
 (0)