Return-Path: X-Original-To: apmail-subversion-commits-archive@minotaur.apache.org Delivered-To: apmail-subversion-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 5136A18033 for ; Sun, 14 Jun 2015 20:58:30 +0000 (UTC) Received: (qmail 76117 invoked by uid 500); 14 Jun 2015 20:58:29 -0000 Delivered-To: apmail-subversion-commits-archive@subversion.apache.org Received: (qmail 76025 invoked by uid 500); 14 Jun 2015 20:58:29 -0000 Mailing-List: contact commits-help@subversion.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@subversion.apache.org Delivered-To: mailing list commits@subversion.apache.org Received: (qmail 75433 invoked by uid 99); 14 Jun 2015 20:58:29 -0000 Received: from eris.apache.org (HELO hades.apache.org) (140.211.11.105) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 14 Jun 2015 20:58:29 +0000 Received: from hades.apache.org (localhost [127.0.0.1]) by hades.apache.org (ASF Mail Server at hades.apache.org) with ESMTP id 34916AC0BA3 for ; Sun, 14 Jun 2015 20:58:29 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1685464 [14/43] - in /subversion/branches/fsx-1.10: ./ build/ build/ac-macros/ build/generator/ build/generator/templates/ contrib/client-side/svncopy/ doc/ notes/ subversion/bindings/javahl/ subversion/bindings/javahl/native/ subversion/b... Date: Sun, 14 Jun 2015 20:58:16 -0000 To: commits@subversion.apache.org From: stefan2@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20150614205829.34916AC0BA3@hades.apache.org> Modified: subversion/branches/fsx-1.10/subversion/libsvn_repos/commit.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/libsvn_repos/commit.c?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/libsvn_repos/commit.c (original) +++ subversion/branches/fsx-1.10/subversion/libsvn_repos/commit.c Sun Jun 14 20:58:10 2015 @@ -124,6 +124,7 @@ struct dir_baton svn_revnum_t base_rev; /* the revision I'm based on */ svn_boolean_t was_copied; /* was this directory added with history? */ apr_pool_t *pool; /* my personal pool, in which I am allocated. */ + svn_boolean_t checked_write; /* TRUE after successfull write check */ }; @@ -131,6 +132,7 @@ struct file_baton { struct edit_baton *edit_baton; const char *path; /* the -absolute- path to this file in the fs */ + svn_boolean_t checked_write; /* TRUE after successfull write check */ }; @@ -171,6 +173,30 @@ out_of_date(const char *path, svn_node_k path); } +/* Perform an out of date check for base_rev against created rev, + and a sanity check of base_rev. */ +static svn_error_t * +check_out_of_date(struct edit_baton *eb, + const char *path, + svn_node_kind_t kind, + svn_revnum_t base_rev, + svn_revnum_t created_rev) +{ + if (base_rev < created_rev) + { + return out_of_date(path, kind); + } + else if (base_rev > created_rev) + { + if (base_rev > svn_fs_txn_base_revision(eb->txn)) + return svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, NULL, + _("No such revision %ld"), + base_rev); + } + + return SVN_NO_ERROR; +} + static svn_error_t * invoke_commit_cb(svn_commit_callback2_t commit_cb, @@ -201,6 +227,7 @@ invoke_commit_cb(svn_commit_callback2_t commit_info->date = date ? date->data : NULL; commit_info->author = author ? author->data : NULL; commit_info->post_commit_err = post_commit_errstr; + /* commit_info->repos_root is not set by the repos layer, only by RA layers */ return svn_error_trace(commit_cb(commit_info, commit_baton, scratch_pool)); } @@ -363,14 +390,18 @@ add_file_or_directory(const char *path, /* Build a new child baton. */ if (is_dir) { - *return_baton = make_dir_baton(eb, pb, full_path, was_copied, - SVN_INVALID_REVNUM, pool); + struct dir_baton *new_db = make_dir_baton(eb, pb, full_path, was_copied, + SVN_INVALID_REVNUM, pool); + + new_db->checked_write = TRUE; /* Just created */ + *return_baton = new_db; } else { struct file_baton *new_fb = apr_pcalloc(pool, sizeof(*new_fb)); new_fb->edit_baton = eb; new_fb->path = full_path; + new_fb->checked_write = TRUE; /* Just created */ *return_baton = new_fb; } @@ -391,11 +422,16 @@ open_root(void *edit_baton, struct edit_baton *eb = edit_baton; svn_revnum_t youngest; - /* Ignore BASE_REVISION. We always build our transaction against - HEAD. However, we will keep it in our dir baton for out of - dateness checks. */ + /* We always build our transaction against HEAD. However, we will + sanity-check BASE_REVISION and keep it in our dir baton for out + of dateness checks. */ SVN_ERR(svn_fs_youngest_rev(&youngest, eb->fs, eb->pool)); + if (base_revision > youngest) + return svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, NULL, + _("No such revision %ld (HEAD is %ld)"), + base_revision, youngest); + /* Unless we've been instructed to use a specific transaction, we'll make our own. */ if (eb->txn_owner) @@ -442,7 +478,6 @@ delete_entry(const char *path, struct dir_baton *parent = parent_baton; struct edit_baton *eb = parent->edit_baton; svn_node_kind_t kind; - svn_revnum_t cr_rev; svn_repos_authz_access_t required = svn_authz_write; const char *full_path; @@ -467,14 +502,18 @@ delete_entry(const char *path, /* Now, make sure we're deleting the node we *think* we're deleting, else return an out-of-dateness error. */ - SVN_ERR(svn_fs_node_created_rev(&cr_rev, eb->txn_root, full_path, pool)); - if (SVN_IS_VALID_REVNUM(revision) && (revision < cr_rev)) - return svn_error_trace(out_of_date(full_path, kind)); + if (SVN_IS_VALID_REVNUM(revision)) + { + svn_revnum_t cr_rev; + + SVN_ERR(svn_fs_node_created_rev(&cr_rev, eb->txn_root, full_path, pool)); + SVN_ERR(check_out_of_date(eb, full_path, kind, revision, cr_rev)); + } /* This routine is a mindless wrapper. We call svn_fs_delete() because that will delete files and recursively delete directories. */ - return svn_fs_delete(eb->txn_root, full_path, pool); + return svn_error_trace(svn_fs_delete(eb->txn_root, full_path, pool)); } @@ -529,18 +568,23 @@ apply_textdelta(void *file_baton, void **handler_baton) { struct file_baton *fb = file_baton; + struct edit_baton *eb = fb->edit_baton; - /* Check for write authorization. */ - SVN_ERR(check_authz(fb->edit_baton, fb->path, - fb->edit_baton->txn_root, - svn_authz_write, pool)); + if (!fb->checked_write) + { + /* Check for write authorization. */ + SVN_ERR(check_authz(eb, fb->path, eb->txn_root, + svn_authz_write, pool)); + fb->checked_write = TRUE; + } - return svn_fs_apply_textdelta(handler, handler_baton, - fb->edit_baton->txn_root, - fb->path, - base_checksum, - NULL, - pool); + return svn_error_trace( + svn_fs_apply_textdelta(handler, handler_baton, + eb->txn_root, + fb->path, + base_checksum, + NULL, + pool)); } @@ -584,8 +628,9 @@ open_file(const char *path, /* If the node our caller has is an older revision number than the one in our transaction, return an out-of-dateness error. */ - if (SVN_IS_VALID_REVNUM(base_revision) && (base_revision < cr_rev)) - return svn_error_trace(out_of_date(full_path, svn_node_file)); + if (SVN_IS_VALID_REVNUM(base_revision)) + SVN_ERR(check_out_of_date(eb, full_path, svn_node_file, + base_revision, cr_rev)); /* Build a new file baton */ new_fb = apr_pcalloc(pool, sizeof(*new_fb)); @@ -610,9 +655,13 @@ change_file_prop(void *file_baton, struct file_baton *fb = file_baton; struct edit_baton *eb = fb->edit_baton; - /* Check for write authorization. */ - SVN_ERR(check_authz(eb, fb->path, eb->txn_root, - svn_authz_write, pool)); + if (!fb->checked_write) + { + /* Check for write authorization. */ + SVN_ERR(check_authz(eb, fb->path, eb->txn_root, + svn_authz_write, pool)); + fb->checked_write = TRUE; + } return svn_repos_fs_change_node_prop(eb->txn_root, fb->path, name, value, pool); @@ -657,19 +706,24 @@ change_dir_prop(void *dir_baton, struct edit_baton *eb = db->edit_baton; /* Check for write authorization. */ - SVN_ERR(check_authz(eb, db->path, eb->txn_root, - svn_authz_write, pool)); - - if (SVN_IS_VALID_REVNUM(db->base_rev)) + if (!db->checked_write) { - /* Subversion rule: propchanges can only happen on a directory - which is up-to-date. */ - svn_revnum_t created_rev; - SVN_ERR(svn_fs_node_created_rev(&created_rev, - eb->txn_root, db->path, pool)); + SVN_ERR(check_authz(eb, db->path, eb->txn_root, + svn_authz_write, pool)); + + if (SVN_IS_VALID_REVNUM(db->base_rev)) + { + /* Subversion rule: propchanges can only happen on a directory + which is up-to-date. */ + svn_revnum_t created_rev; + SVN_ERR(svn_fs_node_created_rev(&created_rev, + eb->txn_root, db->path, pool)); - if (db->base_rev < created_rev) - return svn_error_trace(out_of_date(db->path, svn_node_dir)); + SVN_ERR(check_out_of_date(eb, db->path, svn_node_dir, + db->base_rev, created_rev)); + } + + db->checked_write = TRUE; /* Skip on further prop changes */ } return svn_repos_fs_change_node_prop(eb->txn_root, db->path, @@ -779,6 +833,13 @@ close_edit(void *edit_baton, post_commit_err = svn_repos__post_commit_error_str(err, pool); svn_error_clear(err); } + + /* Make sure a future abort doesn't perform + any work. This may occur if the commit + callback returns an error! */ + + eb->txn = NULL; + eb->txn_root = NULL; } else { Modified: subversion/branches/fsx-1.10/subversion/libsvn_repos/config_pool.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/libsvn_repos/config_pool.c?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/libsvn_repos/config_pool.c (original) +++ subversion/branches/fsx-1.10/subversion/libsvn_repos/config_pool.c Sun Jun 14 20:58:10 2015 @@ -182,7 +182,7 @@ setter(void **target, * CONFIG_POOL, yet, parse CONTENTS and cache the result. CASE_SENSITIVE * controls option and section name matching. * - * RESULT_POOL determines the lifetime of the returned reference and + * RESULT_POOL determines the lifetime of the returned reference and * SCRATCH_POOL is being used for temporary allocations. */ static svn_error_t * @@ -283,12 +283,12 @@ add_checksum(svn_repos__config_pool_t *c return SVN_NO_ERROR; } -/* Set *CFG to the configuration stored in URL@HEAD and cache it in +/* Set *CFG to the configuration stored in URL@HEAD and cache it in * CONFIG_POOL. CASE_SENSITIVE controls * option and section name matching. If PREFERRED_REPOS is given, * use that if it also matches URL. - * - * RESULT_POOL determines the lifetime of the returned reference and + * + * RESULT_POOL determines the lifetime of the returned reference and * SCRATCH_POOL is being used for temporary allocations. */ static svn_error_t * @@ -416,7 +416,7 @@ key_by_url(svn_membuf_t **key, /* found *some* reference to a configuration. * Verify that it is still current. Will fail for BDB repos. */ - err = svn_stringbuf_from_file2(&contents, + err = svn_stringbuf_from_file2(&contents, svn_dirent_join(config->repo_root, "db/current", pool), pool); Modified: subversion/branches/fsx-1.10/subversion/libsvn_repos/delta.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/libsvn_repos/delta.c?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/libsvn_repos/delta.c (original) +++ subversion/branches/fsx-1.10/subversion/libsvn_repos/delta.c Sun Jun 14 20:58:10 2015 @@ -321,7 +321,7 @@ svn_repos_dir_delta2(svn_fs_root_t *src_ SVN_ERR(svn_fs_node_relation(&relation, tgt_root, tgt_fullpath, src_root, src_fullpath, pool)); - if (relation == svn_fs_node_same) + if (relation == svn_fs_node_unchanged) { /* They are the same node! No-op (you gotta love those). */ goto cleanup; Modified: subversion/branches/fsx-1.10/subversion/libsvn_repos/dump.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/libsvn_repos/dump.c?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/libsvn_repos/dump.c (original) +++ subversion/branches/fsx-1.10/subversion/libsvn_repos/dump.c Sun Jun 14 20:58:10 2015 @@ -2323,18 +2323,18 @@ verify_one_revision(svn_fs_t *fs, SVN_ERR(svn_repos_replay2(to_root, "", SVN_INVALID_REVNUM, FALSE, cancel_editor, cancel_edit_baton, NULL, NULL, scratch_pool)); - + /* While our editor close_edit implementation is a no-op, we still do this for completeness. */ SVN_ERR(cancel_editor->close_edit(cancel_edit_baton, scratch_pool)); - + SVN_ERR(svn_fs_revision_proplist(&props, fs, rev, scratch_pool)); return SVN_NO_ERROR; } /* Baton type used for forwarding notifications from FS API to REPOS API. */ -struct verify_fs2_notify_func_baton_t +struct verify_fs_notify_func_baton_t { /* notification function to call (must not be NULL) */ svn_repos_notify_func_t notify_func; @@ -2348,11 +2348,11 @@ struct verify_fs2_notify_func_baton_t /* Forward the notification to BATON. */ static void -verify_fs2_notify_func(svn_revnum_t revision, +verify_fs_notify_func(svn_revnum_t revision, void *baton, apr_pool_t *pool) { - struct verify_fs2_notify_func_baton_t *notify_baton = baton; + struct verify_fs_notify_func_baton_t *notify_baton = baton; notify_baton->notify->revision = revision; notify_baton->notify_func(notify_baton->notify_baton, @@ -2378,9 +2378,10 @@ svn_repos_verify_fs3(svn_repos_t *repos, apr_pool_t *iterpool = svn_pool_create(pool); svn_repos_notify_t *notify; svn_fs_progress_notify_func_t verify_notify = NULL; - struct verify_fs2_notify_func_baton_t *verify_notify_baton = NULL; + struct verify_fs_notify_func_baton_t *verify_notify_baton = NULL; svn_error_t *err; - svn_boolean_t found_corruption = FALSE; + svn_boolean_t failed_metadata = FALSE; + svn_revnum_t failed_revisions = 0; /* Determine the current youngest revision of the filesystem. */ SVN_ERR(svn_fs_youngest_rev(&youngest, fs, pool)); @@ -2409,7 +2410,7 @@ svn_repos_verify_fs3(svn_repos_t *repos, { notify = svn_repos_notify_create(svn_repos_notify_verify_rev_end, pool); - verify_notify = verify_fs2_notify_func; + verify_notify = verify_fs_notify_func; verify_notify_baton = apr_palloc(pool, sizeof(*verify_notify_baton)); verify_notify_baton->notify_func = notify_func; verify_notify_baton->notify_baton = notify_baton; @@ -2423,34 +2424,26 @@ svn_repos_verify_fs3(svn_repos_t *repos, verify_notify, verify_notify_baton, cancel_func, cancel_baton, pool); - if (err) + if (err && err->apr_err == SVN_ERR_CANCELLED) + { + return svn_error_trace(err); + } + else if (err) { - if (err->apr_err == SVN_ERR_CANCELLED) - return svn_error_trace(err); - - found_corruption = TRUE; notify_verification_error(SVN_INVALID_REVNUM, err, notify_func, notify_baton, iterpool); - /* If we already reported the error, reset it. */ - if (notify_func) + if (!keep_going) { + /* Return the error, the caller doesn't want us to continue. */ + return svn_error_trace(err); + } + else + { + /* Clear the error and keep going. */ + failed_metadata = TRUE; svn_error_clear(err); - err = NULL; } - - /* If we abort the verification now, combine yet unreported error - info with the generic one we return. */ - if (!keep_going) - /* ### Jump to "We're done" and so send the final notification, - for consistency? */ - return svn_error_createf(SVN_ERR_REPOS_CORRUPTED, err, - _("Repository '%s' failed to verify"), - svn_dirent_local_style(svn_repos_path(repos, - pool), - pool)); - - svn_error_clear(err); } if (!metadata_only) @@ -2464,24 +2457,30 @@ svn_repos_verify_fs3(svn_repos_t *repos, cancel_func, cancel_baton, iterpool); - if (err) + if (err && err->apr_err == SVN_ERR_CANCELLED) + { + return svn_error_trace(err); + } + else if (err) { - if (err->apr_err == SVN_ERR_CANCELLED) - return svn_error_trace(err); - - found_corruption = TRUE; notify_verification_error(rev, err, notify_func, notify_baton, iterpool); - svn_error_clear(err); - if (keep_going) - continue; + if (!keep_going) + { + /* Return the error, the caller doesn't want us to continue. */ + return svn_error_trace(err); + } else - break; + { + /* Clear the error and keep going. */ + ++failed_revisions; + svn_error_clear(err); + } } - - if (notify_func) + else if (notify_func) { + /* Tell the caller that we're done with this revision. */ notify->revision = rev; notify_func(notify_baton, notify, iterpool); } @@ -2496,12 +2495,40 @@ svn_repos_verify_fs3(svn_repos_t *repos, svn_pool_destroy(iterpool); - if (found_corruption) - return svn_error_createf(SVN_ERR_REPOS_CORRUPTED, NULL, - _("Repository '%s' failed to verify"), - svn_dirent_local_style(svn_repos_path(repos, - pool), - pool)); + /* Summarize the results. */ + if (failed_metadata || 0 != failed_revisions) + { + const char *const repos_path = + svn_dirent_local_style(svn_repos_path(repos, pool), pool); + + if (0 == failed_revisions) + { + return svn_error_createf( + SVN_ERR_REPOS_VERIFY_FAILED, NULL, + _("Metadata verification failed on repository '%s'"), + repos_path); + } + else + { + const char* format_string; + + if (failed_metadata) + format_string = apr_psprintf( + pool, _("Verification of metadata and" + " %%%s out of %%%s revisions" + " failed on repository '%%s'"), + SVN_REVNUM_T_FMT, SVN_REVNUM_T_FMT); + else + format_string = apr_psprintf( + pool, _("Verification of %%%s out of %%%s revisions" + " failed on repository '%%s'"), + SVN_REVNUM_T_FMT, SVN_REVNUM_T_FMT); + + return svn_error_createf( + SVN_ERR_REPOS_VERIFY_FAILED, NULL, format_string, + failed_revisions, end_rev - start_rev + 1, repos_path); + } + } return SVN_NO_ERROR; } Modified: subversion/branches/fsx-1.10/subversion/libsvn_repos/fs-wrap.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/libsvn_repos/fs-wrap.c?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/libsvn_repos/fs-wrap.c (original) +++ subversion/branches/fsx-1.10/subversion/libsvn_repos/fs-wrap.c Sun Jun 14 20:58:10 2015 @@ -104,7 +104,7 @@ svn_repos_fs_commit_txn(const char **con svn_error_clear(svn_fs_change_txn_prop(txn, key, val, iterpool)); } svn_pool_destroy(iterpool); - + return err; } @@ -592,7 +592,7 @@ svn_repos_fs_lock_many(svn_repos_t *repo if (!cb_err && lock_callback) cb_err = lock_callback(lock_baton, path, NULL, err, iterpool); svn_error_clear(err); - + continue; } @@ -678,7 +678,7 @@ svn_repos_fs_lock(svn_lock_t **lock, { apr_hash_t *targets = apr_hash_make(pool); svn_fs_lock_target_t *target = svn_fs_lock_target_create(token, current_rev, - pool); + pool); svn_error_t *err; struct lock_baton_t baton = {0}; Modified: subversion/branches/fsx-1.10/subversion/libsvn_repos/load-fs-vtable.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/libsvn_repos/load-fs-vtable.c?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/libsvn_repos/load-fs-vtable.c (original) +++ subversion/branches/fsx-1.10/subversion/libsvn_repos/load-fs-vtable.c Sun Jun 14 20:58:10 2015 @@ -726,6 +726,7 @@ set_revision_property(void *baton, struct revision_baton *rb = baton; struct parse_baton *pb = rb->pb; svn_boolean_t is_date = strcmp(name, SVN_PROP_REVISION_DATE) == 0; + svn_prop_t *prop; /* If we're skipping this revision, we're done here. */ if (rb->skipped) @@ -735,32 +736,16 @@ set_revision_property(void *baton, if (is_date && pb->ignore_dates) return SVN_NO_ERROR; - if (rb->rev > 0) - { - svn_prop_t *prop = &APR_ARRAY_PUSH(rb->revprops, svn_prop_t); - - /* Collect property changes to apply them in one FS call in - close_revision. */ - prop->name = apr_pstrdup(rb->pool, name); - prop->value = svn_string_dup(value, rb->pool); - - /* Remember any datestamp that passes through! (See comment in - close_revision() below.) */ - if (is_date) - rb->datestamp = svn_string_dup(value, rb->pool); - } - else if (rb->rev == 0) - { - /* Special case: set revision 0 properties when loading into an - 'empty' filesystem. */ - svn_revnum_t youngest_rev; - - SVN_ERR(svn_fs_youngest_rev(&youngest_rev, pb->fs, rb->pool)); - - if (youngest_rev == 0) - SVN_ERR(change_rev_prop(pb->repos, 0, name, value, - pb->validate_props, rb->pool)); - } + /* Collect property changes to apply them in one FS call in + close_revision. */ + prop = &APR_ARRAY_PUSH(rb->revprops, svn_prop_t); + prop->name = apr_pstrdup(rb->pool, name); + prop->value = svn_string_dup(value, rb->pool); + + /* Remember any datestamp that passes through! (See comment in + close_revision() below.) */ + if (is_date) + rb->datestamp = svn_string_dup(value, rb->pool); return SVN_NO_ERROR; } @@ -1018,11 +1003,41 @@ close_revision(void *baton) const char *txn_name = NULL; apr_hash_t *hooks_env; - /* If we're skipping this revision or it has an invalid revision - number, we're done here. */ - if (rb->skipped || (rb->rev <= 0)) + /* If we're skipping this revision we're done here. */ + if (rb->skipped) return SVN_NO_ERROR; + if (rb->rev == 0) + { + /* Special case: set revision 0 properties when loading into an + 'empty' filesystem. */ + svn_revnum_t youngest_rev; + + SVN_ERR(svn_fs_youngest_rev(&youngest_rev, pb->fs, rb->pool)); + + if (youngest_rev == 0) + { + apr_hash_t *orig_props; + apr_hash_t *new_props; + apr_array_header_t *diff; + int i; + + SVN_ERR(svn_fs_revision_proplist(&orig_props, pb->fs, 0, rb->pool)); + new_props = svn_prop_array_to_hash(rb->revprops, rb->pool); + SVN_ERR(svn_prop_diffs(&diff, new_props, orig_props, rb->pool)); + + for (i = 0; i < diff->nelts; i++) + { + const svn_prop_t *prop = &APR_ARRAY_IDX(diff, i, svn_prop_t); + + SVN_ERR(change_rev_prop(pb->repos, 0, prop->name, prop->value, + pb->validate_props, rb->pool)); + } + } + + return SVN_NO_ERROR; + } + /* If the dumpstream doesn't have an 'svn:date' property and we aren't ignoring the dates in the dumpstream altogether, remove any 'svn:date' revision property that was set by FS layer when Modified: subversion/branches/fsx-1.10/subversion/libsvn_repos/log.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/libsvn_repos/log.c?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/libsvn_repos/log.c (original) +++ subversion/branches/fsx-1.10/subversion/libsvn_repos/log.c Sun Jun 14 20:58:10 2015 @@ -2340,7 +2340,7 @@ svn_repos_get_logs4(svn_repos_t *repos, revprops = new_revprops; } - + /* Setup log range. */ SVN_ERR(svn_fs_youngest_rev(&head, fs, pool)); Modified: subversion/branches/fsx-1.10/subversion/libsvn_repos/replay.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/libsvn_repos/replay.c?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/libsvn_repos/replay.c (original) +++ subversion/branches/fsx-1.10/subversion/libsvn_repos/replay.c Sun Jun 14 20:58:10 2015 @@ -555,10 +555,6 @@ path_driver_cb_func(void **dir_baton, return svn_error_create(SVN_ERR_FS_ALREADY_EXISTS, NULL, _("Root directory already exists.")); - /* A NULL parent_baton will cause a segfault. It should never be - NULL for non-root paths. */ - SVN_ERR_ASSERT(parent_baton); - /* Was this node copied? */ SVN_ERR(fill_copyfrom(©from_root, ©from_path, ©from_rev, &src_readable, root, change, @@ -971,6 +967,11 @@ svn_repos_replay2(svn_fs_root_t *root, const char *repos_root = ""; void *unlock_baton; + /* If we were not given a low water mark, assume that everything is there, + all the way back to revision 0. */ + if (! SVN_IS_VALID_REVNUM(low_water_mark)) + low_water_mark = 0; + /* Special-case r0, which we know is an empty revision; if we don't special-case it we might end up trying to compare it to "r-1". */ if (svn_fs_is_revision_root(root) @@ -1493,7 +1494,7 @@ svn_repos__replay_ev2(svn_fs_root_t *roo svn_error_t *err = SVN_NO_ERROR; int i; - SVN_ERR_ASSERT(!svn_dirent_is_absolute(base_repos_relpath)); + SVN_ERR_ASSERT(svn_relpath_is_canonical(base_repos_relpath)); /* Special-case r0, which we know is an empty revision; if we don't special-case it we might end up trying to compare it to "r-1". */ Modified: subversion/branches/fsx-1.10/subversion/libsvn_repos/reporter.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/libsvn_repos/reporter.c?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/libsvn_repos/reporter.c (original) +++ subversion/branches/fsx-1.10/subversion/libsvn_repos/reporter.c Sun Jun 14 20:58:10 2015 @@ -1282,7 +1282,7 @@ delta_dirs(report_baton_t *b, svn_revnum /* Loop over the dirents in the target. */ SVN_ERR(svn_fs_dir_optimal_order(&t_ordered_entries, b->t_root, - t_entries, subpool)); + t_entries, subpool, iterpool)); for (i = 0; i < t_ordered_entries->nelts; ++i) { const svn_fs_dirent_t *t_entry Modified: subversion/branches/fsx-1.10/subversion/libsvn_repos/repos.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/libsvn_repos/repos.c?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/libsvn_repos/repos.c (original) +++ subversion/branches/fsx-1.10/subversion/libsvn_repos/repos.c Sun Jun 14 20:58:10 2015 @@ -1635,9 +1635,10 @@ svn_repos_fs(svn_repos_t *repos) } const char * -svn_repos_fs_type(svn_repos_t *repos, apr_pool_t *pool) +svn_repos_fs_type(svn_repos_t *repos, + apr_pool_t *result_pool) { - return apr_pstrdup(pool, repos->fs_type); + return apr_pstrdup(result_pool, repos->fs_type); } /* For historical reasons, for the Berkeley DB backend, this code uses @@ -1957,7 +1958,7 @@ svn_repos_hotcopy3(const char *src_path, void *notify_baton, svn_cancel_func_t cancel_func, void *cancel_baton, - apr_pool_t *pool) + apr_pool_t *scratch_pool) { svn_fs_hotcopy_notify_t fs_notify_func; struct fs_hotcopy_notify_baton_t fs_notify_baton; @@ -1968,8 +1969,8 @@ svn_repos_hotcopy3(const char *src_path, svn_repos_t *dst_repos; svn_error_t *err; - SVN_ERR(svn_dirent_get_absolute(&src_abspath, src_path, pool)); - SVN_ERR(svn_dirent_get_absolute(&dst_abspath, dst_path, pool)); + SVN_ERR(svn_dirent_get_absolute(&src_abspath, src_path, scratch_pool)); + SVN_ERR(svn_dirent_get_absolute(&dst_abspath, dst_path, scratch_pool)); if (strcmp(src_abspath, dst_abspath) == 0) return svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL, _("Hotcopy source and destination are equal")); @@ -1979,7 +1980,7 @@ svn_repos_hotcopy3(const char *src_path, FALSE, FALSE, FALSE, /* don't try to open the db yet. */ NULL, - pool, pool)); + scratch_pool, scratch_pool)); /* If we are going to clean logs, then get an exclusive lock on db-logs.lock, to ensure that no one else will work with logs. @@ -1987,7 +1988,7 @@ svn_repos_hotcopy3(const char *src_path, If we are just copying, then get a shared lock to ensure that no one else will clean logs while we copying them */ - SVN_ERR(lock_db_logs_file(src_repos, clean_logs, pool)); + SVN_ERR(lock_db_logs_file(src_repos, clean_logs, scratch_pool)); /* Copy the repository to a new path, with exception of specially handled directories */ @@ -2001,16 +2002,16 @@ svn_repos_hotcopy3(const char *src_path, 0, hotcopy_structure, &hotcopy_context, - pool)); + scratch_pool)); /* Prepare dst_repos object so that we may create locks, so that we may open repository */ - dst_repos = create_svn_repos_t(dst_abspath, pool); + dst_repos = create_svn_repos_t(dst_abspath, scratch_pool); dst_repos->fs_type = src_repos->fs_type; dst_repos->format = src_repos->format; - err = create_locks(dst_repos, pool); + err = create_locks(dst_repos, scratch_pool); if (err) { if (incremental && err->apr_err == SVN_ERR_DIR_NOT_EMPTY) @@ -2019,7 +2020,8 @@ svn_repos_hotcopy3(const char *src_path, return svn_error_trace(err); } - err = svn_io_dir_make_sgid(dst_repos->db_path, APR_OS_DEFAULT, pool); + err = svn_io_dir_make_sgid(dst_repos->db_path, APR_OS_DEFAULT, + scratch_pool); if (err) { if (incremental && APR_STATUS_IS_EEXIST(err->apr_err)) @@ -2030,7 +2032,7 @@ svn_repos_hotcopy3(const char *src_path, /* Exclusively lock the new repository. No one should be accessing it at the moment */ - SVN_ERR(lock_repos(dst_repos, TRUE, FALSE, pool)); + SVN_ERR(lock_repos(dst_repos, TRUE, FALSE, scratch_pool)); fs_notify_func = notify_func ? fs_hotcopy_notify : NULL; fs_notify_baton.notify_func = notify_func; @@ -2039,12 +2041,12 @@ svn_repos_hotcopy3(const char *src_path, SVN_ERR(svn_fs_hotcopy3(src_repos->db_path, dst_repos->db_path, clean_logs, incremental, fs_notify_func, &fs_notify_baton, - cancel_func, cancel_baton, pool)); + cancel_func, cancel_baton, scratch_pool)); /* Destination repository is ready. Stamp it with a format number. */ return svn_io_write_version_file - (svn_dirent_join(dst_repos->path, SVN_REPOS__FORMAT, pool), - dst_repos->format, pool); + (svn_dirent_join(dst_repos->path, SVN_REPOS__FORMAT, scratch_pool), + dst_repos->format, scratch_pool); } /* Return the library version number. */ @@ -2065,7 +2067,6 @@ svn_repos_stat(svn_dirent_t **dirent, svn_node_kind_t kind; svn_dirent_t *ent; const char *datestring; - apr_hash_t *prophash; SVN_ERR(svn_fs_check_path(&kind, root, path, pool)); @@ -2081,9 +2082,7 @@ svn_repos_stat(svn_dirent_t **dirent, if (kind == svn_node_file) SVN_ERR(svn_fs_file_length(&(ent->size), root, path, pool)); - SVN_ERR(svn_fs_node_proplist(&prophash, root, path, pool)); - if (apr_hash_count(prophash) > 0) - ent->has_props = TRUE; + SVN_ERR(svn_fs_node_has_props(&ent->has_props, root, path, pool)); SVN_ERR(svn_repos_get_committed_info(&(ent->created_rev), &datestring, Modified: subversion/branches/fsx-1.10/subversion/libsvn_repos/rev_hunt.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/libsvn_repos/rev_hunt.c?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/libsvn_repos/rev_hunt.c (original) +++ subversion/branches/fsx-1.10/subversion/libsvn_repos/rev_hunt.c Sun Jun 14 20:58:10 2015 @@ -310,9 +310,8 @@ svn_repos_deleted_rev(svn_fs_t *fs, svn_revnum_t *deleted, apr_pool_t *pool) { - apr_pool_t *subpool; - svn_fs_root_t *start_root, *root, *copy_root; - const char *copy_path; + apr_pool_t *iterpool; + svn_fs_root_t *start_root, *root; svn_revnum_t mid_rev; svn_node_kind_t kind; svn_fs_node_relation_t node_relation; @@ -379,6 +378,8 @@ svn_repos_deleted_rev(svn_fs_t *fs, root, path, pool)); if (node_relation != svn_fs_node_unrelated) { + svn_fs_root_t *copy_root; + const char *copy_path; SVN_ERR(svn_fs_closest_copy(©_root, ©_path, root, path, pool)); if (!copy_root || @@ -432,15 +433,15 @@ svn_repos_deleted_rev(svn_fs_t *fs, */ mid_rev = (start + end) / 2; - subpool = svn_pool_create(pool); + iterpool = svn_pool_create(pool); while (1) { - svn_pool_clear(subpool); + svn_pool_clear(iterpool); /* Get revision root and node id for mid_rev at that revision. */ - SVN_ERR(svn_fs_revision_root(&root, fs, mid_rev, subpool)); - SVN_ERR(svn_fs_check_path(&kind, root, path, pool)); + SVN_ERR(svn_fs_revision_root(&root, fs, mid_rev, iterpool)); + SVN_ERR(svn_fs_check_path(&kind, root, path, iterpool)); if (kind == svn_node_none) { /* Case D: Look lower in the range. */ @@ -449,13 +450,15 @@ svn_repos_deleted_rev(svn_fs_t *fs, } else { + svn_fs_root_t *copy_root; + const char *copy_path; /* Determine the relationship between the start node and the current node. */ SVN_ERR(svn_fs_node_relation(&node_relation, start_root, path, - root, path, pool)); + root, path, iterpool)); if (node_relation != svn_fs_node_unrelated) - SVN_ERR(svn_fs_closest_copy(©_root, ©_path, root, - path, subpool)); + SVN_ERR(svn_fs_closest_copy(©_root, ©_path, root, + path, iterpool)); if (node_relation == svn_fs_node_unrelated || (copy_root && (svn_fs_revision_root_revision(copy_root) > start))) @@ -479,7 +482,7 @@ svn_repos_deleted_rev(svn_fs_t *fs, } } - svn_pool_destroy(subpool); + svn_pool_destroy(iterpool); return SVN_NO_ERROR; } @@ -666,8 +669,7 @@ svn_repos_trace_node_locations(svn_fs_t /* First - let's sort the array of the revisions from the greatest revision * downward, so it will be easier to search on. */ location_revisions = apr_array_copy(pool, location_revisions_orig); - qsort(location_revisions->elts, location_revisions->nelts, - sizeof(*revision_ptr), svn_sort_compare_revisions); + svn_sort__array(location_revisions, svn_sort_compare_revisions); revision_ptr = (svn_revnum_t *)location_revisions->elts; revision_ptr_end = revision_ptr + location_revisions->nelts; @@ -835,27 +837,32 @@ svn_repos_node_location_segments(svn_rep { svn_fs_t *fs = svn_repos_fs(repos); svn_stringbuf_t *current_path; - svn_revnum_t youngest_rev = SVN_INVALID_REVNUM, current_rev; + svn_revnum_t youngest_rev, current_rev; apr_pool_t *subpool; + SVN_ERR(svn_fs_youngest_rev(&youngest_rev, fs, pool)); + /* No PEG_REVISION? We'll use HEAD. */ if (! SVN_IS_VALID_REVNUM(peg_revision)) - { - SVN_ERR(svn_fs_youngest_rev(&youngest_rev, fs, pool)); - peg_revision = youngest_rev; - } + peg_revision = youngest_rev; + + if (peg_revision > youngest_rev) + return svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, NULL, + _("No such revision %ld"), peg_revision); - /* No START_REV? We'll use HEAD (which we may have already fetched). */ + /* No START_REV? We'll use peg rev. */ if (! SVN_IS_VALID_REVNUM(start_rev)) - { - if (SVN_IS_VALID_REVNUM(youngest_rev)) - start_rev = youngest_rev; - else - SVN_ERR(svn_fs_youngest_rev(&start_rev, fs, pool)); - } + start_rev = peg_revision; + else if (start_rev > peg_revision) + return svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, NULL, + _("No such revision %ld"), start_rev); /* No END_REV? We'll use 0. */ - end_rev = SVN_IS_VALID_REVNUM(end_rev) ? end_rev : 0; + if (! SVN_IS_VALID_REVNUM(end_rev)) + end_rev = 0; + else if (end_rev > start_rev) + return svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, NULL, + _("No such revision %ld"), end_rev); /* Are the revision properly ordered? They better be -- the API demands it. */ @@ -1559,6 +1566,18 @@ svn_repos_get_file_revs2(svn_repos_t *re struct send_baton sb; int mainline_pos, merged_pos; + if (!SVN_IS_VALID_REVNUM(start) + || !SVN_IS_VALID_REVNUM(end)) + { + svn_revnum_t youngest_rev; + SVN_ERR(svn_fs_youngest_rev(&youngest_rev, repos->fs, scratch_pool)); + + if (!SVN_IS_VALID_REVNUM(start)) + start = youngest_rev; + if (!SVN_IS_VALID_REVNUM(end)) + end = youngest_rev; + } + if (end < start) { if (include_merged_revisions) Propchange: subversion/branches/fsx-1.10/subversion/libsvn_subr/ ------------------------------------------------------------------------------ --- svn:ignore (original) +++ svn:ignore Sun Jun 14 20:58:10 2015 @@ -12,3 +12,4 @@ internal_statements.h errorcode.inc libsvn_subr.pc.in libsvn_subr.pc +config_keys.inc Modified: subversion/branches/fsx-1.10/subversion/libsvn_subr/atomic.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/libsvn_subr/atomic.c?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/libsvn_subr/atomic.c (original) +++ subversion/branches/fsx-1.10/subversion/libsvn_subr/atomic.c Sun Jun 14 20:58:10 2015 @@ -20,6 +20,7 @@ * ==================================================================== */ +#include #include #include "private/svn_atomic.h" @@ -29,11 +30,20 @@ #define SVN_ATOMIC_INIT_FAILED 2 #define SVN_ATOMIC_INITIALIZED 3 -svn_error_t* -svn_atomic__init_once(volatile svn_atomic_t *global_status, - svn_error_t *(*init_func)(void*,apr_pool_t*), - void *baton, - apr_pool_t* pool) + +/* + * This is the actual atomic initialization driver. The caller must + * provide either ERR_INIT_FUNC and ERR_P, or STR_INIT_FUNC and + * ERRSTR_P, but never both. + */ +static void +init_once(svn_atomic__err_init_func_t err_init_func, + svn_error_t **err_p, + svn_atomic__str_init_func_t str_init_func, + const char **errstr_p, + volatile svn_atomic_t *global_status, + void *baton, + apr_pool_t* pool) { /* !! Don't use localizable strings in this function, because these !! might cause deadlocks. This function can be used to initialize @@ -42,44 +52,94 @@ svn_atomic__init_once(volatile svn_atomi /* We have to call init_func exactly once. Because APR doesn't have statically-initialized mutexes, we implement a poor man's spinlock using svn_atomic_cas. */ + + svn_error_t *err = SVN_NO_ERROR; + const char *errstr = NULL; svn_atomic_t status = svn_atomic_cas(global_status, SVN_ATOMIC_START_INIT, SVN_ATOMIC_UNINITIALIZED); - if (status == SVN_ATOMIC_UNINITIALIZED) +#ifdef SVN_DEBUG + /* Check that the parameters are valid. */ + assert(!err_init_func != !str_init_func); + assert(!err_init_func == !err_p); + assert(!str_init_func == !errstr_p); +#endif /* SVN_DEBUG */ + + for (;;) { - svn_error_t *err = init_func(baton, pool); - if (err) + switch (status) { -#if APR_HAS_THREADS - /* Tell other threads that the initialization failed. */ - svn_atomic_cas(global_status, - SVN_ATOMIC_INIT_FAILED, - SVN_ATOMIC_START_INIT); -#endif - return svn_error_create(SVN_ERR_ATOMIC_INIT_FAILURE, err, - "Couldn't perform atomic initialization"); + case SVN_ATOMIC_UNINITIALIZED: + if (err_init_func) + err = err_init_func(baton, pool); + else + errstr = str_init_func(baton); + if (err || errstr) + { + status = svn_atomic_cas(global_status, + SVN_ATOMIC_INIT_FAILED, + SVN_ATOMIC_START_INIT); + } + else + { + status = svn_atomic_cas(global_status, + SVN_ATOMIC_INITIALIZED, + SVN_ATOMIC_START_INIT); + } + + /* Take another spin through the switch to report either + failure or success. */ + continue; + + case SVN_ATOMIC_START_INIT: + /* Wait for the init function to complete. */ + apr_sleep(APR_USEC_PER_SEC / 1000); + status = svn_atomic_cas(global_status, + SVN_ATOMIC_UNINITIALIZED, + SVN_ATOMIC_UNINITIALIZED); + continue; + + case SVN_ATOMIC_INIT_FAILED: + if (err_init_func) + *err_p = svn_error_create(SVN_ERR_ATOMIC_INIT_FAILURE, err, + "Couldn't perform atomic initialization"); + else + *errstr_p = errstr; + return; + + case SVN_ATOMIC_INITIALIZED: + if (err_init_func) + *err_p = SVN_NO_ERROR; + else + *errstr_p = NULL; + return; + + default: + /* Something went seriously wrong with the atomic operations. */ + abort(); } - svn_atomic_cas(global_status, - SVN_ATOMIC_INITIALIZED, - SVN_ATOMIC_START_INIT); - } -#if APR_HAS_THREADS - /* Wait for whichever thread is performing initialization to finish. */ - /* XXX FIXME: Should we have a maximum wait here, like we have in - the Windows file IO spinner? */ - else while (status != SVN_ATOMIC_INITIALIZED) - { - if (status == SVN_ATOMIC_INIT_FAILED) - return svn_error_create(SVN_ERR_ATOMIC_INIT_FAILURE, NULL, - "Couldn't perform atomic initialization"); - - apr_sleep(APR_USEC_PER_SEC / 1000); - status = svn_atomic_cas(global_status, - SVN_ATOMIC_UNINITIALIZED, - SVN_ATOMIC_UNINITIALIZED); } -#endif /* APR_HAS_THREADS */ +} + - return SVN_NO_ERROR; +svn_error_t * +svn_atomic__init_once(volatile svn_atomic_t *global_status, + svn_atomic__err_init_func_t err_init_func, + void *baton, + apr_pool_t* pool) +{ + svn_error_t *err; + init_once(err_init_func, &err, NULL, NULL, global_status, baton, pool); + return err; +} + +const char * +svn_atomic__init_once_no_error(volatile svn_atomic_t *global_status, + svn_atomic__str_init_func_t str_init_func, + void *baton) +{ + const char *errstr; + init_once(NULL, NULL, str_init_func, &errstr, global_status, baton, NULL); + return errstr; } Modified: subversion/branches/fsx-1.10/subversion/libsvn_subr/auth.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/libsvn_subr/auth.c?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/libsvn_subr/auth.c (original) +++ subversion/branches/fsx-1.10/subversion/libsvn_subr/auth.c Sun Jun 14 20:58:10 2015 @@ -109,10 +109,10 @@ struct svn_auth_baton_t /* run-time parameters needed by providers. */ apr_hash_t *parameters; + apr_hash_t *slave_parameters; /* run-time credentials cache. */ apr_hash_t *creds_cache; - }; /* Abstracted iteration baton */ @@ -125,6 +125,7 @@ struct svn_auth_iterstate_t const char *realmstring; /* The original realmstring passed in */ const char *cache_key; /* key to use in auth_baton's creds_cache */ svn_auth_baton_t *auth_baton; /* the original auth_baton. */ + apr_hash_t *parameters; }; @@ -142,6 +143,7 @@ svn_auth_open(svn_auth_baton_t **auth_ba ab = apr_pcalloc(pool, sizeof(*ab)); ab->tables = apr_hash_make(pool); ab->parameters = apr_hash_make(pool); + /* ab->slave_parameters = NULL; */ ab->creds_cache = apr_hash_make(pool); ab->pool = pool; @@ -170,7 +172,8 @@ svn_auth_open(svn_auth_baton_t **auth_ba *auth_baton = ab; } - +/* Magic pointer value to allow storing 'NULL' in an apr_hash_t */ +static const void *auth_NULL = NULL; void svn_auth_set_parameter(svn_auth_baton_t *auth_baton, @@ -178,17 +181,35 @@ svn_auth_set_parameter(svn_auth_baton_t const void *value) { if (auth_baton) - svn_hash_sets(auth_baton->parameters, name, value); + { + if (auth_baton->slave_parameters) + { + if (!value) + value = &auth_NULL; + + svn_hash_sets(auth_baton->slave_parameters, name, value); + } + else + svn_hash_sets(auth_baton->parameters, name, value); + } } const void * svn_auth_get_parameter(svn_auth_baton_t *auth_baton, const char *name) { - if (auth_baton) - return svn_hash_gets(auth_baton->parameters, name); - else + const void *value; + if (!auth_baton) return NULL; + else if (!auth_baton->slave_parameters) + return svn_hash_gets(auth_baton->parameters, name); + + value = svn_hash_gets(auth_baton->slave_parameters, name); + + if (value) + return (value == &auth_NULL ? NULL : value); + + return svn_hash_gets(auth_baton->parameters, name); } @@ -218,6 +239,7 @@ svn_auth_first_credentials(void **creden svn_boolean_t got_first = FALSE; svn_auth_iterstate_t *iterstate; const char *cache_key; + apr_hash_t *parameters; if (! auth_baton) return svn_error_create(SVN_ERR_AUTHN_NO_PROVIDER, NULL, @@ -230,6 +252,26 @@ svn_auth_first_credentials(void **creden _("No provider registered for '%s' credentials"), cred_kind); + if (auth_baton->slave_parameters) + { + apr_hash_index_t *hi; + parameters = apr_hash_copy(pool, auth_baton->parameters); + + for (hi = apr_hash_first(pool, auth_baton->slave_parameters); + hi; + hi = apr_hash_next(hi)) + { + const void *value = apr_hash_this_val(hi); + + if (value == &auth_NULL) + value = NULL; + + svn_hash_sets(parameters, apr_hash_this_key(hi), value); + } + } + else + parameters = auth_baton->parameters; + /* First, see if we have cached creds in the auth_baton. */ cache_key = make_cache_key(cred_kind, realmstring, pool); creds = svn_hash_gets(auth_baton->creds_cache, cache_key); @@ -247,7 +289,7 @@ svn_auth_first_credentials(void **creden svn_auth_provider_object_t *); SVN_ERR(provider->vtable->first_credentials(&creds, &iter_baton, provider->provider_baton, - auth_baton->parameters, + parameters, realmstring, auth_baton->pool)); @@ -274,6 +316,7 @@ svn_auth_first_credentials(void **creden iterstate->realmstring = apr_pstrdup(pool, realmstring); iterstate->cache_key = cache_key; iterstate->auth_baton = auth_baton; + iterstate->parameters = parameters; *state = iterstate; /* Put the creds in the cache */ @@ -310,7 +353,7 @@ svn_auth_next_credentials(void **credent { SVN_ERR(provider->vtable->first_credentials( &creds, &(state->provider_iter_baton), - provider->provider_baton, auth_baton->parameters, + provider->provider_baton, state->parameters, state->realmstring, auth_baton->pool)); state->got_first = TRUE; } @@ -319,7 +362,7 @@ svn_auth_next_credentials(void **credent SVN_ERR(provider->vtable->next_credentials(&creds, state->provider_iter_baton, provider->provider_baton, - auth_baton->parameters, + state->parameters, state->realmstring, auth_baton->pool)); } @@ -348,19 +391,17 @@ svn_auth_save_credentials(svn_auth_iters svn_auth_provider_object_t *provider; svn_boolean_t save_succeeded = FALSE; const char *no_auth_cache; - svn_auth_baton_t *auth_baton; void *creds; if (! state || state->table->providers->nelts <= state->provider_idx) return SVN_NO_ERROR; - auth_baton = state->auth_baton; creds = svn_hash_gets(state->auth_baton->creds_cache, state->cache_key); if (! creds) return SVN_NO_ERROR; /* Do not save the creds if SVN_AUTH_PARAM_NO_AUTH_CACHE is set */ - no_auth_cache = svn_hash_gets(auth_baton->parameters, + no_auth_cache = svn_hash_gets(state->parameters, SVN_AUTH_PARAM_NO_AUTH_CACHE); if (no_auth_cache) return SVN_NO_ERROR; @@ -373,7 +414,7 @@ svn_auth_save_credentials(svn_auth_iters SVN_ERR(provider->vtable->save_credentials(&save_succeeded, creds, provider->provider_baton, - auth_baton->parameters, + state->parameters, state->realmstring, pool)); if (save_succeeded) @@ -389,7 +430,7 @@ svn_auth_save_credentials(svn_auth_iters if (provider->vtable->save_credentials) SVN_ERR(provider->vtable->save_credentials(&save_succeeded, creds, provider->provider_baton, - auth_baton->parameters, + state->parameters, state->realmstring, pool)); @@ -687,10 +728,12 @@ svn_auth_get_platform_specific_client_pr } svn_error_t * -svn_auth__apply_config_for_server(svn_auth_baton_t *auth_baton, - apr_hash_t *config, - const char *server_name, - apr_pool_t *scratch_pool) +svn_auth__make_session_auth(svn_auth_baton_t **session_auth_baton, + const svn_auth_baton_t *auth_baton, + apr_hash_t *config, + const char *server_name, + apr_pool_t *result_pool, + apr_pool_t *scratch_pool) { svn_boolean_t store_passwords = SVN_CONFIG_DEFAULT_OPTION_STORE_PASSWORDS; svn_boolean_t store_auth_creds = SVN_CONFIG_DEFAULT_OPTION_STORE_AUTH_CREDS; @@ -702,6 +745,12 @@ svn_auth__apply_config_for_server(svn_au svn_config_t *servers = NULL; const char *server_group = NULL; + struct svn_auth_baton_t *ab; + + ab = apr_pmemdup(result_pool, auth_baton, sizeof(*ab)); + + ab->slave_parameters = apr_hash_make(result_pool); + /* The 'store-passwords' and 'store-auth-creds' parameters used to * live in SVN_CONFIG_CATEGORY_CONFIG. For backward compatibility, * if values for these parameters have already been set by our @@ -716,12 +765,10 @@ svn_auth__apply_config_for_server(svn_au * "store-auth-creds = yes" -- they'll get the expected behaviour. */ - if (svn_auth_get_parameter(auth_baton, - SVN_AUTH_PARAM_DONT_STORE_PASSWORDS) != NULL) + if (svn_auth_get_parameter(ab, SVN_AUTH_PARAM_DONT_STORE_PASSWORDS) != NULL) store_passwords = FALSE; - if (svn_auth_get_parameter(auth_baton, - SVN_AUTH_PARAM_NO_AUTH_CACHE) != NULL) + if (svn_auth_get_parameter(ab, SVN_AUTH_PARAM_NO_AUTH_CACHE) != NULL) store_auth_creds = FALSE; /* All the svn_auth_set_parameter() calls below this not only affect the @@ -806,46 +853,30 @@ svn_auth__apply_config_for_server(svn_au /* Save auth caching parameters in the auth parameter hash. */ if (! store_passwords) - svn_auth_set_parameter(auth_baton, - SVN_AUTH_PARAM_DONT_STORE_PASSWORDS, ""); + svn_auth_set_parameter(ab, SVN_AUTH_PARAM_DONT_STORE_PASSWORDS, ""); - svn_auth_set_parameter(auth_baton, + svn_auth_set_parameter(ab, SVN_AUTH_PARAM_STORE_PLAINTEXT_PASSWORDS, store_plaintext_passwords); if (! store_pp) - svn_auth_set_parameter(auth_baton, + svn_auth_set_parameter(ab, SVN_AUTH_PARAM_DONT_STORE_SSL_CLIENT_CERT_PP, ""); - svn_auth_set_parameter(auth_baton, + svn_auth_set_parameter(ab, SVN_AUTH_PARAM_STORE_SSL_CLIENT_CERT_PP_PLAINTEXT, store_pp_plaintext); if (! store_auth_creds) - svn_auth_set_parameter(auth_baton, - SVN_AUTH_PARAM_NO_AUTH_CACHE, ""); + svn_auth_set_parameter(ab, SVN_AUTH_PARAM_NO_AUTH_CACHE, ""); - /* ### This setting may have huge side-effects when the auth baton is shared - ### between different ra sessions, as it will change which server settings - ### will be used for all future auth requests. - ### - ### E.g. when you connect using a ssl client cert that is specified in the - ### config file, you might have it when you first connect... but if you - ### then connect to another repository, you might not see the same - ### settings when the SSL connection is built up again later on. - ### - ### Most current usages should probably have been keyed on the realm - ### string instead of this magic flag that changes when multiple repositories - ### are used. - ### - ### This especially affects long living ra sessions, such as those on the - ### reuse-ra-session branch. - */ if (server_group) - svn_auth_set_parameter(auth_baton, + svn_auth_set_parameter(ab, SVN_AUTH_PARAM_SERVER_GROUP, - apr_pstrdup(auth_baton->pool, server_group)); + apr_pstrdup(ab->pool, server_group)); + + *session_auth_baton = ab; return SVN_NO_ERROR; } Modified: subversion/branches/fsx-1.10/subversion/libsvn_subr/bit_array.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/libsvn_subr/bit_array.c?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/libsvn_subr/bit_array.c (original) +++ subversion/branches/fsx-1.10/subversion/libsvn_subr/bit_array.c Sun Jun 14 20:58:10 2015 @@ -33,7 +33,7 @@ */ #define BLOCK_SIZE 0x10000 -/* Number of bits in each block. +/* Number of bits in each block. */ #define BLOCK_SIZE_BITS (8 * BLOCK_SIZE) Modified: subversion/branches/fsx-1.10/subversion/libsvn_subr/cache-inprocess.c URL: http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/libsvn_subr/cache-inprocess.c?rev=1685464&r1=1685463&r2=1685464&view=diff ============================================================================== --- subversion/branches/fsx-1.10/subversion/libsvn_subr/cache-inprocess.c (original) +++ subversion/branches/fsx-1.10/subversion/libsvn_subr/cache-inprocess.c Sun Jun 14 20:58:10 2015 @@ -23,8 +23,6 @@ #include -#include - #include "svn_pools.h" #include "svn_private_config.h"