I know you're just shifting existing code, but that header should use svn_stringbuf_createf(), or a series of appends. A stream is overkill. On Feb 9, 2012 5:29 PM, <hwri...@apache.org> wrote:
> Author: hwright > Date: Thu Feb 9 22:29:06 2012 > New Revision: 1242567 > > URL: http://svn.apache.org/viewvc?rev=1242567&view=rev > Log: > Start to tease apart some of the svnrdump knot by introducing a helper > function > which generates the property content and headers. > > * subversion/svnrdump/dump_editor.c > (get_props_content): New. > (do_dump_props): Use the above helper. > > Modified: > subversion/trunk/subversion/svnrdump/dump_editor.c > > Modified: subversion/trunk/subversion/svnrdump/dump_editor.c > URL: > http://svn.apache.org/viewvc/subversion/trunk/subversion/svnrdump/dump_editor.c?rev=1242567&r1=1242566&r2=1242567&view=diff > > ============================================================================== > --- subversion/trunk/subversion/svnrdump/dump_editor.c (original) > +++ subversion/trunk/subversion/svnrdump/dump_editor.c Thu Feb 9 22:29:06 > 2012 > @@ -169,6 +169,46 @@ make_dir_baton(const char *path, > return new_db; > } > > +/* Return in *HEADER and *CONTENT the headers and content for PROPS. */ > +static svn_error_t * > +get_props_content(svn_stringbuf_t **header, > + svn_stringbuf_t **content, > + apr_hash_t *props, > + apr_hash_t *deleted_props, > + apr_pool_t *result_pool, > + apr_pool_t *scratch_pool) > +{ > + svn_stream_t *content_stream; > + svn_stream_t *header_stream; > + apr_hash_t *normal_props; > + > + *content = svn_stringbuf_create_empty(result_pool); > + *header = svn_stringbuf_create_empty(result_pool); > + > + content_stream = svn_stream_from_stringbuf(*content, scratch_pool); > + header_stream = svn_stream_from_stringbuf(*header, scratch_pool); > + > + SVN_ERR(svn_rdump__normalize_props(&normal_props, props, scratch_pool)); > + SVN_ERR(svn_hash_write_incremental(normal_props, deleted_props, > + content_stream, "PROPS-END", > + scratch_pool)); > + SVN_ERR(svn_stream_close(content_stream)); > + > + /* Prop-delta: true */ > + SVN_ERR(svn_stream_printf(header_stream, scratch_pool, > + SVN_REPOS_DUMPFILE_PROP_DELTA > + ": true\n")); > + > + /* Prop-content-length: 193 */ > + SVN_ERR(svn_stream_printf(header_stream, scratch_pool, > + SVN_REPOS_DUMPFILE_PROP_CONTENT_LENGTH > + ": %" APR_SIZE_T_FMT "\n", (*content)->len)); > + > + SVN_ERR(svn_stream_close(header_stream)); > + > + return SVN_NO_ERROR; > +} > + > /* Extract and dump properties stored in edit baton EB, using POOL for > * any temporary allocations. If TRIGGER_VAR is not NULL, it is set to > FALSE. > * Unless DUMP_DATA_TOO is set, only property headers are dumped. > @@ -179,28 +219,21 @@ do_dump_props(struct dump_edit_baton *eb > svn_boolean_t dump_data_too, > apr_pool_t *pool) > { > - svn_stream_t *propstream; > - apr_hash_t *normal_props; > + svn_stringbuf_t *header; > + svn_stringbuf_t *content; > + apr_size_t len; > > if (trigger_var && !*trigger_var) > return SVN_NO_ERROR; > > - SVN_ERR(svn_rdump__normalize_props(&normal_props, eb->props, eb->pool)); > - svn_stringbuf_setempty(eb->propstring); > - propstream = svn_stream_from_stringbuf(eb->propstring, eb->pool); > - SVN_ERR(svn_hash_write_incremental(normal_props, eb->deleted_props, > - propstream, "PROPS-END", pool)); > - SVN_ERR(svn_stream_close(propstream)); > + SVN_ERR(get_props_content(&header, &content, eb->props, > eb->deleted_props, > + pool, pool)); > > - /* Prop-delta: true */ > - SVN_ERR(svn_stream_printf(eb->stream, pool, > - SVN_REPOS_DUMPFILE_PROP_DELTA > - ": true\n")); > + /* This is a wacky side-effect of this function. */ > + eb->propstring = svn_stringbuf_dup(content, eb->pool); > > - /* Prop-content-length: 193 */ > - SVN_ERR(svn_stream_printf(eb->stream, pool, > - SVN_REPOS_DUMPFILE_PROP_CONTENT_LENGTH > - ": %" APR_SIZE_T_FMT "\n", > eb->propstring->len)); > + len = header->len; > + SVN_ERR(svn_stream_write(eb->stream, header->data, &len)); > > if (dump_data_too) > { > @@ -208,11 +241,10 @@ do_dump_props(struct dump_edit_baton *eb > SVN_ERR(svn_stream_printf(eb->stream, pool, > SVN_REPOS_DUMPFILE_CONTENT_LENGTH > ": %" APR_SIZE_T_FMT "\n\n", > - eb->propstring->len)); > + content->len)); > > - /* The properties. */ > - SVN_ERR(svn_stream_write(eb->stream, eb->propstring->data, > - &(eb->propstring->len))); > + len = content->len; > + SVN_ERR(svn_stream_write(eb->stream, content->data, &len)); > > /* No text is going to be dumped. Write a couple of newlines and > wait for the next node/ revision. */ > > >