3131#include "error.h"
3232#include "utils.h"
3333#include "repository.h"
34+ #include "object.h"
3435#include "oid.h"
3536#include "tree.h"
3637#include "diff.h"
@@ -177,25 +178,14 @@ TreeEntry_hex__get__(TreeEntry *self)
177178 return git_oid_to_py_str (git_tree_entry_id (self -> entry ));
178179}
179180
180- PyObject *
181- TreeEntry_repr (TreeEntry * self )
182- {
183- char str [GIT_OID_HEXSZ + 1 ] = { 0 };
184- const char * typename ;
185-
186- typename = git_object_type2string (git_tree_entry_type (self -> entry ));
187- git_oid_fmt (str , git_tree_entry_id (self -> entry ));
188- return PyString_FromFormat ("pygit2.TreeEntry('%s', %s, %s)" , git_tree_entry_name (self -> entry ), typename , str );
189- }
190-
191181git_tree *
192182treeentry_to_subtree (TreeEntry * self )
193183{
194184 Repository * py_repo ;
195185 git_tree * subtree = NULL ;
196186
197187 if (git_tree_entry_type (self -> entry ) != GIT_OBJ_TREE ) {
198- PyErr_SetString (PyExc_TypeError , "Only supported for trees" );
188+ PyErr_SetString (PyExc_TypeError , "Only for trees" );
199189 return NULL ;
200190 }
201191
@@ -214,6 +204,62 @@ treeentry_to_subtree(TreeEntry* self)
214204 return subtree ;
215205}
216206
207+ PyObject *
208+ treeentry_to_object (TreeEntry * self )
209+ {
210+ Repository * py_repo ;
211+ git_object * obj = NULL ;
212+
213+ if (self -> repo == NULL ) {
214+ PyErr_SetString (PyExc_ValueError , "No repository associated with this TreeEntry" );
215+ return NULL ;
216+ }
217+ py_repo = self -> repo ;
218+
219+ int err = git_tree_entry_to_object (& obj , py_repo -> repo , self -> entry );
220+ if (err < 0 ) {
221+ Error_set (err );
222+ return NULL ;
223+ }
224+
225+ return wrap_object (obj , py_repo );
226+ }
227+ PyDoc_STRVAR (TreeEntry_tree__doc__ , "Subtree" );
228+
229+ PyObject *
230+ TreeEntry_tree__get__ (TreeEntry * self )
231+ {
232+ git_tree * subtree = treeentry_to_subtree (self );
233+ if (subtree == NULL )
234+ return NULL ;
235+
236+ return wrap_object ((git_object * )subtree , self -> repo );
237+ }
238+
239+ PyDoc_STRVAR (TreeEntry_blob__doc__ , "Blob" );
240+
241+ PyObject *
242+ TreeEntry_blob__get__ (TreeEntry * self )
243+ {
244+ if (git_tree_entry_type (self -> entry ) != GIT_OBJ_BLOB ) {
245+ PyErr_SetString (PyExc_TypeError , "Only for blobs" );
246+ return NULL ;
247+ }
248+
249+ return treeentry_to_object (self );
250+ }
251+
252+ PyObject *
253+ TreeEntry_repr (TreeEntry * self )
254+ {
255+ char str [GIT_OID_HEXSZ + 1 ] = { 0 };
256+ const char * typename ;
257+
258+ typename = git_object_type2string (git_tree_entry_type (self -> entry ));
259+ git_oid_fmt (str , git_tree_entry_id (self -> entry ));
260+ return PyString_FromFormat ("pygit2.TreeEntry('%s', %s, %s)" , git_tree_entry_name (self -> entry ), typename , str );
261+ }
262+
217263int
218264TreeEntry_contains (TreeEntry * self , PyObject * py_name )
219265{
@@ -295,6 +341,8 @@ PyGetSetDef TreeEntry_getseters[] = {
295341 GETTER (TreeEntry , id ),
296342 GETTER (TreeEntry , hex ),
297343 GETTER (TreeEntry , type ),
344+ GETTER (TreeEntry , blob ),
345+ GETTER (TreeEntry , tree ),
298346 {NULL }
299347};
300348
0 commit comments