You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by st...@apache.org on 2014/12/19 12:15:29 UTC
svn commit: r1646670 - in
/subversion/branches/fsx-id/subversion/libsvn_fs_x: dag.c dag.h tree.c
Author: stefan2
Date: Fri Dec 19 11:15:29 2014
New Revision: 1646670
URL: http://svn.apache.org/r1646670
Log:
On the fsx-id branch: Remove most references to svn_fs_x__id_copy_id
such that it can be removed in the next commit.
* subversion/libsvn_fs_x/dag.h
(svn_fs_x__dag_same_line_of_history): New DAG node comparison function.
* subversion/libsvn_fs_x/dag.c
(svn_fs_x__dag_same_line_of_history): Implement directly accessing the
noderev's copy ID.
(make_entry): Directly access the parent noderev's copy ID.
* subversion/libsvn_fs_x/tree.c
(compare_dir_structure): Call the new function instead of implementing
the logic locally.
(merge): Same, plus update function call.
Modified:
subversion/branches/fsx-id/subversion/libsvn_fs_x/dag.c
subversion/branches/fsx-id/subversion/libsvn_fs_x/dag.h
subversion/branches/fsx-id/subversion/libsvn_fs_x/tree.c
Modified: subversion/branches/fsx-id/subversion/libsvn_fs_x/dag.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsx-id/subversion/libsvn_fs_x/dag.c?rev=1646670&r1=1646669&r2=1646670&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/dag.c (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/dag.c Fri Dec 19 11:15:29 2014
@@ -224,6 +224,21 @@ svn_fs_x__dag_related_node(svn_boolean_t
return SVN_NO_ERROR;
}
+svn_error_t *
+svn_fs_x__dag_same_line_of_history(svn_boolean_t *same,
+ dag_node_t *lhs,
+ dag_node_t *rhs)
+{
+ node_revision_t *lhs_noderev, *rhs_noderev;
+
+ SVN_ERR(get_node_revision(&lhs_noderev, lhs));
+ SVN_ERR(get_node_revision(&rhs_noderev, rhs));
+
+ *same = svn_fs_x__id_part_eq(&lhs_noderev->node_id, &rhs_noderev->node_id)
+ && svn_fs_x__id_part_eq(&lhs_noderev->copy_id, &rhs_noderev->copy_id);
+
+ return SVN_NO_ERROR;
+}
svn_boolean_t svn_fs_x__dag_check_mutable(const dag_node_t *node)
{
@@ -418,7 +433,6 @@ make_entry(dag_node_t **child_p,
{
const svn_fs_id_t *new_node_id;
node_revision_t new_noderev, *parent_noderev;
- svn_fs_x__id_part_t copy_id;
/* Make sure that NAME is a single path component. */
if (! svn_path_is_single_path_component(name))
@@ -450,10 +464,9 @@ make_entry(dag_node_t **child_p,
new_noderev.copyfrom_rev = SVN_INVALID_REVNUM;
new_noderev.copyfrom_path = NULL;
- SVN_ERR(svn_fs_x__dag_get_copy_id(©_id, parent));
SVN_ERR(svn_fs_x__create_node
(&new_node_id, svn_fs_x__dag_get_fs(parent), &new_noderev,
- ©_id, txn_id, pool));
+ &parent_noderev->copy_id, txn_id, pool));
/* Create a new dag_node_t for our new node */
SVN_ERR(svn_fs_x__dag_get_node(child_p, svn_fs_x__dag_get_fs(parent),
Modified: subversion/branches/fsx-id/subversion/libsvn_fs_x/dag.h
URL: http://svn.apache.org/viewvc/subversion/branches/fsx-id/subversion/libsvn_fs_x/dag.h?rev=1646670&r1=1646669&r2=1646670&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/dag.h (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/dag.h Fri Dec 19 11:15:29 2014
@@ -139,6 +139,13 @@ svn_fs_x__dag_related_node(svn_boolean_t
dag_node_t *lhs,
dag_node_t *rhs);
+/* Set *SAME to TRUE, if nodes LHS and RHS have the same node and copy IDs.
+ */
+svn_error_t *
+svn_fs_x__dag_same_line_of_history(svn_boolean_t *same,
+ dag_node_t *lhs,
+ dag_node_t *rhs);
+
/* Return the created path of NODE. The value returned is shared
with NODE, and will be deallocated when NODE is. */
const char *svn_fs_x__dag_get_created_path(dag_node_t *node);
Modified: subversion/branches/fsx-id/subversion/libsvn_fs_x/tree.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsx-id/subversion/libsvn_fs_x/tree.c?rev=1646670&r1=1646669&r2=1646670&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/tree.c (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/tree.c Fri Dec 19 11:15:29 2014
@@ -1750,12 +1750,13 @@ conflict_err(svn_stringbuf_t *conflict_p
_("Conflict at '%s'"), path);
}
-/* Compare the directory representations at nodes LHS and RHS and set
+/* Compare the directory representations at nodes LHS and RHS in FS and set
* *CHANGED to TRUE, if at least one entry has been added or removed them.
* Use POOL for temporary allocations.
*/
static svn_error_t *
compare_dir_structure(svn_boolean_t *changed,
+ svn_fs_t *fs,
dag_node_t *lhs,
dag_node_t *rhs,
apr_pool_t *pool)
@@ -1763,6 +1764,7 @@ compare_dir_structure(svn_boolean_t *cha
apr_array_header_t *lhs_entries;
apr_array_header_t *rhs_entries;
int i;
+ apr_pool_t *iterpool = svn_pool_create(pool);
SVN_ERR(svn_fs_x__dag_dir_entries(&lhs_entries, lhs, pool));
SVN_ERR(svn_fs_x__dag_dir_entries(&rhs_entries, rhs, pool));
@@ -1776,18 +1778,37 @@ compare_dir_structure(svn_boolean_t *cha
svn_fs_dirent_t *rhs_entry
= APR_ARRAY_IDX(rhs_entries, i, svn_fs_dirent_t *);
- if (strcmp(lhs_entry->name, rhs_entry->name)
- || !svn_fs_x__id_part_eq(svn_fs_x__id_node_id(lhs_entry->id),
- svn_fs_x__id_node_id(rhs_entry->id))
- || !svn_fs_x__id_part_eq(svn_fs_x__id_copy_id(lhs_entry->id),
- svn_fs_x__id_copy_id(rhs_entry->id)))
+ if (strcmp(lhs_entry->name, rhs_entry->name) == 0)
{
- *changed = TRUE;
- return SVN_NO_ERROR;
+ svn_boolean_t same_history;
+ dag_node_t *lhs_node, *rhs_node;
+
+ /* Unchanged entry? */
+ if (!svn_fs_x__id_eq(lhs_entry->id, rhs_entry->id))
+ continue;
+
+ /* We get here rarely. */
+ svn_pool_clear(iterpool);
+
+ /* Modified but not copied / replaced or anything? */
+ SVN_ERR(svn_fs_x__dag_get_node(&lhs_node, fs, lhs_entry->id,
+ iterpool));
+ SVN_ERR(svn_fs_x__dag_get_node(&rhs_node, fs, rhs_entry->id,
+ iterpool));
+ SVN_ERR(svn_fs_x__dag_same_line_of_history(&same_history,
+ lhs_node, rhs_node));
+ if (same_history)
+ continue;
}
+
+ /* This is a different entry. */
+ *changed = TRUE;
+ break;
}
+ svn_pool_destroy(iterpool);
*changed = FALSE;
+
return SVN_NO_ERROR;
}
@@ -1983,7 +2004,7 @@ merge(svn_stringbuf_t *conflict_p,
to its entries, i.e. there were no additions or removals.
Those could cause update problems to the working copy. */
svn_boolean_t changed;
- SVN_ERR(compare_dir_structure(&changed, source, ancestor, pool));
+ SVN_ERR(compare_dir_structure(&changed, fs, source, ancestor, pool));
if (changed)
return conflict_err(conflict_p, target_path);
@@ -2058,6 +2079,7 @@ merge(svn_stringbuf_t *conflict_p,
dag_node_t *s_ent_node, *t_ent_node, *a_ent_node;
const char *new_tpath;
apr_int64_t sub_mergeinfo_increment;
+ svn_boolean_t s_a_same, t_a_same;
/* If SOURCE-ENTRY and TARGET-ENTRY are both null, that's a
double delete; if one of them is null, that's a delete versus
@@ -2077,16 +2099,21 @@ merge(svn_stringbuf_t *conflict_p,
a_entry->name,
iterpool));
+ /* Fetch DAG nodes to efficiently access ID parts. */
+ SVN_ERR(svn_fs_x__dag_get_node(&s_ent_node, fs,
+ s_entry->id, iterpool));
+ SVN_ERR(svn_fs_x__dag_get_node(&t_ent_node, fs,
+ t_entry->id, iterpool));
+ SVN_ERR(svn_fs_x__dag_get_node(&a_ent_node, fs,
+ a_entry->id, iterpool));
+
/* If either SOURCE-ENTRY or TARGET-ENTRY is not a direct
modification of ANCESTOR-ENTRY, declare a conflict. */
- if (!svn_fs_x__id_part_eq(svn_fs_x__id_node_id(s_entry->id),
- svn_fs_x__id_node_id(a_entry->id))
- || !svn_fs_x__id_part_eq(svn_fs_x__id_copy_id(s_entry->id),
- svn_fs_x__id_copy_id(a_entry->id))
- || !svn_fs_x__id_part_eq(svn_fs_x__id_node_id(t_entry->id),
- svn_fs_x__id_node_id(a_entry->id))
- || !svn_fs_x__id_part_eq(svn_fs_x__id_copy_id(t_entry->id),
- svn_fs_x__id_copy_id(a_entry->id)))
+ SVN_ERR(svn_fs_x__dag_same_line_of_history(&s_a_same, s_ent_node,
+ a_ent_node));
+ SVN_ERR(svn_fs_x__dag_same_line_of_history(&t_a_same, t_ent_node,
+ a_ent_node));
+ if (!s_a_same || !t_a_same)
return conflict_err(conflict_p,
svn_fspath__join(target_path,
a_entry->name,
@@ -2095,12 +2122,6 @@ merge(svn_stringbuf_t *conflict_p,
/* Direct modifications were made to the directory
ANCESTOR-ENTRY in both SOURCE and TARGET. Recursively
merge these modifications. */
- SVN_ERR(svn_fs_x__dag_get_node(&s_ent_node, fs,
- s_entry->id, iterpool));
- SVN_ERR(svn_fs_x__dag_get_node(&t_ent_node, fs,
- t_entry->id, iterpool));
- SVN_ERR(svn_fs_x__dag_get_node(&a_ent_node, fs,
- a_entry->id, iterpool));
new_tpath = svn_fspath__join(target_path, t_entry->name, iterpool);
SVN_ERR(merge(conflict_p, new_tpath,
t_ent_node, s_ent_node, a_ent_node,