@@ -44,6 +44,14 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_git_tree_path, 0, 0, 1)
4444 ZEND_ARG_INFO (0 , path )
4545ZEND_END_ARG_INFO ()
4646
47+ ZEND_BEGIN_ARG_INFO_EX (arginfo_git_tree_get_entry , 0 , 0 , 1 )
48+ ZEND_ARG_INFO (0 , position )
49+ ZEND_END_ARG_INFO ()
50+
51+ ZEND_BEGIN_ARG_INFO_EX (arginfo_git_tree_remove , 0 , 0 , 1 )
52+ ZEND_ARG_INFO (0 , name )
53+ ZEND_END_ARG_INFO ()
54+
4755static void php_git_tree_free_storage (php_git_tree_t * obj TSRMLS_DC )
4856{
4957 zend_object_std_dtor (& obj -> zo TSRMLS_CC );
@@ -195,11 +203,92 @@ PHP_METHOD(git_tree, __construct)
195203 }
196204}
197205
206+ PHP_METHOD (git_tree , getIterator )
207+ {
208+ php_git_tree_t * this = (php_git_tree_t * ) zend_object_store_get_object (getThis () TSRMLS_CC );
209+ zval * iterator ;
210+
211+ MAKE_STD_ZVAL (iterator );
212+ object_init_ex (iterator ,git_tree_iterator_class_entry );
213+ php_git_tree_iterator_t * obj = (php_git_tree_iterator_t * ) zend_object_store_get_object (iterator TSRMLS_CC );
214+ obj -> tree = this -> object ;
215+ obj -> offset = 0 ;
216+ RETURN_ZVAL (iterator ,0 ,0 );
217+ }
218+
219+ PHP_METHOD (git_tree , getEntry )
220+ {
221+ php_git_tree_t * this = (php_git_tree_t * ) zend_object_store_get_object (getThis () TSRMLS_CC );
222+ git_tree_entry * entry ;
223+ zval * git_tree_entry ;
224+ int offset = 0 ;
225+
226+ if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC ,
227+ "l" , & offset ) == FAILURE ){
228+ return ;
229+ }
230+
231+ entry = git_tree_entry_byindex (this -> object ,offset );
232+ create_tree_entry_from_entry (& git_tree_entry , entry );
233+ RETURN_ZVAL (git_tree_entry ,0 , 0 );
234+ }
235+
236+ PHP_METHOD (git_tree , remove )
237+ {
238+ php_git_tree_t * this = (php_git_tree_t * ) zend_object_store_get_object (getThis () TSRMLS_CC );
239+ char * path ;
240+ int path_len = 0 ;
241+
242+ if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC ,
243+ "s" , & path , & path_len ) == FAILURE ){
244+ return ;
245+ }
246+
247+ git_tree_entry * entry = git_tree_entry_byname (this -> object ,path );
248+ if (entry == NULL ){
249+ zend_throw_exception_ex (spl_ce_InvalidArgumentException , 0 TSRMLS_CC ,
250+ "specified path does not exist." );
251+ RETURN_FALSE ;
252+ }
253+
254+ int result = git_tree_remove_entry_byname (this -> object , path );
255+ if (result != GIT_SUCCESS ){
256+ zend_throw_exception_ex (spl_ce_InvalidArgumentException , 0 TSRMLS_CC ,
257+ "can't remove tree entry" );
258+ RETURN_FALSE
259+ }
260+ RETURN_TRUE ;
261+ }
262+
263+ PHP_METHOD (git_tree , getEntries )
264+ {
265+ php_git_tree_t * this = (php_git_tree_t * ) zend_object_store_get_object (getThis () TSRMLS_CC );
266+ git_tree_entry * entry ;
267+ int i ;
268+
269+ int r = git_tree_entrycount (this -> object );
270+ zval * entries ;
271+ MAKE_STD_ZVAL (entries );
272+ array_init (entries );
273+ zval * array_ptr ;
274+ for (i = 0 ; i < r ; i ++ ){
275+ create_tree_entry_from_entry (& array_ptr , git_tree_entry_byindex (this -> object ,i ));
276+ add_next_index_zval (entries , array_ptr );
277+ }
278+
279+ RETURN_ZVAL (entries ,0 ,0 );
280+ }
281+
282+
198283PHPAPI function_entry php_git_tree_methods [] = {
199284 PHP_ME (git_tree , __construct , arginfo_git_tree__construct , ZEND_ACC_PUBLIC )
285+ PHP_ME (git_tree , getEntry , arginfo_git_tree_get_entry , ZEND_ACC_PUBLIC )
286+ PHP_ME (git_tree , getEntries , NULL , ZEND_ACC_PUBLIC )
287+ PHP_ME (git_tree , getIterator , NULL , ZEND_ACC_PUBLIC )
200288 PHP_ME (git_tree , count , NULL , ZEND_ACC_PUBLIC )
201289 PHP_ME (git_tree , path , arginfo_git_tree_path , ZEND_ACC_PUBLIC )
202290 PHP_ME (git_tree , add , arginfo_git_tree_add , ZEND_ACC_PUBLIC )
291+ PHP_ME (git_tree , remove , arginfo_git_tree_remove , ZEND_ACC_PUBLIC )
203292 {NULL , NULL , NULL }
204293};
205294
@@ -210,5 +299,5 @@ void git_init_tree(TSRMLS_D)
210299 git_tree_class_entry = zend_register_internal_class_ex (& ce , git_object_class_entry , NULL TSRMLS_CC );
211300 git_tree_class_entry -> create_object = php_git_tree_new ;
212301
213- zend_class_implements (git_tree_class_entry TSRMLS_CC , 1 , spl_ce_Countable );
302+ zend_class_implements (git_tree_class_entry TSRMLS_CC , 2 , spl_ce_Countable , zend_ce_aggregate );
214303}
0 commit comments