Author: stsp Date: Thu Jul 22 11:27:22 2010 New Revision: 966585 URL: http://svn.apache.org/viewvc?rev=966585&view=rev Log: Switch svnrdump to using the generic svn_hash_write2() and svn_hash_write_incremental() functions instead of a custom helper function. This should make svnrdump's way of writing properties match the output of svnadmin dump.
Also fix a segmentation fault that occured when dumping deleted properties. * subversion/svnrdump/util.c (write_hash_to_stringbuf): Remove this helper. (dump_props): Use svn_hash_write_incremental() instead of removed helper. * subversion/svnrdump/dump_editor.c (change_dir_prop, change_file_prop): Instead of representing deleted property values in eb->del_properties with (void*) 0x01, just use an empty string as value. Combined with switching to svn_hash_write_incremental(), this fixes a crash when dumping deleted properties. Also, change_file_prop() was putting deleted properties into the wrong hash table, so fix that. * subversion/svnrdump/svnrdump.c (replay_revstart): Replace call to write_hash_to_stringbuf() with call to svn_hash_write2(). Modified: subversion/trunk/subversion/svnrdump/dump_editor.c subversion/trunk/subversion/svnrdump/svnrdump.c subversion/trunk/subversion/svnrdump/util.c Modified: subversion/trunk/subversion/svnrdump/dump_editor.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/svnrdump/dump_editor.c?rev=966585&r1=966584&r2=966585&view=diff ============================================================================== --- subversion/trunk/subversion/svnrdump/dump_editor.c (original) +++ subversion/trunk/subversion/svnrdump/dump_editor.c Thu Jul 22 11:27:22 2010 @@ -441,10 +441,12 @@ change_dir_prop(void *parent_baton, if (svn_property_kind(NULL, name) != svn_prop_regular_kind) return SVN_NO_ERROR; - value ? apr_hash_set(db->eb->properties, apr_pstrdup(pool, name), - APR_HASH_KEY_STRING, svn_string_dup(value, pool)) : + if (value) + apr_hash_set(db->eb->properties, apr_pstrdup(pool, name), + APR_HASH_KEY_STRING, svn_string_dup(value, pool)); + else apr_hash_set(db->eb->del_properties, apr_pstrdup(pool, name), - APR_HASH_KEY_STRING, (void *)0x1); + APR_HASH_KEY_STRING, ""); if (! db->written_out) { /* If db->written_out is set, it means that the node information @@ -474,9 +476,13 @@ change_file_prop(void *file_baton, if (svn_property_kind(NULL, name) != svn_prop_regular_kind) return SVN_NO_ERROR; - apr_hash_set(eb->properties, apr_pstrdup(pool, name), - APR_HASH_KEY_STRING, value ? - svn_string_dup(value, pool): (void *)0x1); + if (value) + apr_hash_set(eb->properties, apr_pstrdup(pool, name), + APR_HASH_KEY_STRING, svn_string_dup(value, pool)); + else + apr_hash_set(eb->del_properties, apr_pstrdup(pool, name), + APR_HASH_KEY_STRING, ""); + /* Dump the property headers and wait; close_file might need to write text headers too depending on whether apply_textdelta is called */ Modified: subversion/trunk/subversion/svnrdump/svnrdump.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/svnrdump/svnrdump.c?rev=966585&r1=966584&r2=966585&view=diff ============================================================================== --- subversion/trunk/subversion/svnrdump/svnrdump.c (original) +++ subversion/trunk/subversion/svnrdump/svnrdump.c Thu Jul 22 11:27:22 2010 @@ -25,10 +25,12 @@ #include "svn_pools.h" #include "svn_cmdline.h" #include "svn_client.h" +#include "svn_hash.h" #include "svn_ra.h" #include "svn_repos.h" #include "svn_path.h" #include "svn_private_config.h" +#include "svn_string.h" #include "svnrdump.h" #include "dump_editor.h" @@ -43,8 +45,9 @@ replay_revstart(svn_revnum_t revision, { struct replay_baton *rb = replay_baton; /* First, dump the revision properties. */ - svn_stringbuf_t *propstring = svn_stringbuf_create("", pool); + svn_stringbuf_t *propstring; svn_stream_t *stdout_stream; + svn_stream_t *revprop_stream; svn_stream_for_stdout(&stdout_stream, pool); @@ -52,8 +55,10 @@ replay_revstart(svn_revnum_t revision, SVN_ERR(svn_stream_printf(stdout_stream, pool, SVN_REPOS_DUMPFILE_REVISION_NUMBER ": %ld\n", revision)); - write_hash_to_stringbuf(rev_props, FALSE, &propstring, pool); - svn_stringbuf_appendbytes(propstring, "PROPS-END\n", 10); + propstring = svn_stringbuf_create_ensure(0, pool); + revprop_stream = svn_stream_from_stringbuf(propstring, pool); + SVN_ERR(svn_hash_write2(rev_props, revprop_stream, "PROPS-END", pool)); + SVN_ERR(svn_stream_close(revprop_stream)); /* Prop-content-length: 13 */ SVN_ERR(svn_stream_printf(stdout_stream, pool, Modified: subversion/trunk/subversion/svnrdump/util.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/svnrdump/util.c?rev=966585&r1=966584&r2=966585&view=diff ============================================================================== --- subversion/trunk/subversion/svnrdump/util.c (original) +++ subversion/trunk/subversion/svnrdump/util.c Thu Jul 22 11:27:22 2010 @@ -26,70 +26,23 @@ #include "svnrdump.h" -void -write_hash_to_stringbuf(apr_hash_t *properties, - svn_boolean_t deleted, - svn_stringbuf_t **strbuf, - apr_pool_t *pool) -{ - apr_hash_index_t *this; - const void *key; - void *val; - apr_ssize_t keylen; - svn_string_t *value; - - for (this = apr_hash_first(pool, properties); this; - this = apr_hash_next(this)) { - apr_hash_this(this, &key, &keylen, &val); - value = val; - - /* Key corresponds to the property name and value corresponds to - the property itself. As per the dumpfilev3 specification, only - write "D <propname>" and don't write <propvalue> for deleted - properties */ - - if (!deleted) - svn_stringbuf_appendcstr(*strbuf, - apr_psprintf(pool, "K %" APR_SSIZE_T_FMT "\n", - keylen)); - else - svn_stringbuf_appendcstr(*strbuf, - apr_psprintf(pool, "D %" APR_SSIZE_T_FMT "\n", - keylen)); - - svn_stringbuf_appendbytes(*strbuf, (const char *) key, keylen); - svn_stringbuf_appendbytes(*strbuf, "\n", 1); - - if (!deleted) { - svn_stringbuf_appendcstr(*strbuf, - apr_psprintf(pool, "V %" APR_SIZE_T_FMT "\n", - value->len)); - - svn_stringbuf_appendbytes(*strbuf, value->data, value->len); - svn_stringbuf_appendbytes(*strbuf, "\n", 1); - } - } -} - svn_error_t * dump_props(struct dump_edit_baton *eb, svn_boolean_t *trigger_var, svn_boolean_t dump_data_too, apr_pool_t *pool) { + svn_stream_t *propstream; + if (trigger_var && !*trigger_var) return SVN_NO_ERROR; - /* Build up a string buffer to print. */ svn_stringbuf_setempty(eb->propstring); - write_hash_to_stringbuf(eb->properties, - FALSE, - &(eb->propstring), eb->pool); - write_hash_to_stringbuf(eb->del_properties, - TRUE, - &(eb->propstring), eb->pool); - svn_stringbuf_appendbytes(eb->propstring, "PROPS-END\n", 10); - + propstream = svn_stream_from_stringbuf(eb->propstring, eb->pool); + SVN_ERR(svn_hash_write_incremental(eb->properties, eb->del_properties, + propstream, "PROPS-END", pool)); + SVN_ERR(svn_stream_close(propstream)); + /* Prop-delta: true */ SVN_ERR(svn_stream_printf(eb->stream, pool, SVN_REPOS_DUMPFILE_PROP_DELTA