Author: stefan2
Date: Thu Jun 25 08:00:57 2015
New Revision: 1687422
URL: http://svn.apache.org/r1687422
Log:
On the fsx-1.10 branch:
Catch-up with /trunk up to and including r1687421.
Modified:
subversion/branches/fsx-1.10/ (props changed)
subversion/branches/fsx-1.10/build/ac-macros/apache.m4
subversion/branches/fsx-1.10/subversion/include/svn_client.h
subversion/branches/fsx-1.10/subversion/libsvn_client/merge.c
subversion/branches/fsx-1.10/subversion/libsvn_client/resolved.c
subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/fs.c
subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/fs.h
subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/fs_fs.h
subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/hotcopy.c
subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/hotcopy.h
subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/pack.c
subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/transaction.c
subversion/branches/fsx-1.10/subversion/libsvn_repos/rev_hunt.c
subversion/branches/fsx-1.10/subversion/libsvn_subr/io.c
subversion/branches/fsx-1.10/subversion/mod_dav_svn/activity.c
subversion/branches/fsx-1.10/subversion/mod_dav_svn/dav_svn.h
subversion/branches/fsx-1.10/subversion/mod_dav_svn/deadprops.c
subversion/branches/fsx-1.10/subversion/mod_dav_svn/lock.c
subversion/branches/fsx-1.10/subversion/mod_dav_svn/merge.c
subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/dated-rev.c
subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/deleted-rev.c
subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/file-revs.c
subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/get-location-segments.c
subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/get-locations.c
subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/get-locks.c
subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/inherited-props.c
subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/log.c
subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/mergeinfo.c
subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/replay.c
subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/update.c
subversion/branches/fsx-1.10/subversion/mod_dav_svn/repos.c
subversion/branches/fsx-1.10/subversion/mod_dav_svn/util.c
subversion/branches/fsx-1.10/subversion/mod_dav_svn/version.c
subversion/branches/fsx-1.10/subversion/svn/cl-conflicts.c
subversion/branches/fsx-1.10/subversion/svn/cl.h
subversion/branches/fsx-1.10/subversion/svn/conflict-callbacks.c
subversion/branches/fsx-1.10/subversion/svn/info-cmd.c
subversion/branches/fsx-1.10/subversion/svn/util.c
subversion/branches/fsx-1.10/subversion/tests/cmdline/merge_tree_conflict_tests.py
subversion/branches/fsx-1.10/subversion/tests/cmdline/mergeinfo_tests.py
subversion/branches/fsx-1.10/subversion/tests/cmdline/move_tests.py
subversion/branches/fsx-1.10/subversion/tests/cmdline/prop_tests.py
subversion/branches/fsx-1.10/subversion/tests/cmdline/svnadmin_tests.py
subversion/branches/fsx-1.10/subversion/tests/cmdline/svntest/main.py
subversion/branches/fsx-1.10/subversion/tests/cmdline/update_tests.py
Propchange: subversion/branches/fsx-1.10/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Jun 25 08:00:57 2015
@@ -91,4 +91,4 @@
/subversion/branches/verify-at-commit:1462039-1462408
/subversion/branches/verify-keep-going:1439280-1546110
/subversion/branches/wc-collate-path:1402685-1480384
-/subversion/trunk:1658218-1685462
+/subversion/trunk:1658218-1687421
Modified: subversion/branches/fsx-1.10/build/ac-macros/apache.m4
URL:
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/build/ac-macros/apache.m4?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/build/ac-macros/apache.m4 (original)
+++ subversion/branches/fsx-1.10/build/ac-macros/apache.m4 Thu Jun 25 08:00:57
2015
@@ -166,7 +166,7 @@ if test -n "$APXS" && test "$APXS" != "n
if ! test -e $HTTPD ; then
HTTPD="`$APXS -q bindir`/`$APXS -q PROGNAME`"
fi
- HTTPD_VERSION=["`$HTTPD -v | $SED -e 's@^.*/\([0-9.]*\)\(.*$\)@\1@ ; 1q'`"]
+ HTTPD_VERSION=["`$HTTPD -v | $SED -e 's/^.*\/\([0-9.]*\).*$/\1/' -e 1q`"]
case $host in
*-*-cygwin*)
Modified: subversion/branches/fsx-1.10/subversion/include/svn_client.h
URL:
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/include/svn_client.h?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/include/svn_client.h (original)
+++ subversion/branches/fsx-1.10/subversion/include/svn_client.h Thu Jun 25
08:00:57 2015
@@ -4362,6 +4362,15 @@ svn_client_revert(const apr_array_header
*/
/**
+ * Return the kind of conflict (text conflict, property conflict,
+ * or tree conflict) represented by @a conflict.
+ *
+ * New in 1.10.
+ */
+svn_wc_conflict_kind_t
+svn_client_conflict_get_kind(const svn_wc_conflict_description2_t *conflict);
+
+/**
* Return the absolute path to the conflicted working copy node described
* by @a conflict.
*
@@ -4407,58 +4416,153 @@ svn_client_conflict_get_local_change(
const svn_wc_conflict_description2_t *conflict);
/**
- * Accessor functions for svn_wc_conflict_description2_t. This is a temporary
- * API for eventually replacing svn_wc_conflict_description2_t with an opaque
- * type and providing improved APIs for conflict resolution.
- *
- * @since New in 1.10.
+ * Return information about the repository associated with @a conflict.
+ * In case of a foreign-repository merge this will differ from the
+ * repository information associated with the merge target working copy.
+ *
+ * @since New in 1.10.
*/
+svn_error_t *
+svn_client_conflict_get_repos_info(
+ const char **repos_root_url,
+ const char **repos_uuid,
+ const svn_wc_conflict_description2_t *conflict,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
-#define svn_client_conflict_get_node_kind(conflict) \
- ((conflict)->node_kind)
+/**
+ * Return the repository-relative location and the node kind of the incoming
+ * old version of the conflicted node described by @a conflict.
+ *
+ * If the repository-relative path is not available, the @a
+ * *incoming_old_repos_relpath will be set to @c NULL,
+ *
+ * If the peg revision is not available, @a *incoming_old_regrev will be
+ * set to SVN_INVALID_REVNUM.
+ *
+ * If the node kind is not available or if the node does not exist at the
+ * specified path and revision, @a *incoming_old_node_kind will be set to
+ * svn_node_none.
+ * ### Should return svn_node_unkown if not available?
+ *
+ * Any output parameter may be set to @c NULL by the caller to indicate that
+ * a particular piece of information should not be returned.
+ *
+ * In case of tree conflicts, this path@revision does not necessarily exist
+ * in the repository, and it does not necessarily represent the incoming
+ * change which is responsible for the occurance of the tree conflict.
+ * The responsible incoming change is generally located somewhere between
+ * the old and new incoming versions.
+ *
+ * @since New in 1.10.
+ */
+svn_error_t *
+svn_client_conflict_get_incoming_old_repos_location(
+ const char **incoming_old_repos_relpath,
+ svn_revnum_t *incoming_old_regrev,
+ svn_node_kind_t *incoming_old_node_kind,
+ const svn_wc_conflict_description2_t *conflict,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
-#define svn_client_conflict_get_kind(conflict) \
- ((conflict)->kind)
+/**
+ * Like svn_client_conflict_get_incoming_old_repos_location(), expect this
+ * function returns the same data for the incoming new version.
+ *
+ * The same note about tree conflicts applies.
+ *
+ * @since New in 1.10.
+ */
+svn_error_t *
+svn_client_conflict_get_incoming_new_repos_location(
+ const char **incoming_new_repos_relpath,
+ svn_revnum_t *incoming_new_regrev,
+ svn_node_kind_t *incoming_new_node_kind,
+ const svn_wc_conflict_description2_t *conflict,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
-#define svn_client_conflict_get_property_name(conflict) \
- ((conflict)->property_name)
+/**
+ * Return the node kind of the tree conflict victim described by @a conflict.
+ * The victim is the local node in the working copy which was affected by the
+ * tree conflict at the time the conflict was raised.
+ *
+ * @since New in 1.10.
+ */
+svn_node_kind_t
+svn_client_conflict_tree_get_victim_node_kind(
+ const svn_wc_conflict_description2_t *conflict);
-#define svn_client_conflict_get_is_binary(conflict) \
- ((conflict)->is_binary)
+/**
+ * Return the name of the conflicted property represented by @a conflict.
+ *
+ * @since New in 1.10.
+ */
+const char *
+svn_client_conflict_prop_get_propname(
+ const svn_wc_conflict_description2_t *conflict);
-#define svn_client_conflict_get_mime_type(conflict) \
- ((conflict)->mime_type)
+/**
+ * Return the set of property values involved in the property conflict
+ * described by @a conflict. If a property value is unavailable the
+ * corresponding output argument is set to @c NULL.
+ *
+ * A 3-way diff of these property values can be generated with
+ * svn_diff_mem_string_diff3(). A merged version with conflict
+ * markers can be generated with svn_diff_mem_string_output_merge3().
+ *
+ * @since New in 1.10.
+ */
+svn_error_t *
+svn_client_conflict_prop_get_propvals(
+ const svn_string_t **base_propval,
+ const svn_string_t **working_propval,
+ const svn_string_t **incoming_old_propval,
+ const svn_string_t **incoming_new_propval,
+ const svn_wc_conflict_description2_t *conflict,
+ apr_pool_t *result_pool);
-#define svn_client_conflict_get_base_abspath(conflict) \
- ((conflict)->base_abspath)
+/**
+ * Return the MIME-type of the working version of the text-conflicted file
+ * described by @a conflict.
+ *
+ * ### Really needed? What about base/incoming_old/incoming_new values?
+ * @since: New in 1.10.
+ */
+const char *
+svn_client_conflict_text_get_mime_type(
+ const svn_wc_conflict_description2_t *conflict);
-#define svn_client_conflict_get_their_abspath(conflict) \
- ((conflict)->their_abspath)
+/**
+ * Return absolute paths to the versions of the text-conflicted file
+ * described by @a conflict.
+ *
+ * If a particular content is not available, it is set to @c NULL.
+ *
+ * ### Should this be returning svn_stream_t instead of paths?
+ * @since: New in 1.10.
+ */
+svn_error_t *
+svn_client_conflict_text_get_contents(
+ const char **base_abspath,
+ const char **working_abspath,
+ const char **incoming_old_abspath,
+ const char **incoming_new_abspath,
+ const svn_wc_conflict_description2_t *conflict,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
-#define svn_client_conflict_get_my_abspath(conflict) \
- ((conflict)->my_abspath)
+/**
+ * Accessor functions for svn_wc_conflict_description2_t. This is a temporary
+ * API for eventually replacing svn_wc_conflict_description2_t with an opaque
+ * type and providing improved APIs for conflict resolution.
+ *
+ * @since New in 1.10.
+ */
#define svn_client_conflict_get_merged_file(conflict) \
((conflict)->merged_file)
-#define svn_client_conflict_get_src_left_version(conflict) \
- ((conflict)->src_left_version)
-
-#define svn_client_conflict_get_src_right_version(conflict) \
- ((conflict)->src_right_version)
-
-#define svn_client_conflict_get_prop_reject_abspath(conflict) \
- ((conflict)->prop_reject_abspath)
-
-#define svn_client_conflict_get_prop_value_working(conflict) \
- ((conflict)->prop_value_working)
-
-#define svn_client_conflict_get_prop_value_incoming_old(conflict) \
- ((conflict)->prop_value_incoming_old)
-
-#define svn_client_conflict_get_prop_value_incoming_new(conflict) \
- ((conflict)->prop_value_incoming_new)
-
/** @} */
/**
Modified: subversion/branches/fsx-1.10/subversion/libsvn_client/merge.c
URL:
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/libsvn_client/merge.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/libsvn_client/merge.c (original)
+++ subversion/branches/fsx-1.10/subversion/libsvn_client/merge.c Thu Jun 25
08:00:57 2015
@@ -5398,6 +5398,14 @@ record_skips_in_mergeinfo(const char *me
|| obstruction_state == svn_wc_notify_state_missing)
continue;
+ /* Make sure this is not a tree-conflicted path either. We don't
+ * want to add mergeinfo on such nodes since it causes problems down
+ * the line (see issue #4582, "reintegrate complains about missing
+ * ranges from node unrelated to branch") */
+ if (svn_hash_gets(merge_b->tree_conflicted_abspaths,
+ skipped_abspath) != NULL)
+ continue;
+
/* Add an empty range list for this path.
### TODO: This works fine for a file path skipped because it is
Modified: subversion/branches/fsx-1.10/subversion/libsvn_client/resolved.c
URL:
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/libsvn_client/resolved.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/libsvn_client/resolved.c (original)
+++ subversion/branches/fsx-1.10/subversion/libsvn_client/resolved.c Thu Jun 25
08:00:57 2015
@@ -148,6 +148,12 @@ svn_client_resolve(const char *path,
/*** Dealing with conflicts. ***/
+svn_wc_conflict_kind_t
+svn_client_conflict_get_kind(const svn_wc_conflict_description2_t *conflict)
+{
+ return conflict->kind;
+}
+
const char *
svn_client_conflict_get_local_abspath(
const svn_wc_conflict_description2_t *conflict)
@@ -175,3 +181,201 @@ svn_client_conflict_get_local_change(
{
return conflict->reason;
}
+
+svn_error_t *
+svn_client_conflict_get_repos_info(
+ const char **repos_root_url,
+ const char **repos_uuid,
+ const svn_wc_conflict_description2_t *conflict,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ if (repos_root_url)
+ {
+ if (conflict->src_left_version)
+ *repos_root_url = conflict->src_left_version->repos_url;
+ else if (conflict->src_right_version)
+ *repos_root_url = conflict->src_right_version->repos_url;
+ else
+ *repos_root_url = NULL;
+ }
+
+ if (repos_uuid)
+ {
+ if (conflict->src_left_version)
+ *repos_uuid = conflict->src_left_version->repos_uuid;
+ else if (conflict->src_right_version)
+ *repos_uuid = conflict->src_right_version->repos_uuid;
+ else
+ *repos_uuid = NULL;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_client_conflict_get_incoming_old_repos_location(
+ const char **incoming_old_repos_relpath,
+ svn_revnum_t *incoming_old_pegrev,
+ svn_node_kind_t *incoming_old_node_kind,
+ const svn_wc_conflict_description2_t *conflict,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ if (incoming_old_repos_relpath)
+ {
+ if (conflict->src_left_version)
+ *incoming_old_repos_relpath =
conflict->src_left_version->path_in_repos;
+ else
+ *incoming_old_repos_relpath = NULL;
+ }
+
+ if (incoming_old_pegrev)
+ {
+ if (conflict->src_left_version)
+ *incoming_old_pegrev = conflict->src_left_version->peg_rev;
+ else
+ *incoming_old_pegrev = SVN_INVALID_REVNUM;
+ }
+
+ if (incoming_old_node_kind)
+ {
+ if (conflict->src_left_version)
+ *incoming_old_node_kind = conflict->src_left_version->node_kind;
+ else
+ *incoming_old_node_kind = svn_node_none;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_client_conflict_get_incoming_new_repos_location(
+ const char **incoming_new_repos_relpath,
+ svn_revnum_t *incoming_new_pegrev,
+ svn_node_kind_t *incoming_new_node_kind,
+ const svn_wc_conflict_description2_t *conflict,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ if (incoming_new_repos_relpath)
+ {
+ if (conflict->src_right_version)
+ *incoming_new_repos_relpath =
+ conflict->src_right_version->path_in_repos;
+ else
+ *incoming_new_repos_relpath = NULL;
+ }
+
+ if (incoming_new_pegrev)
+ {
+ if (conflict->src_right_version)
+ *incoming_new_pegrev = conflict->src_right_version->peg_rev;
+ else
+ *incoming_new_pegrev = SVN_INVALID_REVNUM;
+ }
+
+ if (incoming_new_node_kind)
+ {
+ if (conflict->src_right_version)
+ *incoming_new_node_kind = conflict->src_right_version->node_kind;
+ else
+ *incoming_new_node_kind = svn_node_none;
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_node_kind_t
+svn_client_conflict_tree_get_victim_node_kind(
+ const svn_wc_conflict_description2_t *conflict)
+{
+ SVN_ERR_ASSERT_NO_RETURN(svn_client_conflict_get_kind(conflict)
+ == svn_wc_conflict_kind_tree);
+
+ return conflict->node_kind;
+}
+
+const char *
+svn_client_conflict_prop_get_propname(
+ const svn_wc_conflict_description2_t *conflict)
+{
+ SVN_ERR_ASSERT_NO_RETURN(svn_client_conflict_get_kind(conflict)
+ == svn_wc_conflict_kind_property);
+
+ return conflict->property_name;
+}
+
+svn_error_t *
+svn_client_conflict_prop_get_propvals(
+ const svn_string_t **base_propval,
+ const svn_string_t **working_propval,
+ const svn_string_t **incoming_old_propval,
+ const svn_string_t **incoming_new_propval,
+ const svn_wc_conflict_description2_t *conflict,
+ apr_pool_t *result_pool)
+{
+ SVN_ERR_ASSERT(svn_client_conflict_get_kind(conflict) ==
+ svn_wc_conflict_kind_property);
+
+ if (base_propval)
+ *base_propval = svn_string_dup(conflict->prop_value_base, result_pool);
+
+ if (working_propval)
+ *working_propval = svn_string_dup(conflict->prop_value_working,
+ result_pool);
+
+ if (incoming_old_propval)
+ *incoming_old_propval = svn_string_dup(conflict->prop_value_incoming_old,
+ result_pool);
+
+ if (incoming_new_propval)
+ *incoming_new_propval = svn_string_dup(conflict->prop_value_incoming_new,
+ result_pool);
+
+ return SVN_NO_ERROR;
+}
+
+const char *
+svn_client_conflict_text_get_mime_type(
+ const svn_wc_conflict_description2_t *conflict)
+{
+ SVN_ERR_ASSERT_NO_RETURN(svn_client_conflict_get_kind(conflict)
+ == svn_wc_conflict_kind_text);
+
+ return conflict->mime_type;
+}
+
+svn_error_t *
+svn_client_conflict_text_get_contents(
+ const char **base_abspath,
+ const char **working_abspath,
+ const char **incoming_old_abspath,
+ const char **incoming_new_abspath,
+ const svn_wc_conflict_description2_t *conflict,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ SVN_ERR_ASSERT(svn_client_conflict_get_kind(conflict)
+ == svn_wc_conflict_kind_text);
+
+ if (base_abspath)
+ {
+ if (svn_client_conflict_get_operation(conflict) ==
+ svn_wc_operation_merge)
+ *base_abspath = NULL; /* ### WC base contents not available yet */
+ else /* update/switch */
+ *base_abspath = conflict->base_abspath;
+ }
+
+ if (working_abspath)
+ *working_abspath = conflict->my_abspath;
+
+ if (incoming_old_abspath)
+ *incoming_old_abspath = conflict->base_abspath;
+
+ if (incoming_new_abspath)
+ *incoming_new_abspath = conflict->their_abspath;
+
+ return SVN_NO_ERROR;
+}
Modified: subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/fs.c
URL:
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/fs.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/fs.c (original)
+++ subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/fs.c Thu Jun 25
08:00:57 2015
@@ -134,6 +134,18 @@ fs_serialized_init(svn_fs_t *fs, apr_poo
return SVN_NO_ERROR;
}
+svn_error_t *
+svn_fs_fs__initialize_shared_data(svn_fs_t *fs,
+ svn_mutex__t *common_pool_lock,
+ apr_pool_t *pool,
+ apr_pool_t *common_pool)
+{
+ SVN_MUTEX__WITH_LOCK(common_pool_lock,
+ fs_serialized_init(fs, common_pool, pool));
+
+ return SVN_NO_ERROR;
+}
+
/* This function is provided for Subversion 1.0.x compatibility. It
@@ -480,28 +492,19 @@ fs_hotcopy(svn_fs_t *src_fs,
apr_pool_t *pool,
apr_pool_t *common_pool)
{
- /* Open the source repo as usual. */
SVN_ERR(fs_open(src_fs, src_path, common_pool_lock, pool, common_pool));
- if (cancel_func)
- SVN_ERR(cancel_func(cancel_baton));
- /* Test target repo when in INCREMENTAL mode, initialize it when not.
- * For this, we need our FS internal data structures to be temporarily
- * available. */
+ SVN_ERR(svn_fs__check_fs(dst_fs, FALSE));
SVN_ERR(initialize_fs_struct(dst_fs));
- SVN_ERR(svn_fs_fs__hotcopy_prepare_target(src_fs, dst_fs, dst_path,
- incremental, pool));
- uninitialize_fs_struct(dst_fs);
-
- /* Now, the destination repo should open just fine. */
- SVN_ERR(fs_open(dst_fs, dst_path, common_pool_lock, pool, common_pool));
- if (cancel_func)
- SVN_ERR(cancel_func(cancel_baton));
-
- /* Now, we may copy data as needed ... */
- return svn_fs_fs__hotcopy(src_fs, dst_fs, incremental,
- notify_func, notify_baton,
- cancel_func, cancel_baton, pool);
+
+ /* In INCREMENTAL mode, svn_fs_fs__hotcopy() will open DST_FS.
+ Otherwise, it's not an FS yet --- possibly just an empty dir --- so
+ can't be opened.
+ */
+ return svn_fs_fs__hotcopy(src_fs, dst_fs, src_path, dst_path,
+ incremental, notify_func, notify_baton,
+ cancel_func, cancel_baton, common_pool_lock,
+ pool, common_pool);
}
Modified: subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/fs.h
URL:
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/fs.h?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/fs.h (original)
+++ subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/fs.h Thu Jun 25
08:00:57 2015
@@ -82,8 +82,6 @@ extern "C" {
/* Names of special files and file extensions for transactions */
#define PATH_CHANGES "changes" /* Records changes made so far */
#define PATH_TXN_PROPS "props" /* Transaction properties */
-#define PATH_TXN_PROPS_FINAL "props-final" /* Final transaction properties
- before moving to revprops */
#define PATH_NEXT_IDS "next-ids" /* Next temporary ID assignments */
#define PATH_PREFIX_NODE "node." /* Prefix for node filename */
#define PATH_EXT_TXN ".txn" /* Extension of txn dir */
Modified: subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/fs_fs.h
URL:
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/fs_fs.h?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/fs_fs.h (original)
+++ subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/fs_fs.h Thu Jun 25
08:00:57 2015
@@ -39,6 +39,15 @@ svn_error_t *svn_fs_fs__open(svn_fs_t *f
const char *path,
apr_pool_t *pool);
+/* Initialize parts of the FS data that are being shared across multiple
+ filesystem objects. Use COMMON_POOL for process-wide and POOL for
+ temporary allocations. Use COMMON_POOL_LOCK to ensure that the
+ initialization is serialized. */
+svn_error_t *svn_fs_fs__initialize_shared_data(svn_fs_t *fs,
+ svn_mutex__t *common_pool_lock,
+ apr_pool_t *pool,
+ apr_pool_t *common_pool);
+
/* Upgrade the fsfs filesystem FS. Indicate progress via the optional
* NOTIFY_FUNC callback using NOTIFY_BATON. The optional CANCEL_FUNC
* will periodically be called with CANCEL_BATON to allow for preemption.
Modified: subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/hotcopy.c
URL:
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/hotcopy.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/hotcopy.c (original)
+++ subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/hotcopy.c Thu Jun 25
08:00:57 2015
@@ -982,6 +982,10 @@ hotcopy_body(void *baton, apr_pool_t *po
if (kind == svn_node_file)
{
SVN_ERR(svn_sqlite__hotcopy(src_subdir, dst_subdir, pool));
+
+ /* The source might have r/o flags set on it - which would be
+ carried over to the copy. */
+ SVN_ERR(svn_io_set_file_read_write(dst_subdir, FALSE, pool));
SVN_ERR(svn_fs_fs__del_rep_reference(dst_fs, src_youngest, pool));
}
}
@@ -991,65 +995,33 @@ hotcopy_body(void *baton, apr_pool_t *po
SVN_ERR(svn_io_dir_file_copy(src_fs->path, dst_fs->path,
PATH_TXN_CURRENT, pool));
- return SVN_NO_ERROR;
-}
-
-/* Wrapper around hotcopy_body taking out all necessary source repository
- * locks.
- */
-static svn_error_t *
-hotcopy_locking_src_body(void *baton, apr_pool_t *pool)
-{
- struct hotcopy_body_baton *hbb = baton;
- fs_fs_data_t *src_ffd = hbb->src_fs->fsap_data;
+ /* Hotcopied FS is complete. Stamp it with a format file. */
+ SVN_ERR(svn_fs_fs__write_format(dst_fs, TRUE, pool));
- return src_ffd->format >= SVN_FS_FS__MIN_PACK_LOCK_FORMAT
- ? svn_error_trace(svn_fs_fs__with_pack_lock(hbb->src_fs, hotcopy_body,
- baton, pool))
- : hotcopy_body(baton, pool);
+ return SVN_NO_ERROR;
}
-/* Create an empty filesystem at DST_FS at DST_PATH with the same
- * configuration as SRC_FS (uuid, format, and other parameters).
- * After creation DST_FS has no revisions, not even revision zero. */
-static svn_error_t *
-hotcopy_create_empty_dest(svn_fs_t *src_fs,
- svn_fs_t *dst_fs,
- const char *dst_path,
- apr_pool_t *pool)
+svn_error_t *
+svn_fs_fs__hotcopy(svn_fs_t *src_fs,
+ svn_fs_t *dst_fs,
+ const char *src_path,
+ const char *dst_path,
+ svn_boolean_t incremental,
+ svn_fs_hotcopy_notify_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ svn_mutex__t *common_pool_lock,
+ apr_pool_t *pool,
+ apr_pool_t *common_pool)
{
- fs_fs_data_t *src_ffd = src_fs->fsap_data;
+ struct hotcopy_body_baton hbb;
- /* Create the DST_FS repository with the same layout as SRC_FS. */
- SVN_ERR(svn_fs_fs__create_file_tree(dst_fs, dst_path, src_ffd->format,
- src_ffd->max_files_per_dir,
- src_ffd->use_log_addressing,
- pool));
-
- /* Copy the UUID. Hotcopy destination receives a new instance ID, but
- * has the same filesystem UUID as the source. */
- SVN_ERR(svn_fs_fs__set_uuid(dst_fs, src_fs->uuid, NULL, pool));
-
- /* Remove revision 0 contents. Otherwise, it may not get overwritten
- * due to having a newer timestamp. */
- SVN_ERR(hotcopy_remove_file(svn_fs_fs__path_rev(dst_fs, 0, pool), pool));
- SVN_ERR(hotcopy_remove_file(svn_fs_fs__path_revprops(dst_fs, 0, pool),
- pool));
-
- /* This filesystem is ready. Stamp it with a format number. Fail if
- * the 'format' file should already exist. */
- SVN_ERR(svn_fs_fs__write_format(dst_fs, FALSE, pool));
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
- return SVN_NO_ERROR;
-}
+ SVN_ERR(svn_fs_fs__open(src_fs, src_path, pool));
-svn_error_t *
-svn_fs_fs__hotcopy_prepare_target(svn_fs_t *src_fs,
- svn_fs_t *dst_fs,
- const char *dst_path,
- svn_boolean_t incremental,
- apr_pool_t *pool)
-{
if (incremental)
{
const char *dst_format_abspath;
@@ -1061,39 +1033,51 @@ svn_fs_fs__hotcopy_prepare_target(svn_fs
SVN_ERR(svn_io_check_path(dst_format_abspath, &dst_format_kind, pool));
if (dst_format_kind == svn_node_none)
{
- /* Destination doesn't exist yet. Perform a normal hotcopy to a
- * empty destination using the same configuration as the source. */
- SVN_ERR(hotcopy_create_empty_dest(src_fs, dst_fs, dst_path, pool));
- }
- else
- {
- /* Check the existing repository. */
- SVN_ERR(svn_fs_fs__open(dst_fs, dst_path, pool));
- SVN_ERR(hotcopy_incremental_check_preconditions(src_fs, dst_fs,
- pool));
+ /* No destination? Fallback to a non-incremental hotcopy. */
+ incremental = FALSE;
}
}
+
+ if (incremental)
+ {
+ /* Check the existing repository. */
+ SVN_ERR(svn_fs_fs__open(dst_fs, dst_path, pool));
+ SVN_ERR(hotcopy_incremental_check_preconditions(src_fs, dst_fs, pool));
+
+ SVN_ERR(svn_fs_fs__initialize_shared_data(dst_fs, common_pool_lock,
+ pool, common_pool));
+ SVN_ERR(svn_fs_fs__initialize_caches(dst_fs, pool));
+ }
else
{
/* Start out with an empty destination using the same configuration
* as the source. */
- SVN_ERR(hotcopy_create_empty_dest(src_fs, dst_fs, dst_path, pool));
+ fs_fs_data_t *src_ffd = src_fs->fsap_data;
+
+ /* Create the DST_FS repository with the same layout as SRC_FS. */
+ SVN_ERR(svn_fs_fs__create_file_tree(dst_fs, dst_path, src_ffd->format,
+ src_ffd->max_files_per_dir,
+ src_ffd->use_log_addressing,
+ pool));
+
+ /* Copy the UUID. Hotcopy destination receives a new instance ID, but
+ * has the same filesystem UUID as the source. */
+ SVN_ERR(svn_fs_fs__set_uuid(dst_fs, src_fs->uuid, NULL, pool));
+
+ /* Remove revision 0 contents. Otherwise, it may not get overwritten
+ * due to having a newer timestamp. */
+ SVN_ERR(hotcopy_remove_file(svn_fs_fs__path_rev(dst_fs, 0, pool),
+ pool));
+ SVN_ERR(hotcopy_remove_file(svn_fs_fs__path_revprops(dst_fs, 0, pool),
+ pool));
+
+ SVN_ERR(svn_fs_fs__initialize_shared_data(dst_fs, common_pool_lock,
+ pool, common_pool));
+ SVN_ERR(svn_fs_fs__initialize_caches(dst_fs, pool));
}
- return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_fs_fs__hotcopy(svn_fs_t *src_fs,
- svn_fs_t *dst_fs,
- svn_boolean_t incremental,
- svn_fs_hotcopy_notify_t notify_func,
- void *notify_baton,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- apr_pool_t *pool)
-{
- struct hotcopy_body_baton hbb;
+ if (cancel_func)
+ SVN_ERR(cancel_func(cancel_baton));
hbb.src_fs = src_fs;
hbb.dst_fs = dst_fs;
@@ -1102,8 +1086,15 @@ svn_fs_fs__hotcopy(svn_fs_t *src_fs,
hbb.notify_baton = notify_baton;
hbb.cancel_func = cancel_func;
hbb.cancel_baton = cancel_baton;
- SVN_ERR(svn_fs_fs__with_all_locks(dst_fs, hotcopy_locking_src_body, &hbb,
- pool));
+
+ /* Lock the destination in the incremental mode. For a non-incremental
+ * hotcopy, don't take any locks. In that case the destination cannot be
+ * opened until the hotcopy finishes, and we don't have to worry about
+ * concurrency. */
+ if (incremental)
+ SVN_ERR(svn_fs_fs__with_all_locks(dst_fs, hotcopy_body, &hbb, pool));
+ else
+ SVN_ERR(hotcopy_body(&hbb, pool));
return SVN_NO_ERROR;
}
Modified: subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/hotcopy.h
URL:
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/hotcopy.h?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/hotcopy.h (original)
+++ subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/hotcopy.h Thu Jun 25
08:00:57 2015
@@ -25,27 +25,23 @@
#include "fs.h"
-/* Create an empty copy of the fsfs filesystem SRC_FS into a new DST_FS at
- * DST_PATH. If INCREMENTAL is TRUE, perform a few pre-checks only if
- * a repo already exists at DST_PATH. Use POOL for temporary allocations. */
-svn_error_t *
-svn_fs_fs__hotcopy_prepare_target(svn_fs_t *src_fs,
- svn_fs_t *dst_fs,
- const char *dst_path,
- svn_boolean_t incremental,
- apr_pool_t *pool);
-
-/* Copy the fsfs filesystem SRC_FS into DST_FS. If INCREMENTAL is TRUE, do
- * not re-copy data which already exists in DST_FS. Indicate progress via
- * the optional NOTIFY_FUNC callback using NOTIFY_BATON. Use POOL for
- * temporary allocations. */
+/* Copy the fsfs filesystem SRC_FS at SRC_PATH into a new copy DST_FS at
+ * DST_PATH. If INCREMENTAL is TRUE, do not re-copy data which already
+ * exists in DST_FS. Indicate progress via the optional NOTIFY_FUNC
+ * callback using NOTIFY_BATON. Use COMMON_POOL for process-wide and
+ * POOL for temporary allocations. Use COMMON_POOL_LOCK to ensure
+ * that the initialization of the shared data is serialized. */
svn_error_t * svn_fs_fs__hotcopy(svn_fs_t *src_fs,
svn_fs_t *dst_fs,
+ const char *src_path,
+ const char *dst_path,
svn_boolean_t incremental,
svn_fs_hotcopy_notify_t notify_func,
void *notify_baton,
svn_cancel_func_t cancel_func,
void *cancel_baton,
- apr_pool_t *pool);
+ svn_mutex__t *common_pool_lock,
+ apr_pool_t *pool,
+ apr_pool_t *common_pool);
#endif
Modified: subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/pack.c
URL:
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/pack.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/pack.c (original)
+++ subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/pack.c Thu Jun 25
08:00:57 2015
@@ -1931,6 +1931,34 @@ pack_shard(struct pack_baton *baton,
return SVN_NO_ERROR;
}
+/* Read the youngest rev and the first non-packed rev info for FS from disk.
+ Set *FULLY_PACKED when there is no completed unpacked shard.
+ Use SCRATCH_POOL for temporary allocations.
+ */
+static svn_error_t *
+get_pack_status(svn_boolean_t *fully_packed,
+ svn_fs_t *fs,
+ apr_pool_t *scratch_pool)
+{
+ fs_fs_data_t *ffd = fs->fsap_data;
+ apr_int64_t completed_shards;
+ svn_revnum_t youngest;
+
+ SVN_ERR(svn_fs_fs__read_min_unpacked_rev(&ffd->min_unpacked_rev, fs,
+ scratch_pool));
+
+ SVN_ERR(svn_fs_fs__youngest_rev(&youngest, fs, scratch_pool));
+ completed_shards = (youngest + 1) / ffd->max_files_per_dir;
+
+ /* See if we've already completed all possible shards thus far. */
+ if (ffd->min_unpacked_rev == (completed_shards * ffd->max_files_per_dir))
+ *fully_packed = TRUE;
+ else
+ *fully_packed = FALSE;
+
+ return SVN_NO_ERROR;
+}
+
/* The work-horse for svn_fs_fs__pack, called with the FS write lock.
This implements the svn_fs_fs__with_write_lock() 'body' callback
type. BATON is a 'struct pack_baton *'.
@@ -1952,30 +1980,16 @@ pack_body(void *baton,
struct pack_baton *pb = baton;
fs_fs_data_t *ffd = pb->fs->fsap_data;
apr_int64_t completed_shards;
- svn_revnum_t youngest;
apr_pool_t *iterpool;
+ svn_boolean_t fully_packed;
- /* If the repository isn't a new enough format, we don't support packing.
- Return a friendly error to that effect. */
- if (ffd->format < SVN_FS_FS__MIN_PACKED_FORMAT)
- return svn_error_createf(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
- _("FSFS format (%d) too old to pack; please upgrade the filesystem."),
- ffd->format);
-
- /* If we aren't using sharding, we can't do any packing, so quit. */
- if (!ffd->max_files_per_dir)
- return SVN_NO_ERROR;
-
- SVN_ERR(svn_fs_fs__read_min_unpacked_rev(&ffd->min_unpacked_rev, pb->fs,
- pool));
-
- SVN_ERR(svn_fs_fs__youngest_rev(&youngest, pb->fs, pool));
- completed_shards = (youngest + 1) / ffd->max_files_per_dir;
-
- /* See if we've already completed all possible shards thus far. */
- if (ffd->min_unpacked_rev == (completed_shards * ffd->max_files_per_dir))
+ /* Since another process might have already packed the repo,
+ we need to re-read the pack status. */
+ SVN_ERR(get_pack_status(&fully_packed, pb->fs, pool));
+ if (fully_packed)
return SVN_NO_ERROR;
+ completed_shards = (ffd->youngest_rev_cache + 1) / ffd->max_files_per_dir;
pb->revs_dir = svn_dirent_join(pb->fs->path, PATH_REVS_DIR, pool);
if (ffd->format >= SVN_FS_FS__MIN_PACKED_REVPROP_FORMAT)
pb->revsprops_dir = svn_dirent_join(pb->fs->path, PATH_REVPROPS_DIR,
@@ -2009,7 +2023,25 @@ svn_fs_fs__pack(svn_fs_t *fs,
struct pack_baton pb = { 0 };
fs_fs_data_t *ffd = fs->fsap_data;
svn_error_t *err;
+ svn_boolean_t fully_packed;
+
+ /* If the repository isn't a new enough format, we don't support packing.
+ Return a friendly error to that effect. */
+ if (ffd->format < SVN_FS_FS__MIN_PACKED_FORMAT)
+ return svn_error_createf(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
+ _("FSFS format (%d) too old to pack; please upgrade the filesystem."),
+ ffd->format);
+
+ /* If we aren't using sharding, we can't do any packing, so quit. */
+ if (!ffd->max_files_per_dir)
+ return SVN_NO_ERROR;
+
+ /* Is there we even anything to do?. */
+ SVN_ERR(get_pack_status(&fully_packed, fs, pool));
+ if (fully_packed)
+ return SVN_NO_ERROR;
+ /* Lock the repo and start the pack process. */
pb.fs = fs;
pb.notify_func = notify_func;
pb.notify_baton = notify_baton;
Modified: subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/transaction.c
URL:
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/transaction.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/transaction.c
(original)
+++ subversion/branches/fsx-1.10/subversion/libsvn_fs_fs/transaction.c Thu Jun
25 08:00:57 2015
@@ -89,15 +89,6 @@ path_txn_props(svn_fs_t *fs,
}
static APR_INLINE const char *
-path_txn_props_final(svn_fs_t *fs,
- const svn_fs_fs__id_part_t *txn_id,
- apr_pool_t *pool)
-{
- return svn_dirent_join(svn_fs_fs__path_txn_dir(fs, txn_id, pool),
- PATH_TXN_PROPS_FINAL, pool);
-}
-
-static APR_INLINE const char *
path_txn_next_ids(svn_fs_t *fs,
const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool)
@@ -1160,7 +1151,6 @@ static svn_error_t *
set_txn_proplist(svn_fs_t *fs,
const svn_fs_fs__id_part_t *txn_id,
apr_hash_t *props,
- svn_boolean_t final,
apr_pool_t *pool)
{
svn_stringbuf_t *buf;
@@ -1173,9 +1163,7 @@ set_txn_proplist(svn_fs_t *fs,
SVN_ERR(svn_stream_close(stream));
/* Open the transaction properties file and write new contents to it. */
- SVN_ERR(svn_io_write_atomic((final
- ? path_txn_props_final(fs, txn_id, pool)
- : path_txn_props(fs, txn_id, pool)),
+ SVN_ERR(svn_io_write_atomic(path_txn_props(fs, txn_id, pool),
buf->data, buf->len,
NULL /* copy_perms_path */, pool));
return SVN_NO_ERROR;
@@ -1232,7 +1220,7 @@ svn_fs_fs__change_txn_props(svn_fs_txn_t
/* Create a new version of the file and write out the new props. */
/* Open the transaction properties file. */
- SVN_ERR(set_txn_proplist(txn->fs, &ftd->txn_id, txn_prop, FALSE, pool));
+ SVN_ERR(set_txn_proplist(txn->fs, &ftd->txn_id, txn_prop, pool));
return SVN_NO_ERROR;
}
@@ -3337,41 +3325,31 @@ verify_locks(svn_fs_t *fs,
return SVN_NO_ERROR;
}
-/* Return in *PATH the path to a file containing the properties that
- make up the final revision properties file. This involves setting
- svn:date and removing any temporary properties associated with the
- commit flags. */
+/* Writes final revision properties to file PATH applying permissions
+ from file PERMS_REFERENCE. This involves setting svn:date and
+ removing any temporary properties associated with the commit flags. */
static svn_error_t *
-write_final_revprop(const char **path,
+write_final_revprop(const char *path,
+ const char *perms_reference,
svn_fs_txn_t *txn,
- const svn_fs_fs__id_part_t *txn_id,
apr_pool_t *pool)
{
apr_hash_t *txnprops;
- svn_boolean_t final_mods = FALSE;
svn_string_t date;
svn_string_t *client_date;
+ apr_file_t *revprop_file;
+ svn_stream_t *stream;
SVN_ERR(svn_fs_fs__txn_proplist(&txnprops, txn, pool));
/* Remove any temporary txn props representing 'flags'. */
- if (svn_hash_gets(txnprops, SVN_FS__PROP_TXN_CHECK_OOD))
- {
- svn_hash_sets(txnprops, SVN_FS__PROP_TXN_CHECK_OOD, NULL);
- final_mods = TRUE;
- }
-
- if (svn_hash_gets(txnprops, SVN_FS__PROP_TXN_CHECK_LOCKS))
- {
- svn_hash_sets(txnprops, SVN_FS__PROP_TXN_CHECK_LOCKS, NULL);
- final_mods = TRUE;
- }
+ svn_hash_sets(txnprops, SVN_FS__PROP_TXN_CHECK_OOD, NULL);
+ svn_hash_sets(txnprops, SVN_FS__PROP_TXN_CHECK_LOCKS, NULL);
client_date = svn_hash_gets(txnprops, SVN_FS__PROP_TXN_CLIENT_DATE);
if (client_date)
{
svn_hash_sets(txnprops, SVN_FS__PROP_TXN_CLIENT_DATE, NULL);
- final_mods = TRUE;
}
/* Update commit time to ensure that svn:date revprops remain ordered if
@@ -3381,18 +3359,22 @@ write_final_revprop(const char **path,
date.data = svn_time_to_cstring(apr_time_now(), pool);
date.len = strlen(date.data);
svn_hash_sets(txnprops, SVN_PROP_REVISION_DATE, &date);
- final_mods = TRUE;
}
- if (final_mods)
- {
- SVN_ERR(set_txn_proplist(txn->fs, txn_id, txnprops, TRUE, pool));
- *path = path_txn_props_final(txn->fs, txn_id, pool);
- }
- else
- {
- *path = path_txn_props(txn->fs, txn_id, pool);
- }
+ /* Create new revprops file. Tell OS to truncate existing file,
+ since file may already exists from failed transaction. */
+ SVN_ERR(svn_io_file_open(&revprop_file, path,
+ APR_WRITE | APR_CREATE | APR_TRUNCATE
+ | APR_BUFFERED, APR_OS_DEFAULT, pool));
+
+ stream = svn_stream_from_aprfile2(revprop_file, TRUE, pool);
+ SVN_ERR(svn_hash_write2(txnprops, stream, SVN_HASH_TERMINATOR, pool));
+ SVN_ERR(svn_stream_close(stream));
+
+ SVN_ERR(svn_io_file_flush_to_disk(revprop_file, pool));
+ SVN_ERR(svn_io_file_close(revprop_file, pool));
+
+ SVN_ERR(svn_io_copy_perms(perms_reference, path, pool));
return SVN_NO_ERROR;
}
@@ -3457,7 +3439,7 @@ commit_body(void *baton, apr_pool_t *poo
struct commit_baton *cb = baton;
fs_fs_data_t *ffd = cb->fs->fsap_data;
const char *old_rev_filename, *rev_filename, *proto_filename;
- const char *revprop_filename, *final_revprop;
+ const char *revprop_filename;
const svn_fs_id_t *root_id, *new_root_id;
apr_uint64_t start_node_id;
apr_uint64_t start_copy_id;
@@ -3610,12 +3592,11 @@ commit_body(void *baton, apr_pool_t *poo
remove the transaction directory later. */
SVN_ERR(unlock_proto_rev(cb->fs, txn_id, proto_file_lockcookie, pool));
- /* Move the revprops file into place. */
+ /* Write final revprops file. */
SVN_ERR_ASSERT(! svn_fs_fs__is_packed_revprop(cb->fs, new_rev));
- SVN_ERR(write_final_revprop(&revprop_filename, cb->txn, txn_id, pool));
- final_revprop = svn_fs_fs__path_revprops(cb->fs, new_rev, pool);
- SVN_ERR(svn_fs_fs__move_into_place(revprop_filename, final_revprop,
- old_rev_filename, pool));
+ revprop_filename = svn_fs_fs__path_revprops(cb->fs, new_rev, pool);
+ SVN_ERR(write_final_revprop(revprop_filename, old_rev_filename,
+ cb->txn, pool));
/* Update the 'current' file. */
SVN_ERR(verify_as_revision_before_current_plus_plus(cb->fs, new_rev, pool));
@@ -3919,6 +3900,5 @@ svn_fs_fs__begin_txn(svn_fs_txn_t **txn_
svn_string_create("0", pool));
ftd = (*txn_p)->fsap_data;
- return svn_error_trace(set_txn_proplist(fs, &ftd->txn_id, props, FALSE,
- pool));
+ return svn_error_trace(set_txn_proplist(fs, &ftd->txn_id, props, pool));
}
Modified: subversion/branches/fsx-1.10/subversion/libsvn_repos/rev_hunt.c
URL:
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/libsvn_repos/rev_hunt.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/libsvn_repos/rev_hunt.c (original)
+++ subversion/branches/fsx-1.10/subversion/libsvn_repos/rev_hunt.c Thu Jun 25
08:00:57 2015
@@ -1336,6 +1336,7 @@ struct send_baton
apr_hash_t *last_props;
const char *last_path;
svn_fs_root_t *last_root;
+ svn_boolean_t include_merged_revisions;
};
/* Send PATH_REV to HANDLER and HANDLER_BATON, using information provided by
@@ -1373,15 +1374,32 @@ send_path_revision(struct path_revision
SVN_ERR(svn_prop_diffs(&prop_diffs, props, sb->last_props,
sb->iterpool));
- /* Check if the contents *may* have changed. (Allow false positives,
- for now, as the blame implementation currently depends on them.) */
- /* Special case: In the first revision, we always provide a delta. */
- if (sb->last_root)
- SVN_ERR(svn_fs_contents_different(&contents_changed, sb->last_root,
- sb->last_path, root, path_rev->path,
- sb->iterpool));
+ /* Check if the contents *may* have changed. */
+ if (! sb->last_root)
+ {
+ /* Special case: In the first revision, we always provide a delta. */
+ contents_changed = TRUE;
+ }
+ else if (sb->include_merged_revisions
+ && strcmp(sb->last_path, path_rev->path))
+ {
+ /* ### This is a HACK!!!
+ * Blame -g, in older clients anyways, relies on getting a notification
+ * whenever the path changes - even if there was no content change.
+ *
+ * TODO: A future release should take an extra parameter and depending
+ * on that either always send a text delta or only send it if there
+ * is a difference. */
+ contents_changed = TRUE;
+ }
else
- contents_changed = TRUE;
+ {
+ /* Did the file contents actually change?
+ * It could e.g. be a property-only change. */
+ SVN_ERR(svn_fs_contents_different(&contents_changed, sb->last_root,
+ sb->last_path, root, path_rev->path,
+ sb->iterpool));
+ }
/* We have all we need, give to the handler. */
SVN_ERR(handler(handler_baton, path_rev->path, path_rev->revnum,
@@ -1450,6 +1468,7 @@ get_file_revs_backwards(svn_repos_t *rep
last_pool = svn_pool_create(scratch_pool);
sb.iterpool = svn_pool_create(scratch_pool);
sb.last_pool = svn_pool_create(scratch_pool);
+ sb.include_merged_revisions = FALSE;
/* We want the first txdelta to be against the empty file. */
sb.last_root = NULL;
@@ -1605,6 +1624,9 @@ svn_repos_get_file_revs2(svn_repos_t *re
/* Create an empty hash table for the first property diff. */
sb.last_props = apr_hash_make(sb.last_pool);
+ /* Inform send_path_revision() whether workarounds / special behavior
+ * may be needed. */
+ sb.include_merged_revisions = include_merged_revisions;
/* Get the revisions we are interested in. */
duplicate_path_revs = apr_hash_make(scratch_pool);
Modified: subversion/branches/fsx-1.10/subversion/libsvn_subr/io.c
URL:
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/libsvn_subr/io.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/libsvn_subr/io.c (original)
+++ subversion/branches/fsx-1.10/subversion/libsvn_subr/io.c Thu Jun 25
08:00:57 2015
@@ -2301,6 +2301,14 @@ svn_error_t *svn_io_file_flush_to_disk(a
apr_pool_t *pool)
{
apr_os_file_t filehand;
+ const char *fname;
+ apr_status_t apr_err;
+
+ /* We need this only in case of an error but this is cheap to get -
+ * so we do it here for clarity. */
+ apr_err = apr_file_name_get(&fname, file);
+ if (apr_err)
+ return svn_error_wrap_apr(apr_err, _("Can't get file name"));
/* ### In apr 1.4+ we could delegate most of this function to
apr_file_sync(). The only major difference is that this doesn't
@@ -2318,7 +2326,8 @@ svn_error_t *svn_io_file_flush_to_disk(a
if (! FlushFileBuffers(filehand))
return svn_error_wrap_apr(apr_get_os_error(),
- _("Can't flush file to disk"));
+ _("Can't flush file '%s' to disk"),
+ try_utf8_from_internal_style(fname, pool));
#else
int rv;
@@ -2339,7 +2348,8 @@ svn_error_t *svn_io_file_flush_to_disk(a
if (rv == -1)
return svn_error_wrap_apr(apr_get_os_error(),
- _("Can't flush file to disk"));
+ _("Can't flush file '%s' to disk"),
+ try_utf8_from_internal_style(fname, pool));
#endif
}
@@ -4060,36 +4070,11 @@ svn_io_file_move(const char *from_path,
if (err && APR_STATUS_IS_EXDEV(err->apr_err))
{
- const char *tmp_to_path;
-
svn_error_clear(err);
- SVN_ERR(svn_io_open_unique_file3(NULL, &tmp_to_path,
- svn_dirent_dirname(to_path, pool),
- svn_io_file_del_none,
- pool, pool));
-
- err = svn_error_trace(svn_io_copy_file(from_path, tmp_to_path, TRUE,
+ /* svn_io_copy_file() performs atomic copy via temporary file. */
+ err = svn_error_trace(svn_io_copy_file(from_path, to_path, TRUE,
pool));
- if (err)
- goto failed_tmp;
-
- err = svn_error_trace(svn_io_file_rename(tmp_to_path, to_path, pool));
- if (err)
- goto failed_tmp;
-
- err = svn_error_trace(svn_io_remove_file2(from_path, FALSE, pool));
- if (! err)
- return SVN_NO_ERROR;
-
- return svn_error_compose_create(
- err,
- svn_error_trace(svn_io_remove_file2(to_path, FALSE, pool)));
-
- failed_tmp:
- err = svn_error_compose_create(
- err,
- svn_error_trace(svn_io_remove_file2(tmp_to_path, FALSE, pool)));
}
return err;
Modified: subversion/branches/fsx-1.10/subversion/mod_dav_svn/activity.c
URL:
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/mod_dav_svn/activity.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/mod_dav_svn/activity.c (original)
+++ subversion/branches/fsx-1.10/subversion/mod_dav_svn/activity.c Thu Jun 25
08:00:57 2015
@@ -165,7 +165,7 @@ dav_svn__delete_activity(const dav_svn_r
txn_name = read_txn(pathname, repos->pool);
if (txn_name == NULL)
{
- return dav_svn__new_error(repos->pool, HTTP_NOT_FOUND, 0,
+ return dav_svn__new_error(repos->pool, HTTP_NOT_FOUND, 0, 0,
"could not find activity.");
}
Modified: subversion/branches/fsx-1.10/subversion/mod_dav_svn/dav_svn.h
URL:
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/mod_dav_svn/dav_svn.h?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/mod_dav_svn/dav_svn.h (original)
+++ subversion/branches/fsx-1.10/subversion/mod_dav_svn/dav_svn.h Thu Jun 25
08:00:57 2015
@@ -796,28 +796,35 @@ dav_svn__authz_read_func(dav_svn__authz_
If ERROR_ID is 0, SVN_ERR_RA_DAV_REQUEST_FAILED will be used as a
default value for the error code.
+
+ mod_dav is definitive documentation of the parameters, but a
+ guideline to the different error is:
+
+ STATUS is the HTTP status returned to the client.
+
+ ERROR_ID is an additional DAV-specific error such as a violation of
+ the DAV rules. mod_dav.h defines some values but callers can pass
+ others.
+
+ APRERR is any underlying OS/system error.
*/
dav_error *
dav_svn__new_error_svn(apr_pool_t *pool,
int status,
int error_id,
+ apr_status_t aprerr,
const char *desc);
/* A wrapper around mod_dav's dav_new_error, mod_dav_svn uses this
instead of the mod_dav function to enable special mod_dav_svn specific
- processing. See dav_new_error for parameter documentation.
- Note that DESC may be null (it's hard to track this down from
- dav_new_error()'s documentation, but see the dav_error type,
- which says that its desc field may be NULL).
-
- If ERROR_ID is 0, SVN_ERR_RA_DAV_REQUEST_FAILED will be used as a
- default value for the error code.
+ processing. See dav_svn__new_error_svn for additional details.
*/
dav_error *
dav_svn__new_error(apr_pool_t *pool,
int status,
int error_id,
+ apr_status_t aprerr,
const char *desc);
Modified: subversion/branches/fsx-1.10/subversion/mod_dav_svn/deadprops.c
URL:
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/mod_dav_svn/deadprops.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/mod_dav_svn/deadprops.c (original)
+++ subversion/branches/fsx-1.10/subversion/mod_dav_svn/deadprops.c Thu Jun 25
08:00:57 2015
@@ -199,7 +199,7 @@ save_value(dav_db *db, const dav_prop_na
/* ignore the unknown namespace of the incoming prop. */
propname = name->name;
else
- return dav_svn__new_error(db->p, HTTP_CONFLICT, 0,
+ return dav_svn__new_error(db->p, HTTP_CONFLICT, 0, 0,
"Properties may only be defined in the "
SVN_DAV_PROP_NS_SVN " and "
SVN_DAV_PROP_NS_CUSTOM " namespaces.");
@@ -328,7 +328,7 @@ db_open(apr_pool_t *p,
changing unversioned rev props. Remove this someday: see IZ #916. */
if (! (resource->baselined
&& resource->type == DAV_RESOURCE_TYPE_VERSION))
- return dav_svn__new_error(p, HTTP_CONFLICT, 0,
+ return dav_svn__new_error(p, HTTP_CONFLICT, 0, 0,
"Properties may only be changed on working "
"resources.");
}
@@ -479,7 +479,7 @@ decode_property_value(const svn_string_t
*out_propval_p = svn_base64_decode_string(maybe_encoded_propval,
pool);
else
- return dav_svn__new_error(pool, HTTP_INTERNAL_SERVER_ERROR, 0,
+ return dav_svn__new_error(pool, HTTP_INTERNAL_SERVER_ERROR, 0, 0,
"Unknown property encoding");
break;
}
@@ -526,7 +526,7 @@ db_store(dav_db *db,
if (absent && ! elem->first_child)
/* ### better error check */
- return dav_svn__new_error(pool, HTTP_INTERNAL_SERVER_ERROR, 0,
+ return dav_svn__new_error(pool, HTTP_INTERNAL_SERVER_ERROR, 0, 0,
apr_psprintf(pool,
"'%s' cannot be specified on the "
"value without specifying an "
Modified: subversion/branches/fsx-1.10/subversion/mod_dav_svn/lock.c
URL:
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/mod_dav_svn/lock.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/mod_dav_svn/lock.c (original)
+++ subversion/branches/fsx-1.10/subversion/mod_dav_svn/lock.c Thu Jun 25
08:00:57 2015
@@ -147,7 +147,7 @@ unescape_xml(const char **output,
errbuf[0] = '\0';
(void)apr_xml_parser_geterror(xml_parser, errbuf, sizeof(errbuf));
return dav_svn__new_error(pool, HTTP_INTERNAL_SERVER_ERROR,
- DAV_ERR_LOCK_SAVE_LOCK, errbuf);
+ DAV_ERR_LOCK_SAVE_LOCK, apr_err, errbuf);
}
apr_xml_to_text(pool, xml_doc->root, APR_XML_X2T_INNER,
@@ -170,12 +170,12 @@ dav_lock_to_svn_lock(svn_lock_t **slock,
/* Sanity checks */
if (dlock->type != DAV_LOCKTYPE_WRITE)
return dav_svn__new_error(pool, HTTP_BAD_REQUEST,
- DAV_ERR_LOCK_SAVE_LOCK,
+ DAV_ERR_LOCK_SAVE_LOCK, 0,
"Only 'write' locks are supported.");
if (dlock->scope != DAV_LOCKSCOPE_EXCLUSIVE)
return dav_svn__new_error(pool, HTTP_BAD_REQUEST,
- DAV_ERR_LOCK_SAVE_LOCK,
+ DAV_ERR_LOCK_SAVE_LOCK, 0,
"Only exclusive locks are supported.");
lock = svn_lock_create(pool);
@@ -470,7 +470,7 @@ get_locks(dav_lockdb *lockdb,
if (! dav_svn__allow_read_resource(resource, SVN_INVALID_REVNUM,
resource->pool))
return dav_svn__new_error(resource->pool, HTTP_FORBIDDEN,
- DAV_ERR_LOCK_SAVE_LOCK,
+ DAV_ERR_LOCK_SAVE_LOCK, 0,
"Path is not accessible.");
serr = svn_fs_get_lock(&slock,
@@ -531,7 +531,7 @@ find_lock(dav_lockdb *lockdb,
if (! dav_svn__allow_read_resource(resource, SVN_INVALID_REVNUM,
resource->pool))
return dav_svn__new_error(resource->pool, HTTP_FORBIDDEN,
- DAV_ERR_LOCK_SAVE_LOCK,
+ DAV_ERR_LOCK_SAVE_LOCK, 0,
"Path is not accessible.");
serr = svn_fs_get_lock(&slock,
@@ -548,7 +548,7 @@ find_lock(dav_lockdb *lockdb,
/* Sanity check. */
if (strcmp(locktoken->uuid_str, slock->token) != 0)
return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST,
- DAV_ERR_LOCK_SAVE_LOCK,
+ DAV_ERR_LOCK_SAVE_LOCK, 0,
"Incoming token doesn't match existing "
"lock.");
@@ -612,7 +612,7 @@ has_locks(dav_lockdb *lockdb, const dav_
if (! dav_svn__allow_read_resource(resource, SVN_INVALID_REVNUM,
resource->pool))
return dav_svn__new_error(resource->pool, HTTP_FORBIDDEN,
- DAV_ERR_LOCK_SAVE_LOCK,
+ DAV_ERR_LOCK_SAVE_LOCK, 0,
"Path is not accessible.");
serr = svn_fs_get_lock(&slock,
@@ -655,13 +655,13 @@ append_locks(dav_lockdb *lockdb,
/* We don't allow anonymous locks */
if (! repos->username)
return dav_svn__new_error(resource->pool, HTTP_NOT_IMPLEMENTED,
- DAV_ERR_LOCK_SAVE_LOCK,
+ DAV_ERR_LOCK_SAVE_LOCK, 0,
"Anonymous lock creation is not allowed.");
/* Not a path in the repository so can't lock it. */
if (! resource->info->repos_path)
return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST,
- DAV_ERR_LOCK_SAVE_LOCK,
+ DAV_ERR_LOCK_SAVE_LOCK, 0,
"Attempted to lock path not in repository.");
/* If the resource's fs path is unreadable, we don't allow a lock to
@@ -669,12 +669,12 @@ append_locks(dav_lockdb *lockdb,
if (! dav_svn__allow_read_resource(resource, SVN_INVALID_REVNUM,
resource->pool))
return dav_svn__new_error(resource->pool, HTTP_FORBIDDEN,
- DAV_ERR_LOCK_SAVE_LOCK,
+ DAV_ERR_LOCK_SAVE_LOCK, 0,
"Path is not accessible.");
if (lock->next)
return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST,
- DAV_ERR_LOCK_SAVE_LOCK,
+ DAV_ERR_LOCK_SAVE_LOCK, 0,
"Tried to attach multiple locks to a resource.");
/* RFC2518bis (section 7.4) doesn't require us to support
@@ -693,13 +693,13 @@ append_locks(dav_lockdb *lockdb,
if (resource->info->repos->is_svn_client)
return dav_svn__new_error(resource->pool, HTTP_METHOD_NOT_ALLOWED,
- DAV_ERR_LOCK_SAVE_LOCK,
+ DAV_ERR_LOCK_SAVE_LOCK, 0,
"Subversion clients may not lock "
"nonexistent paths.");
else if (! resource->info->repos->autoversioning)
return dav_svn__new_error(resource->pool, HTTP_METHOD_NOT_ALLOWED,
- DAV_ERR_LOCK_SAVE_LOCK,
+ DAV_ERR_LOCK_SAVE_LOCK, 0,
"Attempted to lock non-existent path; "
"turn on autoversioning first.");
@@ -755,7 +755,7 @@ append_locks(dav_lockdb *lockdb,
else
return dav_svn__new_error(resource->pool,
HTTP_INTERNAL_SERVER_ERROR,
- 0,
+ 0, 0,
"Commit failed but there was no error "
"provided.");
}
@@ -784,7 +784,7 @@ append_locks(dav_lockdb *lockdb,
{
svn_error_clear(serr);
return dav_svn__new_error(resource->pool, HTTP_NOT_IMPLEMENTED,
- DAV_ERR_LOCK_SAVE_LOCK,
+ DAV_ERR_LOCK_SAVE_LOCK, 0,
"Anonymous lock creation is not allowed.");
}
else if (serr && serr->apr_err == SVN_ERR_REPOS_POST_LOCK_HOOK_FAILED)
@@ -881,7 +881,7 @@ remove_lock(dav_lockdb *lockdb,
if (! dav_svn__allow_read_resource(resource, SVN_INVALID_REVNUM,
resource->pool))
return dav_svn__new_error(resource->pool, HTTP_FORBIDDEN,
- DAV_ERR_LOCK_SAVE_LOCK,
+ DAV_ERR_LOCK_SAVE_LOCK, 0,
"Path is not accessible.");
if (locktoken == NULL)
@@ -918,7 +918,7 @@ remove_lock(dav_lockdb *lockdb,
{
svn_error_clear(serr);
return dav_svn__new_error(resource->pool, HTTP_NOT_IMPLEMENTED,
- DAV_ERR_LOCK_SAVE_LOCK,
+ DAV_ERR_LOCK_SAVE_LOCK, 0,
"Anonymous lock removal is not allowed.");
}
else if (serr && serr->apr_err == SVN_ERR_REPOS_POST_UNLOCK_HOOK_FAILED
@@ -1014,7 +1014,7 @@ refresh_locks(dav_lockdb *lockdb,
if (! dav_svn__allow_read_resource(resource, SVN_INVALID_REVNUM,
resource->pool))
return dav_svn__new_error(resource->pool, HTTP_FORBIDDEN,
- DAV_ERR_LOCK_SAVE_LOCK,
+ DAV_ERR_LOCK_SAVE_LOCK, 0,
"Path is not accessible.");
/* Convert the path into an svn_lock_t. */
@@ -1032,7 +1032,7 @@ refresh_locks(dav_lockdb *lockdb,
if ((! slock)
|| (strcmp(token->uuid_str, slock->token) != 0))
return dav_svn__new_error(resource->pool, HTTP_PRECONDITION_FAILED,
- DAV_ERR_LOCK_SAVE_LOCK,
+ DAV_ERR_LOCK_SAVE_LOCK, 0,
"Lock refresh request doesn't match existing "
"lock.");
@@ -1053,7 +1053,7 @@ refresh_locks(dav_lockdb *lockdb,
{
svn_error_clear(serr);
return dav_svn__new_error(resource->pool, HTTP_NOT_IMPLEMENTED,
- DAV_ERR_LOCK_SAVE_LOCK,
+ DAV_ERR_LOCK_SAVE_LOCK, 0,
"Anonymous lock refreshing is not allowed.");
}
else if (serr && (svn_error_find_cause(serr, SVN_ERR_REPOS_HOOK_FAILURE) ||
Modified: subversion/branches/fsx-1.10/subversion/mod_dav_svn/merge.c
URL:
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/mod_dav_svn/merge.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/mod_dav_svn/merge.c (original)
+++ subversion/branches/fsx-1.10/subversion/mod_dav_svn/merge.c Thu Jun 25
08:00:57 2015
@@ -307,7 +307,8 @@ dav_svn__merge_response(ap_filter_t *out
"<D:version-name>", rev, "</D:version-name>" DEBUG_CR,
NULL);
if (status != APR_SUCCESS)
- return dav_svn__new_error(repos->pool, HTTP_INTERNAL_SERVER_ERROR, 0,
+ return dav_svn__new_error(repos->pool, HTTP_INTERNAL_SERVER_ERROR,
+ 0, status,
"Could not write output");
if (creationdate)
@@ -318,7 +319,8 @@ dav_svn__merge_response(ap_filter_t *out
"</D:creationdate>" DEBUG_CR,
NULL);
if (status != APR_SUCCESS)
- return dav_svn__new_error(repos->pool, HTTP_INTERNAL_SERVER_ERROR, 0,
+ return dav_svn__new_error(repos->pool, HTTP_INTERNAL_SERVER_ERROR,
+ 0, status,
"Could not write output");
}
if (creator_displayname)
@@ -330,7 +332,8 @@ dav_svn__merge_response(ap_filter_t *out
"</D:creator-displayname>" DEBUG_CR,
NULL);
if (status != APR_SUCCESS)
- return dav_svn__new_error(repos->pool, HTTP_INTERNAL_SERVER_ERROR, 0,
+ return dav_svn__new_error(repos->pool, HTTP_INTERNAL_SERVER_ERROR,
+ 0, status,
"Could not write output");
}
status = ap_fputstrs(output, bb,
@@ -341,7 +344,8 @@ dav_svn__merge_response(ap_filter_t *out
NULL);
if (status != APR_SUCCESS)
- return dav_svn__new_error(repos->pool, HTTP_INTERNAL_SERVER_ERROR, 0,
+ return dav_svn__new_error(repos->pool, HTTP_INTERNAL_SERVER_ERROR,
+ 0, status,
"Could not write output");
/* ONLY have dir_delta drive the editor if the caller asked us to
@@ -375,13 +379,15 @@ dav_svn__merge_response(ap_filter_t *out
"</D:updated-set>" DEBUG_CR
"</D:merge-response>" DEBUG_CR);
if (status != APR_SUCCESS)
- return dav_svn__new_error(repos->pool, HTTP_INTERNAL_SERVER_ERROR, 0,
+ return dav_svn__new_error(repos->pool, HTTP_INTERNAL_SERVER_ERROR,
+ 0, status,
"Could not write output");
/* send whatever is left in the brigade */
status = ap_pass_brigade(output, bb);
if (status != APR_SUCCESS)
- return dav_svn__new_error(repos->pool, HTTP_INTERNAL_SERVER_ERROR, 0,
+ return dav_svn__new_error(repos->pool, HTTP_INTERNAL_SERVER_ERROR,
+ 0, status,
"Could not write output");
return NULL;
Modified:
subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/dated-rev.c
URL:
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/dated-rev.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/dated-rev.c
(original)
+++ subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/dated-rev.c Thu
Jun 25 08:00:57 2015
@@ -80,7 +80,7 @@ dav_svn__dated_rev_report(const dav_reso
if (tm == (apr_time_t) -1)
{
- return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0,
+ return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0, 0,
"The request does not contain a valid "
"'DAV:" SVN_DAV__CREATIONDATE "' element.");
}
@@ -90,7 +90,8 @@ dav_svn__dated_rev_report(const dav_reso
resource->pool)) != SVN_NO_ERROR)
{
svn_error_clear(err);
- return dav_svn__new_error(resource->pool, HTTP_INTERNAL_SERVER_ERROR, 0,
+ return dav_svn__new_error(resource->pool, HTTP_INTERNAL_SERVER_ERROR,
+ 0, 0,
"Could not access revision times.");
}
Modified:
subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/deleted-rev.c
URL:
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/deleted-rev.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/deleted-rev.c
(original)
+++ subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/deleted-rev.c
Thu Jun 25 08:00:57 2015
@@ -57,11 +57,11 @@ dav_svn__get_deleted_rev_report(const da
/* Sanity check. */
if (!resource->info->repos_path)
- return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0,
+ return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0, 0,
"The request does not specify a repository
path");
ns = dav_svn__find_ns(doc->namespaces, SVN_XML_NAMESPACE);
if (ns == -1)
- return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
+ return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0, 0,
"The request does not contain the 'svn:' "
"namespace, so it is not going to have "
"certain required elements");
@@ -102,7 +102,7 @@ dav_svn__get_deleted_rev_report(const da
&& SVN_IS_VALID_REVNUM(peg_rev)
&& SVN_IS_VALID_REVNUM(end_rev)))
{
- return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
+ return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0, 0,
"Not all parameters passed");
}
@@ -113,7 +113,8 @@ dav_svn__get_deleted_rev_report(const da
if (err)
{
svn_error_clear(err);
- return dav_svn__new_error(resource->pool, HTTP_INTERNAL_SERVER_ERROR, 0,
+ return dav_svn__new_error(resource->pool, HTTP_INTERNAL_SERVER_ERROR,
+ 0, 0,
"Could not find revision path was deleted.");
}
Modified:
subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/file-revs.c
URL:
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/file-revs.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/file-revs.c
(original)
+++ subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/file-revs.c Thu
Jun 25 08:00:57 2015
@@ -255,14 +255,14 @@ dav_svn__file_revs_report(const dav_reso
/* Sanity check. */
if (!resource->info->repos_path)
- return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0,
+ return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0, 0,
"The request does not specify a repository
path");
ns = dav_svn__find_ns(doc->namespaces, SVN_XML_NAMESPACE);
/* ### This is done on other places, but the document element is
in this namespace, so is this necessary at all? */
if (ns == -1)
{
- return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
+ return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0, 0,
"The request does not contain the 'svn:' "
"namespace, so it is not going to have "
"certain required elements");
@@ -300,7 +300,7 @@ dav_svn__file_revs_report(const dav_reso
/* Check that all parameters are present and valid. */
if (! abs_path)
- return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
+ return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0, 0,
"Not all parameters passed");
frb.bb = apr_brigade_create(resource->pool,
Modified:
subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/get-location-segments.c
URL:
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/get-location-segments.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
---
subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/get-location-segments.c
(original)
+++
subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/get-location-segments.c
Thu Jun 25 08:00:57 2015
@@ -124,12 +124,12 @@ dav_svn__get_location_segments_report(co
/* Sanity check. */
if (!resource->info->repos_path)
- return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0,
+ return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0, 0,
"The request does not specify a repository
path");
ns = dav_svn__find_ns(doc->namespaces, SVN_XML_NAMESPACE);
if (ns == -1)
{
- return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
+ return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0, 0,
"The request does not contain the 'svn:' "
"namespace, so it is not going to have "
"certain required elements");
@@ -175,7 +175,7 @@ dav_svn__get_location_segments_report(co
/* Check that all parameters are present and valid. */
if (! abs_path)
- return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
+ return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0, 0,
"Not all parameters passed");
/* No START_REV or PEG_REVISION? We'll use HEAD. */
@@ -202,12 +202,12 @@ dav_svn__get_location_segments_report(co
if (end_rev > start_rev)
return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST,
- SVN_ERR_FS_NO_SUCH_REVISION,
+ SVN_ERR_FS_NO_SUCH_REVISION, 0,
"End revision must not be younger than "
"start revision");
if (start_rev > peg_revision)
return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST,
- SVN_ERR_FS_NO_SUCH_REVISION,
+ SVN_ERR_FS_NO_SUCH_REVISION, 0,
"Start revision must not be younger than "
"peg revision");
Modified:
subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/get-locations.c
URL:
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/get-locations.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/get-locations.c
(original)
+++ subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/get-locations.c
Thu Jun 25 08:00:57 2015
@@ -107,12 +107,12 @@ dav_svn__get_locations_report(const dav_
/* Sanity check. */
if (!resource->info->repos_path)
- return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0,
+ return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0, 0,
"The request does not specify a repository
path");
ns = dav_svn__find_ns(doc->namespaces, SVN_XML_NAMESPACE);
if (ns == -1)
{
- return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
+ return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0, 0,
"The request does not contain the 'svn:' "
"namespace, so it is not going to have "
"certain required elements");
@@ -152,7 +152,7 @@ dav_svn__get_locations_report(const dav_
/* Check that all parameters are present and valid. */
if (! (abs_path && SVN_IS_VALID_REVNUM(peg_revision)))
- return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
+ return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0, 0,
"Not all parameters passed");
/* Build an authz read baton */
Modified:
subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/get-locks.c
URL:
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/get-locks.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/get-locks.c
(original)
+++ subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/get-locks.c Thu
Jun 25 08:00:57 2015
@@ -190,7 +190,7 @@ dav_svn__get_locks_report(const dav_reso
/* The request URI should be a public one representing an fs path. */
if ((! resource->info->repos_path)
|| (! resource->info->repos->repos))
- return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0,
+ return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0, 0,
"get-locks-report run on resource which doesn't "
"represent a path within a repository.");
@@ -207,7 +207,7 @@ dav_svn__get_locks_report(const dav_reso
(depth != svn_depth_files) &&
(depth != svn_depth_immediates) &&
(depth != svn_depth_infinity))
- return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0,
+ return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0, 0,
"Invalid 'depth' specified in "
"get-locks-report request.");
continue;
Modified:
subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/inherited-props.c
URL:
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/inherited-props.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
---
subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/inherited-props.c
(original)
+++
subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/inherited-props.c
Thu Jun 25 08:00:57 2015
@@ -65,12 +65,12 @@ dav_svn__get_inherited_props_report(cons
/* Sanity check. */
if (!resource->info->repos_path)
- return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0,
+ return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0, 0,
"The request does not specify a repository
path");
ns = dav_svn__find_ns(doc->namespaces, SVN_XML_NAMESPACE);
if (ns == -1)
{
- return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
+ return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0, 0,
"The request does not contain the 'svn:' "
"namespace, so it is not going to have "
"certain required elements");
Modified: subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/log.c
URL:
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/log.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/log.c (original)
+++ subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/log.c Thu Jun
25 08:00:57 2015
@@ -355,12 +355,12 @@ dav_svn__log_report(const dav_resource *
/* Sanity check. */
if (!resource->info->repos_path)
- return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0,
+ return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0, 0,
"The request does not specify a repository
path");
ns = dav_svn__find_ns(doc->namespaces, SVN_XML_NAMESPACE);
if (ns == -1)
{
- return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
+ return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0, 0,
"The request does not contain the 'svn:' "
"namespace, so it is not going to have "
"certain required elements");
Modified:
subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/mergeinfo.c
URL:
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/mergeinfo.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/mergeinfo.c
(original)
+++ subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/mergeinfo.c Thu
Jun 25 08:00:57 2015
@@ -68,12 +68,12 @@ dav_svn__get_mergeinfo_report(const dav_
/* Sanity check. */
if (!resource->info->repos_path)
- return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0,
+ return dav_svn__new_error(resource->pool, HTTP_BAD_REQUEST, 0, 0,
"The request does not specify a repository
path");
ns = dav_svn__find_ns(doc->namespaces, SVN_XML_NAMESPACE);
if (ns == -1)
{
- return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
+ return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0, 0,
"The request does not contain the 'svn:' "
"namespace, so it is not going to have "
"certain required elements");
Modified: subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/replay.c
URL:
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/replay.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/replay.c
(original)
+++ subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/replay.c Thu
Jun 25 08:00:57 2015
@@ -401,7 +401,7 @@ make_editor(const svn_delta_editor_t **e
static dav_error *
malformed_element_error(const char *tagname, apr_pool_t *pool)
{
- return dav_svn__new_error_svn(pool, HTTP_BAD_REQUEST, 0,
+ return dav_svn__new_error_svn(pool, HTTP_BAD_REQUEST, 0, 0,
apr_pstrcat(pool,
"The request's '", tagname,
"' element is malformed; there "
@@ -455,7 +455,7 @@ dav_svn__replay_report(const dav_resourc
ns = dav_svn__find_ns(doc->namespaces, SVN_XML_NAMESPACE);
if (ns == -1)
- return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
+ return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0, 0,
"The request does not contain the 'svn:' "
"namespace, so it is not going to have an "
"svn:revision element. That element is "
@@ -519,12 +519,12 @@ dav_svn__replay_report(const dav_resourc
if (! SVN_IS_VALID_REVNUM(rev))
return dav_svn__new_error_svn
- (resource->pool, HTTP_BAD_REQUEST, 0,
+ (resource->pool, HTTP_BAD_REQUEST, 0, 0,
"Request was missing the revision argument");
if (! SVN_IS_VALID_REVNUM(low_water_mark))
return dav_svn__new_error_svn
- (resource->pool, HTTP_BAD_REQUEST, 0,
+ (resource->pool, HTTP_BAD_REQUEST, 0, 0,
"Request was missing the low-water-mark argument");
if (! base_dir)
Modified: subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/update.c
URL:
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/update.c?rev=1687422&r1=1687421&r2=1687422&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/update.c
(original)
+++ subversion/branches/fsx-1.10/subversion/mod_dav_svn/reports/update.c Thu
Jun 25 08:00:57 2015
@@ -904,7 +904,7 @@ malformed_element_error(const char *tagn
"' element is malformed; there "
"is a problem with the client.",
SVN_VA_NULL);
- return dav_svn__new_error_svn(pool, HTTP_BAD_REQUEST, 0, errstr);
+ return dav_svn__new_error_svn(pool, HTTP_BAD_REQUEST, 0, 0, errstr);
}
@@ -988,14 +988,14 @@ dav_svn__update_report(const dav_resourc
if ((resource->info->restype != DAV_SVN_RESTYPE_VCC)
&& (resource->info->restype != DAV_SVN_RESTYPE_ME))
- return dav_svn__new_error_svn(resource->pool, HTTP_CONFLICT, 0,
+ return dav_svn__new_error_svn(resource->pool, HTTP_CONFLICT, 0, 0,
"This report can only be run against "
"a VCC or root-stub URI");
ns = dav_svn__find_ns(doc->namespaces, SVN_XML_NAMESPACE);
if (ns == -1)
{
- return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0,
+ return dav_svn__new_error_svn(resource->pool, HTTP_BAD_REQUEST, 0, 0,
"The request does not contain the 'svn:' "
"namespace, so it is not going to have an "
"svn:target-revision element. That element
"
@@ -1191,7 +1191,7 @@ dav_svn__update_report(const dav_resourc
if (! src_path)
{
return dav_svn__new_error_svn
- (resource->pool, HTTP_BAD_REQUEST, 0,
+ (resource->pool, HTTP_BAD_REQUEST, 0, 0,
"The request did not contain the '<src-path>' element.\n"
"This may indicate that your client is too old");
}