#!/bin/sh # Copyright (C) 2019, 2020 C. McEnroe # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . set -u apply= verbose= host=$(git config fetchemail.imapServer) port=$(git config fetchemail.imapServerPort) user=$(git config fetchemail.imapUser) pass=$(git config fetchemail.imapPass) mailbox=$(git config fetchemail.imapMailbox) subject=$(git config fetchemail.subject) from=$(git config fetchemail.from) to=$(git config fetchemail.to) cc=$(git config fetchemail.cc) OPTS_SPEC="\ git fetch-email [] -- C,cc= fetch patches with matching Cc headers F,from= fetch patches with matching From headers S,subject= fetch patches with matching Subject headers T,to= fetch patches with matching To headers a,apply apply patches with git-am h,host=! connect to IMAP on host m,mailbox=! fetch patches from mailbox p,port=! connect to IMAP on port u,user=! log in to IMAP as user v,verbose log IMAP protocol to standard error " eval "$(echo "$OPTS_SPEC" | git rev-parse --parseopt -- "$@" || echo exit $?)" while [ $# -gt 0 ]; do opt=$1 shift case "${opt}" in (-C) cc=$1; shift;; (-F) from=$1; shift;; (-S) subject=$1; shift;; (-T) to=$1; shift;; (-a) apply=yes;; (-h) host=$1; shift;; (-m) mailbox=$1; shift;; (-p) port=$1; shift;; (-u) user=$1; shift;; (-v) verbose=yes;; (--no-apply) apply=;; (--no-cc) cc=;; (--no-from) from=;; (--no-subject) subject=;; (--no-to) to=;; (--no-verbose) verbose=;; (--) break;; esac done if [ -z "${user}" ]; then echo "${0}: username required" >&2 exit 1 fi description() { cat <<-EOF protocol=imaps host=${host:-${user#*@}} username=${user%@*} ${pass:+password=${pass}} EOF } if [ -z "${pass}" ]; then pass=$(description | git credential fill | grep '^password=') pass=${pass#*=} fi fetch() { echo "${pass}" | imbox -w \ ${verbose:+-v} \ ${host:+-h "${host}"} \ ${port:+-p "${port}"} \ ${mailbox:+-m "${mailbox}"} \ ${subject:+-S "${subject}"} \ ${from:+-F "${from}"} \ ${to:+-T "${to}"} \ ${cc:+-C "${cc}"} \ ${user} status=$? if [ $status -ne 78 ]; then description | git credential approve else description | git credential reject fi return $status } if [ -n "${apply}" ]; then fetch | git am --patch-format=mboxrd "$@" else fetch fi