svn_error_t * svn_client__switch_internal(svn_revnum_t *result_rev, const char *path, const char *switch_url, const svn_opt_revision_t *peg_revision, const svn_opt_revision_t *revision, svn_depth_t depth, svn_boolean_t depth_is_sticky, svn_boolean_t ignore_externals, svn_boolean_t allow_unver_obstructions, svn_boolean_t ignore_ancestry, svn_boolean_t *timestamp_sleep, svn_client_ctx_t *ctx, apr_pool_t *pool) { const char *local_abspath, *anchor_abspath; svn_boolean_t acquired_lock; svn_error_t *err, *err1, *err2; apr_hash_t *conflicted_paths = ctx->conflict_func2 ? apr_hash_make(pool) : NULL; SVN_ERR_ASSERT(path); SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool)); /* Rely on svn_wc__acquire_write_lock setting ANCHOR_ABSPATH even when it returns SVN_ERR_WC_LOCKED */ err = svn_wc__acquire_write_lock(&anchor_abspath, ctx->wc_ctx, local_abspath, TRUE, pool, pool); if (err && err->apr_err != SVN_ERR_WC_LOCKED) return svn_error_trace(err); acquired_lock = (err == SVN_NO_ERROR); svn_error_clear(err); err1 = switch_internal(result_rev, conflicted_paths, local_abspath, anchor_abspath, switch_url, peg_revision, revision, depth, depth_is_sticky, ignore_externals, allow_unver_obstructions, ignore_ancestry, timestamp_sleep, ctx, pool); /* Give the conflict resolver callback the opportunity to * resolve any conflicts that were raised. */ if (! err1 && ctx->conflict_func2) { err1 = svn_client__resolve_conflicts(NULL, conflicted_paths, ctx, pool); } if (acquired_lock) err2 = svn_wc__release_write_lock(ctx->wc_ctx, anchor_abspath, pool); else err2 = SVN_NO_ERROR; return svn_error_compose_create(err1, err2); }
svn_error_t * svn_client__switch_internal(svn_revnum_t *result_rev, const char *path, const char *switch_url, const svn_opt_revision_t *peg_revision, const svn_opt_revision_t *revision, svn_depth_t depth, svn_boolean_t depth_is_sticky, svn_boolean_t ignore_externals, svn_boolean_t allow_unver_obstructions, svn_boolean_t ignore_ancestry, svn_boolean_t *timestamp_sleep, svn_client_ctx_t *ctx, apr_pool_t *pool) { const char *local_abspath, *anchor_abspath; svn_boolean_t acquired_lock; svn_error_t *err, *err1, *err2; SVN_ERR_ASSERT(path); SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool)); /* Rely on svn_wc__acquire_write_lock setting ANCHOR_ABSPATH even when it returns SVN_ERR_WC_LOCKED */ err = svn_wc__acquire_write_lock(&anchor_abspath, ctx->wc_ctx, local_abspath, TRUE, pool, pool); if (err && err->apr_err != SVN_ERR_WC_LOCKED) return svn_error_trace(err); acquired_lock = (err == SVN_NO_ERROR); svn_error_clear(err); err1 = switch_internal(result_rev, local_abspath, anchor_abspath, switch_url, peg_revision, revision, depth, depth_is_sticky, ignore_externals, allow_unver_obstructions, ignore_ancestry, timestamp_sleep, ctx, pool); if (acquired_lock) err2 = svn_wc__release_write_lock(ctx->wc_ctx, anchor_abspath, pool); else err2 = SVN_NO_ERROR; return svn_error_compose_create(err1, err2); }