Alien-SVN
view release on metacpan or search on metacpan
src/subversion/subversion/libsvn_wc/lock.c view on Meta::CPAN
SVN_ERR(svn_wc__db_wclock_release(wc_ctx->db, local_abspath, scratch_pool));
return SVN_NO_ERROR;
}
svn_error_t *
svn_wc__call_with_write_lock(svn_wc__with_write_lock_func_t func,
void *baton,
svn_wc_context_t *wc_ctx,
const char *local_abspath,
svn_boolean_t lock_anchor,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_error_t *err1, *err2;
const char *lock_root_abspath;
SVN_ERR(svn_wc__acquire_write_lock(&lock_root_abspath, wc_ctx, local_abspath,
lock_anchor, scratch_pool, scratch_pool));
err1 = svn_error_trace(func(baton, result_pool, scratch_pool));
err2 = svn_wc__release_write_lock(wc_ctx, lock_root_abspath, scratch_pool);
return svn_error_compose_create(err1, err2);
}
svn_error_t *
svn_wc__acquire_write_lock_for_resolve(const char **lock_root_abspath,
svn_wc_context_t *wc_ctx,
const char *local_abspath,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_boolean_t locked = FALSE;
const char *obtained_abspath;
const char *requested_abspath = local_abspath;
while (!locked)
{
const char *required_abspath;
const char *child;
SVN_ERR(svn_wc__acquire_write_lock(&obtained_abspath, wc_ctx,
requested_abspath, FALSE,
scratch_pool, scratch_pool));
locked = TRUE;
SVN_ERR(svn_wc__required_lock_for_resolve(&required_abspath,
wc_ctx->db, local_abspath,
scratch_pool, scratch_pool));
/* It's possible for the required lock path to be an ancestor
of, a descendent of, or equal to, the obtained lock path. If
it's an ancestor we have to try again, otherwise the obtained
lock will do. */
child = svn_dirent_skip_ancestor(required_abspath, obtained_abspath);
if (child && child[0])
{
SVN_ERR(svn_wc__release_write_lock(wc_ctx, obtained_abspath,
scratch_pool));
locked = FALSE;
requested_abspath = required_abspath;
}
else
{
/* required should be a descendent of, or equal to, obtained */
SVN_ERR_ASSERT(!strcmp(required_abspath, obtained_abspath)
|| svn_dirent_skip_ancestor(obtained_abspath,
required_abspath));
}
}
*lock_root_abspath = apr_pstrdup(result_pool, obtained_abspath);
return SVN_NO_ERROR;
}
( run in 0.550 second using v1.01-cache-2.11-cpan-71847e10f99 )