1/*
2 * conflicts.h: declarations related to conflicts
3 *
4 * ====================================================================
5 *    Licensed to the Apache Software Foundation (ASF) under one
6 *    or more contributor license agreements.  See the NOTICE file
7 *    distributed with this work for additional information
8 *    regarding copyright ownership.  The ASF licenses this file
9 *    to you under the Apache License, Version 2.0 (the
10 *    "License"); you may not use this file except in compliance
11 *    with the License.  You may obtain a copy of the License at
12 *
13 *      http://www.apache.org/licenses/LICENSE-2.0
14 *
15 *    Unless required by applicable law or agreed to in writing,
16 *    software distributed under the License is distributed on an
17 *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
18 *    KIND, either express or implied.  See the License for the
19 *    specific language governing permissions and limitations
20 *    under the License.
21 * ====================================================================
22 */
23
24#ifndef SVN_WC_CONFLICTS_H
25#define SVN_WC_CONFLICTS_H
26
27#include <apr_pools.h>
28
29#include "svn_types.h"
30#include "svn_wc.h"
31
32#include "wc_db.h"
33#include "private/svn_skel.h"
34
35#ifdef __cplusplus
36extern "C" {
37#endif /* __cplusplus */
38
39
40
41#define SVN_WC__CONFLICT_OP_UPDATE "update"
42#define SVN_WC__CONFLICT_OP_SWITCH "switch"
43#define SVN_WC__CONFLICT_OP_MERGE "merge"
44#define SVN_WC__CONFLICT_OP_PATCH "patch"
45
46#define SVN_WC__CONFLICT_KIND_TEXT "text"
47#define SVN_WC__CONFLICT_KIND_PROP "prop"
48#define SVN_WC__CONFLICT_KIND_TREE "tree"
49#define SVN_WC__CONFLICT_KIND_REJECT "reject"
50#define SVN_WC__CONFLICT_KIND_OBSTRUCTED "obstructed"
51
52#define SVN_WC__CONFLICT_SRC_SUBVERSION "subversion"
53
54/* Return a new conflict skel, allocated in RESULT_POOL.
55
56   Typically creating a conflict starts with calling this function and then
57   collecting details via one or more calls to svn_wc__conflict_skel_add_*().
58
59   The caller can then (when necessary) add operation details via
60   svn_wc__conflict_skel_set_op_*() and store the resulting conflict together
61   with the result of its operation in the working copy database.
62*/
63svn_skel_t *
64svn_wc__conflict_skel_create(apr_pool_t *result_pool);
65
66/* Return a boolean in *COMPLETE indicating whether CONFLICT_SKEL contains
67   everything needed for installing in the working copy database.
68
69   This typically checks if CONFLICT_SKEL contains at least one conflict
70   and an operation.
71 */
72svn_error_t *
73svn_wc__conflict_skel_is_complete(svn_boolean_t *complete,
74                                  const svn_skel_t *conflict_skel);
75
76
77/* Set 'update' as the conflicting operation in CONFLICT_SKEL.
78   Allocate data stored in the skel in RESULT_POOL.
79
80   ORIGINAL and TARGET specify the BASE node before and after updating.
81
82   It is an error to set another operation to a conflict skel that
83   already has an operation.
84
85   Do temporary allocations in SCRATCH_POOL. The new skel data is
86   completely stored in RESULT-POOL. */
87svn_error_t *
88svn_wc__conflict_skel_set_op_update(svn_skel_t *conflict_skel,
89                                    const svn_wc_conflict_version_t *original,
90                                    const svn_wc_conflict_version_t *target,
91                                    apr_pool_t *result_pool,
92                                    apr_pool_t *scratch_pool);
93
94
95/* Set 'switch' as the conflicting operation in CONFLICT_SKEL.
96   Allocate data stored in the skel in RESULT_POOL.
97
98   ORIGINAL and TARGET specify the BASE node before and after switching.
99
100   It is an error to set another operation to a conflict skel that
101   already has an operation.
102
103   Do temporary allocations in SCRATCH_POOL. */
104svn_error_t *
105svn_wc__conflict_skel_set_op_switch(svn_skel_t *conflict_skel,
106                                    const svn_wc_conflict_version_t *original,
107                                    const svn_wc_conflict_version_t *target,
108                                    apr_pool_t *result_pool,
109                                    apr_pool_t *scratch_pool);
110
111
112/* Set 'merge' as conflicting operation in CONFLICT_SKEL.
113   Allocate data stored in the skel in RESULT_POOL.
114
115   LEFT and RIGHT paths are the merge-left and merge-right merge
116   sources of the merge.
117
118   It is an error to set another operation to a conflict skel that
119   already has an operation.
120
121   Do temporary allocations in SCRATCH_POOL. */
122svn_error_t *
123svn_wc__conflict_skel_set_op_merge(svn_skel_t *conflict_skel,
124                                   const svn_wc_conflict_version_t *left,
125                                   const svn_wc_conflict_version_t *right,
126                                   apr_pool_t *result_pool,
127                                   apr_pool_t *scratch_pool);
128
129
130/* Add a text conflict to CONFLICT_SKEL.
131   Allocate data stored in the skel in RESULT_POOL.
132
133   The DB, WRI_ABSPATH pair specifies in which working copy the conflict
134   will be recorded. (Needed for making the paths relative).
135
136   MINE_ABSPATH, THEIR_OLD_ABSPATH and THEIR_ABSPATH specify the marker
137   files for this text conflict. Each of these values can be NULL to specify
138   that the node doesn't exist in this case.
139
140   ### It is expected that in a future version we will also want to store
141   ### the sha1 checksum of these files to allow reinstalling the conflict
142   ### markers from the pristine store.
143
144   It is an error to add another text conflict to a conflict skel that
145   already contains a text conflict.
146
147   Do temporary allocations in SCRATCH_POOL.
148*/
149svn_error_t *
150svn_wc__conflict_skel_add_text_conflict(svn_skel_t *conflict_skel,
151                                        svn_wc__db_t *db,
152                                        const char *wri_abspath,
153                                        const char *mine_abspath,
154                                        const char *their_old_abspath,
155                                        const char *their_abspath,
156                                        apr_pool_t *result_pool,
157                                        apr_pool_t *scratch_pool);
158
159
160/* Add property conflict details to CONFLICT_SKEL.
161   Allocate data stored in the skel in RESULT_POOL.
162
163   The DB, WRI_ABSPATH pair specifies in which working copy the conflict
164   will be recorded. (Needed for making the paths relative).
165
166   The MARKER_ABSPATH is NULL when raising a conflict in v1.8+.  See below.
167
168   The MINE_PROPS, THEIR_OLD_PROPS and THEIR_PROPS are hashes mapping a
169   const char * property name to a const svn_string_t* value.
170
171   The CONFLICTED_PROP_NAMES is a const char * property name value mapping
172   to "", recording which properties aren't resolved yet in the current
173   property values.
174   ### Needed for creating the marker file from this conflict data.
175   ### Would also allow per property marking as resolved.
176   ### Maybe useful for calling (legacy) conflict resolvers that expect one
177   ### property conflict per invocation.
178
179   When raising a property conflict in the course of upgrading an old WC,
180   MARKER_ABSPATH is the path to the file containing a human-readable
181   description of the conflict, MINE_PROPS and THEIR_OLD_PROPS and
182   THEIR_PROPS are all NULL, and CONFLICTED_PROP_NAMES is an empty hash.
183
184   It is an error to add another prop conflict to a conflict skel that
185   already contains a prop conflict.  (A single call to this function can
186   record that multiple properties are in conflict.)
187
188   Do temporary allocations in SCRATCH_POOL.
189*/
190svn_error_t *
191svn_wc__conflict_skel_add_prop_conflict(svn_skel_t *conflict_skel,
192                                        svn_wc__db_t *db,
193                                        const char *wri_abspath,
194                                        const char *marker_abspath,
195                                        const apr_hash_t *mine_props,
196                                        const apr_hash_t *their_old_props,
197                                        const apr_hash_t *their_props,
198                                        const apr_hash_t *conflicted_prop_names,
199                                        apr_pool_t *result_pool,
200                                        apr_pool_t *scratch_pool);
201
202
203/* Add a tree conflict to CONFLICT_SKEL.
204   Allocate data stored in the skel in RESULT_POOL.
205
206   LOCAL_CHANGE is the local tree change made to the node.
207   INCOMING_CHANGE is the incoming change made to the node.
208
209   MOVE_SRC_OP_ROOT_ABSPATH must be set when LOCAL_CHANGE is
210   svn_wc_conflict_reason_moved_away and NULL otherwise and the operation
211   is svn_wc_operation_update or svn_wc_operation_switch.  It should be
212   set to the op-root of the move-away unless the move is inside a
213   delete in which case it should be set to the op-root of the delete
214   (the delete can be a replace). So given:
215       A/B/C moved away (1)
216       A deleted and replaced
217       A/B/C moved away (2)
218       A/B deleted
219   MOVE_SRC_OP_ROOT_ABSPATH should be A for a conflict associated
220   with (1), MOVE_SRC_OP_ROOT_ABSPATH should be A/B for a conflict
221   associated with (2).
222
223   It is an error to add another tree conflict to a conflict skel that
224   already contains a tree conflict.  (It is not an error, at this level,
225   to add a tree conflict to an existing text or property conflict skel.)
226
227   Do temporary allocations in SCRATCH_POOL.
228*/
229svn_error_t *
230svn_wc__conflict_skel_add_tree_conflict(svn_skel_t *conflict_skel,
231                                        svn_wc__db_t *db,
232                                        const char *wri_abspath,
233                                        svn_wc_conflict_reason_t local_change,
234                                        svn_wc_conflict_action_t incoming_change,
235                                        const char *move_src_op_root_abspath,
236                                        apr_pool_t *result_pool,
237                                        apr_pool_t *scratch_pool);
238
239/* Allows resolving specific conflicts stored in CONFLICT_SKEL.
240
241   When RESOLVE_TEXT is TRUE and CONFLICT_SKEL contains a text conflict,
242   resolve/remove the text conflict in CONFLICT_SKEL.
243
244   When RESOLVE_PROP is "" and CONFLICT_SKEL contains a property conflict,
245   resolve/remove all property conflicts in CONFLICT_SKEL.
246
247   When RESOLVE_PROP is not NULL and not "", remove the property conflict on
248   the property RESOLVE_PROP in CONFLICT_SKEL. When RESOLVE_PROP was the last
249   property in CONFLICT_SKEL remove the property conflict info from
250   CONFLICT_SKEL.
251
252   When RESOLVE_TREE is TRUE and CONFLICT_SKEL contains a tree conflict,
253   resolve/remove the tree conflict in CONFLICT_SKEL.
254
255   If COMPLETELY_RESOLVED is not NULL, then set *COMPLETELY_RESOLVED to TRUE,
256   when no conflict registration is left in CONFLICT_SKEL after editting,
257   otherwise to FALSE.
258
259   Allocate data stored in the skel in RESULT_POOL.
260
261   This functions edits CONFLICT_SKEL. New skels might be created in
262   RESULT_POOL. Temporary allocations will use SCRATCH_POOL.
263 */
264/* ### db, wri_abspath is currently unused. Remove? */
265svn_error_t *
266svn_wc__conflict_skel_resolve(svn_boolean_t *completely_resolved,
267                              svn_skel_t *conflict_skel,
268                              svn_wc__db_t *db,
269                              const char *wri_abspath,
270                              svn_boolean_t resolve_text,
271                              const char *resolve_prop,
272                              svn_boolean_t resolve_tree,
273                              apr_pool_t *result_pool,
274                              apr_pool_t *scratch_pool);
275
276/*
277 * -----------------------------------------------------------
278 * Reading conflict skels. Maybe this can be made private later
279 * -----------------------------------------------------------
280 */
281
282/* Read common information from CONFLICT_SKEL to determine the operation
283 * and merge origins.
284 *
285 * Output arguments can be NULL if the value is not necessary.
286 *
287 * Set *LOCATIONS to an array of (svn_wc_conflict_version_t *).  For
288 * conflicts written by current code, there are 2 elements: index [0] is
289 * the 'old' or 'left' side and [1] is the 'new' or 'right' side.
290 *
291 * For conflicts written by 1.6 or 1.7 there are 2 locations for a tree
292 * conflict, but none for a text or property conflict.
293 *
294 * TEXT_, PROP_ and TREE_CONFLICTED (when not NULL) will be set to TRUE
295 * when the conflict contains the specified kind of conflict, otherwise
296 * to false.
297 *
298 * Allocate the result in RESULT_POOL. Perform temporary allocations in
299 * SCRATCH_POOL.
300 */
301svn_error_t *
302svn_wc__conflict_read_info(svn_wc_operation_t *operation,
303                           const apr_array_header_t **locations,
304                           svn_boolean_t *text_conflicted,
305                           svn_boolean_t *prop_conflicted,
306                           svn_boolean_t *tree_conflicted,
307                           svn_wc__db_t *db,
308                           const char *wri_abspath,
309                           const svn_skel_t *conflict_skel,
310                           apr_pool_t *result_pool,
311                           apr_pool_t *scratch_pool);
312
313/* Reads back the original data stored by svn_wc__conflict_skel_add_text_conflict()
314 * in CONFLICT_SKEL for a node in DB, WRI_ABSPATH.
315 *
316 * Values as documented for svn_wc__conflict_skel_add_text_conflict().
317 *
318 * Output arguments can be NULL if the value is not necessary.
319 *
320 * Allocate the result in RESULT_POOL. Perform temporary allocations in
321 * SCRATCH_POOL.
322 */
323svn_error_t *
324svn_wc__conflict_read_text_conflict(const char **mine_abspath,
325                                    const char **their_old_abspath,
326                                    const char **their_abspath,
327                                    svn_wc__db_t *db,
328                                    const char *wri_abspath,
329                                    const svn_skel_t *conflict_skel,
330                                    apr_pool_t *result_pool,
331                                    apr_pool_t *scratch_pool);
332
333/* Reads back the original data stored by svn_wc__conflict_skel_add_prop_conflict()
334 * in CONFLICT_SKEL for a node in DB, WRI_ABSPATH.
335 *
336 * Values as documented for svn_wc__conflict_skel_add_prop_conflict().
337 *
338 * Output arguments can be NULL if the value is not necessary
339 * Allocate the result in RESULT_POOL. Perform temporary allocations in
340 * SCRATCH_POOL.
341 */
342svn_error_t *
343svn_wc__conflict_read_prop_conflict(const char **marker_abspath,
344                                    apr_hash_t **mine_props,
345                                    apr_hash_t **their_old_props,
346                                    apr_hash_t **their_props,
347                                    apr_hash_t **conflicted_prop_names,
348                                    svn_wc__db_t *db,
349                                    const char *wri_abspath,
350                                    const svn_skel_t *conflict_skel,
351                                    apr_pool_t *result_pool,
352                                    apr_pool_t *scratch_pool);
353
354/* Reads back the original data stored by svn_wc__conflict_skel_add_tree_conflict()
355 * in CONFLICT_SKEL for a node in DB, WRI_ABSPATH.
356 *
357 * Values as documented for svn_wc__conflict_skel_add_tree_conflict().
358 *
359 * Output arguments can be NULL if the value is not necessary
360 * Allocate the result in RESULT_POOL. Perform temporary allocations in
361 * SCRATCH_POOL.
362 */
363svn_error_t *
364svn_wc__conflict_read_tree_conflict(svn_wc_conflict_reason_t *local_change,
365                                    svn_wc_conflict_action_t *incoming_change,
366                                    const char **move_src_op_root_abspath,
367                                    svn_wc__db_t *db,
368                                    const char *wri_abspath,
369                                    const svn_skel_t *conflict_skel,
370                                    apr_pool_t *result_pool,
371                                    apr_pool_t *scratch_pool);
372
373/* Reads in *MARKERS a list of const char * absolute paths of the marker files
374   referenced from CONFLICT_SKEL.
375 * Allocate the result in RESULT_POOL. Perform temporary allocations in
376 * SCRATCH_POOL.
377 */
378svn_error_t *
379svn_wc__conflict_read_markers(const apr_array_header_t **markers,
380                              svn_wc__db_t *db,
381                              const char *wri_abspath,
382                              const svn_skel_t *conflict_skel,
383                              apr_pool_t *result_pool,
384                              apr_pool_t *scratch_pool);
385
386/* Create the necessary marker files for the conflicts stored in
387 * CONFLICT_SKEL and return the work items to fill the markers from
388 * the work queue.
389 *
390 * Currently only used for property conflicts as text conflict markers
391 * are just in-wc files.
392 *
393 * Allocate the result in RESULT_POOL. Perform temporary allocations in
394 * SCRATCH_POOL.
395 */
396svn_error_t *
397svn_wc__conflict_create_markers(svn_skel_t **work_item,
398                                svn_wc__db_t *db,
399                                const char *local_abspath,
400                                svn_skel_t *conflict_skel,
401                                apr_pool_t *result_pool,
402                                apr_pool_t *scratch_pool);
403
404/* Call the interactive conflict resolver RESOLVER_FUNC with RESOLVER_BATON to
405   allow resolving the conflicts on LOCAL_ABSPATH.
406
407   Call RESOLVER_FUNC once for each property conflict, and again for any
408   text conflict, and again for any tree conflict on the node.
409
410   CONFLICT_SKEL contains the details of the conflicts on LOCAL_ABSPATH.
411
412   Resolver actions are directly applied to the in-db state of LOCAL_ABSPATH,
413   so the conflict and the state in CONFLICT_SKEL must already be installed in
414   wc.db. */
415svn_error_t *
416svn_wc__conflict_invoke_resolver(svn_wc__db_t *db,
417                                 const char *local_abspath,
418                                 const svn_skel_t *conflict_skel,
419                                 const apr_array_header_t *merge_options,
420                                 svn_wc_conflict_resolver_func2_t resolver_func,
421                                 void *resolver_baton,
422                                 svn_cancel_func_t cancel_func,
423                                 void *cancel_baton,
424                                 apr_pool_t *scratch_pool);
425
426
427/* Mark as resolved any text conflict on the node at DB/LOCAL_ABSPATH.  */
428svn_error_t *
429svn_wc__mark_resolved_text_conflict(svn_wc__db_t *db,
430                                    const char *local_abspath,
431                                    apr_pool_t *scratch_pool);
432
433/* Mark as resolved any prop conflicts on the node at DB/LOCAL_ABSPATH.  */
434svn_error_t *
435svn_wc__mark_resolved_prop_conflicts(svn_wc__db_t *db,
436                                     const char *local_abspath,
437                                     apr_pool_t *scratch_pool);
438
439#ifdef __cplusplus
440}
441#endif /* __cplusplus */
442
443#endif /* SVN_WC_CONFLICTS_H */
444