module Distribution.VcsRevision.Svn ( getRevision ) where

import Control.Exception
import System.Process
import System.Exit
import Data.List

tryIO :: IO a -> IO (Either IOException a)
tryIO = try

-- | Nothing if we're not in a svn repo, Just (revision,modified) if we're in a repo.
getRevision :: IO (Maybe (String, Bool))
getRevision = do
  res <- tryIO $  readProcessWithExitCode "svn" ["info"] ""
  case res of
    Left ex -> return Nothing
    Right (exit,info,_) -> case exit of
      ExitSuccess -> do
        let prefix = "Last Changed Rev: "
        let rev = drop (length prefix) $ head $ filter (prefix `isPrefixOf`) (lines info)
        (_,out,_) <- readProcessWithExitCode "svn" ["st", "-q"] ""
        return $ Just (rev, out /= "")
      _ -> return Nothing