You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ju...@apache.org on 2012/03/28 10:34:04 UTC

svn commit: r1306211 - /subversion/trunk/subversion/libsvn_client/merge.c

Author: julianfoad
Date: Wed Mar 28 08:34:04 2012
New Revision: 1306211

URL: http://svn.apache.org/viewvc?rev=1306211&view=rev
Log:
In the merge code, never leave a repo_location_t's repository root fields as
NULL.

* subversion/libsvn_client/merge.c
  (repo_location_create): Don't allow the incoming repository root fields to
    be NULL.
  (combine_range_with_segments): Take a location instead of just a URL, and
    use it to fill in the repository root fields.
  (find_base_on_source): Fill in the repository root fields.
  (make_conflict_versions, normalize_merge_sources_internal): Use the stored
    root URL instead of asking the session.

Modified:
    subversion/trunk/subversion/libsvn_client/merge.c

Modified: subversion/trunk/subversion/libsvn_client/merge.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/merge.c?rev=1306211&r1=1306210&r2=1306211&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/merge.c (original)
+++ subversion/trunk/subversion/libsvn_client/merge.c Wed Mar 28 08:34:04 2012
@@ -333,18 +333,8 @@ repo_location_create(const char *repos_r
 {
   repo_location_t *loc = apr_palloc(result_pool, sizeof(*loc));
 
-  /* ### This 'if' is because 'repos_*' currently can be null, at least in a
-   * repo_location_t inside a merge_source_t. */
-  if (repos_root_url && repos_uuid)
-    {
-      loc->repos_root_url = apr_pstrdup(result_pool, repos_root_url);
-      loc->repos_uuid = apr_pstrdup(result_pool, repos_uuid);
-    }
-  else
-    {
-      loc->repos_root_url = NULL;
-      loc->repos_uuid = NULL;
-    }
+  loc->repos_root_url = apr_pstrdup(result_pool, repos_root_url);
+  loc->repos_uuid = apr_pstrdup(result_pool, repos_uuid);
   loc->rev = rev;
   loc->url = apr_pstrdup(result_pool, url);
   return loc;
@@ -630,13 +620,9 @@ make_conflict_versions(const svn_wc_conf
                        svn_node_kind_t node_kind,
                        merge_cmd_baton_t *merge_b)
 {
-  const char *src_repos_url;  /* root URL of source repository */
   const char *left_url;
   const char *right_url;
 
-  SVN_ERR(svn_ra_get_repos_root2(merge_b->ra_session1, &src_repos_url,
-                                 merge_b->pool));
-
   /* Construct the source URLs of the victim. */
   {
     const char *child = svn_dirent_skip_ancestor(merge_b->target->abspath,
@@ -649,13 +635,17 @@ make_conflict_versions(const svn_wc_conf
   }
 
   *left = svn_wc_conflict_version_create(
-            src_repos_url,
-            svn_uri_skip_ancestor(src_repos_url, left_url, merge_b->pool),
+            merge_b->merge_source.loc1->repos_root_url,
+            svn_uri_skip_ancestor(
+              merge_b->merge_source.loc1->repos_root_url,
+              left_url, merge_b->pool),
             merge_b->merge_source.loc1->rev, node_kind, merge_b->pool);
 
   *right = svn_wc_conflict_version_create(
-             src_repos_url,
-             svn_uri_skip_ancestor(src_repos_url, right_url, merge_b->pool),
+             merge_b->merge_source.loc2->repos_root_url,
+             svn_uri_skip_ancestor(
+               merge_b->merge_source.loc2->repos_root_url,
+               right_url, merge_b->pool),
              merge_b->merge_source.loc2->rev, node_kind, merge_b->pool);
 
   return SVN_NO_ERROR;
@@ -6321,7 +6311,7 @@ compare_merge_source_ts(const void *a,
 
 /* Set *MERGE_SOURCE_TS_P to a list of merge sources generated by
    slicing history location SEGMENTS with a given requested merge
-   RANGE.  Use SOURCE_ROOT_URL for full source URL calculation.
+   RANGE.  Use SOURCE_LOC for full source URL calculation.
 
    Order the merge sources in *MERGE_SOURCE_TS_P from oldest to
    youngest. */
@@ -6329,7 +6319,7 @@ static svn_error_t *
 combine_range_with_segments(apr_array_header_t **merge_source_ts_p,
                             const svn_merge_range_t *range,
                             const apr_array_header_t *segments,
-                            const char *source_root_url,
+                            const repo_location_t *source_loc,
                             apr_pool_t *pool)
 {
   apr_array_header_t *merge_source_ts =
@@ -6343,7 +6333,7 @@ combine_range_with_segments(apr_array_he
     {
       svn_location_segment_t *segment =
         APR_ARRAY_IDX(segments, i, svn_location_segment_t *);
-      repo_location_t loc1 = { 0 }, loc2 = { 0 };
+      repo_location_t loc1, loc2;
       merge_source_t *merge_source;
       const char *path1 = NULL;
       svn_revnum_t rev1;
@@ -6391,12 +6381,16 @@ combine_range_with_segments(apr_array_he
         continue;
 
       /* Build our merge source structure. */
-      loc1.url = svn_path_url_add_component2(source_root_url, path1,
-                                             pool);
-      loc2.url = svn_path_url_add_component2(source_root_url, segment->path,
-                                             pool);
+      loc1.repos_root_url = source_loc->repos_root_url;
+      loc1.repos_uuid = source_loc->repos_uuid;
       loc1.rev = rev1;
+      loc1.url = svn_path_url_add_component2(source_loc->repos_root_url,
+                                             path1, pool);
+      loc2.repos_root_url = source_loc->repos_root_url;
+      loc2.repos_uuid = source_loc->repos_uuid;
       loc2.rev = MIN(segment->range_end, maxrev);
+      loc2.url = svn_path_url_add_component2(source_loc->repos_root_url,
+                                             segment->path, pool);
       merge_source = merge_source_create(&loc1, &loc2, pool);
 
       /* If this is subtractive, reverse the whole calculation. */
@@ -6439,7 +6433,6 @@ normalize_merge_sources_internal(apr_arr
   svn_revnum_t source_peg_revnum = source_loc->rev;
   svn_revnum_t oldest_requested, youngest_requested;
   svn_revnum_t trim_revision = SVN_INVALID_REVNUM;
-  const char *source_root_url;
   apr_array_header_t *segments;
   int i;
 
@@ -6478,8 +6471,6 @@ normalize_merge_sources_internal(apr_arr
                                               oldest_requested,
                                               ctx, result_pool));
 
-  SVN_ERR(svn_ra_get_repos_root2(ra_session, &source_root_url, scratch_pool));
-
   /* See if we fetched enough history to do the job.  "Surely we did,"
      you say.  "After all, we covered the entire requested merge
      range."  Yes, that's true, but if our first segment doesn't
@@ -6523,9 +6514,9 @@ normalize_merge_sources_internal(apr_arr
               range_start_rev.kind = svn_opt_revision_number;
               range_start_rev.value.number = segment2->range_start;
 
-              segment_url = svn_path_url_add_component2(source_root_url,
-                                                        segment2->path,
-                                                        scratch_pool);
+              segment_url = svn_path_url_add_component2(
+                              source_loc->repos_root_url, segment2->path,
+                              scratch_pool);
               SVN_ERR(svn_client__get_copy_source(segment_url,
                                                   &range_start_rev,
                                                   &copyfrom_path,
@@ -6576,7 +6567,7 @@ normalize_merge_sources_internal(apr_arr
 
       /* Copy the resulting merge sources into master list thereof. */
       SVN_ERR(combine_range_with_segments(&merge_sources, range,
-                                          segments, source_root_url,
+                                          segments, source_loc,
                                           result_pool));
       apr_array_cat(*merge_sources_p, merge_sources);
     }
@@ -11067,7 +11058,7 @@ find_base_on_source(repo_location_t **ba
   svn_mergeinfo_t target_mergeinfo;
   svn_client__merge_path_t *merge_target;
   svn_boolean_t inherited;
-  repo_location_t loc1 = { 0 };
+  repo_location_t loc1;
   merge_source_t source;
   svn_merge_range_t *r;
 
@@ -11085,6 +11076,8 @@ find_base_on_source(repo_location_t **ba
   /* In order to find the first unmerged change in the source, set
    * MERGE_TARGET->remaining_ranges to the ranges left to merge,
    * and look at the start revision of the first such range. */
+  loc1.repos_root_url = s_t->source->repos_root_url;
+  loc1.repos_uuid = s_t->source->repos_uuid;
   loc1.url = s_t->source->url;  /* ### WRONG: need historical URL/REV */
   loc1.rev = 1;
   source.loc1 = &loc1;