Author: jamessan
Date: Tue Sep 18 01:50:50 2018
New Revision: 1841179
URL: http://svn.apache.org/viewvc?rev=1841179&view=rev
Log:
On the 'java10-compat' branch: Catch up with trunk @1841178
Added:
subversion/branches/java10-compat/tools/dist/changes-to-html.py
- copied unchanged from r1841178,
subversion/trunk/tools/dist/changes-to-html.py
Modified:
subversion/branches/java10-compat/ (props changed)
subversion/branches/java10-compat/CHANGES
subversion/branches/java10-compat/subversion/bindings/javahl/src/org/apache/subversion/javahl/NativeResources.java
subversion/branches/java10-compat/subversion/include/svn_client.h
subversion/branches/java10-compat/subversion/include/svn_version.h
subversion/branches/java10-compat/subversion/include/svn_wc.h
subversion/branches/java10-compat/subversion/libsvn_client/conflicts.c
subversion/branches/java10-compat/subversion/libsvn_client/shelf.c
subversion/branches/java10-compat/subversion/libsvn_wc/wcroot_anchor.c
subversion/branches/java10-compat/subversion/svn/conflict-callbacks.c
subversion/branches/java10-compat/subversion/svn/info-cmd.c
subversion/branches/java10-compat/subversion/svn/svn.c
subversion/branches/java10-compat/subversion/tests/cmdline/getopt_tests_data/svn--help_stdout
subversion/branches/java10-compat/subversion/tests/cmdline/getopt_tests_data/svn_help_stdout
subversion/branches/java10-compat/subversion/tests/cmdline/shelf_tests.py
subversion/branches/java10-compat/subversion/tests/cmdline/svntest/main.py
subversion/branches/java10-compat/subversion/tests/libsvn_client/conflicts-test.c
subversion/branches/java10-compat/tools/client-side/bash_completion
subversion/branches/java10-compat/tools/dist/release.py
Propchange: subversion/branches/java10-compat/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Sep 18 01:50:50 2018
@@ -99,3 +99,4 @@
/subversion/branches/verify-at-commit:1462039-1462408
/subversion/branches/verify-keep-going:1439280-1546110
/subversion/branches/wc-collate-path:1402685-1480384
+/subversion/trunk:1840224-1841178
Modified: subversion/branches/java10-compat/CHANGES
URL:
http://svn.apache.org/viewvc/subversion/branches/java10-compat/CHANGES?rev=1841179&r1=1841178&r2=1841179&view=diff
==============================================================================
--- subversion/branches/java10-compat/CHANGES (original)
+++ subversion/branches/java10-compat/CHANGES Tue Sep 18 01:50:50 2018
@@ -1,10 +1,59 @@
+# To view a revision listed as (rXXXXXXX), visit:
+# https://svn.apache.org/rXXXXXXX
+#
+# To view an issue listed as (issue #XXXX), visit:
+# https://issues.apache.org/jira/browse/SVN-XXXX
+
+Version 1.12.0
+(?? ??? 20XX, from /branches/1.12.x)
+https://svn.apache.org/repos/asf/subversion/tags/1.12.0
+
Version 1.11.0
-(?? ??? 20XX, from /branches/1.11.x)
+(17 Oct 2018, from /branches/1.11.x)
http://svn.apache.org/repos/asf/subversion/tags/1.11.0
User-visible changes:
+ - Major new features:
+ * Shelving is no longer based on patch files (experimental) (issue #3625)
+ * Checkpointing (experimental) (issue #3626)
+ * Viewspec output command (experimental) (r1826864)
+
+ - Minor new features and improvements:
+ * Improvements to tree conflict resolution (issue #4694 #4766 ...)
+ * 'patch' can now read non-pretty-printed svn:mergeinfo diffs (r1822151)
+ * Better error when http:// URL is not a Subversion repository (r1825302)
+ * Add 'schedule' and 'depth' items to 'svn info --show-item' (r1827032)
+ * Allow the client cert password to be saved (r1836762)
+
+ - Client-side bugfixes:
+ * Fix a crash in a repo:WC summary diff of a local copy (r1835218)
+ * Fix double diff headers (r1836746)
+ * Tree conflict resolver: avoid endless scan in some cases (r1839662)
+
+ - Server-side bugfixes:
+ * svnadmin dump shouldn't canonicalize svn:date (issue #4767)
+ * 'svnadmin verify --keep-going --quiet' shows an error summary (r1837790)
+ * Let 'svnadmin recover' prune the rep-cache even if disabled (r1838813)
+
- Client-side and server-side bugfixes:
* Fix pattern-matching of top level path in listing with search (r1830599)
+ * Allow commands like 'svn ci --file X' to work when X is a FIFO (r1836306)
+
+ - Other tool improvements and bugfixes:
+ * tools/client-side/bash_completion: Add '--password-from-stdin' (r1820045)
+
+ Developer-visible changes:
+ - General:
+ * new tool: tools/dist/edit-N-log-messages (r1819207)
+ * tools/dev/unix-build/Makefile.svn: various fixes
+ * Expose the diff option 'pretty_print_mergeinfo' in APIs (r1822014)
+ * In 'revert' APIs, choose whether to delete schedule-add nodes (r1822534)
+
+ - Bindings:
+ * Fix Python binding fs.FileDiff behaviour with python-future (r1823802)
+ * Fix Python unit test, fs.SubversionFSTestCase, on Windows (r1824410)
+ * Bump minimum JDK version required for JavaHL to 1.8 (r1831895)
+ * Fix a potential crash in JavaHL (issue #4764)
Version 1.10.2
Modified:
subversion/branches/java10-compat/subversion/bindings/javahl/src/org/apache/subversion/javahl/NativeResources.java
URL:
http://svn.apache.org/viewvc/subversion/branches/java10-compat/subversion/bindings/javahl/src/org/apache/subversion/javahl/NativeResources.java?rev=1841179&r1=1841178&r2=1841179&view=diff
==============================================================================
---
subversion/branches/java10-compat/subversion/bindings/javahl/src/org/apache/subversion/javahl/NativeResources.java
(original)
+++
subversion/branches/java10-compat/subversion/bindings/javahl/src/org/apache/subversion/javahl/NativeResources.java
Tue Sep 18 01:50:50 2018
@@ -142,7 +142,7 @@ public class NativeResources
private static final void init()
{
final int SVN_VER_MAJOR = 1;
- final int SVN_VER_MINOR = 11;
+ final int SVN_VER_MINOR = 12;
initNativeLibrary();
version = new Version();
if (!version.isAtLeast(SVN_VER_MAJOR, SVN_VER_MINOR, 0))
Modified: subversion/branches/java10-compat/subversion/include/svn_client.h
URL:
http://svn.apache.org/viewvc/subversion/branches/java10-compat/subversion/include/svn_client.h?rev=1841179&r1=1841178&r2=1841179&view=diff
==============================================================================
--- subversion/branches/java10-compat/subversion/include/svn_client.h (original)
+++ subversion/branches/java10-compat/subversion/include/svn_client.h Tue Sep
18 01:50:50 2018
@@ -1570,7 +1570,7 @@ typedef svn_error_t * (*svn_client_layou
*
* @warning EXPERIMENTAL.
*/
-/*SVN_EXPERIMENTAL*/ /*commented out during development to avoid a warning*/
+SVN_EXPERIMENTAL
svn_error_t *
svn_client_layout_list(const char *local_abspath,
svn_client_layout_func_t layout,
@@ -4434,8 +4434,8 @@ svn_client_revert4(const apr_array_heade
svn_client_ctx_t *ctx,
apr_pool_t *scratch_pool);
-/** Similar to svn_client_revert4(), but with @a remove_added_from_disk set to
- * FALSE.
+/** Similar to svn_client_revert4(), but with @a added_keep_local set to
+ * TRUE.
*
* @since New in 1.9.
* @deprecated Provided for backwards compatibility with the 1.10 API.
@@ -4559,11 +4559,11 @@ typedef enum svn_client_conflict_option_
/* Options for local move vs incoming edit on merge. */
svn_client_conflict_option_local_move_file_text_merge,
- svn_client_conflict_option_local_move_dir_merge,
+ svn_client_conflict_option_local_move_dir_merge, /**< @since New in 1.11. */
/* Options for local missing vs incoming edit on merge. */
- svn_client_conflict_option_sibling_move_file_text_merge,
- svn_client_conflict_option_sibling_move_dir_merge,
+ svn_client_conflict_option_sibling_move_file_text_merge, /**< @since New in
1.11. */
+ svn_client_conflict_option_sibling_move_dir_merge, /**< @since New in 1.11.
*/
} svn_client_conflict_option_id_t;
@@ -4585,27 +4585,45 @@ svn_client_conflict_option_set_merged_pr
const svn_string_t *merged_propval);
/**
- * Get a list of possible repository paths which can be applied to the
- * svn_client_conflict_option_incoming_move_file_text_merge, or
- * svn_client_conflict_option_local_move_file_text_merge, or
- * svn_client_conflict_option_incoming_move_dir_merge resolution
- * @a option. (If a different option is passed in, this function will
- * raise an assertion failure.)
- *
- * In some situations, there can be multiple possible destinations for an
- * incoming move. One such situation is where a file was copied and moved
- * in the same revision: svn cp a b; svn mv a c; svn commit
+ * Get a list of possible repository paths which can be applied to @a option.
+ *
+ * In some situations, there can be multiple possible destinations for a move.
+ * One such situation is where a file was copied and moved in the same
revision:
+ * svn cp a b; svn mv a c; svn commit
* When this move is merged elsewhere, both b and c will appear as valid move
* destinations to the conflict resolver. To resolve such ambiguity, the client
* may call this function to obtain a list of possible destinations the user
* may choose from.
*
+ * @a *possible_moved_to_repos_relpaths is set to NULL if the @a option does
+ * not support multiple move targets. API users may assume that only one option
+ * among those which can be applied to a conflict supports move targets.
+ *
* The array is allocated in @a result_pool and will have "const char *"
* elements pointing to strings also allocated in @a result_pool.
* All paths are relpaths, and relative to the repository root.
*
- * @see svn_client_conflict_option_set_moved_to_repos_relpath()
+ * @see svn_client_conflict_option_set_moved_to_repos_relpath2()
+ * @since New in 1.11.
+ */
+svn_error_t *
+svn_client_conflict_option_get_moved_to_repos_relpath_candidates2(
+ apr_array_header_t **possible_moved_to_repos_relpaths,
+ svn_client_conflict_option_t *option,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/**
+ * Get a list of possible repository paths which can be applied to the
+ * svn_client_conflict_option_incoming_move_file_text_merge, or the
+ * svn_client_conflict_option_incoming_move_dir_merge resolution @a option.
+ *
+ * In SVN 1.10, if a different option is passed in, this function will
+ * raise an assertion failure. Otherwise this function behaves just like
+ * svn_client_conflict_option_get_moved_to_repos_relpath_candidates2().
+ *
* @since New in 1.10.
+ * @deprecated use
svn_client_conflict_option_get_moved_to_repos_relpath_candidates2()
*/
svn_error_t *
svn_client_conflict_option_get_moved_to_repos_relpath_candidates(
@@ -4615,10 +4633,9 @@ svn_client_conflict_option_get_moved_to_
apr_pool_t *scratch_pool);
/**
- * Set the preferred moved target repository path for the
- * svn_client_conflict_option_incoming_move_file_text_merge or
- * svn_client_conflict_option_incoming_move_dir_merge resolution option.
- *
+ * Set the preferred moved target repository path. If @a option is not
+ * applicable to a moved target repository path, do nothing.
+ *
* @a preferred_move_target_idx must be a valid index into the list returned
* by svn_client_conflict_option_get_moved_to_repos_relpath_candidates().
*
@@ -4627,7 +4644,23 @@ svn_client_conflict_option_get_moved_to_
* svn_client_conflict_option_get_description(). Call these functions again
* to get updated descriptions containing the newly selected move target.
*
+ * @since New in 1.11.
+ */
+svn_error_t *
+svn_client_conflict_option_set_moved_to_repos_relpath2(
+ svn_client_conflict_option_t *option,
+ int preferred_move_target_idx,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *scratch_pool);
+
+/**
+ * Like svn_client_conflict_option_set_moved_to_repos_relpath2(), except
+ * that in SVN 1.10 it raises an assertion failure if an option other
+ * than svn_client_conflict_option_incoming_move_file_text_merge or
+ * svn_client_conflict_option_incoming_move_dir_merge is passed.
+ *
* @since New in 1.10.
+ * @deprecated use svn_client_conflict_option_set_moved_to_repos_relpath2()
*/
svn_error_t *
svn_client_conflict_option_set_moved_to_repos_relpath(
@@ -4638,25 +4671,45 @@ svn_client_conflict_option_set_moved_to_
/**
* Get a list of possible moved-to abspaths in the working copy which can be
- * applied to the svn_client_conflict_option_incoming_move_file_text_merge,
- * svn_client_conflict_option_local_move_file_text_merge,
- * or svn_client_conflict_option_incoming_move_dir_merge resolution @a option.
- * (If a different option is passed in, this function will raise an assertion
- * failure.)
- *
- * All paths in the returned list correspond to the repository path which
- * is assumed to be the destination of the incoming move operation.
- * To support cases where this destination path is ambiguous, the client may
- * call svn_client_conflict_option_get_moved_to_repos_relpath_candidates()
- * before calling this function to let the user select a repository path first.
+ * applied to @a option.
+ *
+ * All working copy paths in the returned list correspond to one repository
+ * path which is be one of the possible destinations of a move operation.
+ * More than one repository-side move target candidate may exist; call
+ * svn_client_conflict_option_get_moved_to_repos_relpath_candidates() before
+ * calling this function to let the user select a repository path first.
+ * Otherwise, one of the repository-side paths will be selected internally.
*
+ * @a *possible_moved_to_abspaths is set to NULL if the @a option does not
+ * support multiple move targets. API users may assume that only one option
+ * among those which can be applied to a conflict supports move targets.
+ *
* If no possible moved-to paths can be found, return an empty array.
* This doesn't mean that no move happened in the repository. It is possible
* that the move destination is outside the scope of the current working copy,
* for example, in which case the conflict must be resolved in some other way.
*
- * @see svn_client_conflict_option_set_moved_to_abspath()
+ * @see svn_client_conflict_option_set_moved_to_abspath2()
+ * @since New in 1.11.
+ */
+svn_error_t *
+svn_client_conflict_option_get_moved_to_abspath_candidates2(
+ apr_array_header_t **possible_moved_to_abspaths,
+ svn_client_conflict_option_t *option,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/**
+ * Get a list of possible moved-to abspaths in the working copy which can be
+ * svn_client_conflict_option_incoming_move_file_text_merge, or the
+ * svn_client_conflict_option_incoming_move_dir_merge resolution @a option.
+ *
+ * In SVN 1.10, if a different option is passed in, this function will
+ * raise an assertion failure. Otherwise this function behaves just like
+ * svn_client_conflict_option_get_moved_to_abspath_candidates2().
+ *
* @since New in 1.10.
+ * @deprecated use
svn_client_conflict_option_get_moved_to_abspath_candidates2()
*/
svn_error_t *
svn_client_conflict_option_get_moved_to_abspath_candidates(
@@ -4666,15 +4719,34 @@ svn_client_conflict_option_get_moved_to_
apr_pool_t *scratch_pool);
/**
- * Set the preferred moved target abspath for the
- * svn_client_conflict_option_incoming_move_file_text_merge or
- * svn_client_conflict_option_local_move_file_text_merge or
- * svn_client_conflict_option_incoming_move_dir_merge resolution option.
+ * Set the preferred moved target working copy path. If @a option is not
+ * applicable to a moved target working copy path, do nothing.
*
* @a preferred_move_target_idx must be a valid index into the list
- * returned by svn_client_conflict_option_get_moved_to_abspath_candidates().
+ * returned by svn_client_conflict_option_get_moved_to_abspath_candidates2().
*
+ * This function can be called multiple times.
+ * It affects the output of svn_client_conflict_tree_get_description() and
+ * svn_client_conflict_option_get_description(). Call these functions again
+ * to get updated descriptions containing the newly selected move target.
+ *
+ * @since New in 1.11.
+ */
+svn_error_t *
+svn_client_conflict_option_set_moved_to_abspath2(
+ svn_client_conflict_option_t *option,
+ int preferred_move_target_idx,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *scratch_pool);
+
+/**
+ * Like svn_client_conflict_option_set_moved_to_abspath2(), except that
+ * in SVN 1.10 this function raises an assertion failure if an option
+ * other than svn_client_conflict_option_incoming_move_file_text_merge or
+ * svn_client_conflict_option_incoming_move_dir_merge is passed.
+ *
* @since New in 1.10.
+ * @deprecated use svn_client_conflict_option_set_moved_to_abspath2()
*/
svn_error_t *
svn_client_conflict_option_set_moved_to_abspath(
@@ -6870,12 +6942,12 @@ typedef struct svn_client_shelf_t
{
/* Public fields (read-only for public use) */
const char *name;
- int max_version; /** @deprecated */
+ int max_version; /**< @deprecated */
/* Private fields */
const char *wc_root_abspath;
const char *shelves_dir;
- apr_hash_t *revprops; /* non-null; allocated in POOL */
+ apr_hash_t *revprops; /**< non-null; allocated in POOL */
svn_client_ctx_t *ctx;
apr_pool_t *pool;
} svn_client_shelf_t;
@@ -6889,11 +6961,11 @@ typedef struct svn_client_shelf_version_
{
/* Public fields (read-only for public use) */
svn_client_shelf_t *shelf;
- apr_time_t mtime; /** time-stamp of this version */
+ apr_time_t mtime; /**< time-stamp of this version */
/* Private fields */
- const char *files_dir_abspath; /** abspath of the storage area */
- int version_number; /** version number starting from 1 */
+ const char *files_dir_abspath; /**< abspath of the storage area */
+ int version_number; /**< version number starting from 1 */
} svn_client_shelf_version_t;
/** Open an existing shelf or create a new shelf.
@@ -6996,37 +7068,6 @@ svn_client_shelf_save_new_version3(svn_c
void *not_shelved_baton,
apr_pool_t *scratch_pool);
-/** @deprecated Use svn_client_shelf_save_new_version3() instead.
- *
- * If any paths cannot be shelved, throw an error.
- *
- * If there are no local modifications in the specified locations, do not
- * create a new version of @a shelf; set @a *new_version_p to null and
- * return SVN_NO_ERROR. In this case @a shelf->max_version after the call
- * is the same as before the call.
- *
- * @warning EXPERIMENTAL.
- */
-SVN_DEPRECATED
-svn_error_t *
-svn_client_shelf_save_new_version2(svn_client_shelf_version_t **new_version_p,
- svn_client_shelf_t *shelf,
- const apr_array_header_t *paths,
- svn_depth_t depth,
- const apr_array_header_t *changelists,
- apr_pool_t *scratch_pool);
-
-/** @deprecated Use svn_client_shelf_save_new_version2() instead.
- * @warning EXPERIMENTAL.
- */
-SVN_DEPRECATED
-svn_error_t *
-svn_client_shelf_save_new_version(svn_client_shelf_t *shelf,
- const apr_array_header_t *paths,
- svn_depth_t depth,
- const apr_array_header_t *changelists,
- apr_pool_t *scratch_pool);
-
/** Delete all newer versions of @a shelf newer than @a shelf_version.
*
* If @a shelf_version is null, delete all versions of @a shelf. (The
@@ -7048,17 +7089,8 @@ svn_client_shelf_delete_newer_versions(s
svn_client_shelf_version_t
*shelf_version,
apr_pool_t *scratch_pool);
-/** @deprecated Use svn_client_shelf_delete_newer_versions() instead.
- * @warning EXPERIMENTAL.
- */
-SVN_DEPRECATED
-svn_error_t *
-svn_client_shelf_set_current_version(svn_client_shelf_t *shelf,
- int version_number,
- apr_pool_t *scratch_pool);
-
/** Return in @a shelf_version an existing version of @a shelf, given its
- * @a version_number. Error if that version doesn't exist.
+ * @a version_number (starting from 1). Error if that version doesn't exist.
*
* There is no need to "close" it after use.
*
@@ -7161,15 +7193,6 @@ svn_client_shelf_unapply(svn_client_shel
svn_boolean_t dry_run,
apr_pool_t *scratch_pool);
-/** @deprecated Use svn_client__shelf_diff() instead.
- * @warning EXPERIMENTAL.
- */
-SVN_DEPRECATED
-svn_error_t *
-svn_client_shelf_export_patch(svn_client_shelf_version_t *shelf_version,
- svn_stream_t *outstream,
- apr_pool_t *scratch_pool);
-
/** Set @a *affected_paths to a hash with one entry for each path affected
* by the @a shelf_version.
*
@@ -7291,7 +7314,7 @@ svn_client_shelf_get_log_message(char **
*/
typedef struct svn_client_shelf_info_t
{
- apr_time_t mtime; /* mtime of the latest change */
+ apr_time_t mtime; /**< mtime of the latest change */
} svn_client_shelf_info_t;
/** Set @a *shelf_infos to a hash, keyed by shelf name, of pointers to
@@ -7311,8 +7334,8 @@ svn_client_shelf_list(apr_hash_t **shelf
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
-/* Report the shelved status of all the shelved paths in SHELF_VERSION
- * via WALK_FUNC(WALK_BATON, ...).
+/** Report the shelved status of all the shelved paths in @a shelf_version
+ * via @a walk_func(@a walk_baton, ...).
*
* @since New in 1.X.
* @warning EXPERIMENTAL.
Modified: subversion/branches/java10-compat/subversion/include/svn_version.h
URL:
http://svn.apache.org/viewvc/subversion/branches/java10-compat/subversion/include/svn_version.h?rev=1841179&r1=1841178&r2=1841179&view=diff
==============================================================================
--- subversion/branches/java10-compat/subversion/include/svn_version.h
(original)
+++ subversion/branches/java10-compat/subversion/include/svn_version.h Tue Sep
18 01:50:50 2018
@@ -61,7 +61,7 @@ extern "C" {
* Modify when new functionality is added or new interfaces are
* defined, but all changes are backward compatible.
*/
-#define SVN_VER_MINOR 11
+#define SVN_VER_MINOR 12
/**
* Patch number.
Modified: subversion/branches/java10-compat/subversion/include/svn_wc.h
URL:
http://svn.apache.org/viewvc/subversion/branches/java10-compat/subversion/include/svn_wc.h?rev=1841179&r1=1841178&r2=1841179&view=diff
==============================================================================
--- subversion/branches/java10-compat/subversion/include/svn_wc.h (original)
+++ subversion/branches/java10-compat/subversion/include/svn_wc.h Tue Sep 18
01:50:50 2018
@@ -7644,8 +7644,8 @@ svn_wc_revert6(svn_wc_context_t *wc_ctx,
void *notify_baton,
apr_pool_t *scratch_pool);
-/** Similar to svn_wc_revert6() but with @a remove_added_from_disk always
- * set to FALSE.
+/** Similar to svn_wc_revert6() but with @a added_keep_local always
+ * set to TRUE.
*
* @since New in 1.9.
* @deprecated Provided for backward compatibility with the 1.10 API.
Modified: subversion/branches/java10-compat/subversion/libsvn_client/conflicts.c
URL:
http://svn.apache.org/viewvc/subversion/branches/java10-compat/subversion/libsvn_client/conflicts.c?rev=1841179&r1=1841178&r2=1841179&view=diff
==============================================================================
--- subversion/branches/java10-compat/subversion/libsvn_client/conflicts.c
(original)
+++ subversion/branches/java10-compat/subversion/libsvn_client/conflicts.c Tue
Sep 18 01:50:50 2018
@@ -2350,6 +2350,8 @@ struct conflict_tree_local_missing_detai
/* If not SVN_INVALID_REVNUM, the node was deleted in DELETED_REV. */
svn_revnum_t deleted_rev;
+ /* ### Add 'added_rev', like in conflict_tree_incoming_delete_details? */
+
/* Author who committed DELETED_REV. */
const char *deleted_rev_author;
@@ -2357,17 +2359,38 @@ struct conflict_tree_local_missing_detai
const char *deleted_repos_relpath;
/* Move information about the conflict victim. If not NULL, this is an
- * array of repos_move_info elements. Each element is the head of a
- * move chain which starts in DELETED_REV. */
+ * array of 'struct repos_move_info *' elements. Each element is the
+ * head of a move chain which starts in DELETED_REV. */
apr_array_header_t *moves;
- /* If not NULL, this is the move target abspath. */
- const char *moved_to_abspath;
+ /* If moves is not NULL, a map of repos_relpaths and working copy nodes.
+ *
+ * Each key is a "const char *" repository relpath corresponding to a
+ * possible repository-side move destination node in the revision which
+ * is the merge-right revision in case of a merge.
+ *
+ * Each value is an apr_array_header_t *.
+ * Each array consists of "const char *" absolute paths to working copy
+ * nodes which correspond to the repository node selected by the map key.
+ * Each such working copy node is a potential local move target which can
+ * be chosen to find a suitable merge target when resolving a tree conflict.
+ *
+ * This may be an empty hash map in case if there is no move target path
+ * in the working copy. */
+ apr_hash_t *wc_move_targets;
+
+ /* If not NULL, the preferred move target repository relpath. This is our key
+ * into the WC_MOVE_TARGETS map above (can be overridden by the user). */
+ const char *move_target_repos_relpath;
+
+ /* The current index into the list of working copy nodes corresponding to
+ * MOVE_TARGET_REPOS_REPLATH (can be overridden by the user). */
+ int wc_move_target_idx;
/* Move information about siblings. Siblings are nodes which share
* a youngest common ancestor with the conflict victim. E.g. in case
* of a merge operation they are part of the merge source branch.
- * If not NULL, this is an array of repos_move_info elements.
+ * If not NULL, this is an array of 'struct repos_move_info *' elements.
* Each element is the head of a move chain, which starts at some
* point in history after siblings and conflict victim forked off
* their common ancestor. */
@@ -2635,6 +2658,133 @@ collect_sibling_move_candidates(apr_arra
return SVN_NO_ERROR;
}
+/* Follow each move chain starting a MOVE all the way to the end to find
+ * the possible working copy locations for VICTIM_ABSPATH which corresponds
+ * to VICTIM_REPOS_REPLATH@VICTIM_REVISION.
+ * Add each such location to the WC_MOVE_TARGETS hash table, keyed on the
+ * repos_relpath which is the corresponding move destination in the repository.
+ * This function is recursive. */
+static svn_error_t *
+follow_move_chains(apr_hash_t *wc_move_targets,
+ struct repos_move_info *move,
+ svn_client_ctx_t *ctx,
+ const char *victim_abspath,
+ svn_node_kind_t victim_node_kind,
+ const char *victim_repos_relpath,
+ svn_revnum_t victim_revision,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ /* If this is the end of a move chain, look for matching paths in
+ * the working copy and add them to our collection if found. */
+ if (move->next == NULL)
+ {
+ apr_array_header_t *candidate_abspaths;
+
+ /* Gather candidate nodes which represent this moved_to_repos_relpath. */
+ SVN_ERR(svn_wc__guess_incoming_move_target_nodes(
+ &candidate_abspaths, ctx->wc_ctx,
+ victim_abspath, victim_node_kind,
+ move->moved_to_repos_relpath,
+ scratch_pool, scratch_pool));
+ if (candidate_abspaths->nelts > 0)
+ {
+ apr_array_header_t *moved_to_abspaths;
+ int i;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+
+ moved_to_abspaths = apr_array_make(result_pool, 1,
+ sizeof (const char *));
+
+ for (i = 0; i < candidate_abspaths->nelts; i++)
+ {
+ const char *candidate_abspath;
+ const char *repos_root_url;
+ const char *repos_uuid;
+ const char *candidate_repos_relpath;
+ svn_revnum_t candidate_revision;
+
+ svn_pool_clear(iterpool);
+
+ candidate_abspath = APR_ARRAY_IDX(candidate_abspaths, i,
+ const char *);
+ SVN_ERR(svn_wc__node_get_origin(NULL, &candidate_revision,
+ &candidate_repos_relpath,
+ &repos_root_url,
+ &repos_uuid,
+ NULL, NULL,
+ ctx->wc_ctx,
+ candidate_abspath,
+ FALSE,
+ iterpool, iterpool));
+
+ if (candidate_revision == SVN_INVALID_REVNUM)
+ continue;
+
+ /* If the conflict victim and the move target candidate
+ * are not from the same revision we must ensure that
+ * they are related. */
+ if (candidate_revision != victim_revision)
+ {
+ svn_client__pathrev_t *yca_loc;
+ svn_error_t *err;
+
+ err = find_yca(&yca_loc, victim_repos_relpath,
+ victim_revision,
+ candidate_repos_relpath,
+ candidate_revision,
+ repos_root_url, repos_uuid,
+ NULL, ctx, iterpool, iterpool);
+ if (err)
+ {
+ if (err->apr_err == SVN_ERR_FS_NOT_FOUND)
+ {
+ svn_error_clear(err);
+ yca_loc = NULL;
+ }
+ else
+ return svn_error_trace(err);
+ }
+
+ if (yca_loc == NULL)
+ continue;
+ }
+
+ APR_ARRAY_PUSH(moved_to_abspaths, const char *) =
+ apr_pstrdup(result_pool, candidate_abspath);
+ }
+ svn_pool_destroy(iterpool);
+
+ svn_hash_sets(wc_move_targets, move->moved_to_repos_relpath,
+ moved_to_abspaths);
+ }
+ }
+ else
+ {
+ int i;
+ apr_pool_t *iterpool;
+
+ /* Recurse into each of the possible move chains. */
+ iterpool = svn_pool_create(scratch_pool);
+ for (i = 0; i < move->next->nelts; i++)
+ {
+ struct repos_move_info *next_move;
+
+ svn_pool_clear(iterpool);
+
+ next_move = APR_ARRAY_IDX(move->next, i, struct repos_move_info *);
+ SVN_ERR(follow_move_chains(wc_move_targets, next_move,
+ ctx, victim_abspath, victim_node_kind,
+ victim_repos_relpath, victim_revision,
+ result_pool, iterpool));
+
+ }
+ svn_pool_destroy(iterpool);
+ }
+
+ return SVN_NO_ERROR;
+}
+
/* Implements tree_conflict_get_details_func_t. */
static svn_error_t *
conflict_tree_get_details_local_missing(svn_client_conflict_t *conflict,
@@ -2862,6 +3012,51 @@ conflict_tree_get_details_local_missing(
deleted_basename,
conflict->pool);
details->moves = moves;
+ if (details->moves != NULL)
+ {
+ apr_pool_t *iterpool;
+ int i;
+
+ details->wc_move_targets = apr_hash_make(conflict->pool);
+ iterpool = svn_pool_create(scratch_pool);
+ for (i = 0; i < details->moves->nelts; i++)
+ {
+ struct repos_move_info *move;
+
+ svn_pool_clear(iterpool);
+ move = APR_ARRAY_IDX(details->moves, i, struct repos_move_info *);
+ SVN_ERR(follow_move_chains(details->wc_move_targets, move, ctx,
+ conflict->local_abspath,
+ svn_node_file,
+ new_repos_relpath,
+ new_rev,
+ scratch_pool, iterpool));
+ }
+ svn_pool_destroy(iterpool);
+
+ if (apr_hash_count(details->wc_move_targets) > 0)
+ {
+ apr_array_header_t *move_target_repos_relpaths;
+ const svn_sort__item_t *item;
+
+ /* Initialize to the first possible move target. Hopefully,
+ * in most cases there will only be one candidate anyway. */
+ move_target_repos_relpaths = svn_sort__hash(
+ details->wc_move_targets,
+ svn_sort_compare_items_as_paths,
+ scratch_pool);
+ item = &APR_ARRAY_IDX(move_target_repos_relpaths,
+ 0, svn_sort__item_t);
+ details->move_target_repos_relpath = item->key;
+ details->wc_move_target_idx = 0;
+ }
+ else
+ {
+ details->move_target_repos_relpath = NULL;
+ details->wc_move_target_idx = 0;
+ }
+ }
+
details->sibling_moves = sibling_moves;
details->wc_siblings = wc_siblings;
if (details->wc_siblings && details->wc_siblings->nelts == 1)
@@ -2875,7 +3070,7 @@ conflict_tree_get_details_local_missing(
conflict->recommended_option_id =
svn_client_conflict_option_sibling_move_dir_merge;
}
-
+
conflict->tree_conflict_local_details = details;
return SVN_NO_ERROR;
@@ -4784,176 +4979,49 @@ get_incoming_delete_details_for_reverse_
return SVN_NO_ERROR;
}
-/* Follow each move chain starting a MOVE all the way to the end to find
- * the possible working copy locations for VICTIM_ABSPATH which corresponds
- * to VICTIM_REPOS_REPLATH@VICTIM_REVISION.
- * Add each such location to the WC_MOVE_TARGETS hash table, keyed on the
- * repos_relpath which is the corresponding move destination in the repository.
- * This function is recursive. */
static svn_error_t *
-follow_move_chains(apr_hash_t *wc_move_targets,
- struct repos_move_info *move,
- svn_client_ctx_t *ctx,
- const char *victim_abspath,
- svn_node_kind_t victim_node_kind,
- const char *victim_repos_relpath,
- svn_revnum_t victim_revision,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
+init_wc_move_targets(struct conflict_tree_incoming_delete_details *details,
+ svn_client_conflict_t *conflict,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *scratch_pool)
{
- /* If this is the end of a move chain, look for matching paths in
- * the working copy and add them to our collection if found. */
- if (move->next == NULL)
- {
- apr_array_header_t *candidate_abspaths;
+ int i;
+ const char *victim_abspath;
+ svn_node_kind_t victim_node_kind;
+ const char *incoming_new_repos_relpath;
+ svn_revnum_t incoming_new_pegrev;
- /* Gather candidate nodes which represent this moved_to_repos_relpath. */
- SVN_ERR(svn_wc__guess_incoming_move_target_nodes(
- &candidate_abspaths, ctx->wc_ctx,
- victim_abspath, victim_node_kind,
- move->moved_to_repos_relpath,
- scratch_pool, scratch_pool));
- if (candidate_abspaths->nelts > 0)
- {
- apr_array_header_t *moved_to_abspaths;
- int i;
- apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+ victim_abspath = svn_client_conflict_get_local_abspath(conflict);
+ victim_node_kind = svn_client_conflict_tree_get_victim_node_kind(conflict);
+ /* ### Should we get the old location in case of reverse-merges? */
+ SVN_ERR(svn_client_conflict_get_incoming_new_repos_location(
+ &incoming_new_repos_relpath, &incoming_new_pegrev,
+ NULL, conflict,
+ scratch_pool, scratch_pool));
+ details->wc_move_targets = apr_hash_make(conflict->pool);
+ for (i = 0; i < details->moves->nelts; i++)
+ {
+ struct repos_move_info *move;
- moved_to_abspaths = apr_array_make(result_pool, 1,
- sizeof (const char *));
+ move = APR_ARRAY_IDX(details->moves, i, struct repos_move_info *);
+ SVN_ERR(follow_move_chains(details->wc_move_targets, move,
+ ctx, victim_abspath,
+ victim_node_kind,
+ incoming_new_repos_relpath,
+ incoming_new_pegrev,
+ conflict->pool, scratch_pool));
+ }
- for (i = 0; i < candidate_abspaths->nelts; i++)
- {
- const char *candidate_abspath;
- const char *repos_root_url;
- const char *repos_uuid;
- const char *candidate_repos_relpath;
- svn_revnum_t candidate_revision;
+ /* Initialize to the first possible move target. Hopefully,
+ * in most cases there will only be one candidate anyway. */
+ details->move_target_repos_relpath =
+ get_moved_to_repos_relpath(details, scratch_pool);
+ details->wc_move_target_idx = 0;
- svn_pool_clear(iterpool);
-
- candidate_abspath = APR_ARRAY_IDX(candidate_abspaths, i,
- const char *);
- SVN_ERR(svn_wc__node_get_origin(NULL, &candidate_revision,
- &candidate_repos_relpath,
- &repos_root_url,
- &repos_uuid,
- NULL, NULL,
- ctx->wc_ctx,
- candidate_abspath,
- FALSE,
- iterpool, iterpool));
-
- if (candidate_revision == SVN_INVALID_REVNUM)
- continue;
-
- /* If the conflict victim and the move target candidate
- * are not from the same revision we must ensure that
- * they are related. */
- if (candidate_revision != victim_revision)
- {
- svn_client__pathrev_t *yca_loc;
- svn_error_t *err;
-
- err = find_yca(&yca_loc, victim_repos_relpath,
- victim_revision,
- candidate_repos_relpath,
- candidate_revision,
- repos_root_url, repos_uuid,
- NULL, ctx, iterpool, iterpool);
- if (err)
- {
- if (err->apr_err == SVN_ERR_FS_NOT_FOUND)
- {
- svn_error_clear(err);
- yca_loc = NULL;
- }
- else
- return svn_error_trace(err);
- }
-
- if (yca_loc == NULL)
- continue;
- }
-
- APR_ARRAY_PUSH(moved_to_abspaths, const char *) =
- apr_pstrdup(result_pool, candidate_abspath);
- }
- svn_pool_destroy(iterpool);
-
- svn_hash_sets(wc_move_targets, move->moved_to_repos_relpath,
- moved_to_abspaths);
- }
- }
- else
- {
- int i;
- apr_pool_t *iterpool;
-
- /* Recurse into each of the possible move chains. */
- iterpool = svn_pool_create(scratch_pool);
- for (i = 0; i < move->next->nelts; i++)
- {
- struct repos_move_info *next_move;
-
- svn_pool_clear(iterpool);
-
- next_move = APR_ARRAY_IDX(move->next, i, struct repos_move_info *);
- SVN_ERR(follow_move_chains(wc_move_targets, next_move,
- ctx, victim_abspath, victim_node_kind,
- victim_repos_relpath, victim_revision,
- result_pool, iterpool));
-
- }
- svn_pool_destroy(iterpool);
- }
-
- return SVN_NO_ERROR;
-}
-
-static svn_error_t *
-init_wc_move_targets(struct conflict_tree_incoming_delete_details *details,
- svn_client_conflict_t *conflict,
- svn_client_ctx_t *ctx,
- apr_pool_t *scratch_pool)
-{
- int i;
- const char *victim_abspath;
- svn_node_kind_t victim_node_kind;
- const char *incoming_new_repos_relpath;
- svn_revnum_t incoming_new_pegrev;
-
- victim_abspath = svn_client_conflict_get_local_abspath(conflict);
- victim_node_kind = svn_client_conflict_tree_get_victim_node_kind(conflict);
- /* ### Should we get the old location in case of reverse-merges? */
- SVN_ERR(svn_client_conflict_get_incoming_new_repos_location(
- &incoming_new_repos_relpath, &incoming_new_pegrev,
- NULL, conflict,
- scratch_pool, scratch_pool));
- details->wc_move_targets = apr_hash_make(conflict->pool);
- for (i = 0; i < details->moves->nelts; i++)
- {
- struct repos_move_info *move;
-
- move = APR_ARRAY_IDX(details->moves, i, struct repos_move_info *);
- SVN_ERR(follow_move_chains(details->wc_move_targets, move,
- ctx, victim_abspath,
- victim_node_kind,
- incoming_new_repos_relpath,
- incoming_new_pegrev,
- conflict->pool, scratch_pool));
- }
-
- /* Initialize to the first possible move target. Hopefully,
- * in most cases there will only be one candidate anyway. */
- details->move_target_repos_relpath =
- get_moved_to_repos_relpath(details, scratch_pool);
- details->wc_move_target_idx = 0;
-
- /* If only one move target exists recommend a resolution option. */
- if (apr_hash_count(details->wc_move_targets) == 1)
- {
- apr_array_header_t *wc_abspaths;
+ /* If only one move target exists recommend a resolution option. */
+ if (apr_hash_count(details->wc_move_targets) == 1)
+ {
+ apr_array_header_t *wc_abspaths;
wc_abspaths = svn_hash_gets(details->wc_move_targets,
details->move_target_repos_relpath);
@@ -9004,6 +9072,11 @@ resolve_local_move_file_merge(svn_client
apr_array_header_t *propdiffs;
struct conflict_tree_local_missing_details *details;
const char *merge_target_abspath;
+ const char *wcroot_abspath;
+
+ SVN_ERR(svn_wc__get_wcroot(&wcroot_abspath, ctx->wc_ctx,
+ conflict->local_abspath, scratch_pool,
+ scratch_pool));
details = conflict->tree_conflict_local_details;
@@ -9019,12 +9092,28 @@ resolve_local_move_file_merge(svn_client
NULL, conflict, scratch_pool,
scratch_pool));
- if (details->wc_siblings) /* local missing */
- merge_target_abspath = APR_ARRAY_IDX(details->wc_siblings,
- details->preferred_sibling_idx,
- const char *);
- else /* local move */
- merge_target_abspath = details->moved_to_abspath;
+ if (details->wc_siblings)
+ {
+ merge_target_abspath = APR_ARRAY_IDX(details->wc_siblings,
+ details->preferred_sibling_idx,
+ const char *);
+ }
+ else if (details->wc_move_targets && details->move_target_repos_relpath)
+ {
+ apr_array_header_t *moves;
+ moves = svn_hash_gets(details->wc_move_targets,
+ details->move_target_repos_relpath);
+ merge_target_abspath = APR_ARRAY_IDX(moves, details->wc_move_target_idx,
+ const char *);
+ }
+ else
+ return svn_error_createf(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, NULL,
+ _("Corresponding working copy node not found "
+ "for '%s'"),
+ svn_dirent_local_style(
+ svn_dirent_skip_ancestor(
+ wcroot_abspath, conflict->local_abspath),
+ scratch_pool));
SVN_ERR(svn_wc__get_tmpdir(&wc_tmpdir, ctx->wc_ctx,
merge_target_abspath,
@@ -9381,13 +9470,13 @@ svn_client_conflict_text_get_resolution_
add_resolution_option(*options, conflict,
svn_client_conflict_option_incoming_text_where_conflicted,
_("Accept incoming for conflicts"),
- _("accept changes only where they conflict"),
+ _("accept incoming changes only where they conflict"),
resolve_text_conflict);
add_resolution_option(*options, conflict,
svn_client_conflict_option_working_text_where_conflicted,
_("Reject conflicts"),
- _("reject changes which conflict and accept the rest"),
+ _("reject incoming changes which conflict and accept the rest"),
resolve_text_conflict);
add_resolution_option(*options, conflict,
@@ -10291,64 +10380,30 @@ configure_option_local_move_file_merge(s
scratch_pool, scratch_pool));
details = conflict->tree_conflict_local_details;
- if (details != NULL && details->moves != NULL)
+ if (details != NULL && details->moves != NULL &&
+ details->move_target_repos_relpath != NULL)
{
- apr_hash_t *wc_move_targets = apr_hash_make(scratch_pool);
- apr_pool_t *iterpool;
- int i;
-
- iterpool = svn_pool_create(scratch_pool);
- for (i = 0; i < details->moves->nelts; i++)
- {
- struct repos_move_info *move;
-
- svn_pool_clear(iterpool);
- move = APR_ARRAY_IDX(details->moves, i, struct repos_move_info
*);
- SVN_ERR(follow_move_chains(wc_move_targets, move, ctx,
- conflict->local_abspath,
- svn_node_file,
- incoming_new_repos_relpath,
- incoming_new_pegrev,
- scratch_pool, iterpool));
- }
- svn_pool_destroy(iterpool);
-
- if (apr_hash_count(wc_move_targets) > 0)
- {
- apr_array_header_t *move_target_repos_relpaths;
- const svn_sort__item_t *item;
- apr_array_header_t *moved_to_abspaths;
- const char *description;
+ apr_array_header_t *moves;
+ const char *moved_to_abspath;
+ const char *description;
- /* Initialize to the first possible move target. Hopefully,
- * in most cases there will only be one candidate anyway. */
- move_target_repos_relpaths = svn_sort__hash(
- wc_move_targets,
- svn_sort_compare_items_as_paths,
- scratch_pool);
- item = &APR_ARRAY_IDX(move_target_repos_relpaths,
- 0, svn_sort__item_t);
- moved_to_abspaths = item->value;
- details->moved_to_abspath =
- apr_pstrdup(conflict->pool,
- APR_ARRAY_IDX(moved_to_abspaths, 0, const char *));
+ moves = svn_hash_gets(details->wc_move_targets,
+ details->move_target_repos_relpath);
+ moved_to_abspath =
+ APR_ARRAY_IDX(moves, details->wc_move_target_idx, const char *);
- description =
- apr_psprintf(
- scratch_pool, _("apply changes to move destination '%s'"),
- svn_dirent_local_style(
- svn_dirent_skip_ancestor(wcroot_abspath,
- details->moved_to_abspath),
- scratch_pool));
+ description =
+ apr_psprintf(
+ scratch_pool, _("apply changes to move destination '%s'"),
+ svn_dirent_local_style(
+ svn_dirent_skip_ancestor(wcroot_abspath, moved_to_abspath),
+ scratch_pool));
- add_resolution_option(
- options, conflict,
- svn_client_conflict_option_local_move_file_text_merge,
- _("Apply to move destination"),
- description, resolve_local_move_file_merge);
- }
- else
- details->moved_to_abspath = NULL;
+ add_resolution_option(
+ options, conflict,
+ svn_client_conflict_option_local_move_file_text_merge,
+ _("Apply to move destination"),
+ description, resolve_local_move_file_merge);
}
}
@@ -10439,43 +10494,24 @@ configure_option_sibling_move_merge(svn_
return SVN_NO_ERROR;
}
-svn_error_t *
-svn_client_conflict_option_get_moved_to_repos_relpath_candidates(
+/* Return a copy of the repos replath candidate list. */
+static svn_error_t *
+get_repos_relpath_candidates(
apr_array_header_t **possible_moved_to_repos_relpaths,
- svn_client_conflict_option_t *option,
+ apr_hash_t *wc_move_targets,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
- svn_client_conflict_t *conflict = option->conflict;
- struct conflict_tree_incoming_delete_details *details;
- const char *victim_abspath;
apr_array_header_t *sorted_repos_relpaths;
int i;
- SVN_ERR_ASSERT(svn_client_conflict_option_get_id(option) ==
- svn_client_conflict_option_incoming_move_file_text_merge ||
- svn_client_conflict_option_get_id(option) ==
- svn_client_conflict_option_incoming_move_dir_merge);
-
- victim_abspath = svn_client_conflict_get_local_abspath(conflict);
- details = conflict->tree_conflict_incoming_details;
- if (details == NULL || details->wc_move_targets == NULL)
- return svn_error_createf(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, NULL,
- _("Getting a list of possible move targets "
- "requires details for tree conflict at '%s' "
- "to be fetched from the repository first"),
- svn_dirent_local_style(victim_abspath,
- scratch_pool));
-
- /* Return a copy of the repos replath candidate list. */
- sorted_repos_relpaths = svn_sort__hash(details->wc_move_targets,
+ sorted_repos_relpaths = svn_sort__hash(wc_move_targets,
svn_sort_compare_items_as_paths,
scratch_pool);
- *possible_moved_to_repos_relpaths = apr_array_make(
- result_pool,
- sorted_repos_relpaths->nelts,
- sizeof (const char *));
+ *possible_moved_to_repos_relpaths =
+ apr_array_make(result_pool, sorted_repos_relpaths->nelts,
+ sizeof (const char *));
for (i = 0; i < sorted_repos_relpaths->nelts; i++)
{
svn_sort__item_t item;
@@ -10491,37 +10527,107 @@ svn_client_conflict_option_get_moved_to_
}
svn_error_t *
-svn_client_conflict_option_set_moved_to_repos_relpath(
+svn_client_conflict_option_get_moved_to_repos_relpath_candidates2(
+ apr_array_header_t **possible_moved_to_repos_relpaths,
svn_client_conflict_option_t *option,
- int preferred_move_target_idx,
- svn_client_ctx_t *ctx,
+ apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_client_conflict_t *conflict = option->conflict;
- struct conflict_tree_incoming_delete_details *details;
const char *victim_abspath;
+ svn_wc_operation_t operation;
+ svn_wc_conflict_action_t incoming_change;
+ svn_wc_conflict_reason_t local_change;
+ svn_client_conflict_option_id_t id;
+
+ id = svn_client_conflict_option_get_id(option);
+ if (id != svn_client_conflict_option_incoming_move_file_text_merge &&
+ id != svn_client_conflict_option_incoming_move_dir_merge &&
+ id != svn_client_conflict_option_local_move_file_text_merge &&
+ id != svn_client_conflict_option_local_move_dir_merge &&
+ id != svn_client_conflict_option_sibling_move_file_text_merge &&
+ id != svn_client_conflict_option_sibling_move_dir_merge)
+ {
+ /* We cannot operate on this option. */
+ *possible_moved_to_repos_relpaths = NULL;
+ return SVN_NO_ERROR;
+ }
+
+ victim_abspath = svn_client_conflict_get_local_abspath(conflict);
+ operation = svn_client_conflict_get_operation(conflict);
+ incoming_change = svn_client_conflict_get_incoming_change(conflict);
+ local_change = svn_client_conflict_get_local_change(conflict);
+
+ if (operation == svn_wc_operation_merge &&
+ incoming_change == svn_wc_conflict_action_edit &&
+ local_change == svn_wc_conflict_reason_missing)
+ {
+ struct conflict_tree_local_missing_details *details;
+
+ details = conflict->tree_conflict_local_details;
+ if (details == NULL || details->wc_move_targets == NULL)
+ return svn_error_createf(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, NULL,
+ _("Getting a list of possible move targets "
+ "requires details for tree conflict at '%s'
"
+ "to be fetched from the repository first"),
+ svn_dirent_local_style(victim_abspath,
+ scratch_pool));
+
+ SVN_ERR(get_repos_relpath_candidates(possible_moved_to_repos_relpaths,
+ details->wc_move_targets,
+ result_pool, scratch_pool));
+ }
+ else
+ {
+ struct conflict_tree_incoming_delete_details *details;
+
+ details = conflict->tree_conflict_incoming_details;
+ if (details == NULL || details->wc_move_targets == NULL)
+ return svn_error_createf(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, NULL,
+ _("Getting a list of possible move targets "
+ "requires details for tree conflict at '%s'
"
+ "to be fetched from the repository first"),
+ svn_dirent_local_style(victim_abspath,
+ scratch_pool));
+
+ SVN_ERR(get_repos_relpath_candidates(possible_moved_to_repos_relpaths,
+ details->wc_move_targets,
+ result_pool, scratch_pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_client_conflict_option_get_moved_to_repos_relpath_candidates(
+ apr_array_header_t **possible_moved_to_repos_relpaths,
+ svn_client_conflict_option_t *option,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ /* The only difference to API version 2 is an assertion failure if
+ * an unexpected option is passed.
+ * We do not emulate this old behaviour since clients written against
+ * the previous API will just keep working. */
+ return svn_error_trace(
+ svn_client_conflict_option_get_moved_to_repos_relpath_candidates2(
+ possible_moved_to_repos_relpaths, option, result_pool, scratch_pool));
+}
+
+static svn_error_t *
+set_wc_move_target(const char **new_hash_key,
+ apr_hash_t *wc_move_targets,
+ int preferred_move_target_idx,
+ const char *victim_abspath,
+ apr_pool_t *scratch_pool)
+{
apr_array_header_t *move_target_repos_relpaths;
svn_sort__item_t item;
const char *move_target_repos_relpath;
apr_hash_index_t *hi;
- SVN_ERR_ASSERT(svn_client_conflict_option_get_id(option) ==
- svn_client_conflict_option_incoming_move_file_text_merge ||
- svn_client_conflict_option_get_id(option) ==
- svn_client_conflict_option_incoming_move_dir_merge);
-
- victim_abspath = svn_client_conflict_get_local_abspath(conflict);
- details = conflict->tree_conflict_incoming_details;
- if (details == NULL || details->wc_move_targets == NULL)
- return svn_error_createf(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, NULL,
- _("Setting a move target requires details "
- "for tree conflict at '%s' to be fetched "
- "from the repository first"),
- svn_dirent_local_style(victim_abspath,
- scratch_pool));
-
if (preferred_move_target_idx < 0 ||
- preferred_move_target_idx >= apr_hash_count(details->wc_move_targets))
+ preferred_move_target_idx >= apr_hash_count(wc_move_targets))
return svn_error_createf(SVN_ERR_INCORRECT_PARAMS, NULL,
_("Index '%d' is out of bounds of the possible "
"move target list for '%s'"),
@@ -10530,15 +10636,14 @@ svn_client_conflict_option_set_moved_to_
scratch_pool));
/* Translate the index back into a hash table key. */
- move_target_repos_relpaths =
- svn_sort__hash(details->wc_move_targets,
- svn_sort_compare_items_as_paths,
- scratch_pool);
+ move_target_repos_relpaths = svn_sort__hash(wc_move_targets,
+ svn_sort_compare_items_as_paths,
+ scratch_pool);
item = APR_ARRAY_IDX(move_target_repos_relpaths, preferred_move_target_idx,
svn_sort__item_t);
move_target_repos_relpath = item.key;
/* Find our copy of the hash key and remember the user's preference. */
- for (hi = apr_hash_first(scratch_pool, details->wc_move_targets);
+ for (hi = apr_hash_first(scratch_pool, wc_move_targets);
hi != NULL;
hi = apr_hash_next(hi))
{
@@ -10546,15 +10651,7 @@ svn_client_conflict_option_set_moved_to_
if (strcmp(move_target_repos_relpath, repos_relpath) == 0)
{
- details->move_target_repos_relpath = repos_relpath;
- /* Update option description. */
- SVN_ERR(describe_incoming_move_merge_conflict_option(
- &option->description,
- conflict, ctx,
- details,
- conflict->pool,
- scratch_pool));
-
+ *new_hash_key = repos_relpath;
return SVN_NO_ERROR;
}
}
@@ -10568,7 +10665,108 @@ svn_client_conflict_option_set_moved_to_
}
svn_error_t *
-svn_client_conflict_option_get_moved_to_abspath_candidates(
+svn_client_conflict_option_set_moved_to_repos_relpath2(
+ svn_client_conflict_option_t *option,
+ int preferred_move_target_idx,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *scratch_pool)
+{
+ svn_client_conflict_t *conflict = option->conflict;
+ const char *victim_abspath;
+ svn_wc_operation_t operation;
+ svn_wc_conflict_action_t incoming_change;
+ svn_wc_conflict_reason_t local_change;
+ svn_client_conflict_option_id_t id;
+
+ id = svn_client_conflict_option_get_id(option);
+ if (id != svn_client_conflict_option_incoming_move_file_text_merge &&
+ id != svn_client_conflict_option_incoming_move_dir_merge &&
+ id != svn_client_conflict_option_local_move_file_text_merge &&
+ id != svn_client_conflict_option_local_move_dir_merge &&
+ id != svn_client_conflict_option_sibling_move_file_text_merge &&
+ id != svn_client_conflict_option_sibling_move_dir_merge)
+ return SVN_NO_ERROR; /* We cannot operate on this option. Nothing to do. */
+
+ victim_abspath = svn_client_conflict_get_local_abspath(conflict);
+ operation = svn_client_conflict_get_operation(conflict);
+ incoming_change = svn_client_conflict_get_incoming_change(conflict);
+ local_change = svn_client_conflict_get_local_change(conflict);
+
+ if (operation == svn_wc_operation_merge &&
+ incoming_change == svn_wc_conflict_action_edit &&
+ local_change == svn_wc_conflict_reason_missing)
+ {
+ struct conflict_tree_local_missing_details *details;
+
+ details = conflict->tree_conflict_local_details;
+ if (details == NULL || details->wc_move_targets == NULL)
+ return svn_error_createf(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, NULL,
+ _("Setting a move target requires details "
+ "for tree conflict at '%s' to be fetched "
+ "from the repository first"),
+ svn_dirent_local_style(victim_abspath,
+ scratch_pool));
+
+ SVN_ERR(set_wc_move_target(&details->move_target_repos_relpath,
+ details->wc_move_targets,
+ preferred_move_target_idx,
+ victim_abspath, scratch_pool));
+ details->wc_move_target_idx = 0;
+
+ /* Update option description. */
+ SVN_ERR(conflict_tree_get_description_local_missing(
+ &option->description, conflict, ctx,
+ conflict->pool, scratch_pool));
+ }
+ else
+ {
+ struct conflict_tree_incoming_delete_details *details;
+
+ details = conflict->tree_conflict_incoming_details;
+ if (details == NULL || details->wc_move_targets == NULL)
+ return svn_error_createf(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, NULL,
+ _("Setting a move target requires details "
+ "for tree conflict at '%s' to be fetched "
+ "from the repository first"),
+ svn_dirent_local_style(victim_abspath,
+ scratch_pool));
+
+ SVN_ERR(set_wc_move_target(&details->move_target_repos_relpath,
+ details->wc_move_targets,
+ preferred_move_target_idx,
+ victim_abspath, scratch_pool));
+ details->wc_move_target_idx = 0;
+
+ /* Update option description. */
+ SVN_ERR(describe_incoming_move_merge_conflict_option(
+ &option->description,
+ conflict, ctx,
+ details,
+ conflict->pool,
+ scratch_pool));
+ }
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_client_conflict_option_set_moved_to_repos_relpath(
+ svn_client_conflict_option_t *option,
+ int preferred_move_target_idx,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *scratch_pool)
+{
+ /* The only difference to API version 2 is an assertion failure if
+ * an unexpected option is passed.
+ * We do not emulate this old behaviour since clients written against
+ * the previous API will just keep working. */
+ return svn_error_trace(
+ svn_client_conflict_option_set_moved_to_repos_relpath2(option,
+ preferred_move_target_idx, ctx, scratch_pool));
+}
+
+svn_error_t *
+svn_client_conflict_option_get_moved_to_abspath_candidates2(
apr_array_header_t **possible_moved_to_abspaths,
svn_client_conflict_option_t *option,
apr_pool_t *result_pool,
@@ -10580,17 +10778,20 @@ svn_client_conflict_option_get_moved_to_
svn_wc_conflict_action_t incoming_change;
svn_wc_conflict_reason_t local_change;
int i;
+ svn_client_conflict_option_id_t id;
- SVN_ERR_ASSERT(svn_client_conflict_option_get_id(option) ==
- svn_client_conflict_option_incoming_move_file_text_merge ||
- svn_client_conflict_option_get_id(option) ==
- svn_client_conflict_option_local_move_file_text_merge ||
- svn_client_conflict_option_get_id(option) ==
- svn_client_conflict_option_incoming_move_dir_merge ||
- svn_client_conflict_option_get_id(option) ==
- svn_client_conflict_option_sibling_move_file_text_merge ||
- svn_client_conflict_option_get_id(option) ==
- svn_client_conflict_option_sibling_move_dir_merge);
+ id = svn_client_conflict_option_get_id(option);
+ if (id != svn_client_conflict_option_incoming_move_file_text_merge &&
+ id != svn_client_conflict_option_incoming_move_dir_merge &&
+ id != svn_client_conflict_option_local_move_file_text_merge &&
+ id != svn_client_conflict_option_local_move_dir_merge &&
+ id != svn_client_conflict_option_sibling_move_file_text_merge &&
+ id != svn_client_conflict_option_sibling_move_dir_merge)
+ {
+ /* We cannot operate on this option. */
+ *possible_moved_to_abspaths = NULL;
+ return NULL;
+ }
victim_abspath = svn_client_conflict_get_local_abspath(conflict);
operation = svn_client_conflict_get_operation(conflict);
@@ -10605,7 +10806,7 @@ svn_client_conflict_option_get_moved_to_
details = conflict->tree_conflict_local_details;
if (details == NULL ||
- (details->moved_to_abspath == NULL && details->wc_siblings == NULL))
+ (details->wc_move_targets == NULL && details->wc_siblings == NULL))
return svn_error_createf(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, NULL,
_("Getting a list of possible move siblings "
"requires details for tree conflict at '%s' "
@@ -10615,9 +10816,22 @@ svn_client_conflict_option_get_moved_to_
*possible_moved_to_abspaths = apr_array_make(result_pool, 1,
sizeof (const char *));
- if (details->moved_to_abspath)
- APR_ARRAY_PUSH(*possible_moved_to_abspaths, const char *) =
- apr_pstrdup(result_pool, details->moved_to_abspath);
+ if (details->wc_move_targets)
+ {
+ apr_array_header_t *move_target_wc_abspaths;
+ move_target_wc_abspaths =
+ svn_hash_gets(details->wc_move_targets,
+ details->move_target_repos_relpath);
+ for (i = 0; i < move_target_wc_abspaths->nelts; i++)
+ {
+ const char *moved_to_abspath;
+
+ moved_to_abspath = APR_ARRAY_IDX(move_target_wc_abspaths, i,
+ const char *);
+ APR_ARRAY_PUSH(*possible_moved_to_abspaths, const char *) =
+ apr_pstrdup(result_pool, moved_to_abspath);
+ }
+ }
/* ### Siblings are actually 'corresponding nodes', not 'move targets'.
### But we provide them here to avoid another API function. */
@@ -10671,7 +10885,23 @@ svn_client_conflict_option_get_moved_to_
}
svn_error_t *
-svn_client_conflict_option_set_moved_to_abspath(
+svn_client_conflict_option_get_moved_to_abspath_candidates(
+ apr_array_header_t **possible_moved_to_abspaths,
+ svn_client_conflict_option_t *option,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ /* The only difference to API version 2 is an assertion failure if
+ * an unexpected option is passed.
+ * We do not emulate this old behaviour since clients written against
+ * the previous API will just keep working. */
+ return svn_error_trace(
+ svn_client_conflict_option_get_moved_to_abspath_candidates2(
+ possible_moved_to_abspaths, option, result_pool, scratch_pool));
+}
+
+svn_error_t *
+svn_client_conflict_option_set_moved_to_abspath2(
svn_client_conflict_option_t *option,
int preferred_move_target_idx,
svn_client_ctx_t *ctx,
@@ -10682,17 +10912,16 @@ svn_client_conflict_option_set_moved_to_
svn_wc_operation_t operation;
svn_wc_conflict_action_t incoming_change;
svn_wc_conflict_reason_t local_change;
+ svn_client_conflict_option_id_t id;
- SVN_ERR_ASSERT(svn_client_conflict_option_get_id(option) ==
- svn_client_conflict_option_incoming_move_file_text_merge ||
- svn_client_conflict_option_get_id(option) ==
- svn_client_conflict_option_local_move_file_text_merge ||
- svn_client_conflict_option_get_id(option) ==
- svn_client_conflict_option_incoming_move_dir_merge ||
- svn_client_conflict_option_get_id(option) ==
- svn_client_conflict_option_sibling_move_file_text_merge ||
- svn_client_conflict_option_get_id(option) ==
- svn_client_conflict_option_sibling_move_dir_merge);
+ id = svn_client_conflict_option_get_id(option);
+ if (id != svn_client_conflict_option_incoming_move_file_text_merge &&
+ id != svn_client_conflict_option_incoming_move_dir_merge &&
+ id != svn_client_conflict_option_local_move_file_text_merge &&
+ id != svn_client_conflict_option_local_move_dir_merge &&
+ id != svn_client_conflict_option_sibling_move_file_text_merge &&
+ id != svn_client_conflict_option_sibling_move_dir_merge)
+ return NULL; /* We cannot operate on this option. Nothing to do. */
victim_abspath = svn_client_conflict_get_local_abspath(conflict);
operation = svn_client_conflict_get_operation(conflict);
@@ -10714,35 +10943,63 @@ svn_client_conflict_option_set_moved_to_
scratch_pool));
details = conflict->tree_conflict_local_details;
- if (details == NULL || details->wc_siblings == NULL)
+ if (details == NULL || (details->wc_siblings == NULL &&
+ details->wc_move_targets == NULL))
return svn_error_createf(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, NULL,
- _("Setting a move sibling requires details "
+ _("Setting a move target requires details "
"for tree conflict at '%s' to be fetched "
"from the repository first"),
svn_dirent_local_style(victim_abspath,
scratch_pool));
- if (preferred_move_target_idx < 0 ||
- preferred_move_target_idx > details->wc_siblings->nelts)
- return svn_error_createf(SVN_ERR_INCORRECT_PARAMS, NULL,
- _("Index '%d' is out of bounds of the
possible "
- "move sibling list for '%s'"),
- preferred_move_target_idx,
- svn_dirent_local_style(victim_abspath,
- scratch_pool));
- /* Record the user's preference. */
- details->preferred_sibling_idx = preferred_move_target_idx;
+ if (details->wc_siblings)
+ {
+ if (preferred_move_target_idx < 0 ||
+ preferred_move_target_idx > details->wc_siblings->nelts)
+ return svn_error_createf(SVN_ERR_INCORRECT_PARAMS, NULL,
+ _("Index '%d' is out of bounds of the "
+ "possible move sibling list for '%s'"),
+ preferred_move_target_idx,
+ svn_dirent_local_style(victim_abspath,
+ scratch_pool));
+ /* Record the user's preference. */
+ details->preferred_sibling_idx = preferred_move_target_idx;
- /* Update option description. */
- preferred_sibling = APR_ARRAY_IDX(details->wc_siblings,
- details->preferred_sibling_idx,
- const char *);
- option->description =
- apr_psprintf(
- conflict->pool, _("apply changes to '%s'"),
- svn_dirent_local_style(
- svn_dirent_skip_ancestor(wcroot_abspath, preferred_sibling),
- scratch_pool));
+ /* Update option description. */
+ preferred_sibling = APR_ARRAY_IDX(details->wc_siblings,
+ details->preferred_sibling_idx,
+ const char *);
+ option->description =
+ apr_psprintf(
+ conflict->pool, _("apply changes to '%s'"),
+ svn_dirent_local_style(
+ svn_dirent_skip_ancestor(wcroot_abspath, preferred_sibling),
+ scratch_pool));
+ }
+ else if (details->wc_move_targets)
+ {
+ apr_array_header_t *move_target_wc_abspaths;
+ move_target_wc_abspaths =
+ svn_hash_gets(details->wc_move_targets,
+ details->move_target_repos_relpath);
+
+ if (preferred_move_target_idx < 0 ||
+ preferred_move_target_idx > move_target_wc_abspaths->nelts)
+ return svn_error_createf(SVN_ERR_INCORRECT_PARAMS, NULL,
+ _("Index '%d' is out of bounds of the
possible "
+ "move target list for '%s'"),
+ preferred_move_target_idx,
+ svn_dirent_local_style(victim_abspath,
+ scratch_pool));
+
+ /* Record the user's preference. */
+ details->wc_move_target_idx = preferred_move_target_idx;
+
+ /* Update option description. */
+ SVN_ERR(conflict_tree_get_description_local_missing(
+ &option->description, conflict, ctx,
+ conflict->pool, scratch_pool));
+ }
}
else
{
@@ -10785,6 +11042,22 @@ svn_client_conflict_option_set_moved_to_
}
svn_error_t *
+svn_client_conflict_option_set_moved_to_abspath(
+ svn_client_conflict_option_t *option,
+ int preferred_move_target_idx,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *scratch_pool)
+{
+ /* The only difference to API version 2 is an assertion failure if
+ * an unexpected option is passed.
+ * We do not emulate this old behaviour since clients written against
+ * the previous API will just keep working. */
+ return svn_error_trace(
+ svn_client_conflict_option_set_moved_to_abspath2(option,
+ preferred_move_target_idx, ctx, scratch_pool));
+}
+
+svn_error_t *
svn_client_conflict_tree_get_resolution_options(apr_array_header_t **options,
svn_client_conflict_t
*conflict,
svn_client_ctx_t *ctx,
Modified: subversion/branches/java10-compat/subversion/libsvn_client/shelf.c
URL:
http://svn.apache.org/viewvc/subversion/branches/java10-compat/subversion/libsvn_client/shelf.c?rev=1841179&r1=1841178&r2=1841179&view=diff
==============================================================================
--- subversion/branches/java10-compat/subversion/libsvn_client/shelf.c
(original)
+++ subversion/branches/java10-compat/subversion/libsvn_client/shelf.c Tue Sep
18 01:50:50 2018
@@ -1877,23 +1877,6 @@ svn_client_shelf_unapply(svn_client_shel
}
svn_error_t *
-svn_client_shelf_set_current_version(svn_client_shelf_t *shelf,
- int version_number,
- apr_pool_t *scratch_pool)
-{
- svn_client_shelf_version_t *shelf_version = NULL;
-
- if (version_number > 0)
- {
- SVN_ERR(svn_client_shelf_version_open(&shelf_version, shelf,
version_number,
- scratch_pool, scratch_pool));
- }
- SVN_ERR(svn_client_shelf_delete_newer_versions(shelf, shelf_version,
- scratch_pool));
- return SVN_NO_ERROR;
-}
-
-svn_error_t *
svn_client_shelf_delete_newer_versions(svn_client_shelf_t *shelf,
svn_client_shelf_version_t
*shelf_version,
apr_pool_t *scratch_pool)
@@ -1937,14 +1920,6 @@ svn_client__shelf_diff(svn_client_shelf_
}
svn_error_t *
-svn_client_shelf_export_patch(svn_client_shelf_version_t *shelf_version,
- svn_stream_t *outstream,
- apr_pool_t *scratch_pool)
-{
- return SVN_NO_ERROR;
-}
-
-svn_error_t *
svn_client_shelf_save_new_version3(svn_client_shelf_version_t **new_version_p,
svn_client_shelf_t *shelf,
const apr_array_header_t *paths,
@@ -1987,79 +1962,6 @@ svn_client_shelf_save_new_version3(svn_c
return SVN_NO_ERROR;
}
-/* A compatibility callback for counting not-shelved paths. */
-static svn_error_t *
-was_not_shelved(void *baton,
- const char *path,
- const svn_client_status_t *status,
- apr_pool_t *scratch_pool)
-{
- int *num_paths_not_shelved = baton;
-
- ++(*num_paths_not_shelved);
- return SVN_NO_ERROR;
-}
-
-/* A compatibility wrapper. */
-static svn_error_t *
-save_new_version2(svn_client_shelf_version_t **new_version_p,
- svn_client_shelf_t *shelf,
- const apr_array_header_t *paths,
- svn_depth_t depth,
- const apr_array_header_t *changelists,
- apr_pool_t *scratch_pool)
-{
- svn_client_shelf_version_t *previous_version;
- int num_paths_not_shelved = 0;
-
- SVN_ERR(svn_client_shelf_get_newest_version(&previous_version, shelf,
- scratch_pool, scratch_pool));
- SVN_ERR(svn_client_shelf_save_new_version3(new_version_p, shelf,
- paths, depth, changelists,
- NULL, NULL,
- was_not_shelved,
&num_paths_not_shelved,
- scratch_pool));
- if (num_paths_not_shelved)
- {
- SVN_ERR(svn_client_shelf_delete_newer_versions(shelf, previous_version,
- scratch_pool));
- return svn_error_createf(SVN_ERR_ILLEGAL_TARGET, NULL,
- Q_("%d path could not be shelved",
- "%d paths could not be shelved",
- num_paths_not_shelved),
- num_paths_not_shelved);
- }
-
- return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_client_shelf_save_new_version2(svn_client_shelf_version_t **new_version_p,
- svn_client_shelf_t *shelf,
- const apr_array_header_t *paths,
- svn_depth_t depth,
- const apr_array_header_t *changelists,
- apr_pool_t *scratch_pool)
-{
- SVN_ERR(save_new_version2(new_version_p, shelf,
- paths, depth, changelists,
- scratch_pool));
- return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_client_shelf_save_new_version(svn_client_shelf_t *shelf,
- const apr_array_header_t *paths,
- svn_depth_t depth,
- const apr_array_header_t *changelists,
- apr_pool_t *scratch_pool)
-{
- SVN_ERR(save_new_version2(NULL, shelf,
- paths, depth, changelists,
- scratch_pool));
- return SVN_NO_ERROR;
-}
-
svn_error_t *
svn_client_shelf_get_log_message(char **log_message,
svn_client_shelf_t *shelf,
Modified: subversion/branches/java10-compat/subversion/libsvn_wc/wcroot_anchor.c
URL:
http://svn.apache.org/viewvc/subversion/branches/java10-compat/subversion/libsvn_wc/wcroot_anchor.c?rev=1841179&r1=1841178&r2=1841179&view=diff
==============================================================================
--- subversion/branches/java10-compat/subversion/libsvn_wc/wcroot_anchor.c
(original)
+++ subversion/branches/java10-compat/subversion/libsvn_wc/wcroot_anchor.c Tue
Sep 18 01:50:50 2018
@@ -193,7 +193,7 @@ svn_wc__get_shelves_dir(char **dir,
SVN_ERR(svn_wc__get_wcroot(&wcroot_abspath, wc_ctx, local_abspath,
scratch_pool, scratch_pool));
- *dir = svn_dirent_join(wcroot_abspath, ".svn/shelves", result_pool);
+ *dir = svn_dirent_join(wcroot_abspath, ".svn/x/shelves/v2", result_pool);
/* Ensure the directory exists. (Other versions of svn don't create it.) */
SVN_ERR(svn_io_make_dir_recursively(*dir, scratch_pool));