implement import --deduplicate and import --clean-duplicates

Note that --deduplicate currently checksums each file twice,
once to see if it's a known key, and once when importing it.

Perhaps this could be revisited and the extra checksum gotten rid of,
at the cost of not locking down the file when adding it.
This commit is contained in:
Joey Hess 2013-08-20 11:00:52 -04:00
parent e240cb99f7
commit b46afa29ac

View file

@ -15,6 +15,9 @@ import qualified Annex
import qualified Command.Add import qualified Command.Add
import qualified Option import qualified Option
import Utility.CopyFile import Utility.CopyFile
import Backend
import Remote
import Types.KeySource
def :: [Command] def :: [Command]
def = [withOptions opts $ notBareRepo $ command "import" paramPaths seek def = [withOptions opts $ notBareRepo $ command "import" paramPaths seek
@ -65,14 +68,37 @@ start mode (srcfile, destfile) =
) )
perform :: DuplicateMode -> FilePath -> FilePath -> CommandPerform perform :: DuplicateMode -> FilePath -> FilePath -> CommandPerform
perform mode srcfile destfile = do perform mode srcfile destfile =
whenM (liftIO $ doesFileExist destfile) $ case mode of
unlessM (Annex.getState Annex.force) $ DeDuplicate -> ifM isdup
error $ "not overwriting existing " ++ destfile ++ ( deletedup
" (use --force to override)" , go
)
liftIO $ createDirectoryIfMissing True (parentDir destfile) CleanDuplicates -> ifM isdup
liftIO $ if mode == Duplicate ( deletedup
then void $ copyFileExternal srcfile destfile , next $ return True
else moveFile srcfile destfile )
Command.Add.perform destfile _ -> go
where
isdup = do
backend <- chooseBackend destfile
let ks = KeySource srcfile srcfile Nothing
v <- genKey ks backend
case v of
Just (k, _) -> not . null <$> keyLocations k
_ -> return False
deletedup = do
showNote "duplicate"
liftIO $ removeFile srcfile
next $ return True
go = 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 $ if mode == Duplicate
then void $ copyFileExternal srcfile destfile
else moveFile srcfile destfile
Command.Add.perform destfile