You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by cm...@apache.org on 2011/05/27 04:14:22 UTC
svn commit: r1128138 - /subversion/trunk/subversion/svnrdump/load_editor.c
Author: cmpilato
Date: Fri May 27 02:14:22 2011
New Revision: 1128138
URL: http://svn.apache.org/viewvc?rev=1128138&view=rev
Log:
More work on issue #3890 ("'svnrdump load' does not map revisions like
'svnadmin load' does"). This work just makes reading the code easier.
* subversion/svnrdump/load_editor.c
(set_revision_mapping): Was add_revision_mapping(). Callers updated.
(get_revision_mapping): New helper function.
(renumber_mergeinfo_revs, new_node_record, close_revision): Now use
get_revision_mapping() instead of peeking directly into the hash.
Modified:
subversion/trunk/subversion/svnrdump/load_editor.c
Modified: subversion/trunk/subversion/svnrdump/load_editor.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/svnrdump/load_editor.c?rev=1128138&r1=1128137&r2=1128138&view=diff
==============================================================================
--- subversion/trunk/subversion/svnrdump/load_editor.c (original)
+++ subversion/trunk/subversion/svnrdump/load_editor.c Fri May 27 02:14:22 2011
@@ -142,7 +142,7 @@ struct revision_baton
/* Record the mapping of FROM_REV to TO_REV in REV_MAP, ensuring that
anything added to the hash is allocated in the hash's pool. */
static void
-add_revision_mapping(apr_hash_t *rev_map,
+set_revision_mapping(apr_hash_t *rev_map,
svn_revnum_t from_rev,
svn_revnum_t to_rev)
{
@@ -154,6 +154,17 @@ add_revision_mapping(apr_hash_t *rev_map
sizeof(svn_revnum_t), mapped_revs + 1);
}
+/* Return the revision to which FROM_REV maps in REV_MAP, or
+ SVN_INVALID_REVNUM if no such mapping exists. */
+static svn_revnum_t
+get_revision_mapping(apr_hash_t *rev_map,
+ svn_revnum_t from_rev)
+{
+ svn_revnum_t *to_rev = apr_hash_get(rev_map, &from_rev,
+ sizeof(from_rev));
+ return to_rev ? *to_rev : SVN_INVALID_REVNUM;
+}
+
/* Prepend the mergeinfo source paths in MERGEINFO_ORIG with
PARENT_DIR, and return it in *MERGEINFO_VAL. */
@@ -215,16 +226,17 @@ renumber_mergeinfo_revs(svn_string_t **f
if (rb->pb->oldest_dumpstream_rev > 1)
{
SVN_ERR(svn_mergeinfo__filter_mergeinfo_by_ranges(
- &predates_stream_mergeinfo, mergeinfo,
- rb->pb->oldest_dumpstream_rev - 1, 0,
- TRUE, subpool, subpool));
+ &predates_stream_mergeinfo, mergeinfo,
+ rb->pb->oldest_dumpstream_rev - 1, 0,
+ TRUE, subpool, subpool));
SVN_ERR(svn_mergeinfo__filter_mergeinfo_by_ranges(
- &mergeinfo, mergeinfo,
- rb->pb->oldest_dumpstream_rev - 1, 0,
- FALSE, subpool, subpool));
+ &mergeinfo, mergeinfo,
+ rb->pb->oldest_dumpstream_rev - 1, 0,
+ FALSE, subpool, subpool));
SVN_ERR(svn_mergeinfo__adjust_mergeinfo_rangelists(
- &predates_stream_mergeinfo, predates_stream_mergeinfo,
- -rb->rev_offset, subpool, subpool));
+ &predates_stream_mergeinfo,
+ predates_stream_mergeinfo,
+ -rb->rev_offset, subpool, subpool));
}
else
{
@@ -246,14 +258,13 @@ renumber_mergeinfo_revs(svn_string_t **f
/* Possibly renumber revisions in merge source's rangelist. */
for (i = 0; i < rangelist->nelts; i++)
{
- svn_revnum_t *rev_from_map;
+ svn_revnum_t rev_from_map;
svn_merge_range_t *range = APR_ARRAY_IDX(rangelist, i,
svn_merge_range_t *);
- rev_from_map = apr_hash_get(pb->rev_map, &range->start,
- sizeof(svn_revnum_t));
- if (rev_from_map && SVN_IS_VALID_REVNUM(*rev_from_map))
+ rev_from_map = get_revision_mapping(pb->rev_map, range->start);
+ if (SVN_IS_VALID_REVNUM(rev_from_map))
{
- range->start = *rev_from_map;
+ range->start = rev_from_map;
}
else if (range->start == pb->oldest_dumpstream_rev - 1)
{
@@ -269,11 +280,10 @@ renumber_mergeinfo_revs(svn_string_t **f
If that is what we have here, then find the mapping for the
oldest rev from the load stream and subtract 1 to get the
renumbered, non-inclusive, start revision. */
- rev_from_map = apr_hash_get(pb->rev_map,
- &pb->oldest_dumpstream_rev,
- sizeof(svn_revnum_t));
- if (rev_from_map && SVN_IS_VALID_REVNUM(*rev_from_map))
- range->start = *rev_from_map - 1;
+ rev_from_map = get_revision_mapping(pb->rev_map,
+ pb->oldest_dumpstream_rev);
+ if (SVN_IS_VALID_REVNUM(rev_from_map))
+ range->start = rev_from_map - 1;
}
else
{
@@ -288,10 +298,9 @@ renumber_mergeinfo_revs(svn_string_t **f
continue;
}
- rev_from_map = apr_hash_get(pb->rev_map, &range->end,
- sizeof(svn_revnum_t));
- if (rev_from_map && SVN_IS_VALID_REVNUM(*rev_from_map))
- range->end = *rev_from_map;
+ rev_from_map = get_revision_mapping(pb->rev_map, range->end);
+ if (SVN_IS_VALID_REVNUM(rev_from_map))
+ range->end = rev_from_map;
}
apr_hash_set(final_mergeinfo, path, pathlen, rangelist);
}
@@ -333,7 +342,7 @@ commit_callback(const svn_commit_info_t
commit_info->revision));
/* Add the mapping of the dumpstream revision to the committed revision. */
- add_revision_mapping(pb->rev_map, rb->rev, commit_info->revision);
+ set_revision_mapping(pb->rev_map, rb->rev, commit_info->revision);
/* If the incoming dump stream has non-contiguous revisions (e.g. from
using svndumpfilter --drop-empty-revs without --renumber-revs) then
@@ -347,7 +356,7 @@ commit_callback(const svn_commit_info_t
for (i = pb->last_rev_mapped + 1; i < rb->rev; i++)
{
- add_revision_mapping(pb->rev_map, i, pb->last_rev_mapped);
+ set_revision_mapping(pb->rev_map, i, pb->last_rev_mapped);
}
}
@@ -611,18 +620,20 @@ new_node_record(void **node_baton,
URL. */
if (nb->copyfrom_path && SVN_IS_VALID_REVNUM(nb->copyfrom_rev))
{
- svn_revnum_t copyfrom_rev = nb->copyfrom_rev - rb->rev_offset;
- svn_revnum_t *src_rev_from_map;
+ svn_revnum_t copyfrom_rev;
- if ((src_rev_from_map = apr_hash_get(rb->pb->rev_map, &nb->copyfrom_rev,
- sizeof(nb->copyfrom_rev))))
- copyfrom_rev = *src_rev_from_map;
+ /* Try to find the copyfrom revision in the revision map;
+ failing that, fall back to the revision offset approach. */
+ copyfrom_rev = get_revision_mapping(rb->pb->rev_map, nb->copyfrom_rev);
+ if (! SVN_IS_VALID_REVNUM(copyfrom_rev))
+ copyfrom_rev = nb->copyfrom_rev - rb->rev_offset;
if (! SVN_IS_VALID_REVNUM(copyfrom_rev))
return svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, NULL,
_("Relative source revision %ld is not"
" available in current repository"),
copyfrom_rev);
+
nb->copyfrom_rev = copyfrom_rev;
if (rb->pb->parent_dir)
@@ -971,9 +982,7 @@ close_revision(void *baton)
a non-empty repository. */
if (rb->rev > 0)
{
- svn_revnum_t *rev_from_map =
- apr_hash_get(rb->pb->rev_map, &rb->rev, sizeof(rb->rev));
- committed_rev = *rev_from_map;
+ committed_rev = get_revision_mapping(rb->pb->rev_map, rb->rev);
}
else if (rb->rev_offset == -1)
{