On Thu, Dec 22, 2011 at 6:31 PM, <s...@apache.org> wrote: > Author: stsp > Date: Fri Dec 23 00:31:51 2011 > New Revision: 1222521 > > URL: http://svn.apache.org/viewvc?rev=1222521&view=rev > Log: > Turn another wc-db assertion people are reporting into a normal error. > > * subversion/libsvn_wc/wc_db.c > (read_children_info): If a node from an unexpected repository is found, > don't assert but print an informative error message. > > Modified: > subversion/trunk/subversion/libsvn_wc/wc_db.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=1222521&r1=1222520&r2=1222521&view=diff > ============================================================================== > --- subversion/trunk/subversion/libsvn_wc/wc_db.c (original) > +++ subversion/trunk/subversion/libsvn_wc/wc_db.c Fri Dec 23 00:31:51 2011 > @@ -7231,7 +7231,7 @@ read_children_info(void *baton, > svn_boolean_t have_row; > const char *repos_root_url = NULL; > const char *repos_uuid = NULL; > - apr_int64_t last_repos_id; > + apr_int64_t last_repos_id = INVALID_REPOS_ID; > apr_hash_t *nodes = rci->nodes; > apr_hash_t *conflicts = rci->conflicts; > apr_pool_t *result_pool = rci->result_pool; > @@ -7299,20 +7299,54 @@ read_children_info(void *baton, > } > else > { > + const char *last_repos_root_url = NULL; > + const char *last_repos_uuid = NULL; > + > apr_int64_t repos_id = svn_sqlite__column_int64(stmt, 1); > - if (!repos_root_url) > + if (!repos_root_url || > + (last_repos_id != INVALID_REPOS_ID && > + repos_id != last_repos_id)) > { > + last_repos_root_url = repos_root_url; > + last_repos_uuid = repos_uuid; > err = fetch_repos_info(&repos_root_url, &repos_uuid, > wcroot->sdb, repos_id, result_pool); > if (err) > SVN_ERR(svn_error_compose_create(err, > - > svn_sqlite__reset(stmt))); > - last_repos_id = repos_id; > + svn_sqlite__reset(stmt))); > } > > + if (last_repos_id == INVALID_REPOS_ID) > + last_repos_id = repos_id; > + > /* Assume working copy is all one repos_id so that a > single cached value is sufficient. */ > - SVN_ERR_ASSERT(repos_id == last_repos_id); > + if (repos_id != last_repos_id) > + return svn_error_createf( > + SVN_ERR_WC_DB_ERROR, NULL, > + _("The node '%s' comes from unexpected repository " > + "(ID '%" APR_INT64_T_FMT "'%s%s, expected ID '%" > + APR_INT64_T_FMT"'%s%s); this could be a " > + "misconfigured file-external which points to a " > + "foreign repository"), > + child_relpath, repos_id, > + repos_root_url > + ? apr_psprintf(scratch_pool, ", URL '%s'", > + repos_root_url) > + : "", > + repos_uuid > + ? apr_psprintf(scratch_pool, ", UUID '%s'", > + repos_uuid) > + : "", > + last_repos_id, > + last_repos_root_url > + ? apr_psprintf(scratch_pool, ", URL '%s'", > + last_repos_root_url) > + : "", > + last_repos_uuid > + ? apr_psprintf(scratch_pool, ", UUID '%s'", > + last_repos_uuid) > + : "");
Yikes! I think this wins the prize for "longest function call". Perhaps a helper function or at least some temporary variables would be in order? -Hyrum > child->repos_root_url = repos_root_url; > child->repos_uuid = repos_uuid; > } > > -- uberSVN: Apache Subversion Made Easy http://www.uberSVN.com/