X-Git-Url: https://git.madduck.net/etc/mutt.git/blobdiff_plain/4a7266651c7f1575953c50257a3bb3d2c4bf9490..8937bb7554dbcfad9face59b9d9b5c4368fcff6e:/.mutt/bgrun?ds=inline diff --git a/.mutt/bgrun b/.mutt/bgrun index 6e16630..d4278b2 100755 --- a/.mutt/bgrun +++ b/.mutt/bgrun @@ -9,7 +9,7 @@ elif [ -d "${TMPDIR}/volatile" ]; then fi export TMPDIR TMPDIR=$(mktemp -dp "$TMPDIR" mutt.XXXXXXXXXX) -cleanup() { cd / && rm -rf "$TMPDIR"; } +cleanup() { cd / && notify_output && rm -rf "$TMPDIR"; } trap cleanup 1 2 3 4 5 6 7 8 10 11 12 13 14 15 cd "$TMPDIR" @@ -29,6 +29,13 @@ notify() { fi } +notify_output() { + if [ -s "$TMPDIR/output.stdout" ] || [ -s "$TMPDIR/output.stderr" ]; then + notify $TMPDIR/output.stdout $TMPDIR/output.stderr \ + "Output from mutt/$SELF on $BASENAME" + fi +} + guess_extension() { python -c "import mimetypes; print(mimetypes.guess_extension('$1'))" } @@ -37,21 +44,30 @@ launch_viewer() { run-mailcap --action=view "$1":"$2" > output.stdout 2> output.stderr } -MIMETYPE="$1" -TEMPFILE=$(tempfile -d . -p mutt -s $(guess_extension "$MIMETYPE")) +MIMETYPE="$1"; shift + +get_file() { + local t + if [ -z "$1" ]; then + t=$(tempfile -d . -p mutt -s $(guess_extension "$MIMETYPE")) + cat > "$t" + echo "$t" + else + t="$(echo ${1##*/} | sed -re 's![^[:alnum:],.@%^+=_-]!_!gi')" + cp "$1" "$t" + echo "$t" + fi +} case "$SELF" in (bgrun) # make a copy of the file, then launch a shell process in the background # to divert to run-mailcap, after which the temporary directory gets # cleaned up. - cat > "$TEMPFILE" + FILE="$(get_file "${1:-}")" ( - launch_viewer "$MIMETYPE" "$TEMPFILE" - if [ -s "$TMPDIR/output.stdout" ] || [ -s "$TMPDIR/output.stderr" ]; then - notify $TMPDIR/output.stdout $TMPDIR/output.stderr \ - "Output from mutt/$SELF on $BASENAME" - fi + launch_viewer "$MIMETYPE" "$FILE" + sleep 1 cleanup ) & trap - 1 2 3 4 5 6 7 8 10 11 12 13 14 15 @@ -60,10 +76,10 @@ case "$SELF" in # hack to stay around until the viewer has read the file: make a fifo and # wait for the cat process to finish writing to it, which means that it # must have been consumed on the other end. - cat > "$TEMPFILE" - FIFO="${TEMPFILE%/*}/fifo-${TEMPFILE##*/}" + FILE="$(get_file "${1:-}")" + FIFO="${FILE%/*}/fifo-${FILE##*/}" mkfifo "$FIFO" - cat "$TEMPFILE" > "$FIFO" & + cat "$FILE" > "$FIFO" & # For some reason, we do have to write a tempfile and cannot seem to # redirect stdin directly to the fifo, i.e. this does not work instead of # the previous three lines: @@ -72,4 +88,17 @@ case "$SELF" in wait cleanup ;; + (bgrun-delay) + # hack to stay around for a fixed period of time after the viewer process + # returns control to the caller, so that we can clean up. This is for + # cases when the FIFO method doesn't work, because e.g. Firefox randomly + # chooses it needs to read HTML files twice. + FILE="$(get_file "${1:-}")" + (launch_viewer "$MIMETYPE" "${FILE}") & + ( + sleep 1m + echo Cleaning up $TMPDIR… > $TMPDIR/output.stderr + cleanup + ) & + ;; esac