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 )