{-# 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)