diff options
author | Joey Hess <joeyh@joeyh.name> | 2015-04-30 14:03:24 -0400 |
---|---|---|
committer | Joey Hess <joeyh@joeyh.name> | 2015-04-30 14:04:36 -0400 |
commit | e0544f17c1ac482445ff1ae18a413be7cad68f2c (patch) | |
tree | 22c5fc754474185a76c202f1252c4f8306565c3a /Command/Import.hs | |
parent | 42ae5fec8ebbb5921f91d2052bc18d595ead2cfa (diff) |
import: Before removing a duplicate file in --deduplicate or --clean-duplicates mode, verify that enough copies of its content still exist.
Diffstat (limited to 'Command/Import.hs')
-rw-r--r-- | Command/Import.hs | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/Command/Import.hs b/Command/Import.hs index 261bd7b8e..58e4db38a 100644 --- a/Command/Import.hs +++ b/Command/Import.hs @@ -17,6 +17,9 @@ import Remote import Types.KeySource import Types.Key import Annex.CheckIgnore +import Annex.NumCopies +import Types.TrustLevel +import Logs.Trust cmd :: [Command] cmd = [withOptions opts $ notBareRepo $ command "import" paramPaths seek @@ -76,8 +79,14 @@ start mode (srcfile, destfile) = where deletedup k = do showNote $ "duplicate of " ++ key2file k - liftIO $ removeFile srcfile - next $ return True + ifM (verifiedExisting k destfile) + ( do + liftIO $ removeFile srcfile + next $ return True + , do + warning "could not verify that the content is still present in the annex; not removing from the import location" + stop + ) importfile = do ignored <- not <$> Annex.getState Annex.force <&&> checkIgnored destfile if ignored @@ -120,3 +129,14 @@ start mode (srcfile, destfile) = CleanDuplicates -> checkdup (Just deletedup) Nothing SkipDuplicates -> checkdup Nothing (Just importfile) _ -> return (Just importfile) + +verifiedExisting :: Key -> FilePath -> Annex Bool +verifiedExisting key destfile = do + -- Look up the numcopies setting for the file that it would be + -- imported to, if it were imported. + need <- getFileNumCopies destfile + + (remotes, trusteduuids) <- knownCopies key + untrusteduuids <- trustGet UnTrusted + let tocheck = Remote.remotesWithoutUUID remotes (trusteduuids++untrusteduuids) + verifyEnoughCopies [] key need trusteduuids [] tocheck |