[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/libgit2/php-git/develop/packbuilder.c [Back]  [Original]

#include "php_git2.h"
#include "php_git2_priv.h"
#include "packbuilder.h"

static int php_git2_git_packbuilder_progress(
	int stage,
	unsigned int current,
	unsigned int total,
	void *payload)
{
	zval *param_stage = NULL, *param_current = NULL, *param_total = NULL, *retval_ptr = NULL;
	php_git2_cb_t *p = (php_git2_cb_t*)payload;
	long retval = 0;
	GIT2_TSRMLS_SET(p->tsrm_ls)

	Z_ADDREF_P(p->payload);
	MAKE_STD_ZVAL(param_stage);
	MAKE_STD_ZVAL(param_current);
	MAKE_STD_ZVAL(param_total);
	ZVAL_LONG(param_stage, stage);
	ZVAL_LONG(param_current, current);
	ZVAL_LONG(param_total, total);

	if (php_git2_call_function_v(p->fci, p->fcc TSRMLS_CC, &retval_ptr, 4,
		¶m_stage, ¶m_current, ¶m_total, &p->payload)) {
		return GIT_EUSER;
	}

	if (retval_ptr) {
		retval = Z_LVAL_P(retval_ptr);
		zval_ptr_dtor(&retval_ptr);
	}
	return retval;
}

static int php_git2_git_packbuilder_foreach_cb(void *buf, size_t size, void *payload)
{
	zval *param_buf= NULL, *param_size = NULL, *retval_ptr = NULL;
	php_git2_cb_t *p = (php_git2_cb_t*)payload;
	long retval = 0;
	GIT2_TSRMLS_SET(p->tsrm_ls)

	Z_ADDREF_P(p->payload);
	MAKE_STD_ZVAL(param_buf);
	MAKE_STD_ZVAL(param_size);
	ZVAL_STRINGL(param_buf, buf, size, 1);
	ZVAL_LONG(param_size, size);

	if (php_git2_call_function_v(p->fci, p->fcc TSRMLS_CC, &retval_ptr, 3,
		¶m_buf, ¶m_size, &p->payload)) {
		return GIT_EUSER;
	}

	if (retval_ptr) {
		retval = Z_LVAL_P(retval_ptr);
		zval_ptr_dtor(&retval_ptr);
	}
	return retval;
}


static int php_git2_git_transfer_progress_callback(const git_transfer_progress *stats, void *payload)
{
	zval *param_stats = NULL, *retval_ptr = NULL;
	php_git2_cb_t *p = (php_git2_cb_t*)payload;
	long retval = 0;
	GIT2_TSRMLS_SET(p->tsrm_ls)

	Z_ADDREF_P(p->payload);
	php_git2_git_transfer_progress_to_array(stats, ¶m_stats TSRMLS_CC);


	if (php_git2_call_function_v(p->fci, p->fcc TSRMLS_CC, &retval_ptr, 2,
		¶m_stats, &p->payload)) {
		return GIT_EUSER;
	}

	if (retval_ptr) {
		retval = Z_LVAL_P(retval_ptr);
		zval_ptr_dtor(&retval_ptr);
	}
	return retval;
}

/* {{{ proto resource git_packbuilder_new(resource $repo)
 */
PHP_FUNCTION(git_packbuilder_new)
{
	php_git2_t *result = NULL, *_repo = NULL;
	git_packbuilder *out = NULL;
	zval *repo = NULL;
	int error = 0;
	
	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
		"r", &repo) == FAILURE) {
		return;
	}
	
	ZEND_FETCH_RESOURCE(_repo, php_git2_t*, &repo, -1, PHP_GIT2_RESOURCE_NAME, git2_resource_handle);
	error = git_packbuilder_new(&out, PHP_GIT2_V(_repo, repository));
	if (php_git2_check_error(error, "git_packbuilder_new" TSRMLS_CC)) {
		RETURN_FALSE;
	}
	if (php_git2_make_resource(&result, PHP_GIT2_TYPE_PACKBUILDER, out, 1 TSRMLS_CC)) {
		RETURN_FALSE;
	}
	ZVAL_RESOURCE(return_value, GIT2_RVAL_P(result));
}
/* }}} */

/* {{{ proto long git_packbuilder_set_threads(resource $pb, long $n)
 */
PHP_FUNCTION(git_packbuilder_set_threads)
{
	unsigned int result = 0;
	zval *pb = NULL;
	php_git2_t *_pb = NULL;
	long n = 0;
	
	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
		"rl", &pb, &n) == FAILURE) {
		return;
	}
	
	ZEND_FETCH_RESOURCE(_pb, php_git2_t*, &pb, -1, PHP_GIT2_RESOURCE_NAME, git2_resource_handle);
	result = git_packbuilder_set_threads(PHP_GIT2_V(_pb, packbuilder), n);
	RETURN_LONG(result);
}
/* }}} */

/* {{{ proto long git_packbuilder_insert(resource $pb, string $id, string $name)
 */
PHP_FUNCTION(git_packbuilder_insert)
{
	int result = 0, id_len = 0, name_len = 0;
	zval *pb = NULL;
	php_git2_t *_pb = NULL;
	char *id = NULL, *name = NULL;
	git_oid __id = {0};
	
	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
		"rss", &pb, &id, &id_len, &name, &name_len) == FAILURE) {
		return;
	}
	
	ZEND_FETCH_RESOURCE(_pb, php_git2_t*, &pb, -1, PHP_GIT2_RESOURCE_NAME, git2_resource_handle);
	if (git_oid_fromstrn(&__id, id, id_len)) {
		RETURN_FALSE;
	}
	result = git_packbuilder_insert(PHP_GIT2_V(_pb, packbuilder), &__id, name);
	RETURN_LONG(result);
}
/* }}} */

/* {{{ proto long git_packbuilder_insert_tree(resource $pb, string $id)
 */
PHP_FUNCTION(git_packbuilder_insert_tree)
{
	int result = 0, id_len = 0;
	zval *pb = NULL;
	php_git2_t *_pb = NULL;
	char *id = NULL;
	git_oid __id = {0};
	
	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
		"rs", &pb, &id, &id_len) == FAILURE) {
		return;
	}
	
	ZEND_FETCH_RESOURCE(_pb, php_git2_t*, &pb, -1, PHP_GIT2_RESOURCE_NAME, git2_resource_handle);
	if (git_oid_fromstrn(&__id, id, id_len)) {
		RETURN_FALSE;
	}
	result = git_packbuilder_insert_tree(PHP_GIT2_V(_pb, packbuilder), &__id);
	RETURN_LONG(result);
}
/* }}} */

/* {{{ proto long git_packbuilder_insert_commit(resource $pb, string $id)
 */
PHP_FUNCTION(git_packbuilder_insert_commit)
{
	int result = 0, id_len = 0;
	zval *pb = NULL;
	php_git2_t *_pb = NULL;
	char *id = NULL;
	git_oid __id = {0};
	
	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
		"rs", &pb, &id, &id_len) == FAILURE) {
		return;
	}
	
	ZEND_FETCH_RESOURCE(_pb, php_git2_t*, &pb, -1, PHP_GIT2_RESOURCE_NAME, git2_resource_handle);
	if (git_oid_fromstrn(&__id, id, id_len)) {
		RETURN_FALSE;
	}
	result = git_packbuilder_insert_commit(PHP_GIT2_V(_pb, packbuilder), &__id);
	RETURN_LONG(result);
}
/* }}} */

/* {{{ proto long git_packbuilder_write(resource $pb, string $path, long $mode,  $progress_cb,  $progress_cb_payload)
 */
PHP_FUNCTION(git_packbuilder_write)
{
	int result = 0, path_len = 0;
	zval *pb = NULL, *progress_cb_payload = NULL;
	php_git2_t *_pb = NULL;
	char *path = NULL;
	long mode = 0;
	zend_fcall_info fci = empty_fcall_info;
	zend_fcall_info_cache fcc = empty_fcall_info_cache;
	php_git2_cb_t *cb = NULL;
	
	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
		"rslfz", &pb, &path, &path_len, &mode, &fci, &fcc, &progress_cb_payload) == FAILURE) {
		return;
	}
	
	ZEND_FETCH_RESOURCE(_pb, php_git2_t*, &pb, -1, PHP_GIT2_RESOURCE_NAME, git2_resource_handle);
	if (php_git2_cb_init(&cb, &fci, &fcc, progress_cb_payload TSRMLS_CC)) {
		RETURN_FALSE;
	}
	result = git_packbuilder_write(PHP_GIT2_V(_pb, packbuilder), path, mode, php_git2_git_transfer_progress_callback, cb);
	php_git2_cb_free(cb);
	RETURN_LONG(result);
}
/* }}} */

/* {{{ proto resource git_packbuilder_hash(resource $pb)
 */
PHP_FUNCTION(git_packbuilder_hash)
{
	const git_oid  *result = NULL;
	zval *pb = NULL;
	php_git2_t *_pb = NULL;
	char __result[GIT2_OID_HEXSIZE] = {0};
	
	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
		"r", &pb) == FAILURE) {
		return;
	}
	
	ZEND_FETCH_RESOURCE(_pb, php_git2_t*, &pb, -1, PHP_GIT2_RESOURCE_NAME, git2_resource_handle);
	result = git_packbuilder_hash(PHP_GIT2_V(_pb, packbuilder));
	git_oid_fmt(__result, result);
	RETURN_STRING(__result, 1);
}
/* }}} */


/* {{{ proto long git_packbuilder_foreach(resource $pb, Callable $cb,  $payload)
 */
PHP_FUNCTION(git_packbuilder_foreach)
{
	int result = 0;
	zval *pb = NULL, *payload = NULL;
	php_git2_t *_pb = NULL;
	zend_fcall_info fci = empty_fcall_info;
	zend_fcall_info_cache fcc = empty_fcall_info_cache;
	php_git2_cb_t *cb = NULL;
	
	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
		"rfz", &pb, &fci, &fcc, &payload) == FAILURE) {
		return;
	}
	
	ZEND_FETCH_RESOURCE(_pb, php_git2_t*, &pb, -1, PHP_GIT2_RESOURCE_NAME, git2_resource_handle);
	if (php_git2_cb_init(&cb, &fci, &fcc, payload TSRMLS_CC)) {
		RETURN_FALSE;
	}
	result = git_packbuilder_foreach(PHP_GIT2_V(_pb, packbuilder), php_git2_git_packbuilder_foreach_cb, cb);
	php_git2_cb_free(cb);
	RETURN_LONG(result);
}
/* }}} */

/* {{{ proto long git_packbuilder_object_count(resource $pb)
 */
PHP_FUNCTION(git_packbuilder_object_count)
{
	uint32_t result = 0;
	zval *pb = NULL;
	php_git2_t *_pb = NULL;
	
	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
		"r", &pb) == FAILURE) {
		return;
	}
	
	ZEND_FETCH_RESOURCE(_pb, php_git2_t*, &pb, -1, PHP_GIT2_RESOURCE_NAME, git2_resource_handle);
	result = git_packbuilder_object_count(PHP_GIT2_V(_pb, packbuilder));
	RETURN_LONG(result);
}
/* }}} */

/* {{{ proto long git_packbuilder_written(resource $pb)
 */
PHP_FUNCTION(git_packbuilder_written)
{
	uint32_t result = 0;
	zval *pb = NULL;
	php_git2_t *_pb = NULL;
	
	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
		"r", &pb) == FAILURE) {
		return;
	}
	
	ZEND_FETCH_RESOURCE(_pb, php_git2_t*, &pb, -1, PHP_GIT2_RESOURCE_NAME, git2_resource_handle);
	result = git_packbuilder_written(PHP_GIT2_V(_pb, packbuilder));
	RETURN_LONG(result);
}
/* }}} */

/* {{{ proto long git_packbuilder_set_callbacks(resource $pb,  $progress_cb,  $progress_cb_payload)
 */
PHP_FUNCTION(git_packbuilder_set_callbacks)
{
	int result = 0;
	zval *pb = NULL, *progress_cb_payload = NULL;
	php_git2_t *_pb = NULL;
	zend_fcall_info fci = empty_fcall_info, *_fci;
	zend_fcall_info_cache fcc = empty_fcall_info_cache, *_fcc;
	php_git2_cb_t *cb = NULL;
	
	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
		"rfz", &pb, &fci, &fcc, &progress_cb_payload) == FAILURE) {
		return;
	}
	
	ZEND_FETCH_RESOURCE(_pb, php_git2_t*, &pb, -1, PHP_GIT2_RESOURCE_NAME, git2_resource_handle);
	_fci = emalloc(sizeof(zend_fcall_info));
	_fcc = emalloc(sizeof(zend_fcall_info_cache));
	memcpy(_fci, &fci, sizeof(zend_fcall_info));
	memcpy(_fcc, &fcc, sizeof(zend_fcall_info_cache));

	/* TODO(chobie): free memory when the resource removed */
	if (php_git2_cb_init(&cb, &_fci, &_fcc, progress_cb_payload TSRMLS_CC)) {
		RETURN_FALSE;
	}
	result = git_packbuilder_set_callbacks(PHP_GIT2_V(_pb, packbuilder), php_git2_git_packbuilder_progress, cb);
	RETURN_LONG(result);
}
/* }}} */

/* {{{ proto void git_packbuilder_free(resource $pb)
 */
PHP_FUNCTION(git_packbuilder_free)
{
	zval *pb = NULL;
	php_git2_t *_pb = NULL;
	
	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
		"r", &pb) == FAILURE) {
		return;
	}
	
	ZEND_FETCH_RESOURCE(_pb, php_git2_t*, &pb, -1, PHP_GIT2_RESOURCE_NAME, git2_resource_handle);
	if (GIT2_SHOULD_FREE(_pb)) {
		git_packbuilder_free(PHP_GIT2_V(_pb, packbuilder));
		GIT2_SHOULD_FREE(_pb) = 0;
	};
	zval_ptr_dtor(&pb);
}
/* }}} */


Web Proxy Viewer  |  New URL  |  Original Page