From d69da2bf22248d311069064e3ae6e5c69f8804c7 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 11 Aug 2013 20:31:54 +0200 Subject: [PATCH] implement import --duplicate The other two options are harder, due to needing to get the key for a file before adding it. --- Command/Import.hs | 56 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 46 insertions(+), 10 deletions(-) diff --git a/Command/Import.hs b/Command/Import.hs index 518666af91..56fe9c7ab8 100644 --- a/Command/Import.hs +++ b/Command/Import.hs @@ -1,6 +1,6 @@ {- git-annex command - - - Copyright 2012 Joey Hess + - Copyright 2012-2013 Joey Hess - - Licensed under the GNU GPL version 3 or higher. -} @@ -13,30 +13,66 @@ import Common.Annex import Command import qualified Annex import qualified Command.Add +import qualified Option +import Utility.CopyFile def :: [Command] -def = [notBareRepo $ command "import" paramPaths seek +def = [withOptions opts $ notBareRepo $ command "import" paramPaths seek SectionCommon "move and add files from outside git working copy"] -seek :: [CommandSeek] -seek = [withPathContents start] +opts :: [Option] +opts = + [ duplicateOption + , deduplicateOption + , cleanDuplicatesOption + ] -start :: (FilePath, FilePath) -> CommandStart -start (srcfile, destfile) = +duplicateOption :: Option +duplicateOption = Option.flag [] "duplicate" "do not delete outside files" + +deduplicateOption :: Option +deduplicateOption = Option.flag [] "deduplicate" "do not add files whose content has been seen" + +cleanDuplicatesOption :: Option +cleanDuplicatesOption = Option.flag [] "clean-duplicates" "delete outside duplicate files (import nothing)" + +data DuplicateMode = Default | Duplicate | DeDuplicate | CleanDuplicates + deriving (Eq) + +getDuplicateMode :: Annex DuplicateMode +getDuplicateMode = gen + <$> getflag duplicateOption + <*> getflag deduplicateOption + <*> getflag cleanDuplicatesOption + where + getflag = Annex.getFlag . Option.name + gen False False False = Default + gen True False False = Duplicate + gen False True False = DeDuplicate + gen False False True = CleanDuplicates + gen _ _ _ = error "bad combination of --duplicate, --deduplicate, --clean-duplicates" + +seek :: [CommandSeek] +seek = [withValue getDuplicateMode $ \mode -> withPathContents $ start mode] + +start :: DuplicateMode -> (FilePath, FilePath) -> CommandStart +start mode (srcfile, destfile) = ifM (liftIO $ isRegularFile <$> getSymbolicLinkStatus srcfile) ( do showStart "import" destfile - next $ perform srcfile destfile + next $ perform mode srcfile destfile , stop ) -perform :: FilePath -> FilePath -> CommandPerform -perform srcfile destfile = do +perform :: DuplicateMode -> FilePath -> FilePath -> CommandPerform +perform mode srcfile destfile = do whenM (liftIO $ doesFileExist destfile) $ unlessM (Annex.getState Annex.force) $ error $ "not overwriting existing " ++ destfile ++ " (use --force to override)" liftIO $ createDirectoryIfMissing True (parentDir destfile) - liftIO $ moveFile srcfile destfile + liftIO $ if mode == Duplicate + then void $ copyFileExternal srcfile destfile + else moveFile srcfile destfile Command.Add.perform destfile