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

📄 replay.c

📁 subversion-1.4.3-1.tar.gz 配置svn的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
                                     parser->state->pool, &info->baton));    }  else if ((state == OPEN_DIR || state == ADD_DIR) &&           strcmp(name.name, "add-file") == 0)    {      const char *file_name, *copyfrom, *copyrev;      svn_revnum_t rev;      replay_info_t *info;      file_name = svn_ra_serf__find_attr(attrs, "name");      if (!file_name)        {          return svn_error_create(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,                    _("Missing name attr in add-file element"));        }      copyfrom = svn_ra_serf__find_attr(attrs, "copyfrom-path");      copyrev = svn_ra_serf__find_attr(attrs, "copyfrom-rev");      info = push_state(parser, ctx, ADD_FILE);      if (copyrev)        rev = SVN_STR_TO_REV(copyrev);      else        rev = SVN_INVALID_REVNUM;      SVN_ERR(ctx->editor->add_file(file_name, info->parent->baton,                                    copyfrom, rev,                                    parser->state->pool, &info->baton));    }  else if ((state == OPEN_FILE || state == ADD_FILE) &&           strcmp(name.name, "apply-textdelta") == 0)    {      const char *checksum;      replay_info_t *info;      svn_txdelta_window_handler_t textdelta;      void *textdelta_baton;      svn_stream_t *delta_stream;      info = push_state(parser, ctx, APPLY_TEXTDELTA);      checksum = svn_ra_serf__find_attr(attrs, "checksum");      if (checksum)        {          checksum = apr_pstrdup(info->pool, checksum);        }      SVN_ERR(ctx->editor->apply_textdelta(info->baton, checksum,                                           info->pool,                                           &textdelta,                                           &textdelta_baton));      delta_stream = svn_txdelta_parse_svndiff(textdelta, textdelta_baton,                                               TRUE, info->pool);      info->stream = svn_base64_decode(delta_stream, info->pool);    }  else if ((state == OPEN_FILE || state == ADD_FILE) &&           strcmp(name.name, "close-file") == 0)    {      replay_info_t *info = parser->state->private;      const char *checksum;      checksum = svn_ra_serf__find_attr(attrs, "checksum");      SVN_ERR(ctx->editor->close_file(info->baton, checksum,                                       parser->state->pool));      svn_ra_serf__xml_pop_state(parser);    }  else if (((state == OPEN_FILE || state == ADD_FILE) &&            strcmp(name.name, "change-file-prop") == 0) ||           ((state == OPEN_DIR || state == ADD_DIR) &&            strcmp(name.name, "change-dir-prop") == 0))    {      const char *prop_name;      prop_info_t *info;      prop_name = svn_ra_serf__find_attr(attrs, "name");      if (!prop_name)        {          return svn_error_createf(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,                                   _("Missing name attr in %s element"),                                   name.name);        }      info = push_state(parser, ctx, CHANGE_PROP);      info->name = apr_pstrdup(parser->state->pool, prop_name);      if (svn_ra_serf__find_attr(attrs, "del"))        info->del_prop = TRUE;      else        info->del_prop = FALSE;      if (state == OPEN_FILE || state == ADD_FILE)        info->change = ctx->editor->change_file_prop;      else        info->change = ctx->editor->change_dir_prop;    }  return SVN_NO_ERROR;}static svn_error_t *end_replay(svn_ra_serf__xml_parser_t *parser,           void *userData,           svn_ra_serf__dav_props_t name){  replay_context_t *ctx = userData;  replay_state_e state;  replay_info_t *info;  state = parser->state->current_state;  info = parser->state->private;  if (state == REPORT &&      strcmp(name.name, "editor-report") == 0)    {      svn_ra_serf__xml_pop_state(parser);    }  else if (state == OPEN_DIR && strcmp(name.name, "open-directory") == 0)    {      /* Don't do anything. */    }  else if (state == ADD_DIR && strcmp(name.name, "add-directory") == 0)    {      /* Don't do anything. */    }  else if (state == OPEN_FILE && strcmp(name.name, "open-file") == 0)    {      /* Don't do anything. */    }  else if (state == ADD_FILE && strcmp(name.name, "add-file") == 0)    {      /* Don't do anything. */    }  else if ((state == OPEN_FILE || state == ADD_FILE) &&           strcmp(name.name, "close-file") == 0)    {      /* Don't do anything. */    }  else if ((state == APPLY_TEXTDELTA) &&           strcmp(name.name, "apply-textdelta") == 0)    {      SVN_ERR(svn_stream_close(info->stream));      svn_ra_serf__xml_pop_state(parser);    }  else if (state == CHANGE_PROP &&           (strcmp(name.name, "change-file-prop") == 0 ||            strcmp(name.name, "change-dir-prop") == 0))    {      prop_info_t *info;      const svn_string_t *prop_val;      info = parser->state->private;      if (info->del_prop == TRUE)        {          prop_val = NULL;        }      else        {          svn_string_t tmp_prop;          tmp_prop.data = info->data;          tmp_prop.len = info->len;          prop_val = svn_base64_decode_string(&tmp_prop, parser->state->pool);        }      SVN_ERR(info->change(info->parent->baton, info->name, prop_val,                           info->parent->pool));      svn_ra_serf__xml_pop_state(parser);    }  return SVN_NO_ERROR;}static svn_error_t *cdata_replay(svn_ra_serf__xml_parser_t *parser,             void *userData,             const char *data,             apr_size_t len){  replay_context_t *replay_ctx = userData;  replay_state_e state;  state = parser->state->current_state;  if (state == APPLY_TEXTDELTA)    {      replay_info_t *info = parser->state->private;      apr_size_t written;      written = len;      SVN_ERR(svn_stream_write(info->stream, data, &written));      if (written != len)        return svn_error_create(SVN_ERR_STREAM_UNEXPECTED_EOF, NULL,                                _("Error writing stream: unexpected EOF"));    }  else if (state == CHANGE_PROP)    {      prop_info_t *info = parser->state->private;      svn_ra_serf__expand_string(&info->data, &info->len,                                 data, len, parser->state->pool);    }  return SVN_NO_ERROR;}svn_error_t *svn_ra_serf__replay(svn_ra_session_t *ra_session,                    svn_revnum_t revision,                    svn_revnum_t low_water_mark,                    svn_boolean_t send_deltas,                    const svn_delta_editor_t *editor,                    void *edit_baton,                    apr_pool_t *pool){  replay_context_t *replay_ctx;  svn_ra_serf__session_t *session = ra_session->priv;  svn_ra_serf__handler_t *handler;  svn_ra_serf__xml_parser_t *parser_ctx;  serf_bucket_t *buckets, *tmp;  replay_ctx = apr_pcalloc(pool, sizeof(*replay_ctx));  replay_ctx->pool = pool;  replay_ctx->editor = editor;  replay_ctx->editor_baton = edit_baton;  replay_ctx->done = FALSE;  buckets = serf_bucket_aggregate_create(session->bkt_alloc);  tmp = SERF_BUCKET_SIMPLE_STRING_LEN("<S:replay-report xmlns:S=\"",                                      sizeof("<S:replay-report xmlns:S=\"")-1,                                      session->bkt_alloc);  serf_bucket_aggregate_append(buckets, tmp);  tmp = SERF_BUCKET_SIMPLE_STRING_LEN(SVN_XML_NAMESPACE,                                      sizeof(SVN_XML_NAMESPACE)-1,                                      session->bkt_alloc);  serf_bucket_aggregate_append(buckets, tmp);  tmp = SERF_BUCKET_SIMPLE_STRING_LEN("\">",                                      sizeof("\">")-1,                                      session->bkt_alloc);  serf_bucket_aggregate_append(buckets, tmp);  svn_ra_serf__add_tag_buckets(buckets,                               "S:revision", apr_ltoa(pool, revision),                               session->bkt_alloc);  svn_ra_serf__add_tag_buckets(buckets,                               "S:low-water-mark",                               apr_ltoa(pool, low_water_mark),                               session->bkt_alloc);  svn_ra_serf__add_tag_buckets(buckets,                               "S:send-deltas",                               apr_ltoa(pool, send_deltas),                               session->bkt_alloc);  tmp = SERF_BUCKET_SIMPLE_STRING_LEN("</S:replay-report>",                                      sizeof("</S:replay-report>")-1,                                      session->bkt_alloc);  serf_bucket_aggregate_append(buckets, tmp);  handler = apr_pcalloc(pool, sizeof(*handler));  handler->method = "REPORT";  handler->path = session->repos_url_str;  handler->body_buckets = buckets;  handler->body_type = "text/xml";  handler->conn = session->conns[0];  handler->session = session;  parser_ctx = apr_pcalloc(pool, sizeof(*parser_ctx));  parser_ctx->pool = pool;  parser_ctx->user_data = replay_ctx;  parser_ctx->start = start_replay;  parser_ctx->end = end_replay;  parser_ctx->cdata = cdata_replay;  parser_ctx->done = &replay_ctx->done;  handler->response_handler = svn_ra_serf__handle_xml_parser;  handler->response_baton = parser_ctx;  svn_ra_serf__request_create(handler);  SVN_ERR(svn_ra_serf__context_run_wait(&replay_ctx->done, session, pool));  return SVN_NO_ERROR;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -