Modified: subversion/branches/patch-exec/subversion/libsvn_client/upgrade.c URL: http://svn.apache.org/viewvc/subversion/branches/patch-exec/subversion/libsvn_client/upgrade.c?rev=1703735&r1=1703734&r2=1703735&view=diff ============================================================================== --- subversion/branches/patch-exec/subversion/libsvn_client/upgrade.c (original) +++ subversion/branches/patch-exec/subversion/libsvn_client/upgrade.c Fri Sep 18 01:38:47 2015 @@ -83,11 +83,13 @@ fetch_repos_info(const char **repos_root } /* Forward definition. Upgrades svn:externals properties in the working copy - LOCAL_ABSPATH to the WC-NG storage. + LOCAL_ABSPATH to the WC-NG storage. INFO_BATON will be used to fetch + repository info using fetch_repos_info() function if needed. */ static svn_error_t * upgrade_externals_from_properties(svn_client_ctx_t *ctx, const char *local_abspath, + struct repos_info_baton *info_baton, apr_pool_t *scratch_pool); svn_error_t * @@ -172,7 +174,7 @@ svn_client_upgrade(const char *path, (There is no way to detect the difference from libsvn_client :( ) */ SVN_ERR(upgrade_externals_from_properties(ctx, local_abspath, - scratch_pool)); + &info_baton, scratch_pool)); } return SVN_NO_ERROR; } @@ -180,6 +182,7 @@ svn_client_upgrade(const char *path, static svn_error_t * upgrade_externals_from_properties(svn_client_ctx_t *ctx, const char *local_abspath, + struct repos_info_baton *info_baton, apr_pool_t *scratch_pool) { apr_hash_index_t *hi; @@ -187,7 +190,6 @@ upgrade_externals_from_properties(svn_cl apr_pool_t *iterpool2; apr_hash_t *externals; svn_opt_revision_t rev = {svn_opt_revision_unspecified, {0}}; - struct repos_info_baton info_baton; /* Now it's time to upgrade the externals too. We do it after the wc upgrade to avoid that errors in the externals causes the wc upgrade to @@ -345,7 +347,7 @@ upgrade_externals_from_properties(svn_cl { err = fetch_repos_info(&repos_root_url, &repos_uuid, - &info_baton, + info_baton, resolved_url, scratch_pool, scratch_pool); if (err)
Modified: subversion/branches/patch-exec/subversion/libsvn_delta/xdelta.c URL: http://svn.apache.org/viewvc/subversion/branches/patch-exec/subversion/libsvn_delta/xdelta.c?rev=1703735&r1=1703734&r2=1703735&view=diff ============================================================================== --- subversion/branches/patch-exec/subversion/libsvn_delta/xdelta.c (original) +++ subversion/branches/patch-exec/subversion/libsvn_delta/xdelta.c Fri Sep 18 01:38:47 2015 @@ -111,7 +111,7 @@ struct block apr_uint32_t adlersum; /* Even in 64 bit systems, store only 32 bit offsets in our hash table - (our delta window size much much smaller then 4GB). + (our delta window size much much smaller than 4GB). That reduces the hash table size by 50% from 32to 16KB and makes it easier to fit into the CPU's L1 cache. */ apr_uint32_t pos; /* NO_POSITION -> block is not used */ Modified: subversion/branches/patch-exec/subversion/libsvn_diff/parse-diff.c URL: http://svn.apache.org/viewvc/subversion/branches/patch-exec/subversion/libsvn_diff/parse-diff.c?rev=1703735&r1=1703734&r2=1703735&view=diff ============================================================================== --- subversion/branches/patch-exec/subversion/libsvn_diff/parse-diff.c (original) +++ subversion/branches/patch-exec/subversion/libsvn_diff/parse-diff.c Fri Sep 18 01:38:47 2015 @@ -1030,7 +1030,7 @@ enum parse_state { state_start, /* initial */ state_git_diff_seen, /* diff --git */ - state_git_tree_seen, /* a tree operation, rather then content change */ + state_git_tree_seen, /* a tree operation, rather than content change */ state_git_minus_seen, /* --- /dev/null; or --- a/ */ state_git_plus_seen, /* +++ /dev/null; or +++ a/ */ state_old_mode_seen, /* old mode 100644 */ Modified: subversion/branches/patch-exec/subversion/libsvn_fs/fs-loader.c URL: http://svn.apache.org/viewvc/subversion/branches/patch-exec/subversion/libsvn_fs/fs-loader.c?rev=1703735&r1=1703734&r2=1703735&view=diff ============================================================================== --- subversion/branches/patch-exec/subversion/libsvn_fs/fs-loader.c (original) +++ subversion/branches/patch-exec/subversion/libsvn_fs/fs-loader.c Fri Sep 18 01:38:47 2015 @@ -1773,8 +1773,7 @@ svn_fs_lock_target_create(const char *to svn_revnum_t current_rev, apr_pool_t *result_pool) { - svn_fs_lock_target_t *target = apr_palloc(result_pool, - sizeof(svn_fs_lock_target_t)); + svn_fs_lock_target_t *target = apr_palloc(result_pool, sizeof(*target)); target->token = token; target->current_rev = current_rev; Modified: subversion/branches/patch-exec/subversion/libsvn_fs/fs-loader.h URL: http://svn.apache.org/viewvc/subversion/branches/patch-exec/subversion/libsvn_fs/fs-loader.h?rev=1703735&r1=1703734&r2=1703735&view=diff ============================================================================== --- subversion/branches/patch-exec/subversion/libsvn_fs/fs-loader.h (original) +++ subversion/branches/patch-exec/subversion/libsvn_fs/fs-loader.h Fri Sep 18 01:38:47 2015 @@ -22,8 +22,8 @@ */ -#ifndef LIBSVN_FS_FS_H -#define LIBSVN_FS_FS_H +#ifndef LIBSVN_FS_LOADER_H +#define LIBSVN_FS_LOADER_H #include "svn_types.h" #include "svn_fs.h" @@ -184,15 +184,9 @@ typedef svn_error_t *(*fs_init_func_t)(c to the create and open functions and these init functions (as well as the open and create functions) are globally serialized so that they have exclusive access to the common_pool. */ -svn_error_t *svn_fs_base__init(const svn_version_t *loader_version, - fs_library_vtable_t **vtable, - apr_pool_t* common_pool); -svn_error_t *svn_fs_fs__init(const svn_version_t *loader_version, - fs_library_vtable_t **vtable, - apr_pool_t* common_pool); -svn_error_t *svn_fs_x__init(const svn_version_t *loader_version, - fs_library_vtable_t **vtable, - apr_pool_t* common_pool); +#include "../libsvn_fs_base/fs_init.h" +#include "../libsvn_fs_fs/fs_init.h" +#include "../libsvn_fs_x/fs_init.h" @@ -569,4 +563,4 @@ struct svn_fs_lock_target_t } #endif /* __cplusplus */ -#endif +#endif /* LIBSVN_FS_LOADER_H */ Modified: subversion/branches/patch-exec/subversion/libsvn_fs_fs/cached_data.c URL: http://svn.apache.org/viewvc/subversion/branches/patch-exec/subversion/libsvn_fs_fs/cached_data.c?rev=1703735&r1=1703734&r2=1703735&view=diff ============================================================================== --- subversion/branches/patch-exec/subversion/libsvn_fs_fs/cached_data.c (original) +++ subversion/branches/patch-exec/subversion/libsvn_fs_fs/cached_data.c Fri Sep 18 01:38:47 2015 @@ -57,7 +57,7 @@ block_read(void **result, apr_pool_t *scratch_pool); -/* Defined this to enable access logging via dgb__log_access +/* Define this to enable access logging via dbg_log_access #define SVN_FS_FS__LOG_ACCESS */ @@ -91,7 +91,7 @@ dbg_log_access(svn_fs_t *fs, svn_fs_fs__revision_file_t *rev_file; SVN_ERR(svn_fs_fs__open_pack_or_rev_file(&rev_file, fs, revision, - scratch_pool)); + scratch_pool, scratch_pool)); /* determine rev / pack file offset */ SVN_ERR(svn_fs_fs__item_offset(&offset, fs, rev_file, revision, NULL, @@ -158,7 +158,8 @@ dbg_log_access(svn_fs_t *fs, { /* reverse index lookup: get item description in ENTRY */ SVN_ERR(svn_fs_fs__p2l_entry_lookup(&entry, fs, rev_file, revision, - offset, scratch_pool)); + offset, scratch_pool, + scratch_pool)); if (entry) { /* more details */ @@ -183,6 +184,10 @@ dbg_log_access(svn_fs_t *fs, description); } + /* We don't know when SCRATCH_POOL will be cleared, so close the rev file + explicitly. */ + SVN_ERR(svn_fs_fs__close_revision_file(rev_file)); + #endif return SVN_NO_ERROR; @@ -2862,7 +2867,7 @@ svn_fs_fs__get_changes(apr_array_header_ svn_revnum_t rev, apr_pool_t *result_pool) { - apr_off_t changes_offset = SVN_FS_FS__ITEM_INDEX_CHANGES; + apr_off_t item_index = SVN_FS_FS__ITEM_INDEX_CHANGES; svn_fs_fs__revision_file_t *revision_file; svn_boolean_t found; fs_fs_data_t *ffd = fs->fsap_data; @@ -2897,17 +2902,26 @@ svn_fs_fs__get_changes(apr_array_header_ } else { + apr_off_t changes_offset; + /* Addressing is very different for old formats * (needs to read the revision trailer). */ if (svn_fs_fs__use_log_addressing(fs)) - SVN_ERR(svn_fs_fs__item_offset(&changes_offset, fs, - revision_file, rev, NULL, - SVN_FS_FS__ITEM_INDEX_CHANGES, - scratch_pool)); + { + SVN_ERR(svn_fs_fs__item_offset(&changes_offset, fs, + revision_file, rev, NULL, + SVN_FS_FS__ITEM_INDEX_CHANGES, + scratch_pool)); + } else - SVN_ERR(get_root_changes_offset(NULL, &changes_offset, - revision_file, fs, rev, - scratch_pool)); + { + SVN_ERR(get_root_changes_offset(NULL, &changes_offset, + revision_file, fs, rev, + scratch_pool)); + + /* This variable will be used for debug logging only. */ + item_index = changes_offset; + } /* Actual reading and parsing are the same, though. */ SVN_ERR(aligned_seek(fs, revision_file->file, NULL, changes_offset, @@ -2935,7 +2949,7 @@ svn_fs_fs__get_changes(apr_array_header_ SVN_ERR(svn_fs_fs__close_revision_file(revision_file)); } - SVN_ERR(dbg_log_access(fs, rev, changes_offset, *changes, + SVN_ERR(dbg_log_access(fs, rev, item_index, *changes, SVN_FS_FS__ITEM_TYPE_CHANGES, scratch_pool)); svn_pool_destroy(scratch_pool); Modified: subversion/branches/patch-exec/subversion/libsvn_fs_fs/fs_fs.c URL: http://svn.apache.org/viewvc/subversion/branches/patch-exec/subversion/libsvn_fs_fs/fs_fs.c?rev=1703735&r1=1703734&r2=1703735&view=diff ============================================================================== --- subversion/branches/patch-exec/subversion/libsvn_fs_fs/fs_fs.c (original) +++ subversion/branches/patch-exec/subversion/libsvn_fs_fs/fs_fs.c Fri Sep 18 01:38:47 2015 @@ -622,8 +622,8 @@ svn_fs_fs__write_format(svn_fs_t *fs, } else { - SVN_ERR(svn_io_write_atomic(path, sb->data, sb->len, - NULL /* copy_perms_path */, pool)); + SVN_ERR(svn_io_write_atomic2(path, sb->data, sb->len, + NULL /* copy_perms_path */, TRUE, pool)); } /* And set the perms to make it read only */ @@ -1857,9 +1857,9 @@ svn_fs_fs__set_uuid(svn_fs_t *fs, /* We use the permissions of the 'current' file, because the 'uuid' file does not exist during repository creation. */ - SVN_ERR(svn_io_write_atomic(uuid_path, contents->data, contents->len, - svn_fs_fs__path_current(fs, pool) /* perms */, - pool)); + SVN_ERR(svn_io_write_atomic2(uuid_path, contents->data, contents->len, + svn_fs_fs__path_current(fs, pool) /* perms */, + TRUE, pool)); fs->uuid = apr_pstrdup(fs->pool, uuid); @@ -2010,7 +2010,7 @@ set_node_origins_for_file(svn_fs_t *fs, SVN_ERR(svn_stream_close(stream)); /* Rename the temp file as the real destination */ - return svn_io_file_rename(path_tmp, node_origins_path, pool); + return svn_io_file_rename2(path_tmp, node_origins_path, FALSE, pool); } Modified: subversion/branches/patch-exec/subversion/libsvn_fs_fs/index.c URL: http://svn.apache.org/viewvc/subversion/branches/patch-exec/subversion/libsvn_fs_fs/index.c?rev=1703735&r1=1703734&r2=1703735&view=diff ============================================================================== --- subversion/branches/patch-exec/subversion/libsvn_fs_fs/index.c (original) +++ subversion/branches/patch-exec/subversion/libsvn_fs_fs/index.c Fri Sep 18 01:38:47 2015 @@ -251,7 +251,7 @@ static svn_error_t * packed_stream_read(svn_fs_fs__packed_number_stream_t *stream) { unsigned char buffer[MAX_NUMBER_PREFETCH]; - apr_size_t read = 0; + apr_size_t bytes_read = 0; apr_size_t i; value_position_pair_t *target; apr_off_t block_start = 0; @@ -273,33 +273,34 @@ packed_stream_read(svn_fs_fs__packed_num * boundaries. This shall prevent jumping back and forth between two * blocks because the extra data was not actually request _now_. */ - read = sizeof(buffer); + bytes_read = sizeof(buffer); block_left = stream->block_size - (stream->next_offset - block_start); - if (block_left >= 10 && block_left < read) - read = (apr_size_t)block_left; + if (block_left >= 10 && block_left < bytes_read) + bytes_read = (apr_size_t)block_left; /* Don't read beyond the end of the file section that belongs to this * index / stream. */ - read = (apr_size_t)MIN(read, stream->stream_end - stream->next_offset); + bytes_read = (apr_size_t)MIN(bytes_read, + stream->stream_end - stream->next_offset); - err = apr_file_read(stream->file, buffer, &read); + err = apr_file_read(stream->file, buffer, &bytes_read); if (err && !APR_STATUS_IS_EOF(err)) return stream_error_create(stream, err, _("Can't read index file '%s' at offset 0x%s")); /* if the last number is incomplete, trim it from the buffer */ - while (read > 0 && buffer[read-1] >= 0x80) - --read; + while (bytes_read > 0 && buffer[bytes_read-1] >= 0x80) + --bytes_read; /* we call read() only if get() requires more data. So, there must be * at least *one* further number. */ - if SVN__PREDICT_FALSE(read == 0) + if SVN__PREDICT_FALSE(bytes_read == 0) return stream_error_create(stream, err, _("Unexpected end of index file %s at offset 0x%s")); /* parse file buffer and expand into stream buffer */ target = stream->buffer; - for (i = 0; i < read;) + for (i = 0; i < bytes_read;) { if (buffer[i] < 0x80) { @@ -558,13 +559,13 @@ read_uint64_from_proto_index(apr_file_t apr_pool_t *scratch_pool) { apr_byte_t buffer[sizeof(*value_p)]; - apr_size_t read; + apr_size_t bytes_read; /* Read the full 8 bytes or our 64 bit value, unless we hit EOF. * Assert that we never read partial values. */ SVN_ERR(svn_io_file_read_full2(proto_index, buffer, sizeof(buffer), - &read, eof, scratch_pool)); - SVN_ERR_ASSERT((eof && *eof) || read == sizeof(buffer)); + &bytes_read, eof, scratch_pool)); + SVN_ERR_ASSERT((eof && *eof) || bytes_read == sizeof(buffer)); /* If we did not hit EOF, reconstruct the uint64 value and return it. */ if (!eof || !*eof) @@ -3207,18 +3208,11 @@ svn_fs_fs__l2p_index_from_p2l_entries(co apr_pool_t *iterpool = svn_pool_create(scratch_pool); int i; svn_revnum_t last_revision = SVN_INVALID_REVNUM; - svn_revnum_t revision = SVN_INVALID_REVNUM; /* L2P index must be written in revision order. * Sort ENTRIES accordingly. */ svn_sort__array(entries, compare_p2l_entry_revision); - /* Find the first revision in the index - * (must exist since no truly empty revs are allowed). */ - for (i = 0; i < entries->nelts && !SVN_IS_VALID_REVNUM(revision); ++i) - revision = APR_ARRAY_IDX(entries, i, const svn_fs_fs__p2l_entry_t *) - ->item.revision; - /* Create the temporary proto-rev file. */ SVN_ERR(svn_io_open_unique_file3(NULL, protoname, NULL, svn_io_file_del_on_pool_cleanup, Modified: subversion/branches/patch-exec/subversion/libsvn_fs_fs/load-index.c URL: http://svn.apache.org/viewvc/subversion/branches/patch-exec/subversion/libsvn_fs_fs/load-index.c?rev=1703735&r1=1703734&r2=1703735&view=diff ============================================================================== --- subversion/branches/patch-exec/subversion/libsvn_fs_fs/load-index.c (original) +++ subversion/branches/patch-exec/subversion/libsvn_fs_fs/load-index.c Fri Sep 18 01:38:47 2015 @@ -23,53 +23,152 @@ #include "svn_pools.h" #include "private/svn_fs_fs_private.h" +#include "private/svn_sorts_private.h" #include "index.h" #include "util.h" #include "transaction.h" +/* From the ENTRIES array of svn_fs_fs__p2l_entry_t*, sorted by offset, + * return the first offset behind the last item. */ +static apr_off_t +get_max_covered(apr_array_header_t *entries) +{ + const svn_fs_fs__p2l_entry_t *entry; + if (entries->nelts == 0) + return -1; + + entry = APR_ARRAY_IDX(entries, entries->nelts - 1, + const svn_fs_fs__p2l_entry_t *); + return entry->offset + entry->size; +} + +/* Make sure that the svn_fs_fs__p2l_entry_t* in ENTRIES are consecutive + * and non-overlapping. Use SCRATCH_POOL for temporaries. */ +static svn_error_t * +check_all_covered(apr_array_header_t *entries, + apr_pool_t *scratch_pool) +{ + int i; + apr_off_t expected = 0; + for (i = 0; i < entries->nelts; ++i) + { + const svn_fs_fs__p2l_entry_t *entry + = APR_ARRAY_IDX(entries, i, const svn_fs_fs__p2l_entry_t *); + + if (entry->offset < expected) + return svn_error_createf(SVN_ERR_INVALID_INPUT, NULL, + "Overlapping index data for offset %s", + apr_psprintf(scratch_pool, + "%" APR_UINT64_T_HEX_FMT, + (apr_uint64_t)expected)); + + if (entry->offset > expected) + return svn_error_createf(SVN_ERR_INVALID_INPUT, NULL, + "Missing index data for offset %s", + apr_psprintf(scratch_pool, + "%" APR_UINT64_T_HEX_FMT, + (apr_uint64_t)expected)); + + expected = entry->offset + entry->size; + } + + return SVN_NO_ERROR; +} + +/* A svn_sort__array compatible comparator function, sorting the + * svn_fs_fs__p2l_entry_t** given in LHS, RHS by offset. */ +static int +compare_p2l_entry_revision(const void *lhs, + const void *rhs) +{ + const svn_fs_fs__p2l_entry_t *lhs_entry + =*(const svn_fs_fs__p2l_entry_t **)lhs; + const svn_fs_fs__p2l_entry_t *rhs_entry + =*(const svn_fs_fs__p2l_entry_t **)rhs; + + if (lhs_entry->offset < rhs_entry->offset) + return -1; + + return lhs_entry->offset == rhs_entry->offset ? 0 : 1; +} + svn_error_t * svn_fs_fs__load_index(svn_fs_t *fs, svn_revnum_t revision, apr_array_header_t *entries, apr_pool_t *scratch_pool) { - apr_pool_t *iterpool = svn_pool_create(scratch_pool); + apr_pool_t *subpool = svn_pool_create(scratch_pool); /* Check the FS format number. */ if (! svn_fs_fs__use_log_addressing(fs)) return svn_error_create(SVN_ERR_FS_UNSUPPORTED_FORMAT, NULL, NULL); + /* P2L index must be written in offset order. + * Sort ENTRIES accordingly. */ + svn_sort__array(entries, compare_p2l_entry_revision); + /* Treat an empty array as a no-op instead error. */ if (entries->nelts != 0) { const char *l2p_proto_index; const char *p2l_proto_index; svn_fs_fs__revision_file_t *rev_file; + svn_error_t *err; + apr_off_t max_covered = get_max_covered(entries); + + /* Ensure that the index data is complete. */ + SVN_ERR(check_all_covered(entries, scratch_pool)); /* Open rev / pack file & trim indexes + footer off it. */ SVN_ERR(svn_fs_fs__open_pack_or_rev_file_writable(&rev_file, fs, - revision, iterpool, - iterpool)); - SVN_ERR(svn_fs_fs__auto_read_footer(rev_file)); - SVN_ERR(svn_io_file_trunc(rev_file->file, rev_file->l2p_offset, - iterpool)); + revision, subpool, + subpool)); + + /* Remove the existing index info. */ + err = svn_fs_fs__auto_read_footer(rev_file); + if (err) + { + /* Even the index footer cannot be read, even less be trusted. + * Take the range of valid data from the new index data. */ + svn_error_clear(err); + SVN_ERR(svn_io_file_trunc(rev_file->file, max_covered, + subpool)); + } + else + { + /* We assume that the new index data covers all contents. + * Error out if it doesn't. The user can always truncate + * the file themselves. */ + if (max_covered != rev_file->l2p_offset) + return svn_error_createf(SVN_ERR_INVALID_INPUT, NULL, + "New index data ends at %s, old index ended at %s", + apr_psprintf(scratch_pool, "%" APR_UINT64_T_HEX_FMT, + (apr_uint64_t)max_covered), + apr_psprintf(scratch_pool, "%" APR_UINT64_T_HEX_FMT, + (apr_uint64_t) rev_file->l2p_offset)); + + SVN_ERR(svn_io_file_trunc(rev_file->file, rev_file->l2p_offset, + subpool)); + } /* Create proto index files for the new index data * (will be cleaned up automatically with iterpool). */ SVN_ERR(svn_fs_fs__p2l_index_from_p2l_entries(&p2l_proto_index, fs, rev_file, entries, - iterpool, iterpool)); + subpool, subpool)); SVN_ERR(svn_fs_fs__l2p_index_from_p2l_entries(&l2p_proto_index, fs, - entries, iterpool, - iterpool)); + entries, subpool, + subpool)); /* Combine rev data with new index data. */ SVN_ERR(svn_fs_fs__add_index_data(fs, rev_file->file, l2p_proto_index, - p2l_proto_index, revision, iterpool)); + p2l_proto_index, + rev_file->start_revision, subpool)); } - svn_pool_destroy(iterpool); + svn_pool_destroy(subpool); return SVN_NO_ERROR; } Modified: subversion/branches/patch-exec/subversion/libsvn_fs_fs/lock.c URL: http://svn.apache.org/viewvc/subversion/branches/patch-exec/subversion/libsvn_fs_fs/lock.c?rev=1703735&r1=1703734&r2=1703735&view=diff ============================================================================== --- subversion/branches/patch-exec/subversion/libsvn_fs_fs/lock.c (original) +++ subversion/branches/patch-exec/subversion/libsvn_fs_fs/lock.c Fri Sep 18 01:38:47 2015 @@ -230,7 +230,7 @@ write_digest_file(apr_hash_t *children, } SVN_ERR(svn_stream_close(stream)); - SVN_ERR(svn_io_file_rename(tmp_path, digest_path, pool)); + SVN_ERR(svn_io_file_rename2(tmp_path, digest_path, FALSE, pool)); SVN_ERR(svn_io_copy_perms(perms_reference, digest_path, pool)); return SVN_NO_ERROR; } Modified: subversion/branches/patch-exec/subversion/libsvn_fs_fs/temp_serializer.c URL: http://svn.apache.org/viewvc/subversion/branches/patch-exec/subversion/libsvn_fs_fs/temp_serializer.c?rev=1703735&r1=1703734&r2=1703735&view=diff ============================================================================== --- subversion/branches/patch-exec/subversion/libsvn_fs_fs/temp_serializer.c (original) +++ subversion/branches/patch-exec/subversion/libsvn_fs_fs/temp_serializer.c Fri Sep 18 01:38:47 2015 @@ -599,7 +599,7 @@ svn_fs_fs__serialize_properties(void **d /* create our auxiliary data structure */ properties.count = apr_hash_count(hash); properties.keys = apr_palloc(pool, sizeof(const char*) * (properties.count + 1)); - properties.values = apr_palloc(pool, sizeof(const char*) * properties.count); + properties.values = apr_palloc(pool, sizeof(const svn_string_t *) * properties.count); /* populate it with the hash entries */ for (hi = apr_hash_first(pool, hash), i=0; hi; hi = apr_hash_next(hi), ++i) Modified: subversion/branches/patch-exec/subversion/libsvn_fs_fs/transaction.c URL: http://svn.apache.org/viewvc/subversion/branches/patch-exec/subversion/libsvn_fs_fs/transaction.c?rev=1703735&r1=1703734&r2=1703735&view=diff ============================================================================== --- subversion/branches/patch-exec/subversion/libsvn_fs_fs/transaction.c (original) +++ subversion/branches/patch-exec/subversion/libsvn_fs_fs/transaction.c Fri Sep 18 01:38:47 2015 @@ -968,10 +968,10 @@ get_and_increment_txn_key_body(void *bat /* Increment the key and add a trailing \n to the string so the txn-current file has a newline in it. */ - SVN_ERR(svn_io_write_atomic(txn_current_filename, new_id_str, - line_length + 1, - txn_current_filename /* copy_perms path */, - pool)); + SVN_ERR(svn_io_write_atomic2(txn_current_filename, new_id_str, + line_length + 1, + txn_current_filename /* copy_perms path */, + TRUE, pool)); return SVN_NO_ERROR; } @@ -1167,7 +1167,7 @@ set_txn_proplist(svn_fs_t *fs, SVN_ERR(svn_hash_write2(props, tmp_stream, SVN_HASH_TERMINATOR, pool)); SVN_ERR(svn_stream_close(tmp_stream)); - SVN_ERR(svn_io_file_rename(tmp_path, final_path, pool)); + SVN_ERR(svn_io_file_rename2(tmp_path, final_path, FALSE, pool)); return SVN_NO_ERROR; } @@ -1485,6 +1485,7 @@ svn_fs_fs__set_entry(svn_fs_t *fs, = svn_fs_fs__path_txn_node_children(fs, parent_noderev->id, pool); apr_file_t *file; svn_stream_t *out; + svn_filesize_t filesize; fs_fs_data_t *ffd = fs->fsap_data; apr_pool_t *subpool = svn_pool_create(pool); @@ -1515,8 +1516,6 @@ svn_fs_fs__set_entry(svn_fs_t *fs, } else { - const svn_io_dirent2_t *dirent; - /* The directory rep is already mutable, so just open it for append. */ SVN_ERR(svn_io_file_open(&file, filename, APR_WRITE | APR_APPEND, APR_OS_DEFAULT, subpool)); @@ -1531,11 +1530,11 @@ svn_fs_fs__set_entry(svn_fs_t *fs, const char *key = svn_fs_fs__id_unparse(parent_noderev->id, subpool)->data; svn_boolean_t found; - svn_filesize_t filesize; + svn_filesize_t cached_filesize; /* Get the file size that corresponds to the cached contents * (if any). */ - SVN_ERR(svn_cache__get_partial((void **)&filesize, &found, + SVN_ERR(svn_cache__get_partial((void **)&cached_filesize, &found, ffd->txn_dir_cache, key, svn_fs_fs__extract_dir_filesize, NULL, subpool)); @@ -1544,10 +1543,9 @@ svn_fs_fs__set_entry(svn_fs_t *fs, * If not, we need to drop the cache entry. */ if (found) { - SVN_ERR(svn_io_stat_dirent2(&dirent, filename, FALSE, FALSE, - subpool, subpool)); + SVN_ERR(svn_io_file_size_get(&filesize, file, subpool)); - if (filesize != dirent->filesize) + if (cached_filesize != filesize) SVN_ERR(svn_cache__set(ffd->txn_dir_cache, key, NULL, subpool)); } @@ -1571,6 +1569,12 @@ svn_fs_fs__set_entry(svn_fs_t *fs, } /* Flush APR buffers. */ + SVN_ERR(svn_io_file_flush(file, subpool)); + + /* Obtain final file size to update txn_dir_cache. */ + SVN_ERR(svn_io_file_size_get(&filesize, file, subpool)); + + /* Close file. */ SVN_ERR(svn_io_file_close(file, subpool)); svn_pool_clear(subpool); @@ -1582,13 +1586,9 @@ svn_fs_fs__set_entry(svn_fs_t *fs, svn_fs_fs__id_unparse(parent_noderev->id, subpool)->data; replace_baton_t baton; - const svn_io_dirent2_t *dirent; - SVN_ERR(svn_io_stat_dirent2(&dirent, filename, FALSE, FALSE, - subpool, subpool)); - baton.name = name; baton.new_entry = NULL; - baton.txn_filesize = dirent->filesize; + baton.txn_filesize = filesize; if (id) { @@ -1715,7 +1715,7 @@ allocate_item_index(apr_uint64_t *item_i char buffer[SVN_INT64_BUFFER_SIZE] = { 0 }; svn_boolean_t eof = FALSE; apr_size_t to_write; - apr_size_t read; + apr_size_t bytes_read; apr_off_t offset = 0; /* read number, increment it and write it back to disk */ @@ -1724,8 +1724,8 @@ allocate_item_index(apr_uint64_t *item_i APR_READ | APR_WRITE | APR_CREATE | APR_BUFFERED, APR_OS_DEFAULT, pool)); SVN_ERR(svn_io_file_read_full2(file, buffer, sizeof(buffer)-1, - &read, &eof, pool)); - if (read) + &bytes_read, &eof, pool)); + if (bytes_read) SVN_ERR(svn_cstring_atoui64(item_index, buffer)); else *item_index = SVN_FS_FS__ITEM_INDEX_FIRST_USER; @@ -2836,7 +2836,7 @@ validate_root_noderev(svn_fs_t *fs, Normally (rev == root_noderev->predecessor_count), but here we use a more roundabout check that should only trigger on new instances - of the corruption, rather then trigger on each and every new commit + of the corruption, rather than trigger on each and every new commit to a repository that has triggered the bug somewhere in its root noderev's history. */ Modified: subversion/branches/patch-exec/subversion/libsvn_fs_fs/tree.c URL: http://svn.apache.org/viewvc/subversion/branches/patch-exec/subversion/libsvn_fs_fs/tree.c?rev=1703735&r1=1703734&r2=1703735&view=diff ============================================================================== --- subversion/branches/patch-exec/subversion/libsvn_fs_fs/tree.c (original) +++ subversion/branches/patch-exec/subversion/libsvn_fs_fs/tree.c Fri Sep 18 01:38:47 2015 @@ -3273,6 +3273,14 @@ typedef struct fs_history_data_t /* FALSE until the first call to svn_fs_history_prev(). */ svn_boolean_t is_interesting; + + /* If not SVN_INVALID_REVISION, we know that the next copy operation + is at this revision. */ + svn_revnum_t next_copy; + + /* If not NULL, this is the noderev ID of PATH@REVISION. */ + const svn_fs_id_t *current_id; + } fs_history_data_t; static svn_fs_history_t * @@ -3282,6 +3290,8 @@ assemble_history(svn_fs_t *fs, svn_boolean_t is_interesting, const char *path_hint, svn_revnum_t rev_hint, + svn_revnum_t next_copy, + const svn_fs_id_t *current_id, apr_pool_t *pool); @@ -3308,7 +3318,8 @@ fs_node_history(svn_fs_history_t **histo /* Okay, all seems well. Build our history object and return it. */ *history_p = assemble_history(root->fs, path, root->rev, FALSE, NULL, - SVN_INVALID_REVNUM, result_pool); + SVN_INVALID_REVNUM, SVN_INVALID_REVNUM, + NULL, result_pool); return SVN_NO_ERROR; } @@ -3609,10 +3620,50 @@ history_prev(svn_fs_history_t **prev_his svn_boolean_t reported = fhd->is_interesting; svn_revnum_t copyroot_rev; const char *copyroot_path; + const svn_fs_id_t *pred_id = NULL; /* Initialize our return value. */ *prev_history = NULL; + /* When following history, there tend to be long sections of linear + history where there are no copies at PATH or its parents. Within + these sections, we only need to follow the node history. */ + if ( SVN_IS_VALID_REVNUM(fhd->next_copy) + && revision > fhd->next_copy + && fhd->current_id) + { + /* We know the last reported node (CURRENT_ID) and the NEXT_COPY + revision is somewhat further in the past. */ + node_revision_t *noderev; + assert(reported); + + /* Get the previous node change. If there is none, then we already + reported the initial addition and this history traversal is done. */ + SVN_ERR(svn_fs_fs__get_node_revision(&noderev, fs, fhd->current_id, + scratch_pool, scratch_pool)); + if (! noderev->predecessor_id) + return SVN_NO_ERROR; + + /* If the previous node change is younger than the next copy, it is + part of the linear history section. */ + commit_rev = svn_fs_fs__id_rev(noderev->predecessor_id); + if (commit_rev > fhd->next_copy) + { + /* Within the linear history, simply report all node changes and + continue with the respective predecessor. */ + *prev_history = assemble_history(fs, noderev->created_path, + commit_rev, TRUE, NULL, + SVN_INVALID_REVNUM, + fhd->next_copy, + noderev->predecessor_id, + result_pool); + + return SVN_NO_ERROR; + } + + /* We hit a copy. Fall back to the standard code path. */ + } + /* If our last history report left us hints about where to pickup the chase, then our last report was on the destination of a copy. If we are crossing copies, start from those locations, @@ -3651,7 +3702,9 @@ history_prev(svn_fs_history_t **prev_his need now to do so) ... */ *prev_history = assemble_history(fs, commit_path, commit_rev, TRUE, NULL, - SVN_INVALID_REVNUM, result_pool); + SVN_INVALID_REVNUM, + SVN_INVALID_REVNUM, NULL, + result_pool); return SVN_NO_ERROR; } else @@ -3659,8 +3712,6 @@ history_prev(svn_fs_history_t **prev_his /* ... or we *have* reported on this revision, and must now progress toward this node's predecessor (unless there is no predecessor, in which case we're all done!). */ - const svn_fs_id_t *pred_id; - SVN_ERR(svn_fs_fs__dag_get_predecessor_id(&pred_id, node)); if (! pred_id) return SVN_NO_ERROR; @@ -3731,12 +3782,18 @@ history_prev(svn_fs_history_t **prev_his retry = TRUE; *prev_history = assemble_history(fs, path, dst_rev, ! retry, - src_path, src_rev, result_pool); + src_path, src_rev, + SVN_INVALID_REVNUM, NULL, + result_pool); } else { + /* We know the next copy revision. If we are not at the copy rev + itself, we will also know the predecessor node ID and the next + invocation will use the optimized "linear history" code path. */ *prev_history = assemble_history(fs, commit_path, commit_rev, TRUE, - NULL, SVN_INVALID_REVNUM, result_pool); + NULL, SVN_INVALID_REVNUM, + copyroot_rev, pred_id, result_pool); } return SVN_NO_ERROR; @@ -3767,10 +3824,12 @@ fs_history_prev(svn_fs_history_t **prev_ if (! fhd->is_interesting) prev_history = assemble_history(fs, "/", fhd->revision, 1, NULL, SVN_INVALID_REVNUM, + SVN_INVALID_REVNUM, NULL, result_pool); else if (fhd->revision > 0) prev_history = assemble_history(fs, "/", fhd->revision - 1, 1, NULL, SVN_INVALID_REVNUM, + SVN_INVALID_REVNUM, NULL, result_pool); } else @@ -3830,6 +3889,8 @@ assemble_history(svn_fs_t *fs, svn_boolean_t is_interesting, const char *path_hint, svn_revnum_t rev_hint, + svn_revnum_t next_copy, + const svn_fs_id_t *current_id, apr_pool_t *pool) { svn_fs_history_t *history = apr_pcalloc(pool, sizeof(*history)); @@ -3840,6 +3901,8 @@ assemble_history(svn_fs_t *fs, fhd->path_hint = path_hint ? svn_fs__canonicalize_abspath(path_hint, pool) : NULL; fhd->rev_hint = rev_hint; + fhd->next_copy = next_copy; + fhd->current_id = current_id ? svn_fs_fs__id_copy(current_id, pool) : NULL; fhd->fs = fs; history->vtable = &history_vtable; Modified: subversion/branches/patch-exec/subversion/libsvn_fs_fs/util.c URL: http://svn.apache.org/viewvc/subversion/branches/patch-exec/subversion/libsvn_fs_fs/util.c?rev=1703735&r1=1703734&r2=1703735&view=diff ============================================================================== --- subversion/branches/patch-exec/subversion/libsvn_fs_fs/util.c (original) +++ subversion/branches/patch-exec/subversion/libsvn_fs_fs/util.c Fri Sep 18 01:38:47 2015 @@ -435,8 +435,9 @@ svn_fs_fs__write_min_unpacked_rev(svn_fs final_path = svn_fs_fs__path_min_unpacked_rev(fs, scratch_pool); - SVN_ERR(svn_io_write_atomic(final_path, buf, len + 1, - final_path /* copy_perms */, scratch_pool)); + SVN_ERR(svn_io_write_atomic2(final_path, buf, len + 1, + final_path /* copy_perms */, TRUE, + scratch_pool)); return SVN_NO_ERROR; } @@ -517,8 +518,8 @@ svn_fs_fs__write_current(svn_fs_t *fs, } name = svn_fs_fs__path_current(fs, pool); - SVN_ERR(svn_io_write_atomic(name, buf, strlen(buf), - name /* copy_perms_path */, pool)); + SVN_ERR(svn_io_write_atomic2(name, buf, strlen(buf), + name /* copy_perms_path */, TRUE, pool)); return SVN_NO_ERROR; } @@ -639,58 +640,44 @@ svn_fs_fs__move_into_place(const char *o svn_error_t *err; apr_file_t *file; -#if defined(WIN32) || defined(__OS2__) - - /* APR will *not* error out on Win32 if this requires a copy instead of - of a move. */ - SVN_ERR(svn_io_file_rename(old_filename, new_filename, pool)); - - /* Flush the target of the copy to disk. */ - SVN_ERR(svn_io_file_open(&file, new_filename, APR_WRITE, - APR_OS_DEFAULT, pool)); - SVN_ERR(svn_io_file_flush_to_disk(file, pool)); - SVN_ERR(svn_io_file_close(file, pool)); - /* Copying permissions is a no-op on WIN32. */ -#else - SVN_ERR(svn_io_copy_perms(perms_reference, old_filename, pool)); /* Move the file into place. */ - err = svn_io_file_rename(old_filename, new_filename, pool); + err = svn_io_file_rename2(old_filename, new_filename, TRUE, pool); if (err && APR_STATUS_IS_EXDEV(err->apr_err)) { /* Can't rename across devices; fall back to copying. */ svn_error_clear(err); - err = SVN_NO_ERROR; SVN_ERR(svn_io_copy_file(old_filename, new_filename, TRUE, pool)); - /* Flush the target of the copy to disk. */ - SVN_ERR(svn_io_file_open(&file, new_filename, APR_READ, + /* Flush the target of the copy to disk. + ### The code below is duplicates svn_io_file_rename2(), because + currently we don't have the svn_io_copy_file2() function with + a flush_to_disk argument. */ + SVN_ERR(svn_io_file_open(&file, new_filename, APR_WRITE, APR_OS_DEFAULT, pool)); SVN_ERR(svn_io_file_flush_to_disk(file, pool)); SVN_ERR(svn_io_file_close(file, pool)); - } - if (err) - return svn_error_trace(err); #ifdef SVN_ON_POSIX - { - /* On POSIX, the file name is stored in the file's directory entry. - Hence, we need to fsync() that directory as well. - On other operating systems, we'd only be asking for trouble - by trying to open and fsync a directory. */ - const char *dirname; - - dirname = svn_dirent_dirname(new_filename, pool); - SVN_ERR(svn_io_file_open(&file, dirname, APR_READ, APR_OS_DEFAULT, - pool)); - SVN_ERR(svn_io_file_flush_to_disk(file, pool)); - SVN_ERR(svn_io_file_close(file, pool)); - } + { + /* On POSIX, the file name is stored in the file's directory entry. + Hence, we need to fsync() that directory as well. + On other operating systems, we'd only be asking for trouble + by trying to open and fsync a directory. */ + const char *dirname; + + dirname = svn_dirent_dirname(new_filename, pool); + SVN_ERR(svn_io_file_open(&file, dirname, APR_READ, APR_OS_DEFAULT, + pool)); + SVN_ERR(svn_io_file_flush_to_disk(file, pool)); + SVN_ERR(svn_io_file_close(file, pool)); + } #endif - -#endif /* defined(WIN32) || defined(__OS2__) */ + } + else if (err) + return svn_error_trace(err); return SVN_NO_ERROR; } Propchange: subversion/branches/patch-exec/subversion/libsvn_fs_x/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Fri Sep 18 01:38:47 2015 @@ -93,4 +93,4 @@ /subversion/branches/verify-keep-going/subversion/libsvn_fs_x:1439280-1492639,1546002-1546110 /subversion/branches/wc-collate-path/subversion/libsvn_fs_x:1402685-1480384 /subversion/trunk/subversion/libsvn_fs_fs:1415133-1596500,1596567,1597414,1597989,1598273,1599140,1600872,1601633,1603485-1603487,1603499,1603605,1604128,1604188,1604413-1604414,1604416-1604417,1604421,1604442,1604700,1604717,1604720,1604726,1604755,1604794,1604802,1604824,1604836,1604844,1604902-1604903,1604911,1604925,1604933,1604947,1605059-1605060,1605064-1605065,1605068,1605071-1605073,1605075,1605123,1605188-1605189,1605191,1605197,1605444,1605633,1606132,1606142,1606144,1606514,1606526,1606528,1606551,1606554,1606564,1606598-1606599,1606656,1606658,1606662,1606744,1606840,1607085,1607572,1612407,1612810,1613339,1613872,1614611,1615348,1615351-1615352,1615356,1616338-1616339,1616613,1617586,1617688,1618138,1618151,1618153,1618226,1618641,1618653,1618662,1619068,1619358,1619413,1619769,1619774,1620602,1620909,1620912,1620928,1620930,1621275,1621635,1622931,1622937,1622942,1622946,1622959-1622960,1622963,1622987,1623007,1623368,1623373,1623377,1623379,1623381,1623398,1623402,162 4011,1624265,1624512,1626246,1626871,1626873,1626886,1627497-1627498,1627502,1627947-1627949,1627966,1628083,1628093,1628158-1628159,1628161,1628392-1628393,1628415,1628427,1628676,1628738,1628762,1628764,1629854-1629855,1629857,1629865,1629873,1629875,1629879,1630067,1630070,1631049-1631051,1631075,1631115,1631171,1631180,1631185-1631186,1631196-1631197,1631239-1631240,1631548,1631550,1631563,1631567,1631588,1631598,1632646,1632776,1632849,1632851-1632853,1632856-1632857,1632868,1632908,1632926,1633232,1633617-1633618,1634872,1634875,1634879-1634880,1634920,1636478,1636483,1636629,1636644,1637184,1637186,1637330,1637358,1637363,1637393,1639319,1639322,1639335,1639348,1639352,1639355,1639358,1639414,1639419,1639426,1639430,1639436,1639440,1639549,1640061-1640062,1640197,1640915,1640966,1641013,1643139,1643233,1645567,1646021,1646712,1646716,1647537,1647540-1647541,1647820,1647905,1648230,1648238,1648241-1648243,1648253,1648272,1648532,1648537-1648539,1648542,1648591,1648612,1653608, 1658482 -/subversion/trunk/subversion/libsvn_fs_x:1414756-1509914,1692717-1696512 +/subversion/trunk/subversion/libsvn_fs_x:1414756-1509914,1692717-1703734 Modified: subversion/branches/patch-exec/subversion/libsvn_fs_x/fs_id.c URL: http://svn.apache.org/viewvc/subversion/branches/patch-exec/subversion/libsvn_fs_x/fs_id.c?rev=1703735&r1=1703734&r2=1703735&view=diff ============================================================================== --- subversion/branches/patch-exec/subversion/libsvn_fs_x/fs_id.c (original) +++ subversion/branches/patch-exec/subversion/libsvn_fs_x/fs_id.c Fri Sep 18 01:38:47 2015 @@ -85,6 +85,13 @@ struct svn_fs_x__id_context_t is not.*/ const char *fs_path; + /* If FS is NULL, this points to svn_fs_open() as passed to the library. */ + svn_error_t *(*svn_fs_open_)(svn_fs_t **, + const char *, + apr_hash_t *, + apr_pool_t *, + apr_pool_t *); + /* Pool that this context struct got allocated in. */ apr_pool_t *owner; @@ -118,11 +125,14 @@ static apr_status_t fs_cleanup(void *baton) { svn_fs_x__id_context_t *context = baton; + svn_fs_x__data_t *ffd = context->fs->fsap_data; /* Remember the FS_PATH to potentially reopen and mark the FS as n/a. */ context->fs_path = apr_pstrdup(context->owner, context->fs->path); + context->svn_fs_open_ = ffd->svn_fs_open_; context->fs = NULL; + /* No need for further notifications because from now on, everything is allocated in OWNER. */ apr_pool_cleanup_kill(context->owner, context, owner_cleanup); @@ -137,8 +147,12 @@ get_fs(svn_fs_x__id_context_t *context) { if (!context->fs) { - svn_error_t *err = svn_fs_open2(&context->fs, context->fs_path, NULL, - context->owner, context->owner); + svn_error_t *err; + + SVN_ERR_ASSERT_NO_RETURN(context->svn_fs_open_); + + err = context->svn_fs_open_(&context->fs, context->fs_path, NULL, + context->owner, context->owner); if (err) { svn_error_clear(err); Modified: subversion/branches/patch-exec/subversion/libsvn_fs_x/fs_x.c URL: http://svn.apache.org/viewvc/subversion/branches/patch-exec/subversion/libsvn_fs_x/fs_x.c?rev=1703735&r1=1703734&r2=1703735&view=diff ============================================================================== --- subversion/branches/patch-exec/subversion/libsvn_fs_x/fs_x.c (original) +++ subversion/branches/patch-exec/subversion/libsvn_fs_x/fs_x.c Fri Sep 18 01:38:47 2015 @@ -198,8 +198,9 @@ svn_fs_x__write_format(svn_fs_t *fs, } else { - SVN_ERR(svn_io_write_atomic(path, sb->data, sb->len, - NULL /* copy_perms_path */, scratch_pool)); + SVN_ERR(svn_io_write_atomic2(path, sb->data, sb->len, + NULL /* copy_perms_path */, + TRUE, scratch_pool)); } /* And set the perms to make it read only */ @@ -1070,10 +1071,10 @@ svn_fs_x__set_uuid(svn_fs_t *fs, /* We use the permissions of the 'current' file, because the 'uuid' file does not exist during repository creation. */ - SVN_ERR(svn_io_write_atomic(uuid_path, contents->data, contents->len, - /* perms */ - svn_fs_x__path_current(fs, scratch_pool), - scratch_pool)); + SVN_ERR(svn_io_write_atomic2(uuid_path, contents->data, contents->len, + /* perms */ + svn_fs_x__path_current(fs, scratch_pool), + TRUE, scratch_pool)); fs->uuid = apr_pstrdup(fs->pool, uuid); ffd->instance_id = apr_pstrdup(fs->pool, instance_id); Modified: subversion/branches/patch-exec/subversion/libsvn_fs_x/index.c URL: http://svn.apache.org/viewvc/subversion/branches/patch-exec/subversion/libsvn_fs_x/index.c?rev=1703735&r1=1703734&r2=1703735&view=diff ============================================================================== --- subversion/branches/patch-exec/subversion/libsvn_fs_x/index.c (original) +++ subversion/branches/patch-exec/subversion/libsvn_fs_x/index.c Fri Sep 18 01:38:47 2015 @@ -251,7 +251,7 @@ static svn_error_t * packed_stream_read(svn_fs_x__packed_number_stream_t *stream) { unsigned char buffer[MAX_NUMBER_PREFETCH]; - apr_size_t read = 0; + apr_size_t bytes_read = 0; apr_size_t i; value_position_pair_t *target; apr_off_t block_start = 0; @@ -273,33 +273,34 @@ packed_stream_read(svn_fs_x__packed_numb * boundaries. This shall prevent jumping back and forth between two * blocks because the extra data was not actually request _now_. */ - read = sizeof(buffer); + bytes_read = sizeof(buffer); block_left = stream->block_size - (stream->next_offset - block_start); - if (block_left >= 10 && block_left < read) - read = (apr_size_t)block_left; + if (block_left >= 10 && block_left < bytes_read) + bytes_read = (apr_size_t)block_left; /* Don't read beyond the end of the file section that belongs to this * index / stream. */ - read = (apr_size_t)MIN(read, stream->stream_end - stream->next_offset); + bytes_read = (apr_size_t)MIN(bytes_read, + stream->stream_end - stream->next_offset); - err = apr_file_read(stream->file, buffer, &read); + err = apr_file_read(stream->file, buffer, &bytes_read); if (err && !APR_STATUS_IS_EOF(err)) return stream_error_create(stream, err, _("Can't read index file '%s' at offset 0x%")); /* if the last number is incomplete, trim it from the buffer */ - while (read > 0 && buffer[read-1] >= 0x80) - --read; + while (bytes_read > 0 && buffer[bytes_read-1] >= 0x80) + --bytes_read; /* we call read() only if get() requires more data. So, there must be * at least *one* further number. */ - if SVN__PREDICT_FALSE(read == 0) + if SVN__PREDICT_FALSE(bytes_read == 0) return stream_error_create(stream, err, _("Unexpected end of index file %s at offset 0x%")); /* parse file buffer and expand into stream buffer */ target = stream->buffer; - for (i = 0; i < read;) + for (i = 0; i < bytes_read;) { if (buffer[i] < 0x80) { @@ -505,13 +506,13 @@ read_uint64_from_proto_index(apr_file_t apr_pool_t *scratch_pool) { apr_byte_t buffer[sizeof(*value_p)]; - apr_size_t read; + apr_size_t bytes_read; /* Read the full 8 bytes or our 64 bit value, unless we hit EOF. * Assert that we never read partial values. */ SVN_ERR(svn_io_file_read_full2(proto_index, buffer, sizeof(buffer), - &read, eof, scratch_pool)); - SVN_ERR_ASSERT((eof && *eof) || read == sizeof(buffer)); + &bytes_read, eof, scratch_pool)); + SVN_ERR_ASSERT((eof && *eof) || bytes_read == sizeof(buffer)); /* If we did not hit EOF, reconstruct the uint64 value and return it. */ if (!eof || !*eof) Modified: subversion/branches/patch-exec/subversion/libsvn_fs_x/lock.c URL: http://svn.apache.org/viewvc/subversion/branches/patch-exec/subversion/libsvn_fs_x/lock.c?rev=1703735&r1=1703734&r2=1703735&view=diff ============================================================================== --- subversion/branches/patch-exec/subversion/libsvn_fs_x/lock.c (original) +++ subversion/branches/patch-exec/subversion/libsvn_fs_x/lock.c Fri Sep 18 01:38:47 2015 @@ -244,7 +244,7 @@ write_digest_file(apr_hash_t *children, } SVN_ERR(svn_stream_close(stream)); - SVN_ERR(svn_io_file_rename(tmp_path, digest_path, scratch_pool)); + SVN_ERR(svn_io_file_rename2(tmp_path, digest_path, FALSE, scratch_pool)); SVN_ERR(svn_io_copy_perms(perms_reference, digest_path, scratch_pool)); return SVN_NO_ERROR; } Modified: subversion/branches/patch-exec/subversion/libsvn_fs_x/revprops.c URL: http://svn.apache.org/viewvc/subversion/branches/patch-exec/subversion/libsvn_fs_x/revprops.c?rev=1703735&r1=1703734&r2=1703735&view=diff ============================================================================== --- subversion/branches/patch-exec/subversion/libsvn_fs_x/revprops.c (original) +++ subversion/branches/patch-exec/subversion/libsvn_fs_x/revprops.c Fri Sep 18 01:38:47 2015 @@ -305,8 +305,8 @@ svn_fs_x__reset_revprop_generation_file( * the current format. This ensures consistent on-disk state for new * format repositories. */ SVN_ERR(checkedsummed_number(&buffer, 0, scratch_pool, scratch_pool)); - SVN_ERR(svn_io_write_atomic(path, buffer->data, buffer->len, NULL, - scratch_pool)); + SVN_ERR(svn_io_write_atomic2(path, buffer->data, buffer->len, NULL, + TRUE, scratch_pool)); /* ffd->revprop_generation_file will be re-opened on demand. */ Modified: subversion/branches/patch-exec/subversion/libsvn_fs_x/transaction.c URL: http://svn.apache.org/viewvc/subversion/branches/patch-exec/subversion/libsvn_fs_x/transaction.c?rev=1703735&r1=1703734&r2=1703735&view=diff ============================================================================== --- subversion/branches/patch-exec/subversion/libsvn_fs_x/transaction.c (original) +++ subversion/branches/patch-exec/subversion/libsvn_fs_x/transaction.c Fri Sep 18 01:38:47 2015 @@ -1223,7 +1223,8 @@ bump_txn_key(svn_fs_t *fs, /* Increment the key and add a trailing \n to the string so the txn-current file has a newline in it. */ - SVN_ERR(svn_io_file_rename(txn_next_path, txn_current_path, scratch_pool)); + SVN_ERR(svn_io_file_rename2(txn_next_path, txn_current_path, FALSE, + scratch_pool)); SVN_ERR(svn_fs_x__batch_fsync_new_path(batch, txn_current_path, scratch_pool)); @@ -1412,10 +1413,11 @@ set_txn_proplist(svn_fs_t *fs, SVN_ERR(svn_stream_close(stream)); /* Replace the old file with the new one. */ - SVN_ERR(svn_io_file_rename(temp_path, - svn_fs_x__path_txn_props(fs, txn_id, - scratch_pool), - scratch_pool)); + SVN_ERR(svn_io_file_rename2(temp_path, + svn_fs_x__path_txn_props(fs, txn_id, + scratch_pool), + FALSE, + scratch_pool)); return SVN_NO_ERROR; } @@ -1555,7 +1557,7 @@ allocate_item_index(apr_uint64_t *item_i char buffer[SVN_INT64_BUFFER_SIZE] = { 0 }; svn_boolean_t eof = FALSE; apr_size_t to_write; - apr_size_t read; + apr_size_t bytes_read; apr_off_t offset = 0; /* read number */ @@ -1566,8 +1568,8 @@ allocate_item_index(apr_uint64_t *item_i | APR_CREATE | APR_BUFFERED, APR_OS_DEFAULT, scratch_pool)); SVN_ERR(svn_io_file_read_full2(file, buffer, sizeof(buffer)-1, - &read, &eof, scratch_pool)); - if (read) + &bytes_read, &eof, scratch_pool)); + if (bytes_read) SVN_ERR(svn_cstring_atoui64(item_index, buffer)); else *item_index = SVN_FS_X__ITEM_INDEX_FIRST_USER; @@ -2837,7 +2839,7 @@ validate_root_noderev(svn_fs_t *fs, Normally (rev == root_noderev->predecessor_count), but here we use a more roundabout check that should only trigger on new instances - of the corruption, rather then trigger on each and every new commit + of the corruption, rather than trigger on each and every new commit to a repository that has triggered the bug somewhere in its root noderev's history. */ @@ -3413,9 +3415,10 @@ get_writable_final_rev(apr_file_t **file /* Move the proto-rev file to its final location as revision data file. After that, we don't need to protect it anymore and can unlock it. */ - SVN_ERR(svn_error_compose_create(svn_io_file_rename(proto_rev_filename, - final_rev_filename, - scratch_pool), + SVN_ERR(svn_error_compose_create(svn_io_file_rename2(proto_rev_filename, + final_rev_filename, + FALSE, + scratch_pool), unlock_proto_rev(fs, txn_id, lockcookie, scratch_pool))); SVN_ERR(svn_fs_x__batch_fsync_new_path(batch, final_rev_filename, @@ -3493,8 +3496,8 @@ bump_ids(void *baton, /* Make the revision visible to all processes and threads. */ current_filename = svn_fs_x__path_current(b->fs, scratch_pool); - SVN_ERR(svn_io_file_rename(svn_fs_x__path_next(b->fs, scratch_pool), - current_filename, scratch_pool)); + SVN_ERR(svn_io_file_rename2(svn_fs_x__path_next(b->fs, scratch_pool), + current_filename, FALSE, scratch_pool)); SVN_ERR(svn_fs_x__batch_fsync_new_path(b->batch, current_filename, scratch_pool)); Modified: subversion/branches/patch-exec/subversion/libsvn_fs_x/util.c URL: http://svn.apache.org/viewvc/subversion/branches/patch-exec/subversion/libsvn_fs_x/util.c?rev=1703735&r1=1703734&r2=1703735&view=diff ============================================================================== --- subversion/branches/patch-exec/subversion/libsvn_fs_x/util.c (original) +++ subversion/branches/patch-exec/subversion/libsvn_fs_x/util.c Fri Sep 18 01:38:47 2015 @@ -549,8 +549,9 @@ svn_fs_x__write_min_unpacked_rev(svn_fs_ final_path = svn_fs_x__path_min_unpacked_rev(fs, scratch_pool); - SVN_ERR(svn_io_write_atomic(final_path, buf, len + 1, - final_path /* copy_perms */, scratch_pool)); + SVN_ERR(svn_io_write_atomic2(final_path, buf, len + 1, + final_path /* copy_perms */, TRUE, + scratch_pool)); return SVN_NO_ERROR; } @@ -734,7 +735,7 @@ svn_fs_x__move_into_place(const char *ol SVN_ERR(svn_io_copy_perms(perms_reference, old_filename, scratch_pool)); /* Move the file into place. */ - err = svn_io_file_rename(old_filename, new_filename, scratch_pool); + err = svn_io_file_rename2(old_filename, new_filename, FALSE, scratch_pool); if (err && APR_STATUS_IS_EXDEV(err->apr_err)) { apr_file_t *file; Modified: subversion/branches/patch-exec/subversion/libsvn_ra_serf/serf.c URL: http://svn.apache.org/viewvc/subversion/branches/patch-exec/subversion/libsvn_ra_serf/serf.c?rev=1703735&r1=1703734&r2=1703735&view=diff ============================================================================== --- subversion/branches/patch-exec/subversion/libsvn_ra_serf/serf.c (original) +++ subversion/branches/patch-exec/subversion/libsvn_ra_serf/serf.c Fri Sep 18 01:38:47 2015 @@ -355,19 +355,16 @@ load_config(svn_ra_serf__session_t *sess session->timeout = apr_time_from_sec(DEFAULT_HTTP_TIMEOUT); if (timeout_str) { - char *endstr; - const long int timeout = strtol(timeout_str, &endstr, 10); - - if (*endstr) - return svn_error_create(SVN_ERR_BAD_CONFIG_VALUE, NULL, - _("Invalid config: illegal character in " - "timeout value")); - if (timeout < 0) - return svn_error_create(SVN_ERR_BAD_CONFIG_VALUE, NULL, - _("Invalid config: negative timeout value")); + apr_int64_t timeout; + svn_error_t *err; + + err = svn_cstring_strtoi64(&timeout, timeout_str, 0, APR_INT64_MAX, 10); + if (err) + return svn_error_createf(SVN_ERR_BAD_CONFIG_VALUE, err, + _("invalid config: bad value for '%s' option"), + SVN_CONFIG_OPTION_HTTP_TIMEOUT); session->timeout = apr_time_from_sec(timeout); } - SVN_ERR_ASSERT(session->timeout >= 0); /* Convert the proxy port value, if any. */ if (port_str) @@ -445,12 +442,13 @@ load_config(svn_ra_serf__session_t *sess #undef DEFAULT_HTTP_TIMEOUT static void -svn_ra_serf__progress(void *progress_baton, apr_off_t read, apr_off_t written) +svn_ra_serf__progress(void *progress_baton, apr_off_t bytes_read, + apr_off_t bytes_written) { const svn_ra_serf__session_t *serf_sess = progress_baton; if (serf_sess->progress_func) { - serf_sess->progress_func(read + written, -1, + serf_sess->progress_func(bytes_read + bytes_written, -1, serf_sess->progress_baton, serf_sess->pool); } Modified: subversion/branches/patch-exec/subversion/libsvn_ra_serf/update.c URL: http://svn.apache.org/viewvc/subversion/branches/patch-exec/subversion/libsvn_ra_serf/update.c?rev=1703735&r1=1703734&r2=1703735&view=diff ============================================================================== --- subversion/branches/patch-exec/subversion/libsvn_ra_serf/update.c (original) +++ subversion/branches/patch-exec/subversion/libsvn_ra_serf/update.c Fri Sep 18 01:38:47 2015 @@ -1129,7 +1129,15 @@ handle_fetch(serf_request_t *request, /* Validate the delta base claimed by the server matches what we asked for! */ val = serf_bucket_headers_get(hdrs, SVN_DAV_DELTA_BASE_HEADER); - if (val && (strcmp(val, fetch_ctx->delta_base) != 0)) + if (val && fetch_ctx->delta_base == NULL) + { + /* We recieved response with delta base header while we didn't + requested it -- report it as error. */ + return svn_error_createf(SVN_ERR_RA_DAV_REQUEST_FAILED, NULL, + _("GET request returned unexpected " + "delta base: %s"), val); + } + else if (val && (strcmp(val, fetch_ctx->delta_base) != 0)) { return svn_error_createf(SVN_ERR_RA_DAV_REQUEST_FAILED, NULL, _("GET request returned unexpected " Modified: subversion/branches/patch-exec/subversion/libsvn_ra_serf/util.c URL: http://svn.apache.org/viewvc/subversion/branches/patch-exec/subversion/libsvn_ra_serf/util.c?rev=1703735&r1=1703734&r2=1703735&view=diff ============================================================================== --- subversion/branches/patch-exec/subversion/libsvn_ra_serf/util.c (original) +++ subversion/branches/patch-exec/subversion/libsvn_ra_serf/util.c Fri Sep 18 01:38:47 2015 @@ -65,7 +65,9 @@ ssl_convert_serf_failures(int failures) apr_uint32_t svn_failures = 0; apr_size_t i; - for (i = 0; i < sizeof(serf_failure_map) / (2 * sizeof(apr_uint32_t)); ++i) + for (i = 0; + i < sizeof(serf_failure_map) / (sizeof(serf_failure_map[0])); + ++i) { if (failures & serf_failure_map[i][0]) { Modified: subversion/branches/patch-exec/subversion/libsvn_ra_svn/client.c URL: http://svn.apache.org/viewvc/subversion/branches/patch-exec/subversion/libsvn_ra_svn/client.c?rev=1703735&r1=1703734&r2=1703735&view=diff ============================================================================== --- subversion/branches/patch-exec/subversion/libsvn_ra_svn/client.c (original) +++ subversion/branches/patch-exec/subversion/libsvn_ra_svn/client.c Fri Sep 18 01:38:47 2015 @@ -187,7 +187,7 @@ static svn_error_t *make_connection(cons /* Set *DIFFS to an array of svn_prop_t, allocated in POOL, based on the property diffs in LIST, received from the server. */ -static svn_error_t *parse_prop_diffs(const apr_array_header_t *list, +static svn_error_t *parse_prop_diffs(const svn_ra_svn__list_t *list, apr_pool_t *pool, apr_array_header_t **diffs) { @@ -198,21 +198,22 @@ static svn_error_t *parse_prop_diffs(con for (i = 0; i < list->nelts; i++) { svn_prop_t *prop; - svn_ra_svn_item_t *elt = &APR_ARRAY_IDX(list, i, svn_ra_svn_item_t); + svn_ra_svn__item_t *elt = &SVN_RA_SVN__LIST_ITEM(list, i); if (elt->kind != SVN_RA_SVN_LIST) return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Prop diffs element not a list")); prop = apr_array_push(*diffs); - SVN_ERR(svn_ra_svn__parse_tuple(elt->u.list, pool, "c(?s)", &prop->name, - &prop->value)); + SVN_ERR(svn_ra_svn__parse_tuple(&elt->u.list, pool, "c(?s)", + &prop->name, &prop->value)); } return SVN_NO_ERROR; } /* Parse a lockdesc, provided in LIST as specified by the protocol into LOCK, allocated in POOL. */ -static svn_error_t *parse_lock(const apr_array_header_t *list, apr_pool_t *pool, +static svn_error_t *parse_lock(const svn_ra_svn__list_t *list, + apr_pool_t *pool, svn_lock_t **lock) { const char *cdate, *edate; @@ -240,7 +241,7 @@ static svn_error_t *handle_auth_request( apr_pool_t *pool) { svn_ra_svn_conn_t *conn = sess->conn; - apr_array_header_t *mechlist; + svn_ra_svn__list_t *mechlist; const char *realm; SVN_ERR(svn_ra_svn__read_cmd_response(conn, pool, "lc", &mechlist, &realm)); @@ -624,7 +625,7 @@ static svn_error_t *open_session(svn_ra_ svn_ra_svn_conn_t *conn; apr_socket_t *sock; apr_uint64_t minver, maxver; - apr_array_header_t *mechlist, *server_caplist, *repos_caplist; + svn_ra_svn__list_t *mechlist, *server_caplist, *repos_caplist; const char *client_string = NULL; apr_pool_t *pool = result_pool; @@ -726,7 +727,7 @@ static svn_error_t *open_session(svn_ra_ return svn_error_createf(SVN_ERR_RA_SVN_BAD_VERSION, NULL, _("Server only supports versions up to %d"), (int) maxver); - SVN_ERR(svn_ra_svn_set_capabilities(conn, server_caplist)); + SVN_ERR(svn_ra_svn__set_capabilities(conn, server_caplist)); /* All released versions of Subversion support edit-pipeline, * so we do not support servers that do not. */ @@ -759,7 +760,7 @@ static svn_error_t *open_session(svn_ra_ SVN_ERR(svn_ra_svn__read_cmd_response(conn, pool, "c?c?l", &conn->uuid, &conn->repos_root, &repos_caplist)); if (repos_caplist) - SVN_ERR(svn_ra_svn_set_capabilities(conn, repos_caplist)); + SVN_ERR(svn_ra_svn__set_capabilities(conn, repos_caplist)); if (conn->repos_root) { @@ -1032,7 +1033,7 @@ static svn_error_t *ra_svn_rev_proplist( { svn_ra_svn__session_baton_t *sess_baton = session->priv; svn_ra_svn_conn_t *conn = sess_baton->conn; - apr_array_header_t *proplist; + svn_ra_svn__list_t *proplist; SVN_ERR(svn_ra_svn__write_cmd_rev_proplist(conn, pool, rev)); SVN_ERR(handle_auth_request(sess_baton, pool)); @@ -1179,12 +1180,12 @@ static svn_error_t *ra_svn_commit(svn_ra return SVN_NO_ERROR; } -/* Parse IPROPLIST, an array of svn_ra_svn_item_t structures, as a list of +/* Parse IPROPLIST, an array of svn_ra_svn__item_t structures, as a list of const char * repos relative paths and properties for those paths, storing the result as an array of svn_prop_inherited_item_t *items. */ static svn_error_t * parse_iproplist(apr_array_header_t **inherited_props, - const apr_array_header_t *iproplist, + const svn_ra_svn__list_t *iproplist, svn_ra_session_t *session, apr_pool_t *result_pool, apr_pool_t *scratch_pool) @@ -1213,14 +1214,13 @@ parse_iproplist(apr_array_header_t **inh for (i = 0; i < iproplist->nelts; i++) { - apr_array_header_t *iprop_list; + svn_ra_svn__list_t *iprop_list; char *parent_rel_path; apr_hash_t *iprops; apr_hash_index_t *hi; svn_prop_inherited_item_t *new_iprop = apr_palloc(result_pool, sizeof(*new_iprop)); - svn_ra_svn_item_t *elt = &APR_ARRAY_IDX(iproplist, i, - svn_ra_svn_item_t); + svn_ra_svn__item_t *elt = &SVN_RA_SVN__LIST_ITEM(iproplist, i); if (elt->kind != SVN_RA_SVN_LIST) return svn_error_create( SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, @@ -1228,7 +1228,7 @@ parse_iproplist(apr_array_header_t **inh svn_pool_clear(iterpool); - SVN_ERR(svn_ra_svn__parse_tuple(elt->u.list, iterpool, "cl", + SVN_ERR(svn_ra_svn__parse_tuple(&elt->u.list, iterpool, "cl", &parent_rel_path, &iprop_list)); SVN_ERR(svn_ra_svn__parse_proplist(iprop_list, iterpool, &iprops)); new_iprop->path_or_url = svn_path_url_add_component2(repos_root_url, @@ -1260,7 +1260,7 @@ static svn_error_t *ra_svn_get_file(svn_ { svn_ra_svn__session_baton_t *sess_baton = session->priv; svn_ra_svn_conn_t *conn = sess_baton->conn; - apr_array_header_t *proplist; + svn_ra_svn__list_t *proplist; const char *expected_digest; svn_checksum_t *expected_checksum = NULL; svn_checksum_ctx_t *checksum_ctx; @@ -1293,22 +1293,22 @@ static svn_error_t *ra_svn_get_file(svn_ iterpool = svn_pool_create(pool); while (1) { - svn_ra_svn_item_t *item; + svn_ra_svn__item_t *item; svn_pool_clear(iterpool); SVN_ERR(svn_ra_svn__read_item(conn, iterpool, &item)); if (item->kind != SVN_RA_SVN_STRING) return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Non-string as part of file contents")); - if (item->u.string->len == 0) + if (item->u.string.len == 0) break; if (expected_checksum) - SVN_ERR(svn_checksum_update(checksum_ctx, item->u.string->data, - item->u.string->len)); + SVN_ERR(svn_checksum_update(checksum_ctx, item->u.string.data, + item->u.string.len)); - SVN_ERR(svn_stream_write(stream, item->u.string->data, - &item->u.string->len)); + SVN_ERR(svn_stream_write(stream, item->u.string.data, + &item->u.string.len)); } svn_pool_destroy(iterpool); @@ -1339,7 +1339,7 @@ static svn_error_t *ra_svn_get_dir(svn_r { svn_ra_svn__session_baton_t *sess_baton = session->priv; svn_ra_svn_conn_t *conn = sess_baton->conn; - apr_array_header_t *proplist, *dirlist; + svn_ra_svn__list_t *proplist, *dirlist; int i; SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "w(c(?r)bb(!", "get-dir", path, @@ -1384,12 +1384,12 @@ static svn_error_t *ra_svn_get_dir(svn_r svn_dirent_t *dirent; apr_uint64_t size; svn_revnum_t crev; - svn_ra_svn_item_t *elt = &APR_ARRAY_IDX(dirlist, i, svn_ra_svn_item_t); + svn_ra_svn__item_t *elt = &SVN_RA_SVN__LIST_ITEM(dirlist, i); if (elt->kind != SVN_RA_SVN_LIST) return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Dirlist element not a list")); - SVN_ERR(svn_ra_svn__parse_tuple(elt->u.list, pool, "cwnbr(?c)(?c)", + SVN_ERR(svn_ra_svn__parse_tuple(&elt->u.list, pool, "cwnbr(?c)(?c)", &name, &kind, &size, &has_props, &crev, &cdate, &cauthor)); @@ -1451,8 +1451,8 @@ static svn_error_t *ra_svn_get_mergeinfo svn_ra_svn__session_baton_t *sess_baton = session->priv; svn_ra_svn_conn_t *conn = sess_baton->conn; int i; - apr_array_header_t *mergeinfo_tuple; - svn_ra_svn_item_t *elt; + svn_ra_svn__list_t *mergeinfo_tuple; + svn_ra_svn__item_t *elt; const char *path; SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "w((!", "get-mergeinfo")); @@ -1477,11 +1477,11 @@ static svn_error_t *ra_svn_get_mergeinfo svn_mergeinfo_t for_path; const char *to_parse; - elt = &((svn_ra_svn_item_t *) mergeinfo_tuple->elts)[i]; + elt = &SVN_RA_SVN__LIST_ITEM(mergeinfo_tuple, i); if (elt->kind != SVN_RA_SVN_LIST) return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Mergeinfo element is not a list")); - SVN_ERR(svn_ra_svn__parse_tuple(elt->u.list, pool, "cc", + SVN_ERR(svn_ra_svn__parse_tuple(&elt->u.list, pool, "cc", &path, &to_parse)); SVN_ERR(svn_mergeinfo_parse(&for_path, to_parse, pool)); /* Correct for naughty servers that send "relative" paths @@ -1684,12 +1684,12 @@ perform_ra_svn_log(svn_error_t **outer_e apr_uint64_t has_children_param, invalid_revnum_param; apr_uint64_t has_subtractive_merge_param; svn_string_t *author, *date, *message; - apr_array_header_t *cplist, *rplist; + svn_ra_svn__list_t *cplist, *rplist; svn_log_entry_t *log_entry; svn_boolean_t has_children; svn_boolean_t subtractive_merge = FALSE; apr_uint64_t revprop_count; - svn_ra_svn_item_t *item; + svn_ra_svn__item_t *item; apr_hash_t *cphash; svn_revnum_t rev; @@ -1700,7 +1700,7 @@ perform_ra_svn_log(svn_error_t **outer_e if (item->kind != SVN_RA_SVN_LIST) return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Log entry not a list")); - SVN_ERR(svn_ra_svn__parse_tuple(item->u.list, iterpool, + SVN_ERR(svn_ra_svn__parse_tuple(&item->u.list, iterpool, "lr(?s)(?s)(?s)?BBnl?B", &cplist, &rev, &author, &date, &message, &has_children_param, @@ -1742,13 +1742,12 @@ perform_ra_svn_log(svn_error_t **outer_e const char *copy_path, *action, *kind_str; apr_uint64_t text_mods, prop_mods; svn_revnum_t copy_rev; - svn_ra_svn_item_t *elt = &APR_ARRAY_IDX(cplist, i, - svn_ra_svn_item_t); + svn_ra_svn__item_t *elt = &SVN_RA_SVN__LIST_ITEM(cplist, i); if (elt->kind != SVN_RA_SVN_LIST) return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Changed-path entry not a list")); - SVN_ERR(svn_ra_svn__read_data_log_changed_entry(elt->u.list, + SVN_ERR(svn_ra_svn__read_data_log_changed_entry(&elt->u.list, &cpath, &action, ©_path, ©_rev, &kind_str, &text_mods, &prop_mods)); @@ -1897,7 +1896,7 @@ static svn_error_t *ra_svn_stat(svn_ra_s { svn_ra_svn__session_baton_t *sess_baton = session->priv; svn_ra_svn_conn_t *conn = sess_baton->conn; - apr_array_header_t *list = NULL; + svn_ra_svn__list_t *list = NULL; svn_dirent_t *the_dirent; SVN_ERR(svn_ra_svn__write_cmd_stat(conn, pool, path, rev)); @@ -1968,7 +1967,7 @@ static svn_error_t *ra_svn_get_locations *locations = apr_hash_make(pool); while (!is_done) { - svn_ra_svn_item_t *item; + svn_ra_svn__item_t *item; const char *ret_path; SVN_ERR(svn_ra_svn__read_item(conn, pool, &item)); @@ -1979,7 +1978,7 @@ static svn_error_t *ra_svn_get_locations _("Location entry not a list")); else { - SVN_ERR(svn_ra_svn__parse_tuple(item->u.list, pool, "rc", + SVN_ERR(svn_ra_svn__parse_tuple(&item->u.list, pool, "rc", &revision, &ret_path)); ret_path = svn_fspath__canonicalize(ret_path, pool); apr_hash_set(*locations, apr_pmemdup(pool, &revision, @@ -2024,7 +2023,7 @@ perform_get_location_segments(svn_error_ while (!is_done) { svn_revnum_t range_start, range_end; - svn_ra_svn_item_t *item; + svn_ra_svn__item_t *item; const char *ret_path; svn_pool_clear(iterpool); @@ -2038,7 +2037,7 @@ perform_get_location_segments(svn_error_ { svn_location_segment_t *segment = apr_pcalloc(iterpool, sizeof(*segment)); - SVN_ERR(svn_ra_svn__parse_tuple(item->u.list, iterpool, "rr(?c)", + SVN_ERR(svn_ra_svn__parse_tuple(&item->u.list, iterpool, "rr(?c)", &range_start, &range_end, &ret_path)); if (! (SVN_IS_VALID_REVNUM(range_start) && SVN_IS_VALID_REVNUM(range_end))) @@ -2118,10 +2117,10 @@ static svn_error_t *ra_svn_get_file_revs while (1) { - apr_array_header_t *rev_proplist, *proplist; + svn_ra_svn__list_t *rev_proplist, *proplist; apr_uint64_t merged_rev_param; apr_array_header_t *props; - svn_ra_svn_item_t *item; + svn_ra_svn__item_t *item; apr_hash_t *rev_props; svn_revnum_t rev; const char *p; @@ -2140,7 +2139,7 @@ static svn_error_t *ra_svn_get_file_revs return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Revision entry not a list")); - SVN_ERR(svn_ra_svn__parse_tuple(item->u.list, rev_pool, + SVN_ERR(svn_ra_svn__parse_tuple(&item->u.list, rev_pool, "crll?B", &p, &rev, &rev_proplist, &proplist, &merged_rev_param)); p = svn_fspath__canonicalize(p, rev_pool); @@ -2156,7 +2155,7 @@ static svn_error_t *ra_svn_get_file_revs if (item->kind != SVN_RA_SVN_STRING) return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Text delta chunk not a string")); - has_txdelta = item->u.string->len > 0; + has_txdelta = item->u.string.len > 0; SVN_ERR(handler(handler_baton, p, rev, rev_props, merged_rev, has_txdelta ? &d_handler : NULL, &d_baton, @@ -2172,13 +2171,13 @@ static svn_error_t *ra_svn_get_file_revs rev_pool); else stream = NULL; - while (item->u.string->len > 0) + while (item->u.string.len > 0) { apr_size_t size; - size = item->u.string->len; + size = item->u.string.len; if (stream) - SVN_ERR(svn_stream_write(stream, item->u.string->data, &size)); + SVN_ERR(svn_stream_write(stream, item->u.string.data, &size)); svn_pool_clear(chunk_pool); SVN_ERR(svn_ra_svn__read_item(sess_baton->conn, chunk_pool, @@ -2220,7 +2219,7 @@ static svn_error_t *ra_svn_lock_compat(s { svn_ra_svn__session_baton_t *sess = session->priv; svn_ra_svn_conn_t* conn = sess->conn; - apr_array_header_t *list; + svn_ra_svn__list_t *list; apr_hash_index_t *hi; apr_pool_t *iterpool = svn_pool_create(pool); @@ -2383,13 +2382,13 @@ static svn_error_t *ra_svn_lock(svn_ra_s /* Loop over responses to get lock information. */ for (hi = apr_hash_first(pool, path_revs); hi; hi = apr_hash_next(hi)) { - svn_ra_svn_item_t *elt; + svn_ra_svn__item_t *elt; const void *key; const char *path; svn_error_t *callback_err; const char *status; svn_lock_t *lock; - apr_array_header_t *list; + svn_ra_svn__list_t *list; apr_hash_this(hi, &key, NULL, NULL); path = key; @@ -2408,7 +2407,7 @@ static svn_error_t *ra_svn_lock(svn_ra_s return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Lock response not a list")); - SVN_ERR(svn_ra_svn__parse_tuple(elt->u.list, iterpool, "wl", &status, + SVN_ERR(svn_ra_svn__parse_tuple(&elt->u.list, iterpool, "wl", &status, &list)); if (strcmp(status, "failure") == 0) @@ -2439,7 +2438,7 @@ static svn_error_t *ra_svn_lock(svn_ra_s read the final "done" from the server. */ if (!hi) { - svn_ra_svn_item_t *elt; + svn_ra_svn__item_t *elt; SVN_ERR(svn_ra_svn__read_item(conn, pool, &elt)); if (elt->kind != SVN_RA_SVN_WORD || strcmp(elt->u.word, "done") != 0) @@ -2512,11 +2511,11 @@ static svn_error_t *ra_svn_unlock(svn_ra /* Loop over responses to unlock files. */ for (hi = apr_hash_first(pool, path_tokens); hi; hi = apr_hash_next(hi)) { - svn_ra_svn_item_t *elt; + svn_ra_svn__item_t *elt; const void *key; svn_error_t *callback_err; const char *status; - apr_array_header_t *list; + svn_ra_svn__list_t *list; svn_pool_clear(iterpool); @@ -2536,7 +2535,7 @@ static svn_error_t *ra_svn_unlock(svn_ra return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Unlock response not a list")); - SVN_ERR(svn_ra_svn__parse_tuple(elt->u.list, iterpool, "wl", &status, + SVN_ERR(svn_ra_svn__parse_tuple(&elt->u.list, iterpool, "wl", &status, &list)); if (strcmp(status, "failure") == 0) @@ -2566,7 +2565,7 @@ static svn_error_t *ra_svn_unlock(svn_ra read the final "done" from the server. */ if (!hi) { - svn_ra_svn_item_t *elt; + svn_ra_svn__item_t *elt; SVN_ERR(svn_ra_svn__read_item(conn, pool, &elt)); if (elt->kind != SVN_RA_SVN_WORD || strcmp(elt->u.word, "done") != 0) @@ -2589,7 +2588,7 @@ static svn_error_t *ra_svn_get_lock(svn_ { svn_ra_svn__session_baton_t *sess = session->priv; svn_ra_svn_conn_t* conn = sess->conn; - apr_array_header_t *list; + svn_ra_svn__list_t *list; SVN_ERR(svn_ra_svn__write_cmd_get_lock(conn, pool, path)); @@ -2634,7 +2633,7 @@ static svn_error_t *ra_svn_get_locks(svn { svn_ra_svn__session_baton_t *sess = session->priv; svn_ra_svn_conn_t* conn = sess->conn; - apr_array_header_t *list; + svn_ra_svn__list_t *list; const char *full_url, *abs_path; int i; @@ -2657,12 +2656,12 @@ static svn_error_t *ra_svn_get_locks(svn for (i = 0; i < list->nelts; ++i) { svn_lock_t *lock; - svn_ra_svn_item_t *elt = &APR_ARRAY_IDX(list, i, svn_ra_svn_item_t); + svn_ra_svn__item_t *elt = &SVN_RA_SVN__LIST_ITEM(list, i); if (elt->kind != SVN_RA_SVN_LIST) return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL, _("Lock element not a list")); - SVN_ERR(parse_lock(elt->u.list, pool, &lock)); + SVN_ERR(parse_lock(&elt->u.list, pool, &lock)); /* Filter out unwanted paths. Since Subversion only allows locks on files, we can treat depth=immediates the same as @@ -2745,7 +2744,7 @@ ra_svn_replay_range(svn_ra_session_t *se void *edit_baton; apr_hash_t *rev_props; const char *word; - apr_array_header_t *list; + svn_ra_svn__list_t *list; svn_pool_clear(iterpool); @@ -2877,7 +2876,7 @@ ra_svn_get_inherited_props(svn_ra_sessio { svn_ra_svn__session_baton_t *sess_baton = session->priv; svn_ra_svn_conn_t *conn = sess_baton->conn; - apr_array_header_t *iproplist; + svn_ra_svn__list_t *iproplist; svn_boolean_t iprop_capable; SVN_ERR(ra_svn_has_capability(session, &iprop_capable, Modified: subversion/branches/patch-exec/subversion/libsvn_ra_svn/cram.c URL: http://svn.apache.org/viewvc/subversion/branches/patch-exec/subversion/libsvn_ra_svn/cram.c?rev=1703735&r1=1703734&r2=1703735&view=diff ============================================================================== --- subversion/branches/patch-exec/subversion/libsvn_ra_svn/cram.c (original) +++ subversion/branches/patch-exec/subversion/libsvn_ra_svn/cram.c Fri Sep 18 01:38:47 2015 @@ -140,7 +140,7 @@ svn_error_t *svn_ra_svn_cram_server(svn_ char hostbuf[APRMAXHOSTLEN + 1]; unsigned char cdigest[APR_MD5_DIGESTSIZE], sdigest[APR_MD5_DIGESTSIZE]; const char *challenge, *sep, *password; - svn_ra_svn_item_t *item; + svn_ra_svn__item_t *item; svn_string_t *resp; *success = FALSE; @@ -160,7 +160,7 @@ svn_error_t *svn_ra_svn_cram_server(svn_ SVN_ERR(svn_ra_svn__read_item(conn, pool, &item)); if (item->kind != SVN_RA_SVN_STRING) /* Very wrong; don't report failure */ return SVN_NO_ERROR; - resp = item->u.string; + resp = &item->u.string; sep = strrchr(resp->data, ' '); if (!sep || resp->len - (sep + 1 - resp->data) != APR_MD5_DIGESTSIZE * 2 || !hex_decode(cdigest, sep + 1)) Modified: subversion/branches/patch-exec/subversion/libsvn_ra_svn/cyrus_auth.c URL: http://svn.apache.org/viewvc/subversion/branches/patch-exec/subversion/libsvn_ra_svn/cyrus_auth.c?rev=1703735&r1=1703734&r2=1703735&view=diff ============================================================================== --- subversion/branches/patch-exec/subversion/libsvn_ra_svn/cyrus_auth.c (original) +++ subversion/branches/patch-exec/subversion/libsvn_ra_svn/cyrus_auth.c Fri Sep 18 01:38:47 2015 @@ -828,7 +828,7 @@ svn_error_t *svn_ra_svn__get_addresses(c svn_error_t * svn_ra_svn__do_cyrus_auth(svn_ra_svn__session_baton_t *sess, - const apr_array_header_t *mechlist, + const svn_ra_svn__list_t *mechlist, const char *realm, apr_pool_t *pool) { apr_pool_t *subpool; @@ -856,7 +856,7 @@ svn_ra_svn__do_cyrus_auth(svn_ra_svn__se /* Create a string containing the list of mechanisms, separated by spaces. */ for (i = 0; i < mechlist->nelts; i++) { - svn_ra_svn_item_t *elt = &APR_ARRAY_IDX(mechlist, i, svn_ra_svn_item_t); + svn_ra_svn__item_t *elt = &SVN_RA_SVN__LIST_ITEM(mechlist, i); mechstring = apr_pstrcat(pool, mechstring, i == 0 ? "" : " ",