You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by rh...@apache.org on 2011/04/23 00:29:34 UTC
svn commit: r1096068 - /subversion/trunk/subversion/libsvn_wc/diff.c
Author: rhuijben
Date: Fri Apr 22 22:29:34 2011
New Revision: 1096068
URL: http://svn.apache.org/viewvc?rev=1096068&view=rev
Log:
Following up on r1096057, more local changes untangling in the wc-diff editor.
* subversion/libsvn_wc/diff.c
(directory_elements_diff): Rename to walk_local_nodes_diff, and update
the arguments to only take the edit baton and specific arguments.
(close_directory): Update caller.
(close_edit): Update caller.
(svn_wc_diff6): Update caller.
Modified:
subversion/trunk/subversion/libsvn_wc/diff.c
Modified: subversion/trunk/subversion/libsvn_wc/diff.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/diff.c?rev=1096068&r1=1096067&r2=1096068&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/diff.c (original)
+++ subversion/trunk/subversion/libsvn_wc/diff.c Fri Apr 22 22:29:34 2011
@@ -801,18 +801,18 @@ file_diff(struct edit_baton *eb,
* DIR_BATON is the baton for the directory.
*/
static svn_error_t *
-directory_elements_diff(struct dir_baton *db)
+walk_local_nodes_diff(struct edit_baton *eb,
+ const char *local_abspath,
+ const char *path,
+ svn_depth_t depth,
+ apr_hash_t *compared,
+ apr_pool_t *scratch_pool)
{
+ svn_wc__db_t *db = eb->db;
const apr_array_header_t *children;
int i;
svn_boolean_t in_anchor_not_target;
apr_pool_t *iterpool;
- struct edit_baton *eb = db->eb;
-
- /* This directory should have been unchanged or replaced, not added,
- since an added directory can only contain added files and these will
- already have been compared. */
- SVN_ERR_ASSERT(!db->added);
/* Everything we do below is useless if we are comparing to BASE. */
if (eb->use_text_base)
@@ -824,53 +824,52 @@ directory_elements_diff(struct dir_baton
skipped. */
in_anchor_not_target =
(*eb->target
- && (! svn_path_compare_paths(db->path, eb->anchor_path)));
+ && (! svn_path_compare_paths(path, eb->anchor_path)));
/* Check for local property mods on this directory, if we haven't
already reported them and we aren't changelist-filted.
### it should be noted that we do not currently allow directories
### to be part of changelists, so if a changelist is provided, the
### changelist check will always fail. */
- if (svn_wc__internal_changelist_match(eb->db, db->local_abspath,
- eb->changelist_hash, db->pool)
+ if (svn_wc__internal_changelist_match(db, local_abspath,
+ eb->changelist_hash, scratch_pool)
&& (! in_anchor_not_target)
- && (! apr_hash_get(db->compared, "", 0)))
+ && (!compared || ! apr_hash_get(compared, "", 0)))
{
svn_boolean_t modified;
- SVN_ERR(svn_wc__props_modified(&modified, eb->db, db->local_abspath,
- db->pool));
+ SVN_ERR(svn_wc__props_modified(&modified, db, local_abspath,
+ scratch_pool));
if (modified)
{
apr_array_header_t *propchanges;
apr_hash_t *baseprops;
SVN_ERR(svn_wc__internal_propdiff(&propchanges, &baseprops,
- eb->db, db->local_abspath,
- db->pool, db->pool));
+ db, local_abspath,
+ scratch_pool, scratch_pool));
- SVN_ERR(eb->callbacks->dir_props_changed(db->local_abspath,
+ SVN_ERR(eb->callbacks->dir_props_changed(local_abspath,
NULL, NULL,
- db->path,
+ path,
propchanges, baseprops,
eb->callback_baton,
- db->pool));
+ scratch_pool));
}
}
- if (db->depth == svn_depth_empty && !in_anchor_not_target)
+ if (depth == svn_depth_empty && !in_anchor_not_target)
return SVN_NO_ERROR;
- iterpool = svn_pool_create(db->pool);
+ iterpool = svn_pool_create(scratch_pool);
- SVN_ERR(svn_wc__db_read_children(&children, eb->db, db->local_abspath,
- db->pool, iterpool));
+ SVN_ERR(svn_wc__db_read_children(&children, db, local_abspath,
+ scratch_pool, iterpool));
for (i = 0; i < children->nelts; i++)
{
const char *name = APR_ARRAY_IDX(children, i, const char*);
- struct dir_baton *subdir_baton;
- const char *child_abspath, *path;
+ const char *child_abspath, *child_path;
svn_boolean_t hidden;
svn_wc__db_kind_t kind;
@@ -879,9 +878,9 @@ directory_elements_diff(struct dir_baton
if (eb->cancel_func)
SVN_ERR(eb->cancel_func(eb->cancel_baton));
- child_abspath = svn_dirent_join(db->local_abspath, name, iterpool);
+ child_abspath = svn_dirent_join(local_abspath, name, iterpool);
- SVN_ERR(svn_wc__db_node_hidden(&hidden, eb->db, child_abspath, iterpool));
+ SVN_ERR(svn_wc__db_node_hidden(&hidden, db, child_abspath, iterpool));
if (hidden)
continue;
@@ -893,19 +892,19 @@ directory_elements_diff(struct dir_baton
if (in_anchor_not_target && strcmp(eb->target, name))
continue;
- path = svn_dirent_join(db->path, name, iterpool);
+ child_path = svn_dirent_join(path, name, iterpool);
/* Skip this node if it is in the list of nodes already diff'd. */
- if (apr_hash_get(db->compared, path, APR_HASH_KEY_STRING))
+ if (compared && apr_hash_get(compared, child_path, APR_HASH_KEY_STRING))
continue;
- SVN_ERR(svn_wc__db_read_kind(&kind, eb->db, child_abspath, TRUE,
+ SVN_ERR(svn_wc__db_read_kind(&kind, db, child_abspath, TRUE,
iterpool));
switch (kind)
{
case svn_wc__db_kind_file:
case svn_wc__db_kind_symlink:
- SVN_ERR(file_diff(eb, child_abspath, path, iterpool));
+ SVN_ERR(file_diff(eb, child_abspath, child_path, iterpool));
break;
case svn_wc__db_kind_dir:
@@ -919,21 +918,20 @@ directory_elements_diff(struct dir_baton
/* Check the subdir if in the anchor (the subdir is the target), or
if recursive */
if (in_anchor_not_target
- || (db->depth > svn_depth_files)
- || (db->depth == svn_depth_unknown))
+ || (depth > svn_depth_files)
+ || (depth == svn_depth_unknown))
{
- svn_depth_t depth_below_here = db->depth;
+ svn_depth_t depth_below_here = depth;
if (depth_below_here == svn_depth_immediates)
depth_below_here = svn_depth_empty;
- subdir_baton = make_dir_baton(path, db,
- db->eb,
- FALSE,
+ SVN_ERR(walk_local_nodes_diff(eb,
+ child_abspath,
+ child_path,
depth_below_here,
- iterpool);
-
- SVN_ERR(directory_elements_diff(subdir_baton));
+ NULL,
+ iterpool));
}
break;
@@ -1412,7 +1410,12 @@ close_directory(void *dir_baton,
directories since they can only contain added elements, all of
which have already been diff'd. */
if (!db->added)
- SVN_ERR(directory_elements_diff(db));
+ SVN_ERR(walk_local_nodes_diff(eb,
+ db->local_abspath,
+ db->path,
+ db->depth,
+ db->compared,
+ db->pool));
/* Mark this directory as compared in the parent directory's baton,
unless this is the root of the comparison. */
@@ -1802,11 +1805,12 @@ close_edit(void *edit_baton,
if (!eb->root_opened)
{
- struct dir_baton *db;
-
- db = make_dir_baton(eb->anchor_path, NULL, eb, FALSE, eb->depth,
- eb->pool);
- SVN_ERR(directory_elements_diff(db));
+ SVN_ERR(walk_local_nodes_diff(eb,
+ eb->anchor_abspath,
+ eb->anchor_path,
+ eb->depth,
+ NULL,
+ eb->pool));
}
return SVN_NO_ERROR;
@@ -1910,7 +1914,6 @@ svn_wc_diff6(svn_wc_context_t *wc_ctx,
apr_pool_t *pool)
{
struct edit_baton *eb;
- struct dir_baton *db;
const char *target;
const char *target_abspath;
const char *anchor_path;
@@ -1939,9 +1942,12 @@ svn_wc_diff6(svn_wc_context_t *wc_ctx,
cancel_func, cancel_baton,
pool));
- db = make_dir_baton(anchor_path, NULL, eb, FALSE, depth, eb->pool);
-
- SVN_ERR(directory_elements_diff(db));
+ SVN_ERR(walk_local_nodes_diff(eb,
+ eb->anchor_abspath,
+ eb->anchor_path,
+ depth,
+ NULL,
+ eb->pool));
return SVN_NO_ERROR;
}