1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
#!/bin/sh
set -eu
usage() {
printf 'Usage: %s -p PROFILE -c "COMMAND"\n' "$0"
}
help() {
echo '
Options:
-p profile to be used for gathering and storing data
-c command to be run, reading from STDIN, writing to STDOUT
See manpages for more information.'
}
missing() {
printf 'Missing option: %s\n' "$1" >&2
}
# shellcheck disable=2068
for flag in $@; do
if [ "$flag" = '--help' ]; then
usage
help
exit 0
fi
done
COMMANDFLAG=
PROFILEFLAG=
while getopts 'hc:p:' name; do
case "$name" in
c)
COMMANDFLAG="$OPTARG"
;;
p)
PROFILEFLAG="$OPTARG"
;;
h)
usage
help
exit 0
;;
*)
echo "Ignoring unrecognized flag '$name'" >&2
;;
esac
done
if [ -z "$COMMANDFLAG" ]; then
missing '-c "COMMAND"'
usage >&2
exit 2
fi
if [ -z "$PROFILEFLAG" ]; then
missing '-p PROFILE'
usage >&2
exit 2
fi
COMMAND="$COMMANDFLAG"
PROFILE="${XDG_DATA_HOME:-$HOME/.local/share/remembering}/$PROFILEFLAG"
if [ ! -e "$PROFILE" ]; then
mkdir -p "$(dirname "$PROFILE")"
touch "$PROFILE"
fi
MERGED="$(mktemp)"
FILTERED="$(mktemp)"
SORTED_STDIN="$(mktemp)"
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")"
if [ -n "$CHOICE" ]; then
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
|