diff options
Diffstat (limited to 'Annex')
-rw-r--r-- | Annex/CatFile.hs | 14 | ||||
-rw-r--r-- | Annex/Link.hs | 6 |
2 files changed, 16 insertions, 4 deletions
diff --git a/Annex/CatFile.hs b/Annex/CatFile.hs index 99d301b4b..b1d8fba28 100644 --- a/Annex/CatFile.hs +++ b/Annex/CatFile.hs @@ -49,6 +49,11 @@ catObject ref = do h <- catFileHandle liftIO $ Git.CatFile.catObject h ref +catObjectMetaData :: Git.Ref -> Annex (Maybe (Integer, ObjectType)) +catObjectMetaData ref = do + h <- catFileHandle + liftIO $ Git.CatFile.catObjectMetaData h ref + catTree :: Git.Ref -> Annex [(FilePath, FileMode)] catTree ref = do h <- catFileHandle @@ -89,7 +94,14 @@ catFileStop = do {- From ref to a symlink or a pointer file, get the key. -} catKey :: Ref -> Annex (Maybe Key) -catKey ref = parseLinkOrPointer <$> catObject ref +catKey ref = go =<< catObjectMetaData ref + where + go (Just (sz, _)) + -- Avoid catting large files, that cannot be symlinks or + -- pointer files, which would require buffering their + -- content in memory, as well as a lot of IO. + | sz <= maxPointerSz = parseLinkOrPointer <$> catObject ref + go _ = return Nothing {- Gets a symlink target. -} catSymLinkTarget :: Sha -> Annex String diff --git a/Annex/Link.hs b/Annex/Link.hs index af20ae30d..90312a04a 100644 --- a/Annex/Link.hs +++ b/Annex/Link.hs @@ -26,7 +26,6 @@ import Annex.HashObject import Utility.FileMode import qualified Data.ByteString.Lazy as L -import Data.Int type LinkTarget = String @@ -137,7 +136,8 @@ writePointerFile file k mode = do - Only looks at the first line, as pointer files can have subsequent - lines. -} parseLinkOrPointer :: L.ByteString -> Maybe Key -parseLinkOrPointer = parseLinkOrPointer' . decodeBS . L.take maxPointerSz +parseLinkOrPointer = parseLinkOrPointer' + . decodeBS . L.take (fromIntegral maxPointerSz) where {- Want to avoid buffering really big files in git into @@ -146,7 +146,7 @@ parseLinkOrPointer = parseLinkOrPointer' . decodeBS . L.take maxPointerSz - 8192 bytes is plenty for a pointer to a key. - Pad some more to allow for any pointer files that might have - lines after the key explaining what the file is used for. -} -maxPointerSz :: Int64 +maxPointerSz :: Integer maxPointerSz = 81920 parseLinkOrPointer' :: String -> Maybe Key |