]> git.madduck.net Git - etc/mutt.git/blob - .mutt/bgrun

madduck's git repository

Every one of the projects in this repository is available at the canonical URL git://git.madduck.net/madduck/pub/<projectpath> — see each project's metadata for the exact URL.

All patches and comments are welcome. Please squash your changes to logical commits before using git-format-patch and git-send-email to patches@git.madduck.net. If you'd read over the Git project's submission guidelines and adhered to them, I'd be especially grateful.

SSH access, as well as push access can be individually arranged.

If you use my repositories frequently, consider adding the following snippet to ~/.gitconfig and using the third clone URL listed for each project:

[url "git://git.madduck.net/madduck/"]
  insteadOf = madduck:

bgrun parametrisation
[etc/mutt.git] / .mutt / bgrun
1 #!/bin/sh
2
3 #exec 2>> /tmp/bgrun.stderr
4 #set -x
5
6 SELF="${0##*/}"
7
8 TEMPDIR=
9 TEMPDIR_SENTINEL=.tempdir
10 cleanup() {
11   if [ -e $TEMPDIR_SENTINEL ]; then
12     local TEMPDIR; TEMPDIR="$PWD"
13     echo Cleaning up tempdir $TEMPDIR… >> output.stderr
14     notify_output
15     cd /
16     rm -rf "$TEMPDIR"
17   else
18     notify_output
19   fi
20   trap - 1 2 3 4 5 6 7 8 10 11 12 13 14 15
21 }
22 trap cleanup 1 2 3 4 5 6 7 8 10 11 12 13 14 15
23
24 enter_tempdir() {
25   if [ -e $TEMPDIR_SENTINEL ]; then
26     return
27
28   else
29     if [ -z "${TMPDIR:-}" ]; then
30       TMPDIR=/tmp
31     fi
32     for i in $LOGNAME volatile; do
33       if [ -d "${TMPDIR}/$i" ]; then
34         TMPDIR="${TMPDIR}/$i"
35         break
36       fi
37     done
38     cd $(mktemp -dp "$TMPDIR" mutt.XXXXXXXXXX)
39     touch $TEMPDIR_SENTINEL
40   fi
41 }
42
43 notify() {
44   if [ -x "$(command -v awesome-client)" ]; then
45     local stdout stderr escaped output
46     stdout="${2:-}"
47     stderr="${3:-}"
48     for i in stdout stderr; do
49       if eval test -s output.$i; then
50         anything=1
51         escaped=$(eval sed -e 's,\",\\\",g' output.$i)
52         output="${output:+$output
53 }${i}:
54 $escaped"
55       fi
56     done
57     [ -n "${escaped:-}" ] || return
58     awesome-client <<-_eof
59         local naughty = require("naughty")
60         naughty.notify({ preset = naughty.config.presets.low,
61                 title  = "${1:-Output from mutt/$SELF}",
62                 text   = [[$output]]
63                 })
64         _eof
65   fi
66 }
67
68 notify_output() {
69   [ -e $TEMPDIR_SENTINEL ] || return
70   local stdout stderr anything
71
72   for i in stdout stderr; do
73     if [ -s "output.$i" ]; then
74       eval $i="'output.$i'"
75     else
76       eval $i=/dev/null
77     fi
78   done
79
80   notify "Output from mutt/$SELF" $stdout $stderr
81 }
82
83 guess_extension() {
84   python -c "import mimetypes; print(mimetypes.guess_extension('$1'))"
85 }
86
87 get_file() {
88   local t
89   if [ -z "$1" ]; then
90     t=$(TMPDIR="$PWD" tempfile -s $(guess_extension "$MIMETYPE"))
91     cat > "$t"
92     echo "$t"
93   else
94     t="$(echo ${1##*/} | sed -re 's![^[:alnum:],.@%^+=_-]!_!gi')"
95     ln "$1" "$t" 2>/dev/null || cp "$1" "$t"
96     echo "$t"
97   fi
98 }
99
100 MIMETYPE= FILENAME= VIEWER= DELAY=1
101 state=
102 for arg in "$@"; do
103   case "$state/$arg" in
104
105     (/-t) state=t;;
106     (t/*) MIMETYPE="$arg"; state=;;
107
108     (/-f) state=f;;
109     (f/*) FILENAME="$arg"; state=;;
110
111     (/-d) state=d;;
112     (d/*) DELAY="$arg"; state=;;
113
114     (/-v) state=v;;
115     (v/*) VIEWER="$arg"; state=;;
116
117     (*)
118       echo >&2 "E: Invalid argument: $i"
119       exit 1
120       ;;
121
122   esac
123 done
124
125 launch_viewer() {
126   local filename; filename="$1"
127   if [ -z "$VIEWER" ]; then
128     [ -n "${2:-}" ] && filename="${2}:${1}"
129     run-mailcap "$filename" > output.stdout 2> output.stderr
130   else
131     $VIEWER "$filename" > output.stdout 2> output.stderr
132   fi
133 }
134
135 case "$SELF" in
136   (bgview)
137     # make a copy of the file, then launch a shell process in the background
138     # to divert to run-mailcap, after which the temporary directory gets
139     # cleaned up.
140     enter_tempdir
141     FILE="$(get_file "$FILENAME")"
142     (
143       ts=$(($(date +%s) + $DELAY))
144       launch_viewer "$FILE" "$MIMETYPE"
145       while [ $(date +%s) -lt $ts ]; do sleep $DELAY; done
146       cleanup
147     ) &
148     trap - 1 2 3 4 5 6 7 8 10 11 12 13 14 15
149     ;;
150   (bgview-fifo)
151     # hack to stay around until the viewer has read the file: make a fifo and
152     # wait for the cat process to finish writing to it, which means that it
153     # must have been consumed on the other end.
154     enter_tempdir
155     FILE="$(get_file "$FILENAME")"
156     FIFO="fifo-${FILE##*/}"
157     mkfifo "$FIFO"
158     cat "$FILE" > "$FIFO" &
159     # For some reason, we do have to write a tempfile and cannot seem to
160     # redirect stdin directly to the fifo, i.e. this does not work instead of
161     # the previous three lines:
162     ## cat > "$FIFO" &
163     launch_viewer "$FIFO" "$MIMETYPE"
164     wait
165     cleanup
166     ;;
167   (bgview-delay)
168     # hack to stay around until the file hasn't been accessed for a few
169     # seconds, so that we can clean up. This is for cases when the FIFO method
170     # doesn't work, because e.g. Firefox randomly chooses it needs to read
171     # HTML files twice.
172     enter_tempdir
173     FILE="$(get_file "$FILENAME")"
174     touch "$FILE"
175     (launch_viewer "$FILE" "$MIMETYPE") &
176     (
177       while [ $(($(stat -c%X "$FILE") + $DELAY)) -gt $(date +%s) ]; do
178         sleep $DELAY
179       done
180       echo Cleaning up $TMPDIR… > $TMPDIR/output.stderr
181       cleanup
182     ) &
183     trap - 1 2 3 4 5 6 7 8 10 11 12 13 14 15
184     ;;
185 esac