/* 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; }
/* 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; }