Skip to content

Commit e7c9ae8

Browse files
committed
Tree
1 parent 580a897 commit e7c9ae8

File tree

1 file changed

+21
-15
lines changed

1 file changed

+21
-15
lines changed

src/haskell/Data/HGit2/Tree.chs

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,10 @@ instance CWrapper TreeBuilder where
3030

3131
-- | Get the id of a tree.
3232
treeId :: Tree -> OID
33-
treeId = undefined -- unsafePerformIO . callRetCons {#call git_tree_id#} OID
33+
treeId (Tree tfp) = unsafePerformIO $
34+
withForeignPtr tfp $ \t -> do
35+
ptr <- mkFPtr =<< {#call git_tree_id#} t
36+
return $ OID ptr
3437

3538
-- | Get the number of entries listed in a tree
3639
entryCount :: Tree -> IO Int
@@ -41,16 +44,16 @@ entryCount (Tree tfp) = withForeignPtr tfp $ \t ->
4144
entryByName :: Tree -> String -> IO TreeEntry
4245
entryByName (Tree tfp) fn =
4346
withForeignPtr tfp $ \t ->
44-
withCString fn $ \nm ->
45-
undefined
46-
{- fmap TreeEntry $ {#call git_tree_entry_byname#} t nm-}
47+
withCString fn $ \nm -> do
48+
ptr <- mkFPtr =<< {#call git_tree_entry_byname#} t nm
49+
return $ TreeEntry ptr
4750

4851
-- | Lookup a tree entry by its position in the tree
4952
entryByIndex :: Tree -> Int -> IO TreeEntry
5053
entryByIndex (Tree tfp) n =
51-
withForeignPtr tfp $ \t ->
52-
undefined
53-
{- fmap TreeEntry $ {#call git_tree_entry_byindex#} t (fromIntegral n)-}
54+
withForeignPtr tfp $ \t -> do
55+
ptr <- mkFPtr =<< {#call git_tree_entry_byindex#} t (fromIntegral n)
56+
return $ TreeEntry ptr
5457

5558
-- | Get the UNIX file attributes of a tree entry
5659
attributes :: TreeEntry -> IO Int
@@ -66,14 +69,16 @@ name (TreeEntry tfp) =
6669

6770
-- | Get the id of the object pointed by the entry
6871
entryId :: TreeEntry -> IO OID
69-
entryId = undefined -- callRetCons {#call git_tree_entry_id#} OID
72+
entryId (TreeEntry tfp) =
73+
withForeignPtr tfp $ \t -> do
74+
ptr <- mkFPtr =<< {#call git_tree_entry_id#} t
75+
return $ OID ptr
7076

7177
-- | Get the type of the object pointed by the entry
7278
entryType :: TreeEntry -> IO OType
7379
entryType (TreeEntry tfp) =
74-
withForeignPtr tfp $ \t ->
75-
undefined
76-
{- fmap (toEnum . fromIntegral) $ {#call git_tree_entry_type#} t-}
80+
withForeignPtr tfp $ \t -> do
81+
return . toEnum . fromIntegral =<< {#call git_tree_entry_type#} t
7782

7883
-- | Convert a tree entry to the git_object it points too.
7984
entryToObj :: Repository -> TreeEntry -> IOEitherErr GitObj
@@ -87,9 +92,10 @@ createFromIndex :: OID -> Index -> IO (Maybe GitError)
8792
createFromIndex (OID ofp) (Index ifp) =
8893
withForeignPtr ofp $ \o ->
8994
withForeignPtr ifp $ \i ->
90-
undefined -- retMaybe =<< {#call git_tree_create_fromindex#} o i
95+
retMaybe =<< {#call git_tree_create_fromindex#} o i
9196

9297
-- | Create a new tree builder
98+
-- TODO: Finish
9399
createTreeBuilder :: Maybe Tree -> IO (Either GitError TreeBuilder)
94100
createTreeBuilder tr = alloca $ \builder -> do
95101
res <- {#call git_treebuilder_create#} builder undefined -- t
@@ -121,14 +127,14 @@ insertTreeBuilder (TreeBuilder tfp) fn (OID ofp) as =
121127
alloca $ \entry ->
122128
withCString fn $ \nm -> do
123129
res <- {#call git_treebuilder_insert#} entry b nm o (fromIntegral as)
124-
undefined -- retEither res $ fmap (Right . TreeEntry) $ peek entry
130+
retEither res $ fmap (Right . TreeEntry) $ mkFPtr =<< peek entry
125131

126132
-- | Remove an entry from the builder by its filename
127133
removeTreeBuilder :: TreeBuilder -> String -> IO (Maybe GitError)
128134
removeTreeBuilder (TreeBuilder tfp) fn =
129135
withForeignPtr tfp $ \t ->
130136
withCString fn $ \nm ->
131-
undefined -- retMaybe =<< {#call git_treebuilder_remove#} t nm
137+
retMaybe =<< {#call git_treebuilder_remove#} t nm
132138

133139
{-
134140
/**
@@ -155,4 +161,4 @@ writeTreeBuilder (OID ofp) (Repository rfp) (TreeBuilder tfp) =
155161
withForeignPtr ofp $ \o ->
156162
withForeignPtr rfp $ \r ->
157163
withForeignPtr tfp $ \t ->
158-
undefined -- retMaybe =<< {#call git_treebuilder_write#} o r t
164+
retMaybe =<< {#call git_treebuilder_write#} o r t

0 commit comments

Comments
 (0)