diff options
author | Joey Hess <joey@kitenet.net> | 2013-08-11 20:31:54 +0200 |
---|---|---|
committer | Joey Hess <joey@kitenet.net> | 2013-08-11 20:31:54 +0200 |
commit | 09ade2f00bb20059ff4a75bb3085e78c90dcc1df (patch) | |
tree | 78794072099b604da968bc4b91406c794997649c /Command/Import.hs | |
parent | cf52063b5d26dabc1a1b3eaffffd0cc3a0769ef9 (diff) |
implement import --duplicate
The other two options are harder, due to needing to get the key for a file
before adding it.
Diffstat (limited to 'Command/Import.hs')
-rw-r--r-- | Command/Import.hs | 54 |
1 files changed, 45 insertions, 9 deletions
diff --git a/Command/Import.hs b/Command/Import.hs index 518666af9..56fe9c7ab 100644 --- a/Command/Import.hs +++ b/Command/Import.hs @@ -1,6 +1,6 @@ {- git-annex command - - - Copyright 2012 Joey Hess <joey@kitenet.net> + - Copyright 2012-2013 Joey Hess <joey@kitenet.net> - - 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"] +opts :: [Option] +opts = + [ duplicateOption + , deduplicateOption + , cleanDuplicatesOption + ] + +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 = [withPathContents start] +seek = [withValue getDuplicateMode $ \mode -> withPathContents $ start mode] -start :: (FilePath, FilePath) -> CommandStart -start (srcfile, destfile) = +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 |