Re: [PATCH] Accept --force for switch --relocate was Re: Possible SVN Relocate bug
From: Justin Erenkrantz <justin_at_erenkrantz.com>
Date: 2007-03-14 17:16:12 CET
On 3/14/07, Peter Lundblad <plundblad@google.com> wrote:
Well, the validator function already takes in a 'const char *url'
That said, is the patch below what you had in mind?
> This would avoid the problem altogether without the user having to run with
My hunch is that supporting --force is also a good thing if the user
Thanks. -- justin
----
Allow switch --relocate to work against directly unreadable repos roots.
Instead we need to call svn_ra_get_repos_root with the base URL as that is
expected to be readable.
* subversion/include/svn_wc.h
(svn_wc_relocation_validator3_t): New prototype.
(svn_wc_relocation_validator2_t): Deprecate.
(svn_wc_relocate3): New prototype.
(svn_wc_relocate2): Deprecate.
* subversion/libsvn_wc/relocate.c
(relocate_entry): Take in svn_wc_relocation_validator3_t and send in new
args; only do the repos root change if our URL changed too.
(svn_wc_relocate3): Take in new prototype.
(compat2_validator, compat_validator): Wrap around validator3_t.
(svn_wc_relocate2, svn_wc_relocate1): Wrap around relocate3().
* subversion/libsvn_client/relocate.c
(validator_func): Adjust for prototype change.
(svn_client_relocate): Call new wc function.
Index: subversion/include/svn_wc.h
===================================================================
--- subversion/include/svn_wc.h (revision 23808)
+++ subversion/include/svn_wc.h (working copy)
@@ -3449,8 +3449,19 @@
* is the repository root. Else, it can be an URL inside the repository.
* @a pool may be used for temporary allocations.
*
- * @since New in 1.4.
+ * @since New in 1.5.
*/
+typedef svn_error_t *(*svn_wc_relocation_validator3_t)(void *baton,
+ const char *uuid,
+ const char *url,
+ const char *root_url,
+ apr_pool_t *pool);
+
+/** Similar to @c svn_wc_relocation_validator3_t, but without
+ * the @a root_url arguments.
+ *
+ * @deprecated Provided for backwards compatibility with the 1.4 API.
+ */
typedef svn_error_t *(*svn_wc_relocation_validator2_t)(void *baton,
const char *uuid,
const char *url,
@@ -3476,6 +3487,19 @@
* @a path.
*/
svn_error_t *
+svn_wc_relocate3(const char *path,
+ svn_wc_adm_access_t *adm_access,
+ const char *from,
+ const char *to,
+ svn_boolean_t recurse,
+ svn_wc_relocation_validator3_t validator,
+ void *validator_baton,
+ apr_pool_t *pool);
+
+/** Similar to svn_wc_relocate3(), but uses @c svn_wc_relocation_validator2_t.
+ *
+ * @deprecated Provided for backwards compatibility with the 1.4 API. */
+svn_error_t *
svn_wc_relocate2(const char *path,
svn_wc_adm_access_t *adm_access,
const char *from,
Index: subversion/libsvn_wc/relocate.c
===================================================================
--- subversion/libsvn_wc/relocate.c (revision 23808)
+++ subversion/libsvn_wc/relocate.c (working copy)
@@ -42,7 +42,7 @@
const svn_wc_entry_t *entry,
const char *from,
const char *to,
- svn_wc_relocation_validator2_t validator,
+ svn_wc_relocation_validator3_t validator,
void *validator_baton,
svn_boolean_t do_sync,
apr_pool_t *pool)
@@ -51,8 +51,17 @@
apr_uint64_t flags = 0;
apr_size_t from_len = strlen(from);
- if (entry->repos)
+ if (entry->url && ! strncmp(entry->url, from, from_len))
{
+ entry2.url = apr_pstrcat(pool, to, entry->url + from_len, NULL);
+ if (entry->uuid)
+ SVN_ERR(validator(validator_baton, entry->uuid, entry2.url, NULL,
+ pool));
+ flags |= SVN_WC__ENTRY_MODIFY_URL;
+ }
+
+ if (entry->repos && (flags & SVN_WC__ENTRY_MODIFY_URL))
+ {
/* We can't relocate beyond the repository root, but the user is allowed
to specify a redundant part of the fs path in from and to, but only
if this part is identical in both strings. */
@@ -79,27 +88,18 @@
entry2.repos = apr_pstrcat(pool, to, entry->repos + from_len, NULL);
flags |= SVN_WC__ENTRY_MODIFY_REPOS;
/* Make sure to is really the repository root. */
- SVN_ERR(validator(validator_baton, entry->uuid, entry2.repos,
- TRUE, pool));
+ SVN_ERR(validator(validator_baton, entry->uuid, entry2.url,
+ entry2.repos, pool));
}
}
- if (entry->url && ! strncmp(entry->url, from, from_len))
- {
- entry2.url = apr_pstrcat(pool, to, entry->url + from_len, NULL);
- if (entry->uuid)
- SVN_ERR(validator(validator_baton, entry->uuid, entry2.url, FALSE,
- pool));
- flags |= SVN_WC__ENTRY_MODIFY_URL;
- }
-
if (entry->copyfrom_url && ! strncmp(entry->copyfrom_url, from, from_len))
{
entry2.copyfrom_url = apr_pstrcat(pool, to,
entry->copyfrom_url + from_len, NULL);
if (entry->uuid)
SVN_ERR(validator(validator_baton, entry->uuid,
- entry2.copyfrom_url, FALSE, pool));
+ entry2.copyfrom_url, NULL, pool));
flags |= SVN_WC__ENTRY_MODIFY_COPYFROM_URL;
}
@@ -110,12 +110,12 @@
}
svn_error_t *
-svn_wc_relocate2(const char *path,
+svn_wc_relocate3(const char *path,
svn_wc_adm_access_t *adm_access,
const char *from,
const char *to,
svn_boolean_t recurse,
- svn_wc_relocation_validator2_t validator,
+ svn_wc_relocation_validator3_t validator,
void *validator_baton,
apr_pool_t *pool)
{
@@ -171,7 +171,7 @@
continue;
SVN_ERR(svn_wc_adm_retrieve(&subdir_access, adm_access,
subdir, subpool));
- SVN_ERR(svn_wc_relocate2(subdir, subdir_access, from, to,
+ SVN_ERR(svn_wc_relocate3(subdir, subdir_access, from, to,
recurse, validator,
validator_baton, subpool));
}
@@ -187,17 +187,38 @@
}
/* Compatibility baton and wrapper. */
+struct compat2_baton {
+ svn_wc_relocation_validator2_t validator;
+ void *baton;
+};
+
+/* Compatibility baton and wrapper. */
struct compat_baton {
svn_wc_relocation_validator_t validator;
void *baton;
};
-/* This implements svn_wc_relocate_validator2_t. */
+/* This implements svn_wc_relocate_validator3_t. */
static svn_error_t *
+compat2_validator(void *baton,
+ const char *uuid,
+ const char *url,
+ const char *root_url,
+ apr_pool_t *pool)
+{
+ struct compat2_baton *cb = baton;
+ /* The old callback type doesn't set root_url. */
+ return cb->validator(cb->baton, uuid,
+ (root_url ? root_url : url), (root_url ? TRUE : FALSE),
+ pool);
+}
+
+/* This implements svn_wc_relocate_validator3_t. */
+static svn_error_t *
compat_validator(void *baton,
const char *uuid,
const char *url,
- svn_boolean_t root,
+ const char *root_url,
apr_pool_t *pool)
{
struct compat_baton *cb = baton;
@@ -208,6 +229,25 @@
}
svn_error_t *
+svn_wc_relocate2(const char *path,
+ svn_wc_adm_access_t *adm_access,
+ const char *from,
+ const char *to,
+ svn_boolean_t recurse,
+ svn_wc_relocation_validator2_t validator,
+ void *validator_baton,
+ apr_pool_t *pool)
+{
+ struct compat2_baton cb;
+
+ cb.validator = validator;
+ cb.baton = validator_baton;
+
+ return svn_wc_relocate3(path, adm_access, from, to, recurse,
+ compat_validator, &cb, pool);
+}
+
+svn_error_t *
svn_wc_relocate(const char *path,
svn_wc_adm_access_t *adm_access,
const char *from,
@@ -222,6 +262,6 @@
cb.validator = validator;
cb.baton = validator_baton;
- return svn_wc_relocate2(path, adm_access, from, to, recurse,
+ return svn_wc_relocate3(path, adm_access, from, to, recurse,
compat_validator, &cb, pool);
}
Index: subversion/libsvn_client/relocate.c
===================================================================
--- subversion/libsvn_client/relocate.c (revision 23808)
+++ subversion/libsvn_client/relocate.c (working copy)
@@ -55,7 +55,7 @@
validator_func(void *baton,
const char *uuid,
const char *url,
- svn_boolean_t root,
+ const char *root_url,
apr_pool_t *pool)
{
struct validator_baton_t *b = baton;
@@ -95,8 +95,8 @@
}
/* Make sure the url is a repository root if desired. */
- if (root
- && strcmp(url, url_uuid->root) != 0)
+ if (root_url
+ && strcmp(root_url, url_uuid->root) != 0)
return svn_error_createf(SVN_ERR_CLIENT_INVALID_RELOCATION, NULL,
_("'%s' is not the root of the repository"),
url);
@@ -133,7 +133,7 @@
vb.path = path;
vb.url_uuids = apr_array_make(pool, 1, sizeof(struct url_uuid_t));
vb.pool = pool;
- SVN_ERR(svn_wc_relocate2(path, adm_access, from, to,
+ SVN_ERR(svn_wc_relocate3(path, adm_access, from, to,
recurse, validator_func, &vb, pool));
/* All done. Clean up, and move on out. */
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Wed Mar 14 17:16:32 2007
|
This is an archived mail posted to the Subversion Dev mailing list.
This site is subject to the Apache Privacy Policy and the Apache Public Forum Archive Policy.