Modified: subversion/branches/ra-git/subversion/include/private/svn_wc_private.h URL: http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/include/private/svn_wc_private.h?rev=1764214&r1=1764213&r2=1764214&view=diff ============================================================================== --- subversion/branches/ra-git/subversion/include/private/svn_wc_private.h (original) +++ subversion/branches/ra-git/subversion/include/private/svn_wc_private.h Tue Oct 11 09:11:50 2016 @@ -1748,6 +1748,195 @@ svn_wc__resolve_conflicts(svn_wc_context void *notify_baton, apr_pool_t *scratch_pool); +/** + * Resolve the text conflict at LOCAL_ABSPATH as per CHOICE, and then + * mark the conflict resolved. + * The working copy must already be locked for resolving, e.g. by calling + * svn_wc__acquire_write_lock_for_resolve() first. + * @since New in 1.10. + */ +svn_error_t * +svn_wc__conflict_text_mark_resolved(svn_wc_context_t *wc_ctx, + const char *local_abspath, + svn_wc_conflict_choice_t choice, + svn_cancel_func_t cancel_func, + void *cancel_baton, + svn_wc_notify_func2_t notify_func, + void *notify_baton, + apr_pool_t *scratch_pool); + +/** + * Resolve the conflicted property PROPNAME at LOCAL_ABSPATH as per CHOICE, + * and then mark the conflict resolved. If MERGED_VALUE is not NULL, this is + * the new merged property, used when choosing #svn_wc_conflict_choose_merged. + * + * The working copy must already be locked for resolving, e.g. by calling + * svn_wc__acquire_write_lock_for_resolve() first. + * @since New in 1.10. + */ +svn_error_t * +svn_wc__conflict_prop_mark_resolved(svn_wc_context_t *wc_ctx, + const char *local_abspath, + const char *propname, + svn_wc_conflict_choice_t choice, + const svn_string_t *merged_value, + svn_wc_notify_func2_t notify_func, + void *notify_baton, + apr_pool_t *scratch_pool); + +/* Resolve a tree conflict where the victim at LOCAL_ABSPATH is a directory + * which was locally deleted, replaced or moved away, and which received an + * arbitrary incoming change during an update or switch operation. + * + * The conflict is resolved by accepting the current working copy state and + * breaking the 'moved-here' link for any files or directories which were + * moved out of the victim directory before the update operation. + * As a result, any such files or directories become copies (rather than moves) + * of content which the victim directory contained before it was updated. + * + * The tree conflict at LOCAL_ABSPATH must have the following properties or + * SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE will be returned: + * + * operation: svn_wc_operation_update or svn_wc_operation_switch + * local change: svn_wc_conflict_reason_deleted or + * svn_wc_conflict_reason_replaced or + * svn_wc_conflict_reason_moved_away + * incoming change: any + * + * The working copy must already be locked for resolving, e.g. by calling + * svn_wc__acquire_write_lock_for_resolve() first. + * + * @since New in 1.10. + */ +svn_error_t * +svn_wc__conflict_tree_update_break_moved_away(svn_wc_context_t *wc_ctx, + const char *local_abspath, + svn_cancel_func_t cancel_func, + void *cancel_baton, + svn_wc_notify_func2_t notify_func, + void *notify_baton, + apr_pool_t *scratch_pool); + + +/* Resolve a tree conflict where the victim at LOCAL_ABSPATH is a directory + * which was locally deleted or replaced, and which received an edit (some + * change inside the directory, or a change to the direcotory's properties) + * during an update or switch operation. + * + * The conflict is resolved by keeping the victim deleted, and propagating + * its tree conflict to any children which were moved out of the directory + * before the update operation. + * As a result, any such files or directories become victims of the tree + * conflict as well and must be resolved independently. + * Additionally, LOCAL_ABSPATH itself may become the victim of a different + * tree conflict as a result of resolving the existing tree conflict. + * + * The tree conflict at LOCAL_ABSPATH must have the following properties or + * SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE will be returned: + * + * operation: svn_wc_operation_update or svn_wc_operation_switch + * local change: svn_wc_conflict_reason_deleted or + * svn_wc_conflict_reason_replaced + * incoming change: svn_wc_conflict_action_edit + * + * If this conflict cannot be resolved because the conflict cannot be + * propagated to moved-away children, this function returns + * SVN_ERR_WC_OBSTRUCTED_UPDATE or SVN_ERR_WC_FOUND_CONFLICT. + * The caller should continue by resolving other conflicts and attempt to + * resolve this conflict again later. + * + * The working copy must already be locked for resolving, e.g. by calling + * svn_wc__acquire_write_lock_for_resolve() first. + * + * @since New in 1.10. + */ +svn_error_t * +svn_wc__conflict_tree_update_raise_moved_away(svn_wc_context_t *wc_ctx, + const char *local_abspath, + svn_cancel_func_t cancel_func, + void *cancel_baton, + svn_wc_notify_func2_t notify_func, + void *notify_baton, + apr_pool_t *scratch_pool); + +/* Resolve a tree conflict where the victim at LOCAL_ABSPATH is a file or + * directory which was locally moved away, and which received an edit (some + * change inside the directory or file, or a change to properties) during an + * update or switch operation. + * + * The conflict is resolved by keeping the victim moved-away, and propagating + * the incoming edits to the victim's moved-to location. + * + * The tree conflict at LOCAL_ABSPATH must have the following properties or + * SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE will be returned: + * + * operation: svn_wc_operation_update or svn_wc_operation_switch + * local change: svn_wc_conflict_reason_moved_away + * incoming change: svn_wc_conflict_action_edit + * + * If this conflict cannot be resolved this function returns + * SVN_ERR_WC_OBSTRUCTED_UPDATE or SVN_ERR_WC_FOUND_CONFLICT. + * The caller should continue by resolving other conflicts and attempt to + * resolve this conflict again later. + * + * The working copy must already be locked for resolving, e.g. by calling + * svn_wc__acquire_write_lock_for_resolve() first. + * + * @since New in 1.10. + */ +svn_error_t * +svn_wc__conflict_tree_update_moved_away_node(svn_wc_context_t *wc_ctx, + const char *local_abspath, + svn_cancel_func_t cancel_func, + void *cancel_baton, + svn_wc_notify_func2_t notify_func, + void *notify_baton, + apr_pool_t *scratch_pool); + +/* Merge local changes from a tree conflict victim of an incoming deletion + * to the specified DEST_ABSPATH. Both LOCAL_ABSPATH and DEST_ABSPATH must + * be directories. + * + * Assuming DEST_ABSPATH is the correct destination, this function allows + * local changes to "follow" incoming moves. + * + * @since New in 1.10. */ +svn_error_t * +svn_wc__conflict_tree_merge_local_changes(svn_wc_context_t *wc_ctx, + const char *local_abspath, + const char *dest_abspath, + svn_cancel_func_t cancel_func, + void *cancel_baton, + svn_wc_notify_func2_t notify_func, + void *notify_baton, + apr_pool_t *scratch_pool); + +/* Find nodes in the working copy which corresponds to the new location + * MOVED_TO_REPOS_RELPATH@REV of the tree conflict victim at VICTIM_ABSPATH. + * The nodes must be of the same node kind as VICTIM_NODE_KIND. + * If no such node can be found, set *POSSIBLE_TARGETS to an empty array. + * + * The nodes should be useful for conflict resolution, e.g. it should be + * possible to merge changes into these nodes to resolve an incoming-move + * tree conflict. But the exact criteria for selecting a node are left + * to the implementation of this function. + * Note that this function may not necessarily return a node which was + * actually moved. The only hard guarantee is that the node corresponds to + * the repository node MOVED_TO_REPOS_RELPATH@REV specified by the caller. + * In many cases, this will be a moved node if the caller's parameters are + * correct. Users should be able to perform a sanity check on the results + * returned from this function. + */ +svn_error_t * +svn_wc__guess_incoming_move_target_nodes(apr_array_header_t **possible_targets, + svn_wc_context_t *wc_ctx, + const char *victim_abspath, + svn_node_kind_t victim_node_kind, + const char *moved_to_repos_relpath, + svn_revnum_t rev, + apr_pool_t *result_pool, + apr_pool_t *scratch_pool); + /** * Move @a src_abspath to @a dst_abspath, by scheduling @a dst_abspath * for addition to the repository, remembering the history. Mark @a src_abspath
Modified: subversion/branches/ra-git/subversion/include/svn_client.h URL: http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/include/svn_client.h?rev=1764214&r1=1764213&r2=1764214&view=diff ============================================================================== --- subversion/branches/ra-git/subversion/include/svn_client.h (original) +++ subversion/branches/ra-git/subversion/include/svn_client.h Tue Oct 11 09:11:50 2016 @@ -4382,18 +4382,51 @@ typedef struct svn_client_conflict_optio */ typedef enum svn_client_conflict_option_id_t { - /* These values intentionally mirror svn_wc_conflict_choice_t. */ + /* Options for text and property conflicts. + * These values intentionally mirror svn_wc_conflict_choice_t. */ svn_client_conflict_option_undefined = -1, /* for private use only */ svn_client_conflict_option_postpone = 0, svn_client_conflict_option_base_text, - svn_client_conflict_option_incoming_text, - svn_client_conflict_option_working_text, + svn_client_conflict_option_incoming_text, /* "theirs-full" */ + svn_client_conflict_option_working_text, /* "mine-full" */ svn_client_conflict_option_incoming_text_where_conflicted, svn_client_conflict_option_working_text_where_conflicted, svn_client_conflict_option_merged_text, - svn_client_conflict_option_unspecified + svn_client_conflict_option_unspecified, /* Values derived from svn_wc_conflict_choice_t end here. */ + /* Tree conflict resolution options start here. */ + + /* Accept current working copy state. */ + svn_client_conflict_option_accept_current_wc_state, + + /* Options for local move vs incoming edit on update. */ + svn_client_conflict_option_update_move_destination, + + /* Options for local delete/replace vs incoming edit on update. */ + svn_client_conflict_option_update_any_moved_away_children, + + /* Options for incoming add vs local add or obstruction. */ + svn_client_conflict_option_incoming_add_ignore, + + /* Options for incoming file add vs local file add or obstruction. */ + svn_client_conflict_option_incoming_added_file_text_merge, + svn_client_conflict_option_incoming_added_file_replace, + svn_client_conflict_option_incoming_added_file_replace_and_merge, + + /* Options for incoming dir add vs local dir add or obstruction. */ + svn_client_conflict_option_incoming_added_dir_merge, + svn_client_conflict_option_incoming_added_dir_replace, + svn_client_conflict_option_incoming_added_dir_replace_and_merge, + + /* Options for incoming delete vs any */ + svn_client_conflict_option_incoming_delete_ignore, + svn_client_conflict_option_incoming_delete_accept, + + /* Options for incoming move vs local edit */ + svn_client_conflict_option_incoming_move_file_text_merge, + svn_client_conflict_option_incoming_move_dir_merge, + } svn_client_conflict_option_id_t; /** @@ -4414,6 +4447,96 @@ 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_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 + * 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. + * + * 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() + * @since New in 1.10. + */ +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); + +/** + * 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. + * + * @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(). + * + * @since New in 1.10. + */ +svn_error_t * +svn_client_conflict_option_set_moved_to_repos_relpath( + svn_client_conflict_option_t *option, + int preferred_move_target_idx, + apr_pool_t *scratch_pool); + +/** + * 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 + * 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. + * + * 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() + * @since New in 1.10. + */ +svn_error_t * +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); + +/** + * Set the preferred moved target abspath for the + * svn_client_conflict_option_incoming_move_file_text_merge or + * svn_client_conflict_option_incoming_move_dir_merge resolution option. + * + * @a preferred_move_target_idx must be a valid index into the list + * returned by svn_client_conflict_option_get_moved_to_abspath_candidates(). + * + * @since New in 1.10. + */ +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); + +/** * Given an @a option_id, try to find the corresponding option in @a options, * which is an array of svn_client_conflict_option_t * elements. * @@ -4439,18 +4562,6 @@ svn_client_conflict_get(svn_client_confl apr_pool_t *scratch_pool); /** - * Return a conflict corresponding to legacy conflict description @a desc. - * - * @since New in 1.10. - */ -svn_error_t * -svn_client_conflict_from_wc_description2_t( - svn_client_conflict_t **conflict, - const svn_wc_conflict_description2_t *desc, - apr_pool_t *result_pool, - apr_pool_t *scratch_pool); - -/** * Indicate the types of conflicts present on the working copy node * described by @a conflict. Any output argument may be @c NULL if * the caller is not interested in the status of a particular type. @@ -4470,6 +4581,70 @@ svn_client_conflict_get_conflicted(svn_b apr_pool_t *scratch_pool); /** + * Return a textual human-readable description of the property conflict + * described by @a conflict, allocated in @a result_pool. The description + * is encoded in UTF-8 and may contain multiple lines separated by + * @c APR_EOL_STR. The last line is not terminated by a newline. + * + * Additionally, the description may be localized to the language used + * by the current locale. + * + * @since New in 1.10. + */ +svn_error_t * +svn_client_conflict_prop_get_description(const char **description, + svn_client_conflict_t *conflict, + apr_pool_t *result_pool, + apr_pool_t *scratch_pool); + +/** + * Return a textual human-readable description of the tree conflict + * described by @a conflict, allocated in @a result_pool. The description + * is encoded in UTF-8 and may contain multiple lines separated by + * @c APR_EOL_STR. The last line is not terminated by a newline. + * + * Additionally, the description may be localized to the language used + * by the current locale. + * + * While client implementors are free to enhance descriptions by adding + * additional information to the text, or break up very long lines for + * formatting purposes, there is no syntax defined for descriptions, and + * implementors should not rely on any particular parts of descriptions + * to remain stable over time, apart from what is stated below. + * Descriptions may or may not form complete sentences. They may contain + * paths relative to the repository root; such paths always start with "^/", + * and end with either a peg revision (e.g. "@100") or a colon followed by + * a range of revisions (as in svn:mergeinfo, e.g. ":100-200"). + * Paths may appear on a line of their own to avoid overlong lines. + * Any revision numbers mentioned elsewhere in the description are + * prefixed with the letter 'r' (e.g. "r99"). + * + * The description has two parts: One part describes the "incoming change" + * applied by an update, merge, or switch operation. The other part + * describes the "local change" which occurred in the working copy or + * perhaps in the history of a merge target branch. + * Both parts are provided independently to allow for some flexibility + * when displaying the description. As a convention, displaying the + * "incoming change" first and the "local change" second is recommended. + * + * By default, the description is based only on information available in + * the working copy. If svn_client_conflict_tree_get_details() was already + * called for @a conflict, the description might also contain useful + * information obtained from the repository and provide for a much better + * user experience. + * + * @since New in 1.10. + */ +svn_error_t * +svn_client_conflict_tree_get_description( + const char **incoming_change_description, + const char **local_change_description, + svn_client_conflict_t *conflict, + svn_client_ctx_t *ctx, + apr_pool_t *result_pool, + apr_pool_t *scratch_pool); + +/** * Set @a *options to an array of pointers to svn_client_conflict_option_t * objects applicable to text conflicts described by @a conflict. * @@ -4478,6 +4653,7 @@ svn_client_conflict_get_conflicted(svn_b svn_error_t * svn_client_conflict_text_get_resolution_options(apr_array_header_t **options, svn_client_conflict_t *conflict, + svn_client_ctx_t *ctx, apr_pool_t *result_pool, apr_pool_t *scratch_pool); @@ -4490,6 +4666,7 @@ svn_client_conflict_text_get_resolution_ svn_error_t * svn_client_conflict_prop_get_resolution_options(apr_array_header_t **options, svn_client_conflict_t *conflict, + svn_client_ctx_t *ctx, apr_pool_t *result_pool, apr_pool_t *scratch_pool); @@ -4497,15 +4674,39 @@ svn_client_conflict_prop_get_resolution_ * Set @a *options to an array of pointers to svn_client_conflict_option_t * objects applicable to the tree conflict described by @a conflict. * + * By default, the list of options is based only on information available in + * the working copy. If svn_client_conflict_tree_get_details() was already + * called for @a conflict, a more useful list of options might be returned. + * * @since New in 1.10. */ 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, apr_pool_t *result_pool, apr_pool_t *scratch_pool); /** + * Find more information about the tree conflict represented by @a conflict. + * + * A call to svn_client_conflict_tree_get_description() may yield much better + * results after this function has been called. + * + * A call to svn_client_conflict_tree_get_resolution_options() may provide + * more useful resolution options if this function has been called. + * + * This function may contact the repository. Use the authentication baton + * cached in @a ctx for authentication if contacting the repository. + * + * @since New in 1.10. + */ +svn_error_t * +svn_client_conflict_tree_get_details(svn_client_conflict_t *conflict, + svn_client_ctx_t *ctx, + apr_pool_t *scratch_pool); + +/** * Return an ID for @a option. This ID can be used by callers to associate * arbitrary data with a particular conflict resolution option. * @@ -4534,22 +4735,13 @@ svn_client_conflict_option_describe(cons apr_pool_t *scratch_pool); /** - * 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_client_conflict_t *conflict); - -/** * Return the absolute path to the conflicted working copy node described * by @a conflict. * * @since New in 1.10. */ const char * -svn_client_conflict_get_local_abspath(const svn_client_conflict_t *conflict); +svn_client_conflict_get_local_abspath(svn_client_conflict_t *conflict); /** * Return the operation during which the conflict described by @a @@ -4558,7 +4750,7 @@ svn_client_conflict_get_local_abspath(co * @since New in 1.10. */ svn_wc_operation_t -svn_client_conflict_get_operation(const svn_client_conflict_t *conflict); +svn_client_conflict_get_operation(svn_client_conflict_t *conflict); /** * Return the action an update, switch, or merge operation attempted to @@ -4567,7 +4759,7 @@ svn_client_conflict_get_operation(const * @since New in 1.10. */ svn_wc_conflict_action_t -svn_client_conflict_get_incoming_change(const svn_client_conflict_t *conflict); +svn_client_conflict_get_incoming_change(svn_client_conflict_t *conflict); /** * Return the reason why the attempted action performed by an update, switch, @@ -4581,7 +4773,7 @@ svn_client_conflict_get_incoming_change( * @since New in 1.10. */ svn_wc_conflict_reason_t -svn_client_conflict_get_local_change(const svn_client_conflict_t *conflict); +svn_client_conflict_get_local_change(svn_client_conflict_t *conflict); /** * Return information about the repository associated with @a conflict. @@ -4593,7 +4785,7 @@ svn_client_conflict_get_local_change(con svn_error_t * svn_client_conflict_get_repos_info(const char **repos_root_url, const char **repos_uuid, - const svn_client_conflict_t *conflict, + svn_client_conflict_t *conflict, apr_pool_t *result_pool, apr_pool_t *scratch_pool); @@ -4628,7 +4820,7 @@ svn_client_conflict_get_incoming_old_rep const char **incoming_old_repos_relpath, svn_revnum_t *incoming_old_regrev, svn_node_kind_t *incoming_old_node_kind, - const svn_client_conflict_t *conflict, + svn_client_conflict_t *conflict, apr_pool_t *result_pool, apr_pool_t *scratch_pool); @@ -4645,7 +4837,7 @@ svn_client_conflict_get_incoming_new_rep const char **incoming_new_repos_relpath, svn_revnum_t *incoming_new_regrev, svn_node_kind_t *incoming_new_node_kind, - const svn_client_conflict_t *conflict, + svn_client_conflict_t *conflict, apr_pool_t *result_pool, apr_pool_t *scratch_pool); @@ -4657,23 +4849,33 @@ svn_client_conflict_get_incoming_new_rep * @since New in 1.10. */ svn_node_kind_t -svn_client_conflict_tree_get_victim_node_kind( - const svn_client_conflict_t *conflict); +svn_client_conflict_tree_get_victim_node_kind(svn_client_conflict_t *conflict); /** * Resolve a tree @a conflict using resolution option @a option. * + * May raise an error in case the tree conflict cannot be resolved yet, for + * instance @c SVN_ERR_WC_OBSTRUCTED_UPDATE or @c SVN_ERR_WC_FOUND_CONFLICT. + * This may happen when other tree conflicts, or unversioned obstructions, + * block the resolution of this tree conflict. In such a case the other + * conflicts should be resolved first and resolution of this conflict should + * be attempted again later. + * * @since New in 1.10. */ svn_error_t * svn_client_conflict_tree_resolve(svn_client_conflict_t *conflict, svn_client_conflict_option_t *option, + svn_client_ctx_t *ctx, apr_pool_t *scratch_pool); /** + * Like svn_client_conflict_tree_resolve(), except that it identifies + * the desired resolution option by ID @a option_id. + * * If the provided @a option_id is the ID of an option which resolves - * @a conflict, resolve the tree conflict using that option. - * Else, return an error. + * @a conflict, try to resolve the tree conflict using that option. + * Else, return @c SVN_ERR_CLIENT_CONFLICT_OPTION_NOT_APPLICABLE. * * @since New in 1.10. */ @@ -4681,26 +4883,18 @@ svn_error_t * svn_client_conflict_tree_resolve_by_id( svn_client_conflict_t *conflict, svn_client_conflict_option_id_t option_id, + svn_client_ctx_t *ctx, apr_pool_t *scratch_pool); /** * Return the ID of the option this tree @a conflict has been resolved to. * If the conflict has not been resolved yet, then return - * @c svn_client_conflict_option_undefined. + * @c svn_client_conflict_option_unspecified. * * @since New in 1.10. */ svn_client_conflict_option_id_t -svn_client_conflict_tree_get_resolution(const svn_client_conflict_t *conflict); - - -/** - * 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_client_conflict_t *conflict); +svn_client_conflict_tree_get_resolution(svn_client_conflict_t *conflict); /** * Return the path to the legacy property conflicts reject file @@ -4712,12 +4906,11 @@ svn_client_conflict_prop_get_propname(co * @since New in 1.10. */ const char * -svn_client_conflict_prop_get_reject_abspath( - const svn_client_conflict_t *conflict); +svn_client_conflict_prop_get_reject_abspath(svn_client_conflict_t *conflict); /** - * Return the set of property values involved in the property conflict - * described by @a conflict. If a property value is unavailable the + * Return the set of property values involved in the conflict of property + * PROPNAME 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 @@ -4731,7 +4924,8 @@ svn_client_conflict_prop_get_propvals(co const svn_string_t **working_propval, const svn_string_t **incoming_old_propval, const svn_string_t **incoming_new_propval, - const svn_client_conflict_t *conflict, + svn_client_conflict_t *conflict, + const char *propname, apr_pool_t *result_pool); /** @@ -4745,11 +4939,13 @@ svn_error_t * svn_client_conflict_prop_resolve(svn_client_conflict_t *conflict, const char *propname, svn_client_conflict_option_t *option, + svn_client_ctx_t *ctx, apr_pool_t *scratch_pool); /** * If the provided @a option_id is the ID of an option which resolves * @a conflict, resolve the property conflict in property @a propname - * using that option. Else, return an error. + * using that option. + * Else, return @c SVN_ERR_CLIENT_CONFLICT_OPTION_NOT_APPLICABLE. * * @since New in 1.10. */ @@ -4758,18 +4954,19 @@ svn_client_conflict_prop_resolve_by_id( svn_client_conflict_t *conflict, const char *propname, svn_client_conflict_option_id_t option_id, + svn_client_ctx_t *ctx, apr_pool_t *scratch_pool); /** * Return the ID of the option this property @a conflict in property * @a propname has been resolved to. * If the conflict has not been resolved yet, then return - * @c svn_client_conflict_option_undefined. + * @c svn_client_conflict_option_unspecified. * * @since New in 1.10. */ svn_client_conflict_option_id_t -svn_client_conflict_prop_get_resolution(const svn_client_conflict_t *conflict, +svn_client_conflict_prop_get_resolution(svn_client_conflict_t *conflict, const char *propname); /** @@ -4780,7 +4977,7 @@ svn_client_conflict_prop_get_resolution( * @since: New in 1.10. */ const char * -svn_client_conflict_text_get_mime_type(const svn_client_conflict_t *conflict); +svn_client_conflict_text_get_mime_type(svn_client_conflict_t *conflict); /** * Return absolute paths to the versions of the text-conflicted file @@ -4796,7 +4993,7 @@ svn_client_conflict_text_get_contents(co const char **working_abspath, const char **incoming_old_abspath, const char **incoming_new_abspath, - const svn_client_conflict_t *conflict, + svn_client_conflict_t *conflict, apr_pool_t *result_pool, apr_pool_t *scratch_pool); @@ -4808,12 +5005,13 @@ svn_client_conflict_text_get_contents(co svn_error_t * svn_client_conflict_text_resolve(svn_client_conflict_t *conflict, svn_client_conflict_option_t *option, + svn_client_ctx_t *ctx, apr_pool_t *scratch_pool); /** * If the provided @a option_id is the ID of an option which resolves * @a conflict, resolve the text conflict using that option. - * Else, return an error. + * Else, return @c SVN_ERR_CLIENT_CONFLICT_OPTION_NOT_APPLICABLE. * * @since New in 1.10. */ @@ -4821,17 +5019,18 @@ svn_error_t * svn_client_conflict_text_resolve_by_id( svn_client_conflict_t *conflict, svn_client_conflict_option_id_t option_id, + svn_client_ctx_t *ctx, apr_pool_t *scratch_pool); /** * Return the ID of the option this text @a conflict has been resolved to. * If the conflict has not been resolved yet, then return - * @c svn_client_conflict_option_undefined. + * @c svn_client_conflict_option_unspecified. * * @since New in 1.10. */ svn_client_conflict_option_id_t -svn_client_conflict_text_get_resolution(const svn_client_conflict_t *conflict); +svn_client_conflict_text_get_resolution(svn_client_conflict_t *conflict); /** @} */ @@ -4882,7 +5081,11 @@ svn_client_resolved(const char *path, * - svn_wc_conflict_choose_unspecified * invoke @a ctx->conflict_func2 with @a ctx->conflict_baton2 to obtain * a resolution decision for each conflict. This can be used to - * implement interactive conflict resolution. + * implement interactive conflict resolution but is NOT RECOMMENDED for + * new code. To perform conflict resolution based on interactive user + * input on a per-conflict basis, use svn_client_conflict_text_resolve(), + * svn_client_conflict_prop_resolve(), and + * svn_client_conflict_tree_resolve() instead of svn_client_resolve(). * * #svn_wc_conflict_choose_theirs_conflict and * #svn_wc_conflict_choose_mine_conflict are not legal for binary Modified: subversion/branches/ra-git/subversion/include/svn_error_codes.h URL: http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/include/svn_error_codes.h?rev=1764214&r1=1764213&r2=1764214&view=diff ============================================================================== --- subversion/branches/ra-git/subversion/include/svn_error_codes.h (original) +++ subversion/branches/ra-git/subversion/include/svn_error_codes.h Tue Oct 11 09:11:50 2016 @@ -1249,6 +1249,11 @@ SVN_ERROR_START SVN_ERR_CLIENT_CATEGORY_START + 23, "The operation is forbidden by the server") + /** @since New in 1.10. */ + SVN_ERRDEF(SVN_ERR_CLIENT_CONFLICT_OPTION_NOT_APPLICABLE, + SVN_ERR_CLIENT_CATEGORY_START + 24, + "The conflict resolution option is not applicable") + /* misc errors */ SVN_ERRDEF(SVN_ERR_BASE, @@ -1455,6 +1460,11 @@ SVN_ERROR_START SVN_ERR_MISC_CATEGORY_START + 43, "Parser error: invalid input") + /** @since New in 1.10. */ + SVN_ERRDEF(SVN_ERR_SQLITE_ROLLBACK_FAILED, + SVN_ERR_MISC_CATEGORY_START + 44, + "SQLite transaction rollback failed") + /* command-line client errors */ SVN_ERRDEF(SVN_ERR_CL_ARG_PARSING_ERROR, Modified: subversion/branches/ra-git/subversion/include/svn_fs.h URL: http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/include/svn_fs.h?rev=1764214&r1=1764213&r2=1764214&view=diff ============================================================================== --- subversion/branches/ra-git/subversion/include/svn_fs.h (original) +++ subversion/branches/ra-git/subversion/include/svn_fs.h Tue Oct 11 09:11:50 2016 @@ -146,6 +146,12 @@ typedef struct svn_fs_t svn_fs_t; */ #define SVN_FS_CONFIG_FSFS_CACHE_NS "fsfs-cache-namespace" +/** Enable / disable caching of node properties for a FSFS repository. + * + * @since New in 1.10. + */ +#define SVN_FS_CONFIG_FSFS_CACHE_NODEPROPS "fsfs-cache-nodeprops" + /** Enable / disable the FSFS format 7 "block read" feature. * * @since New in 1.9. @@ -219,6 +225,20 @@ typedef struct svn_fs_t svn_fs_t; * @since New in 1.9. */ #define SVN_FS_CONFIG_COMPATIBLE_VERSION "compatible-version" + +/** Specifies whether the filesystem should be forcing a physical write of + * the data to disk. Enabling the option allows the filesystem to return + * from the API calls without forcing the write to disk. If this option + * is disabled, the changes are always written to disk. + * + * @note Avoiding the forced write to disk usually is more efficient, but + * doesn't guarantee data integrity after a system crash or power failure + * and should be used with caution. + * + * @since New in 1.10. + */ +#define SVN_FS_CONFIG_NO_FLUSH_TO_DISK "no-flush-to-disk" + /** @} */ @@ -1499,7 +1519,75 @@ typedef enum svn_fs_path_change_kind_t * by the commit API; this does not mean the new value is different from * the old value. * - * @since New in 1.6. */ + * @since New in 1.10. */ +typedef struct svn_fs_path_change3_t +{ + /** path of the node that got changed. */ + svn_string_t path; + + /** kind of change */ + svn_fs_path_change_kind_t change_kind; + + /** what node kind is the path? + (Note: it is legal for this to be #svn_node_unknown.) */ + svn_node_kind_t node_kind; + + /** was the text touched? + * For node_kind=dir: always false. For node_kind=file: + * modify: true iff text touched. + * add (copy): true iff text touched. + * add (plain): always true. + * delete: always false. + * replace: as for the add/copy part of the replacement. + */ + svn_boolean_t text_mod; + + /** were the properties touched? + * modify: true iff props touched. + * add (copy): true iff props touched. + * add (plain): true iff props touched. + * delete: always false. + * replace: as for the add/copy part of the replacement. + */ + svn_boolean_t prop_mod; + + /** was the mergeinfo property touched? + * modify: } true iff svn:mergeinfo property add/del/mod + * add (copy): } and fs format supports this flag. + * add (plain): } + * delete: always false. + * replace: as for the add/copy part of the replacement. + * (Note: Pre-1.9 repositories will report #svn_tristate_unknown.) + */ + svn_tristate_t mergeinfo_mod; + + /** Copyfrom revision and path; this is only valid if copyfrom_known + * is true. */ + svn_boolean_t copyfrom_known; + svn_revnum_t copyfrom_rev; + const char *copyfrom_path; + + /* NOTE! Please update svn_fs_path_change3_create() when adding new + fields here. */ +} svn_fs_path_change3_t; + + +/** Similar to #svn_fs_path_change3_t, but with @a node_rev_id and without + * path information. + * + * @note Fields may be added to the end of this structure in future + * versions. Therefore, to preserve binary compatibility, users + * should not directly allocate structures of this type. + * + * @note The @c text_mod, @c prop_mod and @c mergeinfo_mod flags mean the + * text, properties and mergeinfo property (respectively) were "touched" + * by the commit API; this does not mean the new value is different from + * the old value. + * + * @since New in 1.6. + * + * @deprecated Provided for backwards compatibility with the 1.9 API. + */ typedef struct svn_fs_path_change2_t { /** node revision id of changed path */ @@ -1588,22 +1676,94 @@ svn_fs_path_change2_create(const svn_fs_ svn_fs_path_change_kind_t change_kind, apr_pool_t *pool); +/** + * Allocate an #svn_fs_path_change3_t structure in @a result_pool, + * initialize and return it. + * + * Set the @c change_kind field to @a change_kind. Set all other fields + * to their @c _unknown, @c NULL or invalid value, respectively. + * + * @since New in 1.10. + */ +svn_fs_path_change3_t * +svn_fs_path_change3_create(svn_fs_path_change_kind_t change_kind, + apr_pool_t *result_pool); + +/** + * Return a deep copy of @a *change, allocated in @a result_pool. + * + * @since New in 1.10. + */ +svn_fs_path_change3_t * +svn_fs_path_change3_dup(svn_fs_path_change3_t *change, + apr_pool_t *result_pool); + +/** + * Opaque iterator object type for a changed paths list. + * + * @since New in 1.10. + */ +typedef struct svn_fs_path_change_iterator_t svn_fs_path_change_iterator_t; + +/** + * Set @a *change to the path change that @a iterator currently points to + * and advance the @a iterator. If the change list has been exhausted, + * @a change will be set to @c NULL. + * + * You may modify @a **change but its content becomes invalid as soon as + * either @a iterator becomes invalid or you call this function again. + * + * @note The @c node_kind field in @a change may be #svn_node_unknown and + * the @c copyfrom_known fields may be FALSE. + * + * @since New in 1.10. + */ +svn_error_t * +svn_fs_path_change_get(svn_fs_path_change3_t **change, + svn_fs_path_change_iterator_t *iterator); + + /** Determine what has changed under a @a root. * + * Set @a *iterator to an iterator object, allocated in @a result_pool, + * which will give access to the full list of changed paths under @a root. + * Each call to @a svn_fs_path_change_get will return a new unique path + * change and has amortized O(1) runtime. The iteration order is undefined + * and may change even for the same @a root. + * + * If @a root becomes invalid, @a *iterator becomes invalid, too. + * + * Use @a scratch_pool for temporary allocations. + * + * @note The @a *iterator may be a large object and bind limited system + * resources such as file handles. Be sure to clear the owning + * pool once you don't need that iterator anymore. + * + * @since New in 1.10. + */ +svn_error_t * +svn_fs_paths_changed3(svn_fs_path_change_iterator_t **iterator, + svn_fs_root_t *root, + apr_pool_t *result_pool, + apr_pool_t *scratch_pool); + +/** Same as svn_fs_paths_changed3() but returning all changes in a single, + * large data structure and using a single pool for all allocations. + * * Allocate and return a hash @a *changed_paths2_p containing descriptions * of the paths changed under @a root. The hash is keyed with * <tt>const char *</tt> paths, and has #svn_fs_path_change2_t * values. * - * Callers can assume that this function takes time proportional to - * the amount of data output, and does not need to do tree crawls; - * however, it is possible that some of the @c node_kind fields in the - * #svn_fs_path_change2_t * values will be #svn_node_unknown or - * that and some of the @c copyfrom_known fields will be FALSE. - * * Use @a pool for all allocations, including the hash and its values. * + * @note Retrieving the #node_rev_id element of #svn_fs_path_change2_t may + * be expensive in some FS backends. + * * @since New in 1.6. + * + * @deprecated Provided for backward compatibility with the 1.9 API. */ +SVN_DEPRECATED svn_error_t * svn_fs_paths_changed2(apr_hash_t **changed_paths2_p, svn_fs_root_t *root, Modified: subversion/branches/ra-git/subversion/include/svn_io.h URL: http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/include/svn_io.h?rev=1764214&r1=1764213&r2=1764214&view=diff ============================================================================== --- subversion/branches/ra-git/subversion/include/svn_io.h (original) +++ subversion/branches/ra-git/subversion/include/svn_io.h Tue Oct 11 09:11:50 2016 @@ -918,6 +918,17 @@ typedef svn_error_t *(*svn_stream_seek_f typedef svn_error_t *(*svn_stream_data_available_fn_t)(void *baton, svn_boolean_t *data_available); +/** Readline handler function for a generic stream. @see svn_stream_t and + * svn_stream_readline(). + * + * @since New in 1.10. + */ +typedef svn_error_t *(*svn_stream_readline_fn_t)(void *baton, + svn_stringbuf_t **stringbuf, + const char *eol, + svn_boolean_t *eof, + apr_pool_t *pool); + /** Create a generic stream. @see svn_stream_t. */ svn_stream_t * svn_stream_create(void *baton, @@ -992,6 +1003,14 @@ void svn_stream_set_data_available(svn_stream_t *stream, svn_stream_data_available_fn_t data_available); +/** Set @a stream's readline function to @a readline_fn + * + * @since New in 1.10. + */ +void +svn_stream_set_readline(svn_stream_t *stream, + svn_stream_readline_fn_t readline_fn); + /** Create a stream that is empty for reading and infinite for writing. */ svn_stream_t * svn_stream_empty(apr_pool_t *pool); @@ -1148,8 +1167,8 @@ svn_stream_for_stdout(svn_stream_t **out apr_pool_t *pool); /** Read the contents of @a stream into memory, from its current position - * to its end, returning the data in @a *result. The stream will be closed - * when it has been successfully and completely read. + * to its end, returning the data in @a *result. This function does not + * close the @a stream upon completion. * * @a len_hint gives a hint about the expected length, in bytes, of the * actual data that will be read from the stream. It may be 0, meaning no @@ -1254,6 +1273,24 @@ svn_stream_checksummed(svn_stream_t *str svn_boolean_t read_all, apr_pool_t *pool); +/** Read the contents of the readable stream @a stream and return its + * checksum of type @a kind in @a *checksum. + * + * The stream will be closed before this function returns (regardless + * of the result, or any possible error). + * + * Use @a scratch_pool for temporary allocations and @a result_pool + * to allocate @a *checksum. + * + * @since New in 1.10. + */ +svn_error_t * +svn_stream_contents_checksum(svn_checksum_t **checksum, + svn_stream_t *stream, + svn_checksum_kind_t kind, + apr_pool_t *result_pool, + apr_pool_t *scratch_pool); + /** Read from a generic stream until @a buffer is filled upto @a *len or * until EOF is reached. @see svn_stream_t * Modified: subversion/branches/ra-git/subversion/include/svn_repos.h URL: http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/include/svn_repos.h?rev=1764214&r1=1764213&r2=1764214&view=diff ============================================================================== --- subversion/branches/ra-git/subversion/include/svn_repos.h (original) +++ subversion/branches/ra-git/subversion/include/svn_repos.h Tue Oct 11 09:11:50 2016 @@ -1870,13 +1870,132 @@ svn_repos_node_location_segments(svn_rep /* Retrieving log messages. */ +/** Path change descriptor. + * + * @note Identical to #svn_fs_path_change3_t but with all information + * known, i.e. @a node_kind is never #svn_node_unknown and + * @a copyfrom_known is always @c TRUE. + * + * @see svn_fs_path_change3_t + * + * @since New in 1.10. + */ +typedef svn_fs_path_change3_t svn_repos_path_change_t; + +/** The callback invoked by log message loopers, such as + * svn_repos_get_logs5(). + * + * This function is invoked once on each changed path, in a potentially + * random order that may even change between invocations for the same + * revisions. + * + * @a baton is what you think it is, and @a change contains relevant + * information for the changed path. Please note that @a change may be + * modified within this callback but it will become invalid as soon as + * the callback returns. + * + * Use @a scratch_pool for temporary allocation. The caller may clear it + * between or after invocations. + * + * @since New in 1.10. + */ +typedef svn_error_t *(*svn_repos_path_change_receiver_t)( + void *baton, + svn_repos_path_change_t *change, + apr_pool_t *scratch_pool); + /** - * Invoke @a receiver with @a receiver_baton on each log message from - * @a start to @a end in @a repos's filesystem. @a start may be greater - * or less than @a end; this just controls whether the log messages are + * A structure to represent all the information about a particular log entry. + * + * @since New in 1.10. + */ +typedef struct svn_repos_log_entry_t +{ + /** The revision of the commit. */ + svn_revnum_t revision; + + /** The hash of requested revision properties, which may be NULL if it + * would contain no revprops. Maps (const char *) property name to + * (svn_string_t *) property value. */ + apr_hash_t *revprops; + + /** + * Whether or not this message has children. + * + * When a log operation requests additional merge information, extra log + * entries may be returned as a result of this entry. The new entries, are + * considered children of the original entry, and will follow it. When + * the HAS_CHILDREN flag is set, the receiver should increment its stack + * depth, and wait until an entry is provided with SVN_INVALID_REVNUM which + * indicates the end of the children. + * + * For log operations which do not request additional merge information, the + * HAS_CHILDREN flag is always FALSE. + * + * For more information see: + * https://svn.apache.org/repos/asf/subversion/trunk/notes/merge-tracking/design.html#commutative-reporting + */ + svn_boolean_t has_children; + + /** + * Whether @a revision should be interpreted as non-inheritable in the + * same sense of #svn_merge_range_t. + * + * Currently always FALSE. + */ + svn_boolean_t non_inheritable; + + /** + * Whether @a revision is a merged revision resulting from a reverse merge. + */ + svn_boolean_t subtractive_merge; + + /* NOTE: Add new fields at the end to preserve binary compatibility. */ +} svn_repos_log_entry_t; + + +/** The callback invoked by log message loopers, such as + * svn_repos_get_logs5(). + * + * This function is invoked once on each log message, in the order + * determined by the caller (see above-mentioned functions). + * + * @a baton is what you think it is, and @a log_entry contains relevant + * information for the log message. + * + * If @a log_entry->has_children is @c TRUE, the message will be followed + * immediately by any number of merged revisions (child messages), which are + * terminated by an invocation with SVN_INVALID_REVNUM. This usage may + * be recursive. + * + * Use @a scratch_pool for temporary allocation. The caller may clear it + * between or after invocations. + * + * @since New in 1.10. + */ +typedef svn_error_t *(*svn_repos_log_entry_receiver_t)( + void *baton, + svn_repos_log_entry_t *log_entry, + apr_pool_t *scratch_pool); + + +/** + * Invoke @a revision_receiver with @a revision_receiver_baton on each + * revision from @a start to @a end in @a repos's filesystem. @a start may + * be greater or less than @a end; this just controls whether the log is * processed in descending or ascending revision number order. * + * If not @c NULL, @a path_change_receiver will be invoked with + * @a path_change_receiver_baton for each changed path in the respective + * revision. These changes will be reported before the @a revision_receiver + * is invoked for that revision. So, for each revision in the log, there + * is a number of calls to @a path_change_receiver followed by a single + * invocation of @a revision_receiver, implicitly marking the end of the + * changes list for that revision. If a revision does not contain any + * changes (or if none are visible due to @a authz_read_func), + * @a path_change_receiver will not be called for that revision. + * * If @a start or @a end is #SVN_INVALID_REVNUM, it defaults to youngest. * * If @a paths is non-NULL and has one or more elements, then only show @@ -1887,13 +2006,8 @@ svn_repos_node_location_segments(svn_rep * show all revisions regardless of what paths were changed in those * revisions. * - * If @a limit is greater than zero then only invoke @a receiver on the first - * @a limit logs. - * - * If @a discover_changed_paths, then each call to @a receiver passes a - * hash mapping paths committed in that revision to information about them - * as the receiver's @a changed_paths argument. - * Otherwise, each call to @a receiver passes NULL for @a changed_paths. + * If @a limit is greater than zero then only invoke @a revision_receiver + * on the first @a limit logs. * * If @a strict_node_history is set, copy history (if any exists) will * not be traversed while harvesting revision logs for each path. @@ -1908,28 +2022,64 @@ svn_repos_node_location_segments(svn_rep * only the revision properties named by the (const char *) array elements * (i.e. retrieve none if the array is empty). * - * If any invocation of @a receiver returns error, return that error - * immediately and without wrapping it. + * If any invocation of @a revision_receiver or @a path_change_receiver + * returnn an error, return that error immediately and without wrapping it. * * If @a start or @a end is a non-existent revision, return the error - * #SVN_ERR_FS_NO_SUCH_REVISION, without ever invoking @a receiver. + * #SVN_ERR_FS_NO_SUCH_REVISION, without ever invoking @a revision_receiver. * * If optional @a authz_read_func is non-NULL, then use this function * (along with optional @a authz_read_baton) to check the readability * of each changed-path in each revision about to be "pushed" at - * @a receiver. If a revision has some changed-paths readable and - * others unreadable, unreadable paths are omitted from the - * changed_paths field and only svn:author and svn:date will be - * available in the revprops field. If a revision has no - * changed-paths readable at all, then all paths are omitted and no - * revprops are available. + * @a path_change_receiver. If a revision has some changed-paths readable + * and others unreadable, unreadable paths are omitted from the + * @a path_change_receiver invocations and only svn:author and svn:date + * will be available in the revprops field in the @a revision_receiver + * callback. If a revision has no changed-paths readable at all, then all + * paths are omitted and no revprops are available. If + * @a path_change_receiver is @c NULL, the same filtering is performed + * just without reporting any path changes. + * + * Use @a scratch_pool for temporary allocations. * - * See also the documentation for #svn_log_entry_receiver_t. + * @see svn_repos_path_change_receiver_t, svn_repos_log_entry_receiver_t * - * Use @a pool for temporary allocations. + * @since New in 1.10. + */ +svn_error_t * +svn_repos_get_logs5(svn_repos_t *repos, + const apr_array_header_t *paths, + svn_revnum_t start, + svn_revnum_t end, + int limit, + svn_boolean_t strict_node_history, + svn_boolean_t include_merged_revisions, + const apr_array_header_t *revprops, + svn_repos_authz_func_t authz_read_func, + void *authz_read_baton, + svn_repos_path_change_receiver_t path_change_receiver, + void *path_change_receiver_baton, + svn_repos_log_entry_receiver_t revision_receiver, + void *revision_receiver_baton, + apr_pool_t *scratch_pool); + +/** + * Similar to svn_repos_get_logs5 but using a #svn_log_entry_receiver_t + * @a receiver to receive revision properties and changed paths through a + * single callback and the @a discover_changed_paths flag to control it. + * + * If @a discover_changed_paths, then each call to @a receiver passes a + * hash mapping paths committed in that revision to information about them + * as the receiver's @a changed_paths argument. + * Otherwise, each call to @a receiver passes NULL for @a changed_paths. + * + * @see svn_log_entry_receiver_t * * @since New in 1.5. + * + * @deprecated Provided for backward compatibility with the 1.9 API. */ +SVN_DEPRECATED svn_error_t * svn_repos_get_logs4(svn_repos_t *repos, const apr_array_header_t *paths, Modified: subversion/branches/ra-git/subversion/include/svn_types.h URL: http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/include/svn_types.h?rev=1764214&r1=1764213&r2=1764214&view=diff ============================================================================== --- subversion/branches/ra-git/subversion/include/svn_types.h (original) +++ subversion/branches/ra-git/subversion/include/svn_types.h Tue Oct 11 09:11:50 2016 @@ -416,7 +416,7 @@ svn_tristate__from_word(const char * wor * 2. Creating a new textual name similar to * SVN_SUBST__SPECIAL_LINK_STR in libsvn_subr/subst.c. * 3. Handling the translation/detranslation case for the new type in - * create_special_file and detranslate_special_file, using the + * create_special_file_from_stream and detranslate_special_file, using the * routines from 1. */ @@ -1078,6 +1078,11 @@ typedef svn_error_t *(*svn_log_message_r * @a commit_info, along with the @a baton closure. * @a pool can be used for temporary allocations. * + * @note Implementers of this callback that pass this callback to + * svn_ra_get_commit_editor3() should be careful with returning errors + * as these might be returned as commit errors. See the documentation + * of svn_ra_get_commit_editor3() for more details. + * * @since New in 1.4. */ typedef svn_error_t *(*svn_commit_callback2_t)( Modified: subversion/branches/ra-git/subversion/include/svn_wc.h URL: http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/include/svn_wc.h?rev=1764214&r1=1764213&r2=1764214&view=diff ============================================================================== --- subversion/branches/ra-git/subversion/include/svn_wc.h (original) +++ subversion/branches/ra-git/subversion/include/svn_wc.h Tue Oct 11 09:11:50 2016 @@ -998,7 +998,10 @@ typedef enum svn_wc_notify_action_t /** A revert operation has failed. */ svn_wc_notify_failed_revert, - /** Resolving a conflict. */ + /** All conflicts on a path were marked as resolved. + * @note As of 1.10, separate notifications are sent for individually + * resolved text, property, and tree conflicts. This notification is used + * only if all conflicts on a path were marked resolved at once. */ svn_wc_notify_resolved, /** Skipping a path. */ @@ -1274,7 +1277,34 @@ typedef enum svn_wc_notify_action_t /** Finalizing commit. * @since New in 1.9. */ - svn_wc_notify_commit_finalizing + svn_wc_notify_commit_finalizing, + + /** All text conflicts in a file were marked as resolved. + * @since New in 1.10. */ + svn_wc_notify_resolved_text, + + /** A property conflict on a path was marked as resolved. + * The name of the property is specified in #svn_wc_notify_t.prop_name. + * @since New in 1.10. */ + svn_wc_notify_resolved_prop, + + /** A tree conflict on a path was marked as resolved. + * @since New in 1.10. */ + svn_wc_notify_resolved_tree, + + /** Starting to search the repository for details about a tree conflict. + * @since New in 1.10. */ + svn_wc_notify_begin_search_tree_conflict_details, + + /** Progressing in search of repository for details about a tree conflict. + * The revision being searched is specified in #svn_wc_notify_t.revision. + * @since New in 1.10. */ + svn_wc_notify_tree_conflict_details_progress, + + /** Done searching the repository for details about a conflict. + * @since New in 1.10. */ + svn_wc_notify_end_search_tree_conflict_details, + } svn_wc_notify_action_t; @@ -5054,7 +5084,11 @@ svn_wc_remove_from_revision_control(svn_ * Temporary allocations will be performed in @a scratch_pool. * * @since New in 1.7. + * @deprecated Provided for backward compatibility with the 1.9 API. + * Use svn_client_conflict_text_resolve(), svn_client_conflict_prop_resolve(), + * and svn_client_conflict_tree_resolve() instead. */ +SVN_DEPRECATED svn_error_t * svn_wc_resolved_conflict5(svn_wc_context_t *wc_ctx, const char *local_abspath, Modified: subversion/branches/ra-git/subversion/include/svn_x509.h URL: http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/include/svn_x509.h?rev=1764214&r1=1764213&r2=1764214&view=diff ============================================================================== --- subversion/branches/ra-git/subversion/include/svn_x509.h (original) +++ subversion/branches/ra-git/subversion/include/svn_x509.h Tue Oct 11 09:11:50 2016 @@ -166,7 +166,7 @@ svn_x509_certinfo_get_valid_from(const s * * @since New in 1.9. */ -const apr_time_t +apr_time_t svn_x509_certinfo_get_valid_to(const svn_x509_certinfo_t *certinfo); /** Modified: subversion/branches/ra-git/subversion/libsvn_client/client.h URL: http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/libsvn_client/client.h?rev=1764214&r1=1764213&r2=1764214&view=diff ============================================================================== --- subversion/branches/ra-git/subversion/libsvn_client/client.h (original) +++ subversion/branches/ra-git/subversion/libsvn_client/client.h Tue Oct 11 09:11:50 2016 @@ -1185,6 +1185,88 @@ svn_client__remote_propget(apr_hash_t *p apr_pool_t *result_pool, apr_pool_t *scratch_pool); +/* */ +typedef struct merge_source_t +{ + /* "left" side URL and revision (inclusive iff youngest) */ + const svn_client__pathrev_t *loc1; + + /* "right" side URL and revision (inclusive iff youngest) */ + const svn_client__pathrev_t *loc2; + + /* True iff LOC1 is an ancestor of LOC2 or vice-versa (history-wise). */ + svn_boolean_t ancestral; +} merge_source_t; + +/* Description of the merge target root node (a WC working node) */ +typedef struct merge_target_t +{ + /* Absolute path to the WC node */ + const char *abspath; + + /* The repository location of the base node of the target WC. If the node + * is locally added, then URL & REV are NULL & SVN_INVALID_REVNUM. + * REPOS_ROOT_URL and REPOS_UUID are always valid. */ + svn_client__pathrev_t loc; + +} merge_target_t; + +/* + * Similar API to svn_client_merge_peg5(). + */ +svn_error_t * +svn_client__merge_elements(svn_boolean_t *use_sleep, + apr_array_header_t *merge_sources, + merge_target_t *target, + svn_ra_session_t *ra_session, + svn_boolean_t diff_ignore_ancestry, + svn_boolean_t force_delete, + svn_boolean_t dry_run, + const apr_array_header_t *merge_options, + svn_client_ctx_t *ctx, + apr_pool_t *result_pool, + apr_pool_t *scratch_pool); + +/* Data for reporting when a merge aborted because of raising conflicts. + * + * ### TODO: More info, including the ranges (or other parameters) the user + * needs to complete the merge. + */ +typedef struct svn_client__conflict_report_t +{ + const char *target_abspath; + /* The revision range during which conflicts were raised */ + const merge_source_t *conflicted_range; + /* Was the conflicted range the last range in the whole requested merge? */ + svn_boolean_t was_last_range; +} svn_client__conflict_report_t; + +/* Create and return an error structure appropriate for the unmerged + revisions range(s). */ +svn_error_t * +svn_client__make_merge_conflict_error(svn_client__conflict_report_t *report, + apr_pool_t *scratch_pool); + +/* The body of svn_client_merge5(), which see for details. */ +svn_error_t * +svn_client__merge_locked(svn_client__conflict_report_t **conflict_report, + const char *source1, + const svn_opt_revision_t *revision1, + const char *source2, + const svn_opt_revision_t *revision2, + const char *target_abspath, + svn_depth_t depth, + svn_boolean_t ignore_mergeinfo, + svn_boolean_t diff_ignore_ancestry, + svn_boolean_t force_delete, + svn_boolean_t record_only, + svn_boolean_t dry_run, + svn_boolean_t allow_mixed_rev, + const apr_array_header_t *merge_options, + svn_client_ctx_t *ctx, + apr_pool_t *result_pool, + apr_pool_t *scratch_pool); + #ifdef __cplusplus } #endif /* __cplusplus */ Modified: subversion/branches/ra-git/subversion/libsvn_client/copy.c URL: http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/libsvn_client/copy.c?rev=1764214&r1=1764213&r2=1764214&view=diff ============================================================================== --- subversion/branches/ra-git/subversion/libsvn_client/copy.c (original) +++ subversion/branches/ra-git/subversion/libsvn_client/copy.c Tue Oct 11 09:11:50 2016 @@ -2415,10 +2415,10 @@ repos_to_wc_copy_single(svn_boolean_t *t *timestamp_sleep = TRUE; - /* Schedule dst_path for addition in parent, with copy history. - Don't send any notification here. - Then remove the temporary checkout's .svn dir in preparation for - moving the rest of it into the final destination. */ + /* Schedule dst_path for addition in parent, with copy history. + Don't send any notification here. + Then remove the temporary checkout's .svn dir in preparation for + moving the rest of it into the final destination. */ SVN_ERR(svn_wc_copy3(ctx->wc_ctx, tmp_abspath, dst_abspath, TRUE /* metadata_only */, ctx->cancel_func, ctx->cancel_baton, Modified: subversion/branches/ra-git/subversion/libsvn_client/diff.c URL: http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/libsvn_client/diff.c?rev=1764214&r1=1764213&r2=1764214&view=diff ============================================================================== --- subversion/branches/ra-git/subversion/libsvn_client/diff.c (original) +++ subversion/branches/ra-git/subversion/libsvn_client/diff.c Tue Oct 11 09:11:50 2016 @@ -726,12 +726,13 @@ diff_props_changed(const char *diff_relp return SVN_NO_ERROR; } -/* Given a file TMPFILE, return a path to a temporary file that lives at least - as long as RESULT_POOL, containing the git-like represention of TMPFILE */ +/* Given a file ORIG_TMPFILE, return a path to a temporary file that lives at + * least as long as RESULT_POOL, containing the git-like represention of + * ORIG_TMPFILE */ static svn_error_t * transform_link_to_git(const char **new_tmpfile, const char **git_sha1, - const char *tmpfile, + const char *orig_tmpfile, apr_pool_t *result_pool, apr_pool_t *scratch_pool) { @@ -741,7 +742,7 @@ transform_link_to_git(const char **new_t *git_sha1 = NULL; - SVN_ERR(svn_io_file_open(&orig, tmpfile, APR_READ, APR_OS_DEFAULT, + SVN_ERR(svn_io_file_open(&orig, orig_tmpfile, APR_READ, APR_OS_DEFAULT, scratch_pool)); SVN_ERR(svn_io_open_unique_file3(&gitlike, new_tmpfile, NULL, svn_io_file_del_on_pool_cleanup, @@ -773,7 +774,7 @@ transform_link_to_git(const char **new_t else { /* Not a link... so can't convert */ - *new_tmpfile = apr_pstrdup(result_pool, tmpfile); + *new_tmpfile = apr_pstrdup(result_pool, orig_tmpfile); } SVN_ERR(svn_io_file_close(orig, scratch_pool)); @@ -2238,22 +2239,20 @@ diff_repos_wc(const char **root_relpath, else diff_depth = svn_depth_unknown; - + /* Tell the RA layer we want a delta to change our txn to URL1 */ + SVN_ERR(svn_ra_do_diff3(ra_session, + &reporter, &reporter_baton, + loc1->rev, + target, + diff_depth, + ignore_ancestry, + TRUE, /* text_deltas */ + loc1->url, + diff_editor, diff_edit_baton, + scratch_pool)); if (is_copy && revision2_kind != svn_opt_revision_base) { - /* Tell the RA layer we want a delta to change our txn to URL1 */ - SVN_ERR(svn_ra_do_diff3(ra_session, - &reporter, &reporter_baton, - loc1->rev, - target, - diff_depth, - ignore_ancestry, - TRUE, /* text_deltas */ - loc1->url, - diff_editor, diff_edit_baton, - scratch_pool)); - /* Report the copy source. */ if (cf_depth == svn_depth_unknown) cf_depth = svn_depth_infinity; @@ -2277,18 +2276,6 @@ diff_repos_wc(const char **root_relpath, } else { - /* Tell the RA layer we want a delta to change our txn to URL1 */ - SVN_ERR(svn_ra_do_diff3(ra_session, - &reporter, &reporter_baton, - loc1->rev, - target, - diff_depth, - ignore_ancestry, - TRUE, /* text_deltas */ - loc1->url, - diff_editor, diff_edit_baton, - scratch_pool)); - /* Create a txn mirror of path2; the diff editor will print diffs in reverse. :-) */ SVN_ERR(svn_wc_crawl_revisions5(ctx->wc_ctx, abspath2, Modified: subversion/branches/ra-git/subversion/libsvn_client/diff_local.c URL: http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/libsvn_client/diff_local.c?rev=1764214&r1=1764213&r2=1764214&view=diff ============================================================================== --- subversion/branches/ra-git/subversion/libsvn_client/diff_local.c (original) +++ subversion/branches/ra-git/subversion/libsvn_client/diff_local.c Tue Oct 11 09:11:50 2016 @@ -179,7 +179,7 @@ inner_dir_diff(const char *left_abspath, { svn_error_clear(err); right_dirents = apr_hash_make(scratch_pool); - right_only = TRUE; + left_only = TRUE; } else SVN_ERR(err); @@ -669,9 +669,6 @@ svn_client__arbitrary_nodes_diff(const c SVN_ERR(svn_io_check_resolved_path(left_abspath, &left_kind, scratch_pool)); SVN_ERR(svn_io_check_resolved_path(right_abspath, &right_kind, scratch_pool)); - if (depth == svn_depth_unknown) - depth = svn_depth_infinity; - if (left_kind == svn_node_dir && right_kind == svn_node_dir) { left_root_abspath = left_abspath; Modified: subversion/branches/ra-git/subversion/libsvn_client/externals.c URL: http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/libsvn_client/externals.c?rev=1764214&r1=1764213&r2=1764214&view=diff ============================================================================== --- subversion/branches/ra-git/subversion/libsvn_client/externals.c (original) +++ subversion/branches/ra-git/subversion/libsvn_client/externals.c Tue Oct 11 09:11:50 2016 @@ -534,7 +534,7 @@ switch_file_external(const char *local_a SVN_ERR(svn_io_check_path(local_abspath, &disk_kind, scratch_pool)); - if (kind == svn_node_file || kind == svn_node_dir) + if (disk_kind == svn_node_file || disk_kind == svn_node_dir) return svn_error_createf(SVN_ERR_WC_PATH_FOUND, NULL, _("The file external '%s' can not be " "created because the node exists."),