Skip to content

Commit 9e6e921

Browse files
committed
[treebuilder] add filter function
1 parent 7a81f1b commit 9e6e921

File tree

5 files changed

+58
-16
lines changed

5 files changed

+58
-16
lines changed

helper.c

+6
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,12 @@ int php_git2_call_function_v(
278278
fci->no_separation = 1;
279279

280280
if (zend_call_function(fci, fcc TSRMLS_CC) != SUCCESS) {
281+
if (param_count > 0) {
282+
for (i = 0; i < param_count; i++) {
283+
zval_ptr_dtor(params[i]);
284+
}
285+
efree(params);
286+
}
281287
return 1;
282288
}
283289
zend_fcall_info_args_clear(fci, 0);

reference.c

+1-2
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,13 @@ static int php_git2_reference_foreach_cb(git_reference *reference, void *payload
1919
ZVAL_RESOURCE(param_reference, result->resource_id);
2020

2121
if (php_git2_call_function_v(p->fci, p->fcc TSRMLS_CC, &retval_ptr, 2, &param_reference, &p->payload)) {
22-
zval_ptr_dtor(&retval_ptr);
2322
zend_list_delete(result->resource_id);
2423
return GIT_EUSER;
2524
}
25+
2626
retval = Z_LVAL_P(retval_ptr);
2727
zval_ptr_dtor(&retval_ptr);
2828
zend_list_delete(result->resource_id);
29-
3029
return retval;
3130
}
3231

tree.c

-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ static int tree_walk_cb(const char *root, const git_tree_entry *entry, void *pay
2727
ZVAL_RESOURCE(param_rsrc, result->resource_id);
2828

2929
if (php_git2_call_function_v(p->fci, p->fcc TSRMLS_CC, &retval_ptr, 3, &param_root, &param_rsrc, &p->payload)) {
30-
zval_ptr_dtor(&retval_ptr);
3130
zend_list_delete(result->resource_id);
3231
return 0;
3332
}

treebuilder.c

+50-12
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,39 @@
22
#include "php_git2_priv.h"
33
#include "revwalk.h"
44

5+
static int php_git2_treebuilder_filter_cb(const git_tree_entry *entry, void *payload)
6+
{
7+
php_git2_t *result;
8+
zval *param_tree_entry, *retval_ptr = NULL;
9+
php_git2_cb_t *p = (php_git2_cb_t*)payload;
10+
int i = 0;
11+
long retval = 0;
12+
GIT2_TSRMLS_SET(p->tsrm_ls)
13+
14+
MAKE_STD_ZVAL(param_tree_entry);
15+
if (php_git2_make_resource(&result, PHP_GIT2_TYPE_TREE_ENTRY, entry, 0 TSRMLS_CC)) {
16+
return 0;
17+
}
18+
ZVAL_RESOURCE(param_tree_entry, GIT2_RVAL_P(result));
19+
zend_list_addref(GIT2_RVAL_P(result));
20+
Z_ADDREF_P(p->payload);
21+
22+
if (php_git2_call_function_v(p->fci, p->fcc TSRMLS_CC, &retval_ptr, 2, &param_tree_entry, &p->payload)) {
23+
zval_ptr_dtor(&param_tree_entry);
24+
zval_ptr_dtor(&p->payload);
25+
zend_list_delete(result->resource_id);
26+
retval = 0;
27+
return 0;
28+
}
29+
30+
retval = Z_LVAL_P(retval_ptr);
31+
zval_ptr_dtor(&retval_ptr);
32+
zend_list_delete(result->resource_id);
33+
34+
return retval;
35+
}
36+
37+
538
/* {{{ proto resource git_treebuilder_create([resource $source])
639
*/
740
PHP_FUNCTION(git_treebuilder_create)
@@ -179,26 +212,31 @@ PHP_FUNCTION(git_treebuilder_remove)
179212
RETURN_TRUE;
180213
}
181214

182-
/* {{{ proto void git_treebuilder_filter(bld, filter, payload)
183-
*/
215+
/* {{{ proto void git_treebuilder_filter(resource $bld, $filter, $payload)
216+
*/
184217
PHP_FUNCTION(git_treebuilder_filter)
185218
{
186-
zval *bld;
187-
php_git2_t *_bld;
188-
zval *filter;
189-
php_git2_t *_filter;
190-
zval *payload;
191-
192-
/* TODO(chobie): implement this */
193-
php_error_docref(NULL TSRMLS_CC, E_WARNING, "git_treebuilder_filter not implemented yet");
194-
return;
219+
zval *bld = NULL, *filter = NULL;
220+
php_git2_t *_bld = NULL;
221+
zend_fcall_info fci = empty_fcall_info;
222+
zend_fcall_info_cache fcc = empty_fcall_info_cache;
223+
php_git2_cb_t *cb;
224+
zval *payload = NULL;
195225

196226
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
197-
"rrz", &bld, &filter, &payload) == FAILURE) {
227+
"rfz", &bld, &fci, &fcc, &payload) == FAILURE) {
198228
return;
199229
}
230+
200231
ZEND_FETCH_RESOURCE(_bld, php_git2_t*, &bld, -1, PHP_GIT2_RESOURCE_NAME, git2_resource_handle);
232+
if (php_git2_cb_init(&cb, &fci, &fcc, payload TSRMLS_CC)) {
233+
RETURN_FALSE;
234+
}
235+
git_treebuilder_filter(PHP_GIT2_V(_bld, treebuilder), php_git2_treebuilder_filter_cb, cb);
236+
php_git2_cb_free(cb);
201237
}
238+
/* }}} */
239+
202240

203241
/* {{{ proto resource git_treebuilder_write(repo, bld)
204242
*/

treebuilder.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ ZEND_END_ARG_INFO()
6262
ZEND_BEGIN_ARG_INFO_EX(arginfo_git_treebuilder_filter, 0, 0, 3)
6363
ZEND_ARG_INFO(0, bld)
6464
ZEND_ARG_INFO(0, filter)
65-
ZEND_ARG_INFO(0, payload)
65+
ZEND_ARG_INFO(1, payload)
6666
ZEND_END_ARG_INFO()
6767

6868
ZEND_BEGIN_ARG_INFO_EX(arginfo_git_treebuilder_write, 0, 0, 2)

0 commit comments

Comments
 (0)