Alien-SVN
view release on metacpan or search on metacpan
src/subversion/subversion/libsvn_client/merge.c view on Meta::CPAN
SVN_ERR(svn_client__ra_session_from_path2(
source_ra_session_p, &source_loc,
source_path_or_url, NULL, source_peg_revision, source_peg_revision,
ctx, result_pool));
/* source_loc and target->loc are required to be in the same repository,
as mergeinfo doesn't come into play for cross-repository merging. */
SVN_ERR(check_same_repos(source_loc,
svn_dirent_local_style(source_path_or_url,
scratch_pool),
&target->loc,
svn_dirent_local_style(target->abspath,
scratch_pool),
TRUE /* strict_urls */, scratch_pool));
*source_loc_p = source_loc;
*target_p = target;
return SVN_NO_ERROR;
}
/* The body of svn_client_merge_reintegrate(), which see for details. */
static svn_error_t *
merge_reintegrate_locked(conflict_report_t **conflict_report,
const char *source_path_or_url,
const svn_opt_revision_t *source_peg_revision,
const char *target_abspath,
svn_boolean_t diff_ignore_ancestry,
svn_boolean_t dry_run,
const apr_array_header_t *merge_options,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_ra_session_t *target_ra_session, *source_ra_session;
merge_target_t *target;
svn_client__pathrev_t *source_loc;
merge_source_t *source;
svn_client__pathrev_t *yc_ancestor;
svn_boolean_t use_sleep = FALSE;
svn_error_t *err;
SVN_ERR(open_reintegrate_source_and_target(
&source_ra_session, &source_loc, &target_ra_session, &target,
source_path_or_url, source_peg_revision, target_abspath,
ctx, scratch_pool, scratch_pool));
SVN_ERR(find_reintegrate_merge(&source, &yc_ancestor,
source_ra_session, source_loc,
target_ra_session, target,
ctx, scratch_pool, scratch_pool));
if (! source)
{
return SVN_NO_ERROR;
}
/* Do the real merge! */
/* ### TODO(reint): Make sure that one isn't the same line ancestor
### of the other (what's erroneously referred to as "ancestrally
### related" in this source file). For now, we just say the source
### isn't "ancestral" even if it is (in the degenerate case where
### source-left equals YCA). */
source->ancestral = FALSE;
err = merge_cousins_and_supplement_mergeinfo(conflict_report,
&use_sleep,
target,
target_ra_session,
source_ra_session,
source, yc_ancestor,
TRUE /* same_repos */,
svn_depth_infinity,
diff_ignore_ancestry,
FALSE /* force_delete */,
FALSE /* record_only */,
dry_run,
merge_options,
ctx,
result_pool, scratch_pool);
if (use_sleep)
svn_io_sleep_for_timestamps(target_abspath, scratch_pool);
SVN_ERR(err);
return SVN_NO_ERROR;
}
svn_error_t *
svn_client_merge_reintegrate(const char *source_path_or_url,
const svn_opt_revision_t *source_peg_revision,
const char *target_wcpath,
svn_boolean_t dry_run,
const apr_array_header_t *merge_options,
svn_client_ctx_t *ctx,
apr_pool_t *pool)
{
const char *target_abspath, *lock_abspath;
conflict_report_t *conflict_report;
SVN_ERR(get_target_and_lock_abspath(&target_abspath, &lock_abspath,
target_wcpath, ctx, pool));
if (!dry_run)
SVN_WC__CALL_WITH_WRITE_LOCK(
merge_reintegrate_locked(&conflict_report,
source_path_or_url, source_peg_revision,
target_abspath,
FALSE /*diff_ignore_ancestry*/,
dry_run, merge_options, ctx, pool, pool),
ctx->wc_ctx, lock_abspath, FALSE /* lock_anchor */, pool);
else
SVN_ERR(merge_reintegrate_locked(&conflict_report,
source_path_or_url, source_peg_revision,
target_abspath,
FALSE /*diff_ignore_ancestry*/,
dry_run, merge_options, ctx, pool, pool));
SVN_ERR(make_merge_conflict_error(conflict_report, pool));
return SVN_NO_ERROR;
}
/* The body of svn_client_merge_peg5(), which see for details.
*
* IGNORE_MERGEINFO and DIFF_IGNORE_ANCESTRY are as in do_merge().
*/
static svn_error_t *
merge_peg_locked(conflict_report_t **conflict_report,
const char *source_path_or_url,
const svn_opt_revision_t *source_peg_revision,
const svn_rangelist_t *ranges_to_merge,
const char *target_abspath,
svn_depth_t depth,
svn_boolean_t ignore_mergeinfo,
svn_boolean_t diff_ignore_ancestry,
svn_boolean_t force_delete,
svn_boolean_t record_only,
svn_boolean_t dry_run,
svn_boolean_t allow_mixed_rev,
const apr_array_header_t *merge_options,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
merge_target_t *target;
svn_client__pathrev_t *source_loc;
apr_array_header_t *merge_sources;
svn_ra_session_t *ra_session;
apr_pool_t *sesspool;
svn_boolean_t use_sleep = FALSE;
svn_error_t *err;
svn_boolean_t same_repos;
SVN_ERR_ASSERT(svn_dirent_is_absolute(target_abspath));
SVN_ERR(open_target_wc(&target, target_abspath,
allow_mixed_rev, TRUE, TRUE,
ctx, scratch_pool, scratch_pool));
/* Create a short lived session pool */
sesspool = svn_pool_create(scratch_pool);
/* Open an RA session to our source URL, and determine its root URL. */
SVN_ERR(svn_client__ra_session_from_path2(
&ra_session, &source_loc,
source_path_or_url, NULL, source_peg_revision, source_peg_revision,
ctx, sesspool));
/* Normalize our merge sources. */
SVN_ERR(normalize_merge_sources(&merge_sources, source_path_or_url,
source_loc,
ranges_to_merge, ra_session, ctx,
scratch_pool, scratch_pool));
/* Check for same_repos. */
same_repos = is_same_repos(&target->loc, source_loc, TRUE /* strict_urls */);
/* Do the real merge! (We say with confidence that our merge
sources are both ancestral and related.) */
err = do_merge(NULL, NULL, conflict_report, &use_sleep,
merge_sources, target, ra_session,
TRUE /*sources_related*/, same_repos, ignore_mergeinfo,
diff_ignore_ancestry, force_delete, dry_run,
record_only, NULL, FALSE, FALSE, depth, merge_options,
ctx, result_pool, scratch_pool);
/* We're done with our RA session. */
svn_pool_destroy(sesspool);
if (use_sleep)
svn_io_sleep_for_timestamps(target_abspath, scratch_pool);
SVN_ERR(err);
return SVN_NO_ERROR;
}
/* Details of an automatic merge. */
typedef struct automatic_merge_t
{
svn_client__pathrev_t *yca, *base, *right, *target;
svn_boolean_t is_reintegrate_like;
svn_boolean_t allow_mixed_rev, allow_local_mods, allow_switched_subtrees;
} automatic_merge_t;
static svn_error_t *
client_find_automatic_merge(automatic_merge_t **merge_p,
const char *source_path_or_url,
const svn_opt_revision_t *source_revision,
const char *target_abspath,
svn_boolean_t allow_mixed_rev,
svn_boolean_t allow_local_mods,
svn_boolean_t allow_switched_subtrees,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
static svn_error_t *
do_automatic_merge_locked(conflict_report_t **conflict_report,
const automatic_merge_t *merge,
const char *target_abspath,
svn_depth_t depth,
svn_boolean_t diff_ignore_ancestry,
svn_boolean_t force_delete,
svn_boolean_t record_only,
svn_boolean_t dry_run,
const apr_array_header_t *merge_options,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
svn_error_t *
svn_client_merge_peg5(const char *source_path_or_url,
const apr_array_header_t *ranges_to_merge,
const svn_opt_revision_t *source_peg_revision,
const char *target_wcpath,
svn_depth_t depth,
svn_boolean_t ignore_mergeinfo,
svn_boolean_t diff_ignore_ancestry,
( run in 0.411 second using v1.01-cache-2.11-cpan-483215c6ad5 )