diff --git a/Command/Export.hs b/Command/Export.hs index a7ee89f11d..ab7e1c49e2 100644 --- a/Command/Export.hs +++ b/Command/Export.hs @@ -1,6 +1,6 @@ {- git-annex command - - - Copyright 2017-2023 Joey Hess + - Copyright 2017-2024 Joey Hess - - Licensed under the GNU AGPL version 3 or higher. -} @@ -21,6 +21,7 @@ import Git.Types import Git.FilePath import Git.Sha import qualified Remote +import qualified Types.Remote as Remote import Types.Remote import Types.Export import Annex.Export @@ -29,6 +30,7 @@ import Annex.Transfer import Annex.CatFile import Annex.FileMatcher import Annex.RemoteTrackingBranch +import Annex.SpecialRemote.Config import Logs.Location import Logs.Export import Logs.PreferredContent @@ -387,7 +389,15 @@ cleanupUnexport r db eks loc = do concat <$> forM eks (getExportedLocation db) when (null remaininglocs) $ forM_ eks $ \ek -> - logChange ek (uuid r) InfoMissing + -- When annexobject=true, a key that + -- was unexported may still be present + -- on the remote. + if annexObjects (Remote.config r) + then tryNonAsync (checkPresent r ek) >>= \case + Right False -> + logChange ek (uuid r) InfoMissing + _ -> noop + else logChange ek (uuid r) InfoMissing removeEmptyDirectories r db loc eks diff --git a/doc/todo/exporttree_remotes_could_store_any_key.mdwn b/doc/todo/exporttree_remotes_could_store_any_key.mdwn index fe2ade60c1..5a9c20881b 100644 --- a/doc/todo/exporttree_remotes_could_store_any_key.mdwn +++ b/doc/todo/exporttree_remotes_could_store_any_key.mdwn @@ -67,12 +67,13 @@ exporttree=yes special remote R. * A exports tree T1 to R * B pulls from A, so knows R has tree T1 * A exports tree T2 to R, which deletes file `foo`. So - it is moved to R's .git/annex/objects/ + it is moved to R's .git/annex/objects. Or, alternatively, + `foo` is deleted, and the key is then copied to R again, + also to .git/annex/objects. * B exports tree T2 to R also. So B deletes file `foo`. But it was not present anyway. If B then marks the key as not present in R, we will have lost track of the fact that A moved it to the objects location. So, when calling removeExport, have to also check if the key is present in -the objects location. If so, don't record the key as missing. (Or course, -it already checks if some other exported file also has the content of the -key.) +the objects location. If so, either don't record the key as missing, or +also remove from the objects location.