Please revert. The atts_to_entry stuff for the CMT_AUTHOR and friends needs to remain. That is how we load old entries files.
-g On Wed, Mar 3, 2010 at 11:15, <rhuij...@apache.org> wrote: > Author: rhuijben > Date: Wed Mar 3 16:15:27 2010 > New Revision: 918542 > > URL: http://svn.apache.org/viewvc?rev=918542&view=rev > Log: > Update the last change information (before WC-NG known as entry properties) > directly in WC-DB instead of via entry updates. This allows keeping track of > these values a bit longer than before, as the next entry_write() might remove > some details. > > Like many similar updates this moves some loggy operations to using the > database > directly, which might introduce some issues if you happen to press ^C in the > wrong place. The only solution that completely resolve this will be to update > BASE_NODE in one step, which is planned before 1.7. > > This fixes one specific merge scenario that now properly detects that the > sub-replacement is done via the parent instead of directly. (The commit of > merge_tests#34 doesn't record a separate replacement now.) > > * subversion/libsvn_wc/entries.c > (fold_entry): Stop updating last_change information. > > * subversion/libsvn_wc/entries.h > (SVN_WC__ENTRY_MODIFY_CMT_REV, > SVN_WC__ENTRY_MODIFY_CMT_DATE, > SVN_WC__ENTRY_MODIFY_CMT_AUTHOR): Remove now unused values. > > * subversion/libsvn_wc/log.c > (log_do_modify_entry): Remove early WC-NG hack, which unset .deleted on > updating last change information. > > * subversion/libsvn_wc/old-and-busted.c > (svn_wc__atts_to_entry): Remove uses of SVN_WC__ENTRY_MODIFY_CMT_AUTHOR. > > * subversion/libsvn_wc/update_editor.c > (last_change_info): New struct. > (accumulate_entry_props): Rename to ... > (accumulate_last_change): ... this and collect the information in > a last_change_info struct instead of writing a loggy operations. > Reorder arguments to match new standard. > > (close_directory): Collect last_change_info and if available write > it to BASE_NODE in the final update step. > > (merge_props, > merge_file): Collect last_change_info and pass to caller. > (close_file): Collect last_chanhe_info and write it to BASE_NODE > if available. Unset entry.deleted when we are adding a new node. > > (install_added_props): Collect last_change_info and pass it to caller. > (svn_wc_add_repos_file4): If last_change info is provided write it to > WORKING_NODE. > > * subversion/libsvn_wc/wc-queries.sql > (STMT_UPDATE_BASE_LAST_CHANGE, > STMT_UPDATE_WORKING_LAST_CHANGE): New query. > > * subversion/libsvn_wc/wc_db.c > (svn_wc__db_temp_op_set_base_last_change, > svn_wc__db_temp_op_set_working_last_change): New function. > > * subversion/libsvn_wc/wc_db.h > (svn_wc__db_temp_op_set_base_last_change, > svn_wc__db_temp_op_set_working_last_change): New function. > > Modified: > subversion/trunk/subversion/libsvn_wc/entries.c > subversion/trunk/subversion/libsvn_wc/entries.h > subversion/trunk/subversion/libsvn_wc/log.c > subversion/trunk/subversion/libsvn_wc/old-and-busted.c > subversion/trunk/subversion/libsvn_wc/update_editor.c > subversion/trunk/subversion/libsvn_wc/wc-queries.sql > subversion/trunk/subversion/libsvn_wc/wc_db.c > subversion/trunk/subversion/libsvn_wc/wc_db.h > > Modified: subversion/trunk/subversion/libsvn_wc/entries.c > URL: > http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/entries.c?rev=918542&r1=918541&r2=918542&view=diff > ============================================================================== > --- subversion/trunk/subversion/libsvn_wc/entries.c (original) > +++ subversion/trunk/subversion/libsvn_wc/entries.c Wed Mar 3 16:15:27 2010 > @@ -2587,17 +2587,7 @@ > ? apr_pstrdup(pool, entry->prejfile) > : NULL; > > - /* Last-commit stuff */ > - if (modify_flags & SVN_WC__ENTRY_MODIFY_CMT_REV) > - cur_entry->cmt_rev = entry->cmt_rev; > - > - if (modify_flags & SVN_WC__ENTRY_MODIFY_CMT_DATE) > - cur_entry->cmt_date = entry->cmt_date; > - > - if (modify_flags & SVN_WC__ENTRY_MODIFY_CMT_AUTHOR) > - cur_entry->cmt_author = entry->cmt_author > - ? apr_pstrdup(pool, entry->cmt_author) > - : NULL; > + /* Last-commit flags are no longer passed to entry_modify() */ > > /* LOCK flags are no longer passed to entry_modify(). */ > > > Modified: subversion/trunk/subversion/libsvn_wc/entries.h > URL: > http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/entries.h?rev=918542&r1=918541&r2=918542&view=diff > ============================================================================== > --- subversion/trunk/subversion/libsvn_wc/entries.h (original) > +++ subversion/trunk/subversion/libsvn_wc/entries.h Wed Mar 3 16:15:27 2010 > @@ -108,9 +108,6 @@ > #define SVN_WC__ENTRY_MODIFY_CONFLICT_NEW > APR_INT64_C(0x0000000000002000) > #define SVN_WC__ENTRY_MODIFY_CONFLICT_WRK > APR_INT64_C(0x0000000000004000) > #define SVN_WC__ENTRY_MODIFY_PREJFILE > APR_INT64_C(0x0000000000008000) > -#define SVN_WC__ENTRY_MODIFY_CMT_REV > APR_INT64_C(0x0000000000010000) > -#define SVN_WC__ENTRY_MODIFY_CMT_DATE > APR_INT64_C(0x0000000000020000) > -#define SVN_WC__ENTRY_MODIFY_CMT_AUTHOR > APR_INT64_C(0x0000000000040000) > /* OPEN */ > #define SVN_WC__ENTRY_MODIFY_INCOMPLETE > APR_INT64_C(0x0000000000100000) > #define SVN_WC__ENTRY_MODIFY_ABSENT > APR_INT64_C(0x0000000000200000) > > Modified: subversion/trunk/subversion/libsvn_wc/log.c > URL: > http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/log.c?rev=918542&r1=918541&r2=918542&view=diff > ============================================================================== > --- subversion/trunk/subversion/libsvn_wc/log.c (original) > +++ subversion/trunk/subversion/libsvn_wc/log.c Wed Mar 3 16:15:27 2010 > @@ -475,40 +475,6 @@ > if (valuestr && strcmp(valuestr, "true") == 0) > modify_flags |= SVN_WC__ENTRY_MODIFY_FORCE; > > - /* It is possible that we will find a log that has a misordered sequence > - of entry modifications and wcprop modifications. The entry must be > - "not hidden" before wcprops can be installed. The sequence of actions > - will look like: > - > - 1. modify_entry > - 2. modify_wcprops > - 3. modify_entry(DELETED=FALSE) > - > - Step 2 will fail if the current node is marked DELETED. r36697 fixes > - the ordering, moving step 3 to the beginning of the sequence. However, > - old logs may still contain the above sequence. To compensate, we will > - attempt to detect the pattern used by step 1, and preemptively clear > - the DELETED flag. > - > - The misordered entry is written by accumulate_entry_props() in > - update_editor.c. That may modify the CMT_* values and/or the UUID. > - If we see any of those, then we've detected a modify_entry constructed > - by that function. And that means we *just* ran a step 3 (new code) > - or we *will* run a step 3 (too late; old code). In both situations, > - we can safely clear the DELETED flag. > - > - The UUID modification is *only* performed by that function. The CMT_* > - changes are also performed by process_committed_leaf() in adm_ops.c. > - A just-committed node setting these values will NEVER be DELETED, > - so it is safe to clear the value. */ > - if (modify_flags & (SVN_WC__ENTRY_MODIFY_CMT_REV > - | SVN_WC__ENTRY_MODIFY_CMT_DATE > - | SVN_WC__ENTRY_MODIFY_CMT_AUTHOR)) > - { > - entry->deleted = FALSE; > - modify_flags |= SVN_WC__ENTRY_MODIFY_DELETED; > - } > - > /* Now write the new entry out. Note that we want to always operate > on the stub if name is not THIS_DIR. This loggy function is intended > to operate on the data in ADM_ABSPATH, so we do NOT want to reach > @@ -1086,17 +1052,7 @@ > SVN_WC__ENTRY_ATTR_CHECKSUM, > entry->checksum); > > - ADD_ENTRY_ATTR(SVN_WC__ENTRY_MODIFY_CMT_REV, > - SVN_WC__ENTRY_ATTR_CMT_REV, > - apr_psprintf(scratch_pool, "%ld", entry->cmt_rev)); > - > - ADD_ENTRY_ATTR(SVN_WC__ENTRY_MODIFY_CMT_DATE, > - SVN_WC__ENTRY_ATTR_CMT_DATE, > - svn_time_to_cstring(entry->cmt_date, scratch_pool)); > - > - ADD_ENTRY_ATTR(SVN_WC__ENTRY_MODIFY_CMT_AUTHOR, > - SVN_WC__ENTRY_ATTR_CMT_AUTHOR, > - entry->cmt_author); > + /* Note: Last-commit flags are no longer passed to this function. */ > > /* Note: LOCK flags are no longer passed to this function. */ > > > Modified: subversion/trunk/subversion/libsvn_wc/old-and-busted.c > URL: > http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/old-and-busted.c?rev=918542&r1=918541&r2=918542&view=diff > ============================================================================== > --- subversion/trunk/subversion/libsvn_wc/old-and-busted.c (original) > +++ subversion/trunk/subversion/libsvn_wc/old-and-busted.c Wed Mar 3 > 16:15:27 2010 > @@ -946,7 +946,6 @@ > if (cmt_datestr) > { > SVN_ERR(svn_time_from_cstring(&entry->cmt_date, cmt_datestr, pool)); > - *modify_flags |= SVN_WC__ENTRY_MODIFY_CMT_DATE; > } > else > entry->cmt_date = 0; > @@ -956,15 +955,13 @@ > if (cmt_revstr) > { > entry->cmt_rev = SVN_STR_TO_REV(cmt_revstr); > - *modify_flags |= SVN_WC__ENTRY_MODIFY_CMT_REV; > } > else > entry->cmt_rev = SVN_INVALID_REVNUM; > > entry->cmt_author = extract_string(modify_flags, atts, > SVN_WC__ENTRY_ATTR_CMT_AUTHOR, > - SVN_WC__ENTRY_MODIFY_CMT_AUTHOR, > - FALSE, pool); > + 0, FALSE, pool); > } > > /* NOTE: we do not set modify_flags values since the lock attributes only > > Modified: subversion/trunk/subversion/libsvn_wc/update_editor.c > URL: > http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/update_editor.c?rev=918542&r1=918541&r2=918542&view=diff > ============================================================================== > --- subversion/trunk/subversion/libsvn_wc/update_editor.c (original) > +++ subversion/trunk/subversion/libsvn_wc/update_editor.c Wed Mar 3 16:15:27 > 2010 > @@ -1188,25 +1188,35 @@ > } > > > -/* Accumulate tags in LOG_ACCUM (associated with ADM_ABSPATH) to set > - ENTRY_PROPS for PATH. > +/* Container for the common "Entry props" */ > +struct last_change_info > +{ > + /** last revision this was changed */ > + svn_revnum_t cmt_rev; > + > + /** last date this was changed */ > + apr_time_t cmt_date; > + > + /** last commit author of this item */ > + const char *cmt_author; > +}; > + > +/* Accumulate last change info in LAST_CHANGE to set on LOCAL_ABSPATH. > ENTRY_PROPS is an array of svn_prop_t* entry props. > - If ENTRY_PROPS contains the removal of a lock token, all entryprops > - related to a lock will be removed and LOCK_STATE, if non-NULL, will be > - set to svn_wc_notify_lock_state_unlocked. Else, LOCK_STATE, if non-NULL > + If ENTRY_PROPS contains the removal of a lock token, the lock info is > + directly removed from LOCAL_ABSPATH in DB and LOCK_STATE, if non-NULL, > will > + be set to svn_wc_notify_lock_state_unlocked. Else, LOCK_STATE, if > non-NULL > will be set to svn_wc_lock_state_unchanged. */ > static svn_error_t * > -accumulate_entry_props(svn_stringbuf_t *log_accum, > - svn_wc__db_t *db, > - const char *adm_abspath, > +accumulate_last_change(struct last_change_info **last_change, > svn_wc_notify_lock_state_t *lock_state, > - const char *path, > + svn_wc__db_t *db, > + const char *local_abspath, > apr_array_header_t *entry_props, > - apr_pool_t *pool) > + apr_pool_t *scratch_pool, > + apr_pool_t *result_pool) > { > int i; > - svn_wc_entry_t tmp_entry; > - apr_uint64_t flags = 0; > > if (lock_state) > *lock_state = svn_wc_notify_lock_state_unchanged; > @@ -1217,11 +1227,10 @@ > const char *val; > > /* The removal of the lock-token entryprop means that the lock was > - defunct. */ > + defunct, so remove it directly. */ > if (! strcmp(prop->name, SVN_PROP_ENTRY_LOCK_TOKEN)) > { > - SVN_WC__FLUSH_LOG_ACCUM(db, adm_abspath, log_accum, pool); > - SVN_ERR(svn_wc__loggy_delete_lock(db, adm_abspath, path, pool)); > + SVN_ERR(svn_wc__db_lock_remove(db, local_abspath, scratch_pool)); > > if (lock_state) > *lock_state = svn_wc_notify_lock_state_unlocked; > @@ -1236,29 +1245,23 @@ > > val = prop->value->data; > > - if (! strcmp(prop->name, SVN_PROP_ENTRY_LAST_AUTHOR)) > + if (*last_change == NULL) > { > - flags |= SVN_WC__ENTRY_MODIFY_CMT_AUTHOR; > - tmp_entry.cmt_author = val; > + *last_change = apr_pcalloc(result_pool, sizeof(**last_change)); > + (*last_change)->cmt_rev = SVN_INVALID_REVNUM; > } > + > + if (! strcmp(prop->name, SVN_PROP_ENTRY_LAST_AUTHOR)) > + (*last_change)->cmt_author = apr_pstrdup(result_pool, val); > else if (! strcmp(prop->name, SVN_PROP_ENTRY_COMMITTED_REV)) > - { > - flags |= SVN_WC__ENTRY_MODIFY_CMT_REV; > - tmp_entry.cmt_rev = SVN_STR_TO_REV(val); > - } > + (*last_change)->cmt_rev = SVN_STR_TO_REV(val); > else if (! strcmp(prop->name, SVN_PROP_ENTRY_COMMITTED_DATE)) > - { > - flags |= SVN_WC__ENTRY_MODIFY_CMT_DATE; > - SVN_ERR(svn_time_from_cstring(&tmp_entry.cmt_date, val, pool)); > - } > + SVN_ERR(svn_time_from_cstring(&((*last_change)->cmt_date), val, > + scratch_pool)); > /* Starting with Subversion 1.7 we ignore the SVN_PROP_ENTRY_UUID > property here. */ > } > > - if (flags) > - SVN_ERR(svn_wc__loggy_entry_modify(&log_accum, adm_abspath, > - path, &tmp_entry, flags, pool, pool)); > - > return SVN_NO_ERROR; > } > > @@ -3173,6 +3176,7 @@ > { > struct dir_baton *db = dir_baton; > struct edit_baton *eb = db->edit_baton; > + struct last_change_info *last_change = NULL; > svn_wc_notify_state_t prop_state = svn_wc_notify_state_unknown; > apr_array_header_t *entry_props, *wc_props, *regular_props; > apr_hash_t *base_props = NULL, *working_props = NULL; > @@ -3303,10 +3307,9 @@ > _("Couldn't do property merge")); > } > > - SVN_ERR(accumulate_entry_props(dirprop_log, eb->db, > - db->local_abspath, > - NULL, db->local_abspath, entry_props, > - pool)); > + SVN_ERR(accumulate_last_change(&last_change, NULL, eb->db, > + db->local_abspath, entry_props, > + pool, pool)); > > /* Handle the wcprops. */ > if (wc_props && wc_props->nelts > 0) > @@ -3329,6 +3332,14 @@ > > /* Flush and run the log. */ > SVN_ERR(flush_log(db, pool)); > + > + if (last_change) > + SVN_ERR(svn_wc__db_temp_op_set_base_last_change(eb->db, > db->local_abspath, > + last_change->cmt_rev, > + last_change->cmt_date, > + last_change->cmt_author, > + pool)); > + > SVN_ERR(svn_wc__run_log2(eb->db, db->local_abspath, pool)); > > /* We're done with this directory, so remove one reference from the > @@ -4493,6 +4504,7 @@ > svn_wc_notify_lock_state_t *lock_state, > apr_hash_t **new_base_props, > apr_hash_t **new_actual_props, > + struct last_change_info **last_change, > svn_wc__db_t *db, > const char *file_abspath, > const char *dir_abspath, > @@ -4547,9 +4559,9 @@ > Note that no merging needs to happen; these kinds of props aren't > versioned, so if the property is present, we overwrite the value. */ > if (entry_props) > - SVN_ERR(accumulate_entry_props(log_accum, db, dir_abspath, > - lock_state, file_abspath, entry_props, > - pool)); > + SVN_ERR(accumulate_last_change(last_change, lock_state, > + db, file_abspath, entry_props, > + pool, pool)); > else > *lock_state = svn_wc_notify_lock_state_unchanged; > > @@ -4653,6 +4665,7 @@ > svn_wc_notify_lock_state_t *lock_state, > apr_hash_t **new_base_props, > apr_hash_t **new_actual_props, > + struct last_change_info **last_change, > struct file_baton *fb, > const char *new_text_base_path, > const svn_checksum_t *actual_checksum, > @@ -4722,7 +4735,7 @@ > any file content merging, since that process might expand keywords, in > which case we want the new entryprops to be in place. */ > SVN_ERR(merge_props(log_accum, prop_state, lock_state, > - new_base_props, new_actual_props, > + new_base_props, new_actual_props, last_change, > eb->db, fb->local_abspath, pb->local_abspath, > left_version, right_version, > fb->propchanges, > @@ -5065,6 +5078,7 @@ > { > struct file_baton *fb = file_baton; > struct edit_baton *eb = fb->edit_baton; > + struct last_change_info *last_change = NULL; > svn_wc_notify_state_t content_state, prop_state; > svn_wc_notify_lock_state_t lock_state; > svn_checksum_t *expected_checksum = NULL; > @@ -5132,8 +5146,8 @@ > > /* It's a small world, after all. */ > SVN_ERR(merge_file(&content_state, &prop_state, &lock_state, > - &new_base_props, &new_actual_props, fb, > - new_base_path, md5_actual_checksum, pool)); > + &new_base_props, &new_actual_props, &last_change, > + fb, new_base_path, md5_actual_checksum, pool)); > > > if (fb->added || fb->add_existed) > @@ -5144,11 +5158,15 @@ > be removed soon anyway. > > ### HACK: The loggy stuff checked the preconditions for us, > - we just make the property code happy here. */ > + we just make the property code happy here. > + > + We can also clear entry.deleted here, as we are adding a new > + BASE_NODE anyway */ > svn_wc_entry_t tmp_entry; > svn_stringbuf_t *create_log = NULL; > apr_uint64_t flags = SVN_WC__ENTRY_MODIFY_KIND > - | SVN_WC__ENTRY_MODIFY_REVISION; > + | SVN_WC__ENTRY_MODIFY_REVISION > + | SVN_WC__ENTRY_MODIFY_DELETED; > > if (fb->add_existed) > { > @@ -5163,6 +5181,7 @@ > > tmp_entry.kind = svn_node_file; > tmp_entry.revision = *eb->target_revision; > + tmp_entry.deleted = FALSE; > > SVN_ERR(svn_wc__loggy_entry_modify(&create_log, > fb->dir_baton->local_abspath, > @@ -5175,8 +5194,23 @@ > fb->dir_baton->local_abspath, > create_log, > pool)); > + > + SVN_ERR(svn_wc__wq_run(eb->db, > + fb->dir_baton->local_abspath, > + NULL, NULL, pool)); > } > > + /* ### Hack: The following block should be an atomic operation (including > the install > + loggy install portions of some functions called above */ > + SVN_ERR_ASSERT(last_change != NULL); /* Should always be not NULL for > files */ > + > + if (last_change) > + SVN_ERR(svn_wc__db_temp_op_set_base_last_change(eb->db, > fb->local_abspath, > + last_change->cmt_rev, > + last_change->cmt_date, > + last_change->cmt_author, > + pool)); > + > if (new_base_props || new_actual_props) > SVN_ERR(svn_wc__install_props(eb->db, fb->local_abspath, > new_base_props, new_actual_props, > @@ -5866,7 +5900,7 @@ > be an access baton for DST_PATH. > Use @a POOL for temporary allocations. */ > static svn_error_t * > -install_added_props(svn_stringbuf_t *log_accum, > +install_added_props(struct last_change_info **last_change, > svn_wc__db_t *db, > const char *dir_abspath, > const char *local_abspath, > @@ -5894,8 +5928,8 @@ > } > > /* Install the entry props. */ > - SVN_ERR(accumulate_entry_props(log_accum, db, dir_abspath, > - NULL, local_abspath, entry_props, pool)); > + SVN_ERR(accumulate_last_change(last_change, NULL, db, local_abspath, > + entry_props, pool, pool)); > > return svn_error_return(svn_wc__db_base_set_dav_cache(db, local_abspath, > prop_hash_from_array(wc_props, pool), > @@ -5928,6 +5962,7 @@ > const char *temp_dir_abspath; > svn_stringbuf_t *pre_props_accum; > svn_stringbuf_t *post_props_accum; > + struct last_change_info *last_change = NULL; > > SVN_ERR(svn_wc__text_base_path(&text_base_path, wc_ctx->db, local_abspath, > FALSE, pool)); > @@ -6020,7 +6055,7 @@ > > /* Install the props before the loggy translation, so that it has access to > the properties for this file. */ > - SVN_ERR(install_added_props(post_props_accum, wc_ctx->db, dir_abspath, > + SVN_ERR(install_added_props(&last_change, wc_ctx->db, dir_abspath, > local_abspath, &new_base_props, new_props, > pool)); > > /* Copy the text base contents into a temporary file so our log > @@ -6096,6 +6131,17 @@ > SVN_ERR(svn_wc__install_props(wc_ctx->db, local_abspath, new_base_props, > new_props ? new_props : new_base_props, > TRUE, FALSE, pool)); > + > + SVN_ERR(svn_wc__run_log2(wc_ctx->db, dir_abspath, pool)); > + > + /* ### HACK: The following code should be performed in the same > transaction as the install */ > + if (last_change) > + SVN_ERR(svn_wc__db_temp_op_set_working_last_change(wc_ctx->db, > local_abspath, > + last_change->cmt_rev, > + last_change->cmt_date, > + > last_change->cmt_author, > + pool)); > + /* ### /HACK */ > SVN_ERR(svn_wc__wq_add_loggy(wc_ctx->db, dir_abspath, post_props_accum, > pool)); > > > > Modified: subversion/trunk/subversion/libsvn_wc/wc-queries.sql > URL: > http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc-queries.sql?rev=918542&r1=918541&r2=918542&view=diff > ============================================================================== > --- subversion/trunk/subversion/libsvn_wc/wc-queries.sql (original) > +++ subversion/trunk/subversion/libsvn_wc/wc-queries.sql Wed Mar 3 16:15:27 > 2010 > @@ -372,6 +372,14 @@ > update base_node set file_external = ?3 > where wc_id = ?1 and local_relpath = ?2; > > +-- STMT_UPDATE_BASE_LAST_CHANGE > +update base_node set changed_rev = ?3, changed_date = ?4, changed_author = ?5 > +where wc_id = ?1 and local_relpath = ?2; > + > +-- STMT_UPDATE_WORKING_LAST_CHANGE > +update working_node set changed_rev = ?3, changed_date = ?4, changed_author > = ?5 > +where wc_id = ?1 and local_relpath = ?2; > + > /* ------------------------------------------------------------------------- > */ > > /* these are used in upgrade.c */ > > Modified: subversion/trunk/subversion/libsvn_wc/wc_db.c > URL: > http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc_db.c?rev=918542&r1=918541&r2=918542&view=diff > ============================================================================== > --- subversion/trunk/subversion/libsvn_wc/wc_db.c (original) > +++ subversion/trunk/subversion/libsvn_wc/wc_db.c Wed Mar 3 16:15:27 2010 > @@ -6232,4 +6232,93 @@ > } > > return SVN_NO_ERROR; > -} > \ No newline at end of file > +} > + > +svn_error_t * > +svn_wc__db_temp_op_set_base_last_change(svn_wc__db_t *db, > + const char *local_abspath, > + svn_revnum_t changed_rev, > + apr_time_t changed_date, > + const char *changed_author, > + apr_pool_t *scratch_pool) > +{ > + svn_wc__db_pdh_t *pdh; > + svn_sqlite__stmt_t *stmt; > + const char *local_relpath; > + int affected; > + > + SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath)); > + > + SVN_ERR(parse_local_abspath(&pdh, &local_relpath, db, local_abspath, > + svn_sqlite__mode_readwrite, > + scratch_pool, scratch_pool)); > + VERIFY_USABLE_PDH(pdh); > + > + SVN_ERR(svn_sqlite__get_statement(&stmt, pdh->wcroot->sdb, > + STMT_UPDATE_BASE_LAST_CHANGE)); > + > + SVN_ERR(svn_sqlite__bindf(stmt, "isiis", > + pdh->wcroot->wc_id, local_relpath, > + (apr_int64_t)changed_rev, > + (apr_int64_t)changed_date, > + changed_author)); > + > + SVN_ERR(svn_sqlite__update(&affected, stmt)); > + > + /* ### Theoretically this check can fail if all the values match > + the values in the database. But we only call this function > + if the revision changes */ > + if (affected != 1) > + return svn_error_createf(SVN_ERR_WC_PATH_NOT_FOUND, NULL, > + _("'%s' has no BASE_NODE"), > + svn_dirent_local_style(local_abspath, > + scratch_pool)); > + > + flush_entries(pdh); > + > + return SVN_NO_ERROR; > +} > + > +svn_error_t * > +svn_wc__db_temp_op_set_working_last_change(svn_wc__db_t *db, > + const char *local_abspath, > + svn_revnum_t changed_rev, > + apr_time_t changed_date, > + const char *changed_author, > + apr_pool_t *scratch_pool) > +{ > + svn_wc__db_pdh_t *pdh; > + svn_sqlite__stmt_t *stmt; > + const char *local_relpath; > + int affected; > + > + SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath)); > + > + SVN_ERR(parse_local_abspath(&pdh, &local_relpath, db, local_abspath, > + svn_sqlite__mode_readwrite, > + scratch_pool, scratch_pool)); > + VERIFY_USABLE_PDH(pdh); > + > + SVN_ERR(svn_sqlite__get_statement(&stmt, pdh->wcroot->sdb, > + STMT_UPDATE_WORKING_LAST_CHANGE)); > + > + SVN_ERR(svn_sqlite__bindf(stmt, "isiis", > + pdh->wcroot->wc_id, local_relpath, > + (apr_int64_t)changed_rev, > + (apr_int64_t)changed_date, > + changed_author)); > + > + SVN_ERR(svn_sqlite__update(&affected, stmt)); > + > + /* The following check might fail if none of the values changes. > + But currently this function is never called in such cases */ > + if (affected != 1) > + return svn_error_createf(SVN_ERR_WC_PATH_NOT_FOUND, NULL, > + _("'%s' has no WORKING_NODE"), > + svn_dirent_local_style(local_abspath, > + scratch_pool)); > + > + flush_entries(pdh); > + > + return SVN_NO_ERROR; > +} > > Modified: subversion/trunk/subversion/libsvn_wc/wc_db.h > URL: > http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc_db.h?rev=918542&r1=918541&r2=918542&view=diff > ============================================================================== > --- subversion/trunk/subversion/libsvn_wc/wc_db.h (original) > +++ subversion/trunk/subversion/libsvn_wc/wc_db.h Wed Mar 3 16:15:27 2010 > @@ -2034,6 +2034,24 @@ > apr_pool_t *scratch_pool); > > > +/* Update changed information in BASE_NODE with the supplied values */ > +svn_error_t * > +svn_wc__db_temp_op_set_base_last_change(svn_wc__db_t *db, > + const char *local_abspath, > + svn_revnum_t changed_rev, > + apr_time_t changed_date, > + const char *changed_author, > + apr_pool_t *scratch_pool); > + > +/* Update changed information in WORKING_NODE with the supplied values */ > +svn_error_t * > +svn_wc__db_temp_op_set_working_last_change(svn_wc__db_t *db, > + const char *local_abspath, > + svn_revnum_t changed_rev, > + apr_time_t changed_date, > + const char *changed_author, > + apr_pool_t *scratch_pool); > + > /** @} */ > > > > >