performExport :: Remote -> ExportHandle -> Key -> AssociatedFile -> Sha -> ExportLocation -> MVar AllFilled -> CommandPerform
performExport r db ek af contentsha loc allfilledvar = do
- let storer = storeExport (exportActions r)
sent <- tryNonAsync $ if not (isGitShaKey ek)
- then ifM (inAnnex ek)
+ then tryrenameannexobject $ ifM (inAnnex ek)
( notifyTransfer Upload af $
-- alwaysUpload because the same key
-- could be used for more than one export
Left err -> do
failedsend
throwM err
+ where
+ storer = storeExport (exportActions r)
+
+ tryrenameannexobject fallback
+ | annexObjects (Remote.config r) = do
+ case renameExport (exportActions r) of
+ Just renameaction -> do
+ locs <- loggedLocations ek
+ gc <- Annex.getGitConfig
+ let objloc = exportAnnexObjectLocation gc ek
+ if Remote.uuid r `elem` locs
+ then tryNonAsync (renameaction ek objloc loc) >>= \case
+ Right (Just ()) -> return True
+ Left _err -> fallback
+ Right Nothing -> fallback
+ else fallback
+ Nothing -> fallback
+ | otherwise = fallback
cleanupExport :: Remote -> ExportHandle -> Key -> ExportLocation -> Bool -> CommandCleanup
cleanupExport r db ek loc sent = do
* Working on `exportreeplus` branch which is groundwork for proxying to
exporttree=yes special remotes.
-* `git-annex export` when exporting a file should rename it from the
- annexobjects location when it's present there. This will avoid redundant
- uploads.
-
- An example case where this is important: Proxying to a exporttree remote,
- a file is uploaded to it but is not yet in an exported tree. When the
- exported tree is pushed, the remote needs to be updated by exporting to
- it. In this case, the proxy doesn't have a copy of the file, so it would
- need to download it from annexobjects before uploading it to the final
- location. With this optimisation, it can just rename it.
-
- However: If a key is used twice in an exported tree, it seems a proxy
- will need to download and reupload anyway. Unless a copy operation is
- added to exporttree remotes..
-
## items deferred until later for p2p protocol over http
* `git-annex p2phttp` should support serving several repositories at the same