more completely solve catKey memory leak

Done using a mode witness, which ensures it's fixed everywhere.

Fixing catFileKey was a bear, because git cat-file does not provide a
nice way to query for the mode of a file and there is no other efficient
way to do it. Oh, for libgit2..

Note that I am looking at tree objects from HEAD, rather than the index.
Because I cat-file cannot show a tree object for the index.
So this fix is technically incomplete. The only cases where it matters
are:

1. A new large file has been directly staged in git, but not committed.
2. A file that was committed to HEAD as a symlink has been staged
   directly in the index.

This could be fixed a lot better using libgit2.
This commit is contained in:
Joey Hess 2013-09-19 16:30:37 -04:00
parent f26c996dc6
commit 006cf7976f
10 changed files with 71 additions and 27 deletions

View file

@ -14,7 +14,6 @@ import qualified Git.Merge
import qualified Git.DiffTree as DiffTree
import Git.Sha
import Git.Types
import Git.FileMode
import Annex.CatFile
import qualified Annex.Queue
import Logs.Location
@ -46,9 +45,7 @@ stageDirect = do
- efficiently as we can, by getting any key that's associated
- with it in git, as well as its stat info. -}
go (file, Just sha, Just mode) = do
shakey <- if isSymLink mode
then catKey sha
else return Nothing
shakey <- catKey sha mode
mstat <- liftIO $ catchMaybeIO $ getSymbolicLinkStatus file
filekey <- isAnnexLink file
case (shakey, filekey, mstat, toInodeCache =<< mstat) of
@ -149,10 +146,9 @@ mergeDirectCleanup d oldsha newsha = do
where
go getsha getmode a araw
| getsha item == nullSha = noop
| isSymLink (getmode item) =
| otherwise =
maybe (araw f) (\k -> void $ a k f)
=<< catKey (getsha item)
| otherwise = araw f
=<< catKey (getsha item) (getmode item)
f = DiffTree.file item
moveout = removeDirect