Skip to content

Commit c02db9d

Browse files
committed
[submodule] implement submodule functions
1 parent 516fe0a commit c02db9d

File tree

3 files changed

+73
-25
lines changed

3 files changed

+73
-25
lines changed

example/submodule.php

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
$repo = git_repository_open(".");
3+
$payload = array();
4+
5+
// NOTE(chobie): currently, information support only
6+
git_submodule_foreach($repo, function($sm, $name, &$payload){
7+
var_dump($sm); // resource submodule
8+
var_dump($name);
9+
}, $payload);

submodule.c

+62-22
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,44 @@
22
#include "php_git2_priv.h"
33
#include "submodule.h"
44

5+
static int php_git2_git_submodule_foreach_cb(git_submodule *sm, const char *name, void *payload)
6+
{
7+
php_git2_t *result, *submodule;
8+
zval *param_sm, *param_name, *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+
Z_ADDREF_P(p->payload);
15+
MAKE_STD_ZVAL(param_sm);
16+
MAKE_STD_ZVAL(param_name);
17+
if (php_git2_make_resource(&submodule, PHP_GIT2_TYPE_SUBMODULE, sm, 0 TSRMLS_CC)) {
18+
return GIT_EUSER;
19+
}
20+
ZVAL_RESOURCE(param_sm, GIT2_RVAL_P(submodule));
21+
22+
ZVAL_STRING(param_name, name, 1);
23+
if (php_git2_call_function_v(p->fci, p->fcc TSRMLS_CC, &retval_ptr, 3,
24+
&param_sm, &param_name, &p->payload)) {
25+
return GIT_EUSER;
26+
}
27+
28+
retval = Z_LVAL_P(retval_ptr);
29+
zval_ptr_dtor(&retval_ptr);
30+
return retval;
31+
32+
33+
}
34+
535
/* {{{ proto long git_submodule_lookup(resource $repo, string $name)
636
*/
737
PHP_FUNCTION(git_submodule_lookup)
838
{
939
int result = 0, name_len = 0, error = 0;
1040
git_submodule *submodule = NULL;
1141
zval *repo = NULL;
12-
php_git2_t *_repo = NULL;
42+
php_git2_t *_repo = NULL, *_result = NULL;
1343
char *name = NULL;
1444

1545
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
@@ -19,27 +49,35 @@ PHP_FUNCTION(git_submodule_lookup)
1949

2050
ZEND_FETCH_RESOURCE(_repo, php_git2_t*, &repo, -1, PHP_GIT2_RESOURCE_NAME, git2_resource_handle);
2151
result = git_submodule_lookup(&submodule, PHP_GIT2_V(_repo, repository), name);
22-
RETURN_LONG(result);
52+
if (php_git2_make_resource(&_result, PHP_GIT2_TYPE_SUBMODULE, submodule, 0 TSRMLS_CC)) {
53+
RETURN_FALSE;
54+
}
55+
ZVAL_RESOURCE(return_value, GIT2_RVAL_P(_result));
2356
}
2457
/* }}} */
2558

26-
/* {{{ proto long git_submodule_foreach(resource $repo, long $sm, string $name, $payload)
59+
/* {{{ proto long git_submodule_foreach(resource $repo, Callable $callback, $payload)
2760
*/
2861
PHP_FUNCTION(git_submodule_foreach)
2962
{
3063
int result = 0, name_len = 0, error = 0;
3164
zval *repo = NULL, *payload = NULL;
3265
php_git2_t *_repo = NULL;
33-
long sm = 0;
34-
char *name = NULL;
35-
66+
zend_fcall_info fci = empty_fcall_info;
67+
zend_fcall_info_cache fcc = empty_fcall_info_cache;
68+
php_git2_cb_t *cb = NULL;
69+
3670
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
37-
"rls<void><void>", &repo, &sm, &name, &name_len, &payload) == FAILURE) {
71+
"rfz", &repo, &fci, &fcc, &payload) == FAILURE) {
3872
return;
3973
}
4074

4175
ZEND_FETCH_RESOURCE(_repo, php_git2_t*, &repo, -1, PHP_GIT2_RESOURCE_NAME, git2_resource_handle);
42-
//result = git_submodule_foreach(PHP_GIT2_V(_repo, repository), sm, name, cb);
76+
if (php_git2_cb_init(&cb, &fci, &fcc, payload TSRMLS_CC)) {
77+
RETURN_FALSE;
78+
}
79+
result = git_submodule_foreach(PHP_GIT2_V(_repo, repository), php_git2_git_submodule_foreach_cb, cb);
80+
php_git2_cb_free(cb);
4381
RETURN_LONG(result);
4482
}
4583
/* }}} */
@@ -139,7 +177,7 @@ PHP_FUNCTION(git_submodule_owner)
139177

140178
ZEND_FETCH_RESOURCE(_submodule, php_git2_t*, &submodule, -1, PHP_GIT2_RESOURCE_NAME, git2_resource_handle);
141179
result = git_submodule_owner(PHP_GIT2_V(_submodule, submodule));
142-
if (php_git2_make_resource(&__result, PHP_GIT2_TYPE_SUBMODULE, result, 1 TSRMLS_CC)) {
180+
if (php_git2_make_resource(&__result, PHP_GIT2_TYPE_REPOSITORY, result, 0 TSRMLS_CC)) {
143181
RETURN_FALSE;
144182
}
145183
ZVAL_RESOURCE(return_value, GIT2_RVAL_P(__result));
@@ -223,7 +261,7 @@ PHP_FUNCTION(git_submodule_set_url)
223261
}
224262
/* }}} */
225263

