editor.c
来自「linux subdivision ying gai ke yi le ba」· C语言 代码 · 共 739 行 · 第 1/2 页
C
739 行
apr_pool_cleanup_register(pool, entry, clear_token_err,
apr_pool_cleanup_null);
return entry;
}
static svn_error_t *lookup_token(ra_svn_driver_state_t *ds, const char *token,
ra_svn_token_entry_t **entry,
apr_pool_t *pool)
{
*entry = apr_hash_get(ds->tokens, token, APR_HASH_KEY_STRING);
if (!*entry)
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,
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);
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 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 },
{ NULL }
};
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)
{
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);
state.editor = editor;
state.edit_baton = edit_baton;
state.tokens = apr_hash_make(pool);
state.aborted = aborted;
state.pool = pool;
return svn_ra_svn_handle_commands(conn, pool, ra_svn_edit_commands, &state);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?