📄 update.c
字号:
{ props = dir->removed_props; pool = dir->pool; info->prop_val = ""; info->prop_val_len = 1; } if (info->prop_encoding) { if (strcmp(info->prop_encoding, "base64") == 0) { svn_string_t encoded; const svn_string_t *decoded; encoded.data = info->prop_val; encoded.len = info->prop_val_len; decoded = svn_base64_decode_string(&encoded, parser->state->pool); info->prop_val = decoded->data; info->prop_val_len = decoded->len; } else { abort(); } } set_val = apr_pmemdup(pool, info->prop_val, info->prop_val_len); set_val_str = svn_string_ncreate(set_val, info->prop_val_len, pool); svn_ra_serf__set_ver_prop(props, info->base_name, info->base_rev, ns->namespace, ns->url, set_val_str, pool); svn_ra_serf__xml_pop_state(parser); } else if ((state == IGNORE_PROP_NAME || state == NEED_PROP_NAME)) { svn_ra_serf__xml_pop_state(parser); } return SVN_NO_ERROR;}static svn_error_t *cdata_report(svn_ra_serf__xml_parser_t *parser, void *userData, const char *data, apr_size_t len){ report_context_t *ctx = userData; if (parser->state->current_state == PROP) { report_info_t *info = parser->state->private; svn_ra_serf__expand_string(&info->prop_val, &info->prop_val_len, data, len, parser->state->pool); } return SVN_NO_ERROR;}/** Editor callbacks given to callers to create request body */static svn_error_t *set_path(void *report_baton, const char *path, svn_revnum_t revision, svn_boolean_t start_empty, const char *lock_token, apr_pool_t *pool){ report_context_t *report = report_baton; serf_bucket_t *tmp; svn_stringbuf_t *path_buf; tmp = SERF_BUCKET_SIMPLE_STRING_LEN("<S:entry rev=\"", sizeof("<S:entry rev=\"")-1, report->sess->bkt_alloc); serf_bucket_aggregate_append(report->buckets, tmp); tmp = SERF_BUCKET_SIMPLE_STRING(apr_ltoa(report->pool, revision), report->sess->bkt_alloc); serf_bucket_aggregate_append(report->buckets, tmp); tmp = SERF_BUCKET_SIMPLE_STRING_LEN("\"", sizeof("\"")-1, report->sess->bkt_alloc); serf_bucket_aggregate_append(report->buckets, tmp); if (lock_token) { const char *path_copy, *token_copy; path_copy = apr_pstrdup(report->pool, path); token_copy = apr_pstrdup(report->pool, lock_token); apr_hash_set(report->lock_path_tokens, path_copy, APR_HASH_KEY_STRING, token_copy); tmp = SERF_BUCKET_SIMPLE_STRING_LEN(" lock-token=\"", sizeof(" lock-token=\"")-1, report->sess->bkt_alloc); serf_bucket_aggregate_append(report->buckets, tmp); tmp = SERF_BUCKET_SIMPLE_STRING(lock_token, report->sess->bkt_alloc); serf_bucket_aggregate_append(report->buckets, tmp); tmp = SERF_BUCKET_SIMPLE_STRING_LEN("\"", sizeof("\"")-1, report->sess->bkt_alloc); serf_bucket_aggregate_append(report->buckets, tmp); } if (start_empty) { tmp = SERF_BUCKET_SIMPLE_STRING_LEN(" start-empty=\"true\"", sizeof(" start-empty=\"true\"")-1, report->sess->bkt_alloc); serf_bucket_aggregate_append(report->buckets, tmp); } tmp = SERF_BUCKET_SIMPLE_STRING_LEN(">", sizeof(">")-1, report->sess->bkt_alloc); serf_bucket_aggregate_append(report->buckets, tmp); path_buf = NULL; svn_xml_escape_cdata_cstring(&path_buf, path, report->pool); tmp = SERF_BUCKET_SIMPLE_STRING_LEN(path_buf->data, path_buf->len, report->sess->bkt_alloc); serf_bucket_aggregate_append(report->buckets, tmp); tmp = SERF_BUCKET_SIMPLE_STRING_LEN("</S:entry>", sizeof("</S:entry>")-1, report->sess->bkt_alloc); serf_bucket_aggregate_append(report->buckets, tmp); return APR_SUCCESS;}static svn_error_t *delete_path(void *report_baton, const char *path, apr_pool_t *pool){ report_context_t *report = report_baton; serf_bucket_t *tmp; const char *path_copy; tmp = SERF_BUCKET_SIMPLE_STRING_LEN("<S:missing>", sizeof("<S:missing>")-1, report->sess->bkt_alloc); serf_bucket_aggregate_append(report->buckets, tmp); path_copy = apr_pstrdup(report->pool, path); tmp = SERF_BUCKET_SIMPLE_STRING(path_copy, report->sess->bkt_alloc); serf_bucket_aggregate_append(report->buckets, tmp); tmp = SERF_BUCKET_SIMPLE_STRING_LEN("</S:missing>", sizeof("</S:missing>")-1, report->sess->bkt_alloc); serf_bucket_aggregate_append(report->buckets, tmp); return APR_SUCCESS;}static svn_error_t *link_path(void *report_baton, const char *path, const char *url, svn_revnum_t revision, svn_boolean_t start_empty, const char *lock_token, apr_pool_t *pool){ report_context_t *report = report_baton; serf_bucket_t *tmp; const char *path_copy, *link_copy, *vcc_url; apr_uri_t uri; tmp = SERF_BUCKET_SIMPLE_STRING_LEN("<S:entry rev=\"", sizeof("<S:entry rev=\"")-1, report->sess->bkt_alloc); serf_bucket_aggregate_append(report->buckets, tmp); tmp = SERF_BUCKET_SIMPLE_STRING(apr_ltoa(report->pool, revision), report->sess->bkt_alloc); serf_bucket_aggregate_append(report->buckets, tmp); tmp = SERF_BUCKET_SIMPLE_STRING_LEN("\"", sizeof("\"")-1, report->sess->bkt_alloc); serf_bucket_aggregate_append(report->buckets, tmp); if (lock_token) { const char *path_copy, *token_copy; path_copy = apr_pstrdup(report->pool, path); token_copy = apr_pstrdup(report->pool, lock_token); apr_hash_set(report->lock_path_tokens, path_copy, APR_HASH_KEY_STRING, token_copy); tmp = SERF_BUCKET_SIMPLE_STRING_LEN(" lock-token=\"", sizeof(" lock-token=\"")-1, report->sess->bkt_alloc); serf_bucket_aggregate_append(report->buckets, tmp); tmp = SERF_BUCKET_SIMPLE_STRING(lock_token, report->sess->bkt_alloc); serf_bucket_aggregate_append(report->buckets, tmp); tmp = SERF_BUCKET_SIMPLE_STRING_LEN("\"", sizeof("\"")-1, report->sess->bkt_alloc); serf_bucket_aggregate_append(report->buckets, tmp); } if (start_empty) { tmp = SERF_BUCKET_SIMPLE_STRING_LEN(" start-empty=\"true\"", sizeof(" start-empty=\"true\"")-1, report->sess->bkt_alloc); serf_bucket_aggregate_append(report->buckets, tmp); } tmp = SERF_BUCKET_SIMPLE_STRING_LEN(" linkpath=\"/", sizeof(" linkpath=\"/")-1, report->sess->bkt_alloc); serf_bucket_aggregate_append(report->buckets, tmp); /* We need to pass in the baseline relative path. * * TODO Confirm that it's on the same server? */ apr_uri_parse(pool, url, &uri); SVN_ERR(svn_ra_serf__discover_root(&vcc_url, &link_copy, report->sess, report->sess->conns[0], uri.path, pool)); link_copy = apr_pstrdup(report->pool, link_copy); tmp = SERF_BUCKET_SIMPLE_STRING(link_copy, report->sess->bkt_alloc); serf_bucket_aggregate_append(report->buckets, tmp); tmp = SERF_BUCKET_SIMPLE_STRING_LEN("\"", sizeof("\"")-1, report->sess->bkt_alloc); serf_bucket_aggregate_append(report->buckets, tmp); tmp = SERF_BUCKET_SIMPLE_STRING_LEN(">", sizeof(">")-1, report->sess->bkt_alloc); serf_bucket_aggregate_append(report->buckets, tmp); path_copy = apr_pstrdup(report->pool, path); tmp = SERF_BUCKET_SIMPLE_STRING(path_copy, report->sess->bkt_alloc); serf_bucket_aggregate_append(report->buckets, tmp); tmp = SERF_BUCKET_SIMPLE_STRING_LEN("</S:entry>", sizeof("</S:entry>")-1, report->sess->bkt_alloc); serf_bucket_aggregate_append(report->buckets, tmp); return APR_SUCCESS;}static svn_error_t *finish_report(void *report_baton, apr_pool_t *pool){ report_context_t *report = report_baton; svn_ra_serf__session_t *sess = report->sess; svn_ra_serf__handler_t *handler; svn_ra_serf__xml_parser_t *parser_ctx; svn_ra_serf__list_t *done_list; serf_bucket_t *tmp; const char *vcc_url; apr_hash_t *props; apr_status_t status; svn_boolean_t closed_root; int i; tmp = SERF_BUCKET_SIMPLE_STRING_LEN("</S:update-report>", sizeof("</S:update-report>")-1, report->sess->bkt_alloc); serf_bucket_aggregate_append(report->buckets, tmp); props = apr_hash_make(pool); SVN_ERR(svn_ra_serf__discover_root(&vcc_url, NULL, sess, sess->conns[0], sess->repos_url.path, pool)); if (!vcc_url) { abort(); } /* create and deliver request */ report->path = vcc_url; handler = apr_pcalloc(pool, sizeof(*handler)); handler->method = "REPORT"; handler->path = report->path; handler->body_buckets = report->buckets; handler->body_type = "text/xml"; handler->conn = sess->conns[0]; handler->session = sess; parser_ctx = apr_pcalloc(pool, sizeof(*parser_ctx)); parser_ctx->pool = pool; parser_ctx->user_data = report; parser_ctx->start = start_report; parser_ctx->end = end_report; parser_ctx->cdata = cdata_report; parser_ctx->done = &report->done; handler->response_handler = svn_ra_serf__handle_xml_parser; handler->response_baton = parser_ctx; svn_ra_serf__request_create(handler); for (i = 1; i < 4; i++) { sess->conns[i] = apr_palloc(pool, sizeof(*sess->conns[i])); sess->conns[i]->bkt_alloc = serf_bucket_allocator_create(sess->pool, NULL, NULL); sess->conns[i]->address = sess->conns[0]->address; sess->conns[i]->hostinfo = sess->conns[0]->hostinfo; sess->conns[i]->using_ssl = sess->conns[0]->using_ssl; sess->conns[i]->using_compression = sess->conns[0]->using_compression; sess->conns[i]->ssl_context = NULL; sess->conns[i]->auth_header = sess->auth_header; sess->conns[i]->auth_value = sess->auth_value; sess->conns[i]->conn = serf_connection_create(sess->context, sess->conns[i]->address, svn_ra_serf__conn_setup, sess->conns[i], svn_ra_serf__conn_closed, sess->conns[i], sess->pool); sess->num_conns++; } sess->cur_conn = 1; closed_root = FALSE; while (!report->done || report->active_fetches || report->active_propfinds) { status = serf_context_run(sess->context, SERF_DURATION_FOREVER, pool); if (APR_STATUS_IS_TIMEUP(status)) { continue; } if (status) { SVN_ERR(sess->pending_error); return svn_error_wrap_apr(status, _("Error retrieving REPORT (%d)"), status); } /* Switch our connection. */ if (!report->done) if (++sess->cur_conn == sess->num_conns) sess->cur_conn = 1; /* prune our propfind list if they are done. */ done_list = report->done_propfinds; while (done_list) { report->active_propfinds--; /* If we have some files that we won't be fetching the content * for, ensure that we update the file with any altered props. */ if (report->file_propchanges_only) { svn_ra_serf__list_t *cur, *prev; prev = NULL; cur = report->file_propchanges_only; while (cur) { report_info_t *item = cur->data; if (item->propfind == done_list->data) { break; } prev = cur; cur = cur->next; } /* If we found a match, set the new props and remove this * propchange from our list. */ if (cur) { SVN_ERR(handle_propchange_only(cur->data)); if (!prev) { report->file_propchanges_only = cur->next; } else { prev->next = cur->next; } } } done_list = done_list->next; } report->done_propfinds = NULL; /* prune our fetches list if they are done. */ done_list = report->done_fetches; while (done_list) { report_fetch_t *done_fetch = done_list->data; report_dir_t *cur_dir; if (done_fetch->err) { /* Uh-oh! */ return done_fetch->err; } /* decrease our parent's directory refcount. */ cur_dir = done_fetch->info->dir; cur_dir->ref_c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -