check-in mutt-open script
authorStefano Zacchiroli <zack@upsilon.cc>
Sun, 17 Feb 2013 16:47:23 +0000 (17:47 +0100)
committerStefano Zacchiroli <zack@upsilon.cc>
Sun, 17 Feb 2013 16:47:23 +0000 (17:47 +0100)
previously publish in an ad-hoc way on my blog

mutt-open [new file with mode: 0755]

diff --git a/mutt-open b/mutt-open
new file mode 100755 (executable)
index 0000000..f0c4a7c
--- /dev/null
+++ b/mutt-open
@@ -0,0 +1,75 @@
+#!/bin/bash
+#
+# Fire up mutt on a given mail, located in some Maildir
+# Mail can be specified either by path or by Messsage-ID; in the latter case
+# file lookup is performed using some mail indexing tool.
+#
+# Copyright: © 2009-2012 Stefano Zacchiroli <zack@upsilon.cc>
+# License: GNU General Public License (GPL), version 3 or above
+
+# requires: notmuch | maildir-utils >= 0.7
+
+MUTT=mutt
+MAIL_INDEXER="notmuch" # one of "notmuch", "mu"
+
+MUTT_FLAGS="-R"
+HIDE_SIDEBAR_CMD="B"   # set to empty string if sidebar is not used
+
+# Sample output of lookup command, which gets passed to mutt-open
+#  /home/zack/Maildir/INBOX/cur/1256673179_0.8700.usha,U=37420,FMD5=7e33429f656f1e6e9d79b29c3f82c57e:2,S
+
+die_usage () {
+    echo "Usage: mutt-open FILE" 1>&2
+    echo "       mutt-open MESSAGE-ID" 1>&2
+    echo 'E.g.:  mutt-open `notmuch search --output=files id:MESSAGE-ID`' 1>&2
+    echo '       mutt-open `mu find -f l i:MESSAGE-ID`' 1>&2
+    echo '       mutt-open 20091030112543.GA4230@usha.takhisis.invalid' 1>&2
+    exit 3
+}
+
+# Lookup: Message-ID -> mail path. Store results in global $fname
+lookup_msgid () {
+    msgid_query="$1"
+    case "$MAIL_INDEXER" in
+       notmuch)
+           fname=$(notmuch search --output=files id:"$msgid_query" | head -n 1)
+           ;;
+       mu)
+           fname=$(mu find -f l i:"$msgid_query" | head -n 1)
+           ;;
+    esac
+}
+
+dump_info () {
+    echo "fname: $fname"
+    echo "msgid: $msgid"
+}
+
+if [ -z "$1" -o "$1" = "-h" -o "$1" = "-help" -o "$1" = "--help" ] ; then
+    die_usage
+fi
+if (echo "$1" | grep -q /) && test -f "$1" ; then      # arg is a file
+    fname="$1"
+    msgid=$(egrep -i '^message-id:' "$fname" | cut -f 2 -d':' | sed 's/[ <>]//g')
+elif ! (echo "$1" | grep -q /) ; then  # arg is a Message-ID
+    msgid="$1"
+    lookup_msgid "$msgid"      # side-effect: set $fname
+fi
+# dump_info ; exit 3
+if ! dirname "$fname" | egrep -q '/(cur|new|tmp)$' ; then
+    echo "Path not pointing inside a maildir: $fname" 1>&2
+    exit 2
+fi
+maildir=$(dirname $(dirname "$fname"))
+
+if ! [ -d "$maildir" ] ; then
+    echo "Not a (mail)dir: $maildir" 1>&1
+    exit 2
+fi
+
+# UGLY HACK: without sleep, push keys do not reach mutt, I _guess_ that there
+# might be some terminal-related issue here, since also waiting for an input
+# with "read" similarly "solves" the problem
+sleep 0.1
+mutt_keys="$HIDE_SIDEBAR_CMD/~i$msgid\n\n"
+exec $MUTT $MUTT_FLAGS -f "$maildir/" -e "push $mutt_keys"

Benjamin Mako Hill || Want to submit a patch?