You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by br...@apache.org on 2015/01/28 00:27:46 UTC
svn commit: r1655189 [1/9] - in /subversion/branches/svn-auth-x509: ./
build/ build/generator/ subversion/bindings/javahl/native/
subversion/include/ subversion/include/private/ subversion/libsvn_client/
subversion/libsvn_fs_base/ subversion/libsvn_fs_...
Author: breser
Date: Tue Jan 27 23:27:44 2015
New Revision: 1655189
URL: http://svn.apache.org/r1655189
Log:
On the svn-auth-x509 branch: Sync with trunk up to r1655188.
Modified:
subversion/branches/svn-auth-x509/ (props changed)
subversion/branches/svn-auth-x509/COMMITTERS
subversion/branches/svn-auth-x509/build/generator/gen_win_dependencies.py
subversion/branches/svn-auth-x509/build/run_tests.py
subversion/branches/svn-auth-x509/subversion/bindings/javahl/native/CreateJ.cpp
subversion/branches/svn-auth-x509/subversion/bindings/javahl/native/RemoteSession.cpp
subversion/branches/svn-auth-x509/subversion/include/private/svn_repos_private.h
subversion/branches/svn-auth-x509/subversion/include/svn_ra.h
subversion/branches/svn-auth-x509/subversion/include/svn_ra_svn.h
subversion/branches/svn-auth-x509/subversion/include/svn_repos.h
subversion/branches/svn-auth-x509/subversion/libsvn_client/deprecated.c
subversion/branches/svn-auth-x509/subversion/libsvn_client/externals.c
subversion/branches/svn-auth-x509/subversion/libsvn_client/mergeinfo.c
subversion/branches/svn-auth-x509/subversion/libsvn_client/patch.c
subversion/branches/svn-auth-x509/subversion/libsvn_fs_base/dag.c
subversion/branches/svn-auth-x509/subversion/libsvn_fs_fs/fs_fs.c
subversion/branches/svn-auth-x509/subversion/libsvn_fs_fs/index.c
subversion/branches/svn-auth-x509/subversion/libsvn_fs_fs/revprops.c
subversion/branches/svn-auth-x509/subversion/libsvn_fs_fs/structure
subversion/branches/svn-auth-x509/subversion/libsvn_fs_fs/transaction.c
subversion/branches/svn-auth-x509/subversion/libsvn_fs_fs/tree.c
subversion/branches/svn-auth-x509/subversion/libsvn_fs_x/ (props changed)
subversion/branches/svn-auth-x509/subversion/libsvn_fs_x/cached_data.c
subversion/branches/svn-auth-x509/subversion/libsvn_fs_x/cached_data.h
subversion/branches/svn-auth-x509/subversion/libsvn_fs_x/caching.c
subversion/branches/svn-auth-x509/subversion/libsvn_fs_x/dag.c
subversion/branches/svn-auth-x509/subversion/libsvn_fs_x/dag.h
subversion/branches/svn-auth-x509/subversion/libsvn_fs_x/fs.c
subversion/branches/svn-auth-x509/subversion/libsvn_fs_x/fs.h
subversion/branches/svn-auth-x509/subversion/libsvn_fs_x/fs_x.c
subversion/branches/svn-auth-x509/subversion/libsvn_fs_x/hotcopy.c
subversion/branches/svn-auth-x509/subversion/libsvn_fs_x/lock.c
subversion/branches/svn-auth-x509/subversion/libsvn_fs_x/pack.c
subversion/branches/svn-auth-x509/subversion/libsvn_fs_x/recovery.c
subversion/branches/svn-auth-x509/subversion/libsvn_fs_x/rep-cache.c
subversion/branches/svn-auth-x509/subversion/libsvn_fs_x/rep-cache.h
subversion/branches/svn-auth-x509/subversion/libsvn_fs_x/revprops.c
subversion/branches/svn-auth-x509/subversion/libsvn_fs_x/temp_serializer.c
subversion/branches/svn-auth-x509/subversion/libsvn_fs_x/temp_serializer.h
subversion/branches/svn-auth-x509/subversion/libsvn_fs_x/transaction.c
subversion/branches/svn-auth-x509/subversion/libsvn_fs_x/transaction.h
subversion/branches/svn-auth-x509/subversion/libsvn_fs_x/tree.c
subversion/branches/svn-auth-x509/subversion/libsvn_fs_x/tree.h
subversion/branches/svn-auth-x509/subversion/libsvn_fs_x/util.c
subversion/branches/svn-auth-x509/subversion/libsvn_fs_x/util.h
subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/blame.c
subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/blncache.c
subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/blncache.h
subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/commit.c
subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/get_deleted_rev.c
subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/get_file.c
subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/get_lock.c
subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/getdate.c
subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/getlocations.c
subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/getlocationsegments.c
subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/getlocks.c
subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/inherited_props.c
subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/lock.c
subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/log.c
subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/merge.c
subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/mergeinfo.c
subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/multistatus.c
subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/options.c
subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/property.c
subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/ra_serf.h
subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/replay.c
subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/serf.c
subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/stat.c
subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/update.c
subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/util.c
subversion/branches/svn-auth-x509/subversion/libsvn_ra_serf/xml.c
subversion/branches/svn-auth-x509/subversion/libsvn_repos/commit.c
subversion/branches/svn-auth-x509/subversion/libsvn_repos/dump.c
subversion/branches/svn-auth-x509/subversion/libsvn_repos/load-fs-vtable.c
subversion/branches/svn-auth-x509/subversion/libsvn_subr/checksum.c
subversion/branches/svn-auth-x509/subversion/libsvn_subr/io.c
subversion/branches/svn-auth-x509/subversion/libsvn_subr/prefix_string.c
subversion/branches/svn-auth-x509/subversion/libsvn_subr/sqlite.c
subversion/branches/svn-auth-x509/subversion/libsvn_subr/stream.c
subversion/branches/svn-auth-x509/subversion/libsvn_wc/conflicts.c
subversion/branches/svn-auth-x509/subversion/libsvn_wc/merge.c
subversion/branches/svn-auth-x509/subversion/libsvn_wc/wc_db.c
subversion/branches/svn-auth-x509/subversion/libsvn_wc/wc_db_update_move.c
subversion/branches/svn-auth-x509/subversion/mod_authz_svn/mod_authz_svn.c
subversion/branches/svn-auth-x509/subversion/mod_dav_svn/liveprops.c
subversion/branches/svn-auth-x509/subversion/mod_dav_svn/merge.c
subversion/branches/svn-auth-x509/subversion/svnadmin/svnadmin.c
subversion/branches/svn-auth-x509/subversion/svndumpfilter/svndumpfilter.c
subversion/branches/svn-auth-x509/subversion/svnmucc/svnmucc.c
subversion/branches/svn-auth-x509/subversion/svnrdump/dump_editor.c
subversion/branches/svn-auth-x509/subversion/svnrdump/load_editor.c
subversion/branches/svn-auth-x509/subversion/svnrdump/svnrdump.c
subversion/branches/svn-auth-x509/subversion/tests/cmdline/patch_tests.py
subversion/branches/svn-auth-x509/subversion/tests/cmdline/prop_tests.py
subversion/branches/svn-auth-x509/subversion/tests/cmdline/svnrdump_tests.py
subversion/branches/svn-auth-x509/subversion/tests/cmdline/svntest/verify.py
subversion/branches/svn-auth-x509/subversion/tests/libsvn_diff/parse-diff-test.c
subversion/branches/svn-auth-x509/subversion/tests/libsvn_fs_fs/fs-fs-pack-test.c
subversion/branches/svn-auth-x509/subversion/tests/libsvn_subr/auth-test.c
subversion/branches/svn-auth-x509/subversion/tests/libsvn_subr/dirent_uri-test.c
subversion/branches/svn-auth-x509/subversion/tests/libsvn_subr/io-test.c
subversion/branches/svn-auth-x509/subversion/tests/libsvn_subr/mergeinfo-test.c
subversion/branches/svn-auth-x509/subversion/tests/libsvn_wc/conflict-data-test.c
subversion/branches/svn-auth-x509/subversion/tests/libsvn_wc/op-depth-test.c
subversion/branches/svn-auth-x509/tools/buildbot/slaves/svn-sparc-solaris/svnbuild.sh
subversion/branches/svn-auth-x509/tools/buildbot/slaves/svn-sparc-solaris/svncheck.sh
Propchange: subversion/branches/svn-auth-x509/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Jan 27 23:27:44 2015
@@ -85,4 +85,4 @@
/subversion/branches/verify-at-commit:1462039-1462408
/subversion/branches/verify-keep-going:1439280-1546110
/subversion/branches/wc-collate-path:1402685-1480384
-/subversion/trunk:1603509-1652406
+/subversion/trunk:1603509-1655188
Modified: subversion/branches/svn-auth-x509/COMMITTERS
URL: http://svn.apache.org/viewvc/subversion/branches/svn-auth-x509/COMMITTERS?rev=1655189&r1=1655188&r2=1655189&view=diff
==============================================================================
--- subversion/branches/svn-auth-x509/COMMITTERS [UTF-8] (original)
+++ subversion/branches/svn-auth-x509/COMMITTERS [UTF-8] Tue Jan 27 23:27:44 2015
@@ -164,7 +164,7 @@ Commit access for specific areas:
humbedooh Daniel Gruno <hu...@apache.org> (svnpubsub)
prabhugs Prabhu Gnana Sundar <pp...@gmail.com> (verify-keep-going)
schabi Markus Schaber <sc...@apache.org> (testsuite)
- gbg Gabriela Gibson <ga...@gmail.com> (gtest)
+ gbg Gabriela Gibson <ga...@gmail.com> (gtest)
Translation of message files:
Modified: subversion/branches/svn-auth-x509/build/generator/gen_win_dependencies.py
URL: http://svn.apache.org/viewvc/subversion/branches/svn-auth-x509/build/generator/gen_win_dependencies.py?rev=1655189&r1=1655188&r2=1655189&view=diff
==============================================================================
--- subversion/branches/svn-auth-x509/build/generator/gen_win_dependencies.py (original)
+++ subversion/branches/svn-auth-x509/build/generator/gen_win_dependencies.py Tue Jan 27 23:27:44 2015
@@ -838,7 +838,7 @@ class GenDependenciesBase(gen_base.Gener
txt = open(version_path).read()
vermatch = re.search(
- r'#define OPENSSL_VERSION_TEXT\s+"OpenSSL\s+((\d+)\.(\d+).(\d+)([^ -]*))',
+ r'#\s*define\s+OPENSSL_VERSION_TEXT\s+"OpenSSL\s+((\d+)\.(\d+).(\d+)([^ -]*))',
txt)
version = (int(vermatch.group(2)),
Modified: subversion/branches/svn-auth-x509/build/run_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/svn-auth-x509/build/run_tests.py?rev=1655189&r1=1655188&r2=1655189&view=diff
==============================================================================
--- subversion/branches/svn-auth-x509/build/run_tests.py (original)
+++ subversion/branches/svn-auth-x509/build/run_tests.py Tue Jan 27 23:27:44 2015
@@ -207,15 +207,12 @@ class TestHarness:
self._open_log('w')
failed = 0
- # Only run the C tests when testing ra_local
+ # If asked to skip C tests, remove non-Python tests from the list
if self.skip_c_tests:
- filtered_list = []
- for cnt, prog in enumerate(list):
+ def is_py_test(prog):
progpath, nums = self._split_nums(prog)
- if not progpath.endswith('.py'):
- continue
- filtered_list.append(prog)
- list = filtered_list
+ return progpath.endswith('.py')
+ list = filter(is_py_test, list)
for cnt, prog in enumerate(list):
failed = self._run_test(prog, cnt, len(list)) or failed
Modified: subversion/branches/svn-auth-x509/subversion/bindings/javahl/native/CreateJ.cpp
URL: http://svn.apache.org/viewvc/subversion/branches/svn-auth-x509/subversion/bindings/javahl/native/CreateJ.cpp?rev=1655189&r1=1655188&r2=1655189&view=diff
==============================================================================
--- subversion/branches/svn-auth-x509/subversion/bindings/javahl/native/CreateJ.cpp (original)
+++ subversion/branches/svn-auth-x509/subversion/bindings/javahl/native/CreateJ.cpp Tue Jan 27 23:27:44 2015
@@ -1096,8 +1096,7 @@ void fill_property_map(jobject map,
apr_hash_t* prop_hash, apr_array_header_t* prop_diffs,
apr_pool_t* scratch_pool, jmethodID put_mid)
{
- SVN_ERR_ASSERT_NO_RETURN(!prop_hash != !prop_diffs
- || !prop_hash && !prop_diffs);
+ SVN_ERR_ASSERT_NO_RETURN(!(prop_hash && prop_diffs));
if (!map || (prop_hash == NULL && prop_diffs == NULL))
return;
@@ -1189,8 +1188,7 @@ void fill_property_map(jobject map,
jobject property_map(apr_hash_t *prop_hash, apr_array_header_t* prop_diffs,
apr_pool_t* scratch_pool)
{
- SVN_ERR_ASSERT_NO_RETURN(!prop_hash != !prop_diffs
- || !prop_hash && !prop_diffs);
+ SVN_ERR_ASSERT_NO_RETURN(!(prop_hash && prop_diffs));
if (prop_hash == NULL && prop_diffs == NULL)
return NULL;
Modified: subversion/branches/svn-auth-x509/subversion/bindings/javahl/native/RemoteSession.cpp
URL: http://svn.apache.org/viewvc/subversion/branches/svn-auth-x509/subversion/bindings/javahl/native/RemoteSession.cpp?rev=1655189&r1=1655188&r2=1655189&view=diff
==============================================================================
--- subversion/branches/svn-auth-x509/subversion/bindings/javahl/native/RemoteSession.cpp (original)
+++ subversion/branches/svn-auth-x509/subversion/bindings/javahl/native/RemoteSession.cpp Tue Jan 27 23:27:44 2015
@@ -71,8 +71,7 @@ RemoteSession::open(jint jretryAttempts,
jobject jprompter, jobject jdeprecatedPrompter,
jobject jprogress, jobject jcfgcb, jobject jtunnelcb)
{
- SVN_ERR_ASSERT_NO_RETURN(!jprompter != !jdeprecatedPrompter
- || !jprompter && !jdeprecatedPrompter);
+ SVN_ERR_ASSERT_NO_RETURN(!(jprompter && jdeprecatedPrompter));
SVN::Pool requestPool;
URL url(jurl, requestPool);
Modified: subversion/branches/svn-auth-x509/subversion/include/private/svn_repos_private.h
URL: http://svn.apache.org/viewvc/subversion/branches/svn-auth-x509/subversion/include/private/svn_repos_private.h?rev=1655189&r1=1655188&r2=1655189&view=diff
==============================================================================
--- subversion/branches/svn-auth-x509/subversion/include/private/svn_repos_private.h (original)
+++ subversion/branches/svn-auth-x509/subversion/include/private/svn_repos_private.h Tue Jan 27 23:27:44 2015
@@ -260,6 +260,137 @@ svn_repos__authz_pool_get(svn_authz_t **
/** @} */
+/* Adjust mergeinfo paths and revisions in ways that are useful when loading
+ * a dump stream.
+ *
+ * Set *NEW_VALUE_P to an adjusted version of the mergeinfo property value
+ * supplied in OLD_VALUE, with the following adjustments.
+ *
+ * - Normalize line endings: if all CRLF, change to LF; but error if
+ * mixed. If this normalization is performed, send a notification type
+ * svn_repos_notify_load_normalized_mergeinfo to NOTIFY_FUNC/NOTIFY_BATON.
+ *
+ * - Prefix all the merge source paths with PARENT_DIR, if not null.
+ *
+ * - Adjust any mergeinfo revisions not older than OLDEST_DUMPSTREAM_REV
+ * by using REV_MAP which maps (svn_revnum_t) old rev to (svn_revnum_t)
+ * new rev.
+ *
+ * - Adjust any mergeinfo revisions older than OLDEST_DUMPSTREAM_REV by
+ * (-OLDER_REVS_OFFSET), dropping any revisions that become <= 0.
+ *
+ * Allocate *NEW_VALUE_P in RESULT_POOL.
+ */
+svn_error_t *
+svn_repos__adjust_mergeinfo_property(svn_string_t **new_value_p,
+ const svn_string_t *old_value,
+ const char *parent_dir,
+ apr_hash_t *rev_map,
+ svn_revnum_t oldest_dumpstream_rev,
+ apr_int32_t older_revs_offset,
+ svn_repos_notify_func_t notify_func,
+ void *notify_baton,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* A header entry.
+ *
+ * (The headers are currently declared here to be of type apr_array_header_t
+ * with svn_repos__dumpfile_header_entry_t entries, but the types could
+ * instead be made opaque.)
+ */
+typedef struct svn_repos__dumpfile_header_entry_t {
+ const char *key, *val;
+} svn_repos__dumpfile_header_entry_t;
+
+/* Create an empty set of headers.
+ */
+apr_array_header_t *
+svn_repos__dumpfile_headers_create(apr_pool_t *pool);
+
+/* Push the header (KEY, VAL) onto HEADERS.
+ *
+ * Duplicate the key and value into HEADERS's pool.
+ */
+void
+svn_repos__dumpfile_header_push(apr_array_header_t *headers,
+ const char *key,
+ const char *val);
+
+/* Push the header (KEY, val = VAL_FMT ...) onto HEADERS.
+ *
+ * Duplicate the key and value into HEADERS's pool.
+ */
+void
+svn_repos__dumpfile_header_pushf(apr_array_header_t *headers,
+ const char *key,
+ const char *val_fmt,
+ ...)
+ __attribute__((format(printf, 3, 4)));
+
+/* Write to STREAM the headers in HEADERS followed by a blank line.
+ *
+ * HEADERS is an array of struct {const char *key, *val;}.
+ */
+svn_error_t *
+svn_repos__dump_headers(svn_stream_t *stream,
+ apr_array_header_t *headers,
+ svn_boolean_t terminate,
+ apr_pool_t *scratch_pool);
+
+/* Write a revision record to DUMP_STREAM for revision REVISION with revision
+ * properies REVPROPS, creating appropriate headers.
+ *
+ * Include all of the headers in EXTRA_HEADERS (if non-null), ignoring
+ * the revision number header and the three content length headers (which
+ * will be recreated as needed). EXTRA_HEADERS maps (char *) key to
+ * (char *) value.
+ *
+ * REVPROPS maps (char *) key to (svn_string_t *) value.
+ *
+ * Iff PROPS_SECTION_ALWAYS is true, include a prop content section (and
+ * corresponding header) even when REVPROPS is empty. This option exists
+ * to support a historical difference between svndumpfilter and svnadmin
+ * dump.
+ *
+ * Finally write another blank line.
+ */
+svn_error_t *
+svn_repos__dump_revision_record(svn_stream_t *dump_stream,
+ svn_revnum_t revision,
+ apr_hash_t *extra_headers,
+ apr_hash_t *revprops,
+ svn_boolean_t props_section_always,
+ apr_pool_t *scratch_pool);
+
+/* Output node headers and props.
+ *
+ * Output HEADERS, content length headers, blank line, and
+ * then PROPS_STR (if non-null) to DUMP_STREAM.
+ *
+ * HEADERS is an array of headers as struct {const char *key, *val;}.
+ * Write them all in the given order.
+ *
+ * PROPS_STR is the property content block, including a terminating
+ * 'PROPS_END\n' line. Iff PROPS_STR is non-null, write a
+ * Prop-content-length header and the prop content block.
+ *
+ * Iff HAS_TEXT is true, write a Text-content length, using the value
+ * TEXT_CONTENT_LENGTH.
+ *
+ * Write a Content-length header, its value being the sum of the
+ * Prop- and Text- content length headers, if props and/or text are present
+ * or if CONTENT_LENGTH_ALWAYS is true.
+ */
+svn_error_t *
+svn_repos__dump_node_record(svn_stream_t *dump_stream,
+ apr_array_header_t *headers,
+ svn_stringbuf_t *props_str,
+ svn_boolean_t has_text,
+ svn_filesize_t text_content_length,
+ svn_boolean_t content_length_always,
+ apr_pool_t *scratch_pool);
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
Modified: subversion/branches/svn-auth-x509/subversion/include/svn_ra.h
URL: http://svn.apache.org/viewvc/subversion/branches/svn-auth-x509/subversion/include/svn_ra.h?rev=1655189&r1=1655188&r2=1655189&view=diff
==============================================================================
--- subversion/branches/svn-auth-x509/subversion/include/svn_ra.h (original)
+++ subversion/branches/svn-auth-x509/subversion/include/svn_ra.h Tue Jan 27 23:27:44 2015
@@ -1011,6 +1011,10 @@ svn_ra_rev_prop(svn_ra_session_t *sessio
* Use @a pool for memory allocation.
*
* @since New in 1.5.
+ *
+ * @note Like most commit editors, the returned editor requires that the
+ * @c copyfrom_path parameter passed to its @c add_file and @c add_directory
+ * methods is a URL, not a relative path.
*/
svn_error_t *
svn_ra_get_commit_editor3(svn_ra_session_t *session,
Modified: subversion/branches/svn-auth-x509/subversion/include/svn_ra_svn.h
URL: http://svn.apache.org/viewvc/subversion/branches/svn-auth-x509/subversion/include/svn_ra_svn.h?rev=1655189&r1=1655188&r2=1655189&view=diff
==============================================================================
--- subversion/branches/svn-auth-x509/subversion/include/svn_ra_svn.h (original)
+++ subversion/branches/svn-auth-x509/subversion/include/svn_ra_svn.h Tue Jan 27 23:27:44 2015
@@ -287,6 +287,12 @@ svn_ra_svn_conn_remote_host(svn_ra_svn_c
*
* Upon successful completion of the edit, the editor will invoke @a callback
* with @a callback_baton as an argument.
+ *
+ * @note The @c copyfrom_path parameter passed to the @c add_file and
+ * @c add_directory methods of the returned editor may be either a URL or a
+ * relative path, and is transferred verbatim to the receiving end of the
+ * connection. See svn_ra_svn_drive_editor2() for information on the
+ * receiving end of the connection.
*/
void
svn_ra_svn_get_editor(const svn_delta_editor_t **editor,
@@ -302,6 +308,13 @@ svn_ra_svn_get_editor(const svn_delta_ed
* if @a for_replay is TRUE.
*
* @since New in 1.4.
+ *
+ * @note The @c copyfrom_path parameter passed to the @c add_file and
+ * @c add_directory methods of the receiving editor will be canonicalized
+ * either as a URL or as a relative path (starting with a slash) according
+ * to which kind was sent by the driving end of the connection. See
+ * svn_ra_svn_get_editor() for information on the driving end of the
+ * connection.
*/
svn_error_t *
svn_ra_svn_drive_editor2(svn_ra_svn_conn_t *conn,
Modified: subversion/branches/svn-auth-x509/subversion/include/svn_repos.h
URL: http://svn.apache.org/viewvc/subversion/branches/svn-auth-x509/subversion/include/svn_repos.h?rev=1655189&r1=1655188&r2=1655189&view=diff
==============================================================================
--- subversion/branches/svn-auth-x509/subversion/include/svn_repos.h (original)
+++ subversion/branches/svn-auth-x509/subversion/include/svn_repos.h Tue Jan 27 23:27:44 2015
@@ -1498,10 +1498,9 @@ svn_repos_replay(svn_fs_root_t *root,
* filesystem of @a repos, beginning at location 'rev:@a base_path',
* where "rev" is the argument given to open_root().
*
- * @a repos is a previously opened repository. @a repos_url is the
+ * @a repos is a previously opened repository. @a repos_url_decoded is the
* decoded URL to the base of the repository, and is used to check
- * copyfrom paths. copyfrom paths passed to the editor must be full,
- * URI-encoded, URLs. @a txn is a filesystem transaction object to use
+ * copyfrom paths. @a txn is a filesystem transaction object to use
* during the commit, or @c NULL to indicate that this function should
* create (and fully manage) a new transaction.
*
@@ -1537,15 +1536,19 @@ svn_repos_replay(svn_fs_root_t *root,
*
* @since New in 1.5.
*
- * @note Yes, @a repos_url is a <em>decoded</em> URL. We realize
+ * @note Yes, @a repos_url_decoded is a <em>decoded</em> URL. We realize
* that's sorta wonky. Sorry about that.
+ *
+ * @note Like most commit editors, the returned editor requires that the
+ * @c copyfrom_path parameter passed to its @c add_file and @c add_directory
+ * methods is a full, URI-encoded URL, not a relative path.
*/
svn_error_t *
svn_repos_get_commit_editor5(const svn_delta_editor_t **editor,
void **edit_baton,
svn_repos_t *repos,
svn_fs_txn_t *txn,
- const char *repos_url,
+ const char *repos_url_decoded,
const char *base_path,
apr_hash_t *revprop_table,
svn_commit_callback2_t commit_callback,
Modified: subversion/branches/svn-auth-x509/subversion/libsvn_client/deprecated.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-auth-x509/subversion/libsvn_client/deprecated.c?rev=1655189&r1=1655188&r2=1655189&view=diff
==============================================================================
--- subversion/branches/svn-auth-x509/subversion/libsvn_client/deprecated.c (original)
+++ subversion/branches/svn-auth-x509/subversion/libsvn_client/deprecated.c Tue Jan 27 23:27:44 2015
@@ -2862,7 +2862,7 @@ svn_client_uuid_from_url(const char **uu
/* destroy the RA session */
svn_pool_destroy(subpool);
- return svn_error_trace(err);;
+ return svn_error_trace(err);
}
svn_error_t *
Modified: subversion/branches/svn-auth-x509/subversion/libsvn_client/externals.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-auth-x509/subversion/libsvn_client/externals.c?rev=1655189&r1=1655188&r2=1655189&view=diff
==============================================================================
--- subversion/branches/svn-auth-x509/subversion/libsvn_client/externals.c (original)
+++ subversion/branches/svn-auth-x509/subversion/libsvn_client/externals.c Tue Jan 27 23:27:44 2015
@@ -1186,6 +1186,17 @@ svn_client__export_externals(apr_hash_t
sub_iterpool),
sub_iterpool));
+ /* First notify that we're about to handle an external. */
+ if (ctx->notify_func2)
+ {
+ ctx->notify_func2(
+ ctx->notify_baton2,
+ svn_wc_create_notify(item_abspath,
+ svn_wc_notify_update_external,
+ sub_iterpool),
+ sub_iterpool);
+ }
+
SVN_ERR(wrap_external_error(
ctx, item_abspath,
svn_client_export5(NULL, new_url, item_abspath,
Modified: subversion/branches/svn-auth-x509/subversion/libsvn_client/mergeinfo.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-auth-x509/subversion/libsvn_client/mergeinfo.c?rev=1655189&r1=1655188&r2=1655189&view=diff
==============================================================================
--- subversion/branches/svn-auth-x509/subversion/libsvn_client/mergeinfo.c (original)
+++ subversion/branches/svn-auth-x509/subversion/libsvn_client/mergeinfo.c Tue Jan 27 23:27:44 2015
@@ -2130,7 +2130,7 @@ svn_client__mergeinfo_log(svn_boolean_t
svn_rangelist__initialize(youngest_range->end - 1,
youngest_range->end,
youngest_range->inheritable,
- scratch_pool);;
+ scratch_pool);
for (hi = apr_hash_first(scratch_pool, source_history);
hi;
Modified: subversion/branches/svn-auth-x509/subversion/libsvn_client/patch.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-auth-x509/subversion/libsvn_client/patch.c?rev=1655189&r1=1655188&r2=1655189&view=diff
==============================================================================
--- subversion/branches/svn-auth-x509/subversion/libsvn_client/patch.c (original)
+++ subversion/branches/svn-auth-x509/subversion/libsvn_client/patch.c Tue Jan 27 23:27:44 2015
@@ -1789,18 +1789,29 @@ get_hunk_info(hunk_info_t **hi, patch_ta
< original_start - matched_line)))
matched_line = matched_line2;
- /* Search from start of file if there could be a better match. */
+ /* Search from before previous hunk if there could be a
+ better match. */
if (search_start > 1
&& (!matched_line
|| (matched_line > original_start
- && (matched_line - original_start > original_start))))
+ && (matched_line - original_start
+ > original_start - search_start))))
{
- SVN_ERR(seek_to_line(content, 1, scratch_pool));
- SVN_ERR(scan_for_match(&matched_line, content, hunk, FALSE,
+ svn_linenum_t search_start2 = 1;
+
+ if (matched_line
+ && matched_line - original_start < original_start)
+ search_start2
+ = original_start - (matched_line - original_start) + 1;
+
+ SVN_ERR(seek_to_line(content, search_start2, scratch_pool));
+ SVN_ERR(scan_for_match(&matched_line2, content, hunk, FALSE,
search_start - 1, fuzz,
ignore_whitespace, FALSE,
cancel_func, cancel_baton,
scratch_pool));
+ if (matched_line2)
+ matched_line = matched_line2;
}
}
}
@@ -2202,27 +2213,37 @@ sort_matched_hunks(const void *a, const
const hunk_info_t *item2 = *((const hunk_info_t * const *)b);
svn_boolean_t matched1 = !item1->rejected && !item1->already_applied;
svn_boolean_t matched2 = !item2->rejected && !item2->already_applied;
+ svn_linenum_t original1, original2;
if (matched1 && matched2)
{
/* Both match so use order matched in file. */
if (item1->matched_line > item2->matched_line)
return 1;
+ else if (item1->matched_line == item2->matched_line)
+ return 0;
+ else
+ return -1;
}
else if (matched2)
/* Only second matches, put it before first. */
return 1;
+ else if (matched1)
+ /* Only first matches, put it before second. */
+ return -1;
+
+ /* Neither matches, sort by original_start. */
+ original1 = svn_diff_hunk_get_original_start(item1->hunk);
+ original2 = svn_diff_hunk_get_original_start(item2->hunk);
+ if (original1 > original2)
+ return 1;
+ else if (original1 == original2)
+ return 0;
else
- {
- /* Neither matches, sort by original_start. */
- if (svn_diff_hunk_get_original_start(item1->hunk)
- > svn_diff_hunk_get_original_start(item2->hunk))
- return 1;
- }
-
- return -1;
+ return -1;
}
+
/* Apply a PATCH to a working copy at ABS_WC_PATH and put the result
* into temporary files, to be installed in the working copy later.
* Return information about the patch target in *PATCH_TARGET, allocated
Modified: subversion/branches/svn-auth-x509/subversion/libsvn_fs_base/dag.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-auth-x509/subversion/libsvn_fs_base/dag.c?rev=1655189&r1=1655188&r2=1655189&view=diff
==============================================================================
--- subversion/branches/svn-auth-x509/subversion/libsvn_fs_base/dag.c (original)
+++ subversion/branches/svn-auth-x509/subversion/libsvn_fs_base/dag.c Tue Jan 27 23:27:44 2015
@@ -1028,12 +1028,14 @@ svn_fs_base__dag_delete_if_mutable(svn_f
void *val;
svn_fs_dirent_t *dirent;
+ svn_pool_clear(subpool);
apr_hash_this(hi, NULL, NULL, &val);
dirent = val;
SVN_ERR(svn_fs_base__dag_delete_if_mutable(fs, dirent->id,
txn_id, trail,
subpool));
}
+ svn_pool_destroy(subpool);
}
}
Modified: subversion/branches/svn-auth-x509/subversion/libsvn_fs_fs/fs_fs.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-auth-x509/subversion/libsvn_fs_fs/fs_fs.c?rev=1655189&r1=1655188&r2=1655189&view=diff
==============================================================================
--- subversion/branches/svn-auth-x509/subversion/libsvn_fs_fs/fs_fs.c (original)
+++ subversion/branches/svn-auth-x509/subversion/libsvn_fs_fs/fs_fs.c Tue Jan 27 23:27:44 2015
@@ -26,6 +26,7 @@
#include "svn_private_config.h"
+#include "svn_checksum.h"
#include "svn_hash.h"
#include "svn_props.h"
#include "svn_time.h"
@@ -1370,10 +1371,45 @@ svn_fs_fs__file_length(svn_filesize_t *l
node_revision_t *noderev,
apr_pool_t *pool)
{
- if (noderev->data_rep)
- *length = noderev->data_rep->expanded_size;
+ representation_t *data_rep = noderev->data_rep;
+ if (!data_rep)
+ {
+ /* Treat "no representation" as "empty file". */
+ *length = 0;
+ }
+ else if (data_rep->expanded_size)
+ {
+ /* Standard case: a non-empty file. */
+ *length = data_rep->expanded_size;
+ }
else
- *length = 0;
+ {
+ /* Work around a FSFS format quirk (see issue #4554).
+
+ A plain representation may specify its EXPANDED LENGTH as "0"
+ in which case, the SIZE value is what we want.
+
+ Because EXPANDED_LENGTH will also be 0 for empty files, while
+ SIZE is non-null, we need to check wether the content is
+ actually empty. We simply compare with the MD5 checksum of
+ empty content (sha-1 is not always available).
+ */
+ svn_checksum_t *empty_md5
+ = svn_checksum_empty_checksum(svn_checksum_md5, pool);
+
+ if (memcmp(empty_md5->digest, data_rep->md5_digest,
+ sizeof(data_rep->md5_digest)))
+ {
+ /* Contents is not empty, i.e. EXPANDED_LENGTH cannot be the
+ actual file length. */
+ *length = data_rep->size;
+ }
+ else
+ {
+ /* Contents is empty. */
+ *length = 0;
+ }
+ }
return SVN_NO_ERROR;
}
Modified: subversion/branches/svn-auth-x509/subversion/libsvn_fs_fs/index.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-auth-x509/subversion/libsvn_fs_fs/index.c?rev=1655189&r1=1655188&r2=1655189&view=diff
==============================================================================
--- subversion/branches/svn-auth-x509/subversion/libsvn_fs_fs/index.c (original)
+++ subversion/branches/svn-auth-x509/subversion/libsvn_fs_fs/index.c Tue Jan 27 23:27:44 2015
@@ -836,8 +836,8 @@ svn_fs_fs__l2p_index_append(svn_checksum
/* 1 page with up to L2P_PAGE_SIZE entries.
* fsfs.conf settings validation guarantees this to fit into
* our address space. */
- apr_size_t last_buffer_size
- = (apr_size_t)svn_spillbuf__get_size(buffer);
+ apr_uint64_t last_buffer_size
+ = (apr_uint64_t)svn_spillbuf__get_size(buffer);
svn_pool_clear(iterpool);
Modified: subversion/branches/svn-auth-x509/subversion/libsvn_fs_fs/revprops.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-auth-x509/subversion/libsvn_fs_fs/revprops.c?rev=1655189&r1=1655188&r2=1655189&view=diff
==============================================================================
--- subversion/branches/svn-auth-x509/subversion/libsvn_fs_fs/revprops.c (original)
+++ subversion/branches/svn-auth-x509/subversion/libsvn_fs_fs/revprops.c Tue Jan 27 23:27:44 2015
@@ -208,7 +208,9 @@ parse_revprop(apr_hash_t **properties,
svn_stream_t *stream = svn_stream_from_string(content, scratch_pool);
*properties = apr_hash_make(pool);
- SVN_ERR(svn_hash_read2(*properties, stream, SVN_HASH_TERMINATOR, pool));
+ SVN_ERR_W(svn_hash_read2(*properties, stream, SVN_HASH_TERMINATOR, pool),
+ apr_psprintf(scratch_pool, "Failed to parse revprops for r%ld.",
+ revision));
return SVN_NO_ERROR;
}
Modified: subversion/branches/svn-auth-x509/subversion/libsvn_fs_fs/structure
URL: http://svn.apache.org/viewvc/subversion/branches/svn-auth-x509/subversion/libsvn_fs_fs/structure?rev=1655189&r1=1655188&r2=1655189&view=diff
==============================================================================
--- subversion/branches/svn-auth-x509/subversion/libsvn_fs_fs/structure (original)
+++ subversion/branches/svn-auth-x509/subversion/libsvn_fs_fs/structure Tue Jan 27 23:27:44 2015
@@ -560,8 +560,7 @@ defined:
props "<rev> <item_index> <length> <size> <digest>" for props rep
<rev> and <item_index> give location of rep
<length> gives length of rep, sans header and trailer
- <size> gives size of expanded rep; for props only, it may be 0
- if equal to the length
+ <size> gives size of expanded rep (*)
<digest> gives hex MD5 digest of expanded rep
### in formats >=4, also present:
<sha1-digest> gives hex SHA1 digest of expanded rep
@@ -573,6 +572,15 @@ defined:
which have svn:mergeinfo.
minfo-here Exists if this node itself has svn:mergeinfo.
+(*) Earlier versions of this document would state that <size> may be 0
+ if the actual value matches <length>. This is only true for property
+ and directory representations and should be avoided in general. File
+ representations may not be handled correctly by SVN before 1.7.20,
+ 1.8.12 and 1.9.0, if they have 0 <size> fields for non-empty contents.
+ Releases 1.8.0 through 1.8.11 may have falsely created instances of
+ that (see issue #4554). Finally, 0 <size> fields are NEVER legal for
+ DELTA representations.
+
The predecessor of a node-rev crosses both soft and true copies;
together with the count field, it allows efficient determination of
the base for skip-deltas. The first node-rev of a node contains no
Modified: subversion/branches/svn-auth-x509/subversion/libsvn_fs_fs/transaction.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-auth-x509/subversion/libsvn_fs_fs/transaction.c?rev=1655189&r1=1655188&r2=1655189&view=diff
==============================================================================
--- subversion/branches/svn-auth-x509/subversion/libsvn_fs_fs/transaction.c (original)
+++ subversion/branches/svn-auth-x509/subversion/libsvn_fs_fs/transaction.c Tue Jan 27 23:27:44 2015
@@ -2210,10 +2210,21 @@ get_shared_rep(representation_t **old_re
}
}
- /* Add information that is missing in the cached data. */
- if (*old_rep)
+ if (!*old_rep)
+ return SVN_NO_ERROR;
+
+ /* We don't want 0-length PLAIN representations to replace non-0-length
+ ones (see issue #4554). Also, this doubles as a simple guard against
+ general rep-cache induced corruption. */
+ if ( ((*old_rep)->expanded_size != rep->expanded_size)
+ || ((*old_rep)->size != rep->size))
+ {
+ *old_rep = NULL;
+ }
+ else
{
- /* Use the old rep for this content. */
+ /* Add information that is missing in the cached data.
+ Use the old rep for this content. */
memcpy((*old_rep)->md5_digest, rep->md5_digest, sizeof(rep->md5_digest));
(*old_rep)->uniquifier = rep->uniquifier;
}
Modified: subversion/branches/svn-auth-x509/subversion/libsvn_fs_fs/tree.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-auth-x509/subversion/libsvn_fs_fs/tree.c?rev=1655189&r1=1655188&r2=1655189&view=diff
==============================================================================
--- subversion/branches/svn-auth-x509/subversion/libsvn_fs_fs/tree.c (original)
+++ subversion/branches/svn-auth-x509/subversion/libsvn_fs_fs/tree.c Tue Jan 27 23:27:44 2015
@@ -1012,6 +1012,10 @@ open_path(parent_path_t **parent_path_p,
svn_pool_clear(iterpool);
+ /* The NODE in PARENT_PATH always lives in POOL, i.e. it will
+ * survive the cleanup of ITERPOOL and the DAG cache.*/
+ here = parent_path->node;
+
/* Parse out the next entry from the path. */
entry = svn_fs__next_entry_name(&next, rest, pool);
@@ -1105,10 +1109,6 @@ open_path(parent_path_t **parent_path_p,
apr_psprintf(iterpool, _("Failure opening '%s'"), path));
rest = next;
-
- /* The NODE in PARENT_PATH equals CHILD but lives in POOL, i.e.
- * it will survive the cleanup of ITERPOOL.*/
- here = parent_path->node;
}
svn_pool_destroy(iterpool);
Propchange: subversion/branches/svn-auth-x509/subversion/libsvn_fs_x/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Jan 27 23:27:44 2015
@@ -87,4 +87,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
-/subversion/trunk/subversion/libsvn_fs_x:1414756-1509914,1603509-1652406
+/subversion/trunk/subversion/libsvn_fs_x:1414756-1509914,1603509-1655188
Modified: subversion/branches/svn-auth-x509/subversion/libsvn_fs_x/cached_data.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-auth-x509/subversion/libsvn_fs_x/cached_data.c?rev=1655189&r1=1655188&r2=1655189&view=diff
==============================================================================
--- subversion/branches/svn-auth-x509/subversion/libsvn_fs_x/cached_data.c (original)
+++ subversion/branches/svn-auth-x509/subversion/libsvn_fs_x/cached_data.c Tue Jan 27 23:27:44 2015
@@ -299,6 +299,7 @@ get_node_revision_body(svn_fs_x__noderev
different from that of rev / pack files. */
err = svn_io_file_open(&file,
svn_fs_x__path_txn_node_rev(fs, id,
+ scratch_pool,
scratch_pool),
APR_READ | APR_BUFFERED, APR_OS_DEFAULT,
scratch_pool);
@@ -456,19 +457,6 @@ svn_fs_x__get_mergeinfo_count(apr_int64_
return SVN_NO_ERROR;
}
-
-svn_error_t *
-svn_fs_x__rev_get_root(svn_fs_x__id_t *root_id,
- svn_fs_t *fs,
- svn_revnum_t rev,
- apr_pool_t *scratch_pool)
-{
- SVN_ERR(svn_fs_x__ensure_revision_exists(rev, fs, scratch_pool));
- svn_fs_x__init_rev_root(root_id, rev);
-
- return SVN_NO_ERROR;
-}
-
/* Describes a lazily opened rev / pack file. Instances will be shared
between multiple instances of rep_state_t. */
typedef struct shared_file_t
@@ -634,7 +622,7 @@ create_rep_state_body(rep_state_t **rep_
&& ( ((*shared_file)->revision / ffd->max_files_per_dir)
== (revision / ffd->max_files_per_dir));
- svn_fs_x__representation_cache_key_t key;
+ svn_fs_x__representation_cache_key_t key = { 0 };
key.revision = revision;
key.is_packed = revision < ffd->min_unpacked_rev;
key.item_index = rep->id.number;
@@ -947,7 +935,7 @@ svn_fs_x__rep_chain_length(int *chain_le
}
-struct rep_read_baton
+typedef struct rep_read_baton_t
{
/* The FS from which we're reading. */
svn_fs_t *fs;
@@ -1009,7 +997,7 @@ struct rep_read_baton
/* Pool used to store file handles and other data that is persistant
for the entire stream read. */
apr_pool_t *filehandle_pool;
-};
+} rep_read_baton_t;
/* Set window key in *KEY to address the window described by RS.
For convenience, return the KEY. */
@@ -1328,13 +1316,13 @@ build_rep_list(apr_array_header_t **list
Allocate the result in RESULT_POOL. This includes the pools within *RB_P.
*/
static svn_error_t *
-rep_read_get_baton(struct rep_read_baton **rb_p,
+rep_read_get_baton(rep_read_baton_t **rb_p,
svn_fs_t *fs,
svn_fs_x__representation_t *rep,
svn_fs_x__pair_cache_key_t fulltext_cache_key,
apr_pool_t *result_pool)
{
- struct rep_read_baton *b;
+ rep_read_baton_t *b;
b = apr_pcalloc(result_pool, sizeof(*b));
b->fs = fs;
@@ -1511,7 +1499,7 @@ read_container_window(svn_stringbuf_t **
base representation. Store the window in *RESULT. */
static svn_error_t *
get_combined_window(svn_stringbuf_t **result,
- struct rep_read_baton *rb)
+ rep_read_baton_t *rb)
{
apr_pool_t *pool, *new_pool, *window_pool;
int i;
@@ -1614,7 +1602,7 @@ fulltext_size_is_cachable(svn_fs_x__data
static svn_error_t *
rep_read_contents_close(void *baton)
{
- struct rep_read_baton *rb = baton;
+ rep_read_baton_t *rb = baton;
svn_pool_destroy(rb->scratch_pool);
svn_pool_destroy(rb->filehandle_pool);
@@ -1624,7 +1612,7 @@ rep_read_contents_close(void *baton)
/* Inialize the representation read state RS for the given REP_HEADER and
* p2l index ENTRY. If not NULL, assign FILE and STREAM to RS.
- * Use POOL for allocations.
+ * Allocate all sub-structures of RS in RESULT_POOL.
*/
static svn_error_t *
init_rep_state(rep_state_t *rs,
@@ -1632,10 +1620,10 @@ init_rep_state(rep_state_t *rs,
svn_fs_t *fs,
svn_fs_x__revision_file_t *rev_file,
svn_fs_x__p2l_entry_t* entry,
- apr_pool_t *pool)
+ apr_pool_t *result_pool)
{
svn_fs_x__data_t *ffd = fs->fsap_data;
- shared_file_t *shared_file = apr_pcalloc(pool, sizeof(*shared_file));
+ shared_file_t *shared_file = apr_pcalloc(result_pool, sizeof(*shared_file));
/* this function does not apply to representation containers */
SVN_ERR_ASSERT(entry->type >= SVN_FS_X__ITEM_TYPE_FILE_REP
@@ -1645,7 +1633,7 @@ init_rep_state(rep_state_t *rs,
shared_file->rfile = rev_file;
shared_file->fs = fs;
shared_file->revision = svn_fs_x__get_revnum(entry->items[0].change_set);
- shared_file->pool = pool;
+ shared_file->pool = result_pool;
rs->sfile = shared_file;
rs->rep_id = entry->items[0];
@@ -1666,16 +1654,16 @@ init_rep_state(rep_state_t *rs,
* window caches. If MAX_OFFSET is not -1, don't read windows that start
* at or beyond that offset. As a side effect, return the total sum of all
* expanded window sizes in *FULLTEXT_LEN.
- * Use POOL for temporary allocations.
+ * Use SCRATCH_POOL for temporary allocations.
*/
static svn_error_t *
cache_windows(svn_filesize_t *fulltext_len,
svn_fs_t *fs,
rep_state_t *rs,
apr_off_t max_offset,
- apr_pool_t *pool)
+ apr_pool_t *scratch_pool)
{
- apr_pool_t *iterpool = svn_pool_create(pool);
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
*fulltext_len = 0;
while (rs->current < rs->size)
@@ -1692,7 +1680,8 @@ cache_windows(svn_filesize_t *fulltext_l
/* efficiently skip windows that are still being cached instead
* of fully decoding them */
- SVN_ERR(get_cached_window_sizes(&window_sizes, rs, &is_cached, pool));
+ SVN_ERR(get_cached_window_sizes(&window_sizes, rs, &is_cached,
+ iterpool));
if (is_cached)
{
*fulltext_len += window_sizes->target_len;
@@ -1706,10 +1695,10 @@ cache_windows(svn_filesize_t *fulltext_l
apr_off_t block_start;
/* navigate to & read the current window */
- SVN_ERR(rs_aligned_seek(rs, &block_start, start_offset, pool));
+ SVN_ERR(rs_aligned_seek(rs, &block_start, start_offset, iterpool));
SVN_ERR(svn_txdelta_read_svndiff_window(&window,
rs->sfile->rfile->stream,
- rs->ver, pool));
+ rs->ver, iterpool));
/* aggregate expanded window size */
*fulltext_len += window->tview_len;
@@ -1717,7 +1706,7 @@ cache_windows(svn_filesize_t *fulltext_l
/* determine on-disk window size */
SVN_ERR(svn_fs_x__get_file_offset(&end_offset,
rs->sfile->rfile->file,
- pool));
+ iterpool));
rs->current = end_offset - rs->start;
if (rs->current > rs->size)
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
@@ -1727,7 +1716,7 @@ cache_windows(svn_filesize_t *fulltext_l
/* if the window has not been cached before, cache it now
* (if caching is used for them at all) */
if (!is_cached)
- SVN_ERR(set_cached_window(window, rs, start_offset, pool));
+ SVN_ERR(set_cached_window(window, rs, start_offset, iterpool));
}
rs->chunk_index++;
@@ -1808,7 +1797,7 @@ svn_fs_x__get_representation_length(svn_
/* Return the next *LEN bytes of the rep from our plain / delta windows
and store them in *BUF. */
static svn_error_t *
-get_contents_from_windows(struct rep_read_baton *rb,
+get_contents_from_windows(rep_read_baton_t *rb,
char *buf,
apr_size_t *len)
{
@@ -1953,7 +1942,7 @@ get_fulltext_partial(void **out,
*/
static svn_error_t *
get_contents_from_fulltext(svn_boolean_t *cached,
- struct rep_read_baton *baton,
+ rep_read_baton_t *baton,
char *buffer,
apr_size_t *len)
{
@@ -2030,7 +2019,7 @@ optimimal_allocation_size(apr_size_t nee
* want to cache it at the end.
*/
static svn_error_t *
-skip_contents(struct rep_read_baton *baton,
+skip_contents(rep_read_baton_t *baton,
svn_filesize_t len)
{
svn_error_t *err = SVN_NO_ERROR;
@@ -2067,7 +2056,7 @@ skip_contents(struct rep_read_baton *bat
else if (len > 0)
{
/* Simply drain LEN bytes from the window stream. */
- apr_pool_t *subpool = subpool = svn_pool_create(baton->scratch_pool);
+ apr_pool_t *subpool = svn_pool_create(baton->scratch_pool);
char *buffer = apr_palloc(subpool, SVN__STREAM_CHUNK_SIZE);
while (len > 0 && !err)
@@ -2086,7 +2075,7 @@ skip_contents(struct rep_read_baton *bat
return svn_error_trace(err);
}
-/* BATON is of type `rep_read_baton'; read the next *LEN bytes of the
+/* BATON is of type `rep_read_baton_t'; read the next *LEN bytes of the
representation and store them in *BUF. Sum as we read and verify
the MD5 sum at the end. */
static svn_error_t *
@@ -2094,7 +2083,7 @@ rep_read_contents(void *baton,
char *buf,
apr_size_t *len)
{
- struct rep_read_baton *rb = baton;
+ rep_read_baton_t *rb = baton;
/* Get data from the fulltext cache for as long as we can. */
if (rb->fulltext_cache)
@@ -2182,7 +2171,7 @@ svn_fs_x__get_contents(svn_stream_t **co
{
svn_fs_x__data_t *ffd = fs->fsap_data;
svn_filesize_t len = rep->expanded_size;
- struct rep_read_baton *rb;
+ rep_read_baton_t *rb;
svn_revnum_t revision = svn_fs_x__get_revnum(rep->id.change_set);
svn_fs_x__pair_cache_key_t fulltext_cache_key = { 0 };
@@ -2291,11 +2280,11 @@ svn_fs_x__try_process_file_contents(svn_
}
/* Baton used when reading delta windows. */
-struct delta_read_baton
+typedef struct delta_read_baton_t
{
struct rep_state_t *rs;
unsigned char md5_digest[APR_MD5_DIGESTSIZE];
-};
+} delta_read_baton_t;
/* This implements the svn_txdelta_next_window_fn_t interface. */
static svn_error_t *
@@ -2303,7 +2292,7 @@ delta_read_next_window(svn_txdelta_windo
void *baton,
apr_pool_t *pool)
{
- struct delta_read_baton *drb = baton;
+ delta_read_baton_t *drb = baton;
apr_pool_t *scratch_pool = svn_pool_create(pool);
*window = NULL;
@@ -2323,25 +2312,25 @@ delta_read_next_window(svn_txdelta_windo
static const unsigned char *
delta_read_md5_digest(void *baton)
{
- struct delta_read_baton *drb = baton;
+ delta_read_baton_t *drb = baton;
return drb->md5_digest;
}
/* Return a txdelta stream for on-disk representation REP_STATE
- * of TARGET. Allocate the result in POOL.
+ * of TARGET. Allocate the result in RESULT_POOL.
*/
static svn_txdelta_stream_t *
get_storaged_delta_stream(rep_state_t *rep_state,
svn_fs_x__noderev_t *target,
- apr_pool_t *pool)
+ apr_pool_t *result_pool)
{
/* Create the delta read baton. */
- struct delta_read_baton *drb = apr_pcalloc(pool, sizeof(*drb));
+ delta_read_baton_t *drb = apr_pcalloc(result_pool, sizeof(*drb));
drb->rs = rep_state;
memcpy(drb->md5_digest, target->data_rep->md5_digest,
sizeof(drb->md5_digest));
return svn_txdelta_stream_create(drb, delta_read_next_window,
- delta_read_md5_digest, pool);
+ delta_read_md5_digest, result_pool);
}
svn_error_t *
@@ -2349,7 +2338,8 @@ svn_fs_x__get_file_delta_stream(svn_txde
svn_fs_t *fs,
svn_fs_x__noderev_t *source,
svn_fs_x__noderev_t *target,
- apr_pool_t *pool)
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
svn_stream_t *source_stream, *target_stream;
rep_state_t *rep_state;
@@ -2363,7 +2353,8 @@ svn_fs_x__get_file_delta_stream(svn_txde
{
/* Read target's base rep if any. */
SVN_ERR(create_rep_state(&rep_state, &rep_header, NULL,
- target->data_rep, fs, pool, pool));
+ target->data_rep, fs, result_pool,
+ scratch_pool));
/* Try a shortcut: if the target is stored as a delta against the source,
then just use that delta. */
@@ -2377,7 +2368,8 @@ svn_fs_x__get_file_delta_stream(svn_txde
== svn_fs_x__get_revnum(source->data_rep->id.change_set)
&& rep_header->base_item_index == source->data_rep->id.number)
{
- *stream_p = get_storaged_delta_stream(rep_state, target, pool);
+ *stream_p = get_storaged_delta_stream(rep_state, target,
+ result_pool);
return SVN_NO_ERROR;
}
}
@@ -2388,7 +2380,8 @@ svn_fs_x__get_file_delta_stream(svn_txde
format. */
if (rep_header->type == svn_fs_x__rep_self_delta)
{
- *stream_p = get_storaged_delta_stream(rep_state, target, pool);
+ *stream_p = get_storaged_delta_stream(rep_state, target,
+ result_pool);
return SVN_NO_ERROR;
}
}
@@ -2404,16 +2397,17 @@ svn_fs_x__get_file_delta_stream(svn_txde
/* Read both fulltexts and construct a delta. */
if (source)
SVN_ERR(svn_fs_x__get_contents(&source_stream, fs, source->data_rep,
- TRUE, pool));
+ TRUE, result_pool));
else
- source_stream = svn_stream_empty(pool);
+ source_stream = svn_stream_empty(result_pool);
+
SVN_ERR(svn_fs_x__get_contents(&target_stream, fs, target->data_rep,
- TRUE, pool));
+ TRUE, result_pool));
/* Because source and target stream will already verify their content,
* there is no need to do this once more. In particular if the stream
* content is being fetched from cache. */
- svn_txdelta2(stream_p, source_stream, target_stream, FALSE, pool);
+ svn_txdelta2(stream_p, source_stream, target_stream, FALSE, result_pool);
return SVN_NO_ERROR;
}
@@ -2579,7 +2573,8 @@ get_dir_contents(apr_array_header_t **en
&& ! svn_fs_x__is_revision(noderev->data_rep->id.change_set))
{
const char *filename
- = svn_fs_x__path_txn_node_children(fs, id, scratch_pool);
+ = svn_fs_x__path_txn_node_children(fs, id, scratch_pool,
+ scratch_pool);
/* The representation is mutable. Read the old directory
contents from the mutable children file, followed by the
@@ -2695,6 +2690,7 @@ svn_fs_x__rep_contents_dir_entry(svn_fs_
svn_fs_t *fs,
svn_fs_x__noderev_t *noderev,
const char *name,
+ apr_size_t *hint,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
@@ -2705,14 +2701,22 @@ svn_fs_x__rep_contents_dir_entry(svn_fs_
svn_cache__t *cache = locate_dir_cache(fs, &key, noderev);
if (cache)
{
+ svn_fs_x__ede_baton_t baton;
+ baton.hint = *hint;
+ baton.name = name;
+
/* Cache lookup. */
SVN_ERR(svn_cache__get_partial((void **)dirent,
&found,
cache,
&key,
svn_fs_x__extract_dir_entry,
- (void*)name,
+ &baton,
result_pool));
+
+ /* Remember the new clue only if we found something at that spot. */
+ if (found)
+ *hint = baton.hint;
}
/* fetch data from disk if we did not find it in the cache */
@@ -2745,7 +2749,8 @@ svn_error_t *
svn_fs_x__get_proplist(apr_hash_t **proplist_p,
svn_fs_t *fs,
svn_fs_x__noderev_t *noderev,
- apr_pool_t *pool)
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
apr_hash_t *proplist;
svn_stream_t *stream;
@@ -2754,12 +2759,15 @@ svn_fs_x__get_proplist(apr_hash_t **prop
if (noderev->prop_rep
&& !svn_fs_x__is_revision(noderev->prop_rep->id.change_set))
{
- const char *filename
- = svn_fs_x__path_txn_node_props(fs, noderev_id, pool);
- proplist = apr_hash_make(pool);
+ const char *filename = svn_fs_x__path_txn_node_props(fs, noderev_id,
+ scratch_pool,
+ scratch_pool);
+ proplist = apr_hash_make(result_pool);
- SVN_ERR(svn_stream_open_readonly(&stream, filename, pool, pool));
- SVN_ERR(svn_hash_read2(proplist, stream, SVN_HASH_TERMINATOR, pool));
+ SVN_ERR(svn_stream_open_readonly(&stream, filename, scratch_pool,
+ scratch_pool));
+ SVN_ERR(svn_hash_read2(proplist, stream, SVN_HASH_TERMINATOR,
+ result_pool));
SVN_ERR(svn_stream_close(stream));
}
else if (noderev->prop_rep)
@@ -2774,24 +2782,26 @@ svn_fs_x__get_proplist(apr_hash_t **prop
{
svn_boolean_t is_cached;
SVN_ERR(svn_cache__get((void **) proplist_p, &is_cached,
- ffd->properties_cache, &key, pool));
+ ffd->properties_cache, &key, result_pool));
if (is_cached)
return SVN_NO_ERROR;
}
- proplist = apr_hash_make(pool);
+ proplist = apr_hash_make(result_pool);
SVN_ERR(svn_fs_x__get_contents(&stream, fs, noderev->prop_rep, FALSE,
- pool));
- SVN_ERR(svn_hash_read2(proplist, stream, SVN_HASH_TERMINATOR, pool));
+ scratch_pool));
+ SVN_ERR(svn_hash_read2(proplist, stream, SVN_HASH_TERMINATOR,
+ result_pool));
SVN_ERR(svn_stream_close(stream));
if (ffd->properties_cache && SVN_IS_VALID_REVNUM(rep->id.change_set))
- SVN_ERR(svn_cache__set(ffd->properties_cache, &key, proplist, pool));
+ SVN_ERR(svn_cache__set(ffd->properties_cache, &key, proplist,
+ scratch_pool));
}
else
{
/* return an empty prop list if the node doesn't have any props */
- proplist = apr_hash_make(pool);
+ proplist = apr_hash_make(result_pool);
}
*proplist_p = proplist;
Modified: subversion/branches/svn-auth-x509/subversion/libsvn_fs_x/cached_data.h
URL: http://svn.apache.org/viewvc/subversion/branches/svn-auth-x509/subversion/libsvn_fs_x/cached_data.h?rev=1655189&r1=1655188&r2=1655189&view=diff
==============================================================================
--- subversion/branches/svn-auth-x509/subversion/libsvn_fs_x/cached_data.h (original)
+++ subversion/branches/svn-auth-x509/subversion/libsvn_fs_x/cached_data.h Tue Jan 27 23:27:44 2015
@@ -49,14 +49,6 @@ svn_fs_x__get_mergeinfo_count(apr_int64_
const svn_fs_x__id_t *id,
apr_pool_t *scratch_pool);
-/* Set *ROOT_ID to the noderev ID for the root of revision REV in
- filesystem FS. Do temporary allocations in SCRATCH_POOL. */
-svn_error_t *
-svn_fs_x__rev_get_root(svn_fs_x__id_t *root_id,
- svn_fs_t *fs,
- svn_revnum_t rev,
- apr_pool_t *scratch_pool);
-
/* Verify that representation REP in FS can be accessed.
Do any allocations in SCRATCH_POOL. */
svn_error_t *
@@ -79,13 +71,13 @@ svn_fs_x__rep_chain_length(int *chain_le
representation REP as seen in filesystem FS. If CACHE_FULLTEXT is
not set, bypass fulltext cache lookup for this rep and don't put the
reconstructed fulltext into cache.
- Use POOL for allocations. */
+ Allocate *CONTENT_P in RESULT_POOL. */
svn_error_t *
svn_fs_x__get_contents(svn_stream_t **contents_p,
svn_fs_t *fs,
svn_fs_x__representation_t *rep,
svn_boolean_t cache_fulltext,
- apr_pool_t *pool);
+ apr_pool_t *result_pool);
/* Determine on-disk and expanded sizes of the representation identified
* by ENTRY in FS and return the result in PACKED_LEN and EXPANDED_LEN,
@@ -117,13 +109,16 @@ svn_fs_x__try_process_file_contents(svn_
/* Set *STREAM_P to a delta stream turning the contents of the file SOURCE
into the contents of the file TARGET, allocated in RESULT_POOL.
- If SOURCE is NULL, an empty string will be used in its stead. */
+ If SOURCE is NULL, an empty string will be used in its stead.
+ Use SCRATCH_POOL for temporary allocations.
+ */
svn_error_t *
svn_fs_x__get_file_delta_stream(svn_txdelta_stream_t **stream_p,
svn_fs_t *fs,
svn_fs_x__noderev_t *source,
svn_fs_x__noderev_t *target,
- apr_pool_t *result_pool);
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
/* Set *ENTRIES to an apr_array_header_t of dirent structs that contain
the directory entries of node-revision NODEREV in filesystem FS. The
@@ -147,24 +142,31 @@ svn_fs_x__find_dir_entry(apr_array_heade
/* Set *DIRENT to the entry identified by NAME in the directory given
by NODEREV in filesystem FS. If no such entry exits, *DIRENT will
- be NULL. The returned object is allocated in RESULT_POOL; SCRATCH_POOL
+ be NULL. The value referenced by HINT can be used to speed up
+ consecutive calls when travering the directory in name order.
+ Any value is allowed, however APR_SIZE_MAX gives best performance
+ when there has been no previous lookup for the same directory.
+
+ The returned object is allocated in RESULT_POOL; SCRATCH_POOL
used for temporary allocations. */
svn_error_t *
svn_fs_x__rep_contents_dir_entry(svn_fs_x__dirent_t **dirent,
svn_fs_t *fs,
svn_fs_x__noderev_t *noderev,
const char *name,
+ apr_size_t *hint,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
/* Set *PROPLIST to be an apr_hash_t containing the property list of
- node-revision NODEREV as seen in filesystem FS. Use POOL for
- temporary allocations. */
+ node-revision NODEREV as seen in filesystem FS. Allocate the result
+ in RESULT_POOL and use SCRATCH_POOL for temporary allocations. */
svn_error_t *
svn_fs_x__get_proplist(apr_hash_t **proplist,
svn_fs_t *fs,
svn_fs_x__noderev_t *noderev,
- apr_pool_t *pool);
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
/* Fetch the list of change in revision REV in FS and return it in *CHANGES.
* Allocate the result in POOL.
Modified: subversion/branches/svn-auth-x509/subversion/libsvn_fs_x/caching.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-auth-x509/subversion/libsvn_fs_x/caching.c?rev=1655189&r1=1655188&r2=1655189&view=diff
==============================================================================
--- subversion/branches/svn-auth-x509/subversion/libsvn_fs_x/caching.c (original)
+++ subversion/branches/svn-auth-x509/subversion/libsvn_fs_x/caching.c Tue Jan 27 23:27:44 2015
@@ -172,21 +172,21 @@ warn_and_fail_on_cache_errors(svn_error_
#ifdef SVN_DEBUG_CACHE_DUMP_STATS
/* Baton to be used for the dump_cache_statistics() pool cleanup function, */
-struct dump_cache_baton_t
+typedef struct dump_cache_baton_t
{
/* the pool about to be cleaned up. Will be used for temp. allocations. */
apr_pool_t *pool;
/* the cache to dump the statistics for */
svn_cache__t *cache;
-};
+} dump_cache_baton_t;
/* APR pool cleanup handler that will printf the statistics of the
cache referenced by the baton in BATON_VOID. */
static apr_status_t
dump_cache_statistics(void *baton_void)
{
- struct dump_cache_baton_t *baton = baton_void;
+ dump_cache_baton_t *baton = baton_void;
apr_status_t result = APR_SUCCESS;
svn_cache__info_t info;
@@ -267,7 +267,7 @@ init_callbacks(svn_cache__t *cache,
/* schedule printing the access statistics upon pool cleanup,
* i.e. end of FSX session.
*/
- struct dump_cache_baton_t *baton;
+ dump_cache_baton_t *baton;
baton = apr_palloc(pool, sizeof(*baton));
baton->pool = pool;