📄 editor.c
字号:
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, void *baton){ ra_svn_driver_state_t *ds = baton; 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)); SVN_ERR(svn_ra_svn_write_cmd_response(conn, 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, void *baton){ ra_svn_driver_state_t *ds = baton; 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, subpool); SVN_ERR(svn_ra_svn_write_cmd_response(conn, pool, "")); 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, void *baton){ ra_svn_driver_state_t *ds = baton; 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, &entry, pool)); path = svn_path_canonicalize(path, pool); SVN_CMD_ERR(ds->editor->delete_entry(path, rev, entry->baton, entry->pool)); SVN_ERR(svn_ra_svn_write_cmd_response(conn, 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, void *baton){ ra_svn_driver_state_t *ds = baton; 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, &entry, pool)); 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, subpool); SVN_ERR(svn_ra_svn_write_cmd_response(conn, pool, "")); 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, void *baton){ ra_svn_driver_state_t *ds = baton; 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, &entry, pool)); 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, subpool); SVN_ERR(svn_ra_svn_write_cmd_response(conn, pool, "")); 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, void *baton){ ra_svn_driver_state_t *ds = baton; 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, &entry, pool)); if (!entry->err) entry->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, void *baton){ ra_svn_driver_state_t *ds = baton; 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, &entry, pool)); /* Return any delayed errors. */ apr_pool_cleanup_kill(entry->pool, entry, clear_token_err); SVN_CMD_ERR(entry->err); /* 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); SVN_ERR(svn_ra_svn_write_cmd_response(conn, 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, void *baton){ ra_svn_driver_state_t *ds = baton; const char *path, *token, *file_token, *copy_path; svn_revnum_t copy_rev; ra_svn_token_entry_t *entry, *file_entry; apr_pool_t *subpool; SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "ccc(?cr)", &path, &token, &file_token, ©_path, ©_rev)); SVN_ERR(lookup_token(ds, token, &entry, pool)); /* File may outlive parent directory, so use ds->pool here. */ subpool = svn_pool_create(ds->pool); path = svn_path_canonicalize(path, pool); if (copy_path) copy_path = svn_path_canonicalize(copy_path, pool); file_entry = store_token(ds, NULL, file_token, subpool); file_entry->err = ds->editor->add_file(path, entry->baton, copy_path, copy_rev, subpool, &file_entry->baton); return SVN_NO_ERROR;}static svn_error_t *ra_svn_handle_open_file(svn_ra_svn_conn_t *conn, apr_pool_t *pool, apr_array_header_t *params, void *baton){ ra_svn_driver_state_t *ds = baton; const char *path, *token, *file_token; svn_revnum_t rev; ra_svn_token_entry_t *entry, *file_entry; apr_pool_t *subpool; SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "ccc(?r)", &path, &token, &file_token, &rev)); SVN_ERR(lookup_token(ds, token, &entry, pool)); /* File may outlive parent directory, so use ds->pool here. */ subpool = svn_pool_create(ds->pool); path = svn_path_canonicalize(path, pool); file_entry = store_token(ds, NULL, file_token, subpool); file_entry->err = ds->editor->open_file(path, entry->baton, rev, subpool, &file_entry->baton); return SVN_NO_ERROR;}static svn_error_t *ra_svn_handle_apply_textdelta(svn_ra_svn_conn_t *conn, apr_pool_t *pool, apr_array_header_t *params, void *baton){ ra_svn_driver_state_t *ds = baton; const char *token; ra_svn_token_entry_t *entry; svn_txdelta_window_handler_t wh; void *wh_baton; svn_stream_t *stream; apr_pool_t *subpool; svn_ra_svn_item_t *item; char *base_checksum; /* Parse arguments and look up the token. */ SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "c(?c)", &token, &base_checksum)); SVN_ERR(lookup_token(ds, token, &entry, pool)); if (!entry->err) entry->err = ds->editor->apply_textdelta(entry->baton, base_checksum, pool, &wh, &wh_baton); if (!entry->err) stream = svn_txdelta_parse_svndiff(wh, wh_baton, TRUE, entry->pool); subpool = svn_pool_create(entry->pool); while (1) { apr_pool_clear(subpool); SVN_ERR(svn_ra_svn_read_item(conn, subpool, &item)); if (item->kind != SVN_RA_SVN_STRING) return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Non-string as part of text delta")); if (item->u.string->len == 0) break; if (!entry->err) entry->err = svn_stream_write(stream, item->u.string->data, &item->u.string->len); } if (!entry->err) entry->err = svn_stream_close(stream); apr_pool_destroy(subpool); return SVN_NO_ERROR;}static svn_error_t *ra_svn_handle_change_file_prop(svn_ra_svn_conn_t *conn, apr_pool_t *pool, apr_array_header_t *params, void *baton){ ra_svn_driver_state_t *ds = baton; 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, &entry, pool)); if (!entry->err) entry->err = ds->editor->change_file_prop(entry->baton, name, value, entry->pool); return SVN_NO_ERROR;}static svn_error_t *ra_svn_handle_close_file(svn_ra_svn_conn_t *conn, apr_pool_t *pool, apr_array_header_t *params, void *baton){ ra_svn_driver_state_t *ds = baton; const char *token; ra_svn_token_entry_t *entry; const char *text_checksum; /* Parse arguments and look up the file token. */ SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "c(?c)", &token, &text_checksum)); SVN_ERR(lookup_token(ds, token, &entry, pool)); /* Return any delayed errors. */ apr_pool_cleanup_kill(entry->pool, entry, clear_token_err); SVN_CMD_ERR(entry->err); /* Close the file and destroy the baton. */ SVN_CMD_ERR(ds->editor->close_file(entry->baton, text_checksum, pool)); apr_hash_set(ds->tokens, token, APR_HASH_KEY_STRING, NULL); apr_pool_destroy(entry->pool); SVN_ERR(svn_ra_svn_write_cmd_response(conn, pool, "")); return SVN_NO_ERROR;}static svn_error_t *ra_svn_handle_close_edit(svn_ra_svn_conn_t *conn, apr_pool_t *pool, apr_array_header_t *params, void *baton){ ra_svn_driver_state_t *ds = baton; svn_error_t *err; err = ds->editor->close_edit(ds->edit_baton, pool); if (ds->aborted) *ds->aborted = (err != SVN_NO_ERROR); SVN_CMD_ERR(err); return svn_ra_svn_write_cmd_response(conn, pool, "");}static svn_error_t *ra_svn_handle_abort_edit(svn_ra_svn_conn_t *conn, apr_pool_t *pool, apr_array_header_t *params, void *baton){ ra_svn_driver_state_t *ds = baton; if (ds->aborted) *ds->aborted = TRUE; SVN_CMD_ERR(ds->editor->abort_edit(ds->edit_baton, pool)); return svn_ra_svn_write_cmd_response(conn, pool, "");}static svn_error_t *ra_svn_handle_finish_replay(svn_ra_svn_conn_t *conn, apr_pool_t *pool, apr_array_header_t *params, void *baton){ ra_svn_driver_state_t *ds = baton; if (!ds->for_replay) return svn_error_createf (SVN_ERR_RA_SVN_UNKNOWN_CMD, NULL, _("Command 'finish-replay' invalid outside of replays")); return SVN_NO_ERROR;}static const svn_ra_svn_cmd_entry_t ra_svn_edit_commands[] = { { "target-rev", ra_svn_handle_target_rev }, { "open-root", ra_svn_handle_open_root }, { "delete-entry", ra_svn_handle_delete_entry }, { "add-dir", ra_svn_handle_add_dir }, { "open-dir", ra_svn_handle_open_dir }, { "change-dir-prop", ra_svn_handle_change_dir_prop }, { "close-dir", ra_svn_handle_close_dir }, { "add-file", ra_svn_handle_add_file }, { "open-file", ra_svn_handle_open_file }, { "apply-textdelta", ra_svn_handle_apply_textdelta }, { "change-file-prop", ra_svn_handle_change_file_prop }, { "close-file", ra_svn_handle_close_file }, { "close-edit", ra_svn_handle_close_edit, TRUE }, { "abort-edit", ra_svn_handle_abort_edit, TRUE }, { "finish-replay", ra_svn_handle_finish_replay, TRUE }, { NULL }};svn_error_t *svn_ra_svn_drive_editor2(svn_ra_svn_conn_t *conn, apr_pool_t *pool, const svn_delta_editor_t *editor, void *edit_baton, svn_boolean_t *aborted, svn_boolean_t for_replay){ ra_svn_driver_state_t state; if (svn_ra_svn_has_capability(conn, SVN_RA_SVN_CAP_EDIT_PIPELINE)) return svn_ra_svn__drive_editorp(conn, pool, editor, edit_baton, aborted, for_replay); state.editor = editor; state.edit_baton = edit_baton; state.tokens = apr_hash_make(pool); state.aborted = aborted; state.pool = pool; state.for_replay = for_replay; return svn_ra_svn_handle_commands(conn, pool, ra_svn_edit_commands, &state);}svn_error_t *svn_ra_svn_drive_editor(svn_ra_svn_conn_t *conn, apr_pool_t *pool, const svn_delta_editor_t *editor, void *edit_baton, svn_boolean_t *aborted){ return svn_ra_svn_drive_editor2(conn, pool, editor, edit_baton, aborted, FALSE);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -