static svn_error_t * apply_textdelta(void *file_baton, const char *base_checksum, apr_pool_t *pool, svn_txdelta_window_handler_t *handler, void **handler_baton) { edit_baton_t *eb = file_baton; SVN_ERR(dav_svn__brigade_puts(eb->bb, eb->output, "<S:apply-textdelta")); if (base_checksum) SVN_ERR(dav_svn__brigade_printf(eb->bb, eb->output, " checksum=\"%s\">", base_checksum)); else SVN_ERR(dav_svn__brigade_puts(eb->bb, eb->output, ">")); svn_txdelta_to_svndiff3(handler, handler_baton, dav_svn__make_base64_output_stream(eb->bb, eb->output, pool), eb->svndiff_version, eb->compression_level, pool); eb->sending_textdelta = TRUE; return SVN_NO_ERROR; }
/* This implements the svn_repos_file_rev_handler2_t interface. */ static svn_error_t * file_rev_handler(void *baton, const char *path, svn_revnum_t revnum, apr_hash_t *rev_props, svn_boolean_t merged_revision, svn_txdelta_window_handler_t *window_handler, void **window_baton, apr_array_header_t *props, apr_pool_t *pool) { struct file_rev_baton *frb = baton; apr_pool_t *subpool = svn_pool_create(pool); apr_hash_index_t *hi; int i; SVN_ERR(maybe_send_header(frb)); SVN_ERR(dav_svn__brigade_printf(frb->bb, frb->output, "<S:file-rev path=\"%s\" rev=\"%ld\">" DEBUG_CR, apr_xml_quote_string(pool, path, 1), revnum)); /* Send rev props. */ for (hi = apr_hash_first(pool, rev_props); hi; hi = apr_hash_next(hi)) { const void *key; void *val; const char *pname; const svn_string_t *pval; svn_pool_clear(subpool); apr_hash_this(hi, &key, NULL, &val); pname = key; pval = val; SVN_ERR(send_prop(frb, "rev-prop", pname, pval, subpool)); } /* Send file prop changes. */ for (i = 0; i < props->nelts; ++i) { const svn_prop_t *prop = &APR_ARRAY_IDX(props, i, svn_prop_t); svn_pool_clear(subpool); if (prop->value) SVN_ERR(send_prop(frb, "set-prop", prop->name, prop->value, subpool)); else { /* Property was removed. */ SVN_ERR(dav_svn__brigade_printf(frb->bb, frb->output, "<S:remove-prop name=\"%s\"/>" DEBUG_CR, apr_xml_quote_string(subpool, prop->name, 1))); } } /* Send whether this was the result of a merge or not. */ if (merged_revision) SVN_ERR(dav_svn__brigade_puts(frb->bb, frb->output, "<S:merged-revision/>")); /* Maybe send text delta. */ if (window_handler) { svn_stream_t *base64_stream; base64_stream = dav_svn__make_base64_output_stream(frb->bb, frb->output, pool); svn_txdelta_to_svndiff3(&frb->window_handler, &frb->window_baton, base64_stream, frb->svndiff_version, frb->compression_level, pool); *window_handler = delta_window_handler; *window_baton = frb; /* Start the txdelta element wich will be terminated by the window handler together with the file-rev element. */ SVN_ERR(dav_svn__brigade_puts(frb->bb, frb->output, "<S:txdelta>")); } else /* No txdelta, so terminate the element here. */ SVN_ERR(dav_svn__brigade_puts(frb->bb, frb->output, "</S:file-rev>" DEBUG_CR)); svn_pool_destroy(subpool); return SVN_NO_ERROR; }