Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module Directory (getBugList, writeIssues) where
- import System.Directory
- import Control.Monad.Error
- import System.FilePath
- import Issue
- startsWith :: (Eq a) => [a] -> [a] -> Bool
- startsWith xs ys | xs == take (length xs) ys = True
- | otherwise = False
- createNewDirectory :: ErrorT String IO FilePath
- createNewDirectory = do
- dir <- fmap ((</> ".fiba")) $ liftIO $ getCurrentDirectory
- liftIO $ createDirectory dir
- return dir
- getBugList :: ErrorT String IO [Issue]
- getBugList = do
- maybedir <- findBugDir
- case maybedir of
- Nothing -> createNewDirectory >> return []
- Just dir -> do
- contents <- liftIO $ getDirectoryContents dir
- files <- filterM (liftIO . notDirectory . (dir </>)) $ filter (not . flip elem [".config"]) contents
- mapM (parseIssue . (dir </>)) files
- where
- parseIssue path = do
- content <- liftIO $ readFile path
- case reads content of
- [] -> throwError $ "Could not parse: " ++ path
- [(a,_)] -> return a
- notDirectory = fmap not . doesDirectoryExist
- findBugDir :: ErrorT String IO (Maybe FilePath)
- findBugDir = do
- curdir <- liftIO $ getCurrentDirectory
- recurse curdir
- where
- recurse "/" = return Nothing
- recurse path = do
- contents <- liftIO $ getDirectoryContents path
- if ".fiba" `elem` contents
- then
- let dir = path </> ".fiba"
- in do
- isdir <- liftIO $ doesDirectoryExist dir
- if isdir
- then return (Just dir)
- else (throwError $ dir ++ " exists but is not a directory")
- else recurse (takeDirectory path)
- writeIssues :: [Issue] -> ErrorT String IO ()
- writeIssues issues = do
- maybedir <- findBugDir
- case maybedir of
- Nothing -> createNewDirectory >>= \d -> mapM_ (write d) issues
- Just d -> mapM_ (write d) issues
- where
- write :: FilePath -> Issue -> ErrorT String IO ()
- write path i@(Issue _ _ _ _ _ ident) = liftIO (writeFile (path </> ("issue - " ++ ident)) (show i))
- write path c@(Comment _ _ ident) = liftIO (writeFile (path </> ("comment - " ++ ident)) (show c))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement