darcswatch-0.4.3: src/Darcs/Watch/Mail.hs
module Darcs.Watch.Mail where
import Codec.MIME.String as MIME
import Data.List
import System.IO
import System.Exit
import System.Process
import Control.Monad
import Data.Maybe
import Data.Char
import qualified Data.ByteString.Char8 as B
import Darcs.Watch.Data
import Darcs
import HTML
mailSubscriptions :: DarcsWatchConfig -> RepositoryURL -> BundleHash -> PatchBundle -> [BundleHistory] -> BundleState -> IO ()
mailSubscriptions _ _ _ _ _ status
| status `notElem` [Applied] = return ()
mailSubscriptions config repo bundleHash bundle history status =
forM_ (map snd (filter (\(r,m) -> r == repo) (cRepoSubscriptions config))) $ \to -> do
message <- flatten [mk_header ["From: " ++ from]
,mk_header ["To: " ++ to]
,mk_header ["References: " ++ unwords references]
,mk_header ["Subject: " ++ subject]
] body Nothing []
if cSendMails config
then do sendMail message
else do hPutStrLn stderr "Would send this message:"
hPutStrLn stderr message
where from = cDarcsWatchAddress config
subject = case status of
Applied -> case mapMaybe extractSubject history of
[] -> "Applied: Patch bundle"
sj -> "Applied: " ++ fixUpSubject (last sj)
body = case status of
Applied -> "This " ++
(if length (fst bundle) == 1
then "1-patch"
else show (length (fst bundle)) ++ "-patches") ++
" bundle was just applied to " ++ repo ++
":\n\n" ++
concatMap showPatch (fst bundle) ++
"\n-- \n" ++
"This message was brought to you by DarcsWatch\n" ++
bundleURL config repo bundleHash
numPatches = length (fst bundle)
references = mapMaybe extractMessageId history
showPatch (pi,_) =
B.unpack (piDate pi) ++ " " ++ B.unpack (piAuthor pi) ++ "\n" ++
" * " ++ B.unpack (piName pi) ++ "\n" ++
unlines (map ((' ':). B.unpack) (stripIgnorethis (piLog pi))) ++
"\n"
sendMail :: String -> IO ()
sendMail text = do
(inh, outh, errh, ph) <- runInteractiveProcess "/usr/sbin/sendmail" ["-t"] Nothing Nothing
hClose outh
hPutStr inh text
hClose inh
err <- hGetContents errh
hPutStr stderr err
ec <- waitForProcess ph
return ()
extractMessageId (_,ViaEMail _ _ _ (Just mid),_) = Just mid
extractMessageId _ = Nothing
extractSubject (_,ViaEMail _ _ subject _,_) = Just subject
extractSubject _ = Nothing
fixUpSubject = dropWhile isSpace . dropBrackets . dropWhile isSpace
dropBrackets ('[':xs) = case dropWhile (/=']') xs of { "" -> ""; r -> tail r}
dropBrackets xs = xs