On Wed, Feb 22, 2012 at 12:05 PM, Philip Martin
<[email protected]> wrote:
> Paul Burba <[email protected]> writes:
>
>> Index: subversion/libsvn_client/copy.c
>> ===================================================================
>> --- subversion/libsvn_client/copy.c (revision 1292379)
>> +++ subversion/libsvn_client/copy.c (working copy)
>> @@ -1519,6 +1519,17 @@
>> ctx->notify_baton2 = old_notify_baton2;
>>
>> SVN_ERR(err);
>> +
>> +#ifdef WIN32
>> + if (!ignore_externals)
>> + {
>> + /* Issue #4123: We may still hold file handles to the databases
>> + for externals under TMP_ABSPATH. We need to release these
>> + handles before we move TMP_ABSPATH below or Windows will
>> + raise an ERROR_ACCESS_DENIED error. */
>> + SVN_ERR(svn_wc__externals_close(tmp_abspath, ctx->wc_ctx,
>> pool));
>> + }
>> +#endif
>
> I'm not sure why this would be windows specific. Yes, Linux lets us
> move the dir with the handle open but I think it would be an error for
> the Subversion client to use the handle after the move.
Hi Philip,
OK, both you and Bert pointed this out, so it's gone.
> Is this the best way to do it? It isn't what I was expecting. I was
> expecting the checkout code to explicitly close the handles it was
> responsible for opening. Then the copy code would not have to do
> anything special.
Are you thinking within svn_client__checkout_internal or from its
caller, like the attached patch?
Paul
Index: subversion/include/private/svn_wc_private.h
===================================================================
--- subversion/include/private/svn_wc_private.h (revision 1292379)
+++ subversion/include/private/svn_wc_private.h (working copy)
@@ -263,6 +263,15 @@
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
+/* Close the DB for LOCAL_ABSPATH. Perform temporary allocations in
+ SCRATCH_POOL.
+
+ Wraps svn_wc__db_drop_root(). */
+svn_error_t *
+svn_wc__close_db(const char *external_abspath,
+ svn_wc_context_t *wc_ctx,
+ apr_pool_t *scratch_pool);
+
/** Set @a *tree_conflict to a newly allocated @c
* svn_wc_conflict_description_t structure describing the tree
* conflict state of @a victim_abspath, or to @c NULL if @a victim_abspath
Index: subversion/libsvn_client/externals.c
===================================================================
--- subversion/libsvn_client/externals.c (revision 1292379)
+++ subversion/libsvn_client/externals.c (working copy)
@@ -299,6 +299,9 @@
external_peg_rev,
external_rev,
pool));
+ /* Issue #4123: We don't need to keep the newly checked out external's
+ DB open. */
+ SVN_ERR(svn_wc__close_db(local_abspath, ctx->wc_ctx, pool));
}
return SVN_NO_ERROR;
Index: subversion/libsvn_wc/externals.c
===================================================================
--- subversion/libsvn_wc/externals.c (revision 1292379)
+++ subversion/libsvn_wc/externals.c (working copy)
@@ -1363,6 +1363,16 @@
}
}
+svn_error_t *
+svn_wc__close_db(const char *external_abspath,
+ svn_wc_context_t *wc_ctx,
+ apr_pool_t *scratch_pool)
+{
+ SVN_ERR(svn_wc__db_drop_root(wc_ctx->db, external_abspath,
+ scratch_pool));
+ return SVN_NO_ERROR;
+}
+
/* Return the scheme of @a uri in @a scheme allocated from @a pool.
If @a uri does not appear to be a valid URI, then @a scheme will
not be updated. */