|
2 | 2 | #include "php_git2_priv.h"
|
3 | 3 | #include "tag.h"
|
4 | 4 |
|
| 5 | +static int php_git2_tag_foreach_cb(const char *name, git_oid *oid, void *payload) |
| 6 | +{ |
| 7 | + php_git2_t *result; |
| 8 | + zval *param_name, *param_oid, *retval_ptr = NULL; |
| 9 | + php_git2_cb_t *p = (php_git2_cb_t*)payload; |
| 10 | + int i = 0; |
| 11 | + long retval = 0; |
| 12 | + char buffer[41] = {0}; |
| 13 | + GIT2_TSRMLS_SET(p->tsrm_ls) |
| 14 | + |
| 15 | + git_oid_fmt(buffer, oid); |
| 16 | + |
| 17 | + Z_ADDREF_P(p->payload); |
| 18 | + MAKE_STD_ZVAL(param_name); |
| 19 | + MAKE_STD_ZVAL(param_oid); |
| 20 | + ZVAL_STRING(param_name, name, 1); |
| 21 | + ZVAL_STRING(param_oid, buffer, 1); |
| 22 | + |
| 23 | + if (php_git2_call_function_v(p->fci, p->fcc TSRMLS_CC, &retval_ptr, 3, ¶m_name, ¶m_oid, &p->payload)) { |
| 24 | + zval_ptr_dtor(&retval_ptr); |
| 25 | + zend_list_delete(result->resource_id); |
| 26 | + return GIT_EUSER; |
| 27 | + } |
| 28 | + |
| 29 | + retval = Z_LVAL_P(retval_ptr); |
| 30 | + zval_ptr_dtor(&retval_ptr); |
| 31 | + zend_list_delete(result->resource_id); |
| 32 | + |
| 33 | + return retval; |
| 34 | +} |
| 35 | + |
| 36 | + |
5 | 37 | /* {{{ proto resource git_tag_lookup(resource $repo, string $id)
|
6 | 38 | */
|
7 | 39 | PHP_FUNCTION(git_tag_lookup)
|
@@ -482,26 +514,33 @@ PHP_FUNCTION(git_tag_list_match)
|
482 | 514 | /* }}} */
|
483 | 515 |
|
484 | 516 |
|
485 |
| -/* {{{ proto long git_tag_foreach(repo, callback, payload) |
486 |
| -*/ |
| 517 | +/* {{{ proto long git_tag_foreach(resource $repo, $callback, $payload) |
| 518 | + */ |
487 | 519 | PHP_FUNCTION(git_tag_foreach)
|
488 | 520 | {
|
489 |
| - zval *repo; |
490 |
| - php_git2_t *_repo; |
491 |
| - zval *callback; |
492 |
| - php_git2_t *_callback; |
493 |
| - zval *payload; |
494 |
| - |
495 |
| - /* TODO(chobie): implement this */ |
496 |
| - php_error_docref(NULL TSRMLS_CC, E_WARNING, "git_tag_foreach not implemented yet"); |
497 |
| - return; |
| 521 | + int result = 0, error = 0; |
| 522 | + zval *repo = NULL, *callback = NULL; |
| 523 | + php_git2_t *_repo = NULL; |
| 524 | + zend_fcall_info fci = empty_fcall_info; |
| 525 | + zend_fcall_info_cache fcc = empty_fcall_info_cache; |
| 526 | + php_git2_cb_t *cb; |
| 527 | + zval *payload = NULL; |
498 | 528 |
|
499 | 529 | if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
|
500 |
| - "rrz", &repo, &callback, &payload) == FAILURE) { |
| 530 | + "rfz", &repo, &fci, &fcc, &payload) == FAILURE) { |
501 | 531 | return;
|
502 | 532 | }
|
| 533 | + |
503 | 534 | ZEND_FETCH_RESOURCE(_repo, php_git2_t*, &repo, -1, PHP_GIT2_RESOURCE_NAME, git2_resource_handle);
|
| 535 | + if (php_git2_cb_init(&cb, &fci, &fcc, payload TSRMLS_CC)) { |
| 536 | + RETURN_FALSE; |
| 537 | + } |
| 538 | + result = git_tag_foreach(PHP_GIT2_V(_repo, repository), php_git2_tag_foreach_cb, cb); |
| 539 | + php_git2_cb_free(cb); |
| 540 | + RETURN_LONG(result); |
504 | 541 | }
|
| 542 | +/* }}} */ |
| 543 | + |
505 | 544 |
|
506 | 545 | /* {{{ proto resource git_tag_peel(resource $tag)
|
507 | 546 | */
|
|
0 commit comments