コード例 #1
0
ファイル: diff_local.c プロジェクト: dtrebbien/subversion
/* Public Interface */
svn_error_t *
svn_wc_diff6(svn_wc_context_t *wc_ctx,
             const char *local_abspath,
             const svn_wc_diff_callbacks4_t *callbacks,
             void *callback_baton,
             svn_depth_t depth,
             svn_boolean_t ignore_ancestry,
             svn_boolean_t show_copies_as_adds,
             svn_boolean_t use_git_diff_format,
             const apr_array_header_t *changelist_filter,
             svn_cancel_func_t cancel_func,
             void *cancel_baton,
             apr_pool_t *scratch_pool)
{
    struct diff_baton eb = { 0 };
    svn_kind_t kind;
    svn_boolean_t get_all;

    SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
    SVN_ERR(svn_wc__db_read_kind(&kind, wc_ctx->db, local_abspath, FALSE,
                                 scratch_pool));

    if (kind == svn_kind_dir)
        eb.anchor_abspath = local_abspath;
    else
        eb.anchor_abspath = svn_dirent_dirname(local_abspath, scratch_pool);

    eb.db = wc_ctx->db;
    eb.callbacks = callbacks;
    eb.callback_baton = callback_baton;
    eb.ignore_ancestry = ignore_ancestry;
    eb.show_copies_as_adds = show_copies_as_adds;
    eb.use_git_diff_format = use_git_diff_format;
    eb.empty_file = NULL;
    eb.pool = scratch_pool;

    if (changelist_filter && changelist_filter->nelts)
        SVN_ERR(svn_hash_from_cstring_keys(&eb.changelist_hash, changelist_filter,
                                           scratch_pool));

    if (show_copies_as_adds || use_git_diff_format)
        get_all = TRUE; /* We need unmodified descendants of copies */
    else
        get_all = FALSE;

    /* Walk status handles files and directories */
    SVN_ERR(svn_wc__internal_walk_status(wc_ctx->db, local_abspath, depth,
                                         get_all,
                                         TRUE /* no_ignore */,
                                         FALSE /* ignore_text_mods */,
                                         NULL /* ignore_patterns */,
                                         diff_status_callback, &eb,
                                         cancel_func, cancel_baton,
                                         scratch_pool));

    return SVN_NO_ERROR;
}
コード例 #2
0
svn_error_t *
svn_wc__fetch_kind_func(svn_kind_t *kind,
                        void *baton,
                        const char *path,
                        svn_revnum_t base_revision,
                        apr_pool_t *scratch_pool)
{
  struct svn_wc__shim_fetch_baton_t *sfb = baton;
  const char *local_abspath = svn_dirent_join(sfb->base_abspath, path,
                                              scratch_pool);

  SVN_ERR(svn_wc__db_read_kind(kind, sfb->db, local_abspath,
                               FALSE /* allow_missing */,
                               FALSE /* show_hidden */,
                               scratch_pool));

  return SVN_NO_ERROR;
}
コード例 #3
0
ファイル: diff_local.c プロジェクト: Galiro/freebsd
/* Public Interface */
svn_error_t *
svn_wc_diff6(svn_wc_context_t *wc_ctx,
             const char *local_abspath,
             const svn_wc_diff_callbacks4_t *callbacks,
             void *callback_baton,
             svn_depth_t depth,
             svn_boolean_t ignore_ancestry,
             svn_boolean_t show_copies_as_adds,
             svn_boolean_t use_git_diff_format,
             const apr_array_header_t *changelist_filter,
             svn_cancel_func_t cancel_func,
             void *cancel_baton,
             apr_pool_t *scratch_pool)
{
  struct diff_baton eb = { 0 };
  svn_node_kind_t kind;
  svn_boolean_t get_all;
  const svn_diff_tree_processor_t *processor;

  SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
  SVN_ERR(svn_wc__db_read_kind(&kind, wc_ctx->db, local_abspath,
                               FALSE /* allow_missing */,
                               TRUE /* show_deleted */,
                               FALSE /* show_hidden */,
                               scratch_pool));

  if (kind == svn_node_dir)
    eb.anchor_abspath = local_abspath;
  else
    eb.anchor_abspath = svn_dirent_dirname(local_abspath, scratch_pool);

  SVN_ERR(svn_wc__wrap_diff_callbacks(&processor,
                                      callbacks, callback_baton, TRUE,
                                      scratch_pool, scratch_pool));

  if (use_git_diff_format)
    show_copies_as_adds = TRUE;
  if (show_copies_as_adds)
    ignore_ancestry = FALSE;



  /*
  if (reverse_order)
    processor = svn_diff__tree_processor_reverse_create(processor, NULL, pool);
   */

  if (! show_copies_as_adds && !use_git_diff_format)
    processor = svn_diff__tree_processor_copy_as_changed_create(processor,
                                                                scratch_pool);

  eb.db = wc_ctx->db;
  eb.processor = processor;
  eb.ignore_ancestry = ignore_ancestry;
  eb.show_copies_as_adds = show_copies_as_adds;
  eb.pool = scratch_pool;

  if (changelist_filter && changelist_filter->nelts)
    SVN_ERR(svn_hash_from_cstring_keys(&eb.changelist_hash, changelist_filter,
                                       scratch_pool));

  if (show_copies_as_adds || use_git_diff_format || !ignore_ancestry)
    get_all = TRUE; /* We need unmodified descendants of copies */
  else
    get_all = FALSE;

  /* Walk status handles files and directories */
  SVN_ERR(svn_wc__internal_walk_status(wc_ctx->db, local_abspath, depth,
                                       get_all,
                                       TRUE /* no_ignore */,
                                       FALSE /* ignore_text_mods */,
                                       NULL /* ignore_patterns */,
                                       diff_status_callback, &eb,
                                       cancel_func, cancel_baton,
                                       scratch_pool));

  /* Close the remaining open directories */
  while (eb.cur)
    {
      struct node_state_t *ns = eb.cur;

      if (!ns->skip)
        {
          if (ns->propchanges)
            SVN_ERR(processor->dir_changed(ns->relpath,
                                           ns->left_src,
                                           ns->right_src,
                                           ns->left_props,
                                           ns->right_props,
                                           ns->propchanges,
                                           ns->baton,
                                           processor,
                                           ns->pool));
          else
            SVN_ERR(processor->dir_closed(ns->relpath,
                                          ns->left_src,
                                          ns->right_src,
                                          ns->baton,
                                          processor,
                                          ns->pool));
        }
      eb.cur = ns->parent;
      svn_pool_clear(ns->pool);
    }

  return SVN_NO_ERROR;
}