Hi All,
Find the attached patch to the defect explained in the log message.
With regards
Kamesh Jayachandran
[[[
Patch by: Kamesh Jayachandran <kamesh@collab.net>
Assuming we have already merged 155-156 of /branches/b1 to wc.
'svn merge -r156:154 file:///path/to/repos/branches/b1' should remove
155-156
from the svn:mergeinfo property for '/branches/b1' after merging.
Without this
fix it does not.
The cause is rangelist api's are capable of handling forward paths not the
reverse paths.
* subversion/include/svn_mergeinfo.h
Made svn_range_swap_endpoints public, this function was originally a
static function in subversion/libsvn_subr/mergeinfo.c
* subversion/libsvn_subr/mergeinfo.c
(svn_range_swap_endpoints): Renamed function 'range_swap_endpoints'
'svn_range_swap_endpoints' as we want this function to be public.
(svn_rangelist_reverse): Calls 'svn_range_swap_endpoints.
* subversion/libsvn_client/diff.c
(update_wc_merge_info):
Reverse the merge ranges(a.k.a eraser) before passing to
svn_rangelist_remove().
]]]
Index: subversion/include/svn_mergeinfo.h
===================================================================
--- subversion/include/svn_mergeinfo.h (revision 20465)
+++ subversion/include/svn_mergeinfo.h (working copy)
@@ -131,6 +131,12 @@
apr_array_header_t *rangelist2,
apr_pool_t *pool);
+/** Swap @a range's @c start and @c end fields .
+ * @since New in 1.5.
+ */
+svn_error_t *
+svn_range_swap_endpoints(svn_merge_range_t *range);
+
/** Reverse @a rangelist, and the @c start and @c end fields of each
* range in @a rangelist, in place.
* @since New in 1.5.
Index: subversion/libsvn_subr/mergeinfo.c
===================================================================
--- subversion/libsvn_subr/mergeinfo.c (revision 20465)
+++ subversion/libsvn_subr/mergeinfo.c (working copy)
@@ -356,12 +356,13 @@
}
/* Swap start and end fields of RANGE. */
-static void
-range_swap_endpoints(svn_merge_range_t *range)
+svn_error_t *
+svn_range_swap_endpoints(svn_merge_range_t *range)
{
svn_revnum_t swap = range->start;
range->start = range->end;
range->end = swap;
+ return SVN_NO_ERROR;
}
svn_error_t *
@@ -376,15 +377,15 @@
*APR_ARRAY_IDX(rangelist, i, svn_merge_range_t *) =
*APR_ARRAY_IDX(rangelist, swap_index, svn_merge_range_t *);
*APR_ARRAY_IDX(rangelist, swap_index, svn_merge_range_t *) = range;
- range_swap_endpoints(APR_ARRAY_IDX(rangelist, swap_index,
+ svn_range_swap_endpoints(APR_ARRAY_IDX(rangelist, swap_index,
svn_merge_range_t *));
- range_swap_endpoints(APR_ARRAY_IDX(rangelist, i, svn_merge_range_t *));
+ svn_range_swap_endpoints(APR_ARRAY_IDX(rangelist, i, svn_merge_range_t *));
}
/* If there's an odd number of elements, we still need to swap the
end points of the remaining range. */
if (rangelist->nelts % 2 == 1)
- range_swap_endpoints(APR_ARRAY_IDX(rangelist, rangelist->nelts / 2,
+ svn_range_swap_endpoints(APR_ARRAY_IDX(rangelist, rangelist->nelts / 2,
svn_merge_range_t *));
return SVN_NO_ERROR;
Index: subversion/libsvn_client/diff.c
===================================================================
--- subversion/libsvn_client/diff.c (revision 20465)
+++ subversion/libsvn_client/diff.c (working copy)
@@ -1735,11 +1735,26 @@
apr_hash_t *mergeinfo = apr_hash_copy(pool, target_mergeinfo);
apr_array_header_t *rangelist = apr_hash_get(target_mergeinfo, rel_path,
APR_HASH_KEY_STRING);
+ apr_array_header_t *reversed_ranges =
+ apr_array_make(pool, 0, sizeof(svn_merge_range_t *));
+ int i = 0;
+
if (rangelist == NULL)
rangelist = apr_array_make(pool, 0, sizeof(svn_merge_range_t *));
+ for (i = 0; i < ranges->nelts; i++)
+ {
+ svn_merge_range_t *reversed_range;
+ svn_merge_range_t *range =
+ (APR_ARRAY_IDX(ranges, i, svn_merge_range_t *));
+ reversed_range = svn_range_dup(range, pool);
+ svn_range_swap_endpoints(reversed_range);
+ APR_ARRAY_PUSH(reversed_ranges, svn_merge_range_t *) = reversed_range;
+ }
+
if (is_revert)
- SVN_ERR(svn_rangelist_remove(&rangelist, ranges, rangelist, pool));
+ SVN_ERR(svn_rangelist_remove(&rangelist, reversed_ranges,
+ rangelist, pool));
else
SVN_ERR(svn_rangelist_merge(&rangelist, rangelist, ranges, pool));
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Fri Jul 7 21:38:30 2006