wc.h revision 262253
1/*
2 * wc.h :  shared stuff internal to the svn_wc library.
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
25#ifndef SVN_LIBSVN_WC_H
26#define SVN_LIBSVN_WC_H
27
28#include <apr_pools.h>
29#include <apr_hash.h>
30
31#include "svn_types.h"
32#include "svn_error.h"
33#include "svn_wc.h"
34
35#include "private/svn_sqlite.h"
36#include "private/svn_wc_private.h"
37#include "private/svn_skel.h"
38
39#include "wc_db.h"
40
41#ifdef __cplusplus
42extern "C" {
43#endif /* __cplusplus */
44
45
46#define SVN_WC__PROP_REJ_EXT  ".prej"
47
48/* We can handle this format or anything lower, and we (should) error
49 * on anything higher.
50 *
51 * There is no format version 0; we started with 1.
52 *
53 * The bump to 2 introduced the ".svn-work" extension. For example,
54 *   ".svn/props/foo" became ".svn/props/foo.svn-work".
55 *
56 * The bump to 3 introduced the entry attribute
57 *   old-and-busted.c::ENTRIES_ATTR_ABSENT.
58 *
59 * The bump to 4 renamed the magic "svn:this_dir" entry name to "".
60 *
61 * == 1.0.x shipped with format 4
62 * == 1.1.x shipped with format 4
63 * == 1.2.x shipped with format 4
64 * == 1.3.x shipped with format 4
65 *
66 * The bump to 5 added support for replacing files with history (the
67 *   "revert base"). This was introduced in 1.4.0, but buggy until 1.4.6.
68 *
69 * The bump to 6 introduced caching of property modification state and
70 *   certain properties in the entries file.
71 *
72 * The bump to 7 changed the entries file format from XML to a custom
73 *   text-based format.
74 *
75 * The bump to 8 placed wcprops in one file per directory (named
76 *   upgrade.c::WCPROPS_ALL_DATA)
77 *
78 * == 1.4.x shipped with format 8
79 *
80 * The bump to 9 added changelists, keep-local, and sticky depth (for
81 *   selective/sparse checkouts) to each entry.
82 *
83 * == 1.5.x shipped with format 9
84 *
85 * The bump to 10 added tree-conflicts, file externals and a different
86 *   canonicalization of urls.
87 *
88 * == 1.6.x shipped with format 10
89 *
90 * The bump to 11 cleared the has_props, has_prop_mods, cachable_props,
91 *   and present_props values in the entries file. Older clients expect
92 *   proper values for these fields.
93 *
94 * The bump to 12 switched from 'entries' to the SQLite database 'wc.db'.
95 *
96 * The bump to 13 added the WORK_QUEUE table into 'wc.db', moved the
97 *   wcprops into the 'dav_cache' column in BASE_NODE, and stopped using
98 *   the 'incomplete_children' column of BASE_NODE.
99 *
100 * The bump to 14 added the WCLOCKS table (and migrated locks from the
101 *   filesystem into wc.db), and some columns to ACTUAL_NODE for future
102 *   use.
103 *
104 * The bump to 15 switched from depth='exclude' on directories to using
105 *   presence='exclude' within the BASE_NODE and WORKING_NODE tables.
106 *   This change also enabled exclude support on files and symlinks.
107 *
108 * The bump to 16 added 'locked_levels' to WC_LOCK, setting any existing
109 *   locks to a level of 0. The 'md5_checksum' column was added to PRISTINE
110 *   for future use.
111 *
112 * The bump to 17 added a '.svn/pristine' dir and moved the text bases into
113 *   the Pristine Store (the PRISTINE table and '.svn/pristine' dir), and
114 *   removed the '/.svn/text-base' dir.
115 *
116 * The bump to 18 moved the properties from separate files in the props and
117 *   prop-base directory (and .svn for the dir itself) into the wc.db file,
118 *   and then removed the props and prop-base dir.
119 *
120 * The bump to 19 introduced the 'single DB' per working copy. All metadata
121 *   is held in a single '.svn/wc.db' in the root directory of the working
122 *   copy. Bumped in r991236.
123 *
124 * The bump to 20 introduced NODES and drops BASE_NODE and WORKING_NODE,
125 *   op_depth is always 0 or 2. Bumped in r1005388.
126 *
127 * The bump to 21 moved tree conflict storage from the parent to the
128 *   conflicted node. Bumped in r1034436.
129 *
130 * The bump to 22 moved tree conflict storage from conflict_data column
131 *   to the tree_conflict_data column. Bumped in r1040255.
132 *
133 * The bump to 23 introduced multi-layer op_depth processing for NODES.
134 *   Bumped in r1044384.
135 *
136 * The bump to 24 started using the 'refcount' column of the PRISTINE table
137 *   correctly, instead of always setting it to '1'. Bumped in r1058523.
138 *
139 * The bump to 25 introduced the NODES_CURRENT view. Bumped in r1071283.
140 *
141 * The bump to 26 introduced the NODES_BASE view. Bumped in r1076617.
142 *
143 * The bump to 27 stored conflict files as relpaths rather than basenames.
144 *   Bumped in r1089593.
145 *
146 * The bump to 28 converted any remaining references to MD5 checksums
147 *   to SHA1 checksums. Bumped in r1095214.
148 *
149 * The bump to 29 renamed the pristine files from '<SHA1>' to '<SHA1>.svn-base'
150 * and introduced the EXTERNALS store. Bumped in r1129286.
151 *
152 * == 1.7.x shipped with format 29
153 *
154 * The bump to 30 switched the conflict storage to a skel inside conflict_data.
155 * Also clears some known invalid state. Bumped in r1387742.
156 *
157 * The bump to 31 added the inherited_props column in the NODES table.
158 * Bumped in r1395109.
159 *
160 * == 1.8.x shipped with format 31
161 *
162 * Please document any further format changes here.
163 */
164
165#define SVN_WC__VERSION 31
166
167
168/* Formats <= this have no concept of "revert text-base/props".  */
169#define SVN_WC__NO_REVERT_FILES 4
170
171/* A version <= this has wcprops stored in one file per entry. */
172#define SVN_WC__WCPROPS_MANY_FILES_VERSION 7
173
174/* A version < this can have urls that aren't canonical according to the new
175   rules. See issue #2475. */
176#define SVN_WC__CHANGED_CANONICAL_URLS 10
177
178/* The format number written to wc-ng working copies so that old clients
179   can recognize them as "newer Subversion"'s working copies. */
180#define SVN_WC__NON_ENTRIES 12
181#define SVN_WC__NON_ENTRIES_STRING "12\n"
182
183/* A version < this uses the old 'entries' file mechanism.  */
184#define SVN_WC__WC_NG_VERSION 12
185
186/* In this version, the wcprops are "lost" between files and wc.db. We want
187   to ignore them in upgrades.  */
188#define SVN_WC__WCPROPS_LOST 12
189
190/* A version < this has no work queue (see workqueue.h).  */
191#define SVN_WC__HAS_WORK_QUEUE 13
192
193/* Return a string indicating the released version (or versions) of
194 * Subversion that used WC format number WC_FORMAT, or some other
195 * suitable string if no released version used WC_FORMAT.
196 *
197 * ### It's not ideal to encode this sort of knowledge in this low-level
198 * library.  On the other hand, it doesn't need to be updated often and
199 * should be easily found when it does need to be updated.  */
200const char *
201svn_wc__version_string_from_format(int wc_format);
202
203/* Return true iff error E indicates an "is not a working copy" type
204   of error, either because something wasn't a working copy at all, or
205   because it's a working copy from a previous version (in need of
206   upgrade). */
207#define SVN_WC__ERR_IS_NOT_CURRENT_WC(e) \
208            ((e->apr_err == SVN_ERR_WC_NOT_WORKING_COPY) || \
209             (e->apr_err == SVN_ERR_WC_UPGRADE_REQUIRED))
210
211
212
213/*** Context handling ***/
214struct svn_wc_context_t
215{
216  /* The wc_db handle for this working copy. */
217  svn_wc__db_t *db;
218
219  /* Close the DB when we destroy this context?
220     (This is used inside backward compat wrappers, and should only be
221      modified by the proper create() functions. */
222  svn_boolean_t close_db_on_destroy;
223
224  /* The state pool for this context. */
225  apr_pool_t *state_pool;
226};
227
228/**
229 * Just like svn_wc_context_create(), only use the provided DB to construct
230 * the context.
231 *
232 * Even though DB is not allocated from the same pool at *WC_CTX, it is
233 * expected to remain open throughout the life of *WC_CTX.
234 */
235svn_error_t *
236svn_wc__context_create_with_db(svn_wc_context_t **wc_ctx,
237                               svn_config_t *config,
238                               svn_wc__db_t *db,
239                               apr_pool_t *result_pool);
240
241
242/*** Committed Queue ***/
243
244/**
245 * Return the pool associated with QUEUE.  (This so we can keep some
246 * deprecated functions that need to peek inside the QUEUE struct in
247 * deprecated.c).
248 */
249apr_pool_t *
250svn_wc__get_committed_queue_pool(const struct svn_wc_committed_queue_t *queue);
251
252
253/** Internal helper for svn_wc_process_committed_queue2().
254 *
255 * ### If @a queue is NULL, then ...?
256 * ### else:
257 * Bump an item from @a queue (the one associated with @a
258 * local_abspath) to @a new_revnum after a commit succeeds, recursing
259 * if @a recurse is set.
260 *
261 * @a new_date is the (server-side) date of the new revision, or 0.
262 *
263 * @a rev_author is the (server-side) author of the new
264 * revision; it may be @c NULL.
265 *
266 * @a new_dav_cache is a hash of dav property changes to be made to
267 * the @a local_abspath.
268 *   ### [JAF]  Is it? See svn_wc_queue_committed3(). It ends up being
269 *   ### assigned as a whole to wc.db:BASE_NODE:dav_cache.
270 *
271 * If @a no_unlock is set, don't release any user locks on @a
272 * local_abspath; otherwise release them as part of this processing.
273 *
274 * If @a keep_changelist is set, don't remove any changeset assignments
275 * from @a local_abspath; otherwise, clear it of such assignments.
276 *
277 * If @a sha1_checksum is non-NULL, use it to identify the node's pristine
278 * text.
279 *
280 * Set TOP_OF_RECURSE to TRUE to show that this the top of a possibly
281 * recursive commit operation.
282 */
283svn_error_t *
284svn_wc__process_committed_internal(svn_wc__db_t *db,
285                                   const char *local_abspath,
286                                   svn_boolean_t recurse,
287                                   svn_boolean_t top_of_recurse,
288                                   svn_revnum_t new_revnum,
289                                   apr_time_t new_date,
290                                   const char *rev_author,
291                                   apr_hash_t *new_dav_cache,
292                                   svn_boolean_t no_unlock,
293                                   svn_boolean_t keep_changelist,
294                                   const svn_checksum_t *sha1_checksum,
295                                   const svn_wc_committed_queue_t *queue,
296                                   apr_pool_t *scratch_pool);
297
298
299/*** Update traversals. ***/
300
301struct svn_wc_traversal_info_t
302{
303  /* The pool in which this structure and everything inside it is
304     allocated. */
305  apr_pool_t *pool;
306
307  /* The before and after values of the SVN_PROP_EXTERNALS property,
308   * for each directory on which that property changed.  These have
309   * the same layout as those returned by svn_wc_edited_externals().
310   *
311   * The hashes, their keys, and their values are allocated in the
312   * above pool.
313   */
314  apr_hash_t *externals_old;
315  apr_hash_t *externals_new;
316
317  /* The ambient depths of the working copy directories.  The keys are
318     working copy paths (as for svn_wc_edited_externals()), the values
319     are the result of svn_depth_to_word(depth_of_each_dir). */
320  apr_hash_t *depths;
321};
322
323
324/*** Names and file/dir operations in the administrative area. ***/
325
326/** The files within the administrative subdir. **/
327#define SVN_WC__ADM_FORMAT              "format"
328#define SVN_WC__ADM_ENTRIES             "entries"
329#define SVN_WC__ADM_TMP                 "tmp"
330#define SVN_WC__ADM_PRISTINE            "pristine"
331#define SVN_WC__ADM_NONEXISTENT_PATH    "nonexistent-path"
332
333/* The basename of the ".prej" file, if a directory ever has property
334   conflicts.  This .prej file will appear *within* the conflicted
335   directory.  */
336#define SVN_WC__THIS_DIR_PREJ           "dir_conflicts"
337
338
339/* A few declarations for stuff in util.c.
340 * If this section gets big, move it all out into a new util.h file. */
341
342/* Ensure that DIR exists. */
343svn_error_t *svn_wc__ensure_directory(const char *path, apr_pool_t *pool);
344
345
346/* Return a hash keyed by 'const char *' property names and with
347   'svn_string_t *' values built from PROPS (which is an array of
348   pointers to svn_prop_t's) or to NULL if PROPS is NULL or empty.
349   PROPS items which lack a value will be ignored.  If PROPS contains
350   multiple properties with the same name, each successive such item
351   reached in a walk from the beginning to the end of the array will
352   overwrite the previous in the returned hash.
353
354   NOTE: While the returned hash will be allocated in RESULT_POOL, the
355   items it holds will share storage with those in PROPS.
356
357   ### This is rather the reverse of svn_prop_hash_to_array(), except
358   ### that function's arrays contains svn_prop_t's, whereas this
359   ### one's contains *pointers* to svn_prop_t's.  So much for
360   ### consistency.  */
361apr_hash_t *
362svn_wc__prop_array_to_hash(const apr_array_header_t *props,
363                           apr_pool_t *result_pool);
364
365
366/* Set *MODIFIED_P to non-zero if LOCAL_ABSPATH's text is modified with
367 * regard to the base revision, else set *MODIFIED_P to zero.
368 *
369 * If EXACT_COMPARISON is FALSE, translate LOCAL_ABSPATH's EOL
370 * style and keywords to repository-normal form according to its properties,
371 * and compare the result with the text base.
372 * Usually, EXACT_COMPARISON should be FALSE.
373 *
374 * If LOCAL_ABSPATH does not exist, consider it unmodified.  If it exists
375 * but is not under revision control (not even scheduled for
376 * addition), return the error SVN_WC_PATH_NOT_FOUND.
377 *
378 * If the text is unmodified and a write-lock is held this function
379 * will ensure that the last-known-unmodified timestamp and
380 * filesize of the file as recorded in DB matches the corresponding
381 * attributes of the actual file.  (This is often referred to as
382 * "timestamp repair", and serves to help future unforced is-modified
383 * checks return quickly if the file remains untouched.)
384 */
385svn_error_t *
386svn_wc__internal_file_modified_p(svn_boolean_t *modified_p,
387                                 svn_wc__db_t *db,
388                                 const char *local_abspath,
389                                 svn_boolean_t exact_comparison,
390                                 apr_pool_t *scratch_pool);
391
392
393/* Prepare to merge a file content change into the working copy.
394
395   This does not merge properties; see svn_wc__merge_props() for that.
396   This does not necessarily change the file TARGET_ABSPATH on disk; it
397   may instead return work items that will replace the file on disk when
398   they are run.  ### Can we be more consistent about this?
399
400   Merge the difference between LEFT_ABSPATH and RIGHT_ABSPATH into
401   TARGET_ABSPATH.
402
403   Set *WORK_ITEMS to the appropriate work queue operations.
404
405   If there are any conflicts, append a conflict description to
406   *CONFLICT_SKEL.  (First allocate *CONFLICT_SKEL from RESULT_POOL if
407   it is initially NULL.  CONFLICT_SKEL itself must not be NULL.)
408   Also, unless it is considered to be a 'binary' file, mark any
409   conflicts in the text of the file TARGET_ABSPATH using LEFT_LABEL,
410   RIGHT_LABEL and TARGET_LABEL.
411
412   Set *MERGE_OUTCOME to indicate the result.
413
414   When DRY_RUN is true, no actual changes are made to the working copy.
415
416   If DIFF3_CMD is specified, the given external diff3 tool will
417   be used instead of our built in diff3 routines.
418
419   When MERGE_OPTIONS are specified, they are used by the internal
420   diff3 routines, or passed to the external diff3 tool.
421
422   WRI_ABSPATH describes in which working copy information should be
423   retrieved. (Interesting for merging file externals).
424
425   OLD_ACTUAL_PROPS is the set of actual properties before merging; used for
426   detranslating the file before merging.  This is necessary because, in
427   the case of updating, the update can have sent new properties, so we
428   cannot simply fetch and use the current actual properties.
429
430     ### Is OLD_ACTUAL_PROPS still necessary, now that we first prepare the
431         content change and property change and then apply them both to
432         the WC together?
433
434   Property changes sent by the update are provided in PROP_DIFF.
435
436   For a complete description, see svn_wc_merge5() for which this is
437   the (loggy) implementation.
438
439   *WORK_ITEMS will be allocated in RESULT_POOL. All temporary allocations
440   will be performed in SCRATCH_POOL.
441*/
442svn_error_t *
443svn_wc__internal_merge(svn_skel_t **work_items,
444                       svn_skel_t **conflict_skel,
445                       enum svn_wc_merge_outcome_t *merge_outcome,
446                       svn_wc__db_t *db,
447                       const char *left_abspath,
448                       const char *right_abspath,
449                       const char *target_abspath,
450                       const char *wri_abspath,
451                       const char *left_label,
452                       const char *right_label,
453                       const char *target_label,
454                       apr_hash_t *old_actual_props,
455                       svn_boolean_t dry_run,
456                       const char *diff3_cmd,
457                       const apr_array_header_t *merge_options,
458                       const apr_array_header_t *prop_diff,
459                       svn_cancel_func_t cancel_func,
460                       void *cancel_baton,
461                       apr_pool_t *result_pool,
462                       apr_pool_t *scratch_pool);
463
464/* A default error handler for svn_wc_walk_entries3().  Returns ERR in
465   all cases. */
466svn_error_t *
467svn_wc__walker_default_error_handler(const char *path,
468                                     svn_error_t *err,
469                                     void *walk_baton,
470                                     apr_pool_t *pool);
471
472/* Set *EDITOR and *EDIT_BATON to an ambient-depth-based filtering
473 * editor that wraps WRAPPED_EDITOR and WRAPPED_BATON.  This is only
474 * required for operations where the requested depth is @c
475 * svn_depth_unknown and the server's editor driver doesn't understand
476 * depth.  It is safe for *EDITOR and *EDIT_BATON to start as
477 * WRAPPED_EDITOR and WRAPPED_BATON.
478 *
479 * ANCHOR, TARGET, and DB are as in svn_wc_get_update_editor3.
480 *
481 * @a requested_depth must be one of the following depth values:
482 * @c svn_depth_infinity, @c svn_depth_empty, @c svn_depth_files,
483 * @c svn_depth_immediates, or @c svn_depth_unknown.
484 *
485 * Allocations are done in POOL.
486 */
487svn_error_t *
488svn_wc__ambient_depth_filter_editor(const svn_delta_editor_t **editor,
489                                    void **edit_baton,
490                                    svn_wc__db_t *db,
491                                    const char *anchor_abspath,
492                                    const char *target,
493                                    const svn_delta_editor_t *wrapped_editor,
494                                    void *wrapped_edit_baton,
495                                    apr_pool_t *result_pool);
496
497
498/* Similar to svn_wc_conflicted_p3(), but with a wc_db parameter in place of
499 * a wc_context. */
500svn_error_t *
501svn_wc__internal_conflicted_p(svn_boolean_t *text_conflicted_p,
502                              svn_boolean_t *prop_conflicted_p,
503                              svn_boolean_t *tree_conflicted_p,
504                              svn_wc__db_t *db,
505                              const char *local_abspath,
506                              apr_pool_t *scratch_pool);
507
508/* Similar to svn_wc__internal_conflicted_p(), but ignores
509 * moved-away-edit tree conflicts.  If CONFLICT_IGNORED_P is not NULL
510 * then sets *CONFLICT_IGNORED_P TRUE if a tree-conflict is ignored
511 * and FALSE otherwise. Also ignores text and property conflicts if
512 * TREE_ONLY is TRUE */
513svn_error_t *
514svn_wc__conflicted_for_update_p(svn_boolean_t *conflicted_p,
515                                svn_boolean_t *conflict_ignored_p,
516                                svn_wc__db_t *db,
517                                const char *local_abspath,
518                                svn_boolean_t tree_only,
519                                apr_pool_t *scratch_pool);
520
521
522/* Internal version of svn_wc_transmit_text_deltas3(). */
523svn_error_t *
524svn_wc__internal_transmit_text_deltas(const char **tempfile,
525                                      const svn_checksum_t **new_text_base_md5_checksum,
526                                      const svn_checksum_t **new_text_base_sha1_checksum,
527                                      svn_wc__db_t *db,
528                                      const char *local_abspath,
529                                      svn_boolean_t fulltext,
530                                      const svn_delta_editor_t *editor,
531                                      void *file_baton,
532                                      apr_pool_t *result_pool,
533                                      apr_pool_t *scratch_pool);
534
535/* Internal version of svn_wc_transmit_prop_deltas2(). */
536svn_error_t *
537svn_wc__internal_transmit_prop_deltas(svn_wc__db_t *db,
538                                     const char *local_abspath,
539                                     const svn_delta_editor_t *editor,
540                                     void *baton,
541                                     apr_pool_t *scratch_pool);
542
543/* Library-internal version of svn_wc_ensure_adm4(). */
544svn_error_t *
545svn_wc__internal_ensure_adm(svn_wc__db_t *db,
546                            const char *local_abspath,
547                            const char *url,
548                            const char *repos_root_url,
549                            const char *repos_uuid,
550                            svn_revnum_t revision,
551                            svn_depth_t depth,
552                            apr_pool_t *scratch_pool);
553
554
555/* Library-internal version of svn_wc__changelist_match(). */
556svn_boolean_t
557svn_wc__internal_changelist_match(svn_wc__db_t *db,
558                                  const char *local_abspath,
559                                  const apr_hash_t *clhash,
560                                  apr_pool_t *scratch_pool);
561
562/* Library-internal version of svn_wc_walk_status(), which see. */
563svn_error_t *
564svn_wc__internal_walk_status(svn_wc__db_t *db,
565                             const char *local_abspath,
566                             svn_depth_t depth,
567                             svn_boolean_t get_all,
568                             svn_boolean_t no_ignore,
569                             svn_boolean_t ignore_text_mods,
570                             const apr_array_header_t *ignore_patterns,
571                             svn_wc_status_func4_t status_func,
572                             void *status_baton,
573                             svn_cancel_func_t cancel_func,
574                             void *cancel_baton,
575                             apr_pool_t *scratch_pool);
576
577/** A callback invoked by the generic node-walker function.  */
578typedef svn_error_t *(*svn_wc__node_found_func_t)(const char *local_abspath,
579                                                  svn_node_kind_t kind,
580                                                  void *walk_baton,
581                                                  apr_pool_t *scratch_pool);
582
583/* Call @a walk_callback with @a walk_baton for @a local_abspath and all
584   nodes underneath it, restricted by @a walk_depth, and possibly
585   @a changelists.
586
587   If @a show_hidden is true, include hidden nodes, else ignore them.
588   If CHANGELISTS is non-NULL and non-empty, filter thereon. */
589svn_error_t *
590svn_wc__internal_walk_children(svn_wc__db_t *db,
591                               const char *local_abspath,
592                               svn_boolean_t show_hidden,
593                               const apr_array_header_t *changelists,
594                               svn_wc__node_found_func_t walk_callback,
595                               void *walk_baton,
596                               svn_depth_t walk_depth,
597                               svn_cancel_func_t cancel_func,
598                               void *cancel_baton,
599                               apr_pool_t *scratch_pool);
600
601/* Library-internal version of svn_wc_remove_from_revision_control2,
602   which see.*/
603svn_error_t *
604svn_wc__internal_remove_from_revision_control(svn_wc__db_t *db,
605                                              const char *local_abspath,
606                                              svn_boolean_t destroy_wf,
607                                              svn_cancel_func_t cancel_func,
608                                              void *cancel_baton,
609                                              apr_pool_t *scratch_pool);
610
611/* Library-internal version of svn_wc__node_get_schedule(). */
612svn_error_t *
613svn_wc__internal_node_get_schedule(svn_wc_schedule_t *schedule,
614                                   svn_boolean_t *copied,
615                                   svn_wc__db_t *db,
616                                   const char *local_abspath,
617                                   apr_pool_t *scratch_pool);
618
619/* Internal version of svn_wc__node_get_origin() */
620svn_error_t *
621svn_wc__internal_get_origin(svn_boolean_t *is_copy,
622                            svn_revnum_t *revision,
623                            const char **repos_relpath,
624                            const char **repos_root_url,
625                            const char **repos_uuid,
626                            const char **copy_root_abspath,
627                            svn_wc__db_t *db,
628                            const char *local_abspath,
629                            svn_boolean_t scan_deleted,
630                            apr_pool_t *result_pool,
631                            apr_pool_t *scratch_pool);
632
633/* Internal version of svn_wc__node_get_repos_info() */
634svn_error_t *
635svn_wc__internal_get_repos_info(svn_revnum_t *revision,
636                                const char **repos_relpath,
637                                const char **repos_root_url,
638                                const char **repos_uuid,
639                                svn_wc__db_t *db,
640                                const char *local_abspath,
641                                apr_pool_t *result_pool,
642                                apr_pool_t *scratch_pool);
643
644/* Upgrade the wc sqlite database given in SDB for the wc located at
645   WCROOT_ABSPATH. It's current/starting format is given by START_FORMAT.
646   After the upgrade is complete (to as far as the automatic upgrade will
647   perform), the resulting format is RESULT_FORMAT. All allocations are
648   performed in SCRATCH_POOL.  */
649svn_error_t *
650svn_wc__upgrade_sdb(int *result_format,
651                    const char *wcroot_abspath,
652                    svn_sqlite__db_t *sdb,
653                    int start_format,
654                    apr_pool_t *scratch_pool);
655
656/* Create a conflict skel from the old separated data */
657svn_error_t *
658svn_wc__upgrade_conflict_skel_from_raw(svn_skel_t **conflicts,
659                                       svn_wc__db_t *db,
660                                       const char *wri_abspath,
661                                       const char *local_relpath,
662                                       const char *conflict_old,
663                                       const char *conflict_wrk,
664                                       const char *conflict_new,
665                                       const char *prej_file,
666                                       const char *tree_conflict_data,
667                                       apr_size_t tree_conflict_len,
668                                       apr_pool_t *result_pool,
669                                       apr_pool_t *scratch_pool);
670
671svn_error_t *
672svn_wc__wipe_postupgrade(const char *dir_abspath,
673                         svn_boolean_t whole_admin,
674                         svn_cancel_func_t cancel_func,
675                         void *cancel_baton,
676                         apr_pool_t *scratch_pool);
677
678/* Ensure LOCAL_ABSPATH is still locked in DB.  Returns the error
679 * SVN_ERR_WC_NOT_LOCKED if this is not the case.
680 */
681svn_error_t *
682svn_wc__write_check(svn_wc__db_t *db,
683                    const char *local_abspath,
684                    apr_pool_t *scratch_pool);
685
686/* Read into CONFLICTS svn_wc_conflict_description2_t* structs
687 * for all conflicts that have LOCAL_ABSPATH as victim.
688 *
689 * Victim must be versioned or be part of a tree conflict.
690 *
691 * If CREATE_TEMPFILES is TRUE, create temporary files for property conflicts.
692 *
693 * Allocate *CONFLICTS in RESULT_POOL and do temporary allocations in
694 * SCRATCH_POOL
695 */
696svn_error_t *
697svn_wc__read_conflicts(const apr_array_header_t **conflicts,
698                       svn_wc__db_t *db,
699                       const char *local_abspath,
700                       svn_boolean_t create_tempfiles,
701                       apr_pool_t *result_pool,
702                       apr_pool_t *scratch_pool);
703
704
705/* Perform the actual merge of file changes between an original file,
706   identified by ORIGINAL_CHECKSUM (an empty file if NULL) to a new file
707   identified by NEW_CHECKSUM in the working copy identified by WRI_ABSPATH.
708
709   Merge the result into LOCAL_ABSPATH, which is part of the working copy
710   identified by WRI_ABSPATH. Use OLD_REVISION and TARGET_REVISION for naming
711   the intermediate files.
712
713   Set *FOUND_TEXT_CONFLICT to TRUE when the merge encountered a conflict,
714   otherwise to FALSE.
715
716   The rest of the arguments are passed to svn_wc__internal_merge.
717 */
718svn_error_t *
719svn_wc__perform_file_merge(svn_skel_t **work_items,
720                           svn_skel_t **conflict_skel,
721                           svn_boolean_t *found_conflict,
722                           svn_wc__db_t *db,
723                           const char *local_abspath,
724                           const char *wri_abspath,
725                           const svn_checksum_t *new_checksum,
726                           const svn_checksum_t *original_checksum,
727                           apr_hash_t *old_actual_props,
728                           const apr_array_header_t *ext_patterns,
729                           svn_revnum_t old_revision,
730                           svn_revnum_t target_revision,
731                           const apr_array_header_t *propchanges,
732                           const char *diff3_cmd,
733                           svn_cancel_func_t cancel_func,
734                           void *cancel_baton,
735                           apr_pool_t *result_pool,
736                           apr_pool_t *scratch_pool);
737
738
739/* Couple of random helpers for the Ev2 shims.
740   ### These will eventually be obsoleted and removed. */
741struct svn_wc__shim_fetch_baton_t
742{
743  svn_wc__db_t *db;
744  const char *base_abspath;
745  svn_boolean_t fetch_base;
746};
747
748/* Using a BATON of struct shim_fetch_baton, return KIND for PATH. */
749svn_error_t *
750svn_wc__fetch_kind_func(svn_node_kind_t *kind,
751                        void *baton,
752                        const char *path,
753                        svn_revnum_t base_revision,
754                        apr_pool_t *scratch_pool);
755
756/* Using a BATON of struct shim_fetch_baton, return PROPS for PATH. */
757svn_error_t *
758svn_wc__fetch_props_func(apr_hash_t **props,
759                         void *baton,
760                         const char *path,
761                         svn_revnum_t base_revision,
762                         apr_pool_t *result_pool,
763                         apr_pool_t *scratch_pool);
764
765/* Using a BATON of struct shim_fetch_baton, return a delta base for PATH. */
766svn_error_t *
767svn_wc__fetch_base_func(const char **filename,
768                        void *baton,
769                        const char *path,
770                        svn_revnum_t base_revision,
771                        apr_pool_t *result_pool,
772                        apr_pool_t *scratch_pool);
773
774/* Find duplicate targets in *EXTERNALS, a list of svn_wc_external_item2_t*
775 * elements, and store each target string in *DUPLICATE_TARGETS as const
776 * char * elements. *DUPLICATE_TARGETS will be NULL if no duplicates were
777 * found. */
778svn_error_t *
779svn_wc__externals_find_target_dups(apr_array_header_t **duplicate_targets,
780                                   apr_array_header_t *externals,
781                                   apr_pool_t *pool,
782                                   apr_pool_t *scratch_pool);
783
784/* Revert tree LOCAL_ABSPATH to depth DEPTH and notify for all
785   reverts. */
786svn_error_t *
787svn_wc__revert_internal(svn_wc__db_t *db,
788                        const char *local_abspath,
789                        svn_depth_t depth,
790                        svn_boolean_t use_commit_times,
791                        svn_cancel_func_t cancel_func,
792                        void *cancel_baton,
793                        svn_wc_notify_func2_t notify_func,
794                        void *notify_baton,
795                        apr_pool_t *scratch_pool);
796
797svn_error_t *
798svn_wc__node_has_local_mods(svn_boolean_t *modified,
799                            svn_boolean_t *all_edits_are_deletes,
800                            svn_wc__db_t *db,
801                            const char *local_abspath,
802                            svn_cancel_func_t cancel_func,
803                            void *cancel_baton,
804                            apr_pool_t *scratch_pool);
805
806#ifdef __cplusplus
807}
808#endif /* __cplusplus */
809
810#endif /* SVN_LIBSVN_WC_H */
811