> -----Original Message-----
> From: Paul Burba [mailto:ptbu...@gmail.com]
> Sent: donderdag 25 april 2013 21:38
> To: Philip Martin
> Cc: Bert Huijben; Subversion Development
> Subject: Re: svn commit: r1470904 -
> /subversion/trunk/subversion/libsvn_wc/wc-metadata.sql
> 
> On Thu, Apr 25, 2013 at 1:05 PM, Philip Martin
> <philip.mar...@wandisco.com> wrote:
> > Paul Burba <ptbu...@gmail.com> writes:
> >
> >>> # We expect the repos root property to show up here!
> >>>
> >>> 1.9.0-dev@1475809>svn pg svn:auto-props . --show-inherited-props
> >>>
> >>> 1.9.0-dev@1475809>
> >
> > Is that expected?  The inherited property is not in the 1.7 working
> > copy.  Do you expect upgrade to contact the repository and add the
> > inherited properties to the upgraded working copy?  Nobody has written
> > code to do that as far as I can see.  Or do you expect propget to
> > contact the repository?  As far as I can see inherited properties are
> > not available from the working copy until an update has be carried out.
> 
> My mistake Philip, you are quite right about the cache not being
> updated until an update takes place.  I was looking at the db and saw
> that no empty cache was created, so I didn't bother with the update
> that (I thought) wouldn't make a difference.  My earlier example
> expanded a bit:
> 
> 1.9.0-dev@1475809>cd wc-non-root
> 
> 1.9.0-dev@1475809>svn st
> ..\..\..\subversion\svn\svn.c:2899:
> (apr_err=SVN_ERR_WC_UPGRADE_REQUIRED)
> svn: E155036: Please see the 'svn upgrade' command
> ..\..\..\subversion\svn\status-cmd.c:352,
> ..\..\..\subversion\svn\util.c:621,
> ..\..\..\subversion\libsvn_client\status.c:590,
> ..\..\..\subversion\libsvn_wc\status.c:2817,
> ..\..\..\subversion\libsvn_wc\status.c:2723,
> ..\..\..\subversion\libsvn_wc\status.c:270,
> ..\..\..\subversion\libsvn_wc\wc_db.c:8446,
> ..\..\..\subversion\libsvn_wc\wc_db_wcroot.c:687,
> ..\..\..\subversion\libsvn_wc\wc_db_wcroot.c:317:
> (apr_err=SVN_ERR_WC_UPGRADE_REQUIRED)
> svn: E155036: The working copy at
> 'C:\SVN\src-branch-1.7.x\Debug\subversion\tests\cmdline\svn-test-
> work\working_copies\wc-non-root'
> is too old (format 29) to work with client version '1.9.0-dev (under
> development)' (expects format 31). You need to upgrade the working
> copy first.
> 
> 1.9.0-dev@1475809>svn upgrade
> 
> # Note that all the INHERITED_PROPS fields are null:
> 
> 1.9.0-dev@1475809>sqlite3 .svn\wc.db
> SQLite version 3.7.16.2 2013-04-12 11:52:43
> Enter ".help" for instructions
> Enter SQL statements terminated with a ";"
> sqlite> select LOCAL_RELPATH, INHERITED_PROPS from NODES;
> E/alpha|
> E/beta|
> E|
> F|
> lambda|
> |
> sqlite>
> 
> # Turns out, that once we update, the missing cache is created and
> populated:
> 
> 1.9.0-dev@1475809>svn up
> Updating '.':
> At revision 9.
> 
> 1.9.0-dev@1475809>sqlite3 .svn\wc.db
> SQLite version 3.7.16.2 2013-04-12 11:52:43
> Enter ".help" for instructions
> Enter SQL statements terminated with a ";"
> sqlite> select LOCAL_RELPATH, INHERITED_PROPS from NODES;
> E/alpha|
> E/beta|
> E|
> F|
> lambda|
> |(0  (rootprop propval svn:auto-props 26 *.c = svn:eol-style=native))
> sqlite>
> ^C
> 1.9.0-dev@1475809>
> 
> However the fact that the missing empty cache is created and populated
> is just a fortuitous side effect of how we handle externals[1].

There is nothing special about externals in the following code.

