summaryrefslogtreecommitdiff
path: root/Command
diff options
context:
space:
mode:
authorGravatar Joey Hess <joeyh@joeyh.name>2017-09-07 15:37:49 -0400
committerGravatar Joey Hess <joeyh@joeyh.name>2017-09-07 15:51:31 -0400
commit6b62556049481d8ed9b75a1642f3422a79c55133 (patch)
tree329172d3e04f10f5bf0198ded1ad2709c2887375 /Command
parent6e7dcece6022e5078c2ef2c25d94ee1f23419234 (diff)
interrupted export recovery bugfixes
When an export was interrupted, the sqlite database won't have been committed necessarily. Also, the interrupted export might have been run in an entirely different repository. There's not a significant speed benefit in checking getExportLocation in this case anyway, so avoid it. Also, remove the old filename from the export database. Recovery from interrupted exports is now tested working. This commit was supported by the NSF-funded DataLad project.
Diffstat (limited to 'Command')
-rw-r--r--Command/Export.hs17
1 files changed, 11 insertions, 6 deletions
diff --git a/Command/Export.hs b/Command/Export.hs
index 09878dabf..d2ba53dd2 100644
--- a/Command/Export.hs
+++ b/Command/Export.hs
@@ -96,7 +96,9 @@ seek o = do
-- temp files. Diff from the incomplete tree to the new tree,
-- and delete any temp files that the new tree can't use.
forM_ (concatMap incompleteExportedTreeish old) $ \incomplete ->
- mapdiff (startUnexportTempName r db . Git.DiffTree.srcsha) incomplete new
+ mapdiff (\diff -> startRecoverIncomplete r db (Git.DiffTree.srcsha diff) (Git.DiffTree.file diff))
+ incomplete
+ new
-- Diff the old and new trees, and delete or rename to new name all
-- changed files in the export. After this, every file that remains
@@ -264,15 +266,18 @@ cleanupUnexport r db eks loc = do
logChange (asKey ek) (uuid r) InfoMissing
return True
-startUnexportTempName :: Remote -> ExportHandle -> Git.Sha -> CommandStart
-startUnexportTempName r db sha
+startRecoverIncomplete :: Remote -> ExportHandle -> Git.Sha -> TopFilePath -> CommandStart
+startRecoverIncomplete r db sha oldf
| sha == nullSha = stop
| otherwise = do
ek <- exportKey sha
let loc@(ExportLocation f) = exportTempName ek
- stopUnless (liftIO $ elem loc <$> getExportLocation db (asKey ek)) $ do
- showStart "unexport" f
- next $ performUnexport r db [ek] loc
+ showStart "unexport" f
+ liftIO $ removeExportLocation db (asKey ek) oldloc
+ next $ performUnexport r db [ek] loc
+ where
+ oldloc = ExportLocation $ toInternalGitPath oldf'
+ oldf' = getTopFilePath oldf
startMoveToTempName :: Remote -> ExportHandle -> TopFilePath -> ExportKey -> CommandStart
startMoveToTempName r db f ek = do