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/24 09:18:56 UTC
svn commit: r1647744 - in
/subversion/branches/fsx-id/subversion/libsvn_fs_x: cached_data.c dag.c
dag.h fs.h temp_serializer.c transaction.c transaction.h tree.c
Author: stefan2
Date: Wed Dec 24 08:18:56 2014
New Revision: 1647744
URL: http://svn.apache.org/r1647744
Log:
On the fsx-id branch:
Use noderev-IDs instead of svn_fs_id_t within FSX' dirents.
This has a knock-on effect on various function signatures that now need
the internal instead of the FS API ID type (the alternative would have
been to add just as many type conversions / constructions). The actual
code changes are simple and revolve around where to get the ID in the
right format with the occasional conversion and changed function to call.
* subversion/libsvn_fs_x/fs.h
(dirent_t): Switch ID type.
* subversion/libsvn_fs_x/temp_serializer.c
(serialize_dir_entry,
deserialize_dir,
svn_fs_x__extract_dir_entry): The ID element is no longer a sub-struct.
* subversion/libsvn_fs_x/cached_data.c
(read_dir_entries): Switch ID type to parse.
(svn_fs_x__rep_contents_dir_entry): Dirents are easier to copy now.
* subversion/libsvn_fs_x/transaction.h
(svn_fs_x__create_node): Drop the obsolete FS API ID return value.
(svn_fs_x__set_entry): Switch to internal ID type.
(svn_fs_x__create_successor): Drop the obsolete FS API ID return value.
(svn_fs_x__delete_node_revision): Switch to internal ID type.
* subversion/libsvn_fs_x/transaction.c
(unparse_dir_entry): Switch ID type to serialize.
(svn_fs_x__create_node): Don't generate the redundant FS API ID anymore.
(svn_fs_x__set_entry): Update ID assignment.
(svn_fs_x__create_successor): Don't generate the redundant FS API ID
anymore.
(write_final_rev): Switch the ID of the noderev to serialize to our
internal type. Update ID usage and assignments.
(commit_body): Update caller.
(svn_fs_x__delete_node_revision): Switch to our more easily accessible
internal ID type and simplify the code.
* subversion/libsvn_fs_x/dag.h
(svn_fs_x__dag_get_node,
svn_fs_x__dag_set_entry,
svn_fs_x__dag_remove_node,
svn_fs_x__dag_delete_if_mutable): Switch to internal ID type.
* subversion/libsvn_fs_x/dag.c
(svn_fs_x__dag_get_node): Same, simplifying implementation.
(dir_entry_id_from_node): The internal ID type has a different "unused"
representation.
(set_entry): Update pass-through parameter type.
(make_entry): Simplify caller using the noderev-ID provided in the noderev.
(svn_fs_x__dag_set_entry): Update pass-through parameter type.
(svn_fs_x__dag_txn_root,
svn_fs_x__dag_txn_base_root): Convert IDs in function call.
(svn_fs_x__dag_clone_child): Switch logic to internal ID type.
(svn_fs_x__dag_clone_root): Convert IDs in function call.
(svn_fs_x__dag_delete): Update & simplify caller.
(svn_fs_x__dag_remove_node): Update pass-through parameter type.
(svn_fs_x__dag_delete_if_mutable): Same. Plus, update recursive call.
(svn_fs_x__dag_open,
svn_fs_x__dag_copy): Update callers.
* subversion/libsvn_fs_x/tree.c
(node_kind): Convert ID type in function call.
(compare_dir_structure,
merge): Use appropriate ID comparison functions and update DAG calls.
(x_dir_entries): Convert from internal to FS API ID type.
(history_prev): Convert ID type in function call.
(crawl_directory_dag_for_mergeinfo): Call appropriate function.
(verify_node): Same. Plus, update DAG function calls.
Modified:
subversion/branches/fsx-id/subversion/libsvn_fs_x/cached_data.c
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/fs.h
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/cached_data.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsx-id/subversion/libsvn_fs_x/cached_data.c?rev=1647744&r1=1647743&r2=1647744&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/cached_data.c (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/cached_data.c Wed Dec 24 08:18:56 2014
@@ -2505,7 +2505,7 @@ read_dir_entries(apr_array_header_t *ent
_("Directory entry corrupt in '%s'"),
svn_fs_x__id_part_unparse(id, scratch_pool)->data);
- SVN_ERR(svn_fs_x__id_parse(&dirent->id, str, result_pool));
+ SVN_ERR(svn_fs_x__id_part_parse(&dirent->id, str));
/* In incremental mode, update the hash; otherwise, write to the
* final array. */
@@ -2702,10 +2702,8 @@ svn_fs_x__rep_contents_dir_entry(dirent_
entry = svn_fs_x__find_dir_entry(entries, name, NULL);
if (entry)
{
- entry_copy = apr_palloc(result_pool, sizeof(*entry_copy));
+ entry_copy = apr_pmemdup(result_pool, entry, sizeof(*entry_copy));
entry_copy->name = apr_pstrdup(result_pool, entry->name);
- entry_copy->id = svn_fs_x__id_copy(entry->id, result_pool);
- entry_copy->kind = entry->kind;
}
*dirent = entry_copy;
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=1647744&r1=1647743&r2=1647744&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/dag.c (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/dag.c Wed Dec 24 08:18:56 2014
@@ -247,7 +247,7 @@ svn_boolean_t svn_fs_x__dag_check_mutabl
svn_error_t *
svn_fs_x__dag_get_node(dag_node_t **node,
svn_fs_t *fs,
- const svn_fs_id_t *id,
+ const svn_fs_x__noderev_id_t *id,
apr_pool_t *pool)
{
dag_node_t *new_node;
@@ -256,7 +256,7 @@ svn_fs_x__dag_get_node(dag_node_t **node
/* Construct the node. */
new_node = apr_pcalloc(pool, sizeof(*new_node));
new_node->fs = fs;
- new_node->id = *svn_fs_x__id_noderev_id(id);
+ new_node->id = *id;
/* Grab the contents so we can inspect the node's kind and created path. */
new_node->node_pool = pool;
@@ -368,11 +368,10 @@ svn_fs_x__dag_has_descendants_with_merge
/* Some of these are helpers for functions outside this section. */
-/* Set *ID_P to the node-id for entry NAME in PARENT. If no such
- entry, set *ID_P to NULL but do not error. The node-id is
- allocated in POOL. */
+/* Set *ID_P to the noderev-id for entry NAME in PARENT. If no such
+ entry, set *ID_P to NULL but do not error. */
static svn_error_t *
-dir_entry_id_from_node(const svn_fs_id_t **id_p,
+dir_entry_id_from_node(svn_fs_x__noderev_id_t *id_p,
dag_node_t *parent,
const char *name,
apr_pool_t *result_pool,
@@ -382,7 +381,10 @@ dir_entry_id_from_node(const svn_fs_id_t
SVN_ERR(svn_fs_x__dag_dir_entry(&dirent, parent, name, result_pool,
scratch_pool));
- *id_p = dirent ? dirent->id : NULL;
+ if (dirent)
+ *id_p = dirent->id;
+ else
+ svn_fs_x__id_part_reset(id_p);
return SVN_NO_ERROR;
}
@@ -399,7 +401,7 @@ dir_entry_id_from_node(const svn_fs_id_t
static svn_error_t *
set_entry(dag_node_t *parent,
const char *name,
- const svn_fs_id_t *id,
+ const svn_fs_x__noderev_id_t *id,
svn_node_kind_t kind,
svn_fs_x__txn_id_t txn_id,
apr_pool_t *pool)
@@ -431,7 +433,6 @@ make_entry(dag_node_t **child_p,
svn_fs_x__txn_id_t txn_id,
apr_pool_t *pool)
{
- const svn_fs_id_t *new_node_id;
node_revision_t new_noderev, *parent_noderev;
/* Make sure that NAME is a single path component. */
@@ -466,17 +467,17 @@ make_entry(dag_node_t **child_p,
svn_fs_x__id_part_reset(&new_noderev.predecessor_id);
SVN_ERR(svn_fs_x__create_node
- (&new_node_id, svn_fs_x__dag_get_fs(parent), &new_noderev,
+ (svn_fs_x__dag_get_fs(parent), &new_noderev,
&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),
- new_node_id, pool));
+ &new_noderev.noderev_id, pool));
/* We can safely call set_entry because we already know that
PARENT is mutable, and we just created CHILD, so we know it has
no ancestors (therefore, PARENT cannot be an ancestor of CHILD) */
- return set_entry(parent, name, new_node_id,
+ return set_entry(parent, name, &new_noderev.noderev_id,
new_noderev.kind, txn_id, pool);
}
@@ -520,7 +521,7 @@ svn_fs_x__dag_dir_entry(dirent_t **diren
svn_error_t *
svn_fs_x__dag_set_entry(dag_node_t *node,
const char *entry_name,
- const svn_fs_id_t *id,
+ const svn_fs_x__noderev_id_t *id,
svn_node_kind_t kind,
svn_fs_x__txn_id_t txn_id,
apr_pool_t *pool)
@@ -703,7 +704,8 @@ svn_fs_x__dag_txn_root(dag_node_t **node
const svn_fs_id_t *root_id, *ignored;
SVN_ERR(svn_fs_x__get_txn_ids(&root_id, &ignored, fs, txn_id, pool));
- return svn_fs_x__dag_get_node(node_p, fs, root_id, pool);
+ return svn_fs_x__dag_get_node(node_p, fs,
+ svn_fs_x__id_noderev_id(root_id), pool);
}
@@ -716,7 +718,8 @@ svn_fs_x__dag_txn_base_root(dag_node_t *
const svn_fs_id_t *base_root_id, *ignored;
SVN_ERR(svn_fs_x__get_txn_ids(&ignored, &base_root_id, fs, txn_id, pool));
- return svn_fs_x__dag_get_node(node_p, fs, base_root_id, pool);
+ return svn_fs_x__dag_get_node(node_p, fs,
+ svn_fs_x__id_noderev_id(base_root_id), pool);
}
@@ -731,7 +734,7 @@ svn_fs_x__dag_clone_child(dag_node_t **c
apr_pool_t *pool)
{
dag_node_t *cur_entry; /* parent's current entry named NAME */
- const svn_fs_id_t *new_node_id; /* node id we'll put into NEW_NODE */
+ const svn_fs_x__noderev_id_t *new_node_id; /* node id we'll put into NEW_NODE */
svn_fs_t *fs = svn_fs_x__dag_get_fs(parent);
apr_pool_t *subpool = svn_pool_create(pool);
@@ -759,7 +762,7 @@ svn_fs_x__dag_clone_child(dag_node_t **c
if (svn_fs_x__dag_check_mutable(cur_entry))
{
/* This has already been cloned */
- SVN_ERR(svn_fs_x__dag_get_fs_id(&new_node_id, cur_entry, pool));
+ new_node_id = svn_fs_x__dag_get_id(cur_entry);
}
else
{
@@ -787,8 +790,8 @@ svn_fs_x__dag_clone_child(dag_node_t **c
if (copy_id == NULL)
copy_id = &noderev->copy_id;
- SVN_ERR(svn_fs_x__create_successor(&new_node_id, fs,
- noderev, copy_id, txn_id, pool));
+ SVN_ERR(svn_fs_x__create_successor(fs, noderev, copy_id, txn_id, pool));
+ new_node_id = &noderev->noderev_id;
/* Replace the ID in the parent's ENTRY list with the ID which
refers to the mutable clone of this child. */
@@ -826,7 +829,8 @@ svn_fs_x__dag_clone_root(dag_node_t **ro
*/
/* One way or another, root_id now identifies a cloned root node. */
- return svn_fs_x__dag_get_node(root_p, fs, root_id, pool);
+ return svn_fs_x__dag_get_node(root_p, fs, svn_fs_x__id_noderev_id(root_id),
+ pool);
}
@@ -839,7 +843,6 @@ svn_fs_x__dag_delete(dag_node_t *parent,
node_revision_t *parent_noderev;
svn_fs_t *fs = parent->fs;
dirent_t *dirent;
- svn_fs_id_t *id;
apr_pool_t *subpool;
/* Make sure parent is a directory. */
@@ -877,13 +880,9 @@ svn_fs_x__dag_delete(dag_node_t *parent,
(SVN_ERR_FS_NO_SUCH_ENTRY, NULL,
"Delete failed--directory has no entry '%s'", name);
- /* Copy the ID out of the subpool and release the rest of the
- directory listing. */
- id = svn_fs_x__id_copy(dirent->id, pool);
- svn_pool_destroy(subpool);
-
/* If mutable, remove it and any mutable children from db. */
- SVN_ERR(svn_fs_x__dag_delete_if_mutable(parent->fs, id, pool));
+ SVN_ERR(svn_fs_x__dag_delete_if_mutable(parent->fs, &dirent->id, pool));
+ svn_pool_destroy(subpool);
/* Remove this entry from its parent's entries list. */
return svn_fs_x__set_entry(parent->fs, txn_id, parent_noderev, name,
@@ -893,7 +892,7 @@ svn_fs_x__dag_delete(dag_node_t *parent,
svn_error_t *
svn_fs_x__dag_remove_node(svn_fs_t *fs,
- const svn_fs_id_t *id,
+ const svn_fs_x__noderev_id_t *id,
apr_pool_t *pool)
{
dag_node_t *node;
@@ -913,7 +912,7 @@ svn_fs_x__dag_remove_node(svn_fs_t *fs,
svn_error_t *
svn_fs_x__dag_delete_if_mutable(svn_fs_t *fs,
- const svn_fs_id_t *id,
+ const svn_fs_x__noderev_id_t *id,
apr_pool_t *pool)
{
dag_node_t *node;
@@ -935,9 +934,11 @@ svn_fs_x__dag_delete_if_mutable(svn_fs_t
SVN_ERR(svn_fs_x__dag_dir_entries(&entries, node, pool));
if (entries)
for (i = 0; i < entries->nelts; ++i)
- SVN_ERR(svn_fs_x__dag_delete_if_mutable(fs,
- APR_ARRAY_IDX(entries, i, dirent_t *)->id,
- pool));
+ {
+ const svn_fs_x__noderev_id_t *noderev_id
+ = &APR_ARRAY_IDX(entries, i, dirent_t *)->id;
+ SVN_ERR(svn_fs_x__dag_delete_if_mutable(fs, noderev_id, pool));
+ }
}
/* ... then delete the node itself, after deleting any mutable
@@ -1225,12 +1226,12 @@ svn_fs_x__dag_open(dag_node_t **child_p,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
- const svn_fs_id_t *node_id;
+ svn_fs_x__noderev_id_t node_id;
/* Ensure that NAME exists in PARENT's entry list. */
SVN_ERR(dir_entry_id_from_node(&node_id, parent, name,
scratch_pool, scratch_pool));
- if (! node_id)
+ if (! svn_fs_x__id_part_used(&node_id))
{
*child_p = NULL;
return SVN_NO_ERROR;
@@ -1244,7 +1245,7 @@ svn_fs_x__dag_open(dag_node_t **child_p,
/* Now get the node that was requested. */
return svn_fs_x__dag_get_node(child_p, svn_fs_x__dag_get_fs(parent),
- node_id, result_pool);
+ &node_id, result_pool);
}
@@ -1258,7 +1259,7 @@ svn_fs_x__dag_copy(dag_node_t *to_node,
svn_fs_x__txn_id_t txn_id,
apr_pool_t *pool)
{
- const svn_fs_id_t *id;
+ const svn_fs_x__noderev_id_t *id;
if (preserve_history)
{
@@ -1287,13 +1288,13 @@ svn_fs_x__dag_copy(dag_node_t *to_node,
/* Set the copyroot equal to our own id. */
to_noderev->copyroot_path = NULL;
- SVN_ERR(svn_fs_x__create_successor(&id, fs, to_noderev,
+ SVN_ERR(svn_fs_x__create_successor(fs, to_noderev,
©_id, txn_id, pool));
-
+ id = &to_noderev->noderev_id;
}
else /* don't preserve history */
{
- SVN_ERR(svn_fs_x__dag_get_fs_id(&id, from_node, pool));
+ id = svn_fs_x__dag_get_id(from_node);
}
/* Set the entry in to_node to the new id. */
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=1647744&r1=1647743&r2=1647744&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/dag.h (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/dag.h Wed Dec 24 08:18:56 2014
@@ -69,7 +69,7 @@ typedef struct dag_node_t dag_node_t;
svn_error_t *
svn_fs_x__dag_get_node(dag_node_t **node,
svn_fs_t *fs,
- const svn_fs_id_t *id,
+ const svn_fs_x__noderev_id_t *id,
apr_pool_t *pool);
@@ -327,7 +327,7 @@ svn_error_t * svn_fs_x__dag_dir_entry(di
*/
svn_error_t *svn_fs_x__dag_set_entry(dag_node_t *node,
const char *entry_name,
- const svn_fs_id_t *id,
+ const svn_fs_x__noderev_id_t *id,
svn_node_kind_t kind,
svn_fs_x__txn_id_t txn_id,
apr_pool_t *pool);
@@ -390,7 +390,7 @@ svn_error_t *svn_fs_x__dag_delete(dag_no
dangling, disconnected from all DAG trees. It is assumed that
callers of this interface know what in the world they are doing. */
svn_error_t *svn_fs_x__dag_remove_node(svn_fs_t *fs,
- const svn_fs_id_t *id,
+ const svn_fs_x__noderev_id_t *id,
apr_pool_t *pool);
@@ -400,7 +400,7 @@ svn_error_t *svn_fs_x__dag_remove_node(s
node revision. ID may refer to a file or directory, which may be
mutable or immutable. */
svn_error_t *svn_fs_x__dag_delete_if_mutable(svn_fs_t *fs,
- const svn_fs_id_t *id,
+ const svn_fs_x__noderev_id_t *id,
apr_pool_t *pool);
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=1647744&r1=1647743&r2=1647744&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/fs.h (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/fs.h Wed Dec 24 08:18:56 2014
@@ -540,7 +540,7 @@ typedef struct dirent_t
const char *name;
/** The node revision ID it names. */
- const svn_fs_id_t *id;
+ svn_fs_x__noderev_id_t id;
/** The node kind. */
svn_node_kind_t kind;
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=1647744&r1=1647743&r2=1647744&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 Wed Dec 24 08:18:56 2014
@@ -226,7 +226,6 @@ serialize_dir_entry(svn_temp_serializer_
(const void * const *)entry_p,
sizeof(dirent_t));
- svn_fs_x__id_serialize(context, &entry->id);
svn_temp_serializer__add_string(context, &entry->name);
*length = (apr_uint32_t)( svn_temp_serializer__get_length(context)
@@ -314,7 +313,6 @@ deserialize_dir(void *buffer, dir_data_t
/* pointer fixup */
svn_temp_deserializer__resolve(entry, (void **)&entry->name);
- svn_fs_x__id_deserialize(entry, (svn_fs_id_t **)&entry->id, pool);
/* add the entry to the hash */
APR_ARRAY_PUSH(result, dirent_t *) = entry;
@@ -878,8 +876,6 @@ svn_fs_x__extract_dir_entry(void **out,
memcpy(new_entry, source, size);
svn_temp_deserializer__resolve(new_entry, (void **)&new_entry->name);
- svn_fs_x__id_deserialize(new_entry, (svn_fs_id_t **)&new_entry->id,
- pool);
*(dirent_t **)out = new_entry;
}
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=1647744&r1=1647743&r2=1647744&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.c (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.c Wed Dec 24 08:18:56 2014
@@ -825,7 +825,7 @@ unparse_dir_entry(dirent_t *dirent,
= apr_psprintf(pool, "%s %s",
(dirent->kind == svn_node_file) ? SVN_FS_X__KIND_FILE
: SVN_FS_X__KIND_DIR,
- svn_fs_x__id_unparse(dirent->id, pool)->data);
+ svn_fs_x__id_part_unparse(&dirent->id, pool)->data);
SVN_ERR(svn_stream_printf(stream, pool, "K %" APR_SIZE_T_FMT "\n%s\n"
"V %" APR_SIZE_T_FMT "\n%s\n",
@@ -1622,8 +1622,7 @@ svn_fs_x__reserve_copy_id(svn_fs_x__id_p
}
svn_error_t *
-svn_fs_x__create_node(const svn_fs_id_t **id_p,
- svn_fs_t *fs,
+svn_fs_x__create_node(svn_fs_t *fs,
node_revision_t *noderev,
const svn_fs_x__id_part_t *copy_id,
svn_fs_x__txn_id_t txn_id,
@@ -1640,9 +1639,6 @@ svn_fs_x__create_node(const svn_fs_id_t
SVN_ERR(allocate_item_index(&noderev->noderev_id.number, fs, txn_id,
pool));
- /* Construct the ID object from all the above parts. */
- *id_p = svn_fs_x__id_create(&noderev->node_id, &noderev->noderev_id, pool);
-
SVN_ERR(svn_fs_x__put_node_revision(fs, noderev, FALSE, pool));
return SVN_NO_ERROR;
@@ -1696,7 +1692,7 @@ svn_fs_x__set_entry(svn_fs_t *fs,
svn_fs_x__txn_id_t txn_id,
node_revision_t *parent_noderev,
const char *name,
- const svn_fs_id_t *id,
+ const svn_fs_x__noderev_id_t *id,
svn_node_kind_t kind,
apr_pool_t *pool)
{
@@ -1753,7 +1749,7 @@ svn_fs_x__set_entry(svn_fs_t *fs,
baton.new_entry = apr_pcalloc(subpool, sizeof(*baton.new_entry));
baton.new_entry->name = name;
baton.new_entry->kind = kind;
- baton.new_entry->id = id;
+ baton.new_entry->id = *id;
}
/* actually update the cached directory (if cached) */
@@ -1768,7 +1764,7 @@ svn_fs_x__set_entry(svn_fs_t *fs,
{
dirent_t entry;
entry.name = name;
- entry.id = id;
+ entry.id = *id;
entry.kind = kind;
SVN_ERR(unparse_dir_entry(&entry, out, subpool));
@@ -2447,8 +2443,7 @@ svn_fs_x__set_contents(svn_stream_t **st
}
svn_error_t *
-svn_fs_x__create_successor(const svn_fs_id_t **new_id_p,
- svn_fs_t *fs,
+svn_fs_x__create_successor(svn_fs_t *fs,
node_revision_t *new_noderev,
const svn_fs_x__id_part_t *copy_id,
svn_fs_x__txn_id_t txn_id,
@@ -2459,8 +2454,6 @@ svn_fs_x__create_successor(const svn_fs_
SVN_ERR(allocate_item_index(&new_noderev->noderev_id.number, fs, txn_id,
pool));
- *new_id_p = svn_fs_x__id_create(&new_noderev->node_id,
- &new_noderev->noderev_id, pool);
if (! new_noderev->copyroot_path)
{
new_noderev->copyroot_path
@@ -2824,7 +2817,7 @@ write_final_rev(const svn_fs_id_t **new_
apr_file_t *file,
svn_revnum_t rev,
svn_fs_t *fs,
- const svn_fs_id_t *id,
+ const svn_fs_x__noderev_id_t *id,
apr_off_t initial_offset,
apr_array_header_t *reps_to_cache,
apr_hash_t *reps_hash,
@@ -2837,7 +2830,7 @@ write_final_rev(const svn_fs_id_t **new_
const svn_fs_id_t *new_id;
svn_fs_x__id_part_t noderev_id;
fs_x_data_t *ffd = fs->fsap_data;
- svn_fs_x__txn_id_t txn_id = svn_fs_x__id_txn_id(id);
+ svn_fs_x__txn_id_t txn_id = svn_fs_x__get_txn_id(id->change_set);
svn_fs_x__p2l_entry_t entry;
svn_fs_x__change_set_t change_set = svn_fs_x__change_set_by_rev(rev);
svn_stream_t *file_stream;
@@ -2846,13 +2839,11 @@ write_final_rev(const svn_fs_id_t **new_
*new_id_p = NULL;
/* Check to see if this is a transaction node. */
- if (! svn_fs_x__id_is_txn(id))
+ if (txn_id == SVN_FS_X__INVALID_TXN_ID)
return SVN_NO_ERROR;
subpool = svn_pool_create(pool);
- SVN_ERR(svn_fs_x__get_node_revision(&noderev, fs,
- svn_fs_x__id_noderev_id(id),
- pool, subpool));
+ SVN_ERR(svn_fs_x__get_node_revision(&noderev, fs, id, pool, subpool));
if (noderev->kind == svn_node_dir)
{
@@ -2868,11 +2859,11 @@ write_final_rev(const svn_fs_id_t **new_
dirent_t *dirent = APR_ARRAY_IDX(entries, i, dirent_t *);
svn_pool_clear(subpool);
- SVN_ERR(write_final_rev(&new_id, file, rev, fs, dirent->id,
+ SVN_ERR(write_final_rev(&new_id, file, rev, fs, &dirent->id,
initial_offset, reps_to_cache, reps_hash,
reps_pool, FALSE, subpool));
if (new_id && (svn_fs_x__id_rev(new_id) == rev))
- dirent->id = svn_fs_x__id_copy(new_id, pool);
+ dirent->id = *svn_fs_x__id_noderev_id(new_id);
}
if (noderev->data_rep
@@ -3346,7 +3337,8 @@ commit_body(void *baton, apr_pool_t *poo
/* Write out all the node-revisions and directory contents. */
root_id = svn_fs_x__id_txn_create_root(txn_id, pool);
- SVN_ERR(write_final_rev(&new_root_id, proto_file, new_rev, cb->fs, root_id,
+ SVN_ERR(write_final_rev(&new_root_id, proto_file, new_rev, cb->fs,
+ svn_fs_x__id_noderev_id(root_id),
initial_offset, cb->reps_to_cache, cb->reps_hash,
cb->reps_pool, TRUE, pool));
@@ -3619,19 +3611,16 @@ svn_fs_x__txn_proplist(apr_hash_t **tabl
svn_error_t *
svn_fs_x__delete_node_revision(svn_fs_t *fs,
- const svn_fs_id_t *id,
+ const svn_fs_x__noderev_id_t *id,
apr_pool_t *pool)
{
node_revision_t *noderev;
- const svn_fs_x__noderev_id_t *noderev_id = svn_fs_x__id_noderev_id(id);
-
- SVN_ERR(svn_fs_x__get_node_revision(&noderev, fs, noderev_id, pool, pool));
+ SVN_ERR(svn_fs_x__get_node_revision(&noderev, fs, id, pool, pool));
/* Delete any mutable property representation. */
if (noderev->prop_rep
&& svn_fs_x__is_txn(noderev->prop_rep->id.change_set))
- SVN_ERR(svn_io_remove_file2(svn_fs_x__path_txn_node_props(fs, noderev_id,
- pool),
+ SVN_ERR(svn_io_remove_file2(svn_fs_x__path_txn_node_props(fs, id, pool),
FALSE, pool));
/* Delete any mutable data representation. */
@@ -3640,10 +3629,9 @@ svn_fs_x__delete_node_revision(svn_fs_t
&& noderev->kind == svn_node_dir)
{
fs_x_data_t *ffd = fs->fsap_data;
- const svn_fs_x__id_part_t *key = svn_fs_x__id_noderev_id(id);
+ const svn_fs_x__id_part_t *key = id;
- SVN_ERR(svn_io_remove_file2(svn_fs_x__path_txn_node_children(fs,
- noderev_id,
+ SVN_ERR(svn_io_remove_file2(svn_fs_x__path_txn_node_children(fs, id,
pool),
FALSE, pool));
@@ -3651,8 +3639,7 @@ svn_fs_x__delete_node_revision(svn_fs_t
SVN_ERR(svn_cache__set(ffd->dir_cache, key, NULL, pool));
}
- return svn_io_remove_file2(svn_fs_x__path_txn_node_rev(fs, noderev_id,
- pool),
+ return svn_io_remove_file2(svn_fs_x__path_txn_node_rev(fs, id, pool),
FALSE, pool);
}
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=1647744&r1=1647743&r2=1647744&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.h (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.h Wed Dec 24 08:18:56 2014
@@ -140,13 +140,11 @@ svn_fs_x__reserve_copy_id(svn_fs_x__id_p
apr_pool_t *pool);
/* Create an entirely new mutable node in the filesystem FS, whose
- node-revision is NODEREV. Set *ID_P to the new node revision's ID.
- Use POOL for any temporary allocation. COPY_ID is the copy_id to
- use in the node revision ID. TXN_ID is the Subversion transaction
- under which this occurs. */
+ node-revision is NODEREV. COPY_ID is the copy_id to use in the
+ node revision ID. TXN_ID is the Subversion transaction under
+ which this occurs. */
svn_error_t *
-svn_fs_x__create_node(const svn_fs_id_t **id_p,
- svn_fs_t *fs,
+svn_fs_x__create_node(svn_fs_t *fs,
node_revision_t *noderev,
const svn_fs_x__id_part_t *copy_id,
svn_fs_x__txn_id_t txn_id,
@@ -173,7 +171,7 @@ svn_fs_x__set_entry(svn_fs_t *fs,
svn_fs_x__txn_id_t txn_id,
node_revision_t *parent_noderev,
const char *name,
- const svn_fs_id_t *id,
+ const svn_fs_x__noderev_id_t *id,
svn_node_kind_t kind,
apr_pool_t *pool);
@@ -209,8 +207,7 @@ svn_fs_x__set_contents(svn_stream_t **st
apr_pool_t *pool);
/* Create a node revision in FS which is an immediate successor of
- NEW_NODEREV's predecessor. Set *NEW_ID_P to the new node
- revision's ID. Use POOL for any temporary allocation.
+ NEW_NODEREV's predecessor. Use POOL for any temporary allocation.
COPY_ID, is a key into the `copies' table, and
indicates that this new node is being created as the result of a
@@ -222,8 +219,7 @@ svn_fs_x__set_contents(svn_stream_t **st
contents will change frequently, and will avoid representing other
nodes as deltas against this node's contents. */
svn_error_t *
-svn_fs_x__create_successor(const svn_fs_id_t **new_id_p,
- svn_fs_t *fs,
+svn_fs_x__create_successor(svn_fs_t *fs,
node_revision_t *new_noderev,
const svn_fs_x__id_part_t *copy_id,
svn_fs_x__txn_id_t txn_id,
@@ -288,7 +284,7 @@ svn_fs_x__txn_proplist(apr_hash_t **tabl
temporary allocations in POOL. */
svn_error_t *
svn_fs_x__delete_node_revision(svn_fs_t *fs,
- const svn_fs_id_t *id,
+ const svn_fs_x__noderev_id_t *id,
apr_pool_t *pool);
/* Retrieve information about the Subversion transaction SVN_TXN from
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=1647744&r1=1647743&r2=1647744&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/tree.c (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/tree.c Wed Dec 24 08:18:56 2014
@@ -1534,7 +1534,8 @@ node_kind(svn_node_kind_t *kind_p,
SVN_ERR(svn_fs_x__node_id(&node_id, root, path, pool));
/* Use the node id to get the real kind. */
- SVN_ERR(svn_fs_x__dag_get_node(&node, root->fs, node_id, pool));
+ SVN_ERR(svn_fs_x__dag_get_node(&node, root->fs,
+ svn_fs_x__id_noderev_id(node_id), pool));
*kind_p = svn_fs_x__dag_node_kind(node);
return SVN_NO_ERROR;
@@ -1782,16 +1783,16 @@ compare_dir_structure(svn_boolean_t *cha
dag_node_t *lhs_node, *rhs_node;
/* Unchanged entry? */
- if (!svn_fs_x__id_eq(lhs_entry->id, rhs_entry->id))
+ if (!svn_fs_x__id_part_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,
+ 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,
+ 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));
@@ -2029,35 +2030,35 @@ merge(svn_stringbuf_t *conflict_p,
/* No changes were made to this entry while the transaction was
in progress, so do nothing to the target. */
- if (s_entry && svn_fs_x__id_eq(a_entry->id, s_entry->id))
+ if (s_entry && svn_fs_x__id_part_eq(&a_entry->id, &s_entry->id))
continue;
/* A change was made to this entry while the transaction was in
process, but the transaction did not touch this entry. */
- else if (t_entry && svn_fs_x__id_eq(a_entry->id, t_entry->id))
+ else if (t_entry && svn_fs_x__id_part_eq(&a_entry->id, &t_entry->id))
{
apr_int64_t mergeinfo_start;
apr_int64_t mergeinfo_end;
dag_node_t *t_ent_node;
- SVN_ERR(svn_fs_x__dag_get_node(&t_ent_node, fs,
- t_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_mergeinfo_count(&mergeinfo_start,
- t_ent_node));
+ t_ent_node));
mergeinfo_increment -= mergeinfo_start;
if (s_entry)
{
dag_node_t *s_ent_node;
- SVN_ERR(svn_fs_x__dag_get_node(&s_ent_node, fs,
- s_entry->id, iterpool));
+ SVN_ERR(svn_fs_x__dag_get_node(&s_ent_node, fs, &s_entry->id,
+ iterpool));
SVN_ERR(svn_fs_x__dag_get_mergeinfo_count(&mergeinfo_end,
s_ent_node));
mergeinfo_increment += mergeinfo_end;
SVN_ERR(svn_fs_x__dag_set_entry(target, a_entry->name,
- s_entry->id,
+ &s_entry->id,
s_entry->kind,
txn_id,
iterpool));
@@ -2098,12 +2099,12 @@ merge(svn_stringbuf_t *conflict_p,
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));
+ 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. */
@@ -2154,13 +2155,13 @@ merge(svn_stringbuf_t *conflict_p,
t_entry->name,
iterpool));
- SVN_ERR(svn_fs_x__dag_get_node(&s_ent_node, fs,
- s_entry->id, iterpool));
+ SVN_ERR(svn_fs_x__dag_get_node(&s_ent_node, fs, &s_entry->id,
+ iterpool));
SVN_ERR(svn_fs_x__dag_get_mergeinfo_count(&mergeinfo_s, s_ent_node));
mergeinfo_increment += mergeinfo_s;
SVN_ERR(svn_fs_x__dag_set_entry
- (target, s_entry->name, s_entry->id, s_entry->kind,
+ (target, s_entry->name, &s_entry->id, s_entry->kind,
txn_id, iterpool));
}
svn_pool_destroy(iterpool);
@@ -2472,7 +2473,9 @@ x_dir_entries(apr_hash_t **table_p,
svn_fs_dirent_t *api_dirent = apr_pcalloc(pool, sizeof(*api_dirent));
api_dirent->name = entry->name;
api_dirent->kind = entry->kind;
- api_dirent->id = svn_fs_x__id_copy(entry->id, pool);
+
+ SVN_ERR(svn_fs_x__dag_get_node(&node, root->fs, &entry->id, pool));
+ SVN_ERR(svn_fs_x__dag_get_fs_id(&api_dirent->id, node, pool));
svn_hash_sets(hash, api_dirent->name, api_dirent);
}
@@ -3577,7 +3580,9 @@ history_prev(svn_fs_history_t **prev_his
/* Replace NODE and friends with the information from its
predecessor. */
- SVN_ERR(svn_fs_x__dag_get_node(&node, fs, pred_id, scratch_pool));
+ SVN_ERR(svn_fs_x__dag_get_node(&node, fs,
+ svn_fs_x__id_noderev_id(pred_id),
+ scratch_pool));
commit_path = svn_fs_x__dag_get_created_path(node);
commit_rev = svn_fs_x__dag_get_revision(node);
}
@@ -3808,7 +3813,8 @@ crawl_directory_dag_for_mergeinfo(svn_fs
mergeinfo_string = svn_hash_gets(proplist, SVN_PROP_MERGEINFO);
if (!mergeinfo_string)
{
- svn_string_t *idstr = svn_fs_x__id_unparse(dirent->id, iterpool);
+ svn_string_t *idstr
+ = svn_fs_x__id_part_unparse(&dirent->id, iterpool);
return svn_error_createf
(SVN_ERR_FS_CORRUPT, NULL,
_("Node-revision #'%s' claims to have mergeinfo but doesn't"),
@@ -4298,7 +4304,9 @@ verify_node(dag_node_t *node,
{
dag_node_t *pred;
int pred_pred_count;
- SVN_ERR(svn_fs_x__dag_get_node(&pred, fs, pred_id, iterpool));
+ SVN_ERR(svn_fs_x__dag_get_node(&pred, fs,
+ svn_fs_x__id_noderev_id(pred_id),
+ iterpool));
SVN_ERR(svn_fs_x__dag_get_predecessor_count(&pred_pred_count, pred));
if (pred_pred_count+1 != pred_count)
return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
@@ -4344,9 +4352,9 @@ verify_node(dag_node_t *node,
svn_pool_clear(iterpool);
/* Compute CHILD_REV. */
- if (svn_fs_x__id_rev(dirent->id) == rev)
+ if (svn_fs_x__get_revnum(dirent->id.change_set) == rev)
{
- SVN_ERR(svn_fs_x__dag_get_node(&child, fs, dirent->id,
+ SVN_ERR(svn_fs_x__dag_get_node(&child, fs, &dirent->id,
iterpool));
SVN_ERR(verify_node(child, rev, parent_nodes, iterpool));
SVN_ERR(svn_fs_x__dag_get_mergeinfo_count(&child_mergeinfo,
@@ -4354,11 +4362,8 @@ verify_node(dag_node_t *node,
}
else
{
- const svn_fs_x__noderev_id_t *noderev_id
- = svn_fs_x__id_noderev_id(dirent->id);
-
SVN_ERR(svn_fs_x__get_mergeinfo_count(&child_mergeinfo, fs,
- noderev_id, iterpool));
+ &dirent->id, iterpool));
}
children_mergeinfo += child_mergeinfo;