{-
expireGititCache - (C) 2009 John MacFarlane, licensed under the GPL

This program is designed to be used in post-update hooks and other scripts.

Usage:  expireGititCache base-url [file..]

Example:

    expireGititCache http://localhost:5001 page1.page foo/bar.hs "Front Page.page"

will produce POST requests to http://localhost:5001/_expire/page1,
http://localhost:5001/_expire/foo/bar.hs, and
http://localhost:5001/_expire/Front Page.

Return statuses:

0   -> the cached page was successfully expired (or was not cached in the first place)
1   -> fewer than two arguments were supplied
3   -> did not receive a 200 OK response from the request
5   -> could not parse the uri

-}

module Main
where
import Network.HTTP
import System.Environment
import Network.URI
import System.FilePath
import Control.Monad
import System.IO
import System.Exit

main :: IO ()
main = do
  args <- getArgs
  (uriString : files) <- if length args < 2
                            then usageMessage >> return [""]
                            else return args
  uri <- case parseURI uriString of
             Just u  -> return u
             Nothing -> do
               hPutStrLn stderr ("Could not parse URI " ++ uriString)
               exitWith (ExitFailure 5)
  forM_ files (expireFile uri)

usageMessage :: IO ()
usageMessage = do
  hPutStrLn stderr $ "Usage: expireGititCache base-url [file..]\n" ++
    "Example: expireGititCache http://localhost:5001 page1.page foo/bar.hs"
  exitWith (ExitFailure 1)

expireFile :: URI -> FilePath -> IO ()
expireFile uri file = do
  let path' = if takeExtension file == ".page"
                 then dropExtension file
                 else file
  let uri' = uri{uriPath = "/_expire/" ++ urlEncode path'}
  resResp <- simpleHTTP Request{rqURI = uri', rqMethod = POST, rqHeaders = [], rqBody = ""}
  case resResp of
       Left connErr    -> error $ show connErr
       Right (Response (2,0,0) _ _ _) -> return ()
       _ -> do
         hPutStrLn stderr ("Request for " ++ show uri' ++ " did not return success status")
         exitWith (ExitFailure 3)
