add mutt-open script
authorStefano Zacchiroli <zack@upsilon.cc>
Tue, 3 Nov 2009 08:08:37 +0000 (09:08 +0100)
committerStefano Zacchiroli <zack@upsilon.cc>
Tue, 3 Nov 2009 08:08:37 +0000 (09:08 +0100)
blog/posts/2009/10/mail_indexing_for_mutt/mutt-open [new file with mode: 0644]

diff --git a/blog/posts/2009/10/mail_indexing_for_mutt/mutt-open b/blog/posts/2009/10/mail_indexing_for_mutt/mutt-open
new file mode 100644 (file)
index 0000000..f46dc7a
--- /dev/null
@@ -0,0 +1,62 @@
+#!/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 Stefano Zacchiroli <zack@upsilon.cc> 
+# License: GNU General Public License (GPL), version 3 or above
+
+MUTT=mutt
+MUTT_FLAGS="-R"
+HIDE_SIDEBAR_CMD="B"   # set to empty string if sidebar is not used
+
+# Sample output of 'mu-find -f P i:MESSAGE-ID', 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 `mu-find -f P m: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 () {
+    fname=$(mu-find --format P m:"$1" | head -n 1)
+}
+
+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"