⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 merge.c

📁 subversion-1.4.3-1.tar.gz 配置svn的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
          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 + -