From 9c974dc71bd7745d089506c0e48458572994ff9d Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Fri, 4 Sep 2015 13:28:10 +0000 Subject: [PATCH] added svn_update2() that supports depth updated svn_checkout() to support depth as well --- codepot/pecl-svn/php_svn.h | 8 ++ codepot/pecl-svn/svn.c | 167 +++++++++++++++++++++++++++++++++---- 2 files changed, 158 insertions(+), 17 deletions(-) diff --git a/codepot/pecl-svn/php_svn.h b/codepot/pecl-svn/php_svn.h index e881de08..248b3874 100755 --- a/codepot/pecl-svn/php_svn.h +++ b/codepot/pecl-svn/php_svn.h @@ -42,6 +42,11 @@ extern zend_module_entry svn_module_entry; #include "svn_client.h" +#if defined(SVN_DEPTH_INFINITY_OR_FILES) + /* version 1.5 at least */ +# define PHP_SVN_SUPPORT_DEPTH +#endif + PHP_MINIT_FUNCTION(svn); PHP_MSHUTDOWN_FUNCTION(svn); PHP_RINIT_FUNCTION(svn); @@ -67,6 +72,9 @@ PHP_FUNCTION(svn_commit); PHP_FUNCTION(svn_add); PHP_FUNCTION(svn_status); PHP_FUNCTION(svn_update); +#if defined(PHP_SVN_SUPPORT_DEPTH) +PHP_FUNCTION(svn_update2); +#endif PHP_FUNCTION(svn_import); PHP_FUNCTION(svn_info); PHP_FUNCTION(svn_export); diff --git a/codepot/pecl-svn/svn.c b/codepot/pecl-svn/svn.c index aef590b2..8da94b39 100755 --- a/codepot/pecl-svn/svn.c +++ b/codepot/pecl-svn/svn.c @@ -128,10 +128,50 @@ static ZEND_RSRC_DTOR_FUNC(php_svn_repos_fs_txn_dtor) #define SVN_STATIC_ME(name) ZEND_FENTRY(name, ZEND_FN(svn_ ## name), NULL, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC) /** Fixme = this list needs padding out... */ static zend_function_entry svn_methods[] = { - SVN_STATIC_ME(cat) SVN_STATIC_ME(checkout) + SVN_STATIC_ME(cat) + SVN_STATIC_ME(ls) SVN_STATIC_ME(log) + SVN_STATIC_ME(auth_set_parameter) + SVN_STATIC_ME(auth_get_parameter) + SVN_STATIC_ME(client_version) + SVN_STATIC_ME(config_ensure) + SVN_STATIC_ME(diff) + SVN_STATIC_ME(cleanup) + SVN_STATIC_ME(revert) + SVN_STATIC_ME(resolved) + SVN_STATIC_ME(commit) + SVN_STATIC_ME(lock) + SVN_STATIC_ME(unlock) + SVN_STATIC_ME(add) SVN_STATIC_ME(status) + SVN_STATIC_ME(update) +#if defined(PHP_SVN_SUPPORT_DEPTH) + SVN_STATIC_ME(update2) +#endif + SVN_STATIC_ME(import) + SVN_STATIC_ME(info) + SVN_STATIC_ME(export) + SVN_STATIC_ME(copy) + SVN_STATIC_ME(switch) + SVN_STATIC_ME(blame) + SVN_STATIC_ME(delete) + SVN_STATIC_ME(mkdir) + SVN_STATIC_ME(move) + SVN_STATIC_ME(proplist) + SVN_STATIC_ME(propget) + SVN_STATIC_ME(propset) + SVN_STATIC_ME(prop_delete) + SVN_STATIC_ME(revprop_get) + SVN_STATIC_ME(revprop_set) + SVN_STATIC_ME(revprop_delete) + SVN_STATIC_ME(repos_create) + SVN_STATIC_ME(repos_recover) + SVN_STATIC_ME(repos_hotcopy) + SVN_STATIC_ME(repos_open) + SVN_STATIC_ME(repos_fs) + SVN_STATIC_ME(repos_fs_begin_txn_for_commit) + SVN_STATIC_ME(repos_fs_commit_txn) {NULL, NULL, NULL} }; @@ -139,12 +179,12 @@ static zend_function_entry svn_methods[] = { /* {{{ svn_functions[] */ zend_function_entry svn_functions[] = { - PHP_FE(svn_checkout, NULL) - PHP_FE(svn_cat, NULL) - PHP_FE(svn_ls, NULL) - PHP_FE(svn_log, NULL) - PHP_FE(svn_auth_set_parameter, NULL) - PHP_FE(svn_auth_get_parameter, NULL) + PHP_FE(svn_checkout, NULL) + PHP_FE(svn_cat, NULL) + PHP_FE(svn_ls, NULL) + PHP_FE(svn_log, NULL) + PHP_FE(svn_auth_set_parameter, NULL) + PHP_FE(svn_auth_get_parameter, NULL) PHP_FE(svn_client_version, NULL) PHP_FE(svn_config_ensure, NULL) PHP_FE(svn_diff, NULL) @@ -157,6 +197,9 @@ zend_function_entry svn_functions[] = { PHP_FE(svn_add, NULL) PHP_FE(svn_status, NULL) PHP_FE(svn_update, NULL) +#if defined(PHP_SVN_SUPPORT_DEPTH) + PHP_FE(svn_update2, NULL) +#endif PHP_FE(svn_import, NULL) PHP_FE(svn_info, NULL) PHP_FE(svn_export, NULL) @@ -554,15 +597,14 @@ PHP_MINIT_FUNCTION(svn) INIT_CLASS_ENTRY(ce, "Svn", svn_methods); ce_Svn = zend_register_internal_class(&ce TSRMLS_CC); - INIT_CLASS_ENTRY(ce, "SvnWc", NULL); - ce_SvnWc = zend_register_internal_class(&ce TSRMLS_CC); + ce_SvnWc = zend_register_internal_class(&ce TSRMLS_CC); INIT_CLASS_ENTRY(ce, "SvnWcSchedule", NULL); - ce_SvnWcSchedule = zend_register_internal_class(&ce TSRMLS_CC); + ce_SvnWcSchedule = zend_register_internal_class(&ce TSRMLS_CC); INIT_CLASS_ENTRY(ce, "SvnNode", NULL); - ce_SvnNode = zend_register_internal_class(&ce TSRMLS_CC); + ce_SvnNode = zend_register_internal_class(&ce TSRMLS_CC); #define CLASS_CONST_LONG(class_name, const_name, value) \ @@ -585,6 +627,14 @@ PHP_MINIT_FUNCTION(svn) CLASS_CONST_LONG(Svn, "PREV", SVN_REVISION_PREV); CLASS_CONST_LONG(Svn, "UNSPECIFIED", SVN_REVISION_UNSPECIFIED); +#if defined(PHP_SVN_SUPPORT_DEPTH) + CLASS_CONST_LONG(Svn, "DEPTH_UNKNOWN", svn_depth_unknown); + CLASS_CONST_LONG(Svn, "DEPTH_EXCLUDE", svn_depth_exclude); + CLASS_CONST_LONG(Svn, "DEPTH_EMPTY", svn_depth_empty); + CLASS_CONST_LONG(Svn, "DEPTH_FILES", svn_depth_files); + CLASS_CONST_LONG(Svn, "DEPTH_IMMEDIATES", svn_depth_immediates); + CLASS_CONST_LONG(Svn, "DEPTH_INFINITY", svn_depth_infinity); +#endif CLASS_CONST_LONG(SvnWc, "NONE", svn_wc_status_none); CLASS_CONST_LONG(SvnWc, "UNVERSIONED", svn_wc_status_unversioned); @@ -611,7 +661,6 @@ PHP_MINIT_FUNCTION(svn) CLASS_CONST_LONG(SvnNode, "DIR", svn_node_dir); CLASS_CONST_LONG(SvnNode, "UNKNOWN", svn_node_unknown); - REGISTER_STRING_CONSTANT("SVN_AUTH_PARAM_DEFAULT_USERNAME", SVN_AUTH_PARAM_DEFAULT_USERNAME, CONST_CS|CONST_PERSISTENT); REGISTER_STRING_CONSTANT("SVN_AUTH_PARAM_DEFAULT_PASSWORD", SVN_AUTH_PARAM_DEFAULT_PASSWORD, CONST_CS|CONST_PERSISTENT); REGISTER_STRING_CONSTANT("SVN_AUTH_PARAM_NON_INTERACTIVE", SVN_AUTH_PARAM_NON_INTERACTIVE, CONST_CS|CONST_PERSISTENT); @@ -647,6 +696,15 @@ PHP_MINIT_FUNCTION(svn) REGISTER_LONG_CONSTANT("SVN_NO_IGNORE", SVN_NO_IGNORE, CONST_CS|CONST_PERSISTENT); /* --no-ignore */ REGISTER_LONG_CONSTANT("SVN_IGNORE_EXTERNALS", SVN_IGNORE_EXTERNALS, CONST_CS|CONST_PERSISTENT); /* --ignore-externals */ +#if defined(PHP_SVN_SUPPORT_DEPTH) + REGISTER_LONG_CONSTANT("SVN_DEPTH_UNKNOWN", svn_depth_unknown, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("SVN_DEPTH_EXCLUDE", svn_depth_exclude, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("SVN_DEPTH_EMPTY", svn_depth_empty, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("SVN_DEPTH_FILES", svn_depth_files, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("SVN_DEPTH_IMMEDIATES", svn_depth_immediates, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("SVN_DEPTH_INFINITY", svn_depth_infinity, CONST_CS|CONST_PERSISTENT); +#endif + REGISTER_LONG_CONSTANT("SVN_WC_STATUS_NONE", svn_wc_status_none, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SVN_WC_STATUS_UNVERSIONED", svn_wc_status_unversioned, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SVN_WC_STATUS_NORMAL", svn_wc_status_normal, CONST_CS|CONST_PERSISTENT); @@ -667,7 +725,6 @@ PHP_MINIT_FUNCTION(svn) REGISTER_LONG_CONSTANT("SVN_NODE_DIR", svn_node_dir, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SVN_NODE_UNKNOWN", svn_node_unknown, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("SVN_WC_SCHEDULE_NORMAL", svn_wc_schedule_normal, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SVN_WC_SCHEDULE_ADD", svn_wc_schedule_add, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SVN_WC_SCHEDULE_DELETE", svn_wc_schedule_delete, CONST_CS|CONST_PERSISTENT); @@ -720,7 +777,7 @@ PHP_MINFO_FUNCTION(svn) } /* }}} */ -/* {{{ proto bool svn_checkout(string repository_url, string target_path [, int revision = SVN_REVISION_HEAD [, int flags]]) +/* {{{ proto bool svn_checkout(string repository_url, string target_path [, int revision = SVN_REVISION_HEAD [, int flags [, int depth]]]) Checks out a particular revision from a repository into target_path. */ PHP_FUNCTION(svn_checkout) { @@ -730,14 +787,14 @@ PHP_FUNCTION(svn_checkout) int repos_url_len, target_path_len; svn_error_t *err; svn_opt_revision_t revision = { 0 }, peg_revision = { 0 }; - long flags = 0; + long flags = 0, depth = svn_depth_infinity; apr_pool_t *subpool; const char *true_path; revision.value.number = svn_opt_revision_unspecified; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|ll", - &repos_url, &repos_url_len, &target_path, &target_path_len, &revision.value.number, &flags) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|lll", + &repos_url, &repos_url_len, &target_path, &target_path_len, &revision.value.number, &flags, &depth) == FAILURE) { return; } @@ -772,6 +829,18 @@ PHP_FUNCTION(svn_checkout) goto cleanup; } +#if defined(PHP_SVN_SUPPORT_DEPTH) + err = svn_client_checkout3 (NULL, + true_path, + can_target_path, + &peg_revision, + &revision, + depth, + !(flags & SVN_NON_RECURSIVE), + flags & SVN_IGNORE_EXTERNALS, + SVN_G(ctx), + subpool); +#else err = svn_client_checkout2 (NULL, true_path, can_target_path, @@ -781,6 +850,7 @@ PHP_FUNCTION(svn_checkout) flags & SVN_IGNORE_EXTERNALS, SVN_G(ctx), subpool); +#endif if (err) { php_svn_handle_error (err TSRMLS_CC); @@ -3749,6 +3819,69 @@ cleanup: } /* }}} */ +#if defined(PHP_SVN_SUPPORT_DEPTH) + +/* {{{ proto int svn_update2(string path [, int revno [, int flags [, int depth]]]) + Updates a working copy at path to revno */ +PHP_FUNCTION(svn_update2) +{ + const char *path = NULL; + const char *utf8_path = NULL; + int pathlen; + zend_bool recurse = 1; + apr_pool_t *subpool; + svn_error_t *err; + svn_revnum_t result_rev; + svn_opt_revision_t rev; + long revno = -1; + long flags = 0; + long depth = svn_depth_infinity; + + if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|lll", + &path, &pathlen, &revno, &flags, &depth)) { + return; + } + + PHP_SVN_INIT_CLIENT(); + subpool = svn_pool_create(SVN_G(pool)); + if (!subpool) { + RETURN_FALSE; + } + + err = svn_utf_cstring_to_utf8 (&utf8_path, path, subpool); + if (err) + { + php_svn_handle_error(err TSRMLS_CC); + RETVAL_FALSE; + goto cleanup; + } + + path = svn_path_canonicalize(utf8_path, subpool); + + rev.value.number = revno; + rev.kind = php_svn_get_revision_kind (rev); + + err = svn_client_update3(&result_rev, path, &rev, + depth, + FALSE, /* depth_is_sticky */ + flags & SVN_IGNORE_EXTERNALS, /* ignore_externals */ + FALSE, /* allow_unver_obstructions */ + SVN_G(ctx), subpool); + + if (err) { + php_svn_handle_error(err TSRMLS_CC); + RETVAL_FALSE; + } else { + RETVAL_LONG(result_rev); + } + +cleanup: + svn_pool_destroy(subpool); + +} +/* }}} */ + +#endif static void php_svn_get_version(char *buf, int buflen) {