Alien-SVN
view release on metacpan or search on metacpan
src/subversion/subversion/libsvn_client/merge.c view on Meta::CPAN
const char *diff3_cmd;
const char *preserved_exts_str;
int i;
svn_boolean_t checked_mergeinfo_capability = FALSE;
svn_ra_session_t *ra_session1 = NULL, *ra_session2 = NULL;
const char *old_src_session_url = NULL;
apr_pool_t *iterpool;
const svn_diff_tree_processor_t *processor;
SVN_ERR_ASSERT(svn_dirent_is_absolute(target->abspath));
*conflict_report = NULL;
/* Check from some special conditions when in record-only mode
(which is a merge-tracking thing). */
if (record_only)
{
svn_boolean_t sources_ancestral = TRUE;
int j;
/* Find out whether all of the sources are 'ancestral'. */
for (j = 0; j < merge_sources->nelts; j++)
if (! APR_ARRAY_IDX(merge_sources, j, merge_source_t *)->ancestral)
{
sources_ancestral = FALSE;
break;
}
/* We can't do a record-only merge if the sources aren't related. */
if (! sources_ancestral)
return svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL,
_("Use of two URLs is not compatible with "
"mergeinfo modification"));
/* We can't do a record-only merge if the sources aren't from
the same repository as the target. */
if (! same_repos)
return svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL,
_("Merge from foreign repository is not "
"compatible with mergeinfo modification"));
/* If this is a dry-run record-only merge, there's nothing to do. */
if (dry_run)
return SVN_NO_ERROR;
}
iterpool = svn_pool_create(scratch_pool);
/* Ensure a known depth. */
if (depth == svn_depth_unknown)
depth = svn_depth_infinity;
/* Set up the diff3 command, so various callers don't have to. */
cfg = ctx->config
? svn_hash_gets(ctx->config, SVN_CONFIG_CATEGORY_CONFIG)
: NULL;
svn_config_get(cfg, &diff3_cmd, SVN_CONFIG_SECTION_HELPERS,
SVN_CONFIG_OPTION_DIFF3_CMD, NULL);
if (diff3_cmd != NULL)
SVN_ERR(svn_path_cstring_to_utf8(&diff3_cmd, diff3_cmd, scratch_pool));
/* See which files the user wants to preserve the extension of when
conflict files are made. */
svn_config_get(cfg, &preserved_exts_str, SVN_CONFIG_SECTION_MISCELLANY,
SVN_CONFIG_OPTION_PRESERVED_CF_EXTS, "");
/* Build the merge context baton (or at least the parts of it that
don't need to be reset for each merge source). */
merge_cmd_baton.force_delete = force_delete;
merge_cmd_baton.dry_run = dry_run;
merge_cmd_baton.record_only = record_only;
merge_cmd_baton.ignore_mergeinfo = ignore_mergeinfo;
merge_cmd_baton.diff_ignore_ancestry = diff_ignore_ancestry;
merge_cmd_baton.same_repos = same_repos;
merge_cmd_baton.mergeinfo_capable = FALSE;
merge_cmd_baton.ctx = ctx;
merge_cmd_baton.reintegrate_merge = reintegrate_merge;
merge_cmd_baton.target = target;
merge_cmd_baton.pool = iterpool;
merge_cmd_baton.merge_options = merge_options;
merge_cmd_baton.diff3_cmd = diff3_cmd;
merge_cmd_baton.ext_patterns = *preserved_exts_str
? svn_cstring_split(preserved_exts_str, "\n\r\t\v ",
FALSE, scratch_pool)
: NULL;
merge_cmd_baton.use_sleep = use_sleep;
/* Do we already know the specific subtrees with mergeinfo we want
to record-only mergeinfo on? */
if (record_only && record_only_paths)
merge_cmd_baton.merged_abspaths = record_only_paths;
else
merge_cmd_baton.merged_abspaths = apr_hash_make(result_pool);
merge_cmd_baton.skipped_abspaths = apr_hash_make(result_pool);
merge_cmd_baton.added_abspaths = apr_hash_make(result_pool);
merge_cmd_baton.tree_conflicted_abspaths = apr_hash_make(result_pool);
{
svn_diff_tree_processor_t *merge_processor;
merge_processor = svn_diff__tree_processor_create(&merge_cmd_baton,
scratch_pool);
merge_processor->dir_opened = merge_dir_opened;
merge_processor->dir_changed = merge_dir_changed;
merge_processor->dir_added = merge_dir_added;
merge_processor->dir_deleted = merge_dir_deleted;
merge_processor->dir_closed = merge_dir_closed;
merge_processor->file_opened = merge_file_opened;
merge_processor->file_changed = merge_file_changed;
merge_processor->file_added = merge_file_added;
merge_processor->file_deleted = merge_file_deleted;
/* Not interested in file_closed() */
merge_processor->node_absent = merge_node_absent;
processor = merge_processor;
( run in 0.627 second using v1.01-cache-2.11-cpan-e93a5daba3e )