diff options
Diffstat (limited to '')
-rwxr-xr-x | remembering | 126 | ||||
-rwxr-xr-x | tests/ranking.sh | 17 |
2 files changed, 57 insertions, 86 deletions
diff --git a/remembering b/remembering index 2f39385..0734dae 100755 --- a/remembering +++ b/remembering @@ -68,96 +68,52 @@ if [ ! -e "$PROFILE" ]; then touch "$PROFILE" fi +MERGED="$(mktemp)" +FILTERED="$(mktemp)" SORTED_STDIN="$(mktemp)" -cat | sort > "$SORTED_STDIN" - -MERGED='' -MERGEDF="$(mktemp)" -FILTERED='' -FILTEREDF="$(mktemp)" - -append() { - FILTERED="$FILTERED${FILTERED:+ -}$1" -} - -accumulate() { - MERGED="$MERGED${MERGED:+ -}$1" -} - -end() { - echo "$FILTERED" > "$FILTEREDF" - echo "$MERGED" > "$MERGEDF" - exit -} - -get_left() { - LEFT="$(echo "$LEFT_L" | head -n1)" - LEFT_L="$(echo "$LEFT_L" | tail -n+2)" - if [ -z "$LEFT" ]; then - accumulate "$RIGHT_RANKED" - accumulate "$RIGHT_RANKED_L" - end - fi -} - -get_right() { - RIGHT_RANKED="$(echo "$RIGHT_RANKED_L" | head -n1)" - RIGHT_RANKED_L="$(echo "$RIGHT_RANKED_L" | tail -n+2)" - if [ -z "$RIGHT_RANKED" ]; then - STDIN_LEFTOVER="$(echo "$LEFT_L" | awk '/./{print "0:" $0}')" - append "$STDIN_LEFTOVER" - accumulate "$STDIN_LEFTOVER" - end - fi -} - -( - LEFT_L="$(cat "$SORTED_STDIN")" - RIGHT_RANKED_L="$(cat "$PROFILE")" - get_right - get_left - while true; do - RIGHT="$(echo "$RIGHT_RANKED" | cut -d: -f2-)" - if [ "$LEFT" = "$RIGHT" ]; then - append "$RIGHT_RANKED" - accumulate "$RIGHT_RANKED" - get_right - get_left - continue - fi - - if [ "$(expr "$LEFT" \< "$RIGHT")" = 1 ]; then - append "0:$LEFT" - accumulate "0:$LEFT" - get_left - continue - else - get_right - accumulate "$RIGHT_RANKED" - continue - fi - done -) - -CHOICE="$(sort -t: -k1nr,1 -k2,2 < "$FILTEREDF" | \ +cat | sort -u > "$SORTED_STDIN" + +xargs printf '0:%s\n' < "$SORTED_STDIN" | \ + sort -t: -k2,2 -m - "$PROFILE" | \ + tac | \ + sort -t: -k2,2 -u > "$MERGED" + +xargs printf 'filter_marker:%s\n' < "$SORTED_STDIN" | \ + cat - "$PROFILE" | \ + sort -t: -k2,2 | \ + awk '{ + split($0, l, ":") + rank = l[1] + entry = substr($0, length(rank) + 2) + if (rank != "filter_marker") { + prev_rank = rank + prev_entry = entry + } else { + if (prev_entry == entry) { + print prev_rank ":" entry + } else { + print "0:" entry + } + } + }' > "$FILTERED" + +CHOICE="$(sort -t: -k1nr,1 -k2,2 < "$FILTERED" | \ cut -d: -f2- | \ sh -c "$COMMAND")" -NEW_PROFILE="$(mktemp)" if [ -n "$CHOICE" ]; then - while IFS='' read -r LINE_RANKED; do - LINE="$(echo "$LINE_RANKED" | cut -d: -f2-)" - if [ "$CHOICE" = "$LINE" ]; then - RANK="$(echo "$LINE_RANKED" | cut -d: -f1)" - NEW_RANK=$((RANK + 1)) - echo "$NEW_RANK:$LINE" >> "$NEW_PROFILE" - else - echo "$LINE_RANKED" >> "$NEW_PROFILE" - fi - done < "$MERGEDF" + NEW_PROFILE="$(mktemp)" + awk -v choice="$CHOICE" '{ + split($0, l, ":") + rank = l[1] + entry = substr($0, length(rank) + 2) + if (entry == choice) { + # Naively increment ranking by one + print rank + 1 ":" entry + } else { + print rank ":" entry + } + }' "$MERGED" > "$NEW_PROFILE" mv "$NEW_PROFILE" "$PROFILE" echo "$CHOICE" fi - diff --git a/tests/ranking.sh b/tests/ranking.sh index 370c61b..ea9c2c6 100755 --- a/tests/ranking.sh +++ b/tests/ranking.sh @@ -230,10 +230,24 @@ test_stdin_is_empty() { test_ok } + +test_profile_does_not_exist() { + testing 'profile does not exist' + PROFILE="profile-does-not-exist-$(uuid)" + INPUT='a +b +c +d +e' + pick_x a "$INPUT" + assert_profile "$PROFILE" "$BASE_PROFILE_A_PICKED" + test_ok +} + test_profile_is_empty() { testing 'profile is empty' PROFILE="profile-is-empty-$(uuid)" - echo '' > "$XDG_DATA_HOME/$PROFILE" + printf '' > "$XDG_DATA_HOME/$PROFILE" INPUT='a b c @@ -253,4 +267,5 @@ test_stdin_profile_merging test_stdin_is_larger_than_profile test_stdin_is_smaller_than_profile test_stdin_is_empty +test_profile_does_not_exist test_profile_is_empty |