|
2 | 2 | #include "php_git2_priv.h"
|
3 | 3 | #include "revwalk.h"
|
4 | 4 |
|
| 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, ¶m_tree_entry, &p->payload)) { |
| 23 | + zval_ptr_dtor(¶m_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 | + |
5 | 38 | /* {{{ proto resource git_treebuilder_create([resource $source])
|
6 | 39 | */
|
7 | 40 | PHP_FUNCTION(git_treebuilder_create)
|
@@ -179,26 +212,31 @@ PHP_FUNCTION(git_treebuilder_remove)
|
179 | 212 | RETURN_TRUE;
|
180 | 213 | }
|
181 | 214 |
|
182 |
| -/* {{{ proto void git_treebuilder_filter(bld, filter, payload) |
183 |
| -*/ |
| 215 | +/* {{{ proto void git_treebuilder_filter(resource $bld, $filter, $payload) |
| 216 | + */ |
184 | 217 | PHP_FUNCTION(git_treebuilder_filter)
|
185 | 218 | {
|
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; |
195 | 225 |
|
196 | 226 | if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
|
197 |
| - "rrz", &bld, &filter, &payload) == FAILURE) { |
| 227 | + "rfz", &bld, &fci, &fcc, &payload) == FAILURE) { |
198 | 228 | return;
|
199 | 229 | }
|
| 230 | + |
200 | 231 | 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); |
201 | 237 | }
|
| 238 | +/* }}} */ |
| 239 | + |
202 | 240 |
|
203 | 241 | /* {{{ proto resource git_treebuilder_write(repo, bld)
|
204 | 242 | */
|
|
0 commit comments