module Database.Migrate.Migration.Directory (
migration
) where
import Control.Applicative ((<$>))
import Data.List (isSuffixOf, intercalate, groupBy)
import Data.Text (Text, pack)
import Database.Migrate.Migration
import qualified Database.Migrate.Migration.FileInferred as File
import System.FilePath
import System.Directory
migration :: FilePath -> IO (Either Text [Migration])
migration path =
(mkmigration . filter isMigrationFile) <$> getDirectoryContents path
unsuffix :: FilePath -> FilePath
unsuffix =
dropExtension . dropExtension
isMigrationFile :: FilePath -> Bool
isMigrationFile p =
isSuffixOf ".up.sql" p || isSuffixOf ".down.sql" p
isUp :: FilePath -> Bool
isUp =
isMigrationType "up"
isMigrationType :: String -> FilePath -> Bool
isMigrationType t p =
(takeExtension . takeExtension $ p) == t
mkmigration :: [FilePath] -> Either Text [Migration]
mkmigration paths =
mapM (\group -> case group of
a : _ : [] -> Right . File.migration $ unsuffix a
a : [] -> Right $ (if isUp a then File.up else File.down) (unsuffix a)
_ -> Left . pack $ "Duplicate prefix detected in: " ++ (intercalate "," group)
) (groupBy (\a b -> unsuffix a == unsuffix b) paths)