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 1CDBE1009E for ; Sun, 7 Jul 2013 05:07:28 +0000 (UTC) Received: (qmail 50481 invoked by uid 500); 7 Jul 2013 05:07:25 -0000 Delivered-To: apmail-subversion-commits-archive@subversion.apache.org Received: (qmail 50423 invoked by uid 500); 7 Jul 2013 05:07:25 -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 50401 invoked by uid 99); 7 Jul 2013 05:07:19 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 07 Jul 2013 05:07:19 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 07 Jul 2013 05:07:15 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 814D2238899C; Sun, 7 Jul 2013 05:06:55 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1500370 [2/5] - in /subversion/branches/javahl-1.8-extensions: ./ build/ac-macros/ subversion/bindings/javahl/ subversion/bindings/javahl/native/ subversion/bindings/javahl/tests/org/apache/subversion/javahl/ subversion/include/private/ su... Date: Sun, 07 Jul 2013 05:06:51 -0000 To: commits@subversion.apache.org From: brane@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20130707050655.814D2238899C@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Modified: subversion/branches/javahl-1.8-extensions/subversion/libsvn_client/mergeinfo.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/libsvn_client/mergeinfo.c?rev=1500370&r1=1500369&r2=1500370&view=diff ============================================================================== --- subversion/branches/javahl-1.8-extensions/subversion/libsvn_client/mergeinfo.c (original) +++ subversion/branches/javahl-1.8-extensions/subversion/libsvn_client/mergeinfo.c Sun Jul 7 05:06:50 2013 @@ -1651,11 +1651,11 @@ svn_client_mergeinfo_get_merged(apr_hash return SVN_NO_ERROR; } - svn_error_t * -svn_client_mergeinfo_log2(svn_boolean_t finding_merged, +svn_client__mergeinfo_log(svn_boolean_t finding_merged, const char *target_path_or_url, const svn_opt_revision_t *target_peg_revision, + svn_mergeinfo_catalog_t *target_mergeinfo_catalog, const char *source_path_or_url, const svn_opt_revision_t *source_peg_revision, const svn_opt_revision_t *source_start_revision, @@ -1666,12 +1666,15 @@ svn_client_mergeinfo_log2(svn_boolean_t svn_depth_t depth, const apr_array_header_t *revprops, svn_client_ctx_t *ctx, + apr_pool_t *result_pool, apr_pool_t *scratch_pool) { const char *log_target = NULL; const char *repos_root; const char *target_repos_relpath; svn_mergeinfo_catalog_t target_mergeinfo_cat; + svn_ra_session_t *target_session = NULL; + svn_client__pathrev_t *pathrev; /* A hash of paths, at or under TARGET_PATH_OR_URL, mapped to rangelists. Not technically mergeinfo, so not using the @@ -1688,6 +1691,7 @@ svn_client_mergeinfo_log2(svn_boolean_t apr_hash_index_t *hi; apr_pool_t *iterpool; svn_boolean_t oldest_revs_first = TRUE; + apr_pool_t *subpool; /* We currently only support depth = empty | infinity. */ if (depth != svn_depth_infinity && depth != svn_depth_empty) @@ -1713,6 +1717,8 @@ svn_client_mergeinfo_log2(svn_boolean_t && (source_start_revision->kind != svn_opt_revision_unspecified)) return svn_error_create(SVN_ERR_CLIENT_BAD_REVISION, NULL, NULL); + subpool = svn_pool_create(scratch_pool); + /* We need the union of TARGET_PATH_OR_URL@TARGET_PEG_REVISION's mergeinfo and MERGE_SOURCE_URL's history. It's not enough to do path matching, because renames in the history of MERGE_SOURCE_URL @@ -1720,10 +1726,45 @@ svn_client_mergeinfo_log2(svn_boolean_t the target, that vastly simplifies matters (we'll have nothing to do). */ /* This get_mergeinfo() call doubles as a mergeinfo capabilities check. */ - SVN_ERR(get_mergeinfo(&target_mergeinfo_cat, &repos_root, - target_path_or_url, target_peg_revision, - depth == svn_depth_infinity, TRUE, - ctx, scratch_pool, scratch_pool)); + if (target_mergeinfo_catalog) + { + if (*target_mergeinfo_catalog) + { + /* The caller provided the mergeinfo catalog for + TARGET_PATH_OR_URL, so we don't need to accquire + it ourselves. We do need to get the repos_root + though, because get_mergeinfo() won't do it for us. */ + target_mergeinfo_cat = *target_mergeinfo_catalog; + SVN_ERR(svn_client__ra_session_from_path2(&target_session, &pathrev, + target_path_or_url, NULL, + target_peg_revision, + target_peg_revision, + ctx, subpool)); + SVN_ERR(svn_ra_get_repos_root2(target_session, &repos_root, + scratch_pool)); + } + else + { + /* The caller didn't provide the mergeinfo catalog for + TARGET_PATH_OR_URL, but wants us to pass a copy back + when we get it, so use RESULT_POOL. */ + SVN_ERR(get_mergeinfo(target_mergeinfo_catalog, &repos_root, + target_path_or_url, target_peg_revision, + depth == svn_depth_infinity, TRUE, + ctx, result_pool, scratch_pool)); + target_mergeinfo_cat = *target_mergeinfo_catalog; + } + } + else + { + /* The caller didn't provide the mergeinfo catalog for + TARGET_PATH_OR_URL, nor does it want a copy, so we can use + nothing but SCRATCH_POOL. */ + SVN_ERR(get_mergeinfo(&target_mergeinfo_cat, &repos_root, + target_path_or_url, target_peg_revision, + depth == svn_depth_infinity, TRUE, + ctx, scratch_pool, scratch_pool)); + } if (!svn_path_is_url(target_path_or_url)) { @@ -1755,6 +1796,7 @@ svn_client_mergeinfo_log2(svn_boolean_t history. */ if (finding_merged) { + svn_pool_destroy(subpool); return SVN_NO_ERROR; } else @@ -1772,18 +1814,17 @@ svn_client_mergeinfo_log2(svn_boolean_t * ### TODO: As the source and target must be in the same repository, we * should share a single session, tracking the two URLs separately. */ { - apr_pool_t *sesspool = svn_pool_create(scratch_pool); - svn_ra_session_t *source_session, *target_session; - svn_client__pathrev_t *pathrev; + svn_ra_session_t *source_session; svn_revnum_t start_rev, end_rev, youngest_rev = SVN_INVALID_REVNUM; if (! finding_merged) { - SVN_ERR(svn_client__ra_session_from_path2(&target_session, &pathrev, - target_path_or_url, NULL, - target_peg_revision, - target_peg_revision, - ctx, sesspool)); + if (!target_session) + SVN_ERR(svn_client__ra_session_from_path2(&target_session, &pathrev, + target_path_or_url, NULL, + target_peg_revision, + target_peg_revision, + ctx, subpool)); SVN_ERR(svn_client__get_history_as_mergeinfo(&target_history, NULL, pathrev, SVN_INVALID_REVNUM, @@ -1796,17 +1837,17 @@ svn_client_mergeinfo_log2(svn_boolean_t source_path_or_url, NULL, source_peg_revision, source_peg_revision, - ctx, sesspool)); + ctx, subpool)); SVN_ERR(svn_client__get_revision_number(&start_rev, &youngest_rev, ctx->wc_ctx, source_path_or_url, source_session, source_start_revision, - sesspool)); + subpool)); SVN_ERR(svn_client__get_revision_number(&end_rev, &youngest_rev, ctx->wc_ctx, source_path_or_url, source_session, source_end_revision, - sesspool)); + subpool)); SVN_ERR(svn_client__get_history_as_mergeinfo(&source_history, NULL, pathrev, MAX(end_rev, start_rev), @@ -1817,7 +1858,7 @@ svn_client_mergeinfo_log2(svn_boolean_t oldest_revs_first = FALSE; /* Close the source and target sessions. */ - svn_pool_destroy(sesspool); + svn_pool_destroy(subpool); } /* Separate the explicit or inherited mergeinfo on TARGET_PATH_OR_URL, @@ -2090,6 +2131,31 @@ svn_client_mergeinfo_log2(svn_boolean_t } svn_error_t * +svn_client_mergeinfo_log2(svn_boolean_t finding_merged, + const char *target_path_or_url, + const svn_opt_revision_t *target_peg_revision, + const char *source_path_or_url, + const svn_opt_revision_t *source_peg_revision, + const svn_opt_revision_t *source_start_revision, + const svn_opt_revision_t *source_end_revision, + svn_log_entry_receiver_t log_receiver, + void *log_receiver_baton, + svn_boolean_t discover_changed_paths, + svn_depth_t depth, + const apr_array_header_t *revprops, + svn_client_ctx_t *ctx, + apr_pool_t *scratch_pool) +{ + return svn_client__mergeinfo_log(finding_merged, target_path_or_url, + target_peg_revision, NULL, + source_path_or_url, source_peg_revision, + source_start_revision, source_end_revision, + log_receiver, log_receiver_baton, + discover_changed_paths, depth, revprops, + ctx, scratch_pool, scratch_pool); +} + +svn_error_t * svn_client_suggest_merge_sources(apr_array_header_t **suggestions, const char *path_or_url, const svn_opt_revision_t *peg_revision, Modified: subversion/branches/javahl-1.8-extensions/subversion/libsvn_client/ra.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/libsvn_client/ra.c?rev=1500370&r1=1500369&r2=1500370&view=diff ============================================================================== --- subversion/branches/javahl-1.8-extensions/subversion/libsvn_client/ra.c (original) +++ subversion/branches/javahl-1.8-extensions/subversion/libsvn_client/ra.c Sun Jul 7 05:06:50 2013 @@ -862,23 +862,20 @@ svn_client__repos_locations(const char * return SVN_NO_ERROR; } - svn_error_t * -svn_client__get_youngest_common_ancestor(svn_client__pathrev_t **ancestor_p, - const svn_client__pathrev_t *loc1, - const svn_client__pathrev_t *loc2, - svn_ra_session_t *session, - svn_client_ctx_t *ctx, - apr_pool_t *result_pool, - apr_pool_t *scratch_pool) +svn_client__calc_youngest_common_ancestor(svn_client__pathrev_t **ancestor_p, + const svn_client__pathrev_t *loc1, + apr_hash_t *history1, + svn_boolean_t has_rev_zero_history1, + const svn_client__pathrev_t *loc2, + apr_hash_t *history2, + svn_boolean_t has_rev_zero_history2, + apr_pool_t *result_pool, + apr_pool_t *scratch_pool) { - apr_pool_t *sesspool = NULL; - apr_hash_t *history1, *history2; apr_hash_index_t *hi; svn_revnum_t yc_revision = SVN_INVALID_REVNUM; const char *yc_relpath = NULL; - svn_boolean_t has_rev_zero_history1; - svn_boolean_t has_rev_zero_history2; if (strcmp(loc1->repos_root_url, loc2->repos_root_url) != 0) { @@ -886,32 +883,6 @@ svn_client__get_youngest_common_ancestor return SVN_NO_ERROR; } - /* Open an RA session for the two locations. */ - if (session == NULL) - { - sesspool = svn_pool_create(scratch_pool); - SVN_ERR(svn_client_open_ra_session2(&session, loc1->url, NULL, ctx, - sesspool, sesspool)); - } - - /* We're going to cheat and use history-as-mergeinfo because it - saves us a bunch of annoying custom data comparisons and such. */ - SVN_ERR(svn_client__get_history_as_mergeinfo(&history1, - &has_rev_zero_history1, - loc1, - SVN_INVALID_REVNUM, - SVN_INVALID_REVNUM, - session, ctx, scratch_pool)); - SVN_ERR(svn_client__get_history_as_mergeinfo(&history2, - &has_rev_zero_history2, - loc2, - SVN_INVALID_REVNUM, - SVN_INVALID_REVNUM, - session, ctx, scratch_pool)); - /* Close the ra session if we opened one. */ - if (sesspool) - svn_pool_destroy(sesspool); - /* Loop through the first location's history, check for overlapping paths and ranges in the second location's history, and remembering the youngest matching location. */ @@ -965,6 +936,63 @@ svn_client__get_youngest_common_ancestor } svn_error_t * +svn_client__get_youngest_common_ancestor(svn_client__pathrev_t **ancestor_p, + const svn_client__pathrev_t *loc1, + const svn_client__pathrev_t *loc2, + svn_ra_session_t *session, + svn_client_ctx_t *ctx, + apr_pool_t *result_pool, + apr_pool_t *scratch_pool) +{ + apr_pool_t *sesspool = NULL; + apr_hash_t *history1, *history2; + svn_boolean_t has_rev_zero_history1; + svn_boolean_t has_rev_zero_history2; + + if (strcmp(loc1->repos_root_url, loc2->repos_root_url) != 0) + { + *ancestor_p = NULL; + return SVN_NO_ERROR; + } + + /* Open an RA session for the two locations. */ + if (session == NULL) + { + sesspool = svn_pool_create(scratch_pool); + SVN_ERR(svn_client_open_ra_session2(&session, loc1->url, NULL, ctx, + sesspool, sesspool)); + } + + /* We're going to cheat and use history-as-mergeinfo because it + saves us a bunch of annoying custom data comparisons and such. */ + SVN_ERR(svn_client__get_history_as_mergeinfo(&history1, + &has_rev_zero_history1, + loc1, + SVN_INVALID_REVNUM, + SVN_INVALID_REVNUM, + session, ctx, scratch_pool)); + SVN_ERR(svn_client__get_history_as_mergeinfo(&history2, + &has_rev_zero_history2, + loc2, + SVN_INVALID_REVNUM, + SVN_INVALID_REVNUM, + session, ctx, scratch_pool)); + /* Close the ra session if we opened one. */ + if (sesspool) + svn_pool_destroy(sesspool); + + SVN_ERR(svn_client__calc_youngest_common_ancestor(ancestor_p, + loc1, history1, + has_rev_zero_history1, + loc2, history2, + has_rev_zero_history2, + result_pool, + scratch_pool)); + + return SVN_NO_ERROR; +} + +svn_error_t * svn_client__youngest_common_ancestor(const char **ancestor_url, svn_revnum_t *ancestor_rev, const char *path_or_url1, Modified: subversion/branches/javahl-1.8-extensions/subversion/libsvn_delta/compat.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/libsvn_delta/compat.c?rev=1500370&r1=1500369&r2=1500370&view=diff ============================================================================== --- subversion/branches/javahl-1.8-extensions/subversion/libsvn_delta/compat.c (original) +++ subversion/branches/javahl-1.8-extensions/subversion/libsvn_delta/compat.c Sun Jul 7 05:06:50 2013 @@ -1634,11 +1634,14 @@ apply_change(void **dir_baton, change->copyfrom_path, scratch_pool); else - copyfrom_url = change->copyfrom_path; + { + copyfrom_url = change->copyfrom_path; - /* Make this an FS path by prepending "/" */ - if (copyfrom_url[0] != '/') - copyfrom_url = apr_pstrcat(scratch_pool, "/", copyfrom_url, NULL); + /* Make this an FS path by prepending "/" */ + if (copyfrom_url[0] != '/') + copyfrom_url = apr_pstrcat(scratch_pool, "/", + copyfrom_url, NULL); + } copyfrom_rev = change->copyfrom_rev; } Modified: subversion/branches/javahl-1.8-extensions/subversion/libsvn_fs_base/bdb/env.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/libsvn_fs_base/bdb/env.c?rev=1500370&r1=1500369&r2=1500370&view=diff ============================================================================== --- subversion/branches/javahl-1.8-extensions/subversion/libsvn_fs_base/bdb/env.c (original) +++ subversion/branches/javahl-1.8-extensions/subversion/libsvn_fs_base/bdb/env.c Sun Jul 7 05:06:50 2013 @@ -227,7 +227,7 @@ bdb_error_gatherer(const DB_ENV *dbenv, SVN_BDB_ERROR_GATHERER_IGNORE(dbenv); - new_err = svn_error_createf(APR_SUCCESS, NULL, "bdb: %s", msg); + new_err = svn_error_createf(SVN_ERR_FS_BERKELEY_DB, NULL, "bdb: %s", msg); if (error_info->pending_errors) svn_error_compose(error_info->pending_errors, new_err); else Modified: subversion/branches/javahl-1.8-extensions/subversion/libsvn_fs_base/tree.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/libsvn_fs_base/tree.c?rev=1500370&r1=1500369&r2=1500370&view=diff ============================================================================== --- subversion/branches/javahl-1.8-extensions/subversion/libsvn_fs_base/tree.c (original) +++ subversion/branches/javahl-1.8-extensions/subversion/libsvn_fs_base/tree.c Sun Jul 7 05:06:50 2013 @@ -4811,6 +4811,13 @@ base_node_origin_rev(svn_revnum_t *revis prev_location() does below will work. */ path = svn_fs__canonicalize_abspath(path, pool); + /* Special-case the root node (for performance reasons) */ + if (strcmp(path, "/") == 0) + { + *revision = 0; + return SVN_NO_ERROR; + } + /* If we have support for the node-origins table, we'll try to use it. */ if (bfd->format >= SVN_FS_BASE__MIN_NODE_ORIGINS_FORMAT) Modified: subversion/branches/javahl-1.8-extensions/subversion/libsvn_fs_fs/fs_fs.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/libsvn_fs_fs/fs_fs.c?rev=1500370&r1=1500369&r2=1500370&view=diff ============================================================================== --- subversion/branches/javahl-1.8-extensions/subversion/libsvn_fs_fs/fs_fs.c (original) +++ subversion/branches/javahl-1.8-extensions/subversion/libsvn_fs_fs/fs_fs.c Sun Jul 7 05:06:50 2013 @@ -1467,6 +1467,12 @@ delete_revprops_shard(const char *shard_ apr_pool_t *scratch_pool); /* In the filesystem FS, pack all revprop shards up to min_unpacked_rev. + * + * NOTE: Keep the old non-packed shards around until after the format bump. + * Otherwise, re-running upgrade will drop the packed revprop shard but + * have no unpacked data anymore. Call upgrade_cleanup_pack_revprops after + * the bump. + * * Use SCRATCH_POOL for temporary allocations. */ static svn_error_t * @@ -1507,6 +1513,29 @@ upgrade_pack_revprops(svn_fs_t *fs, svn_pool_clear(iterpool); } + svn_pool_destroy(iterpool); + + return SVN_NO_ERROR; +} + +/* In the filesystem FS, remove all non-packed revprop shards up to + * min_unpacked_rev. Use SCRATCH_POOL for temporary allocations. + * See upgrade_pack_revprops for more info. + */ +static svn_error_t * +upgrade_cleanup_pack_revprops(svn_fs_t *fs, + apr_pool_t *scratch_pool) +{ + fs_fs_data_t *ffd = fs->fsap_data; + const char *revprops_shard_path; + apr_int64_t shard; + apr_int64_t first_unpacked_shard + = ffd->min_unpacked_rev / ffd->max_files_per_dir; + + apr_pool_t *iterpool = svn_pool_create(scratch_pool); + const char *revsprops_dir = svn_dirent_join(fs->path, PATH_REVPROPS_DIR, + scratch_pool); + /* delete the non-packed revprops shards afterwards */ for (shard = 0; shard < first_unpacked_shard; ++shard) { @@ -1531,6 +1560,7 @@ upgrade_body(void *baton, apr_pool_t *po int format, max_files_per_dir; const char *format_path = path_format(fs, pool); svn_node_kind_t kind; + svn_boolean_t needs_revprop_shard_cleanup = FALSE; /* Read the FS format number and max-files-per-dir setting. */ SVN_ERR(read_format(&format, &max_files_per_dir, format_path, pool)); @@ -1582,15 +1612,28 @@ upgrade_body(void *baton, apr_pool_t *po if (format < SVN_FS_FS__MIN_PACKED_FORMAT) SVN_ERR(svn_io_file_create(path_min_unpacked_rev(fs, pool), "0\n", pool)); - /* If the file system supports revision packing but not revprop packing, - pack the revprops up to the point that revision data has been packed. */ + /* If the file system supports revision packing but not revprop packing + *and* the FS has been sharded, pack the revprops up to the point that + revision data has been packed. However, keep the non-packed revprop + files around until after the format bump */ if ( format >= SVN_FS_FS__MIN_PACKED_FORMAT - && format < SVN_FS_FS__MIN_PACKED_REVPROP_FORMAT) - SVN_ERR(upgrade_pack_revprops(fs, pool)); + && format < SVN_FS_FS__MIN_PACKED_REVPROP_FORMAT + && max_files_per_dir > 0) + { + needs_revprop_shard_cleanup = TRUE; + SVN_ERR(upgrade_pack_revprops(fs, pool)); + } /* Bump the format file. */ - return write_format(format_path, SVN_FS_FS__FORMAT_NUMBER, max_files_per_dir, - TRUE, pool); + SVN_ERR(write_format(format_path, SVN_FS_FS__FORMAT_NUMBER, + max_files_per_dir, TRUE, pool)); + + /* Now, it is safe to remove the redundant revprop files. */ + if (needs_revprop_shard_cleanup) + SVN_ERR(upgrade_cleanup_pack_revprops(fs, pool)); + + /* Done */ + return SVN_NO_ERROR; } Modified: subversion/branches/javahl-1.8-extensions/subversion/libsvn_fs_fs/tree.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/libsvn_fs_fs/tree.c?rev=1500370&r1=1500369&r2=1500370&view=diff ============================================================================== --- subversion/branches/javahl-1.8-extensions/subversion/libsvn_fs_fs/tree.c (original) +++ subversion/branches/javahl-1.8-extensions/subversion/libsvn_fs_fs/tree.c Sun Jul 7 05:06:50 2013 @@ -3364,6 +3364,14 @@ fs_node_origin_rev(svn_revnum_t *revisio return SVN_NO_ERROR; } + /* The root node always has ID 0, created in revision 0 and will never + use the new-style ID format. */ + if (strcmp(node_id, "0") == 0) + { + *revision = 0; + return SVN_NO_ERROR; + } + /* OK, it's an old-style ID? Maybe it's cached. */ SVN_ERR(svn_fs_fs__get_node_origin(&cached_origin_id, fs, Modified: subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra/ra_loader.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra/ra_loader.c?rev=1500370&r1=1500369&r2=1500370&view=diff ============================================================================== --- subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra/ra_loader.c (original) +++ subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra/ra_loader.c Sun Jul 7 05:06:50 2013 @@ -1030,6 +1030,13 @@ svn_error_t *svn_ra_get_file_revs2(svn_r if (include_merged_revisions) SVN_ERR(svn_ra__assert_mergeinfo_capable_server(session, NULL, pool)); + if (start > end) + SVN_ERR( + svn_ra__assert_capable_server(session, + SVN_RA_CAPABILITY_GET_FILE_REVS_REVERSE, + NULL, + pool)); + err = session->vtable->get_file_revs(session, path, start, end, include_merged_revisions, handler, handler_baton, pool); Modified: subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra/util.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra/util.c?rev=1500370&r1=1500369&r2=1500370&view=diff ============================================================================== --- subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra/util.c (original) +++ subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra/util.c Sun Jul 7 05:06:50 2013 @@ -69,6 +69,31 @@ svn_ra__assert_mergeinfo_capable_server( return SVN_NO_ERROR; } +svn_error_t * +svn_ra__assert_capable_server(svn_ra_session_t *ra_session, + const char *capability, + const char *path_or_url, + apr_pool_t *pool) +{ + if (!strcmp(capability, SVN_RA_CAPABILITY_MERGEINFO)) + return svn_ra__assert_mergeinfo_capable_server(ra_session, path_or_url, + pool); + + else + { + svn_boolean_t has; + SVN_ERR(svn_ra_has_capability(ra_session, &has, capability, pool)); + if (! has) + return svn_error_createf(SVN_ERR_UNSUPPORTED_FEATURE, NULL, + _("The '%s' feature is not supported by '%s'"), + capability, + svn_path_is_url(path_or_url) + ? path_or_url + : svn_dirent_local_style(path_or_url, pool)); + } + return SVN_NO_ERROR; +} + /* Does ERR mean "the current value of the revprop isn't equal to the *OLD_VALUE_P you gave me"? */ Modified: subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/blame.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/blame.c?rev=1500370&r1=1500369&r2=1500370&view=diff ============================================================================== --- subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/blame.c (original) +++ subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/blame.c Sun Jul 7 05:06:50 2013 @@ -366,7 +366,7 @@ svn_ra_serf__get_file_revs(svn_ra_sessio err = svn_ra_serf__context_run_one(handler, pool); err = svn_error_compose_create( - svn_ra_serf__error_on_status(handler->sline.code, + svn_ra_serf__error_on_status(handler->sline, handler->path, handler->location), err); Modified: subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/commit.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/commit.c?rev=1500370&r1=1500369&r2=1500370&view=diff ============================================================================== --- subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/commit.c (original) +++ subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/commit.c Sun Jul 7 05:06:50 2013 @@ -223,7 +223,7 @@ return_response_err(svn_ra_serf__handler /* Try to return one of the standard errors for 301, 404, etc., then look for an error embedded in the response. */ return svn_error_compose_create(svn_ra_serf__error_on_status( - handler->sline.code, + handler->sline, handler->path, handler->location), err); Modified: subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/getdate.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/getdate.c?rev=1500370&r1=1500369&r2=1500370&view=diff ============================================================================== --- subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/getdate.c (original) +++ subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/getdate.c Sun Jul 7 05:06:50 2013 @@ -131,6 +131,7 @@ svn_ra_serf__get_dated_revision(svn_ra_s svn_ra_serf__handler_t *handler; svn_ra_serf__xml_context_t *xmlctx; const char *report_target; + svn_error_t *err; date_ctx = apr_palloc(pool, sizeof(*date_ctx)); date_ctx->time = tm; @@ -155,7 +156,15 @@ svn_ra_serf__get_dated_revision(svn_ra_s *date_ctx->revision = SVN_INVALID_REVNUM; - /* ### use svn_ra_serf__error_on_status() ? */ + err = svn_ra_serf__context_run_one(handler, pool); - return svn_error_trace(svn_ra_serf__context_run_one(handler, pool)); + SVN_ERR(svn_error_compose_create( + svn_ra_serf__error_on_status(handler->sline, + report_target, + handler->location), + err)); + + SVN_ERR_ASSERT(SVN_IS_VALID_REVNUM(*revision)); + + return SVN_NO_ERROR; } Modified: subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/getlocations.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/getlocations.c?rev=1500370&r1=1500369&r2=1500370&view=diff ============================================================================== --- subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/getlocations.c (original) +++ subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/getlocations.c Sun Jul 7 05:06:50 2013 @@ -192,7 +192,7 @@ svn_ra_serf__get_locations(svn_ra_sessio err = svn_ra_serf__context_run_one(handler, pool); SVN_ERR(svn_error_compose_create( - svn_ra_serf__error_on_status(handler->sline.code, + svn_ra_serf__error_on_status(handler->sline, req_url, handler->location), err)); Modified: subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/getlocationsegments.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/getlocationsegments.c?rev=1500370&r1=1500369&r2=1500370&view=diff ============================================================================== --- subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/getlocationsegments.c (original) +++ subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/getlocationsegments.c Sun Jul 7 05:06:50 2013 @@ -194,7 +194,7 @@ svn_ra_serf__get_location_segments(svn_r err = svn_ra_serf__context_run_one(handler, pool); err = svn_error_compose_create( - svn_ra_serf__error_on_status(handler->sline.code, + svn_ra_serf__error_on_status(handler->sline, handler->path, handler->location), err); Modified: subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/getlocks.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/getlocks.c?rev=1500370&r1=1500369&r2=1500370&view=diff ============================================================================== --- subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/getlocks.c (original) +++ subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/getlocks.c Sun Jul 7 05:06:50 2013 @@ -266,7 +266,7 @@ svn_ra_serf__get_locks(svn_ra_session_t have existed earlier (E.g. 'svn ls http://s/svn/trunk/file@1' */ if (handler->sline.code != 404) { - SVN_ERR(svn_ra_serf__error_on_status(handler->sline.code, + SVN_ERR(svn_ra_serf__error_on_status(handler->sline, handler->path, handler->location)); } Modified: subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/inherited_props.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/inherited_props.c?rev=1500370&r1=1500369&r2=1500370&view=diff ============================================================================== --- subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/inherited_props.c (original) +++ subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/inherited_props.c Sun Jul 7 05:06:50 2013 @@ -332,7 +332,7 @@ svn_ra_serf__get_inherited_props(svn_ra_ err = svn_ra_serf__context_run_one(handler, scratch_pool); SVN_ERR(svn_error_compose_create( - svn_ra_serf__error_on_status(handler->sline.code, + svn_ra_serf__error_on_status(handler->sline, handler->path, handler->location), err)); Modified: subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/log.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/log.c?rev=1500370&r1=1500369&r2=1500370&view=diff ============================================================================== --- subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/log.c (original) +++ subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/log.c Sun Jul 7 05:06:50 2013 @@ -595,7 +595,7 @@ svn_ra_serf__get_log(svn_ra_session_t *r err = svn_ra_serf__context_run_one(handler, pool); SVN_ERR(svn_error_compose_create( - svn_ra_serf__error_on_status(handler->sline.code, + svn_ra_serf__error_on_status(handler->sline, req_url, handler->location), err)); Modified: subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/mergeinfo.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/mergeinfo.c?rev=1500370&r1=1500369&r2=1500370&view=diff ============================================================================== --- subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/mergeinfo.c (original) +++ subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/mergeinfo.c Sun Jul 7 05:06:50 2013 @@ -191,7 +191,7 @@ svn_ra_serf__get_mergeinfo(svn_ra_sessio svn_boolean_t include_descendants, apr_pool_t *pool) { - svn_error_t *err, *err2; + svn_error_t *err; mergeinfo_context_t *mergeinfo_ctx; svn_ra_serf__session_t *session = ra_session->priv; svn_ra_serf__handler_t *handler; @@ -229,15 +229,10 @@ svn_ra_serf__get_mergeinfo(svn_ra_sessio err = svn_ra_serf__context_run_one(handler, pool); - err2 = svn_ra_serf__error_on_status(handler->sline.code, handler->path, - handler->location); - if (err2) - { - svn_error_clear(err); - return err2; - } - - SVN_ERR(err); + SVN_ERR(svn_error_compose_create( + svn_ra_serf__error_on_status(handler->sline, handler->path, + handler->location), + err)); if (handler->done && apr_hash_count(mergeinfo_ctx->result_catalog)) *catalog = mergeinfo_ctx->result_catalog; Modified: subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/options.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/options.c?rev=1500370&r1=1500369&r2=1500370&view=diff ============================================================================== --- subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/options.c (original) +++ subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/options.c Sun Jul 7 05:06:50 2013 @@ -362,6 +362,8 @@ options_response_handler(serf_request_t capability_no); svn_hash_sets(session->capabilities, SVN_RA_CAPABILITY_EPHEMERAL_TXNPROPS, capability_no); + svn_hash_sets(session->capabilities, SVN_RA_CAPABILITY_GET_FILE_REVS_REVERSE, + capability_no); /* Then see which ones we can discover. */ serf_bucket_headers_do(hdrs, capabilities_headers_iterator_callback, @@ -436,11 +438,12 @@ svn_ra_serf__v2_get_youngest_revnum(svn_ SVN_ERR(create_options_req(&opt_ctx, session, conn, scratch_pool)); SVN_ERR(svn_ra_serf__context_run_one(opt_ctx->handler, scratch_pool)); - SVN_ERR(svn_ra_serf__error_on_status(opt_ctx->handler->sline.code, + SVN_ERR(svn_ra_serf__error_on_status(opt_ctx->handler->sline, opt_ctx->handler->path, opt_ctx->handler->location)); *youngest = opt_ctx->youngest_rev; + SVN_ERR_ASSERT(SVN_IS_VALID_REVNUM(*youngest)); return SVN_NO_ERROR; } @@ -460,7 +463,7 @@ svn_ra_serf__v1_get_activity_collection( SVN_ERR(create_options_req(&opt_ctx, session, conn, scratch_pool)); SVN_ERR(svn_ra_serf__context_run_one(opt_ctx->handler, scratch_pool)); - SVN_ERR(svn_ra_serf__error_on_status(opt_ctx->handler->sline.code, + SVN_ERR(svn_ra_serf__error_on_status(opt_ctx->handler->sline, opt_ctx->handler->path, opt_ctx->handler->location)); @@ -499,7 +502,7 @@ svn_ra_serf__exchange_capabilities(svn_r } SVN_ERR(svn_error_compose_create( - svn_ra_serf__error_on_status(opt_ctx->handler->sline.code, + svn_ra_serf__error_on_status(opt_ctx->handler->sline, serf_sess->session_url.path, opt_ctx->handler->location), err)); Modified: subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/property.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/property.c?rev=1500370&r1=1500369&r2=1500370&view=diff ============================================================================== --- subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/property.c (original) +++ subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/property.c Sun Jul 7 05:06:50 2013 @@ -635,7 +635,7 @@ svn_ra_serf__wait_for_props(svn_ra_serf_ err = svn_ra_serf__context_run_one(handler, scratch_pool); - err2 = svn_ra_serf__error_on_status(handler->sline.code, + err2 = svn_ra_serf__error_on_status(handler->sline, handler->path, handler->location); Modified: subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/ra_serf.h URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/ra_serf.h?rev=1500370&r1=1500369&r2=1500370&view=diff ============================================================================== --- subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/ra_serf.h (original) +++ subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/ra_serf.h Sun Jul 7 05:06:50 2013 @@ -1744,7 +1744,7 @@ svn_ra_serf__credentials_callback(char * * where it necessary. */ svn_error_t * -svn_ra_serf__error_on_status(int status_code, +svn_ra_serf__error_on_status(serf_status_line sline, const char *path, const char *location); Modified: subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/replay.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/replay.c?rev=1500370&r1=1500369&r2=1500370&view=diff ============================================================================== --- subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/replay.c (original) +++ subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/replay.c Sun Jul 7 05:06:50 2013 @@ -696,7 +696,7 @@ svn_ra_serf__replay(svn_ra_session_t *ra err = svn_ra_serf__context_run_wait(&replay_ctx->done, session, pool); SVN_ERR(svn_error_compose_create( - svn_ra_serf__error_on_status(handler->sline.code, + svn_ra_serf__error_on_status(handler->sline, handler->path, handler->location), err)); @@ -905,7 +905,7 @@ svn_ra_serf__replay_range(svn_ra_session svn_ra_serf__handler_t *done_handler = ctx->report_handler; done_list = done_list->next; - SVN_ERR(svn_ra_serf__error_on_status(done_handler->sline.code, + SVN_ERR(svn_ra_serf__error_on_status(done_handler->sline, done_handler->path, done_handler->location)); svn_pool_destroy(ctx->src_rev_pool); Modified: subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/serf.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/serf.c?rev=1500370&r1=1500369&r2=1500370&view=diff ============================================================================== --- subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/serf.c (original) +++ subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/serf.c Sun Jul 7 05:06:50 2013 @@ -392,6 +392,7 @@ svn_ra_serf__open(svn_ra_session_t *sess svn_ra_serf__session_t *serf_sess; apr_uri_t url; const char *client_string = NULL; + svn_error_t *err; if (corrected_url) *corrected_url = NULL; @@ -479,7 +480,14 @@ svn_ra_serf__open(svn_ra_session_t *sess session->priv = serf_sess; - return svn_ra_serf__exchange_capabilities(serf_sess, corrected_url, pool); + err = svn_ra_serf__exchange_capabilities(serf_sess, corrected_url, pool); + + /* serf should produce a usable error code instead of APR_EGENERAL */ + if (err && err->apr_err == APR_EGENERAL) + err = svn_error_createf(SVN_ERR_RA_DAV_REQUEST_FAILED, err, + _("Connection to '%s' failed"), session_URL); + + return svn_error_trace(err); } /* Implements svn_ra__vtable_t.reparent(). */ Modified: subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/update.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/update.c?rev=1500370&r1=1500369&r2=1500370&view=diff ============================================================================== --- subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/update.c (original) +++ subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/update.c Sun Jul 7 05:06:50 2013 @@ -1268,7 +1268,7 @@ handle_stream(serf_request_t *request, /* ### new field. make sure we didn't miss some initialization. */ SVN_ERR_ASSERT(fetch_ctx->handler != NULL); - err = svn_ra_serf__error_on_status(fetch_ctx->handler->sline.code, + err = svn_ra_serf__error_on_status(fetch_ctx->handler->sline, fetch_ctx->info->name, fetch_ctx->handler->location); if (err) @@ -2739,7 +2739,7 @@ setup_update_report_headers(serf_bucket_ if (report->sess->using_compression) { serf_bucket_headers_setn(headers, "Accept-Encoding", - "gzip;svndiff1;q=0.9,svndiff;q=0.8"); + "gzip,svndiff1;q=0.9,svndiff;q=0.8"); } else { @@ -2891,7 +2891,7 @@ finish_report(void *report_baton, { return svn_error_trace( svn_error_compose_create( - svn_ra_serf__error_on_status(handler->sline.code, + svn_ra_serf__error_on_status(handler->sline, handler->path, handler->location), err)); Modified: subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/util.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/util.c?rev=1500370&r1=1500369&r2=1500370&view=diff ============================================================================== --- subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/util.c (original) +++ subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_serf/util.c Sun Jul 7 05:06:50 2013 @@ -2390,17 +2390,17 @@ svn_ra_serf__report_resource(const char } svn_error_t * -svn_ra_serf__error_on_status(int status_code, +svn_ra_serf__error_on_status(serf_status_line sline, const char *path, const char *location) { - switch(status_code) + switch(sline.code) { case 301: case 302: case 307: return svn_error_createf(SVN_ERR_RA_DAV_RELOCATED, NULL, - (status_code == 301) + (sline.code == 301) ? _("Repository moved permanently to '%s';" " please relocate") : _("Repository moved temporarily to '%s';" @@ -2415,8 +2415,18 @@ svn_ra_serf__error_on_status(int status_ case 423: return svn_error_createf(SVN_ERR_FS_NO_LOCK_TOKEN, NULL, _("'%s': no lock token available"), path); + + case 411: + return svn_error_createf(SVN_ERR_RA_DAV_REQUEST_FAILED, NULL, + _("DAV request failed: " + "Content length required")); } + if (sline.code >= 300) + return svn_error_createf(SVN_ERR_RA_DAV_REQUEST_FAILED, NULL, + _("Unexpected HTTP status %d '%s' on '%s'\n"), + sline.code, sline.reason, path); + return SVN_NO_ERROR; } Modified: subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_svn/client.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_svn/client.c?rev=1500370&r1=1500369&r2=1500370&view=diff ============================================================================== --- subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_svn/client.c (original) +++ subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_svn/client.c Sun Jul 7 05:06:50 2013 @@ -977,6 +977,28 @@ static svn_error_t *ra_svn_commit(svn_ra const svn_string_t *log_msg = svn_hash_gets(revprop_table, SVN_PROP_REVISION_LOG); + if (log_msg == NULL && + ! svn_ra_svn_has_capability(conn, SVN_RA_SVN_CAP_COMMIT_REVPROPS)) + { + return svn_error_createf(SVN_ERR_BAD_PROPERTY_VALUE, NULL, + _("ra_svn does not support not specifying " + "a log message with pre-1.5 servers; " + "consider passing an empty one, or upgrading " + "the server")); + } + else if (log_msg == NULL) + /* 1.5+ server. Set LOG_MSG to something, since the 'logmsg' argument + to the 'commit' protocol command is non-optional; on the server side, + only REVPROP_TABLE will be used, and LOG_MSG will be ignored. The + "svn:log" member of REVPROP_TABLE table is NULL, therefore the commit + will have a NULL log message (not just "", really NULL). + + svnserve 1.5.x+ has always ignored LOG_MSG when REVPROP_TABLE was + present; this was elevated to a protocol promise in r1498550 (and + later documented in this comment) in order to fix the segmentation + fault bug described in the log message of r1498550.*/ + log_msg = svn_string_create("", pool); + /* If we're sending revprops other than svn:log, make sure the server won't silently ignore them. */ if (apr_hash_count(revprop_table) > 1 && Modified: subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_svn/protocol URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_svn/protocol?rev=1500370&r1=1500369&r2=1500370&view=diff ============================================================================== --- subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_svn/protocol (original) +++ subversion/branches/javahl-1.8-extensions/subversion/libsvn_ra_svn/protocol Sun Jul 7 05:06:50 2013 @@ -294,8 +294,12 @@ second place for auth-request point as n Upon receiving response, client switches to editor command set. Upon successful completion of edit, server sends auth-request. After auth exchange completes, server sends commit-info. + If rev-props is present, logmsg is ignored. Only the svn:log entry in + rev-props (if any) will be used. commit-info: ( new-rev:number date:string author:string ? ( post-commit-err:string ) ) + NOTE: when revving this, make 'logmsg' optional, or delete that parameter + and have the log message specified in 'rev-props'. get-file params: ( path:string [ rev:number ] want-props:bool want-contents:bool Modified: subversion/branches/javahl-1.8-extensions/subversion/libsvn_repos/fs-wrap.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/libsvn_repos/fs-wrap.c?rev=1500370&r1=1500369&r2=1500370&view=diff ============================================================================== --- subversion/branches/javahl-1.8-extensions/subversion/libsvn_repos/fs-wrap.c (original) +++ subversion/branches/javahl-1.8-extensions/subversion/libsvn_repos/fs-wrap.c Sun Jul 7 05:06:50 2013 @@ -172,6 +172,10 @@ svn_repos__validate_prop(const char *nam { svn_prop_kind_t kind = svn_property_kind2(name); + /* Allow deleting any property, even a property we don't allow to set. */ + if (value == NULL) + return SVN_NO_ERROR; + /* Disallow setting non-regular properties. */ if (kind != svn_prop_regular_kind) return svn_error_createf Modified: subversion/branches/javahl-1.8-extensions/subversion/libsvn_subr/named_atomic.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/libsvn_subr/named_atomic.c?rev=1500370&r1=1500369&r2=1500370&view=diff ============================================================================== --- subversion/branches/javahl-1.8-extensions/subversion/libsvn_subr/named_atomic.c (original) +++ subversion/branches/javahl-1.8-extensions/subversion/libsvn_subr/named_atomic.c Sun Jul 7 05:06:50 2013 @@ -251,6 +251,7 @@ struct svn_atomic_namespace__t */ static svn_mutex__t *thread_mutex = NULL; +#if APR_HAS_MMAP /* Initialization flag for the above used by svn_atomic__init_once. */ static volatile svn_atomic_t mutex_initialized = FALSE; @@ -266,6 +267,7 @@ init_thread_mutex(void *baton, apr_pool_ return svn_mutex__init(&thread_mutex, USE_THREAD_MUTEX, global_pool); } +#endif /* APR_HAS_MMAP */ /* Utility that acquires our global mutex and converts error types. */ @@ -297,6 +299,7 @@ unlock(struct mutex_t *mutex, svn_error_ unlock_err)); } +#if APR_HAS_MMAP /* The last user to close a particular namespace should also remove the * lock file. Failure to do so, however, does not affect further uses * of the same namespace. @@ -318,6 +321,7 @@ delete_lock_file(void *arg) return status; } +#endif /* APR_HAS_MMAP */ /* Validate the ATOMIC parameter, i.e it's address. Correct code will * never need this but if someone should accidentally to use a NULL or @@ -351,7 +355,11 @@ return_atomic(svn_named_atomic__t **atom svn_boolean_t svn_named_atomic__is_supported(void) { -#ifdef _WIN32 +#if !APR_HAS_MMAP + return FALSE; +#elif !defined(_WIN32) + return TRUE; +#else static svn_tristate_t result = svn_tristate_unknown; if (result == svn_tristate_unknown) @@ -373,9 +381,7 @@ svn_named_atomic__is_supported(void) } return result == svn_tristate_true; -#else - return TRUE; -#endif +#endif /* _WIN32 */ } svn_boolean_t @@ -389,6 +395,9 @@ svn_atomic_namespace__create(svn_atomic_ const char *name, apr_pool_t *result_pool) { +#if !APR_HAS_MMAP + return svn_error_create(APR_ENOTIMPL, NULL, NULL); +#else apr_status_t apr_err; svn_error_t *err; apr_file_t *file; @@ -489,6 +498,7 @@ svn_atomic_namespace__create(svn_atomic_ /* Unlock to allow other processes may access the shared memory as well. */ return unlock(&new_ns->mutex, err); +#endif /* APR_HAS_MMAP */ } svn_error_t * Modified: subversion/branches/javahl-1.8-extensions/subversion/libsvn_subr/sqlite.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/libsvn_subr/sqlite.c?rev=1500370&r1=1500369&r2=1500370&view=diff ============================================================================== --- subversion/branches/javahl-1.8-extensions/subversion/libsvn_subr/sqlite.c (original) +++ subversion/branches/javahl-1.8-extensions/subversion/libsvn_subr/sqlite.c Sun Jul 7 05:06:50 2013 @@ -140,9 +140,9 @@ struct svn_sqlite__value_t int sqlite_err__temp = (x); \ if (sqlite_err__temp != SQLITE_OK) \ return svn_error_createf(SQLITE_ERROR_CODE(sqlite_err__temp), \ - NULL, "sqlite: %s (S%d)", \ - sqlite3_errmsg((db)->db3), \ - sqlite_err__temp); \ + NULL, "sqlite[S%d]: %s", \ + sqlite_err__temp, \ + sqlite3_errmsg((db)->db3)); \ } while (0) #define SQLITE_ERR_MSG(x, msg) do \ @@ -150,8 +150,8 @@ struct svn_sqlite__value_t int sqlite_err__temp = (x); \ if (sqlite_err__temp != SQLITE_OK) \ return svn_error_createf(SQLITE_ERROR_CODE(sqlite_err__temp), \ - NULL, "sqlite: %s (S%d)", (msg), \ - sqlite_err__temp); \ + NULL, "sqlite[S%d]: %s", \ + sqlite_err__temp, msg); \ } while (0) @@ -173,9 +173,9 @@ exec_sql2(svn_sqlite__db_t *db, const ch if (sqlite_err != SQLITE_OK && sqlite_err != ignored_err) { svn_error_t *err = svn_error_createf(SQLITE_ERROR_CODE(sqlite_err), NULL, - _("sqlite: %s (S%d)," + _("sqlite[S%d]: %s," " executing statement '%s'"), - err_msg, sqlite_err, sql); + sqlite_err, err_msg, sql); sqlite3_free(err_msg); return err; } @@ -292,8 +292,8 @@ svn_sqlite__step(svn_boolean_t *got_row, svn_error_t *err1, *err2; err1 = svn_error_createf(SQLITE_ERROR_CODE(sqlite_result), NULL, - "sqlite: %s (S%d)", - sqlite3_errmsg(stmt->db->db3), sqlite_result); + "sqlite[S%d]: %s", + sqlite_result, sqlite3_errmsg(stmt->db->db3)); err2 = svn_sqlite__reset(stmt); return svn_error_compose_create(err1, err2); } @@ -744,7 +744,7 @@ init_sqlite(void *baton, apr_pool_t *poo int err = sqlite3_config(SQLITE_CONFIG_MULTITHREAD); if (err != SQLITE_OK && err != SQLITE_MISUSE) return svn_error_createf(SQLITE_ERROR_CODE(err), NULL, - _("Could not configure SQLite (S%d)"), err); + _("Could not configure SQLite [S%d]"), err); } SQLITE_ERR_MSG(sqlite3_initialize(), _("Could not initialize SQLite")); Modified: subversion/branches/javahl-1.8-extensions/subversion/libsvn_subr/stream.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/libsvn_subr/stream.c?rev=1500370&r1=1500369&r2=1500370&view=diff ============================================================================== --- subversion/branches/javahl-1.8-extensions/subversion/libsvn_subr/stream.c (original) +++ subversion/branches/javahl-1.8-extensions/subversion/libsvn_subr/stream.c Sun Jul 7 05:06:50 2013 @@ -56,6 +56,7 @@ struct svn_stream_t { svn_stream_mark_fn_t mark_fn; svn_stream_seek_fn_t seek_fn; svn_stream__is_buffered_fn_t is_buffered_fn; + apr_file_t *file; /* Maybe NULL */ }; @@ -81,6 +82,7 @@ svn_stream_create(void *baton, apr_pool_ stream->mark_fn = NULL; stream->seek_fn = NULL; stream->is_buffered_fn = NULL; + stream->file = NULL; return stream; } @@ -913,6 +915,7 @@ svn_stream_from_aprfile2(apr_file_t *fil svn_stream_set_mark(stream, mark_handler_apr); svn_stream_set_seek(stream, seek_handler_apr); svn_stream__set_is_buffered(stream, is_buffered_handler_apr); + stream->file = file; if (! disown) svn_stream_set_close(stream, close_handler_apr); @@ -920,6 +923,12 @@ svn_stream_from_aprfile2(apr_file_t *fil return stream; } +apr_file_t * +svn_stream__aprfile(svn_stream_t *stream) +{ + return stream->file; +} + /* Compressed stream support */ Modified: subversion/branches/javahl-1.8-extensions/subversion/libsvn_wc/update_editor.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/libsvn_wc/update_editor.c?rev=1500370&r1=1500369&r2=1500370&view=diff ============================================================================== --- subversion/branches/javahl-1.8-extensions/subversion/libsvn_wc/update_editor.c (original) +++ subversion/branches/javahl-1.8-extensions/subversion/libsvn_wc/update_editor.c Sun Jul 7 05:06:50 2013 @@ -2907,7 +2907,7 @@ close_directory(void *dir_baton, eb->conflict_func, eb->conflict_baton, eb->cancel_func, - eb->conflict_baton, + eb->cancel_baton, scratch_pool)); /* Notify of any prop changes on this directory -- but do nothing if Modified: subversion/branches/javahl-1.8-extensions/subversion/libsvn_wc/upgrade.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/libsvn_wc/upgrade.c?rev=1500370&r1=1500369&r2=1500370&view=diff ============================================================================== --- subversion/branches/javahl-1.8-extensions/subversion/libsvn_wc/upgrade.c (original) +++ subversion/branches/javahl-1.8-extensions/subversion/libsvn_wc/upgrade.c Sun Jul 7 05:06:50 2013 @@ -2196,13 +2196,15 @@ svn_wc_upgrade(svn_wc_context_t *wc_ctx, upgrade_working_copy_baton_t cb_baton; svn_error_t *err; int result_format; + svn_boolean_t bumped_format; /* Try upgrading a wc-ng-style working copy. */ SVN_ERR(svn_wc__db_open(&db, NULL /* ### config */, TRUE, FALSE, scratch_pool, scratch_pool)); - err = svn_wc__db_bump_format(&result_format, local_abspath, db, + err = svn_wc__db_bump_format(&result_format, &bumped_format, + db, local_abspath, scratch_pool); if (err) { @@ -2224,6 +2226,17 @@ svn_wc_upgrade(svn_wc_context_t *wc_ctx, SVN_ERR_ASSERT(result_format == SVN_WC__VERSION); + if (bumped_format && notify_func) + { + svn_wc_notify_t *notify; + + notify = svn_wc_create_notify(local_abspath, + svn_wc_notify_upgraded_path, + scratch_pool); + + notify_func(notify_baton, notify, scratch_pool); + } + return SVN_NO_ERROR; } Modified: subversion/branches/javahl-1.8-extensions/subversion/libsvn_wc/wc_db.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/libsvn_wc/wc_db.c?rev=1500370&r1=1500369&r2=1500370&view=diff ============================================================================== --- subversion/branches/javahl-1.8-extensions/subversion/libsvn_wc/wc_db.c (original) +++ subversion/branches/javahl-1.8-extensions/subversion/libsvn_wc/wc_db.c Sun Jul 7 05:06:50 2013 @@ -14978,14 +14978,18 @@ svn_wc__db_verify(svn_wc__db_t *db, svn_error_t * svn_wc__db_bump_format(int *result_format, - const char *wcroot_abspath, + svn_boolean_t *bumped_format, svn_wc__db_t *db, + const char *wcroot_abspath, apr_pool_t *scratch_pool) { svn_sqlite__db_t *sdb; svn_error_t *err; int format; + if (bumped_format) + *bumped_format = FALSE; + /* Do not scan upwards for a working copy root here to prevent accidental * upgrades of any working copies the WCROOT might be nested in. * Just try to open a DB at the specified path instead. */ @@ -15020,7 +15024,10 @@ svn_wc__db_bump_format(int *result_forma SVN_ERR(svn_sqlite__read_schema_version(&format, sdb, scratch_pool)); err = svn_wc__upgrade_sdb(result_format, wcroot_abspath, - sdb, format, scratch_pool); + sdb, format, scratch_pool); + + if (err == SVN_NO_ERROR && bumped_format) + *bumped_format = (*result_format > format); /* Make sure we return a different error than expected for upgrades from entries */ Modified: subversion/branches/javahl-1.8-extensions/subversion/libsvn_wc/wc_db.h URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/libsvn_wc/wc_db.h?rev=1500370&r1=1500369&r2=1500370&view=diff ============================================================================== --- subversion/branches/javahl-1.8-extensions/subversion/libsvn_wc/wc_db.h (original) +++ subversion/branches/javahl-1.8-extensions/subversion/libsvn_wc/wc_db.h Sun Jul 7 05:06:50 2013 @@ -2909,11 +2909,15 @@ svn_wc__db_upgrade_get_repos_id(apr_int6 * Upgrading subdirectories of a working copy is not supported. * If WCROOT_ABSPATH is not a working copy root SVN_ERR_WC_INVALID_OP_ON_CWD * is returned. + * + * If BUMPED_FORMAT is not NULL, set *BUMPED_FORMAT to TRUE if the format + * was bumped or to FALSE if the wc was already at the resulting format. */ svn_error_t * svn_wc__db_bump_format(int *result_format, - const char *wcroot_abspath, + svn_boolean_t *bumped_format, svn_wc__db_t *db, + const char *wcroot_abspath, apr_pool_t *scratch_pool); /* @} */ Modified: subversion/branches/javahl-1.8-extensions/subversion/libsvn_wc/wc_db_update_move.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/libsvn_wc/wc_db_update_move.c?rev=1500370&r1=1500369&r2=1500370&view=diff ============================================================================== --- subversion/branches/javahl-1.8-extensions/subversion/libsvn_wc/wc_db_update_move.c (original) +++ subversion/branches/javahl-1.8-extensions/subversion/libsvn_wc/wc_db_update_move.c Sun Jul 7 05:06:50 2013 @@ -1988,8 +1988,12 @@ svn_wc__db_update_moved_away_conflict_vi /* Send all queued up notifications. */ SVN_ERR(svn_wc__db_update_move_list_notify(wcroot, - old_version->peg_rev, - new_version->peg_rev, + (old_version + ? old_version->peg_rev + : SVN_INVALID_REVNUM), + (new_version + ? new_version->peg_rev + : SVN_INVALID_REVNUM), notify_func, notify_baton, scratch_pool)); if (notify_func) @@ -2395,7 +2399,9 @@ svn_wc__db_resolve_delete_raise_moved_aw wcroot); SVN_ERR(svn_wc__db_update_move_list_notify(wcroot, - old_version->peg_rev, + (old_version + ? old_version->peg_rev + : SVN_INVALID_REVNUM), (new_version ? new_version->peg_rev : SVN_INVALID_REVNUM), Modified: subversion/branches/javahl-1.8-extensions/subversion/mod_dav_svn/lock.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/mod_dav_svn/lock.c?rev=1500370&r1=1500369&r2=1500370&view=diff ============================================================================== --- subversion/branches/javahl-1.8-extensions/subversion/mod_dav_svn/lock.c (original) +++ subversion/branches/javahl-1.8-extensions/subversion/mod_dav_svn/lock.c Sun Jul 7 05:06:50 2013 @@ -647,7 +647,7 @@ append_locks(dav_lockdb *lockdb, /* We don't allow anonymous locks */ if (! repos->username) - return dav_svn__new_error(resource->pool, HTTP_UNAUTHORIZED, + return dav_svn__new_error(resource->pool, HTTP_NOT_IMPLEMENTED, DAV_ERR_LOCK_SAVE_LOCK, "Anonymous lock creation is not allowed."); @@ -776,7 +776,7 @@ append_locks(dav_lockdb *lockdb, if (serr && serr->apr_err == SVN_ERR_FS_NO_USER) { svn_error_clear(serr); - return dav_svn__new_error(resource->pool, HTTP_UNAUTHORIZED, + return dav_svn__new_error(resource->pool, HTTP_NOT_IMPLEMENTED, DAV_ERR_LOCK_SAVE_LOCK, "Anonymous lock creation is not allowed."); } @@ -886,7 +886,7 @@ remove_lock(dav_lockdb *lockdb, if (serr && serr->apr_err == SVN_ERR_FS_NO_USER) { svn_error_clear(serr); - return dav_svn__new_error(resource->pool, HTTP_UNAUTHORIZED, + return dav_svn__new_error(resource->pool, HTTP_NOT_IMPLEMENTED, DAV_ERR_LOCK_SAVE_LOCK, "Anonymous lock removal is not allowed."); } @@ -953,7 +953,7 @@ refresh_locks(dav_lockdb *lockdb, current lock on the incoming resource? */ if ((! slock) || (strcmp(token->uuid_str, slock->token) != 0)) - return dav_svn__new_error(resource->pool, HTTP_UNAUTHORIZED, + return dav_svn__new_error(resource->pool, HTTP_PRECONDITION_FAILED, DAV_ERR_LOCK_SAVE_LOCK, "Lock refresh request doesn't match existing " "lock."); @@ -974,7 +974,7 @@ refresh_locks(dav_lockdb *lockdb, if (serr && serr->apr_err == SVN_ERR_FS_NO_USER) { svn_error_clear(serr); - return dav_svn__new_error(resource->pool, HTTP_UNAUTHORIZED, + return dav_svn__new_error(resource->pool, HTTP_NOT_IMPLEMENTED, DAV_ERR_LOCK_SAVE_LOCK, "Anonymous lock refreshing is not allowed."); } Modified: subversion/branches/javahl-1.8-extensions/subversion/mod_dav_svn/version.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/mod_dav_svn/version.c?rev=1500370&r1=1500369&r2=1500370&view=diff ============================================================================== --- subversion/branches/javahl-1.8-extensions/subversion/mod_dav_svn/version.c (original) +++ subversion/branches/javahl-1.8-extensions/subversion/mod_dav_svn/version.c Sun Jul 7 05:06:50 2013 @@ -1033,8 +1033,11 @@ dav_svn__checkin(dav_resource *resource, if (serr) { + int status; + if (serr->apr_err == SVN_ERR_FS_CONFLICT) { + status = HTTP_CONFLICT; msg = apr_psprintf(resource->pool, "A conflict occurred during the CHECKIN " "processing. The problem occurred with " @@ -1042,10 +1045,12 @@ dav_svn__checkin(dav_resource *resource, conflict_msg); } else - msg = "An error occurred while committing the transaction."; + { + status = HTTP_INTERNAL_SERVER_ERROR; + msg = "An error occurred while committing the transaction."; + } - return dav_svn__convert_err(serr, HTTP_CONFLICT, msg, - resource->pool); + return dav_svn__convert_err(serr, status, msg, resource->pool); } else { @@ -1540,8 +1545,11 @@ merge(dav_resource *target, if (serr) { const char *msg; + int status; + if (serr->apr_err == SVN_ERR_FS_CONFLICT) { + status = HTTP_CONFLICT; /* ### we need to convert the conflict path into a URI */ msg = apr_psprintf(pool, "A conflict occurred during the MERGE " @@ -1550,9 +1558,12 @@ merge(dav_resource *target, conflict); } else - msg = "An error occurred while committing the transaction."; + { + status = HTTP_INTERNAL_SERVER_ERROR; + msg = "An error occurred while committing the transaction."; + } - return dav_svn__convert_err(serr, HTTP_CONFLICT, msg, pool); + return dav_svn__convert_err(serr, status, msg, pool); } else {