summaryrefslogtreecommitdiff
path: root/Annex/Branch.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Annex/Branch.hs')
-rw-r--r--Annex/Branch.hs22
1 files changed, 19 insertions, 3 deletions
diff --git a/Annex/Branch.hs b/Annex/Branch.hs
index 3443730d2..5415876f8 100644
--- a/Annex/Branch.hs
+++ b/Annex/Branch.hs
@@ -390,18 +390,34 @@ stageJournal jl = withIndex $ do
g <- gitRepo
let dir = gitAnnexJournalDir g
fs <- getJournalFiles jl
+ (jlogf, jlogh) <- openjlog
liftIO $ do
h <- hashObjectStart g
Git.UpdateIndex.streamUpdateIndex g
- [genstream dir h fs]
+ [genstream dir h fs jlogh]
hashObjectStop h
- return $ liftIO $ mapM_ (removeFile . (dir </>)) fs
+ return $ cleanup dir jlogh jlogf
where
- genstream dir h fs streamer = forM_ fs $ \file -> do
+ genstream dir h fs jlogh streamer = forM_ fs $ \file -> do
let path = dir </> file
sha <- hashFile h path
+ hPutStrLn jlogh file
streamer $ Git.UpdateIndex.updateIndexLine
sha FileBlob (asTopFilePath $ fileJournal file)
+ -- Clean up the staged files, as listed in the temp log file.
+ -- The temp file is used to avoid needing to buffer all the
+ -- filenames in memory.
+ cleanup dir jlogh jlogf = do
+ hFlush jlogh
+ hSeek jlogh AbsoluteSeek 0
+ stagedfs <- lines <$> hGetContents jlogh
+ mapM_ (removeFile . (dir </>)) stagedfs
+ hClose jlogh
+ nukeFile jlogf
+ openjlog = do
+ tmpdir <- fromRepo gitAnnexTmpMiscDir
+ createAnnexDirectory tmpdir
+ liftIO $ openTempFile tmpdir "jlog"
{- This is run after the refs have been merged into the index,
- but before the result is committed to the branch.