You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by da...@apache.org on 2015/09/18 03:38:50 UTC
svn commit: r1703735 [3/8] - in /subversion/branches/patch-exec: ./ build/
build/ac-macros/ build/generator/ build/generator/templates/
contrib/hook-scripts/ notes/ subversion/ subversion/bindings/swig/include/
subversion/include/ subversion/include/pr...
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 ? "" : " ",