svn_error_t * svn_ra_serf__get_file_revs(svn_ra_session_t *ra_session, const char *path, svn_revnum_t start, svn_revnum_t end, svn_boolean_t include_merged_revisions, svn_file_rev_handler_t rev_handler, void *rev_handler_baton, apr_pool_t *pool) { blame_context_t *blame_ctx; svn_ra_serf__session_t *session = ra_session->priv; svn_ra_serf__handler_t *handler; svn_ra_serf__xml_context_t *xmlctx; const char *req_url; svn_revnum_t peg_rev; blame_ctx = apr_pcalloc(pool, sizeof(*blame_ctx)); blame_ctx->pool = pool; blame_ctx->path = path; blame_ctx->file_rev = rev_handler; blame_ctx->file_rev_baton = rev_handler_baton; blame_ctx->start = start; blame_ctx->end = end; blame_ctx->include_merged_revisions = include_merged_revisions; /* Since Subversion 1.8 we allow retrieving blames backwards. So we can't just unconditionally use end_rev as the peg revision as before */ if (end > start) peg_rev = end; else peg_rev = start; SVN_ERR(svn_ra_serf__get_stable_url(&req_url, NULL /* latest_revnum */, session, NULL /* url */, peg_rev, pool, pool)); xmlctx = svn_ra_serf__xml_context_create(blame_ttable, blame_opened, blame_closed, blame_cdata, blame_ctx, pool); handler = svn_ra_serf__create_expat_handler(session, xmlctx, NULL, pool); handler->method = "REPORT"; handler->path = req_url; handler->body_type = "text/xml"; handler->body_delegate = create_file_revs_body; handler->body_delegate_baton = blame_ctx; SVN_ERR(svn_ra_serf__context_run_one(handler, pool)); if (handler->sline.code != 200) return svn_error_trace(svn_ra_serf__unexpected_status(handler)); return SVN_NO_ERROR; }
svn_error_t * svn_ra_serf__list(svn_ra_session_t *ra_session, const char *path, svn_revnum_t revision, const apr_array_header_t *patterns, svn_depth_t depth, apr_uint32_t dirent_fields, svn_ra_dirent_receiver_t receiver, void *receiver_baton, apr_pool_t *scratch_pool) { list_context_t *list_ctx; svn_ra_serf__session_t *session = ra_session->priv; svn_ra_serf__handler_t *handler; svn_ra_serf__xml_context_t *xmlctx; const char *req_url; list_ctx = apr_pcalloc(scratch_pool, sizeof(*list_ctx)); list_ctx->pool = scratch_pool; list_ctx->receiver = receiver; list_ctx->receiver_baton = receiver_baton; list_ctx->path = path; list_ctx->revision = revision; list_ctx->patterns = patterns; list_ctx->depth = depth; list_ctx->dirent_fields = dirent_fields; list_ctx->props = svn_ra_serf__get_dirent_props(dirent_fields, session, scratch_pool); list_ctx->author_buf = svn_stringbuf_create_empty(scratch_pool); /* At this point, we may have a deleted file. So, we'll match ra_neon's * behavior and use the larger of start or end as our 'peg' rev. */ SVN_ERR(svn_ra_serf__get_stable_url(&req_url, NULL /* latest_revnum */, session, NULL /* url */, revision, scratch_pool, scratch_pool)); xmlctx = svn_ra_serf__xml_context_create(log_ttable, NULL, item_closed, NULL, list_ctx, scratch_pool); handler = svn_ra_serf__create_expat_handler(session, xmlctx, NULL, scratch_pool); handler->method = "REPORT"; handler->path = req_url; handler->body_delegate = create_list_body; handler->body_delegate_baton = list_ctx; handler->body_type = "text/xml"; SVN_ERR(svn_ra_serf__context_run_one(handler, scratch_pool)); if (handler->sline.code != 200) SVN_ERR(svn_ra_serf__unexpected_status(handler)); return SVN_NO_ERROR; }
svn_error_t * svn_ra_serf__get_file_revs(svn_ra_session_t *ra_session, const char *path, svn_revnum_t start, svn_revnum_t end, svn_boolean_t include_merged_revisions, svn_file_rev_handler_t rev_handler, void *rev_handler_baton, apr_pool_t *pool) { blame_context_t *blame_ctx; svn_ra_serf__session_t *session = ra_session->priv; svn_ra_serf__handler_t *handler; svn_ra_serf__xml_context_t *xmlctx; const char *req_url; svn_error_t *err; blame_ctx = apr_pcalloc(pool, sizeof(*blame_ctx)); blame_ctx->pool = pool; blame_ctx->path = path; blame_ctx->file_rev = rev_handler; blame_ctx->file_rev_baton = rev_handler_baton; blame_ctx->start = start; blame_ctx->end = end; blame_ctx->include_merged_revisions = include_merged_revisions; SVN_ERR(svn_ra_serf__get_stable_url(&req_url, NULL /* latest_revnum */, session, NULL /* conn */, NULL /* url */, end, pool, pool)); xmlctx = svn_ra_serf__xml_context_create(blame_ttable, blame_opened, blame_closed, blame_cdata, blame_ctx, pool); handler = svn_ra_serf__create_expat_handler(xmlctx, pool); handler->method = "REPORT"; handler->path = req_url; handler->body_type = "text/xml"; handler->body_delegate = create_file_revs_body; handler->body_delegate_baton = blame_ctx; handler->conn = session->conns[0]; handler->session = session; err = svn_ra_serf__context_run_one(handler, pool); err = svn_error_compose_create( svn_ra_serf__error_on_status(handler->sline, handler->path, handler->location), err); return svn_error_trace(err); }
svn_error_t * svn_ra_serf__get_locations(svn_ra_session_t *ra_session, apr_hash_t **locations, const char *path, svn_revnum_t peg_revision, const apr_array_header_t *location_revisions, apr_pool_t *pool) { loc_context_t *loc_ctx; svn_ra_serf__session_t *session = ra_session->priv; svn_ra_serf__handler_t *handler; svn_ra_serf__xml_context_t *xmlctx; const char *req_url; svn_error_t *err; loc_ctx = apr_pcalloc(pool, sizeof(*loc_ctx)); loc_ctx->pool = pool; loc_ctx->path = path; loc_ctx->peg_revision = peg_revision; loc_ctx->location_revisions = location_revisions; loc_ctx->paths = apr_hash_make(loc_ctx->pool); *locations = loc_ctx->paths; SVN_ERR(svn_ra_serf__get_stable_url(&req_url, NULL /* latest_revnum */, session, NULL /* conn */, NULL /* url */, peg_revision, pool, pool)); xmlctx = svn_ra_serf__xml_context_create(getloc_ttable, NULL, getloc_closed, NULL, loc_ctx, pool); handler = svn_ra_serf__create_expat_handler(xmlctx, pool); handler->method = "REPORT"; handler->path = req_url; handler->body_delegate = create_get_locations_body; handler->body_delegate_baton = loc_ctx; handler->body_type = "text/xml"; handler->conn = session->conns[0]; handler->session = session; err = svn_ra_serf__context_run_one(handler, pool); SVN_ERR(svn_error_compose_create( svn_ra_serf__error_on_status(handler->sline.code, req_url, handler->location), err)); return SVN_NO_ERROR; }
svn_error_t * svn_ra_serf__get_deleted_rev(svn_ra_session_t *session, const char *path, svn_revnum_t peg_revision, svn_revnum_t end_revision, svn_revnum_t *revision_deleted, apr_pool_t *pool) { drev_context_t *drev_ctx; svn_ra_serf__session_t *ras = session->priv; svn_ra_serf__handler_t *handler; svn_ra_serf__xml_context_t *xmlctx; const char *req_url; svn_error_t *err; drev_ctx = apr_pcalloc(pool, sizeof(*drev_ctx)); drev_ctx->path = path; drev_ctx->peg_revision = peg_revision; drev_ctx->end_revision = end_revision; drev_ctx->revision_deleted = revision_deleted; SVN_ERR(svn_ra_serf__get_stable_url(&req_url, NULL /* latest_revnum */, ras, NULL /* conn */, NULL /* url */, peg_revision, pool, pool)); xmlctx = svn_ra_serf__xml_context_create(getdrev_ttable, NULL, getdrev_closed, NULL, drev_ctx, pool); handler = svn_ra_serf__create_expat_handler(xmlctx, pool); handler->method = "REPORT"; handler->path = req_url; handler->body_type = "text/xml"; handler->body_delegate = create_getdrev_body; handler->body_delegate_baton = drev_ctx; handler->conn = ras->conns[0]; handler->session = ras; err = svn_ra_serf__context_run_one(handler, pool); /* Map status 501: Method Not Implemented to our not implemented error. 1.5.x servers and older don't support this report. */ if (handler->sline.code == 501) return svn_error_createf(SVN_ERR_RA_NOT_IMPLEMENTED, err, _("'%s' REPORT not implemented"), "get-deleted-rev"); SVN_ERR(err); return SVN_NO_ERROR; }