{-# LANGUAGE DeriveDataTypeable #-}
import qualified Marks
import Import
import Export
import System.Console.CmdLib
data Cmd = Import { repo :: String
, format :: RepoFormat
, create :: Bool
, readMarks :: FilePath
, writeMarks :: FilePath }
| Export { repo :: String
, readMarks :: FilePath
, writeMarks :: FilePath }
deriving (Eq, Typeable, Data)
instance Attributes Cmd where
attributes _ =
repo %> [ Positional 0 ] %% group "Options"
[ format %> [ Help "repository type to create: darcs-2 (default) or hashed"
, Default Darcs2Format ]
, create %> [ Help "create a new repository", Default True ]
, readMarks %> [ Help "continue conversion, previously checkpointed by --write-marks"
, ArgHelp "FILE" ]
, writeMarks %> [ Help "checkpoint conversion to continue it later"
, ArgHelp "FILE" ] ]
readFlag _ = readCommon <+< readFormat
where readFormat "darcs-2" = Darcs2Format
readFormat "hashed" = HashedFormat
readFormat x = error $ "No such repository format " ++ show x
instance RecordCommand Cmd where
mode_summary Import {} = "Import a git-fast-export dump into darcs."
mode_summary Export {} = "Export a darcs repository to a git-fast-import stream."
handleMarks cmd act = do
do marks <- case readMarks cmd of
[] -> return Marks.emptyMarks
x -> Marks.readMarks x
marks' <- act marks
case writeMarks cmd of
[] -> return ()
x -> Marks.writeMarks x marks'
main = getArgs >>= dispatchR [] >>= \x -> case x of
Import {} | create x && null (readMarks x) -> case readMarks x of
[] -> (format x) `seq` -- avoid late failure
handleMarks x (const $ fastImport (repo x) (format x))
| otherwise -> handleMarks x $ fastImportIncremental (repo x)
Export {} -> handleMarks x $ fastExport (repo x)