[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

Re: svn commit: r918542 - in /subversion/trunk/subversion/libsvn_wc: entries.c entries.h log.c old-and-busted.c update_editor.c wc-queries.sql wc_db.c wc_db.h

From: Greg Stein <gstein_at_gmail.com>
Date: Wed, 3 Mar 2010 11:21:43 -0500

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, <rhuijben_at_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);
> +
>  /** @} */
>
>
>
>
>
Received on 2010-03-03 17:22:20 CET

This is an archived mail posted to the Subversion Dev mailing list.