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/27 17:53:08 UTC
svn commit: r1648068 - in
/subversion/branches/fsx-id/subversion/libsvn_fs_x: changes.c fs.h
low_level.c temp_serializer.c transaction.c transaction.h tree.c
Author: stefan2
Date: Sat Dec 27 16:53:08 2014
New Revision: 1648068
URL: http://svn.apache.org/r1648068
Log:
On the fsx-id branch: Instead wrapping svn_fs_path_change2_t in FSX'
change_t, expand its elements into change_t. That way, we can replace
the svn_fs_id_t instance in it later.
Most of the code churn is due to the fact that there is one structure
level less now.
* subversion/libsvn_fs_x/fs.h
(change_t): Expand the INFO sub-struct into this one.
* subversion/libsvn_fs_x/temp_serializer.c
(serialize_change,
deserialize_change): Remove INFO intermediary.
* subversion/libsvn_fs_x/changes.c
(append_change,
svn_fs_x__changes_get_list,
svn_fs_x__changes_get_list_func): Use the CHANGE directly instead of
the former INFO sub-structure.
* subversion/libsvn_fs_x/low_level.c
(read_change,
write_change_entry): Ditto.
(svn_fs_x__write_changes): The hash now contains full change_t.
* subversion/libsvn_fs_x/transaction.h
(svn_fs_x__paths_changed): Remove. The functionality has been moved
to tree.c
* subversion/libsvn_fs_x/transaction.c
(path_change_dup): Duplicate a full change_t now.
(fold_change): The hashes now contain full change_t, including the name.
There's no intermediate INFO struct level anymore.
(process_changes): There's no intermediate INFO struct level anymore.
(svn_fs_x__paths_changed): Remove here. See x_paths_changed in tree.c
(svn_fs_x__add_change,
verify_locks): The hashes now contain full change_t.
* subversion/libsvn_fs_x/tree.c
(construct_fs_path_change): New utility function converting our internal
change_t into the FS API level equivalent.
(x_paths_changed): Convert changed paths lists from using change_t to
svn_fs_path_change2_t and the internal hash or array
to a hash as required by the API.
Modified:
subversion/branches/fsx-id/subversion/libsvn_fs_x/changes.c
subversion/branches/fsx-id/subversion/libsvn_fs_x/fs.h
subversion/branches/fsx-id/subversion/libsvn_fs_x/low_level.c
subversion/branches/fsx-id/subversion/libsvn_fs_x/temp_serializer.c
subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.c
subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.h
subversion/branches/fsx-id/subversion/libsvn_fs_x/tree.c
Modified: subversion/branches/fsx-id/subversion/libsvn_fs_x/changes.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsx-id/subversion/libsvn_fs_x/changes.c?rev=1648068&r1=1648067&r2=1648068&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/changes.c (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/changes.c Sat Dec 27 16:53:08 2014
@@ -139,20 +139,30 @@ append_change(svn_fs_x__changes_t *chang
{
binary_change_t binary_change = { 0 };
svn_boolean_t is_txn_id;
- svn_fs_path_change2_t *info;
/* CHANGE must be sufficiently complete */
SVN_ERR_ASSERT(change);
SVN_ERR_ASSERT(change->path.data);
+ /* Relevant parts of the revision ID of the change. */
+ if (change->node_rev_id)
+ {
+ binary_change.node_id = *svn_fs_x__id_node_id(change->node_rev_id);
+ binary_change.noderev_id = *svn_fs_x__id_noderev_id(change->node_rev_id);
+ }
+ else
+ {
+ binary_change.noderev_id.number = 0;
+ binary_change.noderev_id.change_set = SVN_FS_X__INVALID_CHANGE_SET;
+ }
+
/* define the kind of change and what specific information is present */
- info = &change->info;
- is_txn_id = info->node_rev_id && svn_fs_x__id_is_txn(info->node_rev_id);
- binary_change.flags = (info->text_mod ? CHANGE_TEXT_MOD : 0)
- | (info->prop_mod ? CHANGE_PROP_MOD : 0)
+ is_txn_id = change->node_rev_id && svn_fs_x__id_is_txn(change->node_rev_id);
+ binary_change.flags = (change->text_mod ? CHANGE_TEXT_MOD : 0)
+ | (change->prop_mod ? CHANGE_PROP_MOD : 0)
| (is_txn_id ? CHANGE_TXN_NODE : 0)
- | ((int)info->change_kind << CHANGE_KIND_SHIFT)
- | ((int)info->node_kind << CHANGE_NODE_SHIFT);
+ | ((int)change->change_kind << CHANGE_KIND_SHIFT)
+ | ((int)change->node_kind << CHANGE_NODE_SHIFT);
/* Path of the change. */
binary_change.path
@@ -161,12 +171,12 @@ append_change(svn_fs_x__changes_t *chang
change->path.len);
/* copy-from information, if presence is indicated by FLAGS */
- if (SVN_IS_VALID_REVNUM(info->copyfrom_rev))
+ if (SVN_IS_VALID_REVNUM(change->copyfrom_rev))
{
- binary_change.copyfrom_rev = info->copyfrom_rev;
+ binary_change.copyfrom_rev = change->copyfrom_rev;
binary_change.copyfrom_path
= svn_fs_x__string_table_builder_add(changes->builder,
- info->copyfrom_path,
+ change->copyfrom_path,
0);
}
else
@@ -175,18 +185,6 @@ append_change(svn_fs_x__changes_t *chang
binary_change.copyfrom_path = 0;
}
- /* Relevant parts of the revision ID of the change. */
- if (info->node_rev_id)
- {
- binary_change.node_id = *svn_fs_x__id_node_id(info->node_rev_id);
- binary_change.noderev_id = *svn_fs_x__id_noderev_id(info->node_rev_id);
- }
- else
- {
- binary_change.noderev_id.number = 0;
- binary_change.noderev_id.change_set = SVN_FS_X__INVALID_CHANGE_SET;
- }
-
APR_ARRAY_PUSH(changes->changes, binary_change_t) = binary_change;
return SVN_NO_ERROR;
@@ -265,28 +263,27 @@ svn_fs_x__changes_get_list(apr_array_hea
/* convert BINARY_CHANGE into a standard FSX change_t */
change_t *change = apr_pcalloc(pool, sizeof(*change));
- svn_fs_path_change2_t *info = &change->info;
change->path.data = svn_fs_x__string_table_get(changes->paths,
binary_change->path,
&change->path.len,
pool);
if (binary_change->noderev_id.change_set != SVN_FS_X__INVALID_CHANGE_SET)
- info->node_rev_id = svn_fs_x__id_create(&binary_change->node_id,
- &binary_change->noderev_id,
- pool);
+ change->node_rev_id = svn_fs_x__id_create(&binary_change->node_id,
+ &binary_change->noderev_id,
+ pool);
- info->change_kind = (svn_fs_path_change_kind_t)
+ change->change_kind = (svn_fs_path_change_kind_t)
((binary_change->flags & CHANGE_KIND_MASK) >> CHANGE_KIND_SHIFT);
- info->text_mod = (binary_change->flags & CHANGE_TEXT_MOD) != 0;
- info->prop_mod = (binary_change->flags & CHANGE_PROP_MOD) != 0;
- info->node_kind = (svn_node_kind_t)
+ change->text_mod = (binary_change->flags & CHANGE_TEXT_MOD) != 0;
+ change->prop_mod = (binary_change->flags & CHANGE_PROP_MOD) != 0;
+ change->node_kind = (svn_node_kind_t)
((binary_change->flags & CHANGE_NODE_MASK) >> CHANGE_NODE_SHIFT);
- info->copyfrom_rev = binary_change->copyfrom_rev;
- info->copyfrom_known = TRUE;
+ change->copyfrom_rev = binary_change->copyfrom_rev;
+ change->copyfrom_known = TRUE;
if (SVN_IS_VALID_REVNUM(binary_change->copyfrom_rev))
- info->copyfrom_path
+ change->copyfrom_path
= svn_fs_x__string_table_get(changes->paths,
binary_change->copyfrom_path,
NULL,
@@ -524,27 +521,26 @@ svn_fs_x__changes_get_list_func(void **o
/* convert BINARY_CHANGE into a standard FSX change_t */
change_t *change = apr_pcalloc(pool, sizeof(*change));
- svn_fs_path_change2_t *info = &change->info;
change->path.data
= svn_fs_x__string_table_get_func(paths, binary_change->path,
&change->path.len, pool);
if (binary_change->noderev_id.change_set != SVN_FS_X__INVALID_CHANGE_SET)
- info->node_rev_id = svn_fs_x__id_create(&binary_change->node_id,
- &binary_change->noderev_id,
- pool);
+ change->node_rev_id = svn_fs_x__id_create(&binary_change->node_id,
+ &binary_change->noderev_id,
+ pool);
- info->change_kind = (svn_fs_path_change_kind_t)
+ change->change_kind = (svn_fs_path_change_kind_t)
((binary_change->flags & CHANGE_KIND_MASK) >> CHANGE_KIND_SHIFT);
- info->text_mod = (binary_change->flags & CHANGE_TEXT_MOD) != 0;
- info->prop_mod = (binary_change->flags & CHANGE_PROP_MOD) != 0;
- info->node_kind = (svn_node_kind_t)
+ change->text_mod = (binary_change->flags & CHANGE_TEXT_MOD) != 0;
+ change->prop_mod = (binary_change->flags & CHANGE_PROP_MOD) != 0;
+ change->node_kind = (svn_node_kind_t)
((binary_change->flags & CHANGE_NODE_MASK) >> CHANGE_NODE_SHIFT);
- info->copyfrom_rev = binary_change->copyfrom_rev;
- info->copyfrom_known = TRUE;
+ change->copyfrom_rev = binary_change->copyfrom_rev;
+ change->copyfrom_known = TRUE;
if (SVN_IS_VALID_REVNUM(binary_change->copyfrom_rev))
- info->copyfrom_path
+ change->copyfrom_path
= svn_fs_x__string_table_get_func(paths,
binary_change->copyfrom_path,
NULL,
Modified: subversion/branches/fsx-id/subversion/libsvn_fs_x/fs.h
URL: http://svn.apache.org/viewvc/subversion/branches/fsx-id/subversion/libsvn_fs_x/fs.h?rev=1648068&r1=1648067&r2=1648068&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/fs.h (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/fs.h Sat Dec 27 16:53:08 2014
@@ -549,8 +549,22 @@ typedef struct change_t
/* Path of the change. */
svn_string_t path;
- /* API compatible change description */
- svn_fs_path_change2_t info;
+ /* node revision id of changed path */
+ const svn_fs_id_t *node_rev_id;
+
+ /* See svn_fs_path_change2_t for a description for the remaining elements.
+ */
+ svn_fs_path_change_kind_t change_kind;
+
+ svn_boolean_t text_mod;
+ svn_boolean_t prop_mod;
+ svn_node_kind_t node_kind;
+
+ svn_boolean_t copyfrom_known;
+ svn_revnum_t copyfrom_rev;
+ const char *copyfrom_path;
+
+ svn_tristate_t mergeinfo_mod;
} change_t;
Modified: subversion/branches/fsx-id/subversion/libsvn_fs_x/low_level.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsx-id/subversion/libsvn_fs_x/low_level.c?rev=1648068&r1=1648067&r2=1648068&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/low_level.c (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/low_level.c Sat Dec 27 16:53:08 2014
@@ -786,7 +786,6 @@ read_change(change_t **change_p,
svn_boolean_t eof = TRUE;
change_t *change;
char *str, *last_str, *kind_str;
- svn_fs_path_change2_t *info;
/* Default return value. */
*change_p = NULL;
@@ -798,7 +797,6 @@ read_change(change_t **change_p,
return SVN_NO_ERROR;
change = apr_pcalloc(result_pool, sizeof(*change));
- info = &change->info;
last_str = line->data;
/* Get the node-id of the change. */
@@ -807,8 +805,8 @@ read_change(change_t **change_p,
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("Invalid changes line in rev-file"));
- SVN_ERR(svn_fs_x__id_parse(&info->node_rev_id, str, result_pool));
- if (info->node_rev_id == NULL)
+ SVN_ERR(svn_fs_x__id_parse(&change->node_rev_id, str, result_pool));
+ if (change->node_rev_id == NULL)
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("Invalid changes line in rev-file"));
@@ -820,7 +818,7 @@ read_change(change_t **change_p,
/* Don't bother to check the format number before looking for
* node-kinds: just read them if you find them. */
- info->node_kind = svn_node_unknown;
+ change->node_kind = svn_node_unknown;
kind_str = strchr(str, '-');
if (kind_str)
{
@@ -828,9 +826,9 @@ read_change(change_t **change_p,
*kind_str = '\0';
kind_str++;
if (strcmp(kind_str, SVN_FS_X__KIND_FILE) == 0)
- info->node_kind = svn_node_file;
+ change->node_kind = svn_node_file;
else if (strcmp(kind_str, SVN_FS_X__KIND_DIR) == 0)
- info->node_kind = svn_node_dir;
+ change->node_kind = svn_node_dir;
else
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("Invalid changes line in rev-file"));
@@ -838,23 +836,23 @@ read_change(change_t **change_p,
if (strcmp(str, ACTION_MODIFY) == 0)
{
- info->change_kind = svn_fs_path_change_modify;
+ change->change_kind = svn_fs_path_change_modify;
}
else if (strcmp(str, ACTION_ADD) == 0)
{
- info->change_kind = svn_fs_path_change_add;
+ change->change_kind = svn_fs_path_change_add;
}
else if (strcmp(str, ACTION_DELETE) == 0)
{
- info->change_kind = svn_fs_path_change_delete;
+ change->change_kind = svn_fs_path_change_delete;
}
else if (strcmp(str, ACTION_REPLACE) == 0)
{
- info->change_kind = svn_fs_path_change_replace;
+ change->change_kind = svn_fs_path_change_replace;
}
else if (strcmp(str, ACTION_RESET) == 0)
{
- info->change_kind = svn_fs_path_change_reset;
+ change->change_kind = svn_fs_path_change_reset;
}
else
{
@@ -870,11 +868,11 @@ read_change(change_t **change_p,
if (strcmp(str, FLAG_TRUE) == 0)
{
- info->text_mod = TRUE;
+ change->text_mod = TRUE;
}
else if (strcmp(str, FLAG_FALSE) == 0)
{
- info->text_mod = FALSE;
+ change->text_mod = FALSE;
}
else
{
@@ -890,11 +888,11 @@ read_change(change_t **change_p,
if (strcmp(str, FLAG_TRUE) == 0)
{
- info->prop_mod = TRUE;
+ change->prop_mod = TRUE;
}
else if (strcmp(str, FLAG_FALSE) == 0)
{
- info->prop_mod = FALSE;
+ change->prop_mod = FALSE;
}
else
{
@@ -910,11 +908,11 @@ read_change(change_t **change_p,
if (strcmp(str, FLAG_TRUE) == 0)
{
- info->mergeinfo_mod = svn_tristate_true;
+ change->mergeinfo_mod = svn_tristate_true;
}
else if (strcmp(str, FLAG_FALSE) == 0)
{
- info->mergeinfo_mod = svn_tristate_false;
+ change->mergeinfo_mod = svn_tristate_false;
}
else
{
@@ -935,22 +933,22 @@ read_change(change_t **change_p,
/* Read the next line, the copyfrom line. */
SVN_ERR(svn_stream_readline(stream, &line, "\n", &eof, result_pool));
- info->copyfrom_known = TRUE;
+ change->copyfrom_known = TRUE;
if (eof || line->len == 0)
{
- info->copyfrom_rev = SVN_INVALID_REVNUM;
- info->copyfrom_path = NULL;
+ change->copyfrom_rev = SVN_INVALID_REVNUM;
+ change->copyfrom_path = NULL;
}
else
{
last_str = line->data;
- SVN_ERR(parse_revnum(&info->copyfrom_rev, (const char **)&last_str));
+ SVN_ERR(parse_revnum(&change->copyfrom_rev, (const char **)&last_str));
if (!svn_fspath__is_canonical(last_str))
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("Invalid copy-from path in changes line"));
- info->copyfrom_path = auto_unescape_path(last_str, result_pool);
+ change->copyfrom_path = auto_unescape_path(last_str, result_pool);
}
*change_p = change;
@@ -1020,8 +1018,7 @@ svn_fs_x__read_changes_incrementally(svn
All temporary allocations are in SCRATCH_POOL. */
static svn_error_t *
write_change_entry(svn_stream_t *stream,
- const char *path,
- svn_fs_path_change2_t *change,
+ change_t *change,
apr_pool_t *scratch_pool)
{
const char *idstr;
@@ -1071,7 +1068,7 @@ write_change_entry(svn_stream_t *stream,
change->prop_mod ? FLAG_TRUE : FLAG_FALSE,
change->mergeinfo_mod == svn_tristate_true
? FLAG_TRUE : FLAG_FALSE,
- auto_escape_path(path, scratch_pool));
+ auto_escape_path(change->path.data, scratch_pool));
if (SVN_IS_VALID_REVNUM(change->copyfrom_rev))
{
@@ -1115,16 +1112,13 @@ svn_fs_x__write_changes(svn_stream_t *st
/* Write all items to disk in the new order. */
for (i = 0; i < sorted_changed_paths->nelts; ++i)
{
- svn_fs_path_change2_t *change;
- const char *path;
+ change_t *change;
svn_pool_clear(iterpool);
-
change = APR_ARRAY_IDX(sorted_changed_paths, i, svn_sort__item_t).value;
- path = APR_ARRAY_IDX(sorted_changed_paths, i, svn_sort__item_t).key;
/* Write out the new entry into the final rev-file. */
- SVN_ERR(write_change_entry(stream, path, change, iterpool));
+ SVN_ERR(write_change_entry(stream, change, iterpool));
}
if (terminate_list)
Modified: subversion/branches/fsx-id/subversion/libsvn_fs_x/temp_serializer.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsx-id/subversion/libsvn_fs_x/temp_serializer.c?rev=1648068&r1=1648067&r2=1648068&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/temp_serializer.c (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/temp_serializer.c Sat Dec 27 16:53:08 2014
@@ -1075,10 +1075,10 @@ serialize_change(svn_temp_serializer__co
sizeof(*change));
/* serialize sub-structures */
- svn_fs_x__id_serialize(context, &change->info.node_rev_id);
+ svn_fs_x__id_serialize(context, &change->node_rev_id);
svn_temp_serializer__add_string(context, &change->path.data);
- svn_temp_serializer__add_string(context, &change->info.copyfrom_path);
+ svn_temp_serializer__add_string(context, &change->copyfrom_path);
/* return to the caller's nesting level */
svn_temp_serializer__pop(context);
@@ -1103,11 +1103,11 @@ deserialize_change(void *buffer,
/* fix-up of sub-structures */
svn_fs_x__id_deserialize(change,
- (svn_fs_id_t **)&change->info.node_rev_id,
+ (svn_fs_id_t **)&change->node_rev_id,
pool);
svn_temp_deserializer__resolve(change, (void **)&change->path.data);
- svn_temp_deserializer__resolve(change, (void **)&change->info.copyfrom_path);
+ svn_temp_deserializer__resolve(change, (void **)&change->copyfrom_path);
}
/* Auxiliary structure representing the content of a change_t array.
Modified: subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.c?rev=1648068&r1=1648067&r2=1648068&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.c (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.c Sat Dec 27 16:53:08 2014
@@ -860,12 +860,13 @@ unparse_dir_entries(apr_array_header_t *
/* Return a deep copy of SOURCE and allocate it in RESULT_POOL.
*/
-static svn_fs_path_change2_t *
-path_change_dup(const svn_fs_path_change2_t *source,
+static change_t *
+path_change_dup(const change_t *source,
apr_pool_t *result_pool)
{
- svn_fs_path_change2_t *result = apr_pmemdup(result_pool, source,
- sizeof(*source));
+ change_t *result = apr_pmemdup(result_pool, source, sizeof(*source));
+ result->path.data = apr_pstrmemdup(result_pool, source->path.data,
+ source->path.len);
result->node_rev_id = svn_fs_x__id_copy(source->node_rev_id, result_pool);
if (source->copyfrom_path)
result->copyfrom_path = apr_pstrdup(result_pool, source->copyfrom_path);
@@ -874,9 +875,9 @@ path_change_dup(const svn_fs_path_change
}
/* Merge the internal-use-only CHANGE into a hash of public-FS
- svn_fs_path_change2_t CHANGED_PATHS, collapsing multiple changes into a
+ change_t CHANGED_PATHS, collapsing multiple changes into a
single summarical (is that real word?) change per path. DELETIONS is
- also a path->svn_fs_path_change2_t hash and contains all the deletions
+ also a path->change_t hash and contains all the deletions
that got turned into a replacement. */
static svn_error_t *
fold_change(apr_hash_t *changed_paths,
@@ -884,9 +885,8 @@ fold_change(apr_hash_t *changed_paths,
const change_t *change)
{
apr_pool_t *pool = apr_hash_pool_get(changed_paths);
- svn_fs_path_change2_t *old_change, *new_change;
+ change_t *old_change, *new_change;
const svn_string_t *path = &change->path;
- const svn_fs_path_change2_t *info = &change->info;
if ((old_change = apr_hash_get(changed_paths, path->data, path->len)))
{
@@ -895,8 +895,8 @@ fold_change(apr_hash_t *changed_paths,
/* Sanity check: only allow NULL node revision ID in the
`reset' case. */
- if ((! info->node_rev_id)
- && (info->change_kind != svn_fs_path_change_reset))
+ if ((! change->node_rev_id)
+ && (change->change_kind != svn_fs_path_change_reset))
return svn_error_create
(SVN_ERR_FS_CORRUPT, NULL,
_("Missing required node revision ID"));
@@ -904,8 +904,8 @@ fold_change(apr_hash_t *changed_paths,
/* Sanity check: we should be talking about the same node
revision ID as our last change except where the last change
was a deletion. */
- if (info->node_rev_id
- && (! svn_fs_x__id_eq(old_change->node_rev_id, info->node_rev_id))
+ if (change->node_rev_id
+ && (! svn_fs_x__id_eq(old_change->node_rev_id, change->node_rev_id))
&& (old_change->change_kind != svn_fs_path_change_delete))
return svn_error_create
(SVN_ERR_FS_CORRUPT, NULL,
@@ -915,16 +915,16 @@ fold_change(apr_hash_t *changed_paths,
/* Sanity check: an add, replacement, or reset must be the first
thing to follow a deletion. */
if ((old_change->change_kind == svn_fs_path_change_delete)
- && (! ((info->change_kind == svn_fs_path_change_replace)
- || (info->change_kind == svn_fs_path_change_reset)
- || (info->change_kind == svn_fs_path_change_add))))
+ && (! ((change->change_kind == svn_fs_path_change_replace)
+ || (change->change_kind == svn_fs_path_change_reset)
+ || (change->change_kind == svn_fs_path_change_add))))
return svn_error_create
(SVN_ERR_FS_CORRUPT, NULL,
_("Invalid change ordering: non-add change on deleted path"));
/* Sanity check: an add can't follow anything except
a delete or reset. */
- if ((info->change_kind == svn_fs_path_change_add)
+ if ((change->change_kind == svn_fs_path_change_add)
&& (old_change->change_kind != svn_fs_path_change_delete)
&& (old_change->change_kind != svn_fs_path_change_reset))
return svn_error_create
@@ -932,7 +932,7 @@ fold_change(apr_hash_t *changed_paths,
_("Invalid change ordering: add change on preexisting path"));
/* Now, merge that change in. */
- switch (info->change_kind)
+ switch (change->change_kind)
{
case svn_fs_path_change_reset:
/* A reset here will simply remove the path change from the
@@ -958,7 +958,7 @@ fold_change(apr_hash_t *changed_paths,
else
{
/* A deletion overrules a previous change (modify). */
- new_change = path_change_dup(info, pool);
+ new_change = path_change_dup(change, pool);
apr_hash_set(changed_paths, path->data, path->len, new_change);
}
break;
@@ -969,7 +969,7 @@ fold_change(apr_hash_t *changed_paths,
so treat it just like a replace. Remember the original
deletion such that we are able to delete this path again
(the replacement may have changed node kind and id). */
- new_change = path_change_dup(info, pool);
+ new_change = path_change_dup(change, pool);
new_change->change_kind = svn_fs_path_change_replace;
apr_hash_set(changed_paths, path->data, path->len, new_change);
@@ -987,11 +987,11 @@ fold_change(apr_hash_t *changed_paths,
/* If the new change modifies some attribute of the node, set
the corresponding flag, whether it already was set or not.
Note: We do not reset a flag to FALSE if a change is undone. */
- if (info->text_mod)
+ if (change->text_mod)
old_change->text_mod = TRUE;
- if (info->prop_mod)
+ if (change->prop_mod)
old_change->prop_mod = TRUE;
- if (info->mergeinfo_mod == svn_tristate_true)
+ if (change->mergeinfo_mod == svn_tristate_true)
old_change->mergeinfo_mod = svn_tristate_true;
break;
}
@@ -1001,9 +1001,9 @@ fold_change(apr_hash_t *changed_paths,
/* Add this path. The API makes no guarantees that this (new) key
will not be retained. Thus, we copy the key into the target pool
to ensure a proper lifetime. */
- apr_hash_set(changed_paths,
- apr_pstrmemdup(pool, path->data, path->len), path->len,
- path_change_dup(info, pool));
+ new_change = path_change_dup(change, pool);
+ apr_hash_set(changed_paths, new_change->path.data,
+ new_change->path.len, new_change);
}
return SVN_NO_ERROR;
@@ -1042,8 +1042,8 @@ process_changes(void *baton_p,
is already a temporary subpool.
*/
- if ((change->info.change_kind == svn_fs_path_change_delete)
- || (change->info.change_kind == svn_fs_path_change_replace))
+ if ((change->change_kind == svn_fs_path_change_delete)
+ || (change->change_kind == svn_fs_path_change_replace))
{
apr_hash_index_t *hi;
@@ -1121,32 +1121,6 @@ svn_fs_x__txn_changes_fetch(apr_hash_t *
return SVN_NO_ERROR;
}
-
-svn_error_t *
-svn_fs_x__paths_changed(apr_hash_t **changed_paths_p,
- svn_fs_t *fs,
- svn_revnum_t rev,
- apr_pool_t *pool)
-{
- apr_hash_t *changed_paths;
- apr_array_header_t *changes;
- int i;
-
- SVN_ERR(svn_fs_x__get_changes(&changes, fs, rev, pool));
-
- changed_paths = svn_hash__make(pool);
- for (i = 0; i < changes->nelts; ++i)
- {
- change_t *change = APR_ARRAY_IDX(changes, i, change_t *);
- apr_hash_set(changed_paths, change->path.data, change->path.len,
- &change->info);
- }
-
- *changed_paths_p = changed_paths;
-
- return SVN_NO_ERROR;
-}
-
/* Copy a revision node-rev SRC into the current transaction TXN_ID in
the filesystem FS. This is only used to create the root of a transaction.
Allocations are from POOL. */
@@ -1791,7 +1765,7 @@ svn_fs_x__add_change(svn_fs_t *fs,
apr_pool_t *pool)
{
apr_file_t *file;
- svn_fs_path_change2_t *change;
+ change_t change;
apr_hash_t *changes = apr_hash_make(pool);
const svn_fs_id_t *fs_id;
@@ -1816,19 +1790,21 @@ svn_fs_x__add_change(svn_fs_t *fs,
APR_APPEND | APR_WRITE | APR_CREATE,
APR_OS_DEFAULT, pool));
- change = svn_fs__path_change_create_internal(fs_id, change_kind, pool);
- change->text_mod = text_mod;
- change->prop_mod = prop_mod;
- change->mergeinfo_mod = mergeinfo_mod
- ? svn_tristate_true
- : svn_tristate_false;
- change->node_kind = node_kind;
- change->copyfrom_known = TRUE;
- change->copyfrom_rev = copyfrom_rev;
+ change.path.data = path;
+ change.path.len = strlen(path);
+ change.node_rev_id = fs_id;
+ change.change_kind = change_kind;
+ change.text_mod = text_mod;
+ change.prop_mod = prop_mod;
+ change.mergeinfo_mod = mergeinfo_mod ? svn_tristate_true
+ : svn_tristate_false;
+ change.node_kind = node_kind;
+ change.copyfrom_known = TRUE;
+ change.copyfrom_rev = copyfrom_rev;
if (copyfrom_path)
- change->copyfrom_path = apr_pstrdup(pool, copyfrom_path);
+ change.copyfrom_path = apr_pstrdup(pool, copyfrom_path);
- svn_hash_sets(changes, path, change);
+ svn_hash_sets(changes, path, &change);
SVN_ERR(svn_fs_x__write_changes(svn_stream_from_aprfile2(file, TRUE, pool),
fs, changes, FALSE, pool));
@@ -3114,7 +3090,7 @@ verify_locks(svn_fs_t *fs,
for (i = 0; i < changed_paths_sorted->nelts; i++)
{
const char *path;
- svn_fs_path_change2_t *change;
+ change_t *change;
svn_boolean_t recurse = TRUE;
svn_pool_clear(subpool);
Modified: subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.h
URL: http://svn.apache.org/viewvc/subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.h?rev=1648068&r1=1648067&r2=1648068&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.h (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.h Sat Dec 27 16:53:08 2014
@@ -90,15 +90,6 @@ svn_fs_x__txn_changes_fetch(apr_hash_t *
svn_fs_x__txn_id_t txn_id,
apr_pool_t *pool);
-/* Find the paths which were changed in revision REV of filesystem FS
- and store them in *CHANGED_PATHS_P. Get any temporary allocations
- from POOL. */
-svn_error_t *
-svn_fs_x__paths_changed(apr_hash_t **changed_paths_p,
- svn_fs_t *fs,
- svn_revnum_t rev,
- apr_pool_t *pool);
-
/* Create a new transaction in filesystem FS, based on revision REV,
and store it in *TXN_P. Allocate all necessary variables from
POOL. */
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=1648068&r1=1648067&r2=1648068&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/tree.c (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/tree.c Sat Dec 27 16:53:08 2014
@@ -3290,6 +3290,30 @@ x_get_file_delta_stream(svn_txdelta_stre
/* Finding Changes */
+/* Copy CHANGE into a FS API object allocated in RESULT_POOL. */
+static svn_fs_path_change2_t *
+construct_fs_path_change(change_t *change,
+ apr_pool_t *result_pool)
+{
+ const svn_fs_id_t *id
+ = change->node_rev_id;
+ svn_fs_path_change2_t *result
+ = svn_fs__path_change_create_internal(id, change->change_kind,
+ result_pool);
+
+ result->text_mod = change->text_mod;
+ result->prop_mod = change->prop_mod;
+ result->node_kind = change->node_kind;
+
+ result->copyfrom_known = change->copyfrom_known;
+ result->copyfrom_rev = change->copyfrom_rev;
+ result->copyfrom_path = change->copyfrom_path;
+
+ result->mergeinfo_mod = change->mergeinfo_mod;
+
+ return result;
+}
+
/* Set *CHANGED_PATHS_P to a newly allocated hash containing
descriptions of the paths changed under ROOT. The hash is keyed
with const char * paths and has svn_fs_path_change2_t * values. Use
@@ -3299,12 +3323,42 @@ x_paths_changed(apr_hash_t **changed_pat
svn_fs_root_t *root,
apr_pool_t *pool)
{
+ apr_hash_t *changed_paths;
+
if (root->is_txn_root)
- return svn_fs_x__txn_changes_fetch(changed_paths_p, root->fs,
- root_txn_id(root), pool);
+ {
+ apr_hash_index_t *hi;
+ SVN_ERR(svn_fs_x__txn_changes_fetch(&changed_paths, root->fs,
+ root_txn_id(root), pool));
+ for (hi = apr_hash_first(pool, changed_paths);
+ hi;
+ hi = apr_hash_next(hi))
+ {
+ change_t *change = apr_hash_this_val(hi);
+ apr_hash_set(changed_paths,
+ apr_hash_this_key(hi), apr_hash_this_key_len(hi),
+ construct_fs_path_change(change, pool));
+ }
+ }
else
- return svn_fs_x__paths_changed(changed_paths_p, root->fs, root->rev,
- pool);
+ {
+ apr_array_header_t *changes;
+ int i;
+
+ SVN_ERR(svn_fs_x__get_changes(&changes, root->fs, root->rev, pool));
+
+ changed_paths = svn_hash__make(pool);
+ for (i = 0; i < changes->nelts; ++i)
+ {
+ change_t *change = APR_ARRAY_IDX(changes, i, change_t *);
+ apr_hash_set(changed_paths, change->path.data, change->path.len,
+ construct_fs_path_change(change, pool));
+ }
+ }
+
+ *changed_paths_p = changed_paths;
+
+ return SVN_NO_ERROR;
}