summaryrefslogtreecommitdiff
path: root/Command/Import.hs
diff options
context:
space:
mode:
authorGravatar Joey Hess <joeyh@joeyh.name>2015-04-30 14:03:24 -0400
committerGravatar Joey Hess <joeyh@joeyh.name>2015-04-30 14:04:36 -0400
commite0544f17c1ac482445ff1ae18a413be7cad68f2c (patch)
tree22c5fc754474185a76c202f1252c4f8306565c3a /Command/Import.hs
parent42ae5fec8ebbb5921f91d2052bc18d595ead2cfa (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.hs24
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