diff options
Diffstat (limited to 'subversion/libsvn_repos')
| -rw-r--r-- | subversion/libsvn_repos/dump.c | 76 | ||||
| -rw-r--r-- | subversion/libsvn_repos/fs-wrap.c | 25 |
2 files changed, 68 insertions, 33 deletions
diff --git a/subversion/libsvn_repos/dump.c b/subversion/libsvn_repos/dump.c index 75843d7057ad..a64b1809c7a0 100644 --- a/subversion/libsvn_repos/dump.c +++ b/subversion/libsvn_repos/dump.c @@ -217,6 +217,49 @@ make_dir_baton(const char *path, } +/* If the mergeinfo in MERGEINFO_STR refers to any revisions older than + * OLDEST_DUMPED_REV, issue a warning and set *FOUND_OLD_MERGEINFO to TRUE, + * otherwise leave *FOUND_OLD_MERGEINFO unchanged. + */ +static svn_error_t * +verify_mergeinfo_revisions(svn_boolean_t *found_old_mergeinfo, + const char *mergeinfo_str, + svn_revnum_t oldest_dumped_rev, + svn_repos_notify_func_t notify_func, + void *notify_baton, + apr_pool_t *pool) +{ + svn_mergeinfo_t mergeinfo, old_mergeinfo; + + SVN_ERR(svn_mergeinfo_parse(&mergeinfo, mergeinfo_str, pool)); + SVN_ERR(svn_mergeinfo__filter_mergeinfo_by_ranges( + &old_mergeinfo, mergeinfo, + oldest_dumped_rev - 1, 0, + TRUE, pool, pool)); + + if (apr_hash_count(old_mergeinfo)) + { + svn_repos_notify_t *notify = + svn_repos_notify_create(svn_repos_notify_warning, pool); + + notify->warning = svn_repos_notify_warning_found_old_mergeinfo; + notify->warning_str = apr_psprintf( + pool, + _("Mergeinfo referencing revision(s) prior " + "to the oldest dumped revision (r%ld). " + "Loading this dump may result in invalid " + "mergeinfo."), + oldest_dumped_rev); + + if (found_old_mergeinfo) + *found_old_mergeinfo = TRUE; + notify_func(notify_baton, notify, pool); + } + + return SVN_NO_ERROR; +} + + /* This helper is the main "meat" of the editor -- it does all the work of writing a node record. @@ -475,32 +518,13 @@ dump_node(struct edit_baton *eb, SVN_PROP_MERGEINFO); if (mergeinfo_str) { - svn_mergeinfo_t mergeinfo, old_mergeinfo; - - SVN_ERR(svn_mergeinfo_parse(&mergeinfo, mergeinfo_str->data, - pool)); - SVN_ERR(svn_mergeinfo__filter_mergeinfo_by_ranges( - &old_mergeinfo, mergeinfo, - eb->oldest_dumped_rev - 1, 0, - TRUE, pool, pool)); - if (apr_hash_count(old_mergeinfo)) - { - svn_repos_notify_t *notify = - svn_repos_notify_create(svn_repos_notify_warning, pool); - - notify->warning = svn_repos_notify_warning_found_old_mergeinfo; - notify->warning_str = apr_psprintf( - pool, - _("Mergeinfo referencing revision(s) prior " - "to the oldest dumped revision (r%ld). " - "Loading this dump may result in invalid " - "mergeinfo."), - eb->oldest_dumped_rev); - - if (eb->found_old_mergeinfo) - *eb->found_old_mergeinfo = TRUE; - eb->notify_func(eb->notify_baton, notify, pool); - } + /* An error in verifying the mergeinfo must not prevent dumping + the data. Ignore any such error. */ + svn_error_clear(verify_mergeinfo_revisions( + eb->found_old_mergeinfo, + mergeinfo_str->data, eb->oldest_dumped_rev, + eb->notify_func, eb->notify_baton, + pool)); } } diff --git a/subversion/libsvn_repos/fs-wrap.c b/subversion/libsvn_repos/fs-wrap.c index 755fa61bbb05..006b2861eb06 100644 --- a/subversion/libsvn_repos/fs-wrap.c +++ b/subversion/libsvn_repos/fs-wrap.c @@ -117,6 +117,8 @@ svn_repos_fs_begin_txn_for_commit2(svn_fs_txn_t **txn_p, const char *txn_name; svn_string_t *author = svn_hash_gets(revprop_table, SVN_PROP_REVISION_AUTHOR); apr_hash_t *hooks_env; + svn_error_t *err; + svn_fs_txn_t *txn; /* Parse the hooks-env file (if any). */ SVN_ERR(svn_repos__parse_hooks_env(&hooks_env, repos->hooks_env_path, @@ -124,21 +126,30 @@ svn_repos_fs_begin_txn_for_commit2(svn_fs_txn_t **txn_p, /* Begin the transaction, ask for the fs to do on-the-fly lock checks. We fetch its name, too, so the start-commit hook can use it. */ - SVN_ERR(svn_fs_begin_txn2(txn_p, repos->fs, rev, + SVN_ERR(svn_fs_begin_txn2(&txn, repos->fs, rev, SVN_FS_TXN_CHECK_LOCKS, pool)); - SVN_ERR(svn_fs_txn_name(&txn_name, *txn_p, pool)); + err = svn_fs_txn_name(&txn_name, txn, pool); + if (err) + return svn_error_compose_create(err, svn_fs_abort_txn(txn, pool)); /* We pass the revision properties to the filesystem by adding them as properties on the txn. Later, when we commit the txn, these properties will be copied into the newly created revision. */ revprops = svn_prop_hash_to_array(revprop_table, pool); - SVN_ERR(svn_repos_fs_change_txn_props(*txn_p, revprops, pool)); + err = svn_repos_fs_change_txn_props(txn, revprops, pool); + if (err) + return svn_error_compose_create(err, svn_fs_abort_txn(txn, pool)); /* Run start-commit hooks. */ - SVN_ERR(svn_repos__hooks_start_commit(repos, hooks_env, - author ? author->data : NULL, - repos->client_capabilities, txn_name, - pool)); + err = svn_repos__hooks_start_commit(repos, hooks_env, + author ? author->data : NULL, + repos->client_capabilities, txn_name, + pool); + if (err) + return svn_error_compose_create(err, svn_fs_abort_txn(txn, pool)); + + /* We have API promise that *TXN_P is unaffected on faulure. */ + *txn_p = txn; return SVN_NO_ERROR; } |
