Hi All,
Find the patch attached.
With regards
Kamesh Jayachandran
[[[
Patch by: Kamesh Jayachandran <kamesh@collab.net>
Single file merge tracking implementation.
* subversion/libsvn_client/diff.c
(do_single_file_merge):
Added 'svn_boolean_t dry_run' and 'svn_client_ctx_t *ctx' as args.
Implemented merge tracking for single file merges the same way as
directory merges.
Remove the FIXME docstring for merge-tracking.
(svn_client_merge2):
calling do_single_file_merge with the new set of args.
(svn_client_merge_peg2):
calling do_single_file_merge with the new set of args.
]]]
Index: subversion/libsvn_client/diff.c
===================================================================
--- subversion/libsvn_client/diff.c (revision 20275)
+++ subversion/libsvn_client/diff.c (working copy)
@@ -1961,7 +1961,6 @@
/* The single-file, simplified version of do_merge. */
-/* ### FIXME: To handle merge tracking, follow pattern from do_merge(). */
static svn_error_t *
do_single_file_merge(const char *initial_URL1,
const char *initial_path1,
@@ -1972,7 +1971,9 @@
const svn_opt_revision_t *peg_revision,
const char *target_wcpath,
svn_wc_adm_access_t *adm_access,
+ svn_boolean_t dry_run,
struct merge_cmd_baton *merge_b,
+ svn_client_ctx_t *ctx,
apr_pool_t *pool)
{
apr_hash_t *props1, *props2;
@@ -1983,10 +1984,24 @@
apr_array_header_t *propchanges;
svn_wc_notify_state_t prop_state = svn_wc_notify_state_unknown;
svn_wc_notify_state_t text_state = svn_wc_notify_state_unknown;
- const char *URL1, *path1, *URL2, *path2;
+ const char *URL1, *path1, *URL2, *path2, *rel_path;
svn_opt_revision_t *revision1, *revision2;
svn_error_t *err;
+ svn_merge_range_t range;
+ svn_ra_session_t *ra_session;
+ svn_boolean_t is_revert;
+ apr_hash_t *target_mergeinfo;
+ apr_array_header_t *remaining_ranges;
+ /* Sanity check -- ensure that we have valid revisions to look at. */
+ if ((initial_revision1->kind == svn_opt_revision_unspecified)
+ || (initial_revision2->kind == svn_opt_revision_unspecified))
+ {
+ return svn_error_create
+ (SVN_ERR_CLIENT_BAD_REVISION, NULL,
+ _("Not all required revisions are specified"));
+ }
+
/* If we are performing a pegged merge, we need to find out what our
actual URLs will be. */
if (peg_revision->kind != svn_opt_revision_unspecified)
@@ -2018,6 +2033,30 @@
*revision2 = *initial_revision2;
}
+ /* Establish first RA session to URL1. */
+ SVN_ERR(svn_client__open_ra_session_internal(&ra_session, URL1, NULL,
+ NULL, NULL, FALSE, TRUE,
+ ctx, pool));
+
+ /* Resolve the revision numbers, and store them as a merge range.
+ Note that the "start" of a merge range is inclusive. */
+ SVN_ERR(svn_client__get_revision_number
+ (&range.start, ra_session, revision1, path1, pool));
+ range.start += 1;
+ SVN_ERR(svn_client__get_revision_number
+ (&range.end, ra_session, revision2, path2, pool));
+ is_revert = (range.start > range.end);
+
+ /* Look at the merge info prop of the WC target to see what's
+ already been merged into it. */
+ SVN_ERR(parse_merge_info(&target_mergeinfo, target_wcpath, adm_access, ctx,
+ pool));
+
+ SVN_ERR(svn_client__path_relative_to_root(&rel_path, URL1, NULL,
+ ra_session, adm_access, pool));
+ SVN_ERR(calculate_merge_ranges(&remaining_ranges, rel_path, target_mergeinfo,
+ &range, is_revert, pool));
+
/* ### heh, funny. we could be fetching two fulltexts from two
*totally* different repositories here. :-) */
SVN_ERR(single_file_merge_get_file(&tmpfile1, &props1, &rev1,
@@ -2071,6 +2110,10 @@
pool);
}
+ if (!dry_run)
+ SVN_ERR(update_wc_merge_info(target_wcpath, target_mergeinfo, rel_path,
+ remaining_ranges, is_revert, adm_access,
+ pool));
return SVN_NO_ERROR;
}
@@ -2921,7 +2964,9 @@
&peg_revision,
target_wcpath,
adm_access,
+ dry_run,
&merge_cmd_baton,
+ ctx,
pool));
}
@@ -3050,7 +3095,9 @@
peg_revision,
target_wcpath,
adm_access,
+ dry_run,
&merge_cmd_baton,
+ ctx,
pool));
}
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Wed Jun 28 17:34:49 2006