Author: hwright Date: Fri Feb 10 06:46:44 2012 New Revision: 1242695 URL: http://svn.apache.org/viewvc?rev=1242695&view=rev Log: On the fix-rdump-editor branch: And initial hack at cleaning some of the svnrdump editor usage up. Lots of tests still segfaulting (though I can't blame 'em).
* subversion/svnrdump/dump_editor.c (dir_baton): Add props and pool members. (file_baton): New. (dump_edit_baton): Remove props members. (open_root): Don't initialize removed members. (delete_entry, add_directory, open_directory, close_directory): Don't dump props. (add_file, open_file): Create and populate a file baton. (change_dir_prop): Use the dir baton set of props. (change_file_props): Use the file baton set of props. (apply_textdelta, close_file): Use file baton. Modified: subversion/branches/fix-rdump-editor/subversion/svnrdump/dump_editor.c Modified: subversion/branches/fix-rdump-editor/subversion/svnrdump/dump_editor.c URL: http://svn.apache.org/viewvc/subversion/branches/fix-rdump-editor/subversion/svnrdump/dump_editor.c?rev=1242695&r1=1242694&r2=1242695&view=diff ============================================================================== --- subversion/branches/fix-rdump-editor/subversion/svnrdump/dump_editor.c (original) +++ subversion/branches/fix-rdump-editor/subversion/svnrdump/dump_editor.c Fri Feb 10 06:46:44 2012 @@ -67,6 +67,45 @@ struct dir_baton they're full paths, because that's what the editor driver gives us, although they're all really within this directory. */ apr_hash_t *deleted_entries; + + /* Properties which were modified during change_file_prop + * or change_dir_prop. */ + apr_hash_t *props; + + /* Properties which were deleted during change_file_prop + * or change_dir_prop. */ + apr_hash_t *deleted_props; + + /* Pool for per-revision allocations */ + apr_pool_t *pool; +}; + +struct file_baton +{ + struct dump_edit_baton *eb; + + /* Properties which were modified during change_file_prop + * or change_dir_prop. */ + apr_hash_t *props; + + /* Properties which were deleted during change_file_prop + * or change_dir_prop. */ + apr_hash_t *deleted_props; + + const char *copyfrom_path; + svn_revnum_t copyfrom_rev; + + /* Pool for per-revision allocations */ + apr_pool_t *pool; + + /* Temporary file used for textdelta application along with its + absolute path; these two variables should be allocated in the + per-edit-session pool */ + const char *delta_abspath; + apr_file_t *delta_file; + + /* The checksum of the file the delta is being applied to */ + const char *base_checksum; }; /* A handler baton to be used in window_handler(). */ @@ -87,18 +126,6 @@ struct dump_edit_baton { /* Pool for per-revision allocations */ apr_pool_t *pool; - /* Properties which were modified during change_file_prop - * or change_dir_prop. */ - apr_hash_t *props; - - /* Properties which were deleted during change_file_prop - * or change_dir_prop. */ - apr_hash_t *deleted_props; - - /* Temporary buffer to write property hashes to in human-readable - * form. ### Is this really needed? */ - svn_stringbuf_t *propstring; - /* Temporary file used for textdelta application along with its absolute path; these two variables should be allocated in the per-edit-session pool */ @@ -419,9 +446,8 @@ open_root(void *edit_baton, /* Clear the per-revision pool after each revision */ svn_pool_clear(eb->pool); - eb->props = apr_hash_make(eb->pool); - eb->deleted_props = apr_hash_make(eb->pool); - eb->propstring = svn_stringbuf_create_empty(eb->pool); +/* eb->props = apr_hash_make(eb->pool); + eb->deleted_props = apr_hash_make(eb->pool);*/ *root_baton = make_dir_baton(NULL, NULL, SVN_INVALID_REVNUM, edit_baton, NULL, FALSE, eb->pool); @@ -441,9 +467,9 @@ delete_entry(const char *path, LDR_DBG(("delete_entry %s\n", path)); /* Some pending properties to dump? */ - SVN_ERR(do_dump_props(&pb->eb->propstring, pb->eb->stream, + /*SVN_ERR(do_dump_props(&pb->eb->propstring, pb->eb->stream, pb->eb->props, pb->eb->deleted_props, - &(pb->eb->dump_props), TRUE, pool, pool)); + &(pb->eb->dump_props), TRUE, pool, pool));*/ /* Some pending newlines to dump? */ SVN_ERR(do_dump_newlines(pb->eb, &(pb->eb->dump_newlines), pool)); @@ -475,9 +501,9 @@ add_directory(const char *path, pb, TRUE, pb->eb->pool); /* Some pending properties to dump? */ - SVN_ERR(do_dump_props(&pb->eb->propstring, pb->eb->stream, + /*SVN_ERR(do_dump_props(&pb->eb->propstring, pb->eb->stream, pb->eb->props, pb->eb->deleted_props, - &(pb->eb->dump_props), TRUE, pool, pool)); + &(pb->eb->dump_props), TRUE, pool, pool));*/ /* Some pending newlines to dump? */ SVN_ERR(do_dump_newlines(pb->eb, &(pb->eb->dump_newlines), pool)); @@ -522,9 +548,9 @@ open_directory(const char *path, LDR_DBG(("open_directory %s\n", path)); /* Some pending properties to dump? */ - SVN_ERR(do_dump_props(&pb->eb->propstring, pb->eb->stream, + /*SVN_ERR(do_dump_props(&pb->eb->propstring, pb->eb->stream, pb->eb->props, pb->eb->deleted_props, - &(pb->eb->dump_props), TRUE, pool, pool)); + &(pb->eb->dump_props), TRUE, pool, pool));*/ /* Some pending newlines to dump? */ SVN_ERR(do_dump_newlines(pb->eb, &(pb->eb->dump_newlines), pool)); @@ -556,9 +582,9 @@ close_directory(void *dir_baton, LDR_DBG(("close_directory %p\n", dir_baton)); /* Some pending properties to dump? */ - SVN_ERR(do_dump_props(&eb->propstring, eb->stream, + /*SVN_ERR(do_dump_props(&eb->propstring, eb->stream, eb->props, eb->deleted_props, - &(eb->dump_props), TRUE, pool, pool)); + &(eb->dump_props), TRUE, pool, pool));*/ /* Some pending newlines to dump? */ SVN_ERR(do_dump_newlines(eb, &(eb->dump_newlines), pool)); @@ -588,16 +614,12 @@ add_file(const char *path, struct dir_baton *pb = parent_baton; void *val; svn_boolean_t is_copy; + struct file_baton *fb = apr_pcalloc(pool, sizeof(*fb)); - LDR_DBG(("add_file %s\n", path)); - - /* Some pending properties to dump? */ - SVN_ERR(do_dump_props(&pb->eb->propstring, pb->eb->stream, - pb->eb->props, pb->eb->deleted_props, - &(pb->eb->dump_props), TRUE, pool, pool)); + fb->pool = pool; + fb->eb = pb->eb; - /* Some pending newlines to dump? */ - SVN_ERR(do_dump_newlines(pb->eb, &(pb->eb->dump_newlines), pool)); + LDR_DBG(("add_file %s\n", path)); /* This might be a replacement -- is the path already deleted? */ val = apr_hash_get(pb->deleted_entries, path, APR_HASH_KEY_STRING); @@ -620,7 +642,7 @@ add_file(const char *path, /* Build a nice file baton to pass to change_file_prop and apply_textdelta */ - *file_baton = pb->eb; + *file_baton = fb; return SVN_NO_ERROR; } @@ -633,36 +655,23 @@ open_file(const char *path, void **file_baton) { struct dir_baton *pb = parent_baton; - const char *copyfrom_path = NULL; - svn_revnum_t copyfrom_rev = SVN_INVALID_REVNUM; - - LDR_DBG(("open_file %s\n", path)); + struct file_baton *fb = apr_pcalloc(pool, sizeof(*fb)); - /* Some pending properties to dump? */ - SVN_ERR(do_dump_props(&pb->eb->propstring, pb->eb->stream, - pb->eb->props, pb->eb->deleted_props, - &(pb->eb->dump_props), TRUE, pool, pool)); + fb->pool = pool; + fb->eb = pb->eb; - /* Some pending newlines to dump? */ - SVN_ERR(do_dump_newlines(pb->eb, &(pb->eb->dump_newlines), pool)); + LDR_DBG(("open_file %s\n", path)); /* If the parent directory has explicit copyfrom path and rev, record the same for this one. */ if (ARE_VALID_COPY_ARGS(pb->copyfrom_path, pb->copyfrom_rev)) { - copyfrom_path = svn_relpath_join(pb->copyfrom_path, - svn_relpath_basename(path, NULL), - pb->eb->pool); - copyfrom_rev = pb->copyfrom_rev; + fb->copyfrom_path = svn_relpath_join(pb->copyfrom_path, + svn_relpath_basename(path, NULL), + fb->pool); + fb->copyfrom_rev = pb->copyfrom_rev; } - SVN_ERR(dump_node(pb->eb, path, svn_node_file, svn_node_action_change, - FALSE, copyfrom_path, copyfrom_rev, pool)); - - /* Build a nice file baton to pass to change_file_prop and - apply_textdelta */ - *file_baton = pb->eb; - return SVN_NO_ERROR; } @@ -679,11 +688,13 @@ change_dir_prop(void *parent_baton, if (svn_property_kind(NULL, name) != svn_prop_regular_kind) return SVN_NO_ERROR; + /* The fact that we're here means this node has information, it isn't just + being opened for the sake of reading its children. */ if (value) - apr_hash_set(db->eb->props, apr_pstrdup(db->eb->pool, name), + apr_hash_set(db->props, apr_pstrdup(db->eb->pool, name), APR_HASH_KEY_STRING, svn_string_dup(value, db->eb->pool)); else - apr_hash_set(db->eb->deleted_props, apr_pstrdup(db->eb->pool, name), + apr_hash_set(db->deleted_props, apr_pstrdup(db->eb->pool, name), APR_HASH_KEY_STRING, ""); if (! db->written_out) @@ -700,11 +711,6 @@ change_dir_prop(void *parent_baton, db->written_out = TRUE; } - /* Make sure we eventually output the props, and disable printing - a couple of extra newlines */ - db->eb->dump_newlines = FALSE; - db->eb->dump_props = TRUE; - return SVN_NO_ERROR; } @@ -714,7 +720,7 @@ change_file_prop(void *file_baton, const svn_string_t *value, apr_pool_t *pool) { - struct dump_edit_baton *eb = file_baton; + struct file_baton *fb = file_baton; LDR_DBG(("change_file_prop %p\n", file_baton)); @@ -722,16 +728,21 @@ change_file_prop(void *file_baton, return SVN_NO_ERROR; if (value) - apr_hash_set(eb->props, apr_pstrdup(eb->pool, name), - APR_HASH_KEY_STRING, svn_string_dup(value, eb->pool)); + { + if (!fb->props) + fb->props = apr_hash_make(fb->pool); + + apr_hash_set(fb->props, apr_pstrdup(fb->pool, name), + APR_HASH_KEY_STRING, svn_string_dup(value, fb->pool)); + } else - apr_hash_set(eb->deleted_props, apr_pstrdup(eb->pool, name), - APR_HASH_KEY_STRING, ""); + { + if (!fb->deleted_props) + fb->deleted_props = apr_hash_make(fb->pool); - /* Dump the property headers and wait; close_file might need - to write text headers too depending on whether - apply_textdelta is called */ - eb->dump_props = TRUE; + apr_hash_set(fb->deleted_props, apr_pstrdup(fb->pool, name), + APR_HASH_KEY_STRING, ""); + } return SVN_NO_ERROR; } @@ -758,26 +769,25 @@ apply_textdelta(void *file_baton, const svn_txdelta_window_handler_t *handler, void **handler_baton) { - struct dump_edit_baton *eb = file_baton; + struct file_baton *fb = file_baton; /* Custom handler_baton allocated in a separate pool */ struct handler_baton *hb; svn_stream_t *delta_filestream; - hb = apr_pcalloc(eb->pool, sizeof(*hb)); + hb = apr_pcalloc(fb->pool, sizeof(*hb)); LDR_DBG(("apply_textdelta %p\n", file_baton)); /* Use a temporary file to measure the Text-content-length */ - delta_filestream = svn_stream_from_aprfile2(eb->delta_file, TRUE, pool); + delta_filestream = svn_stream_from_aprfile2(fb->delta_file, TRUE, pool); /* Prepare to write the delta to the delta_filestream */ svn_txdelta_to_svndiff3(&(hb->apply_handler), &(hb->apply_baton), delta_filestream, 0, SVN_DELTA_COMPRESSION_LEVEL_DEFAULT, pool); - eb->dump_text = TRUE; - eb->base_checksum = apr_pstrdup(eb->pool, base_checksum); + fb->base_checksum = apr_pstrdup(fb->pool, base_checksum); SVN_ERR(svn_stream_close(delta_filestream)); /* The actual writing takes place when this function has @@ -794,16 +804,17 @@ close_file(void *file_baton, const char *text_checksum, apr_pool_t *pool) { - struct dump_edit_baton *eb = file_baton; + struct file_baton *fb = file_baton; + struct dump_edit_baton *eb = fb->eb; apr_finfo_t *info = apr_pcalloc(pool, sizeof(apr_finfo_t)); LDR_DBG(("close_file %p\n", file_baton)); /* Some pending properties to dump? Dump just the headers- dump the props only after dumping the text headers too (if present) */ - SVN_ERR(do_dump_props(&eb->propstring, eb->stream, + /*SVN_ERR(do_dump_props(&eb->propstring, eb->stream, eb->props, eb->deleted_props, - &(eb->dump_props), FALSE, pool, pool)); + &(eb->dump_props), FALSE, pool, pool));*/ /* Dump the text headers */ if (eb->dump_text) @@ -841,28 +852,16 @@ close_file(void *file_baton, /* Content-length: 1549 */ /* If both text and props are absent, skip this header */ - if (eb->dump_props) + /*if (eb->dump_props) SVN_ERR(svn_stream_printf(eb->stream, pool, SVN_REPOS_DUMPFILE_CONTENT_LENGTH ": %ld\n\n", - (unsigned long)info->size + eb->propstring->len)); - else if (eb->dump_text) + (unsigned long)info->size + eb->propstring->len));*/ + /*else if (eb->dump_text) SVN_ERR(svn_stream_printf(eb->stream, pool, SVN_REPOS_DUMPFILE_CONTENT_LENGTH ": %ld\n\n", - (unsigned long)info->size)); - - /* Dump the props now */ - if (eb->dump_props) - { - SVN_ERR(svn_stream_write(eb->stream, eb->propstring->data, - &(eb->propstring->len))); - - /* Cleanup */ - eb->dump_props = FALSE; - SVN_ERR(svn_hash__clear(eb->props, eb->pool)); - SVN_ERR(svn_hash__clear(eb->deleted_props, eb->pool)); - } + (unsigned long)info->size));*/ /* Dump the text */ if (eb->dump_text)