diff options
author | Joey Hess <joeyh@joeyh.name> | 2017-09-07 15:37:49 -0400 |
---|---|---|
committer | Joey Hess <joeyh@joeyh.name> | 2017-09-07 15:51:31 -0400 |
commit | 6b62556049481d8ed9b75a1642f3422a79c55133 (patch) | |
tree | 329172d3e04f10f5bf0198ded1ad2709c2887375 /Command | |
parent | 6e7dcece6022e5078c2ef2c25d94ee1f23419234 (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.hs | 17 |
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 |