From: Stefano Zacchiroli Date: Sun, 17 Feb 2013 16:47:23 +0000 (+0100) Subject: check-in mutt-open script X-Git-Url: https://projects.mako.cc/source/org-mutt/commitdiff_plain/782a16e2d0f07b9cac1dd24552d45363a9c75008?ds=inline check-in mutt-open script previously publish in an ad-hoc way on my blog --- 782a16e2d0f07b9cac1dd24552d45363a9c75008 diff --git a/mutt-open b/mutt-open new file mode 100755 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 +# 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"