Hi, The patch should be pretty much self-explanatory. It makes no sense for the caller of the commit editor to find out the repository's URL. This information is actually accessible but hidden inside the `edit_baton` structure; but this structure is not public and the caller simply sees a void pointer. As long as the path relative to the repository's root is present in the repository, it should be enough for the commit editor. I assume that it's currently comparing against the full URL for some historical reasons.
I realize that this patch will break too many things, and hence it is not intended for inclusion. However, I just thought it would be nice to point this out so anyone starting out to build a new commit editor will be able to use this information. Index: commit.c =================================================================== --- commit.c (revision 981223) +++ commit.c (working copy) @@ -307,6 +307,7 @@ add_directory(const char *path, svn_fs_root_t *copy_root; svn_node_kind_t kind; size_t repos_url_len; + svn_boolean_t is_dir; /* Copy requires recursive write access to the destination path and write access to the parent path. */ @@ -324,16 +325,17 @@ add_directory(const char *path, if ((kind != svn_node_none) && (! pb->was_copied)) return out_of_date(full_path, kind); - /* For now, require that the url come from the same repository - that this commit is operating on. */ + /* Check that copy_path is present in the repository */ copy_path = svn_path_uri_decode(copy_path, subpool); repos_url_len = strlen(eb->repos_url); - if (strncmp(copy_path, eb->repos_url, repos_url_len) != 0) + svn_fs_is_dir(&is_dir, eb->txn_root, copy_path, subpool); + if (!is_dir) return svn_error_createf (SVN_ERR_FS_GENERAL, NULL, - _("Source url '%s' is from different repository"), copy_path); + _("Directory '%s' cannot be found in this repository"), + copy_path); - fs_path = apr_pstrdup(subpool, copy_path + repos_url_len); + fs_path = apr_pstrdup(subpool, copy_path); /* Now use the "fs_path" as an absolute path within the repository to make the copy from. */ @@ -452,6 +454,7 @@ add_file(const char *path, svn_fs_root_t *copy_root; svn_node_kind_t kind; size_t repos_url_len; + svn_boolean_t is_file; /* Copy requires recursive write to the destination path and parent path. */ @@ -468,16 +471,17 @@ add_file(const char *path, if ((kind != svn_node_none) && (! pb->was_copied)) return out_of_date(full_path, kind); - /* For now, require that the url come from the same repository - that this commit is operating on. */ + /* Check that copy_path is present in the repository */ copy_path = svn_path_uri_decode(copy_path, subpool); repos_url_len = strlen(eb->repos_url); - if (strncmp(copy_path, eb->repos_url, repos_url_len) != 0) + svn_fs_is_file(&is_file, eb->txn_root, copy_path, subpool); + if (!is_file) return svn_error_createf (SVN_ERR_FS_GENERAL, NULL, - _("Source url '%s' is from different repository"), copy_path); + _("File '%s' cannot be found in this repository"), + copy_path); - fs_path = apr_pstrdup(subpool, copy_path + repos_url_len); + fs_path = apr_pstrdup(subpool, copy_path); /* Now use the "fs_path" as an absolute path within the repository to make the copy from. */