We run a separate update for an external... so this is just yet another update 
of a working copy from its root. And there is nothing we can change there 
without both a ra layer and a wc layer redesign... which would take at least a 
format bump.

The problem is in the query... I expected the clause for the working copy to be 
TRUE by testing l.repos_id against r.repos_id (which is NULL for the repository 
root). The problem in the query was that we then still checked r.wc_id against 
0... while r.wc_id is NULL.

        Bert

> Assuming we don't want to rely on that bit of good luck indefinitely,
> how about this?
> 
> Index: subversion/libsvn_wc/wc-metadata.sql
> ==========================================================
> =========
> --- subversion/libsvn_wc/wc-metadata.sql        (revision 1475906)
> +++ subversion/libsvn_wc/wc-metadata.sql        (working copy)
> @@ -841,10 +841,11 @@
>  LEFT OUTER JOIN nodes as r
>  ON l.wc_id = r.wc_id
>     AND r.local_relpath = l.parent_relpath
> -WHERE l.op_depth = 0 AND r.op_depth = 0
> -  AND l.repos_path != ''
> -  AND ((l.repos_id IS NOT r.repos_id)
> -       OR (l.repos_path IS NOT RELPATH_SKIP_JOIN(r.local_relpath,
> r.repos_path, l.local_relpath)))
> +WHERE (l.op_depth = 0 AND l.local_relpath = '' AND l.repos_path != '')
> +  OR (l.op_depth = 0 AND r.op_depth = 0
> +      AND l.repos_path != ''
> +      AND ((l.repos_id IS NOT r.repos_id)
> +           OR (l.repos_path IS NOT RELPATH_SKIP_JOIN(r.local_relpath,
> r.repos_path, l.local_relpath))))
> 
> 
>  /* ------------------------------------------------------------------------- 
> */
> 
> 
> 
> --
> Paul T. Burba
> CollabNet, Inc. -- www.collab.net -- Enterprise Cloud Development
> Skype: ptburba
> 
> [1] See libsvn_client/iprops.c:get_inheritable_props():
> 
> /* The real implementation of svn_client__get_inheritable_props */
> static svn_error_t *
> get_inheritable_props(apr_hash_t **wcroot_iprops,
>                       const char *local_abspath,
>                       svn_revnum_t revision,
>                       svn_depth_t depth,
>                       svn_ra_session_t *ra_session,
>                       svn_client_ctx_t *ctx,
>                       apr_pool_t *result_pool,
>                       apr_pool_t *scratch_pool)
> {
>   apr_hash_t *iprop_paths;
>   apr_hash_index_t *hi;
>   apr_pool_t *iterpool = svn_pool_create(scratch_pool);
>   apr_pool_t *session_pool = NULL;
>   *wcroot_iprops = apr_hash_make(result_pool);
> 
>   SVN_ERR_ASSERT(SVN_IS_VALID_REVNUM(revision));
> 
>   /* If we don't have a base revision for LOCAL_ABSPATH then it can't
>      possibly be a working copy root, nor can it contain any WC roots
>      in the form of switched subtrees.  So there is nothing to cache. */
> 
>   SVN_ERR(svn_wc__get_cached_iprop_children(&iprop_paths, depth,
>                                             ctx->wc_ctx, local_abspath,
>                                             scratch_pool, iterpool));
> 
>   /* If we are in the midst of a checkout or an update that is bringing in
>      an external, then svn_wc__get_cached_iprop_children won't return
>      LOCAL_ABSPATH in IPROPS_PATHS because the former has no cached
> iprops
>      yet.  So make sure LOCAL_ABSPATH is present if it's a WC root. */
> 
> We enter this block when we update the WC root
> VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
> 
>   if (!svn_hash_gets(iprop_paths, local_abspath))
>     {
>       svn_boolean_t needs_cached_iprops;
> 
>       SVN_ERR(need_to_cache_iprops(&needs_cached_iprops, local_abspath,
>                                    ra_session, ctx, iterpool));
>       if (needs_cached_iprops)
>         {
>           const char *target_abspath = apr_pstrdup(scratch_pool,
>                                                    local_abspath);
> 
>           /* As value we set TARGET_ABSPATH, but any string besides ""
>              would do */
>           svn_hash_sets(iprop_paths, target_abspath, target_abspath);
>         }
>     }

Reply via email to