Author: gstein Date: Sun May 9 23:41:01 2010 New Revision: 942631 URL: http://svn.apache.org/viewvc?rev=942631&view=rev Log: Convert all the old loggy functions to build/return a work item rather than directly install it into the queue. Adjust all callers to immediately add the work item to the queue (future revisions may defer the install).
* subversion/libsvn_wc/log.h: (svn_wc__loggy_delete_entry, svn_wc__loggy_delete_lock, svn_wc__loggy_entry_modify, svn_wc__loggy_move, svn_wc__loggy_set_entry_timestamp_from_wc, svn_wc__loggy_set_entry_working_size_from_wc, svn_wc__loggy_set_timestamp): add a WORK_ITEM return parameter * subversion/libsvn_wc/log.c: (svn_wc__loggy_delete_entry, svn_wc__loggy_delete_lock, svn_wc__loggy_entry_modify, svn_wc__loggy_move, svn_wc__loggy_set_entry_timestamp_from_wc, svn_wc__loggy_set_entry_working_size_from_wc, svn_wc__loggy_set_timestamp): add a WORK_ITEM return parameter. change call to wq_add_loggy into wq_build_loggy. * subversion/libsvn_wc/workqueue.h: (svn_wc__wq_add_loggy): renamed to ... (svn_wc__wq_build_loggy): ... this. added a WORK_ITEM return param. note conditions on the allocation lifetime of the params. * subversion/libsvn_wc/workqueue.c: (svn_wc__wq_add_loggy): renamed to ... (svn_wc__wq_build_loggy): ... this. added a WORK_ITEM return param. construct and return the work item. * subversion/libsvn_wc/adm_ops.c: (process_committed_leaf): immediately add the work item returned by loggy_delete_lock to the workqueue. * subversion/libsvn_wc/merge.c: (save_merge_result, preserve_pre_merge_files, merge_binary_file): add work items returned by loggy functions to the workqueue. * subversion/libsvn_wc/props.c: (svn_wc__merge_props): add the loggy_entry_modify's returned work item to the workqueue. * subversion/libsvn_wc/update_editor.c: (do_entry_deletion, add_directory, open_directory, add_file, open_file, merge_file, svn_wc_add_repos_file4): add work items returned by loggy functions to the workqueue. Modified: subversion/trunk/subversion/libsvn_wc/adm_ops.c subversion/trunk/subversion/libsvn_wc/log.c subversion/trunk/subversion/libsvn_wc/log.h subversion/trunk/subversion/libsvn_wc/merge.c subversion/trunk/subversion/libsvn_wc/props.c subversion/trunk/subversion/libsvn_wc/update_editor.c subversion/trunk/subversion/libsvn_wc/workqueue.c subversion/trunk/subversion/libsvn_wc/workqueue.h Modified: subversion/trunk/subversion/libsvn_wc/adm_ops.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/adm_ops.c?rev=942631&r1=942630&r2=942631&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_wc/adm_ops.c (original) +++ subversion/trunk/subversion/libsvn_wc/adm_ops.c Sun May 9 23:41:01 2010 @@ -445,8 +445,13 @@ process_committed_leaf(svn_wc__db_t *db, } if (!no_unlock) - SVN_ERR(svn_wc__loggy_delete_lock(db, adm_abspath, - local_abspath, scratch_pool)); + { + svn_skel_t *work_item; + + SVN_ERR(svn_wc__loggy_delete_lock(&work_item, db, adm_abspath, + local_abspath, scratch_pool)); + SVN_ERR(svn_wc__db_wq_add(db, adm_abspath, work_item, scratch_pool)); + } /* Set TMP_TEXT_BASE_ABSPATH to the new text base to be installed, if any. */ { Modified: subversion/trunk/subversion/libsvn_wc/log.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/log.c?rev=942631&r1=942630&r2=942631&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_wc/log.c (original) +++ subversion/trunk/subversion/libsvn_wc/log.c Sun May 9 23:41:01 2010 @@ -666,12 +666,13 @@ loggy_path(const char **relpath, svn_error_t * -svn_wc__loggy_translated_file(svn_wc__db_t *db, +svn_wc__loggy_translated_file(svn_skel_t **work_item, + svn_wc__db_t *db, const char *adm_abspath, const char *dst_abspath, const char *src_abspath, const char *versioned_abspath, - apr_pool_t *scratch_pool) + apr_pool_t *result_pool) { const char *loggy_path1; const char *loggy_path2; @@ -683,83 +684,89 @@ svn_wc__loggy_translated_file(svn_wc__db SVN_ERR_ASSERT(svn_dirent_is_absolute(src_abspath)); SVN_ERR_ASSERT(svn_dirent_is_absolute(versioned_abspath)); - SVN_ERR(loggy_path(&loggy_path1, src_abspath, adm_abspath, scratch_pool)); - SVN_ERR(loggy_path(&loggy_path2, dst_abspath, adm_abspath, scratch_pool)); + SVN_ERR(loggy_path(&loggy_path1, src_abspath, adm_abspath, result_pool)); + SVN_ERR(loggy_path(&loggy_path2, dst_abspath, adm_abspath, result_pool)); SVN_ERR(loggy_path(&loggy_path3, versioned_abspath, adm_abspath, - scratch_pool)); + result_pool)); - svn_xml_make_open_tag(&log_accum, scratch_pool, svn_xml_self_closing, + svn_xml_make_open_tag(&log_accum, result_pool, svn_xml_self_closing, SVN_WC__LOG_CP_AND_TRANSLATE, SVN_WC__LOG_ATTR_NAME, loggy_path1, SVN_WC__LOG_ATTR_DEST, loggy_path2, SVN_WC__LOG_ATTR_ARG_2, loggy_path3, NULL); - return svn_error_return(svn_wc__wq_add_loggy(db, adm_abspath, log_accum, - scratch_pool)); + return svn_error_return(svn_wc__wq_build_loggy(work_item, + db, adm_abspath, log_accum, + result_pool)); } svn_error_t * -svn_wc__loggy_delete_entry(svn_wc__db_t *db, +svn_wc__loggy_delete_entry(svn_skel_t **work_item, + svn_wc__db_t *db, const char *adm_abspath, const char *local_abspath, svn_revnum_t revision, svn_wc__db_kind_t kind, - apr_pool_t *scratch_pool) + apr_pool_t *result_pool) { const char *loggy_path1; svn_stringbuf_t *log_accum = NULL; SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath)); - SVN_ERR(loggy_path(&loggy_path1, local_abspath, adm_abspath, scratch_pool)); - svn_xml_make_open_tag(&log_accum, scratch_pool, svn_xml_self_closing, + SVN_ERR(loggy_path(&loggy_path1, local_abspath, adm_abspath, result_pool)); + svn_xml_make_open_tag(&log_accum, result_pool, svn_xml_self_closing, SVN_WC__LOG_DELETE_ENTRY, SVN_WC__LOG_ATTR_NAME, loggy_path1, SVN_WC__LOG_ATTR_REVISION, - apr_psprintf(scratch_pool, "%ld", revision), + apr_psprintf(result_pool, "%ld", revision), SVN_WC__LOG_ATTR_KIND, kind == svn_wc__db_kind_dir ? "dir" : "file", NULL); - return svn_error_return(svn_wc__wq_add_loggy(db, adm_abspath, log_accum, - scratch_pool)); + return svn_error_return(svn_wc__wq_build_loggy(work_item, + db, adm_abspath, log_accum, + result_pool)); } svn_error_t * -svn_wc__loggy_delete_lock(svn_wc__db_t *db, +svn_wc__loggy_delete_lock(svn_skel_t **work_item, + svn_wc__db_t *db, const char *adm_abspath, const char *local_abspath, - apr_pool_t *scratch_pool) + apr_pool_t *result_pool) { const char *loggy_path1; svn_stringbuf_t *log_accum = NULL; SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath)); - SVN_ERR(loggy_path(&loggy_path1, local_abspath, adm_abspath, scratch_pool)); - svn_xml_make_open_tag(&log_accum, scratch_pool, svn_xml_self_closing, + SVN_ERR(loggy_path(&loggy_path1, local_abspath, adm_abspath, result_pool)); + svn_xml_make_open_tag(&log_accum, result_pool, svn_xml_self_closing, SVN_WC__LOG_DELETE_LOCK, SVN_WC__LOG_ATTR_NAME, loggy_path1, NULL); - return svn_error_return(svn_wc__wq_add_loggy(db, adm_abspath, log_accum, - scratch_pool)); + return svn_error_return(svn_wc__wq_build_loggy(work_item, + db, adm_abspath, log_accum, + result_pool)); } svn_error_t * -svn_wc__loggy_entry_modify(svn_wc__db_t *db, +svn_wc__loggy_entry_modify(svn_skel_t **work_item, + svn_wc__db_t *db, const char *adm_abspath, const char *local_abspath, const svn_wc_entry_t *entry, apr_uint64_t modify_flags, - apr_pool_t *scratch_pool) + apr_pool_t *result_pool) { svn_stringbuf_t *log_accum = NULL; const char *loggy_path1; - apr_hash_t *prop_hash = apr_hash_make(scratch_pool); + apr_hash_t *prop_hash = apr_hash_make(result_pool); SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath)); SVN_ERR_ASSERT(modify_flags != 0); @@ -815,7 +822,7 @@ svn_wc__loggy_entry_modify(svn_wc__db_t ADD_ENTRY_ATTR(SVN_WC__ENTRY_MODIFY_COPYFROM_REV, SVN_WC__ENTRY_ATTR_COPYFROM_REV, - apr_psprintf(scratch_pool, "%ld", entry->copyfrom_rev)); + apr_psprintf(result_pool, "%ld", entry->copyfrom_rev)); if (modify_flags & SVN_WC__ENTRY_MODIFY_CONFLICT_OLD) SVN_ERR_ASSERT(entry->conflict_old != NULL); @@ -843,7 +850,7 @@ svn_wc__loggy_entry_modify(svn_wc__db_t SVN_ERR_ASSERT(entry->text_time == 0); ADD_ENTRY_ATTR(SVN_WC__ENTRY_MODIFY_TEXT_TIME, SVN_WC__ENTRY_ATTR_TEXT_TIME, - svn_time_to_cstring(entry->text_time, scratch_pool)); + svn_time_to_cstring(entry->text_time, result_pool)); ADD_ENTRY_ATTR(SVN_WC__ENTRY_MODIFY_CHECKSUM, SVN_WC__ENTRY_ATTR_CHECKSUM, @@ -853,32 +860,34 @@ svn_wc__loggy_entry_modify(svn_wc__db_t SVN_ERR_ASSERT(entry->working_size == SVN_WC_ENTRY_WORKING_SIZE_UNKNOWN); ADD_ENTRY_ATTR(SVN_WC__ENTRY_MODIFY_WORKING_SIZE, SVN_WC__ENTRY_ATTR_WORKING_SIZE, - apr_psprintf(scratch_pool, "%" APR_OFF_T_FMT, + apr_psprintf(result_pool, "%" APR_OFF_T_FMT, entry->working_size)); #undef ADD_ENTRY_ATTR SVN_ERR_ASSERT(apr_hash_count(prop_hash) != 0); - SVN_ERR(loggy_path(&loggy_path1, local_abspath, adm_abspath, scratch_pool)); + SVN_ERR(loggy_path(&loggy_path1, local_abspath, adm_abspath, result_pool)); apr_hash_set(prop_hash, SVN_WC__LOG_ATTR_NAME, APR_HASH_KEY_STRING, loggy_path1); - svn_xml_make_open_tag_hash(&log_accum, scratch_pool, + svn_xml_make_open_tag_hash(&log_accum, result_pool, svn_xml_self_closing, SVN_WC__LOG_MODIFY_ENTRY, prop_hash); - return svn_error_return(svn_wc__wq_add_loggy(db, adm_abspath, log_accum, - scratch_pool)); + return svn_error_return(svn_wc__wq_build_loggy(work_item, + db, adm_abspath, log_accum, + result_pool)); } svn_error_t * -svn_wc__loggy_move(svn_wc__db_t *db, +svn_wc__loggy_move(svn_skel_t **work_item, + svn_wc__db_t *db, const char *adm_abspath, const char *src_abspath, const char *dst_abspath, - apr_pool_t *scratch_pool) + apr_pool_t *result_pool) { svn_stringbuf_t *log_accum = NULL; const char *loggy_path1; @@ -888,16 +897,16 @@ svn_wc__loggy_move(svn_wc__db_t *db, SVN_ERR_ASSERT(svn_dirent_is_absolute(src_abspath)); SVN_ERR_ASSERT(svn_dirent_is_absolute(dst_abspath)); - SVN_ERR(loggy_path(&loggy_path1, src_abspath, adm_abspath, scratch_pool)); - SVN_ERR(loggy_path(&loggy_path2, dst_abspath, adm_abspath, scratch_pool)); + SVN_ERR(loggy_path(&loggy_path1, src_abspath, adm_abspath, result_pool)); + SVN_ERR(loggy_path(&loggy_path2, dst_abspath, adm_abspath, result_pool)); - SVN_ERR(svn_io_check_path(src_abspath, &kind, scratch_pool)); + SVN_ERR(svn_io_check_path(src_abspath, &kind, result_pool)); /* ### idiocy of the old world. the file better exist, if we're asking ### to do some work with it. */ SVN_ERR_ASSERT(kind != svn_node_none); - svn_xml_make_open_tag(&log_accum, scratch_pool, + svn_xml_make_open_tag(&log_accum, result_pool, svn_xml_self_closing, SVN_WC__LOG_MV, SVN_WC__LOG_ATTR_NAME, @@ -906,25 +915,27 @@ svn_wc__loggy_move(svn_wc__db_t *db, loggy_path2, NULL); - return svn_error_return(svn_wc__wq_add_loggy(db, adm_abspath, log_accum, - scratch_pool)); + return svn_error_return(svn_wc__wq_build_loggy(work_item, + db, adm_abspath, log_accum, + result_pool)); } svn_error_t * -svn_wc__loggy_set_entry_timestamp_from_wc(svn_wc__db_t *db, +svn_wc__loggy_set_entry_timestamp_from_wc(svn_skel_t **work_item, + svn_wc__db_t *db, const char *adm_abspath, const char *local_abspath, - apr_pool_t *scratch_pool) + apr_pool_t *result_pool) { svn_stringbuf_t *log_accum = NULL; const char *loggy_path1; SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath)); - SVN_ERR(loggy_path(&loggy_path1, local_abspath, adm_abspath, scratch_pool)); + SVN_ERR(loggy_path(&loggy_path1, local_abspath, adm_abspath, result_pool)); svn_xml_make_open_tag(&log_accum, - scratch_pool, + result_pool, svn_xml_self_closing, SVN_WC__LOG_MODIFY_ENTRY, SVN_WC__LOG_ATTR_NAME, @@ -933,24 +944,26 @@ svn_wc__loggy_set_entry_timestamp_from_w SVN_WC__TIMESTAMP_WC, NULL); - return svn_error_return(svn_wc__wq_add_loggy(db, adm_abspath, log_accum, - scratch_pool)); + return svn_error_return(svn_wc__wq_build_loggy(work_item, + db, adm_abspath, log_accum, + result_pool)); } svn_error_t * -svn_wc__loggy_set_entry_working_size_from_wc(svn_wc__db_t *db, +svn_wc__loggy_set_entry_working_size_from_wc(svn_skel_t **work_item, + svn_wc__db_t *db, const char *adm_abspath, const char *local_abspath, - apr_pool_t *scratch_pool) + apr_pool_t *result_pool) { svn_stringbuf_t *log_accum = NULL; const char *loggy_path1; SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath)); - SVN_ERR(loggy_path(&loggy_path1, local_abspath, adm_abspath, scratch_pool)); + SVN_ERR(loggy_path(&loggy_path1, local_abspath, adm_abspath, result_pool)); svn_xml_make_open_tag(&log_accum, - scratch_pool, + result_pool, svn_xml_self_closing, SVN_WC__LOG_MODIFY_ENTRY, SVN_WC__LOG_ATTR_NAME, @@ -959,26 +972,28 @@ svn_wc__loggy_set_entry_working_size_fro SVN_WC__WORKING_SIZE_WC, NULL); - return svn_error_return(svn_wc__wq_add_loggy(db, adm_abspath, log_accum, - scratch_pool)); + return svn_error_return(svn_wc__wq_build_loggy(work_item, + db, adm_abspath, log_accum, + result_pool)); } svn_error_t * -svn_wc__loggy_set_timestamp(svn_wc__db_t *db, +svn_wc__loggy_set_timestamp(svn_skel_t **work_item, + svn_wc__db_t *db, const char *adm_abspath, const char *local_abspath, const char *timestr, - apr_pool_t *scratch_pool) + apr_pool_t *result_pool) { svn_stringbuf_t *log_accum = NULL; const char *loggy_path1; SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath)); - SVN_ERR(loggy_path(&loggy_path1, local_abspath, adm_abspath, scratch_pool)); + SVN_ERR(loggy_path(&loggy_path1, local_abspath, adm_abspath, result_pool)); svn_xml_make_open_tag(&log_accum, - scratch_pool, + result_pool, svn_xml_self_closing, SVN_WC__LOG_SET_TIMESTAMP, SVN_WC__LOG_ATTR_NAME, @@ -987,28 +1002,30 @@ svn_wc__loggy_set_timestamp(svn_wc__db_t timestr, NULL); - return svn_error_return(svn_wc__wq_add_loggy(db, adm_abspath, log_accum, - scratch_pool)); + return svn_error_return(svn_wc__wq_build_loggy(work_item, + db, adm_abspath, log_accum, + result_pool)); } svn_error_t * -svn_wc__loggy_add_tree_conflict(svn_wc__db_t *db, +svn_wc__loggy_add_tree_conflict(svn_skel_t **work_item, + svn_wc__db_t *db, const char *adm_abspath, const svn_wc_conflict_description2_t *conflict, - apr_pool_t *scratch_pool) + apr_pool_t *result_pool) { svn_stringbuf_t *log_accum = NULL; const char *victim_basename; svn_skel_t *skel; const char *conflict_data; - victim_basename = svn_dirent_basename(conflict->local_abspath, scratch_pool); + victim_basename = svn_dirent_basename(conflict->local_abspath, result_pool); SVN_ERR(svn_wc__serialize_conflict(&skel, conflict, - scratch_pool, scratch_pool)); - conflict_data = svn_skel__unparse(skel, scratch_pool)->data, + result_pool, result_pool)); + conflict_data = svn_skel__unparse(skel, result_pool)->data, - svn_xml_make_open_tag(&log_accum, scratch_pool, svn_xml_self_closing, + svn_xml_make_open_tag(&log_accum, result_pool, svn_xml_self_closing, SVN_WC__LOG_ADD_TREE_CONFLICT, SVN_WC__LOG_ATTR_NAME, victim_basename, @@ -1016,8 +1033,9 @@ svn_wc__loggy_add_tree_conflict(svn_wc__ conflict_data, NULL); - return svn_error_return(svn_wc__wq_add_loggy(db, adm_abspath, log_accum, - scratch_pool)); + return svn_error_return(svn_wc__wq_build_loggy(work_item, + db, adm_abspath, log_accum, + result_pool)); } Modified: subversion/trunk/subversion/libsvn_wc/log.h URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/log.h?rev=942631&r1=942630&r2=942631&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_wc/log.h (original) +++ subversion/trunk/subversion/libsvn_wc/log.h Sun May 9 23:41:01 2010 @@ -32,6 +32,7 @@ #include "svn_wc.h" #include "wc_db.h" +#include "private/svn_skel.h" #ifdef __cplusplus extern "C" { @@ -48,12 +49,13 @@ extern "C" { ADM_ABSPATH is the absolute path for the admin directory for PATH. DST and SRC and VERSIONED are relative to ADM_ABSPATH. */ svn_error_t * -svn_wc__loggy_translated_file(svn_wc__db_t *db, +svn_wc__loggy_translated_file(svn_skel_t **work_item, + svn_wc__db_t *db, const char *adm_abspath, const char *dst_abspath, const char *src_abspath, const char *versioned_abspath, - apr_pool_t *scratch_pool); + apr_pool_t *result_pool); /* Insert into DB a work queue instruction to delete the entry associated with PATH from the entries file. @@ -64,12 +66,13 @@ svn_wc__loggy_translated_file(svn_wc__db Use SCRATCH_POOL for temporary allocations. */ svn_error_t * -svn_wc__loggy_delete_entry(svn_wc__db_t *db, +svn_wc__loggy_delete_entry(svn_skel_t **work_item, + svn_wc__db_t *db, const char *adm_abspath, const char *local_abspath, svn_revnum_t revision, svn_wc__db_kind_t kind, - apr_pool_t *scratch_pool); + apr_pool_t *result_pool); /* Insert into DB a work queue instruction to delete lock related @@ -79,10 +82,11 @@ svn_wc__loggy_delete_entry(svn_wc__db_t Use SCRATCH_POOL for temporary allocations. */ svn_error_t * -svn_wc__loggy_delete_lock(svn_wc__db_t *db, +svn_wc__loggy_delete_lock(svn_skel_t **work_item, + svn_wc__db_t *db, const char *adm_abspath, const char *local_abspath, - apr_pool_t *scratch_pool); + apr_pool_t *result_pool); /* Queue operations to modify the entry associated with PATH @@ -97,12 +101,13 @@ svn_wc__loggy_delete_lock(svn_wc__db_t * Use SCRATCH_POOL for temporary allocations. */ svn_error_t * -svn_wc__loggy_entry_modify(svn_wc__db_t *db, +svn_wc__loggy_entry_modify(svn_skel_t **work_item, + svn_wc__db_t *db, const char *adm_abspath, const char *local_abspath, const svn_wc_entry_t *entry, apr_uint64_t modify_flags, - apr_pool_t *scratch_pool); + apr_pool_t *result_pool); /* Queue instructions to move the file SRC_PATH to DST_PATH. @@ -117,18 +122,20 @@ svn_wc__loggy_entry_modify(svn_wc__db_t the move or the remove will have been carried out. */ svn_error_t * -svn_wc__loggy_move(svn_wc__db_t *db, +svn_wc__loggy_move(svn_skel_t **work_item, + svn_wc__db_t *db, const char *adm_abspath, const char *src_abspath, const char *dst_abspath, - apr_pool_t *scratch_pool); + apr_pool_t *result_pool); svn_error_t * -svn_wc__loggy_set_entry_timestamp_from_wc(svn_wc__db_t *db, +svn_wc__loggy_set_entry_timestamp_from_wc(svn_skel_t **work_item, + svn_wc__db_t *db, const char *adm_abspath, const char *local_abspath, - apr_pool_t *scratch_pool); + apr_pool_t *result_pool); /* Queue log instructions to set the file size of PATH @@ -137,10 +144,11 @@ svn_wc__loggy_set_entry_timestamp_from_w ADM_ABSPATH is the absolute path for the admin directory for PATH. */ svn_error_t * -svn_wc__loggy_set_entry_working_size_from_wc(svn_wc__db_t *db, +svn_wc__loggy_set_entry_working_size_from_wc(svn_skel_t **work_item, + svn_wc__db_t *db, const char *adm_abspath, const char *local_abspath, - apr_pool_t *scratch_pool); + apr_pool_t *result_pool); /* Queue instructions to set the timestamp of PATH to @@ -149,18 +157,20 @@ svn_wc__loggy_set_entry_working_size_fro ADM_ABSPATH is the absolute path for the admin directory for PATH. */ svn_error_t * -svn_wc__loggy_set_timestamp(svn_wc__db_t *db, +svn_wc__loggy_set_timestamp(svn_skel_t **work_item, + svn_wc__db_t *db, const char *adm_abspath, const char *local_abspath, const char *timestr, - apr_pool_t *scratch_pool); + apr_pool_t *result_pool); /* */ svn_error_t * -svn_wc__loggy_add_tree_conflict(svn_wc__db_t *db, +svn_wc__loggy_add_tree_conflict(svn_skel_t **work_item, + svn_wc__db_t *db, const char *adm_abspath, const svn_wc_conflict_description2_t *conflict, - apr_pool_t *scratch_pool); + apr_pool_t *result_pool); /* TODO ### Modified: subversion/trunk/subversion/libsvn_wc/merge.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/merge.c?rev=942631&r1=942630&r2=942631&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_wc/merge.c (original) +++ subversion/trunk/subversion/libsvn_wc/merge.c Sun May 9 23:41:01 2010 @@ -414,6 +414,7 @@ save_merge_result(svn_wc__db_t *db, const char *edited_copy_abspath; const char *dir_abspath; const char *merge_filename; + svn_skel_t *work_item; svn_dirent_split(target_abspath, &dir_abspath, &merge_filename, pool); @@ -426,11 +427,13 @@ save_merge_result(svn_wc__db_t *db, ".edited", svn_io_file_del_none, pool, pool)); - SVN_ERR(svn_wc__loggy_translated_file(db, dir_abspath, + SVN_ERR(svn_wc__loggy_translated_file(&work_item, + db, dir_abspath, edited_copy_abspath, result_target, target_abspath, pool)); + SVN_ERR(svn_wc__db_wq_add(db, dir_abspath, work_item, pool)); return SVN_NO_ERROR; } @@ -605,6 +608,7 @@ preserve_pre_merge_files(svn_wc__db_t *d const char *dir_abspath, *target_name; const char *temp_dir; svn_wc_entry_t tmp_entry; + svn_skel_t *work_item; svn_dirent_split(target_abspath, &dir_abspath, &target_name, pool); SVN_ERR(svn_wc__db_temp_wcroot_tempdir(&temp_dir, db, target_abspath, @@ -685,12 +689,14 @@ preserve_pre_merge_files(svn_wc__db_t *d /* Create LEFT and RIGHT backup files, in expanded form. We use TARGET_ABSPATH's current properties to do the translation. */ /* Derive the basenames of the 3 backup files. */ - SVN_ERR(svn_wc__loggy_translated_file(db, dir_abspath, + SVN_ERR(svn_wc__loggy_translated_file(&work_item, db, dir_abspath, left_copy, tmp_left, target_abspath, pool)); - SVN_ERR(svn_wc__loggy_translated_file(db, dir_abspath, + SVN_ERR(svn_wc__db_wq_add(db, dir_abspath, work_item, pool)); + SVN_ERR(svn_wc__loggy_translated_file(&work_item, db, dir_abspath, right_copy, tmp_right, target_abspath, pool)); + SVN_ERR(svn_wc__db_wq_add(db, dir_abspath, work_item, pool)); /* Back up TARGET_ABSPATH through detranslation/retranslation: the new translation properties may not match the current ones */ @@ -699,9 +705,10 @@ preserve_pre_merge_files(svn_wc__db_t *d SVN_WC_TRANSLATE_TO_NF | SVN_WC_TRANSLATE_NO_OUTPUT_CLEANUP, cancel_func, cancel_baton, pool, pool)); - SVN_ERR(svn_wc__loggy_translated_file(db, dir_abspath, + SVN_ERR(svn_wc__loggy_translated_file(&work_item, db, dir_abspath, target_copy, detranslated_target_copy, target_abspath, pool)); + SVN_ERR(svn_wc__db_wq_add(db, dir_abspath, work_item, pool)); tmp_entry.conflict_old = svn_dirent_is_child(dir_abspath, left_copy, pool); tmp_entry.conflict_new = svn_dirent_is_child(dir_abspath, right_copy, pool); @@ -709,12 +716,13 @@ preserve_pre_merge_files(svn_wc__db_t *d /* Mark TARGET_ABSPATH's entry as "Conflicted", and start tracking the backup files in the entry as well. */ - SVN_ERR(svn_wc__loggy_entry_modify(db, dir_abspath, + SVN_ERR(svn_wc__loggy_entry_modify(&work_item, db, dir_abspath, target_abspath, &tmp_entry, SVN_WC__ENTRY_MODIFY_CONFLICT_OLD | SVN_WC__ENTRY_MODIFY_CONFLICT_NEW | SVN_WC__ENTRY_MODIFY_CONFLICT_WRK, pool)); + SVN_ERR(svn_wc__db_wq_add(db, dir_abspath, work_item, pool)); return SVN_NO_ERROR; } @@ -1016,6 +1024,7 @@ merge_binary_file(enum svn_wc_merge_outc const char *left_base, *right_base; const char *merge_dirpath, *merge_filename; svn_wc_entry_t tmp_entry; + svn_skel_t *work_item; SVN_ERR_ASSERT(svn_dirent_is_absolute(target_abspath)); @@ -1094,8 +1103,6 @@ merge_binary_file(enum svn_wc_merge_outc if (install_from != NULL) { - svn_skel_t *work_item; - SVN_ERR(svn_wc__wq_build_file_install(&work_item, db, target_abspath, install_from, @@ -1143,11 +1150,12 @@ merge_binary_file(enum svn_wc_merge_outc target_label, svn_io_file_del_none, pool, pool)); - SVN_ERR(svn_wc__loggy_move(db, + SVN_ERR(svn_wc__loggy_move(&work_item, db, merge_dirpath, detranslated_target_abspath, mine_copy, pool)); + SVN_ERR(svn_wc__db_wq_add(db, merge_dirpath, work_item, pool)); mine_copy = svn_dirent_is_child(merge_dirpath, mine_copy, pool); @@ -1165,12 +1173,14 @@ merge_binary_file(enum svn_wc_merge_outc tmp_entry.conflict_old = left_base; tmp_entry.conflict_new = right_base; SVN_ERR(svn_wc__loggy_entry_modify( + &work_item, db, merge_dirpath, target_abspath, &tmp_entry, SVN_WC__ENTRY_MODIFY_CONFLICT_OLD | SVN_WC__ENTRY_MODIFY_CONFLICT_NEW | SVN_WC__ENTRY_MODIFY_CONFLICT_WRK, pool)); + SVN_ERR(svn_wc__db_wq_add(db, merge_dirpath, work_item, pool)); *merge_outcome = svn_wc_merge_conflict; /* a conflict happened */ Modified: subversion/trunk/subversion/libsvn_wc/props.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/props.c?rev=942631&r1=942630&r2=942631&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_wc/props.c (original) +++ subversion/trunk/subversion/libsvn_wc/props.c Sun May 9 23:41:01 2010 @@ -1820,12 +1820,14 @@ svn_wc__merge_props(svn_wc_notify_state_ /* Mark entry as "conflicted" with a particular .prej file. */ { svn_wc_entry_t entry; + svn_skel_t *work_item; entry.prejfile = svn_dirent_is_child(adm_abspath, reject_path, NULL); - SVN_ERR(svn_wc__loggy_entry_modify(db, adm_abspath, + SVN_ERR(svn_wc__loggy_entry_modify(&work_item, db, adm_abspath, local_abspath, &entry, SVN_WC__ENTRY_MODIFY_PREJFILE, scratch_pool)); + SVN_ERR(svn_wc__db_wq_add(db, local_abspath, work_item, scratch_pool)); } /* Once the prejfile is recorded, then install the file. */ Modified: subversion/trunk/subversion/libsvn_wc/update_editor.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/update_editor.c?rev=942631&r1=942630&r2=942631&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_wc/update_editor.c (original) +++ subversion/trunk/subversion/libsvn_wc/update_editor.c Sun May 9 23:41:01 2010 @@ -2086,6 +2086,7 @@ do_entry_deletion(struct edit_baton *eb, svn_wc_conflict_description2_t *tree_conflict = NULL; const char *dir_abspath = svn_dirent_dirname(local_abspath, pool); svn_boolean_t hidden; + svn_skel_t *work_item; SVN_ERR(svn_wc__db_read_kind(&kind, eb->db, local_abspath, FALSE, pool)); @@ -2133,8 +2134,9 @@ do_entry_deletion(struct edit_baton *eb, /* When we raise a tree conflict on a directory, we want to avoid * making any changes inside it. (Will an update ever try to make * further changes to or inside a directory it's just deleted?) */ - SVN_ERR(svn_wc__loggy_add_tree_conflict(eb->db, dir_abspath, + SVN_ERR(svn_wc__loggy_add_tree_conflict(&work_item, eb->db, dir_abspath, tree_conflict, pool)); + SVN_ERR(svn_wc__db_wq_add(eb->db, dir_abspath, work_item, pool)); SVN_ERR(remember_skipped_tree(eb, local_abspath)); @@ -2207,18 +2209,22 @@ do_entry_deletion(struct edit_baton *eb, if (strcmp(local_abspath, eb->target_abspath) != 0) { /* Delete, and do not leave a not-present node. */ - SVN_ERR(svn_wc__loggy_delete_entry(eb->db, dir_abspath, local_abspath, + SVN_ERR(svn_wc__loggy_delete_entry(&work_item, + eb->db, dir_abspath, local_abspath, SVN_INVALID_REVNUM, svn_wc__db_kind_unknown, pool)); + SVN_ERR(svn_wc__db_wq_add(eb->db, dir_abspath, work_item, pool)); } else { /* Delete, leaving a not-present node. */ - SVN_ERR(svn_wc__loggy_delete_entry(eb->db, dir_abspath, local_abspath, + SVN_ERR(svn_wc__loggy_delete_entry(&work_item, + eb->db, dir_abspath, local_abspath, *eb->target_revision, kind, pool)); + SVN_ERR(svn_wc__db_wq_add(eb->db, dir_abspath, work_item, pool)); eb->target_deleted = TRUE; } @@ -2574,12 +2580,17 @@ add_directory(const char *path, if (tree_conflict != NULL) { + svn_skel_t *work_item; + /* Queue this conflict in the parent so that its descendants are skipped silently. */ - SVN_ERR(svn_wc__loggy_add_tree_conflict(eb->db, + SVN_ERR(svn_wc__loggy_add_tree_conflict(&work_item, + eb->db, pb->local_abspath, tree_conflict, pool)); + SVN_ERR(svn_wc__db_wq_add(eb->db, pb->local_abspath, + work_item, pool)); SVN_ERR(remember_skipped_tree(eb, db->local_abspath)); @@ -2778,9 +2789,13 @@ open_directory(const char *path, /* Remember the roots of any locally deleted trees. */ if (tree_conflict != NULL) { + svn_skel_t *work_item; + /* Place a tree conflict into the parent work queue. */ - SVN_ERR(svn_wc__loggy_add_tree_conflict(eb->db, pb->local_abspath, + SVN_ERR(svn_wc__loggy_add_tree_conflict(&work_item, + eb->db, pb->local_abspath, tree_conflict, pool)); + SVN_ERR(svn_wc__db_wq_add(eb->db, pb->local_abspath, work_item, pool)); do_notification(eb, db->local_abspath, svn_node_dir, svn_wc_notify_tree_conflict, pool); @@ -3903,12 +3918,17 @@ add_file(const char *path, if (tree_conflict != NULL) { + svn_skel_t *work_item; + /* Record the conflict so that the file is skipped silently by the other callbacks. */ - SVN_ERR(svn_wc__loggy_add_tree_conflict(eb->db, + SVN_ERR(svn_wc__loggy_add_tree_conflict(&work_item, + eb->db, pb->local_abspath, tree_conflict, subpool)); + SVN_ERR(svn_wc__db_wq_add(eb->db, pb->local_abspath, + work_item, pool)); SVN_ERR(remember_skipped_tree(eb, fb->local_abspath)); fb->skip_this = TRUE; @@ -4013,8 +4033,12 @@ open_file(const char *path, /* Is this path the victim of a newly-discovered tree conflict? */ if (tree_conflict) { - SVN_ERR(svn_wc__loggy_add_tree_conflict(eb->db, pb->local_abspath, + svn_skel_t *work_item; + + SVN_ERR(svn_wc__loggy_add_tree_conflict(&work_item, + eb->db, pb->local_abspath, tree_conflict, pool)); + SVN_ERR(svn_wc__db_wq_add(eb->db, pb->local_abspath, work_item, pool)); if (tree_conflict->reason == svn_wc_conflict_reason_deleted || tree_conflict->reason == svn_wc_conflict_reason_replaced) @@ -4623,10 +4647,11 @@ merge_file(svn_skel_t **work_items, /* Move the temp text-base file to its final destination. * FB->text_base_path is the appropriate path: the "revert-base" path * if the node is replaced, else the usual text-base path. */ - SVN_ERR(svn_wc__loggy_move(eb->db, pb->local_abspath, + SVN_ERR(svn_wc__loggy_move(&work_item, eb->db, pb->local_abspath, new_text_base_tmp_abspath, fb->text_base_abspath, pool)); + SVN_ERR(svn_wc__db_wq_add(eb->db, pb->local_abspath, work_item, pool)); } #endif @@ -4639,22 +4664,30 @@ merge_file(svn_skel_t **work_items, /* Adjust working copy file unless this file is an allowed obstruction. */ if (fb->last_changed_date && !fb->obstruction_found) - SVN_ERR(svn_wc__loggy_set_timestamp( - eb->db, pb->local_abspath, - fb->local_abspath, fb->last_changed_date, - pool)); + { + SVN_ERR(svn_wc__loggy_set_timestamp( + &work_item, eb->db, pb->local_abspath, + fb->local_abspath, fb->last_changed_date, + pool)); + SVN_ERR(svn_wc__db_wq_add(eb->db, pb->local_abspath, work_item, + pool)); + } if ((new_text_base_tmp_abspath || magic_props_changed) && !fb->deleted) { /* Adjust entries file to match working file */ SVN_ERR(svn_wc__loggy_set_entry_timestamp_from_wc( - eb->db, pb->local_abspath, + &work_item, eb->db, pb->local_abspath, fb->local_abspath, pool)); + SVN_ERR(svn_wc__db_wq_add(eb->db, pb->local_abspath, work_item, + pool)); } + SVN_ERR(svn_wc__loggy_set_entry_working_size_from_wc( - eb->db, pb->local_abspath, + &work_item, eb->db, pb->local_abspath, fb->local_abspath, pool)); + SVN_ERR(svn_wc__db_wq_add(eb->db, pb->local_abspath, work_item, pool)); } /* Set the returned content state. */ @@ -5840,6 +5873,7 @@ svn_wc_add_repos_file4(svn_wc_context_t svn_checksum_t *base_checksum; struct last_change_info *last_change = NULL; const char *source_abspath = NULL; + svn_skel_t *work_item; SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath)); SVN_ERR_ASSERT(new_base_contents != NULL); @@ -5939,9 +5973,10 @@ svn_wc_add_repos_file4(svn_wc_context_t | SVN_WC__ENTRY_MODIFY_COPIED; } - SVN_ERR(svn_wc__loggy_entry_modify(db, dir_abspath, + SVN_ERR(svn_wc__loggy_entry_modify(&work_item, db, dir_abspath, local_abspath, &tmp_entry, modify_flags, pool)); + SVN_ERR(svn_wc__db_wq_add(db, dir_abspath, work_item, pool)); } /* ### Clear working node status in preparation for writing a new node. */ @@ -5959,12 +5994,13 @@ svn_wc_add_repos_file4(svn_wc_context_t have an explicid 'changed' value, so we set the value to 'undefined'. */ tmp_entry.text_time = 0; - SVN_ERR(svn_wc__loggy_entry_modify(db, dir_abspath, + SVN_ERR(svn_wc__loggy_entry_modify(&work_item, db, dir_abspath, local_abspath, &tmp_entry, SVN_WC__ENTRY_MODIFY_KIND | SVN_WC__ENTRY_MODIFY_TEXT_TIME | SVN_WC__ENTRY_MODIFY_WORKING_SIZE, pool)); + SVN_ERR(svn_wc__db_wq_add(db, dir_abspath, work_item, pool)); } /* Update LAST_CHANGE to reflect the entry props in NEW_BASE_PROPS, and @@ -6034,16 +6070,18 @@ svn_wc_add_repos_file4(svn_wc_context_t (Install it as the normal text base, not the 'revert base'.) */ SVN_ERR(svn_wc__text_base_path(&text_base_abspath, db, local_abspath, FALSE, pool)); - SVN_ERR(svn_wc__loggy_move(db, dir_abspath, + SVN_ERR(svn_wc__loggy_move(&work_item, db, dir_abspath, tmp_text_base_abspath, text_base_abspath, pool)); + SVN_ERR(svn_wc__db_wq_add(db, dir_abspath, work_item, pool)); tmp_entry.checksum = svn_checksum_to_cstring(base_checksum, pool); - SVN_ERR(svn_wc__loggy_entry_modify(db, dir_abspath, + SVN_ERR(svn_wc__loggy_entry_modify(&work_item, db, dir_abspath, local_abspath, &tmp_entry, SVN_WC__ENTRY_MODIFY_CHECKSUM, pool)); + SVN_ERR(svn_wc__db_wq_add(db, dir_abspath, work_item, pool)); } /* ### HACK: The following code should be performed in the same transaction as the install */ Modified: subversion/trunk/subversion/libsvn_wc/workqueue.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/workqueue.c?rev=942631&r1=942630&r2=942631&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_wc/workqueue.c (original) +++ subversion/trunk/subversion/libsvn_wc/workqueue.c Sun May 9 23:41:01 2010 @@ -842,25 +842,25 @@ run_loggy(svn_wc__db_t *db, svn_error_t * -svn_wc__wq_add_loggy(svn_wc__db_t *db, - const char *adm_abspath, - const svn_stringbuf_t *log_content, - apr_pool_t *scratch_pool) +svn_wc__wq_build_loggy(svn_skel_t **work_item, + svn_wc__db_t *db, + const char *adm_abspath, + const svn_stringbuf_t *log_content, + apr_pool_t *result_pool) { - svn_skel_t *work_item; - if (log_content == NULL || svn_stringbuf_isempty(log_content)) - return SVN_NO_ERROR; - - work_item = svn_skel__make_empty_list(scratch_pool); + { + *work_item = NULL; + return SVN_NO_ERROR; + } - /* The skel still points at ADM_ABSPATH and LOG_CONTENT, but the skel will - be serialized just below in the wq_add call. */ - svn_skel__prepend_str(log_content->data, work_item, scratch_pool); - svn_skel__prepend_str(adm_abspath, work_item, scratch_pool); - svn_skel__prepend_str(OP_LOGGY, work_item, scratch_pool); + *work_item = svn_skel__make_empty_list(result_pool); - SVN_ERR(svn_wc__db_wq_add(db, adm_abspath, work_item, scratch_pool)); + /* NOTE: the skel still points at ADM_ABSPATH and LOG_CONTENT, but we + require these parameters to be allocated in RESULT_POOL. */ + svn_skel__prepend_str(log_content->data, *work_item, result_pool); + svn_skel__prepend_str(adm_abspath, *work_item, result_pool); + svn_skel__prepend_str(OP_LOGGY, *work_item, result_pool); return SVN_NO_ERROR; } Modified: subversion/trunk/subversion/libsvn_wc/workqueue.h URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/workqueue.h?rev=942631&r1=942630&r2=942631&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_wc/workqueue.h (original) +++ subversion/trunk/subversion/libsvn_wc/workqueue.h Sun May 9 23:41:01 2010 @@ -188,13 +188,17 @@ svn_wc__wq_add_killme(svn_wc__db_t *db, /* ### temporary compat for mapping the old loggy into workqueue space. LOG_CONTENT may be NULL or reference an empty log. No work item will be - queued in this case. + built in this case. + + NOTE: ADM_ABSPATH and LOG_CONTENT must live at least as long as + RESULT_POOL (typically, they'll be allocated within RESULT_POOL). */ svn_error_t * -svn_wc__wq_add_loggy(svn_wc__db_t *db, - const char *adm_abspath, - const svn_stringbuf_t *log_content, - apr_pool_t *scratch_pool); +svn_wc__wq_build_loggy(svn_skel_t **work_item, + svn_wc__db_t *db, + const char *adm_abspath, + const svn_stringbuf_t *log_content, + apr_pool_t *result_pool); svn_error_t *