summaryrefslogtreecommitdiff
path: root/Annex
diff options
context:
space:
mode:
Diffstat (limited to 'Annex')
-rw-r--r--Annex/Branch.hs23
-rw-r--r--Annex/Journal.hs19
2 files changed, 31 insertions, 11 deletions
diff --git a/Annex/Branch.hs b/Annex/Branch.hs
index 5415876f8..a03d6ddf3 100644
--- a/Annex/Branch.hs
+++ b/Annex/Branch.hs
@@ -389,21 +389,26 @@ stageJournal jl = withIndex $ do
prepareModifyIndex jl
g <- gitRepo
let dir = gitAnnexJournalDir g
- fs <- getJournalFiles jl
(jlogf, jlogh) <- openjlog
- liftIO $ do
+ withJournalHandle $ \jh -> do
h <- hashObjectStart g
Git.UpdateIndex.streamUpdateIndex g
- [genstream dir h fs jlogh]
+ [genstream dir h jh jlogh]
hashObjectStop h
return $ cleanup dir jlogh jlogf
where
- 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)
+ genstream dir h jh jlogh streamer = do
+ v <- readDirectory jh
+ case v of
+ Nothing -> return ()
+ Just file -> do
+ unless (dirCruft file) $ do
+ let path = dir </> file
+ sha <- hashFile h path
+ hPutStrLn jlogh file
+ streamer $ Git.UpdateIndex.updateIndexLine
+ sha FileBlob (asTopFilePath $ fileJournal file)
+ genstream dir h jh jlogh streamer
-- 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.
diff --git a/Annex/Journal.hs b/Annex/Journal.hs
index 406155750..198388aa8 100644
--- a/Annex/Journal.hs
+++ b/Annex/Journal.hs
@@ -77,12 +77,27 @@ getJournalFilesStale :: Annex [FilePath]
getJournalFilesStale = do
g <- gitRepo
fs <- liftIO $ catchDefaultIO [] $
- getDirectoryContents' $ gitAnnexJournalDir g
+ getDirectoryContents $ gitAnnexJournalDir g
return $ filter (`notElem` [".", ".."]) fs
+withJournalHandle :: (DirectoryHandle -> IO a) -> Annex a
+withJournalHandle a = do
+ d <- fromRepo gitAnnexJournalDir
+ bracketIO (openDirectory d) closeDirectory (liftIO . a)
+
{- Checks if there are changes in the journal. -}
journalDirty :: Annex Bool
-journalDirty = not . null <$> getJournalFilesStale
+journalDirty = withJournalHandle go
+ where
+ go h = do
+ v <- readDirectory h
+ case v of
+ (Just f)
+ | not (dirCruft f) -> do
+ closeDirectory h
+ return True
+ | otherwise -> go h
+ Nothing -> return False
{- Produces a filename to use in the journal for a file on the branch.
-