226-
/* {{{ proto resource git_submodule_index_id(resource $submodule)
264+
/* {{{ proto string git_submodule_index_id(resource $submodule)
227265
*/
228266
PHP_FUNCTION(git_submodule_index_id)
229267
{
@@ -244,7 +282,7 @@ PHP_FUNCTION(git_submodule_index_id)
244282
}
245283
/* }}} */
246284

247-
/* {{{ proto resource git_submodule_head_id(resource $submodule)
285+
/* {{{ proto string git_submodule_head_id(resource $submodule)
248286
*/
249287
PHP_FUNCTION(git_submodule_head_id)
250288
{
@@ -265,7 +303,7 @@ PHP_FUNCTION(git_submodule_head_id)
265303
}
266304
/* }}} */
267305

268-
/* {{{ proto resource git_submodule_wd_id(resource $submodule)
306+
/* {{{ proto string git_submodule_wd_id(resource $submodule)
269307
*/
270308
PHP_FUNCTION(git_submodule_wd_id)
271309
{
@@ -286,7 +324,7 @@ PHP_FUNCTION(git_submodule_wd_id)
286324
}
287325
/* }}} */
288326

289-
/* {{{ proto resource git_submodule_ignore(resource $submodule)
327+
/* {{{ proto long git_submodule_ignore(resource $submodule)
290328
*/
291329
PHP_FUNCTION(git_submodule_ignore)
292330
{
@@ -301,26 +339,27 @@ PHP_FUNCTION(git_submodule_ignore)
301339

302340
ZEND_FETCH_RESOURCE(_submodule, php_git2_t*, &submodule, -1, PHP_GIT2_RESOURCE_NAME, git2_resource_handle);
303341
result = git_submodule_ignore(PHP_GIT2_V(_submodule, submodule));
304-
/* TODO(chobie): implement this */
342+
RETURN_LONG(result);
305343
}
306344
/* }}} */
307345

308-
/* {{{ proto resource git_submodule_set_ignore(resource $submodule, $ignore)
346+
/* {{{ proto long git_submodule_set_ignore(resource $submodule, $ignore)
309347
*/
310348
PHP_FUNCTION(git_submodule_set_ignore)
311349
{
312350
git_submodule_ignore_t *result = NULL;
313-
zval *submodule = NULL, *ignore = NULL;
351+
zval *submodule = NULL;
314352
php_git2_t *_submodule = NULL;
353+
long ignore = 0;
315354

316355
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
317-
"r<git_submodule_ignore_t>", &submodule, &ignore) == FAILURE) {
356+
"rl", &submodule, &ignore) == FAILURE) {
318357
return;
319358
}
320359

321360
ZEND_FETCH_RESOURCE(_submodule, php_git2_t*, &submodule, -1, PHP_GIT2_RESOURCE_NAME, git2_resource_handle);
322361
result = git_submodule_set_ignore(PHP_GIT2_V(_submodule, submodule), ignore);
323-
/* TODO(chobie): implement this */
362+
RETURN_LONG(result);
324363
}
325364
/* }}} */
326365

@@ -339,7 +378,7 @@ PHP_FUNCTION(git_submodule_update)
339378

340379
ZEND_FETCH_RESOURCE(_submodule, php_git2_t*, &submodule, -1, PHP_GIT2_RESOURCE_NAME, git2_resource_handle);
341380
result = git_submodule_update(PHP_GIT2_V(_submodule, submodule));
342-
/* TODO(chobie): implement this */
381+
RETURN_LONG(result);
343382
}
344383
/* }}} */
345384

@@ -348,17 +387,18 @@ PHP_FUNCTION(git_submodule_update)
348387
PHP_FUNCTION(git_submodule_set_update)
349388
{
350389
git_submodule_update_t *result = NULL;
351-
zval *submodule = NULL, *update = NULL;
390+
zval *submodule = NULL;
352391
php_git2_t *_submodule = NULL;
392+
long update = 0;
353393

354394
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
355-
"r<git_submodule_update_t>", &submodule, &update) == FAILURE) {
395+
"rl", &submodule, &update) == FAILURE) {
356396
return;
357397
}
358398

359399
ZEND_FETCH_RESOURCE(_submodule, php_git2_t*, &submodule, -1, PHP_GIT2_RESOURCE_NAME, git2_resource_handle);
360400
result = git_submodule_set_update(PHP_GIT2_V(_submodule, submodule), update);
361-
/* TODO(chobie): implement this */
401+
RETURN_LONG(result);
362402
}
363403
/* }}} */
364404

submodule.h

+2-3
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,9 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_git_submodule_lookup, 0, 0, 2)
3131
ZEND_ARG_INFO(0, name)
3232
ZEND_END_ARG_INFO()
3333

34-
ZEND_BEGIN_ARG_INFO_EX(arginfo_git_submodule_foreach, 0, 0, 5)
34+
ZEND_BEGIN_ARG_INFO_EX(arginfo_git_submodule_foreach, 0, 0, 3)
3535
ZEND_ARG_INFO(0, repo)
36-
ZEND_ARG_INFO(0, sm)
37-
ZEND_ARG_INFO(0, name)
36+
ZEND_ARG_INFO(0, callback)
3837
ZEND_ARG_INFO(1, payload)
3938
ZEND_END_ARG_INFO()
4039

0 commit comments

Comments
 (0)