diff options
author | Joey Hess <joeyh@joeyh.name> | 2016-02-23 20:25:31 -0400 |
---|---|---|
committer | Joey Hess <joeyh@joeyh.name> | 2016-02-23 20:25:31 -0400 |
commit | 3aab18a4c171b6f812bfe89877401421d293a515 (patch) | |
tree | bdf7e96bf2eddffe1409003dbe1985778ee25ceb /Git | |
parent | cab5b78a7d08d8ed3d25751844e6aa43278fccfb (diff) |
no streaming
extractTree has to parse the whole input list in order to generate a tree,
so convert interface to non-streaming.
Some quick memory benchmarks in a repo with 60k files
don't look too bad despite not streaming.
To stream, without building up a whole tree object, one way would
be a new interface:
adjustTree :: MonadIO m :: (TreeItem -> m (Maybe TreeItem)) -> Ref -> Repo -> m Sha
This would only need to buffer tree objects from the current one down
to the root, in order to update trees when a TreeItem is changed.
But, while it supports changing items in the tree, and removing items,
it does not support adding new items, or moving items from one directory to
another.
Diffstat (limited to 'Git')
-rw-r--r-- | Git/Tree.hs | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/Git/Tree.hs b/Git/Tree.hs index c4cbe03f1..f6c445641 100644 --- a/Git/Tree.hs +++ b/Git/Tree.hs @@ -5,6 +5,8 @@ - Licensed under the GNU GPL version 3 or higher. -} +{-# LANGUAGE BangPatterns #-} + module Git.Tree ( Tree(..), TreeContent(..), @@ -36,12 +38,14 @@ data TreeContent deriving (Show) {- Gets the Tree for a Ref. -} -getTree :: Ref -> Repo -> IO (Tree, IO Bool) +getTree :: Ref -> Repo -> IO Tree getTree r repo = do -- Pass -t to get the tree object shas, which are normally omitted. (l, cleanup) <- LsTree.lsTree' [Param "-t"] r repo - let t = either (\e -> error ("ls-tree parse error:" ++ e)) id (extractTree l) - return (t, cleanup) + let !t = either (\e -> error ("ls-tree parse error:" ++ e)) id + (extractTree l) + void cleanup + return t {- Assumes the list is ordered, with tree objects coming right before their - contents. -} |