On Wed, 22 Nov 2006, Kamesh Jayachandran wrote:
> svn cp svn://host/path1 svn://host/path2
> Fails with vague error message "Unknown command 'Log'".
> There are some logical errors in the 'get-merge-info' network protocol
> between 'svn' and 'svnserve'.
>
> * subversion/libsvn_client/copy.c
> (repos_to_repos_copy):
> 'svnserve' gets confused when 'readonly actions' like 'log',
> 'get-merge-info' are invoked over a ra_session with a active commit_editor.
> So move the 'log' and 'get_merge_info' actions ahead of
> acquiring commit_editor.(i.e move 'calculate_target_merge_info'
> ahead of 'svn_ra_get_commit_editor2').
I've committed this portion of the patch to the branch in r22509.
> * subversion/svnserve/serve.c
> (get_merge_info):
> The incoming 'paths' tuple is an array of 'svn_ra_svn_item_t' and each
> item should be of kind 'SVN_RA_SVN_STRING'.
> The result is again a list of (path mergeinfo) tuple.
...
> Index: subversion/svnserve/serve.c
> ===================================================================
> --- subversion/svnserve/serve.c (revision 22389)
> +++ subversion/svnserve/serve.c (working copy)
> @@ -1354,8 +1354,15 @@
> SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "l(?r)b", &paths, &rev,
> &include_parents));
> for (i = 0; i < paths->nelts; i++)
> - APR_ARRAY_IDX(paths, i, const char *) =
> - svn_path_canonicalize(APR_ARRAY_IDX(paths, i, const char *), pool);
> + {
> + svn_ra_svn_item_t *item = &APR_ARRAY_IDX(paths, i, svn_ra_svn_item_t);
> +
> + if (item->kind != SVN_RA_SVN_STRING)
> + return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL,
> + _("path is not a string"));
> + APR_ARRAY_IDX(paths, i, const char *) =
> + svn_path_canonicalize(item->u.string->data, pool);
> + }
> SVN_ERR(trivial_auth_request(conn, pool, b));
> SVN_CMD_ERR(svn_repos_fs_get_merge_info(&mergeinfo, b->repos, paths, rev,
> include_parents,
> @@ -1372,7 +1379,7 @@
> apr_hash_this(hi, &key, NULL, &value);
> path = key;
> info = value;
> - SVN_ERR(svn_ra_svn_write_tuple(conn, pool, "cc", path, info));
> + SVN_ERR(svn_ra_svn_write_tuple(conn, pool, "(cc)", path, info));
> }
> SVN_ERR(svn_ra_svn_write_tuple(conn, pool, "!))"));
> }
I think this portion of the patch needs to be accompanied by changes
to the protocol document.
- application/pgp-signature attachment: stored
Received on Wed Nov 29 23:50:38 2006