📄 merge.c
字号:
href = apr_hash_get(info->props, "href", APR_HASH_KEY_STRING); checked_in = apr_hash_get(info->props, "checked-in", APR_HASH_KEY_STRING); href_len = strlen(href); if (href_len == ctx->merge_url_len) href = ""; else if (href_len > ctx->merge_url_len) href += ctx->merge_url_len + 1; else abort(); checked_in_str.data = checked_in; checked_in_str.len = strlen(checked_in); /* We now need to dive all the way into the WC to update the * base VCC url. */ SVN_ERR(ctx->session->wc_callbacks->push_wc_prop( ctx->session->wc_callback_baton, href, SVN_RA_SERF__WC_CHECKED_IN_URL, &checked_in_str, info->pool)); } svn_ra_serf__xml_pop_state(parser); } else if (state == PROPSTAT && strcmp(name.name, "propstat") == 0) { svn_ra_serf__xml_pop_state(parser); } else if (state == PROP && strcmp(name.name, "prop") == 0) { svn_ra_serf__xml_pop_state(parser); } else if (state == RESOURCE_TYPE && strcmp(name.name, "resourcetype") == 0) { svn_ra_serf__xml_pop_state(parser); } else if (state == IGNORE_PROP_NAME || state == NEED_PROP_NAME) { svn_ra_serf__xml_pop_state(parser); } else if (state == PROP_VAL) { if (!info->prop_name) { info->prop_name = apr_pstrdup(info->pool, name.name); } info->prop_val = apr_pstrmemdup(info->pool, info->prop_val, info->prop_val_len); /* Set our property. */ apr_hash_set(info->props, info->prop_name, APR_HASH_KEY_STRING, info->prop_val); info->prop_ns = NULL; info->prop_name = NULL; info->prop_val = NULL; info->prop_val_len = 0; svn_ra_serf__xml_pop_state(parser); } return SVN_NO_ERROR;}static svn_error_t *cdata_merge(svn_ra_serf__xml_parser_t *parser, void *userData, const char *data, apr_size_t len){ svn_ra_serf__merge_context_t *ctx = userData; merge_state_e state; merge_info_t *info; state = parser->state->current_state; info = parser->state->private; if (state == PROP_VAL) { svn_ra_serf__expand_string(&info->prop_val, &info->prop_val_len, data, len, parser->state->pool); } return SVN_NO_ERROR;}static apr_status_tsetup_merge_headers(serf_bucket_t *headers, void *baton, apr_pool_t *pool){ svn_ra_serf__merge_context_t *ctx = baton; if (!ctx->keep_locks) { serf_bucket_headers_set(headers, SVN_DAV_OPTIONS_HEADER, SVN_DAV_OPTION_RELEASE_LOCKS); } return APR_SUCCESS;}#define LOCK_HEADER "<S:lock-token-list xmlns:S=\"" SVN_XML_NAMESPACE "\">"#define LOCK_TRAILER "</S:lock-token-list>"voidsvn_ra_serf__merge_lock_token_list(apr_hash_t *lock_tokens, const char *parent, serf_bucket_t *body, serf_bucket_alloc_t *alloc, apr_pool_t *pool){ apr_hash_index_t *hi; serf_bucket_t *tmp; if (!lock_tokens || apr_hash_count(lock_tokens) == 0) return; tmp = SERF_BUCKET_SIMPLE_STRING_LEN(LOCK_HEADER, sizeof(LOCK_HEADER) - 1, alloc); serf_bucket_aggregate_append(body, tmp); for (hi = apr_hash_first(pool, lock_tokens); hi; hi = apr_hash_next(hi)) { const void *key; apr_ssize_t klen; void *val; svn_string_t path; svn_stringbuf_t *xml_path = NULL; apr_hash_this(hi, &key, &klen, &val); path.data = key; path.len = klen; if (parent && !svn_path_is_ancestor(parent, key)) continue; svn_xml_escape_cdata_string(&xml_path, &path, pool); tmp = SERF_BUCKET_SIMPLE_STRING_LEN("<S:lock>", sizeof("<S:lock>") - 1, alloc); serf_bucket_aggregate_append(body, tmp); svn_ra_serf__add_tag_buckets(body, "lock-path", xml_path->data, alloc); svn_ra_serf__add_tag_buckets(body, "lock-token", val, alloc); tmp = SERF_BUCKET_SIMPLE_STRING_LEN("</S:lock>", sizeof("</S:lock>") - 1, alloc); serf_bucket_aggregate_append(body, tmp); } tmp = SERF_BUCKET_SIMPLE_STRING_LEN(LOCK_TRAILER, sizeof(LOCK_TRAILER) - 1, alloc); serf_bucket_aggregate_append(body, tmp);}#define MERGE_HEADER "<?xml version=\"1.0\" encoding=\"utf-8\"?><D:merge xmlns:D=\"DAV:\"><D:source><D:href>"#define MERGE_BODY "</D:href></D:source><D:no-auto-merge/><D:no-checkout/><D:prop><D:checked-in/><D:version-name/><D:resourcetype/><D:creationdate/><D:creator-displayname/></D:prop>"#define MERGE_TRAILER "</D:merge>"static serf_bucket_t*create_merge_body(void *baton, serf_bucket_alloc_t *alloc, apr_pool_t *pool){ svn_ra_serf__merge_context_t *ctx = baton; serf_bucket_t *body_bkt, *tmp_bkt; body_bkt = serf_bucket_aggregate_create(alloc); tmp_bkt = SERF_BUCKET_SIMPLE_STRING_LEN(MERGE_HEADER, sizeof(MERGE_HEADER) - 1, alloc); serf_bucket_aggregate_append(body_bkt, tmp_bkt); tmp_bkt = SERF_BUCKET_SIMPLE_STRING_LEN(ctx->activity_url, ctx->activity_url_len, alloc); serf_bucket_aggregate_append(body_bkt, tmp_bkt); tmp_bkt = SERF_BUCKET_SIMPLE_STRING_LEN(MERGE_BODY, sizeof(MERGE_BODY) - 1, alloc); serf_bucket_aggregate_append(body_bkt, tmp_bkt); svn_ra_serf__merge_lock_token_list(ctx->lock_tokens, NULL, body_bkt, alloc, pool); tmp_bkt = SERF_BUCKET_SIMPLE_STRING_LEN(MERGE_TRAILER, sizeof(MERGE_TRAILER) - 1, alloc); serf_bucket_aggregate_append(body_bkt, tmp_bkt); return body_bkt;}svn_error_t *svn_ra_serf__merge_create_req(svn_ra_serf__merge_context_t **ret_ctx, svn_ra_serf__session_t *session, svn_ra_serf__connection_t *conn, const char *path, const char *activity_url, apr_size_t activity_url_len, apr_hash_t *lock_tokens, svn_boolean_t keep_locks, apr_pool_t *pool){ svn_ra_serf__merge_context_t *merge_ctx; svn_ra_serf__handler_t *handler; svn_ra_serf__xml_parser_t *parser_ctx; merge_ctx = apr_pcalloc(pool, sizeof(*merge_ctx)); merge_ctx->pool = pool; merge_ctx->session = session; merge_ctx->activity_url = activity_url; merge_ctx->activity_url_len = activity_url_len; merge_ctx->lock_tokens = lock_tokens; merge_ctx->keep_locks = keep_locks; merge_ctx->commit_info = svn_create_commit_info(pool); merge_ctx->merge_url = session->repos_url.path; merge_ctx->merge_url_len = strlen(merge_ctx->merge_url); handler = apr_pcalloc(pool, sizeof(*handler)); handler->method = "MERGE"; handler->path = merge_ctx->merge_url; handler->body_delegate = create_merge_body; handler->body_delegate_baton = merge_ctx; handler->conn = conn; handler->session = session; parser_ctx = apr_pcalloc(pool, sizeof(*parser_ctx)); parser_ctx->pool = pool; parser_ctx->user_data = merge_ctx; parser_ctx->start = start_merge; parser_ctx->end = end_merge; parser_ctx->cdata = cdata_merge; parser_ctx->done = &merge_ctx->done; parser_ctx->status_code = &merge_ctx->status; handler->header_delegate = setup_merge_headers; handler->header_delegate_baton = merge_ctx; handler->response_handler = svn_ra_serf__handle_xml_parser; handler->response_baton = parser_ctx; svn_ra_serf__request_create(handler); *ret_ctx = merge_ctx; return SVN_NO_ERROR;}svn_boolean_t*svn_ra_serf__merge_get_done_ptr(svn_ra_serf__merge_context_t *ctx){ return &ctx->done;}svn_commit_info_t*svn_ra_serf__merge_get_commit_info(svn_ra_serf__merge_context_t *ctx){ return ctx->commit_info;}intsvn_ra_serf__merge_get_status(svn_ra_serf__merge_context_t *ctx){ return ctx->status;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -