📄 client.c
字号:
dirent->created_rev = crev; SVN_ERR(svn_time_from_cstring(&dirent->time, cdate, pool)); dirent->last_author = cauthor; apr_hash_set(*dirents, name, APR_HASH_KEY_STRING, dirent); } return SVN_NO_ERROR;}static svn_error_t *ra_svn_update(svn_ra_session_t *session, const svn_ra_reporter2_t **reporter, void **report_baton, svn_revnum_t rev, const char *target, svn_boolean_t recurse, const svn_delta_editor_t *update_editor, void *update_baton, apr_pool_t *pool){ ra_svn_session_baton_t *sess_baton = session->priv; svn_ra_svn_conn_t *conn = sess_baton->conn; /* Tell the server we want to start an update. */ SVN_ERR(svn_ra_svn_write_cmd(conn, pool, "update", "(?r)cb", rev, target, recurse)); SVN_ERR(handle_auth_request(sess_baton, pool)); /* Fetch a reporter for the caller to drive. The reporter will drive * update_editor upon finish_report(). */ ra_svn_get_reporter(sess_baton, pool, update_editor, update_baton, reporter, report_baton); return SVN_NO_ERROR;}static svn_error_t *ra_svn_switch(svn_ra_session_t *session, const svn_ra_reporter2_t **reporter, void **report_baton, svn_revnum_t rev, const char *target, svn_boolean_t recurse, const char *switch_url, const svn_delta_editor_t *update_editor, void *update_baton, apr_pool_t *pool){ ra_svn_session_baton_t *sess_baton = session->priv; svn_ra_svn_conn_t *conn = sess_baton->conn; /* Tell the server we want to start a switch. */ SVN_ERR(svn_ra_svn_write_cmd(conn, pool, "switch", "(?r)cbc", rev, target, recurse, switch_url)); SVN_ERR(handle_auth_request(sess_baton, pool)); /* Fetch a reporter for the caller to drive. The reporter will drive * update_editor upon finish_report(). */ ra_svn_get_reporter(sess_baton, pool, update_editor, update_baton, reporter, report_baton); return SVN_NO_ERROR;}static svn_error_t *ra_svn_status(svn_ra_session_t *session, const svn_ra_reporter2_t **reporter, void **report_baton, const char *target, svn_revnum_t rev, svn_boolean_t recurse, const svn_delta_editor_t *status_editor, void *status_baton, apr_pool_t *pool){ ra_svn_session_baton_t *sess_baton = session->priv; svn_ra_svn_conn_t *conn = sess_baton->conn; /* Tell the server we want to start a status operation. */ SVN_ERR(svn_ra_svn_write_cmd(conn, pool, "status", "cb(?r)", target, recurse, rev)); SVN_ERR(handle_auth_request(sess_baton, pool)); /* Fetch a reporter for the caller to drive. The reporter will drive * status_editor upon finish_report(). */ ra_svn_get_reporter(sess_baton, pool, status_editor, status_baton, reporter, report_baton); return SVN_NO_ERROR;}static svn_error_t *ra_svn_diff(svn_ra_session_t *session, const svn_ra_reporter2_t **reporter, void **report_baton, svn_revnum_t rev, const char *target, svn_boolean_t recurse, svn_boolean_t ignore_ancestry, svn_boolean_t text_deltas, const char *versus_url, const svn_delta_editor_t *diff_editor, void *diff_baton, apr_pool_t *pool){ ra_svn_session_baton_t *sess_baton = session->priv; svn_ra_svn_conn_t *conn = sess_baton->conn; /* Tell the server we want to start a diff. */ SVN_ERR(svn_ra_svn_write_cmd(conn, pool, "diff", "(?r)cbbcb", rev, target, recurse, ignore_ancestry, versus_url, text_deltas)); SVN_ERR(handle_auth_request(sess_baton, pool)); /* Fetch a reporter for the caller to drive. The reporter will drive * diff_editor upon finish_report(). */ ra_svn_get_reporter(sess_baton, pool, diff_editor, diff_baton, reporter, report_baton); return SVN_NO_ERROR;}static svn_error_t *ra_svn_log(svn_ra_session_t *session, const apr_array_header_t *paths, svn_revnum_t start, svn_revnum_t end, int limit, svn_boolean_t discover_changed_paths, svn_boolean_t strict_node_history, svn_log_message_receiver_t receiver, void *receiver_baton, apr_pool_t *pool){ ra_svn_session_baton_t *sess_baton = session->priv; svn_ra_svn_conn_t *conn = sess_baton->conn; apr_pool_t *subpool; int i; const char *path, *author, *date, *message, *cpath, *action, *copy_path; svn_ra_svn_item_t *item, *elt; apr_array_header_t *cplist; apr_hash_t *cphash; svn_revnum_t rev, copy_rev; svn_log_changed_path_t *change; int nreceived = 0; SVN_ERR(svn_ra_svn_write_tuple(conn, pool, "w((!", "log")); if (paths) { for (i = 0; i < paths->nelts; i++) { path = ((const char **) paths->elts)[i]; SVN_ERR(svn_ra_svn_write_cstring(conn, pool, path)); } } SVN_ERR(svn_ra_svn_write_tuple(conn, pool, "!)(?r)(?r)bbn)", start, end, discover_changed_paths, strict_node_history, (apr_uint64_t) limit)); SVN_ERR(handle_auth_request(sess_baton, pool)); /* Read the log messages. */ subpool = svn_pool_create(pool); while (1) { SVN_ERR(svn_ra_svn_read_item(conn, subpool, &item)); if (item->kind == SVN_RA_SVN_WORD && strcmp(item->u.word, "done") == 0) break; if (item->kind != SVN_RA_SVN_LIST) return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Log entry not a list")); SVN_ERR(svn_ra_svn_parse_tuple(item->u.list, subpool, "lr(?c)(?c)(?c)", &cplist, &rev, &author, &date, &message)); if (cplist->nelts > 0) { /* Interpret the changed-paths list. */ cphash = apr_hash_make(subpool); for (i = 0; i < cplist->nelts; i++) { elt = &((svn_ra_svn_item_t *) cplist->elts)[i]; if (elt->kind != SVN_RA_SVN_LIST) return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Changed-path entry not a list")); SVN_ERR(svn_ra_svn_parse_tuple(elt->u.list, subpool, "cw(?cr)", &cpath, &action, ©_path, ©_rev)); cpath = svn_path_canonicalize(cpath, subpool); if (copy_path) copy_path = svn_path_canonicalize(copy_path, subpool); change = apr_palloc(subpool, sizeof(*change)); change->action = *action; change->copyfrom_path = copy_path; change->copyfrom_rev = copy_rev; apr_hash_set(cphash, cpath, APR_HASH_KEY_STRING, change); } } else cphash = NULL; if (! (limit && ++nreceived > limit)) SVN_ERR(receiver(receiver_baton, cphash, rev, author, date, message, subpool)); apr_pool_clear(subpool); } apr_pool_destroy(subpool); /* Read the response. */ SVN_ERR(svn_ra_svn_read_cmd_response(conn, pool, "")); return SVN_NO_ERROR;}static svn_error_t *ra_svn_check_path(svn_ra_session_t *session, const char *path, svn_revnum_t rev, svn_node_kind_t *kind, apr_pool_t *pool){ ra_svn_session_baton_t *sess_baton = session->priv; svn_ra_svn_conn_t *conn = sess_baton->conn; const char *kind_word; SVN_ERR(svn_ra_svn_write_cmd(conn, pool, "check-path", "c(?r)", path, rev)); SVN_ERR(handle_auth_request(sess_baton, pool)); SVN_ERR(svn_ra_svn_read_cmd_response(conn, pool, "w", &kind_word)); SVN_ERR(interpret_kind(kind_word, pool, kind)); return SVN_NO_ERROR;}/* If ERR is a command not supported error, wrap it in a SVN_ERR_RA_NOT_IMPLEMENTED with error message MSG. Else, return err. */static svn_error_t *handle_unsupported_cmd(svn_error_t *err, const char *msg){ if (err && err->apr_err == SVN_ERR_RA_SVN_UNKNOWN_CMD) return svn_error_create(SVN_ERR_RA_NOT_IMPLEMENTED, err, msg); return err;}static svn_error_t *ra_svn_stat(svn_ra_session_t *session, const char *path, svn_revnum_t rev, svn_dirent_t **dirent, apr_pool_t *pool){ ra_svn_session_baton_t *sess_baton = session->priv; svn_ra_svn_conn_t *conn = sess_baton->conn; apr_array_header_t *list = NULL; const char *kind, *cdate, *cauthor; svn_revnum_t crev; svn_boolean_t has_props; apr_uint64_t size; svn_dirent_t *the_dirent; SVN_ERR(svn_ra_svn_write_cmd(conn, pool, "stat", "c(?r)", path, rev)); SVN_ERR(handle_unsupported_cmd(handle_auth_request(sess_baton, pool), _("'stat' not implemented"))); SVN_ERR(svn_ra_svn_read_cmd_response(conn, pool, "(?l)", &list)); if (! list) { *dirent = NULL; } else { SVN_ERR(svn_ra_svn_parse_tuple(list, pool, "wnbr(?c)(?c)", &kind, &size, &has_props, &crev, &cdate, &cauthor)); the_dirent = apr_palloc(pool, sizeof(*the_dirent)); SVN_ERR(interpret_kind(kind, pool, &the_dirent->kind)); the_dirent->size = size;/* FIXME: svn_filesize_t */ the_dirent->has_props = has_props; the_dirent->created_rev = crev; SVN_ERR(svn_time_from_cstring(&the_dirent->time, cdate, pool)); the_dirent->last_author = cauthor; *dirent = the_dirent; } return SVN_NO_ERROR;}static svn_error_t *ra_svn_get_locations(svn_ra_session_t *session, apr_hash_t **locations, const char *path, svn_revnum_t peg_revision, apr_array_header_t *location_revisions, apr_pool_t *pool){ ra_svn_session_baton_t *sess_baton = session->priv; svn_ra_svn_conn_t *conn = sess_baton->conn; svn_revnum_t revision; svn_ra_svn_item_t *item; svn_boolean_t is_done; int i; const char *ret_path; /* Transmit the parameters. */ SVN_ERR(svn_ra_svn_write_tuple(conn, pool, "w(cr(!", "get-locations", path, peg_revision)); for (i = 0; i < location_revisions->nelts; i++) { revision = ((svn_revnum_t *)location_revisions->elts)[i]; SVN_ERR(svn_ra_svn_write_tuple(conn, pool, "!r!", revision)); } SVN_ERR(svn_ra_svn_write_tuple(conn, pool, "!))")); /* Servers before 1.1 don't support this command. Check for this here. */ SVN_ERR(handle_unsupported_cmd(handle_auth_request(sess_baton, pool), _("'get-locations' not implemented"))); /* Read the hash items. */ is_done = FALSE; *locations = apr_hash_make(pool); while (!is_done) { SVN_ERR(svn_ra_svn_read_item(conn, pool, &item)); if (item->kind == SVN_RA_SVN_WORD && strcmp(item->u.word, "done") == 0) is_done = 1; else if (item->kind != SVN_RA_SVN_LIST) return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Location entry not a list")); else { SVN_ERR(svn_ra_svn_parse_tuple(item->u.list, pool, "rc", &revision, &ret_path)); ret_path = svn_path_canonicalize(ret_path, pool); apr_hash_set(*locations, apr_pmemdup(pool, &revision, sizeof(revision)), sizeof(revision), ret_path); } } /* Read the response. This is so the server would have a chance to * report an error. */ SVN_ERR(svn_ra_svn_read_cmd_response(conn, pool, "")); return SVN_NO_ERROR;}static svn_error_t *ra_svn_get_file_revs(svn_ra_session_t *session, const char *path, svn_revnum_t start, svn_revnum_t end, svn_ra_file_rev_handler_t handler, void *handler_baton, apr_pool_t *pool){ ra_svn_session_baton_t *sess_baton = session->priv; apr_pool_t *rev_pool, *chunk_pool; svn_ra_svn_item_t *item; const char *p; svn_revnum_t rev; apr_array_header_t *rev_proplist, *proplist; apr_hash_t *rev_props; apr_array_header_t *props; svn_boolean_t has_txdelta; svn_boolean_t had_revision = FALSE; svn_stream_t *stream; svn_txdelta_window_handler_t d_handler; void *d_baton; apr_size_t size; /* One sub-pool for each revision and one for each txdelta chunk. Note that the rev_pool must live during the following txdelta. */ rev_pool = svn_pool_create(pool); chunk_pool = svn_pool_create(pool); SVN_ERR(svn_ra_svn_write_cmd(sess_baton->conn, pool, "get-file-revs", "c(?r)(?r)", path, start, end)); /* Servers before 1.1 don't support this command. Check for this here. */ SVN_ERR(handle_unsupported_cmd(handle_auth_request(sess_baton, pool), _("'get-file-revs' not implemented"))); while (1) { svn_pool_clear(rev_pool); svn_pool_clear(chunk_pool); SVN_ERR(svn_ra_svn_read_item(sess_baton->conn, rev_pool, &item));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -