Hi Paul.

r1156750 added a chunk of code in
svn_client__get_repos_mergeinfo_catalog() that appears to be adding a
prefix to a mergeinfo catalog.  There is already a function
"svn_mergeinfo__add_prefix_to_catalog()" for doing that; could you use
it?  Suggested patch below.

Also r1156750 changed the line "repos_mergeinfo = NULL;" to
"*mergeinfo_cat = NULL;" which I think is wrong because in that case
the following "if (repos_mergeinfo_cat == NULL)" may be testing an
uninitialized value (depending on the implementation of
svn_ra_get_mergeinfo() in the case when it returns an error).  See in
the patch below.

[[[
Index: subversion/libsvn_client/mergeinfo.c
===================================================================
--- subversion/libsvn_client/mergeinfo.c        (revision 1186733)
+++ subversion/libsvn_client/mergeinfo.c        (working copy)
@@ -487,54 +487,42 @@ svn_client__get_repos_mergeinfo_catalog(
   if (err)
     {
       if (squelch_incapable && err->apr_err == SVN_ERR_UNSUPPORTED_FEATURE)
         {
           svn_error_clear(err);
           *mergeinfo_cat = NULL;
+          /* ### should say "repos_mergeinfo_cat = NULL" or add a
"return" here? */
         }
       else
         return svn_error_trace(err);
     }

   if (repos_mergeinfo_cat == NULL)
     {
       *mergeinfo_cat = NULL;
     }
   else
     {
-      const char *repos_root;
       const char *session_url;
+      const char *session_relpath;

-      SVN_ERR(svn_ra_get_repos_root2(ra_session, &repos_root, scratch_pool));
       SVN_ERR(svn_ra_get_session_url(ra_session, &session_url, scratch_pool));
+      SVN_ERR(svn_ra_get_path_relative_to_root(ra_session, &session_relpath,
+                                               session_url, scratch_pool));

-      if (strcmp(repos_root, session_url) == 0)
+      if (session_relpath[0] == '\0')
         {
           *mergeinfo_cat = repos_mergeinfo_cat;
         }
       else
         {
-          apr_hash_index_t *hi;
-          svn_mergeinfo_catalog_t rekeyed_mergeinfo_cat =
-            apr_hash_make(result_pool);
-
-          for (hi = apr_hash_first(scratch_pool, repos_mergeinfo_cat);
-               hi;
-               hi = apr_hash_next(hi))
-            {
-              const char *path =
-                svn_path_url_add_component2(session_url,
-                                            svn__apr_hash_index_key(hi),
-                                            scratch_pool);
-              SVN_ERR(svn_ra_get_path_relative_to_root(ra_session, &path,
-                                                       path,
-                                                       result_pool));
-              apr_hash_set(rekeyed_mergeinfo_cat, path, APR_HASH_KEY_STRING,
-                           svn__apr_hash_index_val(hi));
-            }
-          *mergeinfo_cat = rekeyed_mergeinfo_cat;
+          SVN_ERR(svn_mergeinfo__add_prefix_to_catalog(mergeinfo_cat,
+                                                       repos_mergeinfo_cat,
+                                                       session_relpath,
+                                                       result_pool,
+                                                       scratch_pool));
         }
     }
   return SVN_NO_ERROR;
 }


]]]

- Julian

Reply via email to