📄 editorp.c
字号:
* needed information. */ diff_stream = svn_stream_create(b, pool); svn_stream_set_write(diff_stream, ra_svn_svndiff_handler); svn_stream_set_close(diff_stream, ra_svn_svndiff_close_handler); if (svn_ra_svn_has_capability(b->conn, SVN_RA_SVN_CAP_SVNDIFF1)) svn_txdelta_to_svndiff2(wh, wh_baton, diff_stream, 1, pool); else svn_txdelta_to_svndiff2(wh, wh_baton, diff_stream, 0, pool); return SVN_NO_ERROR;} static svn_error_t *ra_svn_change_file_prop(void *file_baton, const char *name, const svn_string_t *value, apr_pool_t *pool){ ra_svn_baton_t *b = file_baton; SVN_ERR(check_for_error(b->eb, pool)); SVN_ERR(svn_ra_svn_write_cmd(b->conn, pool, "change-file-prop", "cc(?s)", b->token, name, value)); return SVN_NO_ERROR;}static svn_error_t *ra_svn_close_file(void *file_baton, const char *text_checksum, apr_pool_t *pool){ ra_svn_baton_t *b = file_baton; SVN_ERR(check_for_error(b->eb, pool)); SVN_ERR(svn_ra_svn_write_cmd(b->conn, pool, "close-file", "c(?c)", b->token, text_checksum)); return SVN_NO_ERROR;}static svn_error_t *ra_svn_absent_file(const char *path, void *parent_baton, apr_pool_t *pool){ ra_svn_baton_t *b = parent_baton; /* Avoid sending an unknown command if the other end doesn't support absent-file. */ if (! svn_ra_svn_has_capability(b->conn, SVN_RA_SVN_CAP_ABSENT_ENTRIES)) return SVN_NO_ERROR; SVN_ERR(check_for_error(b->eb, pool)); SVN_ERR(svn_ra_svn_write_cmd(b->conn, pool, "absent-file", "cc", path, b->token)); return SVN_NO_ERROR;}static svn_error_t *ra_svn_close_edit(void *edit_baton, apr_pool_t *pool){ ra_svn_edit_baton_t *eb = edit_baton; svn_error_t *err; assert(!eb->got_status); eb->got_status = TRUE; SVN_ERR(svn_ra_svn_write_cmd(eb->conn, pool, "close-edit", "")); err = svn_ra_svn_read_cmd_response(eb->conn, pool, ""); if (err) { svn_error_clear(svn_ra_svn_write_cmd(eb->conn, pool, "abort-edit", "")); return err; } if (eb->callback) SVN_ERR(eb->callback(eb->callback_baton)); return SVN_NO_ERROR;}static svn_error_t *ra_svn_abort_edit(void *edit_baton, apr_pool_t *pool){ ra_svn_edit_baton_t *eb = edit_baton; if (eb->got_status) return SVN_NO_ERROR; SVN_ERR(svn_ra_svn_write_cmd(eb->conn, pool, "abort-edit", "")); SVN_ERR(svn_ra_svn_read_cmd_response(eb->conn, pool, "")); return SVN_NO_ERROR;}void svn_ra_svn__get_editorp(const svn_delta_editor_t **editor, void **edit_baton, svn_ra_svn_conn_t *conn, apr_pool_t *pool, svn_ra_svn_edit_callback callback, void *callback_baton){ svn_delta_editor_t *ra_svn_editor = svn_delta_default_editor(pool); ra_svn_edit_baton_t *eb; eb = apr_palloc(pool, sizeof(*eb)); eb->conn = conn; eb->callback = callback; eb->callback_baton = callback_baton; eb->next_token = 0; eb->got_status = FALSE; ra_svn_editor->set_target_revision = ra_svn_target_rev; ra_svn_editor->open_root = ra_svn_open_root; ra_svn_editor->delete_entry = ra_svn_delete_entry; ra_svn_editor->add_directory = ra_svn_add_dir; ra_svn_editor->open_directory = ra_svn_open_dir; ra_svn_editor->change_dir_prop = ra_svn_change_dir_prop; ra_svn_editor->close_directory = ra_svn_close_dir; ra_svn_editor->absent_directory = ra_svn_absent_dir; ra_svn_editor->add_file = ra_svn_add_file; ra_svn_editor->open_file = ra_svn_open_file; ra_svn_editor->apply_textdelta = ra_svn_apply_textdelta; ra_svn_editor->change_file_prop = ra_svn_change_file_prop; ra_svn_editor->close_file = ra_svn_close_file; ra_svn_editor->absent_file = ra_svn_absent_file; ra_svn_editor->close_edit = ra_svn_close_edit; ra_svn_editor->abort_edit = ra_svn_abort_edit; *editor = ra_svn_editor; *edit_baton = eb;}/* --- DRIVING AN EDITOR --- *//* Store a token entry. The token string will be copied into pool. */static ra_svn_token_entry_t *store_token(ra_svn_driver_state_t *ds, void *baton, const char *token, svn_boolean_t is_file, apr_pool_t *pool){ ra_svn_token_entry_t *entry; entry = apr_palloc(pool, sizeof(*entry)); entry->token = apr_pstrdup(pool, token); entry->baton = baton; entry->is_file = is_file; entry->dstream = NULL; entry->pool = pool; apr_hash_set(ds->tokens, entry->token, APR_HASH_KEY_STRING, entry); return entry;}static svn_error_t *lookup_token(ra_svn_driver_state_t *ds, const char *token, svn_boolean_t is_file, ra_svn_token_entry_t **entry){ *entry = apr_hash_get(ds->tokens, token, APR_HASH_KEY_STRING); if (!*entry || (*entry)->is_file != is_file) return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Invalid file or dir token during edit")); return SVN_NO_ERROR;}static svn_error_t *ra_svn_handle_target_rev(svn_ra_svn_conn_t *conn, apr_pool_t *pool, apr_array_header_t *params, ra_svn_driver_state_t *ds){ svn_revnum_t rev; SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "r", &rev)); SVN_CMD_ERR(ds->editor->set_target_revision(ds->edit_baton, rev, pool)); return SVN_NO_ERROR;}static svn_error_t *ra_svn_handle_open_root(svn_ra_svn_conn_t *conn, apr_pool_t *pool, apr_array_header_t *params, ra_svn_driver_state_t *ds){ svn_revnum_t rev; apr_pool_t *subpool; const char *token; void *root_baton; SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "(?r)c", &rev, &token)); subpool = svn_pool_create(ds->pool); SVN_CMD_ERR(ds->editor->open_root(ds->edit_baton, rev, subpool, &root_baton)); store_token(ds, root_baton, token, FALSE, subpool); return SVN_NO_ERROR;}static svn_error_t *ra_svn_handle_delete_entry(svn_ra_svn_conn_t *conn, apr_pool_t *pool, apr_array_header_t *params, ra_svn_driver_state_t *ds){ const char *path, *token; svn_revnum_t rev; ra_svn_token_entry_t *entry; SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "c(?r)c", &path, &rev, &token)); SVN_ERR(lookup_token(ds, token, FALSE, &entry)); path = svn_path_canonicalize(path, pool); SVN_CMD_ERR(ds->editor->delete_entry(path, rev, entry->baton, pool)); return SVN_NO_ERROR;}static svn_error_t *ra_svn_handle_add_dir(svn_ra_svn_conn_t *conn, apr_pool_t *pool, apr_array_header_t *params, ra_svn_driver_state_t *ds){ const char *path, *token, *child_token, *copy_path; svn_revnum_t copy_rev; ra_svn_token_entry_t *entry; apr_pool_t *subpool; void *child_baton; SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "ccc(?cr)", &path, &token, &child_token, ©_path, ©_rev)); SVN_ERR(lookup_token(ds, token, FALSE, &entry)); subpool = svn_pool_create(entry->pool); path = svn_path_canonicalize(path, pool); if (copy_path) copy_path = svn_path_canonicalize(copy_path, pool); SVN_CMD_ERR(ds->editor->add_directory(path, entry->baton, copy_path, copy_rev, subpool, &child_baton)); store_token(ds, child_baton, child_token, FALSE, subpool); return SVN_NO_ERROR;}static svn_error_t *ra_svn_handle_open_dir(svn_ra_svn_conn_t *conn, apr_pool_t *pool, apr_array_header_t *params, ra_svn_driver_state_t *ds){ const char *path, *token, *child_token; svn_revnum_t rev; ra_svn_token_entry_t *entry; apr_pool_t *subpool; void *child_baton; SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "ccc(?r)", &path, &token, &child_token, &rev)); SVN_ERR(lookup_token(ds, token, FALSE, &entry)); subpool = svn_pool_create(entry->pool); path = svn_path_canonicalize(path, pool); SVN_CMD_ERR(ds->editor->open_directory(path, entry->baton, rev, subpool, &child_baton)); store_token(ds, child_baton, child_token, FALSE, subpool); return SVN_NO_ERROR;}static svn_error_t *ra_svn_handle_change_dir_prop(svn_ra_svn_conn_t *conn, apr_pool_t *pool, apr_array_header_t *params, ra_svn_driver_state_t *ds){ const char *token, *name; svn_string_t *value; ra_svn_token_entry_t *entry; SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "cc(?s)", &token, &name, &value)); SVN_ERR(lookup_token(ds, token, FALSE, &entry)); SVN_CMD_ERR(ds->editor->change_dir_prop(entry->baton, name, value, entry->pool)); return SVN_NO_ERROR;}static svn_error_t *ra_svn_handle_close_dir(svn_ra_svn_conn_t *conn, apr_pool_t *pool, apr_array_header_t *params, ra_svn_driver_state_t *ds){ const char *token; ra_svn_token_entry_t *entry; /* Parse and look up the directory token. */ SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "c", &token)); SVN_ERR(lookup_token(ds, token, FALSE, &entry)); /* Close the directory and destroy the baton. */ SVN_CMD_ERR(ds->editor->close_directory(entry->baton, pool)); apr_hash_set(ds->tokens, token, APR_HASH_KEY_STRING, NULL); apr_pool_destroy(entry->pool); return SVN_NO_ERROR;}static svn_error_t *ra_svn_handle_absent_dir(svn_ra_svn_conn_t *conn, apr_pool_t *pool, apr_array_header_t *params, ra_svn_driver_state_t *ds){ const char *path; const char *token; ra_svn_token_entry_t *entry; /* Parse parameters and look up the directory token. */ SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "cc", &path, &token)); SVN_ERR(lookup_token(ds, token, FALSE, &entry)); /* Call the editor. */ SVN_CMD_ERR(ds->editor->absent_directory(path, entry->baton, pool)); return SVN_NO_ERROR;}static svn_error_t *ra_svn_handle_add_file(svn_ra_svn_conn_t *conn, apr_pool_t *pool, apr_array_header_t *params, ra_svn_driver_state_t *ds){ const char *path, *token, *file_token, *copy_path; svn_revnum_t copy_rev; ra_svn_token_entry_t *entry, *file_entry; SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "ccc(?cr)", &path, &token, &file_token, ©_path, ©_rev)); SVN_ERR(lookup_token(ds, token, FALSE, &entry)); ds->file_refs++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -