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

@ -78,7 +78,7 @@ perform = do
return Nothing
| otherwise ->
maybe noop (fromdirect f)
=<< catKey sha
=<< catKey sha mode
_ -> noop
go _ = noop

View file

@ -16,7 +16,6 @@ import qualified Git.Ref
import Annex.CatFile
import Annex.Content.Direct
import Git.Sha
import Git.FileMode
def :: [Command]
def = [command "pre-commit" paramPaths seek SectionPlumbing
@ -48,8 +47,8 @@ startDirect _ = next $ do
withkey (Git.DiffTree.srcsha diff) (Git.DiffTree.srcmode diff) removeAssociatedFile
withkey (Git.DiffTree.dstsha diff) (Git.DiffTree.dstmode diff) addAssociatedFile
where
withkey sha mode a = when (sha /= nullSha && isSymLink mode) $ do
k <- catKey sha
withkey sha mode a = when (sha /= nullSha) $ do
k <- catKey sha mode
case k of
Nothing -> noop
Just key -> void $ a key (Git.DiffTree.file diff)

View file

@ -29,6 +29,7 @@ import qualified Remote.Git
import Types.Key
import Config
import Annex.ReplaceFile
import Git.FileMode
import Data.Hash.MD5
@ -321,7 +322,7 @@ resolveMerge' u
case msha of
Nothing -> a Nothing
Just sha -> do
key <- catKey sha
key <- catKey sha symLinkMode
maybe (return False) (a . Just) key
{- The filename to use when resolving a conflicted merge of a file,