"Bert Huijben" <b...@vmoo.com> writes:

>> +-- STMT_INSERT_WORKING_NODE_FROM_BASE_NODE
>> +INSERT INTO WORKING_NODE (
>> +    wc_id, local_relpath, parent_relpath, presence, kind, checksum,
>> +    translated_size, changed_rev, changed_date, changed_author, depth,
>> +    symlink_target, last_mod_time )
>> +SELECT wc_id, local_relpath, parent_relpath, presence, kind, checksum,
>> +    translated_size, changed_rev, changed_date, changed_author, depth,
>> +    symlink_target, last_mod_time FROM BASE_NODE WHERE wc_id = ?1
>> AND
>> +local_relpath = ?2;
>
> I'm not sure how generic this copy from base to working is. I think
> it is only valid for a few of the presence states. (Maybe use a more
> specific name?)

I'd really like an SQL statement that allows me to set the presence as
?3 while pulling the other values from BASE, but I don't know if that
is possible.

>> +/* A WORKING version of svn_wc__db_base_get_info, stripped down to
>> +   just the status column. */
>> +static svn_error_t *
>> +db_working_get_status(svn_wc__db_status_t *status,
>> +                      svn_wc__db_t *db,
>> +                      const char *local_abspath,
>> +                      apr_pool_t *result_pool,
>> +                      apr_pool_t *scratch_pool) {
>
> Why reimplement this whole function if a
>
> return svn_error_return(
>   svn_wc__db_read_status(status, ..... several NULLs..., db, local_abspath, 
> scratch_pool...) would suffice?
>
> _read_info is optimized for the case with many NULLs and has tests
> on it. (And we didn't see performance reasons yet to do this same
> split for several other helpers)

I want both the base and the working presence, the base presence comes
from base_get_info but I couldn't see how to reliably distinguish
working presence from base presence when using _read_info.  I get
SVN_ERR_WC_PATH_NOT_FOUND for no base and no working, and
base_shadowed TRUE for base and working, but it was not clear how to
distinguish base and no working from no base and working.

> (The result_pool argument from your function is not necessary as
> status is no structure that needs allocation)

Noted.

>> +/* Update the working node for LOCAL_ABSPATH setting presence=STATUS
>> */
>> +static svn_error_t * db_working_update_presence(svn_wc__db_status_t
>> +status,
>> +                           svn_wc__db_t *db,
>> +                           const char *local_abspath,
>> +                           apr_pool_t *scratch_pool)
>
> For which presence states does this function work?

It uses presence_map.

> I think the supported list should be in the docstring and asserted
> on top of the function, like all other svn_wc__db functions do.
>
> (I reviewed the base-deleted case... I don't think it is safe for
> any other presence?)

It's used to set base-deleted or not-present. What do you mean by safe?

>> +/* Insert a working node for LOCAL_ABSPATH with presence=STATUS. */
>> +static svn_error_t * db_working_insert(svn_wc__db_status_t status,
>> +                  svn_wc__db_t *db,
>> +                  const char *local_abspath,
>> +                  apr_pool_t *scratch_pool) {
>
> Which presences does this support?
>
> Only base-delete?

I believe so, I could have hard-coded it.

> It certainly can't handle cases where the node kind between BASE and
> WORKING differ and many other cases.
>
>> +static svn_error_t*
>> +is_root_of_copy(svn_boolean_t *root_of_copy,
>> +                svn_wc__db_t *db,
>> +                const char *local_abspath,
>> +                apr_pool_t *scratch_pool) {
>> +  svn_wc__db_status_t status;
>> +  const char *op_root_abspath;
>> +  const char *original_repos_relpath, *original_repos_root;
>> +  const char *original_repos_uuid;
>> +  svn_revnum_t original_revision;
>> +
>> +  SVN_ERR(svn_wc__db_scan_addition(&status, &op_root_abspath,
>> +                                   NULL, NULL, NULL,
>> +                                   &original_repos_relpath,
>> +                                   &original_repos_root,
>> +                                   &original_repos_uuid,
>> +                                   &original_revision,
>> +                                   db, local_abspath,
>> +                                   scratch_pool, scratch_pool));
>> 
>> -      if (!deleted)
>> -        {
>> -          /* This case is easy.. Just delete the entry */
>> -          SVN_ERR(svn_wc__entry_remove(db, local_abspath, scratch_pool));
>> -          SVN_ERR(svn_wc__db_temp_forget_directory(db, local_abspath,
>> scratch_pool));
>> +  SVN_ERR_ASSERT(status == svn_wc__db_status_added
>> +                 || status == svn_wc__db_status_copied);
>> 
>> -          return SVN_NO_ERROR;
>> +  *root_of_copy = op_root_abspath && !strcmp(local_abspath,
>> + op_root_abspath);
>> +
>> +  if (*root_of_copy && status == svn_wc__db_status_copied)
>> +    {
>> +      /* ### merge sets the wrong copyfrom when adding a tree and so
>> +             the root detection above is unreliable.  I'm "fixing" it
>> +             here because I just need to detect whether this is an
>> +             instance of the merge bug, and that's easier than fixing
>> +             scan_addition or merge. */
>
> Adds can be merged by design, so you don't just see this behavior
> below merges!

I saw an explict merge bug that caused op_root_abspath to have the
wrong value.  I didn't see that behaviour with add but perhaps the
regresssion tests don't trigger it.

I think I should rename this function.  It's about making the "remove
or set not-present" decision, I've been using "root of copy" but
really it's "add or root of copy" versus "within copy".

> Calls like
> svn cp ^/trunk A
> svn cp ^/branches/B A/B
>
> give you two copy roots below each other (and you can have N of
> them). You really need to loop/recurse upwards to find the place
> where the copy is added to or replaces a base node.
>
> Each of these needs different handling on delete with WC-NG. (A/B
> was not really handled that well via entries especially if it was a
> replacement).
>
> This specific case also touches the issue that we can't describe a
> local add below a copy yet. (I think you raised that issue yourself)

I've also noticed that I left in the STMT_UPDATE_WORKING_KIND code
which is not needed.  It was temporary code I put in while trying to
get the parent stub stuff to work.

-- 
Philip

Reply via email to