add git ls-tree --long parser
Not yet used, but allows getting the size of items in the tree fairly cheaply. I noticed that CmdLine.Seek uses ls-tree and the feeds the files into another long-running process to check their size. That would be an example of a place that might be sped up by using this. Although in that particular case, it only needs to know the size of unlocked files, not locked. And since enabling --long probably doubles the ls-tree runtime or more, the overhead of using it there may outwweigh the benefit.
This commit is contained in:
parent
d89a9b0f78
commit
a8b837aaef
13 changed files with 97 additions and 56 deletions
12
Git/Tree.hs
12
Git/Tree.hs
|
@ -55,16 +55,17 @@ data TreeContent
|
|||
deriving (Show, Eq, Ord)
|
||||
|
||||
{- Gets the Tree for a Ref. -}
|
||||
getTree :: LsTree.LsTreeMode -> Ref -> Repo -> IO Tree
|
||||
getTree lstreemode r repo = do
|
||||
(l, cleanup) <- lsTreeWithObjects lstreemode r repo
|
||||
getTree :: LsTree.LsTreeRecursive -> Ref -> Repo -> IO Tree
|
||||
getTree recursive r repo = do
|
||||
(l, cleanup) <- lsTreeWithObjects recursive r repo
|
||||
let !t = either (\e -> error ("ls-tree parse error:" ++ e)) id
|
||||
(extractTree l)
|
||||
void cleanup
|
||||
return t
|
||||
|
||||
lsTreeWithObjects :: LsTree.LsTreeMode -> Ref -> Repo -> IO ([LsTree.TreeItem], IO Bool)
|
||||
lsTreeWithObjects = LsTree.lsTree' [Param "-t"]
|
||||
lsTreeWithObjects :: LsTree.LsTreeRecursive -> Ref -> Repo -> IO ([LsTree.TreeItem], IO Bool)
|
||||
lsTreeWithObjects recursive =
|
||||
LsTree.lsTree' [Param "-t"] recursive (LsTree.LsTreeLong False)
|
||||
|
||||
newtype MkTreeHandle = MkTreeHandle CoProcess.CoProcessHandle
|
||||
|
||||
|
@ -140,6 +141,7 @@ treeItemToLsTreeItem (TreeItem f mode sha) = LsTree.TreeItem
|
|||
Just TreeSubtree -> TreeObject
|
||||
_ -> BlobObject
|
||||
, LsTree.sha = sha
|
||||
, LsTree.size = Nothing
|
||||
, LsTree.file = f
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue