svn_client.h revision 362181
1/**
2 * @copyright
3 * ====================================================================
4 *    Licensed to the Apache Software Foundation (ASF) under one
5 *    or more contributor license agreements.  See the NOTICE file
6 *    distributed with this work for additional information
7 *    regarding copyright ownership.  The ASF licenses this file
8 *    to you under the Apache License, Version 2.0 (the
9 *    "License"); you may not use this file except in compliance
10 *    with the License.  You may obtain a copy of the License at
11 *
12 *      http://www.apache.org/licenses/LICENSE-2.0
13 *
14 *    Unless required by applicable law or agreed to in writing,
15 *    software distributed under the License is distributed on an
16 *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17 *    KIND, either express or implied.  See the License for the
18 *    specific language governing permissions and limitations
19 *    under the License.
20 * ====================================================================
21 * @endcopyright
22 *
23 * @file svn_client.h
24 * @brief Subversion's client library
25 *
26 * Requires:  The working copy library and repository access library.
27 * Provides:  Broad wrappers around working copy library functionality.
28 * Used By:   Client programs.
29 */
30
31#ifndef SVN_CLIENT_H
32#define SVN_CLIENT_H
33
34#include <apr.h>
35#include <apr_pools.h>
36#include <apr_hash.h>
37#include <apr_tables.h>
38#include <apr_getopt.h>
39#include <apr_file_io.h>
40#include <apr_time.h>
41
42#include "svn_types.h"
43#include "svn_string.h"
44#include "svn_wc.h"
45#include "svn_opt.h"
46#include "svn_ra.h"
47#include "svn_diff.h"
48#include "svn_auth.h"
49
50#ifdef __cplusplus
51extern "C" {
52#endif /* __cplusplus */
53
54
55
56/**
57 * Get libsvn_client version information.
58 *
59 * @since New in 1.1.
60 */
61const svn_version_t *
62svn_client_version(void);
63
64/** Client supporting functions
65 *
66 * @defgroup clnt_support Client supporting subsystem
67 *
68 * @{
69 */
70
71
72/*** Authentication stuff ***/
73
74/**  The new authentication system allows the RA layer to "pull"
75 *   information as needed from libsvn_client.
76 *
77 *   @deprecated Replaced by the svn_auth_* functions.
78 *   @see auth_fns
79 *
80 *   @defgroup auth_fns_depr (deprecated) AuthZ client subsystem
81 *
82 *   @{
83 */
84
85/** Create and return @a *provider, an authentication provider of type
86 * svn_auth_cred_simple_t that gets information by prompting the user
87 * with @a prompt_func and @a prompt_baton.  Allocate @a *provider in
88 * @a pool.
89 *
90 * If both #SVN_AUTH_PARAM_DEFAULT_USERNAME and
91 * #SVN_AUTH_PARAM_DEFAULT_PASSWORD are defined as runtime
92 * parameters in the @c auth_baton, then @a *provider will return the
93 * default arguments when svn_auth_first_credentials() is called.  If
94 * svn_auth_first_credentials() fails, then @a *provider will
95 * re-prompt @a retry_limit times (via svn_auth_next_credentials()).
96 * For infinite retries, set @a retry_limit to value less than 0.
97 *
98 * @deprecated Provided for backward compatibility with the 1.3 API.
99 * Use svn_auth_get_simple_prompt_provider() instead.
100 */
101SVN_DEPRECATED
102void
103svn_client_get_simple_prompt_provider(
104  svn_auth_provider_object_t **provider,
105  svn_auth_simple_prompt_func_t prompt_func,
106  void *prompt_baton,
107  int retry_limit,
108  apr_pool_t *pool);
109
110
111/** Create and return @a *provider, an authentication provider of type
112 * #svn_auth_cred_username_t that gets information by prompting the
113 * user with @a prompt_func and @a prompt_baton.  Allocate @a *provider
114 * in @a pool.
115 *
116 * If #SVN_AUTH_PARAM_DEFAULT_USERNAME is defined as a runtime
117 * parameter in the @c auth_baton, then @a *provider will return the
118 * default argument when svn_auth_first_credentials() is called.  If
119 * svn_auth_first_credentials() fails, then @a *provider will
120 * re-prompt @a retry_limit times (via svn_auth_next_credentials()).
121 * For infinite retries, set @a retry_limit to value less than 0.
122 *
123 * @deprecated Provided for backward compatibility with the 1.3 API.
124 * Use svn_auth_get_username_prompt_provider() instead.
125 */
126SVN_DEPRECATED
127void
128svn_client_get_username_prompt_provider(
129  svn_auth_provider_object_t **provider,
130  svn_auth_username_prompt_func_t prompt_func,
131  void *prompt_baton,
132  int retry_limit,
133  apr_pool_t *pool);
134
135
136/** Create and return @a *provider, an authentication provider of type
137 * #svn_auth_cred_simple_t that gets/sets information from the user's
138 * ~/.subversion configuration directory.  Allocate @a *provider in
139 * @a pool.
140 *
141 * If a default username or password is available, @a *provider will
142 * honor them as well, and return them when
143 * svn_auth_first_credentials() is called.  (see
144 * #SVN_AUTH_PARAM_DEFAULT_USERNAME and #SVN_AUTH_PARAM_DEFAULT_PASSWORD).
145 *
146 * @deprecated Provided for backward compatibility with the 1.3 API.
147 * Use svn_auth_get_simple_provider2() instead.
148 */
149SVN_DEPRECATED
150void
151svn_client_get_simple_provider(svn_auth_provider_object_t **provider,
152                               apr_pool_t *pool);
153
154
155#if (defined(WIN32) && !defined(__MINGW32__)) || defined(DOXYGEN) || defined(CTYPESGEN) || defined(SWIG)
156/**
157 * Create and return @a *provider, an authentication provider of type
158 * #svn_auth_cred_simple_t that gets/sets information from the user's
159 * ~/.subversion configuration directory.  Allocate @a *provider in
160 * @a pool.
161 *
162 * This is like svn_client_get_simple_provider(), except that, when
163 * running on Window 2000 or newer (or any other Windows version that
164 * includes the CryptoAPI), the provider encrypts the password before
165 * storing it to disk. On earlier versions of Windows, the provider
166 * does nothing.
167 *
168 * @since New in 1.2.
169 * @note This function is only available on Windows.
170 *
171 * @note An administrative password reset may invalidate the account's
172 * secret key. This function will detect that situation and behave as
173 * if the password were not cached at all.
174 *
175 * @deprecated Provided for backward compatibility with the 1.3 API.
176 * Use svn_auth_get_windows_simple_provider() instead.
177 */
178SVN_DEPRECATED
179void
180svn_client_get_windows_simple_provider(svn_auth_provider_object_t **provider,
181                                       apr_pool_t *pool);
182#endif /* WIN32 && !__MINGW32__ || DOXYGEN || CTYPESGEN || SWIG */
183
184/** Create and return @a *provider, an authentication provider of type
185 * #svn_auth_cred_username_t that gets/sets information from a user's
186 * ~/.subversion configuration directory.  Allocate @a *provider in
187 * @a pool.
188 *
189 * If a default username is available, @a *provider will honor it,
190 * and return it when svn_auth_first_credentials() is called.  (see
191 * #SVN_AUTH_PARAM_DEFAULT_USERNAME).
192 *
193 * @deprecated Provided for backward compatibility with the 1.3 API.
194 * Use svn_auth_get_username_provider() instead.
195 */
196SVN_DEPRECATED
197void
198svn_client_get_username_provider(svn_auth_provider_object_t **provider,
199                                 apr_pool_t *pool);
200
201
202/** Create and return @a *provider, an authentication provider of type
203 * #svn_auth_cred_ssl_server_trust_t, allocated in @a pool.
204 *
205 * @a *provider retrieves its credentials from the configuration
206 * mechanism.  The returned credential is used to override SSL
207 * security on an error.
208 *
209 * @deprecated Provided for backward compatibility with the 1.3 API.
210 * Use svn_auth_get_ssl_server_trust_file_provider() instead.
211 */
212SVN_DEPRECATED
213void
214svn_client_get_ssl_server_trust_file_provider(
215  svn_auth_provider_object_t **provider,
216  apr_pool_t *pool);
217
218
219/** Create and return @a *provider, an authentication provider of type
220 * #svn_auth_cred_ssl_client_cert_t, allocated in @a pool.
221 *
222 * @a *provider retrieves its credentials from the configuration
223 * mechanism.  The returned credential is used to load the appropriate
224 * client certificate for authentication when requested by a server.
225 *
226 * @deprecated Provided for backward compatibility with the 1.3 API.
227 * Use svn_auth_get_ssl_client_cert_file_provider() instead.
228 */
229SVN_DEPRECATED
230void
231svn_client_get_ssl_client_cert_file_provider(
232  svn_auth_provider_object_t **provider,
233  apr_pool_t *pool);
234
235
236/** Create and return @a *provider, an authentication provider of type
237 * #svn_auth_cred_ssl_client_cert_pw_t, allocated in @a pool.
238 *
239 * @a *provider retrieves its credentials from the configuration
240 * mechanism.  The returned credential is used when a loaded client
241 * certificate is protected by a passphrase.
242 *
243 * @deprecated Provided for backward compatibility with the 1.3 API.
244 * Use svn_auth_get_ssl_client_cert_pw_file_provider2() instead.
245 */
246SVN_DEPRECATED
247void
248svn_client_get_ssl_client_cert_pw_file_provider(
249  svn_auth_provider_object_t **provider,
250  apr_pool_t *pool);
251
252
253/** Create and return @a *provider, an authentication provider of type
254 * #svn_auth_cred_ssl_server_trust_t, allocated in @a pool.
255 *
256 * @a *provider retrieves its credentials by using the @a prompt_func
257 * and @a prompt_baton.  The returned credential is used to override
258 * SSL security on an error.
259 *
260 * @deprecated Provided for backward compatibility with the 1.3 API.
261 * Use svn_auth_get_ssl_server_trust_prompt_provider() instead.
262 */
263SVN_DEPRECATED
264void
265svn_client_get_ssl_server_trust_prompt_provider(
266  svn_auth_provider_object_t **provider,
267  svn_auth_ssl_server_trust_prompt_func_t prompt_func,
268  void *prompt_baton,
269  apr_pool_t *pool);
270
271
272/** Create and return @a *provider, an authentication provider of type
273 * #svn_auth_cred_ssl_client_cert_t, allocated in @a pool.
274 *
275 * @a *provider retrieves its credentials by using the @a prompt_func
276 * and @a prompt_baton.  The returned credential is used to load the
277 * appropriate client certificate for authentication when requested by
278 * a server.  The prompt will be retried @a retry_limit times.
279 * For infinite retries, set @a retry_limit to value less than 0.
280 *
281 * @deprecated Provided for backward compatibility with the 1.3 API.
282 * Use svn_auth_get_ssl_client_cert_prompt_provider() instead.
283 */
284SVN_DEPRECATED
285void
286svn_client_get_ssl_client_cert_prompt_provider(
287  svn_auth_provider_object_t **provider,
288  svn_auth_ssl_client_cert_prompt_func_t prompt_func,
289  void *prompt_baton,
290  int retry_limit,
291  apr_pool_t *pool);
292
293
294/** Create and return @a *provider, an authentication provider of type
295 * #svn_auth_cred_ssl_client_cert_pw_t, allocated in @a pool.
296 *
297 * @a *provider retrieves its credentials by using the @a prompt_func
298 * and @a prompt_baton.  The returned credential is used when a loaded
299 * client certificate is protected by a passphrase.  The prompt will
300 * be retried @a retry_limit times. For infinite retries, set @a retry_limit
301 * to value less than 0.
302 *
303 * @deprecated Provided for backward compatibility with the 1.3 API.
304 * Use svn_auth_get_ssl_client_cert_pw_prompt_provider() instead.
305 */
306SVN_DEPRECATED
307void
308svn_client_get_ssl_client_cert_pw_prompt_provider(
309  svn_auth_provider_object_t **provider,
310  svn_auth_ssl_client_cert_pw_prompt_func_t prompt_func,
311  void *prompt_baton,
312  int retry_limit,
313  apr_pool_t *pool);
314
315/** @} */
316
317/**
318 * Revisions and Peg Revisions
319 *
320 * @defgroup clnt_revisions Revisions and Peg Revisions
321 *
322 * A brief word on operative and peg revisions.
323 *
324 * If the kind of the peg revision is #svn_opt_revision_unspecified, then it
325 * defaults to #svn_opt_revision_head for URLs and #svn_opt_revision_working
326 * for local paths.
327 *
328 * For deeper insight, please see the
329 * <a href="http://svnbook.red-bean.com/nightly/en/svn.advanced.pegrevs.html">
330 * Peg and Operative Revisions</a> section of the Subversion Book.
331 */
332
333/**
334 * Commit operations
335 *
336 * @defgroup clnt_commit Client commit subsystem
337 *
338 * @{
339 */
340
341/** This is a structure which stores a filename and a hash of property
342 * names and values.
343 *
344 * @deprecated Provided for backward compatibility with the 1.4 API.
345 */
346typedef struct svn_client_proplist_item_t
347{
348  /** The name of the node on which these properties are set. */
349  svn_stringbuf_t *node_name;
350
351  /** A hash of (const char *) property names, and (svn_string_t *) property
352   * values. */
353  apr_hash_t *prop_hash;
354
355} svn_client_proplist_item_t;
356
357/**
358 * The callback invoked by svn_client_proplist4().  Each invocation
359 * provides the regular and/or inherited properties of @a path, which is
360 * either a working copy path or a URL.  If @a prop_hash is not @c NULL, then
361 * it maps explicit <tt>const char *</tt> property names to
362 * <tt>svn_string_t *</tt> explicit property values.  If @a inherited_props
363 * is not @c NULL, then it is a depth-first ordered array of
364 * #svn_prop_inherited_item_t * structures representing the
365 * properties inherited by @a path.  Use @a scratch_pool for all temporary
366 * allocations.
367 *
368 * The #svn_prop_inherited_item_t->path_or_url members of the
369 * #svn_prop_inherited_item_t * structures in @a inherited_props are
370 * URLs if @a path is a URL or if @a path is a working copy path but the
371 * property represented by the structure is above the working copy root (i.e.
372 * the inherited property is from the cache).  In all other cases the
373 * #svn_prop_inherited_item_t->path_or_url members are absolute working copy
374 * paths.
375 *
376 * @since New in 1.8.
377 */
378typedef svn_error_t *(*svn_proplist_receiver2_t)(
379  void *baton,
380  const char *path,
381  apr_hash_t *prop_hash,
382  apr_array_header_t *inherited_props,
383  apr_pool_t *scratch_pool);
384
385/**
386 * Similar to #svn_proplist_receiver2_t, but doesn't return inherited
387 * properties.
388 *
389 * @deprecated Provided for backward compatibility with the 1.7 API.
390 *
391 * @since New in 1.5.
392 */
393typedef svn_error_t *(*svn_proplist_receiver_t)(
394  void *baton,
395  const char *path,
396  apr_hash_t *prop_hash,
397  apr_pool_t *pool);
398
399/**
400 * Return a duplicate of @a item, allocated in @a pool. No part of the new
401 * structure will be shared with @a item.
402 *
403 * @since New in 1.3.
404 *
405 * @deprecated Provided for backward compatibility with the 1.4 API.
406 */
407SVN_DEPRECATED
408svn_client_proplist_item_t *
409svn_client_proplist_item_dup(const svn_client_proplist_item_t *item,
410                             apr_pool_t *pool);
411
412/** Information about commits passed back to client from this module.
413 *
414 * @deprecated Provided for backward compatibility with the 1.2 API.
415 */
416typedef struct svn_client_commit_info_t
417{
418  /** just-committed revision. */
419  svn_revnum_t revision;
420
421  /** server-side date of the commit. */
422  const char *date;
423
424  /** author of the commit. */
425  const char *author;
426
427} svn_client_commit_info_t;
428
429
430/**
431 * @name Commit state flags
432 * @brief State flags for use with the #svn_client_commit_item3_t structure
433 * (see the note about the namespace for that structure, which also
434 * applies to these flags).
435 * @{
436 */
437#define SVN_CLIENT_COMMIT_ITEM_ADD         0x01
438#define SVN_CLIENT_COMMIT_ITEM_DELETE      0x02
439#define SVN_CLIENT_COMMIT_ITEM_TEXT_MODS   0x04
440#define SVN_CLIENT_COMMIT_ITEM_PROP_MODS   0x08
441#define SVN_CLIENT_COMMIT_ITEM_IS_COPY     0x10
442/** One of the flags for a commit item.  The node has a lock token that
443 * should be released after a successful commit and, if the node is also
444 * modified, transferred to the server as part of the commit process.
445 *
446 * @since New in 1.2. */
447#define SVN_CLIENT_COMMIT_ITEM_LOCK_TOKEN  0x20
448/** One of the flags for a commit item.  The node is the 'moved here'
449 * side of a local move.  This is used to check and enforce that the
450 * other side of the move is also included in the commit.
451 *
452 * @since New in 1.8. */
453#define SVN_CLIENT_COMMIT_ITEM_MOVED_HERE  0x40
454/** @} */
455
456/** The commit candidate structure.
457 *
458 * In order to avoid backwards compatibility problems clients should use
459 * svn_client_commit_item3_create() to allocate and initialize this
460 * structure instead of doing so themselves.
461 *
462 * @since New in 1.5.
463 */
464typedef struct svn_client_commit_item3_t
465{
466  /* IMPORTANT: If you extend this structure, add new fields to the end. */
467
468  /** absolute working-copy path of item. Always set during normal commits
469   * (and copies from a working copy) to the repository. Can only be NULL
470   * when stub commit items are created for operations that only involve
471   * direct repository operations. During WC->REPOS copy operations, this
472   * path is the WC source path of the operation. */
473  const char *path;
474
475  /** node kind (dir, file) */
476  svn_node_kind_t kind;
477
478  /** commit URL for this item. Points to the repository location of PATH
479   * during commits, or to the final URL of the item when copying from the
480   * working copy to the repository. */
481  const char *url;
482
483  /** revision of textbase */
484  svn_revnum_t revision;
485
486  /** copyfrom-url or NULL if not a copied item */
487  const char *copyfrom_url;
488
489  /** copyfrom-rev, valid when copyfrom_url != NULL */
490  svn_revnum_t copyfrom_rev;
491
492  /** state flags */
493  apr_byte_t state_flags;
494
495  /** An array of #svn_prop_t *'s, which are incoming changes from
496   * the repository to WC properties.  These changes are applied
497   * post-commit.
498   *
499   * When adding to this array, allocate the #svn_prop_t and its
500   * contents in @c incoming_prop_changes->pool, so that it has the
501   * same lifetime as this data structure.
502   *
503   * See https://issues.apache.org/jira/browse/SVN-806 for a
504   * description of what would happen if the post-commit process
505   * didn't group these changes together with all other changes to the
506   * item.
507   */
508  apr_array_header_t *incoming_prop_changes;
509
510  /** An array of #svn_prop_t *'s, which are outgoing changes to
511   * make to properties in the repository.  These extra property
512   * changes are declared pre-commit, and applied to the repository as
513   * part of a commit.
514   *
515   * When adding to this array, allocate the #svn_prop_t and its
516   * contents in @c outgoing_prop_changes->pool, so that it has the
517   * same lifetime as this data structure.
518   */
519  apr_array_header_t *outgoing_prop_changes;
520
521  /**
522   * When processing the commit this contains the relative path for
523   * the commit session. NULL until the commit item is preprocessed.
524   * @since New in 1.7.
525   */
526  const char *session_relpath;
527
528  /**
529   * When committing a move, this contains the absolute path where
530   * the node was directly moved from. (If an ancestor at the original
531   * location was moved then it points to where the node itself was
532   * moved from; not the original location.)
533   * @since New in 1.8.
534   */
535  const char *moved_from_abspath;
536
537} svn_client_commit_item3_t;
538
539/** The commit candidate structure.
540 *
541 * @deprecated Provided for backward compatibility with the 1.4 API.
542 */
543typedef struct svn_client_commit_item2_t
544{
545  /** absolute working-copy path of item */
546  const char *path;
547
548  /** node kind (dir, file) */
549  svn_node_kind_t kind;
550
551  /** commit URL for this item */
552  const char *url;
553
554  /** revision of textbase */
555  svn_revnum_t revision;
556
557  /** copyfrom-url or NULL if not a copied item */
558  const char *copyfrom_url;
559
560  /** copyfrom-rev, valid when copyfrom_url != NULL */
561  svn_revnum_t copyfrom_rev;
562
563  /** state flags */
564  apr_byte_t state_flags;
565
566  /** Analogous to the #svn_client_commit_item3_t.incoming_prop_changes
567   * field.
568   */
569  apr_array_header_t *wcprop_changes;
570} svn_client_commit_item2_t;
571
572/** The commit candidate structure.
573 *
574 * @deprecated Provided for backward compatibility with the 1.2 API.
575 */
576typedef struct svn_client_commit_item_t
577{
578  /** absolute working-copy path of item */
579  const char *path;
580
581  /** node kind (dir, file) */
582  svn_node_kind_t kind;
583
584  /** commit URL for this item */
585  const char *url;
586
587  /** revision (copyfrom-rev if _IS_COPY) */
588  svn_revnum_t revision;
589
590  /** copyfrom-url */
591  const char *copyfrom_url;
592
593  /** state flags */
594  apr_byte_t state_flags;
595
596  /** Analogous to the #svn_client_commit_item3_t.incoming_prop_changes
597   * field.
598   */
599  apr_array_header_t *wcprop_changes;
600
601} svn_client_commit_item_t;
602
603/** Return a new commit item object, allocated in @a pool.
604 *
605 * In order to avoid backwards compatibility problems, this function
606 * is used to initialize and allocate the #svn_client_commit_item3_t
607 * structure rather than doing so explicitly, as the size of this
608 * structure may change in the future.
609 *
610 * @since New in 1.6.
611 */
612svn_client_commit_item3_t *
613svn_client_commit_item3_create(apr_pool_t *pool);
614
615/** Like svn_client_commit_item3_create() but with a stupid "const"
616 * qualifier on the returned structure, and it returns an error that
617 * will never happen.
618 *
619 * @deprecated Provided for backward compatibility with the 1.5 API.
620 */
621SVN_DEPRECATED
622svn_error_t *
623svn_client_commit_item_create(const svn_client_commit_item3_t **item,
624                              apr_pool_t *pool);
625
626/**
627 * Return a duplicate of @a item, allocated in @a pool. No part of the
628 * new structure will be shared with @a item, except for the adm_access
629 * member.
630 *
631 * @since New in 1.5.
632 */
633svn_client_commit_item3_t *
634svn_client_commit_item3_dup(const svn_client_commit_item3_t *item,
635                            apr_pool_t *pool);
636
637/**
638 * Return a duplicate of @a item, allocated in @a pool. No part of the new
639 * structure will be shared with @a item.
640 *
641 * @deprecated Provided for backward compatibility with the 1.4 API.
642 */
643SVN_DEPRECATED
644svn_client_commit_item2_t *
645svn_client_commit_item2_dup(const svn_client_commit_item2_t *item,
646                            apr_pool_t *pool);
647
648/** Callback type used by commit-y operations to get a commit log message
649 * from the caller.
650 *
651 * Set @a *log_msg to the log message for the commit, allocated in @a
652 * pool, or @c NULL if wish to abort the commit process.  Set @a *tmp_file
653 * to the path of any temporary file which might be holding that log
654 * message, or @c NULL if no such file exists (though, if @a *log_msg is
655 * @c NULL, this value is undefined).  The log message MUST be a UTF8
656 * string with LF line separators.
657 *
658 * @a commit_items is a read-only array of #svn_client_commit_item3_t
659 * structures, which may be fully or only partially filled-in,
660 * depending on the type of commit operation.
661 *
662 * @a baton is provided along with the callback for use by the handler.
663 *
664 * All allocations should be performed in @a pool.
665 *
666 * @since New in 1.5.
667 */
668typedef svn_error_t *(*svn_client_get_commit_log3_t)(
669  const char **log_msg,
670  const char **tmp_file,
671  const apr_array_header_t *commit_items,
672  void *baton,
673  apr_pool_t *pool);
674
675/** Callback type used by commit-y operations to get a commit log message
676 * from the caller.
677 *
678 * Set @a *log_msg to the log message for the commit, allocated in @a
679 * pool, or @c NULL if wish to abort the commit process.  Set @a *tmp_file
680 * to the path of any temporary file which might be holding that log
681 * message, or @c NULL if no such file exists (though, if @a *log_msg is
682 * @c NULL, this value is undefined).  The log message MUST be a UTF8
683 * string with LF line separators.
684 *
685 * @a commit_items is a read-only array of #svn_client_commit_item2_t
686 * structures, which may be fully or only partially filled-in,
687 * depending on the type of commit operation.
688 *
689 * @a baton is provided along with the callback for use by the handler.
690 *
691 * All allocations should be performed in @a pool.
692 *
693 * @deprecated Provided for backward compatibility with the 1.3 API.
694 */
695typedef svn_error_t *(*svn_client_get_commit_log2_t)(
696  const char **log_msg,
697  const char **tmp_file,
698  const apr_array_header_t *commit_items,
699  void *baton,
700  apr_pool_t *pool);
701
702/** Callback type used by commit-y operations to get a commit log message
703 * from the caller.
704 *
705 * Set @a *log_msg to the log message for the commit, allocated in @a
706 * pool, or @c NULL if wish to abort the commit process.  Set @a *tmp_file
707 * to the path of any temporary file which might be holding that log
708 * message, or @c NULL if no such file exists (though, if @a *log_msg is
709 * @c NULL, this value is undefined).  The log message MUST be a UTF8
710 * string with LF line separators.
711 *
712 * @a commit_items is a read-only array of #svn_client_commit_item_t
713 * structures, which may be fully or only partially filled-in,
714 * depending on the type of commit operation.
715 *
716 * @a baton is provided along with the callback for use by the handler.
717 *
718 * All allocations should be performed in @a pool.
719 *
720 * @deprecated Provided for backward compatibility with the 1.2 API.
721 */
722typedef svn_error_t *(*svn_client_get_commit_log_t)(
723  const char **log_msg,
724  const char **tmp_file,
725  apr_array_header_t *commit_items,
726  void *baton,
727  apr_pool_t *pool);
728
729/** @} */
730
731/**
732 * Client blame
733 *
734 * @defgroup clnt_blame Client blame functionality
735 *
736 * @{
737 */
738
739/** Callback type used by svn_client_blame6() to notify the caller
740 * that line @a line_no of the blamed file was last changed in @a revision
741 * which has the revision properties @a rev_props, and that the contents were
742 * @a line.
743 *
744 * If svn_client_blame5() was called with @a include_merged_revisions set to
745 * TRUE, @a merged_revision, @a merged_rev_props and @a merged_path will be
746 * set, otherwise they will be NULL. @a merged_path will be set to the
747 * absolute repository path.
748 *
749 * All allocations should be performed in @a pool.
750 *
751 * @note If there is no blame information for this line, @a revision will be
752 * invalid and @a rev_props will be NULL. In this case @a local_change
753 * will be true if the reason there is no blame information is that the line
754 * was modified locally. In all other cases @a local_change will be false.
755 *
756 * Character Encoding and Line Splitting:
757 *
758 * It is up to the client to determine the character encoding. The @a line
759 * content is delivered without any encoding conversion. The line splitting
760 * is designed to work with ASCII-compatible encodings including UTF-8. Any
761 * of the byte sequences LF ("\n"), CR ("\n"), CR LF ("\r\n") ends a line
762 * and is not included in @a line. The @a line content can include all other
763 * byte values including zero (ASCII NUL).
764 *
765 * @note That is how line splitting is done on the final file content, from
766 * which this callback is driven. It is not entirely clear whether the line
767 * splitting used to calculate diffs between each revision and assign a
768 * revision number to each line is exactly compatible with this in all cases.
769 *
770 * Blaming files that have <tt>svn:mime-type</tt> set to something other
771 * than <tt>text/...</tt> requires the @a ignore_mime_type flag to be set to
772 * true when calling the svn_client_blame6 function.
773 *
774 * @since New in 1.12.
775 */
776typedef svn_error_t *(*svn_client_blame_receiver4_t)(
777  void *baton,
778  apr_int64_t line_no,
779  svn_revnum_t revision,
780  apr_hash_t *rev_props,
781  svn_revnum_t merged_revision,
782  apr_hash_t *merged_rev_props,
783  const char *merged_path,
784  const svn_string_t *line,
785  svn_boolean_t local_change,
786  apr_pool_t *pool);
787
788/**
789 * Similar to #svn_client_blame_receiver4_t, but with the @a line parameter
790 * as a (const char*) instead of an svn_string_t, and the parameters
791 * @a start_revnum and @a end_revnum contain the start and end revision
792 * number of the entire blame operation, as resolved from the repository
793 * inside svn_client_blame6().
794 *
795 * @deprecated Provided for backward compatibility with the 1.11 API.
796 * To replace @a start_revnum and @a end_revnum, see the corresponding
797 * output parameters in svn_client_blame6().
798 *
799 * @since New in 1.7.
800 */
801typedef svn_error_t *(*svn_client_blame_receiver3_t)(
802  void *baton,
803  svn_revnum_t start_revnum,
804  svn_revnum_t end_revnum,
805  apr_int64_t line_no,
806  svn_revnum_t revision,
807  apr_hash_t *rev_props,
808  svn_revnum_t merged_revision,
809  apr_hash_t *merged_rev_props,
810  const char *merged_path,
811  const char *line,
812  svn_boolean_t local_change,
813  apr_pool_t *pool);
814
815/**
816 * Similar to #svn_client_blame_receiver3_t, but with separate author and
817 * date revision properties instead of all revision properties, and without
818 * information about local changes.
819 *
820 * @deprecated Provided for backward compatibility with the 1.6 API.
821 *
822 * @since New in 1.5.
823 */
824typedef svn_error_t *(*svn_client_blame_receiver2_t)(
825  void *baton,
826  apr_int64_t line_no,
827  svn_revnum_t revision,
828  const char *author,
829  const char *date,
830  svn_revnum_t merged_revision,
831  const char *merged_author,
832  const char *merged_date,
833  const char *merged_path,
834  const char *line,
835  apr_pool_t *pool);
836
837/**
838 * Similar to #svn_client_blame_receiver2_t, but without @a merged_revision,
839 * @a merged_author, @a merged_date, or @a merged_path members.
840 *
841 * @note New in 1.4 is that the line is defined to contain only the line
842 * content (and no [partial] EOLs; which was undefined in older versions).
843 * Using this callback with svn_client_blame() or svn_client_blame2()
844 * will still give you the old behaviour.
845 *
846 * @deprecated Provided for backward compatibility with the 1.4 API.
847 */
848typedef svn_error_t *(*svn_client_blame_receiver_t)(
849  void *baton,
850  apr_int64_t line_no,
851  svn_revnum_t revision,
852  const char *author,
853  const char *date,
854  const char *line,
855  apr_pool_t *pool);
856
857
858/** @} */
859
860/**
861 * Client diff
862 *
863 * @defgroup clnt_diff Client diff functionality
864 *
865 * @{
866 */
867/** The difference type in an svn_diff_summarize_t structure.
868 *
869 * @since New in 1.4.
870 */
871typedef enum svn_client_diff_summarize_kind_t
872{
873  /** An item with no text modifications */
874  svn_client_diff_summarize_kind_normal,
875
876  /** An added item */
877  svn_client_diff_summarize_kind_added,
878
879  /** An item with text modifications */
880  svn_client_diff_summarize_kind_modified,
881
882  /** A deleted item */
883  svn_client_diff_summarize_kind_deleted
884} svn_client_diff_summarize_kind_t;
885
886
887/** A struct that describes the diff of an item. Passed to
888 * #svn_client_diff_summarize_func_t.
889 *
890 * @note Fields may be added to the end of this structure in future
891 * versions.  Therefore, users shouldn't allocate structures of this
892 * type, to preserve binary compatibility.
893 *
894 * @since New in 1.4.
895 */
896typedef struct svn_client_diff_summarize_t
897{
898  /** Path relative to the target.  If the target is a file, path is
899   * the empty string. */
900  const char *path;
901
902  /** Change kind */
903  svn_client_diff_summarize_kind_t summarize_kind;
904
905  /** Properties changed?  For consistency with 'svn status' output,
906   * this should be false if summarize_kind is _added or _deleted. */
907  svn_boolean_t prop_changed;
908
909  /** File or dir */
910  svn_node_kind_t node_kind;
911} svn_client_diff_summarize_t;
912
913/**
914 * Return a duplicate of @a diff, allocated in @a pool. No part of the new
915 * structure will be shared with @a diff.
916 *
917 * @since New in 1.4.
918 */
919svn_client_diff_summarize_t *
920svn_client_diff_summarize_dup(const svn_client_diff_summarize_t *diff,
921                              apr_pool_t *pool);
922
923
924/** A callback used in svn_client_diff_summarize2() and
925 * svn_client_diff_summarize_peg2() for reporting a @a diff summary.
926 *
927 * All allocations should be performed in @a pool.
928 *
929 * @a baton is a closure object; it should be provided by the implementation,
930 * and passed by the caller.
931 *
932 * @since New in 1.4.
933 */
934typedef svn_error_t *(*svn_client_diff_summarize_func_t)(
935  const svn_client_diff_summarize_t *diff,
936  void *baton,
937  apr_pool_t *pool);
938
939
940
941/** @} */
942
943
944/**
945 * Client context
946 *
947 * @defgroup clnt_ctx Client context management
948 *
949 * @{
950 */
951
952/** A client context structure, which holds client specific callbacks,
953 * batons, serves as a cache for configuration options, and other various
954 * and sundry things.  In order to avoid backwards compatibility problems
955 * clients should use svn_client_create_context() to allocate and
956 * initialize this structure instead of doing so themselves.
957 */
958typedef struct svn_client_ctx_t
959{
960  /** main authentication baton. */
961  svn_auth_baton_t *auth_baton;
962
963  /** notification callback function.
964   * This will be called by notify_func2() by default.
965   * @deprecated Provided for backward compatibility with the 1.1 API.
966   * Use @c notify_func2 instead. */
967  svn_wc_notify_func_t notify_func;
968
969  /** notification callback baton for notify_func()
970   * @deprecated Provided for backward compatibility with the 1.1 API.
971   * Use @c notify_baton2 instead */
972  void *notify_baton;
973
974  /** Log message callback function.  NULL means that Subversion
975    * should try not attempt to fetch a log message.
976    * @deprecated Provided for backward compatibility with the 1.2 API.
977    * Use @c log_msg_func2 instead. */
978  svn_client_get_commit_log_t log_msg_func;
979
980  /** log message callback baton
981    * @deprecated Provided for backward compatibility with the 1.2 API.
982    * Use @c log_msg_baton2 instead. */
983  void *log_msg_baton;
984
985  /** a hash mapping of <tt>const char *</tt> configuration file names to
986   * #svn_config_t *'s. For example, the '~/.subversion/config' file's
987   * contents should have the key "config".  May be left unset (or set to
988   * NULL) to use the built-in default settings and not use any configuration.
989   */
990  apr_hash_t *config;
991
992  /** a callback to be used to see if the client wishes to cancel the running
993   * operation. */
994  svn_cancel_func_t cancel_func;
995
996  /** a baton to pass to the cancellation callback. */
997  void *cancel_baton;
998
999  /** notification function, defaulting to a function that forwards
1000   * to notify_func().  If @c NULL, it will not be invoked.
1001   * @since New in 1.2. */
1002  svn_wc_notify_func2_t notify_func2;
1003
1004  /** notification baton for notify_func2().
1005   * @since New in 1.2. */
1006  void *notify_baton2;
1007
1008  /** Log message callback function. NULL means that Subversion
1009   *   should try log_msg_func.
1010   * @since New in 1.3. */
1011  svn_client_get_commit_log2_t log_msg_func2;
1012
1013  /** callback baton for log_msg_func2
1014   * @since New in 1.3. */
1015  void *log_msg_baton2;
1016
1017  /** Notification callback for network progress information.
1018   * May be NULL if not used.
1019   * @since New in 1.3. */
1020  svn_ra_progress_notify_func_t progress_func;
1021
1022  /** Callback baton for progress_func.
1023   * @since New in 1.3. */
1024  void *progress_baton;
1025
1026  /** Log message callback function. NULL means that Subversion
1027   *   should try @c log_msg_func2, then @c log_msg_func.
1028   * @since New in 1.5. */
1029  svn_client_get_commit_log3_t log_msg_func3;
1030
1031  /** The callback baton for @c log_msg_func3.
1032   * @since New in 1.5. */
1033  void *log_msg_baton3;
1034
1035  /** MIME types map.
1036   * @since New in 1.5. */
1037  apr_hash_t *mimetypes_map;
1038
1039  /** Conflict resolution callback and baton, if available.
1040   * @since New in 1.5. */
1041  svn_wc_conflict_resolver_func_t conflict_func;
1042  void *conflict_baton;
1043
1044  /** Custom client name string, or @c NULL.
1045   * @since New in 1.5. */
1046  const char *client_name;
1047
1048  /** Conflict resolution callback and baton, if available. NULL means that
1049   * subversion should try @c conflict_func.
1050   * @since New in 1.7. */
1051  svn_wc_conflict_resolver_func2_t conflict_func2;
1052  void *conflict_baton2;
1053
1054  /** A working copy context for the client operation to use.
1055   * This is initialized by svn_client_create_context() and should never
1056   * be @c NULL.
1057   *
1058   * @since New in 1.7.  */
1059  svn_wc_context_t *wc_ctx;
1060
1061  /** Check-tunnel callback
1062   *
1063   * If not @c NULL, and open_tunnel_func is also not @c NULL, this
1064   * callback will be invoked to check if open_tunnel_func should be
1065   * used to create a specific tunnel, or if the default tunnel
1066   * implementation (either built-in or configured in the client
1067   * configuration file) should be used instead.
1068   * @since New in 1.9.
1069   */
1070  svn_ra_check_tunnel_func_t check_tunnel_func;
1071
1072  /** Open-tunnel callback
1073   *
1074   * If not @c NULL, this callback will be invoked to create a tunnel
1075   * for a ra_svn connection that needs one, overriding any tunnel
1076   * definitions in the client config file. This callback is used only
1077   * for ra_svn and ignored by the other RA modules.
1078   * @since New in 1.9.
1079   */
1080  svn_ra_open_tunnel_func_t open_tunnel_func;
1081
1082  /** The baton used with check_tunnel_func and open_tunnel_func.
1083   * @since New in 1.9.
1084   */
1085  void *tunnel_baton;
1086} svn_client_ctx_t;
1087
1088/** Initialize a client context.
1089 * Set @a *ctx to a client context object, allocated in @a pool, that
1090 * represents a particular instance of an svn client. @a cfg_hash is used
1091 * to initialise the config member of the returned context object and should
1092 * remain valid for the lifetime of the object. @a cfg_hash may be @c NULL,
1093 * in which case it is ignored.
1094 *
1095 * In order to avoid backwards compatibility problems, clients must
1096 * use this function to initialize and allocate the
1097 * #svn_client_ctx_t structure rather than doing so themselves, as
1098 * the size of this structure may change in the future.
1099 *
1100 * The current implementation never returns error, but callers should
1101 * still check for error, for compatibility with future versions.
1102 *
1103 * @since New in 1.8.
1104 */
1105svn_error_t *
1106svn_client_create_context2(svn_client_ctx_t **ctx,
1107                           apr_hash_t *cfg_hash,
1108                           apr_pool_t *pool);
1109
1110
1111/** Similar to svn_client_create_context2 but passes a NULL @a cfg_hash.
1112 *
1113 * @deprecated Provided for backward compatibility with the 1.7 API.
1114 */
1115SVN_DEPRECATED
1116svn_error_t *
1117svn_client_create_context(svn_client_ctx_t **ctx,
1118                          apr_pool_t *pool);
1119
1120/** @} end group: Client context management */
1121
1122/**
1123 * @deprecated Provided for backward compatibility. This constant was never
1124 * used in released versions.
1125 */
1126#define SVN_CLIENT_AUTH_USERNAME            "username"
1127/**
1128 * @deprecated Provided for backward compatibility. This constant was never
1129 * used in released versions.
1130 */
1131#define SVN_CLIENT_AUTH_PASSWORD            "password"
1132
1133/** Client argument processing
1134 *
1135 * @defgroup clnt_cmdline Client command-line processing
1136 *
1137 * @{
1138 */
1139
1140/**
1141 * Pull remaining target arguments from @a os into @a *targets_p,
1142 * converting them to UTF-8, followed by targets from @a known_targets
1143 * (which might come from, for example, the "--targets" command line option).
1144 *
1145 * Process each target in one of the following ways.  For a repository-
1146 * relative URL: resolve to a full URL, contacting the repository if
1147 * necessary to do so, and then treat as a full URL.  For a URL: do some
1148 * IRI-to-URI encoding and some auto-escaping, and canonicalize.  For a
1149 * local path: canonicalize case and path separators.
1150 *
1151 * If @a keep_last_origpath_on_truepath_collision is TRUE, and there are
1152 * exactly two targets which both case-canonicalize to the same path, the last
1153 * target will be returned in the original non-case-canonicalized form.
1154 *
1155 * Allocate @a *targets_p and its elements in @a pool.
1156 *
1157 * @a ctx is required for possible repository authentication.
1158 *
1159 * If a path has the same name as a Subversion working copy
1160 * administrative directory, return #SVN_ERR_RESERVED_FILENAME_SPECIFIED;
1161 * if multiple reserved paths are encountered, return a chain of
1162 * errors, all of which are #SVN_ERR_RESERVED_FILENAME_SPECIFIED.  Do
1163 * not return this type of error in a chain with any other type of
1164 * error, and if this is the only type of error encountered, complete
1165 * the operation before returning the error(s).
1166 *
1167 * Return an error if a target is just a peg specifier with no path, such as
1168 * "@abc". Before v1.6.5 (r878062) this form was interpreted as a literal path;
1169 * it is now ambiguous. The form "@abc@" should now be used to refer to the
1170 * literal path "@abc" with no peg revision, or the form ".@abc" to refer to
1171 * the empty path with peg revision "abc".
1172 *
1173 * @since New in 1.7
1174 */
1175svn_error_t *
1176svn_client_args_to_target_array2(apr_array_header_t **targets_p,
1177                                 apr_getopt_t *os,
1178                                 const apr_array_header_t *known_targets,
1179                                 svn_client_ctx_t *ctx,
1180                                 svn_boolean_t keep_last_origpath_on_truepath_collision,
1181                                 apr_pool_t *pool);
1182
1183/**
1184 * Similar to svn_client_args_to_target_array2() but with
1185 * @a keep_last_origpath_on_truepath_collision always set to FALSE.
1186 *
1187 * @since Since 1.6.5, this returns an error if a path contains a peg
1188 * specifier with no path before it, such as "@abc".
1189 *
1190 * @deprecated Provided for backward compatibility with the 1.6 API.
1191 */
1192SVN_DEPRECATED
1193svn_error_t *
1194svn_client_args_to_target_array(apr_array_header_t **targets_p,
1195                                apr_getopt_t *os,
1196                                const apr_array_header_t *known_targets,
1197                                svn_client_ctx_t *ctx,
1198                                apr_pool_t *pool);
1199
1200/** @} group end: Client command-line processing */
1201
1202/** @} */
1203
1204/**
1205 * Client working copy management functions
1206 *
1207 * @defgroup clnt_wc Client working copy management
1208 *
1209 * @{
1210 */
1211
1212/**
1213 * @defgroup clnt_wc_checkout Checkout
1214 *
1215 * @{
1216 */
1217
1218
1219/**
1220 * Checkout a working copy from a repository.
1221 *
1222 * @param[out] result_rev   If non-NULL, the value of the revision checked
1223 *              out from the repository.
1224 * @param[in] URL       The repository URL of the checkout source.
1225 * @param[in] path      The root of the new working copy.
1226 * @param[in] peg_revision  The peg revision.
1227 * @param[in] revision  The operative revision.
1228 * @param[in] depth     The depth of the operation.  If #svn_depth_unknown,
1229 *              then behave as if for #svn_depth_infinity, except in the case
1230 *              of resuming a previous checkout of @a path (i.e., updating),
1231 *              in which case use the depth of the existing working copy.
1232 * @param[in] ignore_externals  If @c TRUE, don't process externals
1233 *              definitions as part of this operation.
1234 * @param[in] allow_unver_obstructions  If @c TRUE, then tolerate existing
1235 *              unversioned items that obstruct incoming paths.  Only
1236 *              obstructions of the same type (file or dir) as the added
1237 *              item are tolerated.  The text of obstructing files is left
1238 *              as-is, effectively treating it as a user modification after
1239 *              the checkout.  Working properties of obstructing items are
1240 *              set equal to the base properties. <br>
1241 *              If @c FALSE, then abort if there are any unversioned
1242 *              obstructing items.
1243 * @param[in] ctx   The standard client context, used for authentication and
1244 *              notification.
1245 * @param[in] pool  Used for any temporary allocation.
1246 *
1247 * @return A pointer to an #svn_error_t of the type (this list is not
1248 *         exhaustive): <br>
1249 *         #SVN_ERR_UNSUPPORTED_FEATURE if @a URL refers to a file rather
1250 *         than a directory; <br>
1251 *         #SVN_ERR_RA_ILLEGAL_URL if @a URL does not exist; <br>
1252 *         #SVN_ERR_CLIENT_BAD_REVISION if @a revision is not one of
1253 *         #svn_opt_revision_number, #svn_opt_revision_head, or
1254 *         #svn_opt_revision_date. <br>
1255 *         If no error occurred, return #SVN_NO_ERROR.
1256 *
1257 * @since New in 1.5.
1258 *
1259 * @see #svn_depth_t <br> #svn_client_ctx_t <br> @ref clnt_revisions for
1260 *      a discussion of operative and peg revisions.
1261 */
1262svn_error_t *
1263svn_client_checkout3(svn_revnum_t *result_rev,
1264                     const char *URL,
1265                     const char *path,
1266                     const svn_opt_revision_t *peg_revision,
1267                     const svn_opt_revision_t *revision,
1268                     svn_depth_t depth,
1269                     svn_boolean_t ignore_externals,
1270                     svn_boolean_t allow_unver_obstructions,
1271                     svn_client_ctx_t *ctx,
1272                     apr_pool_t *pool);
1273
1274
1275/**
1276 * Similar to svn_client_checkout3() but with @a allow_unver_obstructions
1277 * always set to FALSE, and @a depth set according to @a recurse: if
1278 * @a recurse is TRUE, @a depth is #svn_depth_infinity, if @a recurse
1279 * is FALSE, @a depth is #svn_depth_files.
1280 *
1281 * @deprecated Provided for backward compatibility with the 1.4 API.
1282 */
1283SVN_DEPRECATED
1284svn_error_t *
1285svn_client_checkout2(svn_revnum_t *result_rev,
1286                     const char *URL,
1287                     const char *path,
1288                     const svn_opt_revision_t *peg_revision,
1289                     const svn_opt_revision_t *revision,
1290                     svn_boolean_t recurse,
1291                     svn_boolean_t ignore_externals,
1292                     svn_client_ctx_t *ctx,
1293                     apr_pool_t *pool);
1294
1295
1296/**
1297 * Similar to svn_client_checkout2(), but with @a peg_revision
1298 * always set to #svn_opt_revision_unspecified and
1299 * @a ignore_externals always set to FALSE.
1300 *
1301 * @deprecated Provided for backward compatibility with the 1.1 API.
1302 */
1303SVN_DEPRECATED
1304svn_error_t *
1305svn_client_checkout(svn_revnum_t *result_rev,
1306                    const char *URL,
1307                    const char *path,
1308                    const svn_opt_revision_t *revision,
1309                    svn_boolean_t recurse,
1310                    svn_client_ctx_t *ctx,
1311                    apr_pool_t *pool);
1312/** @} */
1313
1314/**
1315 * @defgroup Update Bring a working copy up-to-date with a repository
1316 *
1317 * @{
1318 *
1319 */
1320
1321/**
1322 * Update working trees @a paths to @a revision, authenticating with the
1323 * authentication baton cached in @a ctx.  @a paths is an array of const
1324 * char * paths to be updated.  Unversioned paths that are direct children
1325 * of a versioned path will cause an update that attempts to add that path;
1326 * other unversioned paths are skipped.  If @a result_revs is not NULL,
1327 * @a *result_revs will be set to an array of svn_revnum_t with each
1328 * element set to the revision to which @a revision was resolved for the
1329 * corresponding element of @a paths.
1330 *
1331 * @a revision must be of kind #svn_opt_revision_number,
1332 * #svn_opt_revision_head, or #svn_opt_revision_date.  If @a
1333 * revision does not meet these requirements, return the error
1334 * #SVN_ERR_CLIENT_BAD_REVISION.
1335 *
1336 * The paths in @a paths can be from multiple working copies from multiple
1337 * repositories, but even if they all come from the same repository there
1338 * is no guarantee that revision represented by #svn_opt_revision_head
1339 * will remain the same as each path is updated.
1340 *
1341 * If @a ignore_externals is set, don't process externals definitions
1342 * as part of this operation.
1343 *
1344 * If @a depth is #svn_depth_infinity, update fully recursively.
1345 * Else if it is #svn_depth_immediates or #svn_depth_files, update
1346 * each target and its file entries, but not its subdirectories.  Else
1347 * if #svn_depth_empty, update exactly each target, nonrecursively
1348 * (essentially, update the target's properties).
1349 *
1350 * If @a depth is #svn_depth_unknown, take the working depth from
1351 * @a paths and then behave as described above.
1352 *
1353 * If @a depth_is_sticky is set and @a depth is not
1354 * #svn_depth_unknown, then in addition to updating PATHS, also set
1355 * their sticky ambient depth value to @a depth.
1356 *
1357 * If @a allow_unver_obstructions is TRUE then the update tolerates
1358 * existing unversioned items that obstruct added paths.  Only
1359 * obstructions of the same type (file or dir) as the added item are
1360 * tolerated.  The text of obstructing files is left as-is, effectively
1361 * treating it as a user modification after the update.  Working
1362 * properties of obstructing items are set equal to the base properties.
1363 * If @a allow_unver_obstructions is FALSE then the update will abort
1364 * if there are any unversioned obstructing items.
1365 *
1366 * If @a adds_as_modification is TRUE, a local addition at the same path
1367 * as an incoming addition of the same node kind results in a normal node
1368 * with a possible local modification, instead of a tree conflict.
1369 *
1370 * If @a make_parents is TRUE, create any non-existent parent
1371 * directories also by checking them out at depth=empty.
1372 *
1373 * If @a ctx->notify_func2 is non-NULL, invoke @a ctx->notify_func2 with
1374 * @a ctx->notify_baton2 for each item handled by the update, and also for
1375 * files restored from text-base.  If @a ctx->cancel_func is non-NULL, invoke
1376 * it passing @a ctx->cancel_baton at various places during the update.
1377 *
1378 * Use @a pool for any temporary allocation.
1379 *
1380 *  @todo  Multiple Targets
1381 *  - Up for debate:  an update on multiple targets is *not* atomic.
1382 *  Right now, svn_client_update only takes one path.  What's
1383 *  debatable is whether this should ever change.  On the one hand,
1384 *  it's kind of losing to have the client application loop over
1385 *  targets and call svn_client_update() on each one;  each call to
1386 *  update initializes a whole new repository session (network
1387 *  overhead, etc.)  On the other hand, it's a very simple
1388 *  implementation, and allows for the possibility that different
1389 *  targets may come from different repositories.
1390 *
1391 * @since New in 1.7.
1392 */
1393svn_error_t *
1394svn_client_update4(apr_array_header_t **result_revs,
1395                   const apr_array_header_t *paths,
1396                   const svn_opt_revision_t *revision,
1397                   svn_depth_t depth,
1398                   svn_boolean_t depth_is_sticky,
1399                   svn_boolean_t ignore_externals,
1400                   svn_boolean_t allow_unver_obstructions,
1401                   svn_boolean_t adds_as_modification,
1402                   svn_boolean_t make_parents,
1403                   svn_client_ctx_t *ctx,
1404                   apr_pool_t *pool);
1405
1406/**
1407 * Similar to svn_client_update4() but with @a make_parents always set
1408 * to FALSE and @a adds_as_modification set to TRUE.
1409 *
1410 * @deprecated Provided for backward compatibility with the 1.6 API.
1411 * @since New in 1.5.
1412 */
1413SVN_DEPRECATED
1414svn_error_t *
1415svn_client_update3(apr_array_header_t **result_revs,
1416                   const apr_array_header_t *paths,
1417                   const svn_opt_revision_t *revision,
1418                   svn_depth_t depth,
1419                   svn_boolean_t depth_is_sticky,
1420                   svn_boolean_t ignore_externals,
1421                   svn_boolean_t allow_unver_obstructions,
1422                   svn_client_ctx_t *ctx,
1423                   apr_pool_t *pool);
1424
1425/**
1426 * Similar to svn_client_update3() but with @a allow_unver_obstructions
1427 * always set to FALSE, @a depth_is_sticky to FALSE, and @a depth set
1428 * according to @a recurse: if @a recurse is TRUE, set @a depth to
1429 * #svn_depth_infinity, if @a recurse is FALSE, set @a depth to
1430 * #svn_depth_files.
1431 *
1432 * @deprecated Provided for backward compatibility with the 1.4 API.
1433 */
1434SVN_DEPRECATED
1435svn_error_t *
1436svn_client_update2(apr_array_header_t **result_revs,
1437                   const apr_array_header_t *paths,
1438                   const svn_opt_revision_t *revision,
1439                   svn_boolean_t recurse,
1440                   svn_boolean_t ignore_externals,
1441                   svn_client_ctx_t *ctx,
1442                   apr_pool_t *pool);
1443
1444/**
1445 * Similar to svn_client_update2() except that it accepts only a single
1446 * target in @a path, returns a single revision if @a result_rev is
1447 * not NULL, and @a ignore_externals is always set to FALSE.
1448 *
1449 * @deprecated Provided for backward compatibility with the 1.1 API.
1450 */
1451SVN_DEPRECATED
1452svn_error_t *
1453svn_client_update(svn_revnum_t *result_rev,
1454                  const char *path,
1455                  const svn_opt_revision_t *revision,
1456                  svn_boolean_t recurse,
1457                  svn_client_ctx_t *ctx,
1458                  apr_pool_t *pool);
1459/** @} */
1460
1461/**
1462 * @defgroup Switch Switch a working copy to another location.
1463 *
1464 * @{
1465 */
1466
1467/**
1468 * Switch an existing working copy directory to a different repository
1469 * location.
1470 *
1471 * This is normally used to switch a working copy directory over to another
1472 * line of development, such as a branch or a tag.  Switching an existing
1473 * working copy directory is more efficient than checking out @a url from
1474 * scratch.
1475 *
1476 * @param[out] result_rev   If non-NULL, the value of the revision to which
1477 *                          the working copy was actually switched.
1478 * @param[in] path      The directory to be switched.  This need not be the
1479 *              root of a working copy.
1480 * @param[in] url       The repository URL to switch to.
1481 * @param[in] peg_revision  The peg revision.
1482 * @param[in] revision  The operative revision.
1483 * @param[in] depth     The depth of the operation.  If #svn_depth_infinity,
1484 *                      switch fully recursively.  Else if #svn_depth_immediates,
1485 *                      switch @a path and its file children (if any), and
1486 *                      switch subdirectories but do not update them.  Else if
1487 *                      #svn_depth_files, switch just file children, ignoring
1488 *                      subdirectories completely.  Else if #svn_depth_empty,
1489 *                      switch just @a path and touch nothing underneath it.
1490 * @param[in] depth_is_sticky   If @c TRUE, and @a depth is not
1491 *              #svn_depth_unknown, then in addition to switching @a path, also
1492 *              set its sticky ambient depth value to @a depth.
1493 * @param[in] ignore_externals  If @c TRUE, don't process externals
1494 *              definitions as part of this operation.
1495 * @param[in] allow_unver_obstructions  If @c TRUE, then tolerate existing
1496 *              unversioned items that obstruct incoming paths.  Only
1497 *              obstructions of the same type (file or dir) as the added
1498 *              item are tolerated.  The text of obstructing files is left
1499 *              as-is, effectively treating it as a user modification after
1500 *              the checkout.  Working properties of obstructing items are
1501 *              set equal to the base properties. <br>
1502 *              If @c FALSE, then abort if there are any unversioned
1503 *              obstructing items.
1504 * @param[in] ignore_ancestry  If @c FALSE, then verify that the file
1505 *              or directory at @a path shares some common version control
1506 *              ancestry with the switch URL location (represented by the
1507 *              combination of @a url, @a peg_revision, and @a revision),
1508 *              and returning #SVN_ERR_CLIENT_UNRELATED_RESOURCES if they
1509 *              do not. If @c TRUE, no such sanity checks are performed.
1510 *
1511 * @param[in] ctx   The standard client context, used for authentication and
1512 *              notification.  The notifier is invoked for paths affected by
1513 *              the switch, and also for files which may be restored from the
1514 *              pristine store after being previously removed from the working
1515 *              copy.
1516 * @param[in] pool  Used for any temporary allocation.
1517 *
1518 * @return A pointer to an #svn_error_t of the type (this list is not
1519 *         exhaustive): <br>
1520 *         #SVN_ERR_CLIENT_BAD_REVISION if @a revision is not one of
1521 *         #svn_opt_revision_number, #svn_opt_revision_head, or
1522 *         #svn_opt_revision_date. <br>
1523 *         If no error occurred, return #SVN_NO_ERROR.
1524 *
1525 * @since New in 1.7.
1526 *
1527 * @see #svn_depth_t <br> #svn_client_ctx_t <br> @ref clnt_revisions for
1528 *      a discussion of operative and peg revisions.
1529 */
1530svn_error_t *
1531svn_client_switch3(svn_revnum_t *result_rev,
1532                   const char *path,
1533                   const char *url,
1534                   const svn_opt_revision_t *peg_revision,
1535                   const svn_opt_revision_t *revision,
1536                   svn_depth_t depth,
1537                   svn_boolean_t depth_is_sticky,
1538                   svn_boolean_t ignore_externals,
1539                   svn_boolean_t allow_unver_obstructions,
1540                   svn_boolean_t ignore_ancestry,
1541                   svn_client_ctx_t *ctx,
1542                   apr_pool_t *pool);
1543
1544
1545/**
1546 * Similar to svn_client_switch3() but with @a ignore_ancestry always
1547 * set to TRUE.
1548 *
1549 * @since New in 1.5.
1550 * @deprecated Provided for backward compatibility with the 1.4 API.
1551 */
1552SVN_DEPRECATED
1553svn_error_t *
1554svn_client_switch2(svn_revnum_t *result_rev,
1555                   const char *path,
1556                   const char *url,
1557                   const svn_opt_revision_t *peg_revision,
1558                   const svn_opt_revision_t *revision,
1559                   svn_depth_t depth,
1560                   svn_boolean_t depth_is_sticky,
1561                   svn_boolean_t ignore_externals,
1562                   svn_boolean_t allow_unver_obstructions,
1563                   svn_client_ctx_t *ctx,
1564                   apr_pool_t *pool);
1565
1566
1567/**
1568 * Similar to svn_client_switch2() but with @a allow_unver_obstructions,
1569 * @a ignore_externals, and @a depth_is_sticky always set to FALSE,
1570 * and @a depth set according to @a recurse: if @a recurse is TRUE,
1571 * set @a depth to #svn_depth_infinity, if @a recurse is FALSE, set
1572 * @a depth to #svn_depth_files.
1573 *
1574 * @deprecated Provided for backward compatibility with the 1.4 API.
1575 */
1576SVN_DEPRECATED
1577svn_error_t *
1578svn_client_switch(svn_revnum_t *result_rev,
1579                  const char *path,
1580                  const char *url,
1581                  const svn_opt_revision_t *revision,
1582                  svn_boolean_t recurse,
1583                  svn_client_ctx_t *ctx,
1584                  apr_pool_t *pool);
1585
1586/** @} */
1587
1588/** Callback for svn_client__layout_list()
1589 *
1590 * @warning EXPERIMENTAL.
1591 */
1592typedef svn_error_t * (*svn_client__layout_func_t)(
1593                            void *layout_baton,
1594                            const char *local_abspath,
1595                            const char *repos_root_url,
1596                            svn_boolean_t not_present,
1597                            svn_boolean_t url_changed,
1598                            const char *url,
1599                            svn_boolean_t revision_changed,
1600                            svn_revnum_t revision,
1601                            svn_boolean_t depth_changed,
1602                            svn_depth_t depth,
1603                            apr_pool_t *scratch_pool);
1604
1605/**
1606 * Describe the layout of the working copy below @a local_abspath to
1607 * the callback @a layout.
1608 *
1609 * @warning EXPERIMENTAL.
1610 */
1611SVN_EXPERIMENTAL
1612svn_error_t *
1613svn_client__layout_list(const char *local_abspath,
1614                        svn_client__layout_func_t layout,
1615                        void *layout_baton,
1616                        svn_client_ctx_t *ctx,
1617                        apr_pool_t *scratch_pool);
1618
1619
1620/**
1621 * @defgroup Add Begin versioning files/directories in a working copy.
1622 *
1623 * @{
1624 */
1625
1626/**
1627 * Schedule a working copy @a path for addition to the repository.
1628 *
1629 * If @a depth is #svn_depth_empty, add just @a path and nothing
1630 * below it.  If #svn_depth_files, add @a path and any file
1631 * children of @a path.  If #svn_depth_immediates, add @a path, any
1632 * file children, and any immediate subdirectories (but nothing
1633 * underneath those subdirectories).  If #svn_depth_infinity, add
1634 * @a path and everything under it fully recursively.
1635 *
1636 * @a path's parent must be under revision control already (unless
1637 * @a add_parents is TRUE), but @a path is not.
1638 *
1639 * If @a force is not set and @a path is already under version
1640 * control, return the error #SVN_ERR_ENTRY_EXISTS.  If @a force is
1641 * set, do not error on already-versioned items.  When used on a
1642 * directory in conjunction with a @a depth value greater than
1643 * #svn_depth_empty, this has the effect of scheduling for addition
1644 * any unversioned files and directories scattered within even a
1645 * versioned tree (up to @a depth).
1646 *
1647 * If @a ctx->notify_func2 is non-NULL, then for each added item, call
1648 * @a ctx->notify_func2 with @a ctx->notify_baton2 and the path of the
1649 * added item.
1650 *
1651 * If @a no_ignore is FALSE, don't add any file or directory (or recurse
1652 * into any directory) that is unversioned and found by recursion (as
1653 * opposed to being the explicit target @a path) and whose name matches the
1654 * svn:ignore property on its parent directory or the global-ignores list in
1655 * @a ctx->config. If @a no_ignore is TRUE, do include such files and
1656 * directories. (Note that an svn:ignore property can influence this
1657 * behaviour only when recursing into an already versioned directory with @a
1658 * force.)
1659 *
1660 * If @a no_autoprops is TRUE, don't set any autoprops on added files. If
1661 * @a no_autoprops is FALSE then all added files have autprops set as per
1662 * the auto-props list in @a ctx->config and the value of any
1663 * @c SVN_PROP_INHERITABLE_AUTO_PROPS properties inherited by the nearest
1664 * parents of @a path which are already under version control.
1665 *
1666 * If @a add_parents is TRUE, recurse up @a path's directory and look for
1667 * a versioned directory.  If found, add all intermediate paths between it
1668 * and @a path.  If not found, return #SVN_ERR_CLIENT_NO_VERSIONED_PARENT.
1669 *
1670 * @a scratch_pool is used for temporary allocations only.
1671 *
1672 * @par Important:
1673 * This is a *scheduling* operation.  No changes will
1674 * happen to the repository until a commit occurs.  This scheduling
1675 * can be removed with svn_client_revert2().
1676 *
1677 * @since New in 1.8.
1678 */
1679svn_error_t *
1680svn_client_add5(const char *path,
1681                svn_depth_t depth,
1682                svn_boolean_t force,
1683                svn_boolean_t no_ignore,
1684                svn_boolean_t no_autoprops,
1685                svn_boolean_t add_parents,
1686                svn_client_ctx_t *ctx,
1687                apr_pool_t *scratch_pool);
1688
1689/**
1690 * Similar to svn_client_add5(), but with @a no_autoprops always set to
1691 * FALSE.
1692 *
1693 * @deprecated Provided for backward compatibility with the 1.7 API.
1694 */
1695SVN_DEPRECATED
1696svn_error_t *
1697svn_client_add4(const char *path,
1698                svn_depth_t depth,
1699                svn_boolean_t force,
1700                svn_boolean_t no_ignore,
1701                svn_boolean_t add_parents,
1702                svn_client_ctx_t *ctx,
1703                apr_pool_t *pool);
1704
1705/**
1706 * Similar to svn_client_add4(), but with @a add_parents always set to
1707 * FALSE and @a depth set according to @a recursive: if TRUE, then
1708 * @a depth is #svn_depth_infinity, if FALSE, then #svn_depth_empty.
1709 *
1710 * @deprecated Provided for backward compatibility with the 1.4 API.
1711 */
1712SVN_DEPRECATED
1713svn_error_t *
1714svn_client_add3(const char *path,
1715                svn_boolean_t recursive,
1716                svn_boolean_t force,
1717                svn_boolean_t no_ignore,
1718                svn_client_ctx_t *ctx,
1719                apr_pool_t *pool);
1720
1721/**
1722 * Similar to svn_client_add3(), but with @a no_ignore always set to
1723 * FALSE.
1724 *
1725 * @deprecated Provided for backward compatibility with the 1.2 API.
1726 */
1727SVN_DEPRECATED
1728svn_error_t *
1729svn_client_add2(const char *path,
1730                svn_boolean_t recursive,
1731                svn_boolean_t force,
1732                svn_client_ctx_t *ctx,
1733                apr_pool_t *pool);
1734
1735/**
1736 * Similar to svn_client_add2(), but with @a force always set to FALSE.
1737 *
1738 * @deprecated Provided for backward compatibility with the 1.0 API.
1739 */
1740SVN_DEPRECATED
1741svn_error_t *
1742svn_client_add(const char *path,
1743               svn_boolean_t recursive,
1744               svn_client_ctx_t *ctx,
1745               apr_pool_t *pool);
1746
1747/** @} */
1748
1749/**
1750 * @defgroup Mkdir Create directories in a working copy or repository.
1751 *
1752 * @{
1753 */
1754
1755/** Create a directory, either in a repository or a working copy.
1756 *
1757 * @a paths is an array of (const char *) paths, either all local WC paths
1758 * or all URLs.
1759 *
1760 * If @a paths contains URLs, use the authentication baton in @a ctx
1761 * and @a message to immediately attempt to commit the creation of the
1762 * directories in @a paths in the repository.
1763 *
1764 * Else, create the directories on disk, and attempt to schedule them
1765 * for addition (using svn_client_add(), whose docstring you should
1766 * read).
1767 *
1768 * If @a make_parents is TRUE, create any non-existent parent directories
1769 * also.
1770 *
1771 * If non-NULL, @a revprop_table is a hash table holding additional,
1772 * custom revision properties (<tt>const char *</tt> names mapped to
1773 * <tt>svn_string_t *</tt> values) to be set on the new revision in
1774 * the event that this is a committing operation.  This table cannot
1775 * contain any standard Subversion properties.
1776 *
1777 * @a ctx->log_msg_func3/@a ctx->log_msg_baton3 are a callback/baton
1778 * combo that this function can use to query for a commit log message
1779 * when one is needed.
1780 *
1781 * If @a ctx->notify_func2 is non-NULL, when the directory has been created
1782 * (successfully) in the working copy, call @a ctx->notify_func2 with
1783 * @a ctx->notify_baton2 and the path of the new directory.  Note that this is
1784 * only called for items added to the working copy.
1785 *
1786 * If @a commit_callback is non-NULL, then for each successful commit, call
1787 * @a commit_callback with @a commit_baton and a #svn_commit_info_t for
1788 * the commit.
1789 *
1790 * @since New in 1.7.
1791 */
1792svn_error_t *
1793svn_client_mkdir4(const apr_array_header_t *paths,
1794                  svn_boolean_t make_parents,
1795                  const apr_hash_t *revprop_table,
1796                  svn_commit_callback2_t commit_callback,
1797                  void *commit_baton,
1798                  svn_client_ctx_t *ctx,
1799                  apr_pool_t *pool);
1800
1801/**
1802 * Similar to svn_client_mkdir4(), but returns the commit info in
1803 * @a *commit_info_p rather than through a callback function.
1804 *
1805 * @since New in 1.5.
1806 * @deprecated Provided for backward compatibility with the 1.6 API.
1807 */
1808SVN_DEPRECATED
1809svn_error_t *
1810svn_client_mkdir3(svn_commit_info_t **commit_info_p,
1811                  const apr_array_header_t *paths,
1812                  svn_boolean_t make_parents,
1813                  const apr_hash_t *revprop_table,
1814                  svn_client_ctx_t *ctx,
1815                  apr_pool_t *pool);
1816
1817
1818/**
1819 * Same as svn_client_mkdir3(), but with @a make_parents always FALSE,
1820 * and @a revprop_table always NULL.
1821 *
1822 * @since New in 1.3.
1823 * @deprecated Provided for backward compatibility with the 1.4 API.
1824 */
1825SVN_DEPRECATED
1826svn_error_t *
1827svn_client_mkdir2(svn_commit_info_t **commit_info_p,
1828                  const apr_array_header_t *paths,
1829                  svn_client_ctx_t *ctx,
1830                  apr_pool_t *pool);
1831
1832/**
1833 * Same as svn_client_mkdir2(), but takes the #svn_client_commit_info_t
1834 * type for @a commit_info_p.
1835 *
1836 * @deprecated Provided for backward compatibility with the 1.2 API.
1837 */
1838SVN_DEPRECATED
1839svn_error_t *
1840svn_client_mkdir(svn_client_commit_info_t **commit_info_p,
1841                 const apr_array_header_t *paths,
1842                 svn_client_ctx_t *ctx,
1843                 apr_pool_t *pool);
1844
1845/** @} */
1846
1847/**
1848 * @defgroup Delete Remove files/directories from a working copy or repository.
1849 *
1850 * @{
1851 */
1852
1853/** Delete items from a repository or working copy.
1854 *
1855 * @a paths is an array of (const char *) paths, either all local WC paths
1856 * or all URLs.
1857 *
1858 * If the paths in @a paths are URLs, use the authentication baton in
1859 * @a ctx and @a ctx->log_msg_func3/@a ctx->log_msg_baton3 to
1860 * immediately attempt to commit a deletion of the URLs from the
1861 * repository.  Every path must belong to the same repository.
1862 *
1863 * Else, schedule the working copy paths in @a paths for removal from
1864 * the repository.  Each path's parent must be under revision control.
1865 * This is just a *scheduling* operation.  No changes will happen to
1866 * the repository until a commit occurs.  This scheduling can be
1867 * removed with svn_client_revert2(). If a path is a file it is
1868 * immediately removed from the working copy. If the path is a
1869 * directory it will remain in the working copy but all the files, and
1870 * all unversioned items, it contains will be removed. If @a force is
1871 * not set then this operation will fail if any path contains locally
1872 * modified and/or unversioned items. If @a force is set such items
1873 * will be deleted.
1874 *
1875 * If the paths are working copy paths and @a keep_local is TRUE then
1876 * the paths will not be removed from the working copy, only scheduled
1877 * for removal from the repository.  Once the scheduled deletion is
1878 * committed, they will appear as unversioned paths in the working copy.
1879 *
1880 * If non-NULL, @a revprop_table is a hash table holding additional,
1881 * custom revision properties (<tt>const char *</tt> names mapped to
1882 * <tt>svn_string_t *</tt> values) to be set on the new revision in
1883 * the event that this is a committing operation.  This table cannot
1884 * contain any standard Subversion properties.
1885 *
1886 * @a ctx->log_msg_func3/@a ctx->log_msg_baton3 are a callback/baton
1887 * combo that this function can use to query for a commit log message
1888 * when one is needed.
1889 *
1890 * If @a ctx->notify_func2 is non-NULL, then for each item deleted, call
1891 * @a ctx->notify_func2 with @a ctx->notify_baton2 and the path of the deleted
1892 * item.
1893 *
1894 * If @a commit_callback is non-NULL, then for each successful commit, call
1895 * @a commit_callback with @a commit_baton and a #svn_commit_info_t for
1896 * the commit.
1897 *
1898 * @since New in 1.7.
1899 */
1900svn_error_t *
1901svn_client_delete4(const apr_array_header_t *paths,
1902                   svn_boolean_t force,
1903                   svn_boolean_t keep_local,
1904                   const apr_hash_t *revprop_table,
1905                   svn_commit_callback2_t commit_callback,
1906                   void *commit_baton,
1907                   svn_client_ctx_t *ctx,
1908                   apr_pool_t *pool);
1909
1910/**
1911 * Similar to svn_client_delete4(), but returns the commit info in
1912 * @a *commit_info_p rather than through a callback function.
1913 *
1914 * @since New in 1.5.
1915 * @deprecated Provided for backward compatibility with the 1.6 API.
1916 */
1917SVN_DEPRECATED
1918svn_error_t *
1919svn_client_delete3(svn_commit_info_t **commit_info_p,
1920                   const apr_array_header_t *paths,
1921                   svn_boolean_t force,
1922                   svn_boolean_t keep_local,
1923                   const apr_hash_t *revprop_table,
1924                   svn_client_ctx_t *ctx,
1925                   apr_pool_t *pool);
1926
1927/**
1928 * Similar to svn_client_delete3(), but with @a keep_local always set
1929 * to FALSE, and @a revprop_table passed as NULL.
1930 *
1931 * @deprecated Provided for backward compatibility with the 1.4 API.
1932 */
1933SVN_DEPRECATED
1934svn_error_t *
1935svn_client_delete2(svn_commit_info_t **commit_info_p,
1936                   const apr_array_header_t *paths,
1937                   svn_boolean_t force,
1938                   svn_client_ctx_t *ctx,
1939                   apr_pool_t *pool);
1940
1941/**
1942 * Similar to svn_client_delete2(), but takes the #svn_client_commit_info_t
1943 * type for @a commit_info_p.
1944 *
1945 * @deprecated Provided for backward compatibility with the 1.2 API.
1946 */
1947SVN_DEPRECATED
1948svn_error_t *
1949svn_client_delete(svn_client_commit_info_t **commit_info_p,
1950                  const apr_array_header_t *paths,
1951                  svn_boolean_t force,
1952                  svn_client_ctx_t *ctx,
1953                  apr_pool_t *pool);
1954
1955
1956/** @} */
1957
1958/**
1959 * @defgroup Import Import files into the repository.
1960 *
1961 * @{
1962 */
1963
1964/**
1965 * The callback invoked by svn_client_import5() before adding a node to the
1966 * list of nodes to be imported.
1967 *
1968 * @a baton is the value passed to @a svn_client_import5 as filter_baton.
1969 *
1970 * The callback receives the @a local_abspath for each node and the @a dirent
1971 * for it when walking the directory tree. Only the kind of node, including
1972 * special status is available in @a dirent.
1973 *
1974 * Implementations can set @a *filtered to TRUE, to make the import
1975 * process omit the node and (if the node is a directory) all its
1976 * descendants.
1977 *
1978 * @a scratch_pool can be used for temporary allocations.
1979 *
1980 * @since New in 1.8.
1981 */
1982typedef svn_error_t *(*svn_client_import_filter_func_t)(
1983  void *baton,
1984  svn_boolean_t *filtered,
1985  const char *local_abspath,
1986  const svn_io_dirent2_t *dirent,
1987  apr_pool_t *scratch_pool);
1988
1989/** Import file or directory @a path into repository directory @a url at
1990 * head, authenticating with the authentication baton cached in @a ctx,
1991 * and using @a ctx->log_msg_func3/@a ctx->log_msg_baton3 to get a log message
1992 * for the (implied) commit.  If some components of @a url do not exist
1993 * then create parent directories as necessary.
1994 *
1995 * This function reads an unversioned tree from disk and skips any ".svn"
1996 * directories. Even if a file or directory being imported is part of an
1997 * existing WC, this function sees it as unversioned and does not notice any
1998 * existing Subversion properties in it.
1999 *
2000 * If @a path is a directory, the contents of that directory are
2001 * imported directly into the directory identified by @a url.  Note that the
2002 * directory @a path itself is not imported -- that is, the basename of
2003 * @a path is not part of the import.
2004 *
2005 * If @a path is a file, then the dirname of @a url is the directory
2006 * receiving the import.  The basename of @a url is the filename in the
2007 * repository.  In this case if @a url already exists, return error.
2008 *
2009 * If @a ctx->notify_func2 is non-NULL, then call @a ctx->notify_func2 with
2010 * @a ctx->notify_baton2 as the import progresses, with any of the following
2011 * actions: #svn_wc_notify_commit_added,
2012 * #svn_wc_notify_commit_postfix_txdelta.
2013 *
2014 * Use @a scratch_pool for any temporary allocation.
2015 *
2016 * If non-NULL, @a revprop_table is a hash table holding additional,
2017 * custom revision properties (<tt>const char *</tt> names mapped to
2018 * <tt>svn_string_t *</tt> values) to be set on the new revision.
2019 * This table cannot contain any standard Subversion properties.
2020 *
2021 * @a ctx->log_msg_func3/@a ctx->log_msg_baton3 are a callback/baton
2022 * combo that this function can use to query for a commit log message
2023 * when one is needed.
2024 *
2025 * If @a depth is #svn_depth_empty, import just @a path and nothing
2026 * below it.  If #svn_depth_files, import @a path and any file
2027 * children of @a path.  If #svn_depth_immediates, import @a path, any
2028 * file children, and any immediate subdirectories (but nothing
2029 * underneath those subdirectories).  If #svn_depth_infinity, import
2030 * @a path and everything under it fully recursively.
2031 *
2032 * If @a no_ignore is @c FALSE, don't import any file or directory (or
2033 * recurse into any directory) that is found by recursion (as opposed to
2034 * being the explicit target @a path) and whose name matches the
2035 * global-ignores list in @a ctx->config. If @a no_ignore is @c TRUE, do
2036 * include such files and directories. (Note that svn:ignore properties are
2037 * not involved, as auto-props cannot set properties on directories and even
2038 * if the target is part of a WC the import ignores any existing
2039 * properties.)
2040 *
2041 * If @a no_autoprops is TRUE, don't set any autoprops on imported files. If
2042 * @a no_autoprops is FALSE then all imported files have autprops set as per
2043 * the auto-props list in @a ctx->config and the value of any
2044 * @c SVN_PROP_INHERITABLE_AUTO_PROPS properties inherited by and explicitly set
2045 * on @a url if @a url is already under versioned control, or the nearest parents
2046 * of @a path which are already under version control if not.
2047 *
2048 * If @a ignore_unknown_node_types is @c TRUE, ignore files of which the
2049 * node type is unknown, such as device files and pipes.
2050 *
2051 * If @a filter_callback is non-NULL, call it for each node that isn't ignored
2052 * for other reasons with @a filter_baton, to allow third party to ignore
2053 * specific nodes during importing.
2054 *
2055 * If @a commit_callback is non-NULL, then for each successful commit, call
2056 * @a commit_callback with @a commit_baton and a #svn_commit_info_t for
2057 * the commit.
2058 *
2059 * @since New in 1.8.
2060 */
2061svn_error_t *
2062svn_client_import5(const char *path,
2063                   const char *url,
2064                   svn_depth_t depth,
2065                   svn_boolean_t no_ignore,
2066                   svn_boolean_t no_autoprops,
2067                   svn_boolean_t ignore_unknown_node_types,
2068                   const apr_hash_t *revprop_table,
2069                   svn_client_import_filter_func_t filter_callback,
2070                   void *filter_baton,
2071                   svn_commit_callback2_t commit_callback,
2072                   void *commit_baton,
2073                   svn_client_ctx_t *ctx,
2074                   apr_pool_t *scratch_pool);
2075
2076/**
2077 * Similar to svn_client_import5(), but without support for an optional
2078 * @a filter_callback and @a no_autoprops always set to FALSE.
2079 *
2080 * @since New in 1.7.
2081 * @deprecated Provided for backward compatibility with the 1.7 API.
2082 */
2083SVN_DEPRECATED
2084svn_error_t *
2085svn_client_import4(const char *path,
2086                   const char *url,
2087                   svn_depth_t depth,
2088                   svn_boolean_t no_ignore,
2089                   svn_boolean_t ignore_unknown_node_types,
2090                   const apr_hash_t *revprop_table,
2091                   svn_commit_callback2_t commit_callback,
2092                   void *commit_baton,
2093                   svn_client_ctx_t *ctx,
2094                   apr_pool_t *pool);
2095
2096/**
2097 * Similar to svn_client_import4(), but returns the commit info in
2098 * @a *commit_info_p rather than through a callback function.
2099 *
2100 * @since New in 1.5.
2101 * @deprecated Provided for backward compatibility with the 1.6 API.
2102 */
2103SVN_DEPRECATED
2104svn_error_t *
2105svn_client_import3(svn_commit_info_t **commit_info_p,
2106                   const char *path,
2107                   const char *url,
2108                   svn_depth_t depth,
2109                   svn_boolean_t no_ignore,
2110                   svn_boolean_t ignore_unknown_node_types,
2111                   const apr_hash_t *revprop_table,
2112                   svn_client_ctx_t *ctx,
2113                   apr_pool_t *pool);
2114
2115/**
2116 * Similar to svn_client_import3(), but with @a ignore_unknown_node_types
2117 * always set to @c FALSE, @a revprop_table passed as NULL, and @a
2118 * depth set according to @a nonrecursive: if TRUE, then @a depth is
2119 * #svn_depth_files, else #svn_depth_infinity.
2120 *
2121 * @since New in 1.3.
2122 *
2123 * @deprecated Provided for backward compatibility with the 1.4 API
2124 */
2125SVN_DEPRECATED
2126svn_error_t *
2127svn_client_import2(svn_commit_info_t **commit_info_p,
2128                   const char *path,
2129                   const char *url,
2130                   svn_boolean_t nonrecursive,
2131                   svn_boolean_t no_ignore,
2132                   svn_client_ctx_t *ctx,
2133                   apr_pool_t *pool);
2134
2135/**
2136 * Similar to svn_client_import2(), but with @a no_ignore always set
2137 * to FALSE and using the #svn_client_commit_info_t type for
2138 * @a commit_info_p.
2139 *
2140 * @deprecated Provided for backward compatibility with the 1.2 API.
2141 */
2142SVN_DEPRECATED
2143svn_error_t *
2144svn_client_import(svn_client_commit_info_t **commit_info_p,
2145                  const char *path,
2146                  const char *url,
2147                  svn_boolean_t nonrecursive,
2148                  svn_client_ctx_t *ctx,
2149                  apr_pool_t *pool);
2150
2151/** @} */
2152
2153/**
2154 * @defgroup Commit Commit local modifications to the repository.
2155 *
2156 * @{
2157 */
2158
2159/**
2160 * Commit files or directories into repository, authenticating with
2161 * the authentication baton cached in @a ctx, and using
2162 * @a ctx->log_msg_func3/@a ctx->log_msg_baton3 to obtain the log message.
2163 * Set @a *commit_info_p to the results of the commit, allocated in @a pool.
2164 *
2165 * @a targets is an array of <tt>const char *</tt> paths to commit.  They
2166 * need not be canonicalized nor condensed; this function will take care of
2167 * that.  If @a targets has zero elements, then do nothing and return
2168 * immediately without error.
2169 *
2170 * If non-NULL, @a revprop_table is a hash table holding additional,
2171 * custom revision properties (<tt>const char *</tt> names mapped to
2172 * <tt>svn_string_t *</tt> values) to be set on the new revision.
2173 * This table cannot contain any standard Subversion properties.
2174 *
2175 * If @a ctx->notify_func2 is non-NULL, then call @a ctx->notify_func2 with
2176 * @a ctx->notify_baton2 as the commit progresses, with any of the following
2177 * actions: #svn_wc_notify_commit_modified, #svn_wc_notify_commit_added,
2178 * #svn_wc_notify_commit_deleted, #svn_wc_notify_commit_replaced,
2179 * #svn_wc_notify_commit_copied, #svn_wc_notify_commit_copied_replaced,
2180 * #svn_wc_notify_commit_postfix_txdelta.
2181 *
2182 * If @a depth is #svn_depth_infinity, commit all changes to and
2183 * below named targets.  If @a depth is #svn_depth_empty, commit
2184 * only named targets (that is, only property changes on named
2185 * directory targets, and property and content changes for named file
2186 * targets).  If @a depth is #svn_depth_files, behave as above for
2187 * named file targets, and for named directory targets, commit
2188 * property changes on a named directory and all changes to files
2189 * directly inside that directory.  If #svn_depth_immediates, behave
2190 * as for #svn_depth_files, and for subdirectories of any named
2191 * directory target commit as though for #svn_depth_empty.
2192 *
2193 * Unlock paths in the repository, unless @a keep_locks is TRUE.
2194 *
2195 * @a changelists is an array of <tt>const char *</tt> changelist
2196 * names, used as a restrictive filter on items that are committed;
2197 * that is, don't commit anything unless it's a member of one of those
2198 * changelists.  After the commit completes successfully, remove
2199 * changelist associations from the targets, unless @a
2200 * keep_changelists is set.  If @a changelists is
2201 * empty (or altogether @c NULL), no changelist filtering occurs.
2202 *
2203 * If @a commit_as_operations is set to FALSE, when a copy is committed
2204 * all changes below the copy are always committed at the same time
2205 * (independent of the value of @a depth). If @a commit_as_operations is
2206 * #TRUE, changes to descendants are only committed if they are itself
2207 * included via @a depth and targets.
2208 *
2209 * If @a include_file_externals and/or @a include_dir_externals are #TRUE,
2210 * also commit all file and/or dir externals (respectively) that are reached
2211 * by recursion, except for those externals which:
2212 *     - have a fixed revision, or
2213 *     - come from a different repository root URL (dir externals).
2214 * These flags affect only recursion; externals that directly appear in @a
2215 * targets are always included in the commit.
2216 *
2217 * ### TODO: currently, file externals hidden inside an unversioned dir are
2218 *     skipped deliberately, because we can't commit those yet.
2219 *     See STMT_SELECT_COMMITTABLE_EXTERNALS_BELOW.
2220 *
2221 * ### TODO: With @c depth_immediates, this function acts as if
2222 *     @a include_dir_externals was passed #FALSE, but caller expects
2223 *     immediate child dir externals to be included @c depth_empty.
2224 *
2225 * When @a commit_as_operations is #TRUE it is possible to delete a node and
2226 * all its descendants by selecting just the root of the deletion. If it is
2227 * set to #FALSE this will raise an error.
2228 *
2229 * If @a commit_callback is non-NULL, then for each successful commit, call
2230 * @a commit_callback with @a commit_baton and a #svn_commit_info_t for
2231 * the commit.
2232 *
2233 * @note #svn_depth_unknown and #svn_depth_exclude must not be passed
2234 * for @a depth.
2235 *
2236 * Use @a pool for any temporary allocations.
2237 *
2238 * @since New in 1.8.
2239 */
2240svn_error_t *
2241svn_client_commit6(const apr_array_header_t *targets,
2242                   svn_depth_t depth,
2243                   svn_boolean_t keep_locks,
2244                   svn_boolean_t keep_changelists,
2245                   svn_boolean_t commit_as_operations,
2246                   svn_boolean_t include_file_externals,
2247                   svn_boolean_t include_dir_externals,
2248                   const apr_array_header_t *changelists,
2249                   const apr_hash_t *revprop_table,
2250                   svn_commit_callback2_t commit_callback,
2251                   void *commit_baton,
2252                   svn_client_ctx_t *ctx,
2253                   apr_pool_t *pool);
2254
2255/**
2256 * Similar to svn_client_commit6(), but passes @a include_file_externals as
2257 * FALSE and @a include_dir_externals as FALSE.
2258 *
2259 * @since New in 1.7.
2260 * @deprecated Provided for backward compatibility with the 1.7 API.
2261 */
2262SVN_DEPRECATED
2263svn_error_t *
2264svn_client_commit5(const apr_array_header_t *targets,
2265                   svn_depth_t depth,
2266                   svn_boolean_t keep_locks,
2267                   svn_boolean_t keep_changelists,
2268                   svn_boolean_t commit_as_operations,
2269                   const apr_array_header_t *changelists,
2270                   const apr_hash_t *revprop_table,
2271                   svn_commit_callback2_t commit_callback,
2272                   void *commit_baton,
2273                   svn_client_ctx_t *ctx,
2274                   apr_pool_t *pool);
2275
2276/**
2277 * Similar to svn_client_commit5(), but returns the commit info in
2278 * @a *commit_info_p rather than through a callback function.  Does not use
2279 * #svn_wc_notify_commit_copied or #svn_wc_notify_commit_copied_replaced
2280 * (preferring #svn_wc_notify_commit_added and
2281 * #svn_wc_notify_commit_replaced, respectively, instead).
2282 *
2283 * Also, if no error is returned and @a (*commit_info_p)->revision is set to
2284 * #SVN_INVALID_REVNUM, then the commit was a no-op; nothing needed to
2285 * be committed.
2286 *
2287 * Sets @a commit_as_operations to FALSE to match Subversion 1.6's behavior.
2288 *
2289 * @since New in 1.5.
2290 * @deprecated Provided for backward compatibility with the 1.6 API.
2291 */
2292SVN_DEPRECATED
2293svn_error_t *
2294svn_client_commit4(svn_commit_info_t **commit_info_p,
2295                   const apr_array_header_t *targets,
2296                   svn_depth_t depth,
2297                   svn_boolean_t keep_locks,
2298                   svn_boolean_t keep_changelists,
2299                   const apr_array_header_t *changelists,
2300                   const apr_hash_t *revprop_table,
2301                   svn_client_ctx_t *ctx,
2302                   apr_pool_t *pool);
2303
2304/**
2305 * Similar to svn_client_commit4(), but always with NULL for
2306 * @a changelist_name, FALSE for @a keep_changelist, NULL for @a
2307 * revprop_table, and @a depth set according to @a recurse: if @a
2308 * recurse is TRUE, use #svn_depth_infinity, else #svn_depth_empty.
2309 *
2310 * @deprecated Provided for backward compatibility with the 1.4 API.
2311 *
2312 * @since New in 1.3.
2313 */
2314SVN_DEPRECATED
2315svn_error_t *
2316svn_client_commit3(svn_commit_info_t **commit_info_p,
2317                   const apr_array_header_t *targets,
2318                   svn_boolean_t recurse,
2319                   svn_boolean_t keep_locks,
2320                   svn_client_ctx_t *ctx,
2321                   apr_pool_t *pool);
2322
2323/**
2324 * Similar to svn_client_commit3(), but uses #svn_client_commit_info_t
2325 * for @a commit_info_p.
2326 *
2327 * @deprecated Provided for backward compatibility with the 1.2 API.
2328 *
2329 * @since New in 1.2.
2330 */
2331SVN_DEPRECATED
2332svn_error_t *
2333svn_client_commit2(svn_client_commit_info_t **commit_info_p,
2334                   const apr_array_header_t *targets,
2335                   svn_boolean_t recurse,
2336                   svn_boolean_t keep_locks,
2337                   svn_client_ctx_t *ctx,
2338                   apr_pool_t *pool);
2339
2340/**
2341 * Similar to svn_client_commit2(), but with @a keep_locks set to
2342 * TRUE and @a nonrecursive instead of @a recurse.
2343 *
2344 * @deprecated Provided for backward compatibility with the 1.1 API.
2345 */
2346SVN_DEPRECATED
2347svn_error_t *
2348svn_client_commit(svn_client_commit_info_t **commit_info_p,
2349                  const apr_array_header_t *targets,
2350                  svn_boolean_t nonrecursive,
2351                  svn_client_ctx_t *ctx,
2352                  apr_pool_t *pool);
2353
2354/** @} */
2355
2356/**
2357 * @defgroup Status Report interesting information about paths in the \
2358 *                  working copy.
2359 *
2360 * @{
2361 */
2362
2363/**
2364 * Structure for holding the "status" of a working copy item.
2365 *
2366 * @note Fields may be added to the end of this structure in future
2367 * versions.  Therefore, to preserve binary compatibility, users
2368 * should not directly allocate structures of this type.
2369 *
2370 * @since New in 1.7.
2371 */
2372typedef struct svn_client_status_t
2373{
2374  /** The kind of node as recorded in the working copy */
2375  svn_node_kind_t kind;
2376
2377  /** The absolute path to the node */
2378  const char *local_abspath;
2379
2380  /** The actual size of the working file on disk, or SVN_INVALID_FILESIZE
2381   * if unknown (or if the item isn't a file at all). */
2382  svn_filesize_t filesize;
2383
2384  /** If the path is under version control, versioned is TRUE, otherwise
2385   * FALSE. */
2386  svn_boolean_t versioned;
2387
2388  /** Set to TRUE if the node is the victim of some kind of conflict. */
2389  svn_boolean_t conflicted;
2390
2391  /** The status of the node, based on the restructuring changes and if the
2392   * node has no restructuring changes the text and prop status. */
2393  enum svn_wc_status_kind node_status;
2394
2395  /** The status of the text of the node, not including restructuring changes.
2396   * Valid values are: svn_wc_status_none, svn_wc_status_normal,
2397   * svn_wc_status_modified and svn_wc_status_conflicted. */
2398  enum svn_wc_status_kind text_status;
2399
2400  /** The status of the node's properties.
2401   * Valid values are: svn_wc_status_none, svn_wc_status_normal,
2402   * svn_wc_status_modified and svn_wc_status_conflicted. */
2403  enum svn_wc_status_kind prop_status;
2404
2405  /** A node can be 'locked' if a working copy update is in progress or
2406   * was interrupted. */
2407  svn_boolean_t wc_is_locked;
2408
2409  /** A file or directory can be 'copied' if it's scheduled for
2410   * addition-with-history (or part of a subtree that is scheduled as such.).
2411   */
2412  svn_boolean_t copied;
2413
2414  /** The URL of the repository root. */
2415  const char *repos_root_url;
2416
2417  /** The UUID of the repository */
2418  const char *repos_uuid;
2419
2420  /** The in-repository path relative to the repository root. */
2421  const char *repos_relpath;
2422
2423  /** Base revision. */
2424  svn_revnum_t revision;
2425
2426  /** Last revision this was changed */
2427  svn_revnum_t changed_rev;
2428
2429  /** Date of last commit. */
2430  apr_time_t changed_date;
2431
2432  /** Last commit author of this item */
2433  const char *changed_author;
2434
2435  /** A file or directory can be 'switched' if the switch command has been
2436   * used.  If this is TRUE, then file_external will be FALSE.
2437   */
2438  svn_boolean_t switched;
2439
2440  /** If the item is a file that was added to the working copy with an
2441   * svn:externals; if file_external is TRUE, then switched is always
2442   * FALSE.
2443   */
2444  svn_boolean_t file_external;
2445
2446  /** The locally present lock. (Values of path, token, owner, comment and
2447   * are available if a lock is present) */
2448  const svn_lock_t *lock;
2449
2450  /** Which changelist this item is part of, or NULL if not part of any. */
2451  const char *changelist;
2452
2453  /** The depth of the node as recorded in the working copy
2454   * (#svn_depth_unknown for files or when no depth is recorded) */
2455  svn_depth_t depth;
2456
2457  /**
2458   * @defgroup svn_wc_status_ood WC out-of-date info from the repository
2459   * @{
2460   *
2461   * When the working copy item is out-of-date compared to the
2462   * repository, the following fields represent the state of the
2463   * youngest revision of the item in the repository.  If the working
2464   * copy is not out of date, the fields are initialized as described
2465   * below.
2466   */
2467
2468  /** Set to the node kind of the youngest commit, or #svn_node_none
2469   * if not out of date. */
2470  svn_node_kind_t ood_kind;
2471
2472  /** The status of the node, based on the text status if the node has no
2473   * restructuring changes */
2474  enum svn_wc_status_kind repos_node_status;
2475
2476  /** The node's text status in the repository. */
2477  enum svn_wc_status_kind repos_text_status;
2478
2479  /** The node's property status in the repository. */
2480  enum svn_wc_status_kind repos_prop_status;
2481
2482  /** The node's lock in the repository, if any. */
2483  const svn_lock_t *repos_lock;
2484
2485  /** Set to the youngest committed revision, or #SVN_INVALID_REVNUM
2486   * if not out of date. */
2487  svn_revnum_t ood_changed_rev;
2488
2489  /** Set to the most recent commit date, or @c 0 if not out of date. */
2490  apr_time_t ood_changed_date;
2491
2492  /** Set to the user name of the youngest commit, or @c NULL if not
2493   * out of date or non-existent.  Because a non-existent @c
2494   * svn:author property has the same behavior as an out-of-date
2495   * working copy, examine @c ood_changed_rev to determine whether
2496   * the working copy is out of date. */
2497  const char *ood_changed_author;
2498
2499  /** @} */
2500
2501  /** Reserved for libsvn_client's internal use; this value is only to be used
2502   * for libsvn_client backwards compatibility wrappers. This value may be NULL
2503   * or to other data in future versions. */
2504  const void *backwards_compatibility_baton;
2505
2506  /** Set to the local absolute path that this node was moved from, if this
2507   * file or directory has been moved here locally and is the root of that
2508   * move. Otherwise set to NULL.
2509   *
2510   * This will be NULL for moved-here nodes that are just part of a subtree
2511   * that was moved along (and are not themselves a root of a different move
2512   * operation).
2513   *
2514   * @since New in 1.8. */
2515  const char *moved_from_abspath;
2516
2517  /** Set to the local absolute path that this node was moved to, if this file
2518   * or directory has been moved away locally and corresponds to the root
2519   * of the destination side of the move. Otherwise set to NULL.
2520   *
2521   * Note: Saying just "root" here could be misleading. For example:
2522   *   svn mv A AA;
2523   *   svn mv AA/B BB;
2524   * creates a situation where A/B is moved-to BB, but one could argue that
2525   * the move source's root actually was AA/B. Note that, as far as the
2526   * working copy is concerned, above case is exactly identical to:
2527   *   svn mv A/B BB;
2528   *   svn mv A AA;
2529   * In both situations, @a moved_to_abspath would be set for nodes A (moved
2530   * to AA) and A/B (moved to BB), only.
2531   *
2532   * This will be NULL for moved-away nodes that were just part of a subtree
2533   * that was moved along (and are not themselves a root of a different move
2534   * operation).
2535   *
2536   * @since New in 1.8. */
2537  const char *moved_to_abspath;
2538
2539  /* NOTE! Please update svn_client_status_dup() when adding new fields here. */
2540} svn_client_status_t;
2541
2542/**
2543 * Return a duplicate of @a status, allocated in @a result_pool. No part of the new
2544 * structure will be shared with @a status.
2545 *
2546 * @since New in 1.7.
2547 */
2548svn_client_status_t *
2549svn_client_status_dup(const svn_client_status_t *status,
2550                      apr_pool_t *result_pool);
2551
2552/**
2553 * A callback for reporting a @a status about @a path (which may be an
2554 * absolute or relative path).
2555 *
2556 * @a baton is a closure object; it should be provided by the
2557 * implementation, and passed by the caller.
2558 *
2559 * @a scratch_pool will be cleared between invocations to the callback.
2560 *
2561 * @since New in 1.7.
2562 */
2563typedef svn_error_t *(*svn_client_status_func_t)(
2564                                            void *baton,
2565                                            const char *path,
2566                                            const svn_client_status_t *status,
2567                                            apr_pool_t *scratch_pool);
2568
2569/**
2570 * Given @a path to a working copy directory (or single file), call
2571 * @a status_func/status_baton with a set of #svn_wc_status_t *
2572 * structures which describe the status of @a path, and its children
2573 * (recursing according to @a depth).
2574 *
2575 *    - If @a get_all is set, retrieve all entries; otherwise,
2576 *      retrieve only "interesting" entries (local mods and/or
2577 *      out of date).
2578 *
2579 *    - If @a check_out_of_date is set, contact the repository and
2580 *      augment the status structures with information about
2581 *      out-of-dateness (with respect to @a revision).  Also, if @a
2582 *      result_rev is not @c NULL, set @a *result_rev to the actual
2583 *      revision against which the working copy was compared (@a
2584 *      *result_rev is not meaningful unless @a check_out_of_date is
2585 *      set).
2586 *
2587 *    - If @a check_working_copy is not set, do not scan the working
2588 *      copy for local modifications. This parameter will be ignored
2589 *      unless @a check_out_of_date is set.  When set, the status
2590 *      report will not contain any information about local changes in
2591 *      the working copy; this includes local deletions and
2592 *      replacements.
2593 *
2594 * If @a no_ignore is @c FALSE, don't report any file or directory (or
2595 * recurse into any directory) that is found by recursion (as opposed to
2596 * being the explicit target @a path) and whose name matches the
2597 * svn:ignore property on its parent directory or the global-ignores
2598 * list in @a ctx->config. If @a no_ignore is @c TRUE, report each such
2599 * file or directory with the status code #svn_wc_status_ignored.
2600 *
2601 * If @a ignore_externals is not set, then recurse into externals
2602 * definitions (if any exist) after handling the main target.  This
2603 * calls the client notification function (in @a ctx) with the
2604 * #svn_wc_notify_status_external action before handling each externals
2605 * definition, and with #svn_wc_notify_status_completed
2606 * after each.
2607 *
2608 * If @a depth_as_sticky is set and @a depth is not
2609 * #svn_depth_unknown, then the status is calculated as if depth_is_sticky
2610 * was passed to an equivalent update command.
2611 *
2612 * @a changelists is an array of <tt>const char *</tt> changelist
2613 * names, used as a restrictive filter on items whose statuses are
2614 * reported; that is, don't report status about any item unless
2615 * it's a member of one of those changelists.  If @a changelists is
2616 * empty (or altogether @c NULL), no changelist filtering occurs.
2617 *
2618 * If @a path is an absolute path then the @c path parameter passed in each
2619 * call to @a status_func will be an absolute path.
2620 *
2621 * All temporary allocations are performed in @a scratch_pool.
2622 *
2623 * @since New in 1.9.
2624 */
2625svn_error_t *
2626svn_client_status6(svn_revnum_t *result_rev,
2627                   svn_client_ctx_t *ctx,
2628                   const char *path,
2629                   const svn_opt_revision_t *revision,
2630                   svn_depth_t depth,
2631                   svn_boolean_t get_all,
2632                   svn_boolean_t check_out_of_date,
2633                   svn_boolean_t check_working_copy,
2634                   svn_boolean_t no_ignore,
2635                   svn_boolean_t ignore_externals,
2636                   svn_boolean_t depth_as_sticky,
2637                   const apr_array_header_t *changelists,
2638                   svn_client_status_func_t status_func,
2639                   void *status_baton,
2640                   apr_pool_t *scratch_pool);
2641
2642
2643/**
2644 * Same as svn_client_status6(), but with @a check_out_of_date set to
2645 * @a update and @a check_working_copy set to @c TRUE.
2646 *
2647 * @since New in 1.7.
2648 * @deprecated Provided for backward compatibility with the 1.8 API.
2649 */
2650SVN_DEPRECATED
2651svn_error_t *
2652svn_client_status5(svn_revnum_t *result_rev,
2653                   svn_client_ctx_t *ctx,
2654                   const char *path,
2655                   const svn_opt_revision_t *revision,
2656                   svn_depth_t depth,
2657                   svn_boolean_t get_all,
2658                   svn_boolean_t update,
2659                   svn_boolean_t no_ignore,
2660                   svn_boolean_t ignore_externals,
2661                   svn_boolean_t depth_as_sticky,
2662                   const apr_array_header_t *changelists,
2663                   svn_client_status_func_t status_func,
2664                   void *status_baton,
2665                   apr_pool_t *scratch_pool);
2666
2667/**
2668 * Same as svn_client_status5(), but using #svn_wc_status_func3_t
2669 * instead of #svn_client_status_func_t and depth_as_sticky set to TRUE.
2670 *
2671 * @since New in 1.6.
2672 * @deprecated Provided for backward compatibility with the 1.6 API.
2673 */
2674SVN_DEPRECATED
2675svn_error_t *
2676svn_client_status4(svn_revnum_t *result_rev,
2677                   const char *path,
2678                   const svn_opt_revision_t *revision,
2679                   svn_wc_status_func3_t status_func,
2680                   void *status_baton,
2681                   svn_depth_t depth,
2682                   svn_boolean_t get_all,
2683                   svn_boolean_t update,
2684                   svn_boolean_t no_ignore,
2685                   svn_boolean_t ignore_externals,
2686                   const apr_array_header_t *changelists,
2687                   svn_client_ctx_t *ctx,
2688                   apr_pool_t *pool);
2689
2690/**
2691 * Same as svn_client_status4(), but using an #svn_wc_status_func2_t
2692 * instead of an #svn_wc_status_func3_t.
2693 *
2694 * @since New in 1.5.
2695 * @deprecated Provided for backward compatibility with the 1.5 API.
2696 */
2697SVN_DEPRECATED
2698svn_error_t *
2699svn_client_status3(svn_revnum_t *result_rev,
2700                   const char *path,
2701                   const svn_opt_revision_t *revision,
2702                   svn_wc_status_func2_t status_func,
2703                   void *status_baton,
2704                   svn_depth_t depth,
2705                   svn_boolean_t get_all,
2706                   svn_boolean_t update,
2707                   svn_boolean_t no_ignore,
2708                   svn_boolean_t ignore_externals,
2709                   const apr_array_header_t *changelists,
2710                   svn_client_ctx_t *ctx,
2711                   apr_pool_t *pool);
2712
2713/**
2714 * Like svn_client_status3(), except with @a changelists passed as @c
2715 * NULL, and with @a recurse instead of @a depth.  If @a recurse is
2716 * TRUE, behave as if for #svn_depth_infinity; else if @a recurse is
2717 * FALSE, behave as if for #svn_depth_immediates.
2718 *
2719 * @since New in 1.2.
2720 * @deprecated Provided for backward compatibility with the 1.4 API.
2721 */
2722SVN_DEPRECATED
2723svn_error_t *
2724svn_client_status2(svn_revnum_t *result_rev,
2725                   const char *path,
2726                   const svn_opt_revision_t *revision,
2727                   svn_wc_status_func2_t status_func,
2728                   void *status_baton,
2729                   svn_boolean_t recurse,
2730                   svn_boolean_t get_all,
2731                   svn_boolean_t update,
2732                   svn_boolean_t no_ignore,
2733                   svn_boolean_t ignore_externals,
2734                   svn_client_ctx_t *ctx,
2735                   apr_pool_t *pool);
2736
2737
2738/**
2739 * Similar to svn_client_status2(), but with @a ignore_externals
2740 * always set to FALSE, taking the #svn_wc_status_func_t type
2741 * instead of the #svn_wc_status_func2_t type for @a status_func,
2742 * and requiring @a *revision to be non-const even though it is
2743 * treated as constant.
2744 *
2745 * @deprecated Provided for backward compatibility with the 1.1 API.
2746 */
2747SVN_DEPRECATED
2748svn_error_t *
2749svn_client_status(svn_revnum_t *result_rev,
2750                  const char *path,
2751                  svn_opt_revision_t *revision,
2752                  svn_wc_status_func_t status_func,
2753                  void *status_baton,
2754                  svn_boolean_t recurse,
2755                  svn_boolean_t get_all,
2756                  svn_boolean_t update,
2757                  svn_boolean_t no_ignore,
2758                  svn_client_ctx_t *ctx,
2759                  apr_pool_t *pool);
2760
2761/** @} */
2762
2763/**
2764 * @defgroup Log View information about previous revisions of an object.
2765 *
2766 * @{
2767 */
2768
2769/**
2770 * Invoke @a receiver with @a receiver_baton on each log message from
2771 * each (#svn_opt_revision_range_t *) range in @a revision_ranges in turn,
2772 * inclusive (but never invoke @a receiver on a given log message more
2773 * than once).
2774 *
2775 * @a targets contains either a URL followed by zero or more relative
2776 * paths, or 1 working copy path, as <tt>const char *</tt>, for which log
2777 * messages are desired.  @a receiver is invoked only on messages whose
2778 * revisions involved a change to some path in @a targets.  @a peg_revision
2779 * indicates in which revision @a targets are valid.  If @a peg_revision is
2780 * #svn_opt_revision_unspecified, it defaults to #svn_opt_revision_head
2781 * for URLs or #svn_opt_revision_working for WC paths.
2782 *
2783 * If @a limit is greater than zero only invoke @a receiver on the first
2784 * @a limit logs.
2785 *
2786 * If @a discover_changed_paths is set, then the @c changed_paths and @c
2787 * changed_paths2 fields in the @c log_entry argument to @a receiver will be
2788 * populated on each invocation.  @note The @c text_modified and @c
2789 * props_modified fields of the changed paths structure may have the value
2790 * #svn_tristate_unknown if the repository does not report that information.
2791 *
2792 * If @a strict_node_history is set, copy history (if any exists) will
2793 * not be traversed while harvesting revision logs for each target.
2794 *
2795 * If @a include_merged_revisions is set, log information for revisions
2796 * which have been merged to @a targets will also be returned.
2797 *
2798 * If @a revprops is NULL, retrieve all revision properties; else, retrieve
2799 * only the revision properties named by the (const char *) array elements
2800 * (i.e. retrieve none if the array is empty).
2801 *
2802 * Use @a pool for any temporary allocation.
2803 *
2804 * If @a ctx->notify_func2 is non-NULL, then call @a ctx->notify_func2/baton2
2805 * with a 'skip' signal on any unversioned targets.
2806 *
2807 * @since New in 1.6.
2808 */
2809svn_error_t *
2810svn_client_log5(const apr_array_header_t *targets,
2811                const svn_opt_revision_t *peg_revision,
2812                const apr_array_header_t *revision_ranges,
2813                int limit,
2814                svn_boolean_t discover_changed_paths,
2815                svn_boolean_t strict_node_history,
2816                svn_boolean_t include_merged_revisions,
2817                const apr_array_header_t *revprops,
2818                svn_log_entry_receiver_t receiver,
2819                void *receiver_baton,
2820                svn_client_ctx_t *ctx,
2821                apr_pool_t *pool);
2822
2823/**
2824 * Similar to svn_client_log5(), but takes explicit start and end parameters
2825 * instead of an array of revision ranges.
2826 *
2827 * @deprecated Provided for compatibility with the 1.5 API.
2828 * @since New in 1.5.
2829 */
2830SVN_DEPRECATED
2831svn_error_t *
2832svn_client_log4(const apr_array_header_t *targets,
2833                const svn_opt_revision_t *peg_revision,
2834                const svn_opt_revision_t *start,
2835                const svn_opt_revision_t *end,
2836                int limit,
2837                svn_boolean_t discover_changed_paths,
2838                svn_boolean_t strict_node_history,
2839                svn_boolean_t include_merged_revisions,
2840                const apr_array_header_t *revprops,
2841                svn_log_entry_receiver_t receiver,
2842                void *receiver_baton,
2843                svn_client_ctx_t *ctx,
2844                apr_pool_t *pool);
2845
2846/**
2847 * Similar to svn_client_log4(), but using #svn_log_message_receiver_t
2848 * instead of #svn_log_entry_receiver_t.  Also, @a
2849 * include_merged_revisions is set to @c FALSE and @a revprops is
2850 * svn:author, svn:date, and svn:log.
2851 *
2852 * @deprecated Provided for compatibility with the 1.4 API.
2853 * @since New in 1.4.
2854 */
2855SVN_DEPRECATED
2856svn_error_t *
2857svn_client_log3(const apr_array_header_t *targets,
2858                const svn_opt_revision_t *peg_revision,
2859                const svn_opt_revision_t *start,
2860                const svn_opt_revision_t *end,
2861                int limit,
2862                svn_boolean_t discover_changed_paths,
2863                svn_boolean_t strict_node_history,
2864                svn_log_message_receiver_t receiver,
2865                void *receiver_baton,
2866                svn_client_ctx_t *ctx,
2867                apr_pool_t *pool);
2868
2869
2870/**
2871 * Similar to svn_client_log3(), but with the @c kind field of
2872 * @a peg_revision set to #svn_opt_revision_unspecified.
2873 *
2874 * @par Important:
2875 * A special case for the revision range HEAD:1, which was present
2876 * in svn_client_log(), has been removed from svn_client_log2().  Instead, it
2877 * is expected that callers will specify the range HEAD:0, to avoid a
2878 * #SVN_ERR_FS_NO_SUCH_REVISION error when invoked against an empty repository
2879 * (i.e. one not containing a revision 1).
2880 *
2881 * @deprecated Provided for compatibility with the 1.3 API.
2882 * @since New in 1.2.
2883 */
2884SVN_DEPRECATED
2885svn_error_t *
2886svn_client_log2(const apr_array_header_t *targets,
2887                const svn_opt_revision_t *start,
2888                const svn_opt_revision_t *end,
2889                int limit,
2890                svn_boolean_t discover_changed_paths,
2891                svn_boolean_t strict_node_history,
2892                svn_log_message_receiver_t receiver,
2893                void *receiver_baton,
2894                svn_client_ctx_t *ctx,
2895                apr_pool_t *pool);
2896
2897
2898/**
2899 * Similar to svn_client_log2(), but with @a limit set to 0, and the
2900 * following special case:
2901 *
2902 * Special case for repositories at revision 0:
2903 *
2904 * If @a start->kind is #svn_opt_revision_head, and @a end->kind is
2905 * #svn_opt_revision_number && @a end->number is @c 1, then handle an
2906 * empty (no revisions) repository specially: instead of erroring
2907 * because requested revision 1 when the highest revision is 0, just
2908 * invoke @a receiver on revision 0, passing @c NULL for changed paths and
2909 * empty strings for the author and date.  This is because that
2910 * particular combination of @a start and @a end usually indicates the
2911 * common case of log invocation -- the user wants to see all log
2912 * messages from youngest to oldest, where the oldest commit is
2913 * revision 1.  That works fine, except when there are no commits in
2914 * the repository, hence this special case.
2915 *
2916 * @deprecated Provided for backward compatibility with the 1.1 API.
2917 */
2918SVN_DEPRECATED
2919svn_error_t *
2920svn_client_log(const apr_array_header_t *targets,
2921               const svn_opt_revision_t *start,
2922               const svn_opt_revision_t *end,
2923               svn_boolean_t discover_changed_paths,
2924               svn_boolean_t strict_node_history,
2925               svn_log_message_receiver_t receiver,
2926               void *receiver_baton,
2927               svn_client_ctx_t *ctx,
2928               apr_pool_t *pool);
2929
2930/** @} */
2931
2932/**
2933 * @defgroup Blame Show modification information about lines in a file.
2934 *
2935 * @{
2936 */
2937
2938/**
2939 * Invoke @a receiver with @a receiver_baton on each line-blame item
2940 * associated with revision @a end of @a path_or_url, using @a start
2941 * as the default source of all blame.  @a peg_revision indicates in
2942 * which revision @a path_or_url is valid.  If @a peg_revision->kind
2943 * is #svn_opt_revision_unspecified, then it defaults to
2944 * #svn_opt_revision_head for URLs or #svn_opt_revision_working for
2945 * WC targets.
2946 *
2947 * If @a start->kind or @a end->kind is #svn_opt_revision_unspecified,
2948 * return the error #SVN_ERR_CLIENT_BAD_REVISION.  If either are
2949 * #svn_opt_revision_working, return the error
2950 * #SVN_ERR_UNSUPPORTED_FEATURE.  If any of the revisions of @a
2951 * path_or_url have a binary mime-type, return the error
2952 * #SVN_ERR_CLIENT_IS_BINARY_FILE, unless @a ignore_mime_type is TRUE,
2953 * in which case blame information will be generated regardless of the
2954 * MIME types of the revisions.
2955 *
2956 * @a start may resolve to a revision number greater (younger) than @a end
2957 * only if the server is 1.8.0 or greater (supports
2958 * #SVN_RA_CAPABILITY_GET_FILE_REVS_REVERSE) and the client is 1.9.0 or
2959 * newer.
2960 *
2961 * Before the first call to @a receiver, set @a *start_revnum_p and
2962 * @a *end_revnum_p to the start and end revision number of the entire
2963 * blame operation, as resolved from the repository. This can be useful
2964 * for the blame receiver to format the blame output. Any or both of these
2965 * arguments may be @c NULL.
2966 *
2967 * Use @a diff_options to determine how to compare different revisions of the
2968 * target.
2969 *
2970 * If @a include_merged_revisions is TRUE, also return data based upon
2971 * revisions which have been merged to @a path_or_url.
2972 *
2973 * Use @a pool for any temporary allocation.
2974 *
2975 * @since New in 1.12.
2976 */
2977svn_error_t *
2978svn_client_blame6(svn_revnum_t *start_revnum_p,
2979                  svn_revnum_t *end_revnum_p,
2980                  const char *path_or_url,
2981                  const svn_opt_revision_t *peg_revision,
2982                  const svn_opt_revision_t *start,
2983                  const svn_opt_revision_t *end,
2984                  const svn_diff_file_options_t *diff_options,
2985                  svn_boolean_t ignore_mime_type,
2986                  svn_boolean_t include_merged_revisions,
2987                  svn_client_blame_receiver4_t receiver,
2988                  void *receiver_baton,
2989                  svn_client_ctx_t *ctx,
2990                  apr_pool_t *pool);
2991
2992
2993/**
2994 * Similar to svn_client_blame6(), but with #svn_client_blame_receiver3_t
2995 * as the receiver.
2996 *
2997 * @deprecated Provided for backwards compatibility with the 1.11 API.
2998 *
2999 * @since New in 1.7.
3000 */
3001SVN_DEPRECATED
3002svn_error_t *
3003svn_client_blame5(const char *path_or_url,
3004                  const svn_opt_revision_t *peg_revision,
3005                  const svn_opt_revision_t *start,
3006                  const svn_opt_revision_t *end,
3007                  const svn_diff_file_options_t *diff_options,
3008                  svn_boolean_t ignore_mime_type,
3009                  svn_boolean_t include_merged_revisions,
3010                  svn_client_blame_receiver3_t receiver,
3011                  void *receiver_baton,
3012                  svn_client_ctx_t *ctx,
3013                  apr_pool_t *pool);
3014
3015/**
3016 * Similar to svn_client_blame5(), but with #svn_client_blame_receiver2_t
3017 * as the receiver.
3018 *
3019 * @deprecated Provided for backwards compatibility with the 1.6 API.
3020 *
3021 * @since New in 1.5.
3022 */
3023SVN_DEPRECATED
3024svn_error_t *
3025svn_client_blame4(const char *path_or_url,
3026                  const svn_opt_revision_t *peg_revision,
3027                  const svn_opt_revision_t *start,
3028                  const svn_opt_revision_t *end,
3029                  const svn_diff_file_options_t *diff_options,
3030                  svn_boolean_t ignore_mime_type,
3031                  svn_boolean_t include_merged_revisions,
3032                  svn_client_blame_receiver2_t receiver,
3033                  void *receiver_baton,
3034                  svn_client_ctx_t *ctx,
3035                  apr_pool_t *pool);
3036
3037/**
3038 * Similar to svn_client_blame4(), but with @a include_merged_revisions set
3039 * to FALSE, and using a #svn_client_blame_receiver2_t as the receiver.
3040 *
3041 * @deprecated Provided for backwards compatibility with the 1.4 API.
3042 *
3043 * @since New in 1.4.
3044 */
3045SVN_DEPRECATED
3046svn_error_t *
3047svn_client_blame3(const char *path_or_url,
3048                  const svn_opt_revision_t *peg_revision,
3049                  const svn_opt_revision_t *start,
3050                  const svn_opt_revision_t *end,
3051                  const svn_diff_file_options_t *diff_options,
3052                  svn_boolean_t ignore_mime_type,
3053                  svn_client_blame_receiver_t receiver,
3054                  void *receiver_baton,
3055                  svn_client_ctx_t *ctx,
3056                  apr_pool_t *pool);
3057
3058/**
3059 * Similar to svn_client_blame3(), but with @a diff_options set to
3060 * default options as returned by svn_diff_file_options_parse() and
3061 * @a ignore_mime_type set to FALSE.
3062 *
3063 * @deprecated Provided for backwards compatibility with the 1.3 API.
3064 *
3065 * @since New in 1.2.
3066 */
3067SVN_DEPRECATED
3068svn_error_t *
3069svn_client_blame2(const char *path_or_url,
3070                  const svn_opt_revision_t *peg_revision,
3071                  const svn_opt_revision_t *start,
3072                  const svn_opt_revision_t *end,
3073                  svn_client_blame_receiver_t receiver,
3074                  void *receiver_baton,
3075                  svn_client_ctx_t *ctx,
3076                  apr_pool_t *pool);
3077
3078/**
3079 * Similar to svn_client_blame2() except that @a peg_revision is always
3080 * the same as @a end.
3081 *
3082 * @deprecated Provided for backward compatibility with the 1.1 API.
3083 */
3084SVN_DEPRECATED
3085svn_error_t *
3086svn_client_blame(const char *path_or_url,
3087                 const svn_opt_revision_t *start,
3088                 const svn_opt_revision_t *end,
3089                 svn_client_blame_receiver_t receiver,
3090                 void *receiver_baton,
3091                 svn_client_ctx_t *ctx,
3092                 apr_pool_t *pool);
3093
3094/** @} */
3095
3096/**
3097 * @defgroup Diff Generate differences between paths.
3098 *
3099 * @{
3100 */
3101
3102/**
3103 * Produce diff output which describes the delta between
3104 * @a path_or_url1/@a revision1 and @a path_or_url2/@a revision2.  Print
3105 * the output of the diff to @a outstream, and any errors to @a
3106 * errstream.  @a path_or_url1 and @a path_or_url2 can be either
3107 * working-copy paths or URLs.
3108 *
3109 * If @a relative_to_dir is not @c NULL, the original path and
3110 * modified path will have the @a relative_to_dir stripped from the
3111 * front of the respective paths.  If @a relative_to_dir is @c NULL,
3112 * paths will not be modified.  If @a relative_to_dir is not
3113 * @c NULL but @a relative_to_dir is not a parent path of the target,
3114 * an error is returned. Finally, if @a relative_to_dir is a URL, an
3115 * error will be returned.
3116 *
3117 * If either @a revision1 or @a revision2 has an `unspecified' or
3118 * unrecognized `kind', return #SVN_ERR_CLIENT_BAD_REVISION.
3119 *
3120 * @a path_or_url1 and @a path_or_url2 must both represent the same node
3121 * kind -- that is, if @a path_or_url1 is a directory, @a path_or_url2
3122 * must also be, and if @a path_or_url1 is a file, @a path_or_url2 must
3123 * also be.
3124 *
3125 * If @a depth is #svn_depth_infinity, diff fully recursively.
3126 * Else if it is #svn_depth_immediates, diff the named paths and
3127 * their file children (if any), and diff properties of
3128 * subdirectories, but do not descend further into the subdirectories.
3129 * Else if #svn_depth_files, behave as if for #svn_depth_immediates
3130 * except don't diff properties of subdirectories.  If
3131 * #svn_depth_empty, diff exactly the named paths but nothing
3132 * underneath them.
3133 *
3134 * Use @a ignore_ancestry to control whether or not items being
3135 * diffed will be checked for relatedness first.  Unrelated items
3136 * are typically transmitted to the editor as a deletion of one thing
3137 * and the addition of another, but if this flag is TRUE, unrelated
3138 * items will be diffed as if they were related.
3139 *
3140 * If @a no_diff_added is TRUE, then no diff output will be generated
3141 * on added files.
3142 *
3143 * If @a no_diff_deleted is TRUE, then no diff output will be
3144 * generated on deleted files.
3145 *
3146 * If @a show_copies_as_adds is TRUE, then copied files will not be diffed
3147 * against their copyfrom source, and will appear in the diff output
3148 * in their entirety, as if they were newly added.
3149 * ### BUGS: For a repos-repos diff, this is ignored. Instead, a file is
3150 *     diffed against its copyfrom source iff the file is the diff target
3151 *     and not if some parent directory is the diff target. For a repos-WC
3152 *     diff, this is ignored if the file is the diff target.
3153 *
3154 * If @a use_git_diff_format is TRUE, then the git's extended diff format
3155 * will be used.
3156 * ### Do we need to say more about the format? A reference perhaps?
3157 *
3158 * If @a ignore_properties is TRUE, do not show property differences.
3159 * If @a properties_only is TRUE, show only property changes.
3160 * The above two options are mutually exclusive. It is an error to set
3161 * both to TRUE.
3162 *
3163 * If @a pretty_print_mergeinfo is true, then describe 'svn:mergeinfo'
3164 * property changes in a human-readable form that says what changes were
3165 * merged or reverse merged; otherwise (or if the mergeinfo property values
3166 * don't parse correctly) display them just like any other property.
3167 *
3168 * Generated headers are encoded using @a header_encoding.
3169 *
3170 * If either side has an svn:mime-type property that indicates 'binary'
3171 * content, then if @a ignore_content_type is set, attempt to produce the
3172 * diff in the usual way, otherwise produce a 'GIT binary diff' in git mode
3173 * or print a warning message in non-git mode.
3174 *
3175 * @a diff_options (an array of <tt>const char *</tt>) is used to pass
3176 * additional command line options to the diff processes invoked to compare
3177 * files. @a diff_options is allowed to be @c NULL, in which case a value
3178 * for this option might still be obtained from the Subversion configuration
3179 * file via client context @a ctx.
3180 *
3181 * The authentication baton cached in @a ctx is used to communicate with
3182 * the repository.
3183 *
3184 * @a changelists is an array of <tt>const char *</tt> changelist
3185 * names, used as a restrictive filter on items whose differences are
3186 * reported; that is, don't generate diffs about any item unless
3187 * it's a member of one of those changelists.  If @a changelists is
3188 * empty (or altogether @c NULL), no changelist filtering occurs.
3189 *
3190 * @note Changelist filtering only applies to diffs in which at least
3191 * one side of the diff represents working copy data.
3192 *
3193 * @note @a header_encoding doesn't affect headers generated by external
3194 * diff programs.
3195 *
3196 * @note @a relative_to_dir doesn't affect the path index generated by
3197 * external diff programs.
3198 *
3199 * @since New in 1.11.
3200 */
3201svn_error_t *
3202svn_client_diff7(const apr_array_header_t *diff_options,
3203                 const char *path_or_url1,
3204                 const svn_opt_revision_t *revision1,
3205                 const char *path_or_url2,
3206                 const svn_opt_revision_t *revision2,
3207                 const char *relative_to_dir,
3208                 svn_depth_t depth,
3209                 svn_boolean_t ignore_ancestry,
3210                 svn_boolean_t no_diff_added,
3211                 svn_boolean_t no_diff_deleted,
3212                 svn_boolean_t show_copies_as_adds,
3213                 svn_boolean_t ignore_content_type,
3214                 svn_boolean_t ignore_properties,
3215                 svn_boolean_t properties_only,
3216                 svn_boolean_t use_git_diff_format,
3217                 svn_boolean_t pretty_print_mergeinfo,
3218                 const char *header_encoding,
3219                 svn_stream_t *outstream,
3220                 svn_stream_t *errstream,
3221                 const apr_array_header_t *changelists,
3222                 svn_client_ctx_t *ctx,
3223                 apr_pool_t *pool);
3224
3225/** Similar to svn_client_diff7(), but with @a pretty_print_mergeinfo
3226 * always passed as @c TRUE.
3227 *
3228 * @deprecated Provided for backward compatibility with the 1.10 API.
3229 * @since New in 1.8.
3230 */
3231SVN_DEPRECATED
3232svn_error_t *
3233svn_client_diff6(const apr_array_header_t *diff_options,
3234                 const char *path_or_url1,
3235                 const svn_opt_revision_t *revision1,
3236                 const char *path_or_url2,
3237                 const svn_opt_revision_t *revision2,
3238                 const char *relative_to_dir,
3239                 svn_depth_t depth,
3240                 svn_boolean_t ignore_ancestry,
3241                 svn_boolean_t no_diff_added,
3242                 svn_boolean_t no_diff_deleted,
3243                 svn_boolean_t show_copies_as_adds,
3244                 svn_boolean_t ignore_content_type,
3245                 svn_boolean_t ignore_properties,
3246                 svn_boolean_t properties_only,
3247                 svn_boolean_t use_git_diff_format,
3248                 const char *header_encoding,
3249                 svn_stream_t *outstream,
3250                 svn_stream_t *errstream,
3251                 const apr_array_header_t *changelists,
3252                 svn_client_ctx_t *ctx,
3253                 apr_pool_t *pool);
3254
3255/** Similar to svn_client_diff6(), but with @a outfile and @a errfile,
3256 * instead of @a outstream and @a errstream, and with @a
3257 * no_diff_added, @a ignore_properties, and @a properties_only always
3258 * passed as @c FALSE (which means that additions and property changes
3259 * are always transmitted).
3260 *
3261 * @deprecated Provided for backward compatibility with the 1.7 API.
3262 * @since New in 1.7.
3263 */
3264SVN_DEPRECATED
3265svn_error_t *
3266svn_client_diff5(const apr_array_header_t *diff_options,
3267                 const char *path1,
3268                 const svn_opt_revision_t *revision1,
3269                 const char *path2,
3270                 const svn_opt_revision_t *revision2,
3271                 const char *relative_to_dir,
3272                 svn_depth_t depth,
3273                 svn_boolean_t ignore_ancestry,
3274                 svn_boolean_t no_diff_deleted,
3275                 svn_boolean_t show_copies_as_adds,
3276                 svn_boolean_t ignore_content_type,
3277                 svn_boolean_t use_git_diff_format,
3278                 const char *header_encoding,
3279                 apr_file_t *outfile,
3280                 apr_file_t *errfile,
3281                 const apr_array_header_t *changelists,
3282                 svn_client_ctx_t *ctx,
3283                 apr_pool_t *pool);
3284
3285/**
3286 * Similar to svn_client_diff5(), but with @a show_copies_as_adds set to
3287 * @c FALSE and @a use_git_diff_format set to @c FALSE.
3288 *
3289 * @deprecated Provided for backward compatibility with the 1.6 API.
3290 * @since New in 1.5.
3291 */
3292SVN_DEPRECATED
3293svn_error_t *
3294svn_client_diff4(const apr_array_header_t *diff_options,
3295                 const char *path1,
3296                 const svn_opt_revision_t *revision1,
3297                 const char *path2,
3298                 const svn_opt_revision_t *revision2,
3299                 const char *relative_to_dir,
3300                 svn_depth_t depth,
3301                 svn_boolean_t ignore_ancestry,
3302                 svn_boolean_t no_diff_deleted,
3303                 svn_boolean_t ignore_content_type,
3304                 const char *header_encoding,
3305                 apr_file_t *outfile,
3306                 apr_file_t *errfile,
3307                 const apr_array_header_t *changelists,
3308                 svn_client_ctx_t *ctx,
3309                 apr_pool_t *pool);
3310
3311/**
3312 * Similar to svn_client_diff4(), but with @a changelists passed as @c
3313 * NULL, and @a depth set according to @a recurse: if @a recurse is
3314 * TRUE, set @a depth to #svn_depth_infinity, if @a recurse is
3315 * FALSE, set @a depth to #svn_depth_empty.
3316 *
3317 * @deprecated Provided for backward compatibility with the 1.4 API.
3318 * @since New in 1.3.
3319 */
3320SVN_DEPRECATED
3321svn_error_t *
3322svn_client_diff3(const apr_array_header_t *diff_options,
3323                 const char *path1,
3324                 const svn_opt_revision_t *revision1,
3325                 const char *path2,
3326                 const svn_opt_revision_t *revision2,
3327                 svn_boolean_t recurse,
3328                 svn_boolean_t ignore_ancestry,
3329                 svn_boolean_t no_diff_deleted,
3330                 svn_boolean_t ignore_content_type,
3331                 const char *header_encoding,
3332                 apr_file_t *outfile,
3333                 apr_file_t *errfile,
3334                 svn_client_ctx_t *ctx,
3335                 apr_pool_t *pool);
3336
3337
3338/**
3339 * Similar to svn_client_diff3(), but with @a header_encoding set to
3340 * @c APR_LOCALE_CHARSET.
3341 *
3342 * @deprecated Provided for backward compatibility with the 1.2 API.
3343 * @since New in 1.2.
3344 */
3345SVN_DEPRECATED
3346svn_error_t *
3347svn_client_diff2(const apr_array_header_t *diff_options,
3348                 const char *path1,
3349                 const svn_opt_revision_t *revision1,
3350                 const char *path2,
3351                 const svn_opt_revision_t *revision2,
3352                 svn_boolean_t recurse,
3353                 svn_boolean_t ignore_ancestry,
3354                 svn_boolean_t no_diff_deleted,
3355                 svn_boolean_t ignore_content_type,
3356                 apr_file_t *outfile,
3357                 apr_file_t *errfile,
3358                 svn_client_ctx_t *ctx,
3359                 apr_pool_t *pool);
3360
3361/**
3362 * Similar to svn_client_diff2(), but with @a ignore_content_type
3363 * always set to FALSE.
3364 *
3365 * @deprecated Provided for backward compatibility with the 1.1 API.
3366 */
3367SVN_DEPRECATED
3368svn_error_t *
3369svn_client_diff(const apr_array_header_t *diff_options,
3370                const char *path1,
3371                const svn_opt_revision_t *revision1,
3372                const char *path2,
3373                const svn_opt_revision_t *revision2,
3374                svn_boolean_t recurse,
3375                svn_boolean_t ignore_ancestry,
3376                svn_boolean_t no_diff_deleted,
3377                apr_file_t *outfile,
3378                apr_file_t *errfile,
3379                svn_client_ctx_t *ctx,
3380                apr_pool_t *pool);
3381
3382/**
3383 * Produce diff output which describes the delta between the filesystem
3384 * object @a path_or_url in peg revision @a peg_revision, as it changed
3385 * between @a start_revision and @a end_revision.  @a path_or_url can
3386 * be either a working-copy path or URL.
3387 *
3388 * If @a peg_revision is #svn_opt_revision_unspecified, behave
3389 * identically to svn_client_diff7(), using @a path_or_url for both of that
3390 * function's @a path_or_url1 and @a path_or_url2 arguments.
3391 *
3392 * All other options are handled identically to svn_client_diff7().
3393 *
3394 * @since New in 1.8.
3395 */
3396svn_error_t *
3397svn_client_diff_peg7(const apr_array_header_t *diff_options,
3398                     const char *path_or_url,
3399                     const svn_opt_revision_t *peg_revision,
3400                     const svn_opt_revision_t *start_revision,
3401                     const svn_opt_revision_t *end_revision,
3402                     const char *relative_to_dir,
3403                     svn_depth_t depth,
3404                     svn_boolean_t ignore_ancestry,
3405                     svn_boolean_t no_diff_added,
3406                     svn_boolean_t no_diff_deleted,
3407                     svn_boolean_t show_copies_as_adds,
3408                     svn_boolean_t ignore_content_type,
3409                     svn_boolean_t ignore_properties,
3410                     svn_boolean_t properties_only,
3411                     svn_boolean_t use_git_diff_format,
3412                     svn_boolean_t pretty_print_mergeinfo,
3413                     const char *header_encoding,
3414                     svn_stream_t *outstream,
3415                     svn_stream_t *errstream,
3416                     const apr_array_header_t *changelists,
3417                     svn_client_ctx_t *ctx,
3418                     apr_pool_t *pool);
3419
3420/** Similar to svn_client_diff_peg7(), but with @a pretty_print_mergeinfo
3421 * always passed as @c TRUE.
3422 *
3423 * @deprecated Provided for backward compatibility with the 1.7 API.
3424 * @since New in 1.7.
3425 */
3426SVN_DEPRECATED
3427svn_error_t *
3428svn_client_diff_peg6(const apr_array_header_t *diff_options,
3429                     const char *path_or_url,
3430                     const svn_opt_revision_t *peg_revision,
3431                     const svn_opt_revision_t *start_revision,
3432                     const svn_opt_revision_t *end_revision,
3433                     const char *relative_to_dir,
3434                     svn_depth_t depth,
3435                     svn_boolean_t ignore_ancestry,
3436                     svn_boolean_t no_diff_added,
3437                     svn_boolean_t no_diff_deleted,
3438                     svn_boolean_t show_copies_as_adds,
3439                     svn_boolean_t ignore_content_type,
3440                     svn_boolean_t ignore_properties,
3441                     svn_boolean_t properties_only,
3442                     svn_boolean_t use_git_diff_format,
3443                     const char *header_encoding,
3444                     svn_stream_t *outstream,
3445                     svn_stream_t *errstream,
3446                     const apr_array_header_t *changelists,
3447                     svn_client_ctx_t *ctx,
3448                     apr_pool_t *pool);
3449
3450/** Similar to svn_client_diff6_peg6(), but with @a outfile and @a errfile,
3451 * instead of @a outstream and @a errstream, and with @a
3452 * no_diff_added, @a ignore_properties, and @a properties_only always
3453 * passed as @c FALSE (which means that additions and property changes
3454 * are always transmitted).
3455 *
3456 * @deprecated Provided for backward compatibility with the 1.7 API.
3457 * @since New in 1.7.
3458 */
3459SVN_DEPRECATED
3460svn_error_t *
3461svn_client_diff_peg5(const apr_array_header_t *diff_options,
3462                     const char *path,
3463                     const svn_opt_revision_t *peg_revision,
3464                     const svn_opt_revision_t *start_revision,
3465                     const svn_opt_revision_t *end_revision,
3466                     const char *relative_to_dir,
3467                     svn_depth_t depth,
3468                     svn_boolean_t ignore_ancestry,
3469                     svn_boolean_t no_diff_deleted,
3470                     svn_boolean_t show_copies_as_adds,
3471                     svn_boolean_t ignore_content_type,
3472                     svn_boolean_t use_git_diff_format,
3473                     const char *header_encoding,
3474                     apr_file_t *outfile,
3475                     apr_file_t *errfile,
3476                     const apr_array_header_t *changelists,
3477                     svn_client_ctx_t *ctx,
3478                     apr_pool_t *pool);
3479
3480/**
3481 * Similar to svn_client_diff_peg5(), but with @a show_copies_as_adds set to
3482 * @c FALSE and @a use_git_diff_format set to @c FALSE.
3483 *
3484 * @since New in 1.5.
3485 * @deprecated Provided for backward compatibility with the 1.6 API.
3486 */
3487SVN_DEPRECATED
3488svn_error_t *
3489svn_client_diff_peg4(const apr_array_header_t *diff_options,
3490                     const char *path,
3491                     const svn_opt_revision_t *peg_revision,
3492                     const svn_opt_revision_t *start_revision,
3493                     const svn_opt_revision_t *end_revision,
3494                     const char *relative_to_dir,
3495                     svn_depth_t depth,
3496                     svn_boolean_t ignore_ancestry,
3497                     svn_boolean_t no_diff_deleted,
3498                     svn_boolean_t ignore_content_type,
3499                     const char *header_encoding,
3500                     apr_file_t *outfile,
3501                     apr_file_t *errfile,
3502                     const apr_array_header_t *changelists,
3503                     svn_client_ctx_t *ctx,
3504                     apr_pool_t *pool);
3505
3506/**
3507 * Similar to svn_client_diff_peg4(), but with @a changelists passed
3508 * as @c NULL, and @a depth set according to @a recurse: if @a recurse
3509 * is TRUE, set @a depth to #svn_depth_infinity, if @a recurse is
3510 * FALSE, set @a depth to #svn_depth_files.
3511 *
3512 * @deprecated Provided for backward compatibility with the 1.4 API.
3513 * @since New in 1.3.
3514 */
3515SVN_DEPRECATED
3516svn_error_t *
3517svn_client_diff_peg3(const apr_array_header_t *diff_options,
3518                     const char *path,
3519                     const svn_opt_revision_t *peg_revision,
3520                     const svn_opt_revision_t *start_revision,
3521                     const svn_opt_revision_t *end_revision,
3522                     svn_boolean_t recurse,
3523                     svn_boolean_t ignore_ancestry,
3524                     svn_boolean_t no_diff_deleted,
3525                     svn_boolean_t ignore_content_type,
3526                     const char *header_encoding,
3527                     apr_file_t *outfile,
3528                     apr_file_t *errfile,
3529                     svn_client_ctx_t *ctx,
3530                     apr_pool_t *pool);
3531
3532/**
3533 * Similar to svn_client_diff_peg3(), but with @a header_encoding set to
3534 * @c APR_LOCALE_CHARSET.
3535 *
3536 * @deprecated Provided for backward compatibility with the 1.2 API.
3537 * @since New in 1.2.
3538 */
3539SVN_DEPRECATED
3540svn_error_t *
3541svn_client_diff_peg2(const apr_array_header_t *diff_options,
3542                     const char *path,
3543                     const svn_opt_revision_t *peg_revision,
3544                     const svn_opt_revision_t *start_revision,
3545                     const svn_opt_revision_t *end_revision,
3546                     svn_boolean_t recurse,
3547                     svn_boolean_t ignore_ancestry,
3548                     svn_boolean_t no_diff_deleted,
3549                     svn_boolean_t ignore_content_type,
3550                     apr_file_t *outfile,
3551                     apr_file_t *errfile,
3552                     svn_client_ctx_t *ctx,
3553                     apr_pool_t *pool);
3554
3555/**
3556 * Similar to svn_client_diff_peg2(), but with @a ignore_content_type
3557 * always set to FALSE.
3558 *
3559 * @since New in 1.1.
3560 * @deprecated Provided for backward compatibility with the 1.1 API.
3561 */
3562SVN_DEPRECATED
3563svn_error_t *
3564svn_client_diff_peg(const apr_array_header_t *diff_options,
3565                    const char *path,
3566                    const svn_opt_revision_t *peg_revision,
3567                    const svn_opt_revision_t *start_revision,
3568                    const svn_opt_revision_t *end_revision,
3569                    svn_boolean_t recurse,
3570                    svn_boolean_t ignore_ancestry,
3571                    svn_boolean_t no_diff_deleted,
3572                    apr_file_t *outfile,
3573                    apr_file_t *errfile,
3574                    svn_client_ctx_t *ctx,
3575                    apr_pool_t *pool);
3576
3577/**
3578 * Produce a diff summary which lists the changed items between
3579 * @a path_or_url1/@a revision1 and @a path_or_url2/@a revision2 without
3580 * creating text deltas. @a path_or_url1 and @a path_or_url2 can be
3581 * either working-copy paths or URLs.
3582 *
3583 * The function may report false positives if @a ignore_ancestry is false,
3584 * since a file might have been modified between two revisions, but still
3585 * have the same contents.
3586 *
3587 * Calls @a summarize_func with @a summarize_baton for each difference
3588 * with a #svn_client_diff_summarize_t structure describing the difference.
3589 *
3590 * See svn_client_diff7() for a description of the other parameters.
3591 *
3592 * @since New in 1.5.
3593 */
3594svn_error_t *
3595svn_client_diff_summarize2(const char *path_or_url1,
3596                           const svn_opt_revision_t *revision1,
3597                           const char *path_or_url2,
3598                           const svn_opt_revision_t *revision2,
3599                           svn_depth_t depth,
3600                           svn_boolean_t ignore_ancestry,
3601                           const apr_array_header_t *changelists,
3602                           svn_client_diff_summarize_func_t summarize_func,
3603                           void *summarize_baton,
3604                           svn_client_ctx_t *ctx,
3605                           apr_pool_t *pool);
3606
3607/**
3608 * Similar to svn_client_diff_summarize2(), but with @a changelists
3609 * passed as @c NULL, and @a depth set according to @a recurse: if @a
3610 * recurse is TRUE, set @a depth to #svn_depth_infinity, if @a
3611 * recurse is FALSE, set @a depth to #svn_depth_files.
3612 *
3613 * @deprecated Provided for backward compatibility with the 1.4 API.
3614 *
3615 * @since New in 1.4.
3616 */
3617SVN_DEPRECATED
3618svn_error_t *
3619svn_client_diff_summarize(const char *path1,
3620                          const svn_opt_revision_t *revision1,
3621                          const char *path2,
3622                          const svn_opt_revision_t *revision2,
3623                          svn_boolean_t recurse,
3624                          svn_boolean_t ignore_ancestry,
3625                          svn_client_diff_summarize_func_t summarize_func,
3626                          void *summarize_baton,
3627                          svn_client_ctx_t *ctx,
3628                          apr_pool_t *pool);
3629
3630/**
3631 * Produce a diff summary which lists the changed items between the
3632 * filesystem object @a path_or_url in peg revision @a peg_revision, as it
3633 * changed between @a start_revision and @a end_revision. @a path_or_url can
3634 * be either a working-copy path or URL.
3635 *
3636 * If @a peg_revision is #svn_opt_revision_unspecified, behave
3637 * identically to svn_client_diff_summarize2(), using @a path_or_url for
3638 * both of that function's @a path_or_url1 and @a path_or_url2 arguments.
3639 *
3640 * The function may report false positives if @a ignore_ancestry is false,
3641 * as described in the documentation for svn_client_diff_summarize2().
3642 *
3643 * Call @a summarize_func with @a summarize_baton for each difference
3644 * with a #svn_client_diff_summarize_t structure describing the difference.
3645 *
3646 * See svn_client_diff_peg5() for a description of the other parameters.
3647 *
3648 * @since New in 1.5.
3649 */
3650svn_error_t *
3651svn_client_diff_summarize_peg2(const char *path_or_url,
3652                               const svn_opt_revision_t *peg_revision,
3653                               const svn_opt_revision_t *start_revision,
3654                               const svn_opt_revision_t *end_revision,
3655                               svn_depth_t depth,
3656                               svn_boolean_t ignore_ancestry,
3657                               const apr_array_header_t *changelists,
3658                               svn_client_diff_summarize_func_t summarize_func,
3659                               void *summarize_baton,
3660                               svn_client_ctx_t *ctx,
3661                               apr_pool_t *pool);
3662
3663/**
3664 * Similar to svn_client_diff_summarize_peg2(), but with @a
3665 * changelists passed as @c NULL, and @a depth set according to @a
3666 * recurse: if @a recurse is TRUE, set @a depth to
3667 * #svn_depth_infinity, if @a recurse is FALSE, set @a depth to
3668 * #svn_depth_files.
3669 *
3670 * @deprecated Provided for backward compatibility with the 1.4 API.
3671 *
3672 * @since New in 1.4.
3673 */
3674SVN_DEPRECATED
3675svn_error_t *
3676svn_client_diff_summarize_peg(const char *path,
3677                              const svn_opt_revision_t *peg_revision,
3678                              const svn_opt_revision_t *start_revision,
3679                              const svn_opt_revision_t *end_revision,
3680                              svn_boolean_t recurse,
3681                              svn_boolean_t ignore_ancestry,
3682                              svn_client_diff_summarize_func_t summarize_func,
3683                              void *summarize_baton,
3684                              svn_client_ctx_t *ctx,
3685                              apr_pool_t *pool);
3686
3687/** @} */
3688
3689/**
3690 * @defgroup Merge Merge changes between branches.
3691 *
3692 * @{
3693 */
3694
3695/** Get information about the state of merging between two branches.
3696 *
3697 * The source is specified by @a source_path_or_url at @a source_revision.
3698 * The target is specified by @a target_path_or_url at @a target_revision,
3699 * which refers to either a WC or a repository location.
3700 *
3701 * Set @a *needs_reintegration to true if an automatic merge from source
3702 * to target would be a reintegration merge: that is, if the last automatic
3703 * merge was in the opposite direction; or to false otherwise.
3704 *
3705 * Set @a *yca_url, @a *yca_rev, @a *base_url, @a *base_rev, @a *right_url,
3706 * @a *right_rev, @a *target_url, @a *target_rev to the repository locations
3707 * of, respectively: the youngest common ancestor of the branches, the base
3708 * chosen for 3-way merge, the right-hand side of the source diff, and the
3709 * target.
3710 *
3711 * Set @a repos_root_url to the URL of the repository root.  This is a
3712 * common prefix of all four URL outputs.
3713 *
3714 * Allocate the results in @a result_pool.  Any of the output pointers may
3715 * be NULL if not wanted.
3716 *
3717 * @since New in 1.8.
3718 */
3719svn_error_t *
3720svn_client_get_merging_summary(svn_boolean_t *needs_reintegration,
3721                               const char **yca_url, svn_revnum_t *yca_rev,
3722                               const char **base_url, svn_revnum_t *base_rev,
3723                               const char **right_url, svn_revnum_t *right_rev,
3724                               const char **target_url, svn_revnum_t *target_rev,
3725                               const char **repos_root_url,
3726                               const char *source_path_or_url,
3727                               const svn_opt_revision_t *source_revision,
3728                               const char *target_path_or_url,
3729                               const svn_opt_revision_t *target_revision,
3730                               svn_client_ctx_t *ctx,
3731                               apr_pool_t *result_pool,
3732                               apr_pool_t *scratch_pool);
3733
3734
3735/** Merge changes from @a source1/@a revision1 to @a source2/@a revision2 into
3736 * the working-copy path @a target_wcpath.
3737 *
3738 * @a source1 and @a source2 are either URLs that refer to entries in the
3739 * repository, or paths to entries in the working copy.
3740 *
3741 * By "merging", we mean:  apply file differences using
3742 * svn_wc_merge(), and schedule additions & deletions when appropriate.
3743 *
3744 * @a source1 and @a source2 must both represent the same node kind -- that
3745 * is, if @a source1 is a directory, @a source2 must also be, and if @a source1
3746 * is a file, @a source2 must also be.
3747 *
3748 * If either @a revision1 or @a revision2 has an `unspecified' or
3749 * unrecognized `kind', return #SVN_ERR_CLIENT_BAD_REVISION.
3750 *
3751 * If @a depth is #svn_depth_infinity, merge fully recursively.
3752 * Else if #svn_depth_immediates, merge changes at most to files
3753 * that are immediate children of @a target_wcpath and to directory
3754 * properties of @a target_wcpath and its immediate subdirectory children.
3755 * Else if #svn_depth_files, merge at most to immediate file
3756 * children of @a target_wcpath and to @a target_wcpath itself.
3757 * Else if #svn_depth_empty, apply changes only to @a target_wcpath
3758 * (i.e., directory property changes only)
3759 *
3760 * If @a depth is #svn_depth_unknown, use the depth of @a target_wcpath.
3761 *
3762 * If @a ignore_mergeinfo is true, disable merge tracking, by treating the
3763 * two sources as unrelated even if they actually have a common ancestor.
3764 *
3765 * If @a diff_ignore_ancestry is true, diff unrelated nodes as if related:
3766 * that is, diff the 'left' and 'right' versions of a node as if they were
3767 * related (if they are the same kind) even if they are not related.
3768 * Otherwise, diff unrelated items as a deletion of one thing and the
3769 * addition of another.
3770 *
3771 * If @a force_delete is false and the merge involves deleting a file whose
3772 * content differs from the source-left version, or a locally modified
3773 * directory, or an unversioned item, then the operation will fail.  If
3774 * @a force_delete is true then all such items will be deleted.
3775 *
3776 * @a merge_options (an array of <tt>const char *</tt>), if non-NULL,
3777 * is used to pass additional command line arguments to the merge
3778 * processes (internal or external).  @see
3779 * svn_diff_file_options_parse().
3780 *
3781 * If @a ctx->notify_func2 is non-NULL, then call @a ctx->notify_func2 with @a
3782 * ctx->notify_baton2 once for each merged target, passing the target's local
3783 * path.
3784 *
3785 * If @a record_only is TRUE, the merge is performed, but is limited only to
3786 * mergeinfo property changes on existing paths in @a target_wcpath.
3787 *
3788 * If @a dry_run is TRUE, the merge is carried out, and full notification
3789 * feedback is provided, but the working copy is not modified.
3790 *
3791 * If allow_mixed_rev is @c FALSE, and @a merge_target is a mixed-revision
3792 * working copy, raise @c SVN_ERR_CLIENT_MERGE_UPDATE_REQUIRED.
3793 * Because users rarely intend to merge into mixed-revision working copies,
3794 * it is recommended to set this parameter to FALSE by default unless the
3795 * user has explicitly requested a merge into a mixed-revision working copy.
3796 *
3797 * The authentication baton cached in @a ctx is used to communicate with the
3798 * repository.
3799 *
3800 * @since New in 1.8.
3801 */
3802svn_error_t *
3803svn_client_merge5(const char *source1,
3804                  const svn_opt_revision_t *revision1,
3805                  const char *source2,
3806                  const svn_opt_revision_t *revision2,
3807                  const char *target_wcpath,
3808                  svn_depth_t depth,
3809                  svn_boolean_t ignore_mergeinfo,
3810                  svn_boolean_t diff_ignore_ancestry,
3811                  svn_boolean_t force_delete,
3812                  svn_boolean_t record_only,
3813                  svn_boolean_t dry_run,
3814                  svn_boolean_t allow_mixed_rev,
3815                  const apr_array_header_t *merge_options,
3816                  svn_client_ctx_t *ctx,
3817                  apr_pool_t *pool);
3818
3819/**
3820 * Similar to svn_client_merge5(), but the single @a ignore_ancestry
3821 * parameter maps to both @c ignore_mergeinfo and @c diff_ignore_ancestry.
3822 *
3823 * @deprecated Provided for backward compatibility with the 1.7 API.
3824 * @since New in 1.7.
3825 */
3826SVN_DEPRECATED
3827svn_error_t *
3828svn_client_merge4(const char *source1,
3829                  const svn_opt_revision_t *revision1,
3830                  const char *source2,
3831                  const svn_opt_revision_t *revision2,
3832                  const char *target_wcpath,
3833                  svn_depth_t depth,
3834                  svn_boolean_t ignore_ancestry,
3835                  svn_boolean_t force_delete,
3836                  svn_boolean_t record_only,
3837                  svn_boolean_t dry_run,
3838                  svn_boolean_t allow_mixed_rev,
3839                  const apr_array_header_t *merge_options,
3840                  svn_client_ctx_t *ctx,
3841                  apr_pool_t *pool);
3842
3843/**
3844 * Similar to svn_client_merge4(), but with @a allow_mixed_rev set to
3845 * @c TRUE.  The @a force parameter maps to the @c force_delete parameter
3846 * of svn_client_merge4().
3847 *
3848 * @deprecated Provided for backward compatibility with the 1.6 API.
3849 *
3850 * @since New in 1.5.
3851 */
3852SVN_DEPRECATED
3853svn_error_t *
3854svn_client_merge3(const char *source1,
3855                  const svn_opt_revision_t *revision1,
3856                  const char *source2,
3857                  const svn_opt_revision_t *revision2,
3858                  const char *target_wcpath,
3859                  svn_depth_t depth,
3860                  svn_boolean_t ignore_ancestry,
3861                  svn_boolean_t force,
3862                  svn_boolean_t record_only,
3863                  svn_boolean_t dry_run,
3864                  const apr_array_header_t *merge_options,
3865                  svn_client_ctx_t *ctx,
3866                  apr_pool_t *pool);
3867
3868/**
3869 * Similar to svn_client_merge3(), but with @a record_only set to @c
3870 * FALSE, and @a depth set according to @a recurse: if @a recurse is
3871 * TRUE, set @a depth to #svn_depth_infinity, if @a recurse is
3872 * FALSE, set @a depth to #svn_depth_files.
3873 *
3874 * @deprecated Provided for backward compatibility with the 1.4 API.
3875 *
3876 * @since New in 1.4.
3877 */
3878SVN_DEPRECATED
3879svn_error_t *
3880svn_client_merge2(const char *source1,
3881                  const svn_opt_revision_t *revision1,
3882                  const char *source2,
3883                  const svn_opt_revision_t *revision2,
3884                  const char *target_wcpath,
3885                  svn_boolean_t recurse,
3886                  svn_boolean_t ignore_ancestry,
3887                  svn_boolean_t force,
3888                  svn_boolean_t dry_run,
3889                  const apr_array_header_t *merge_options,
3890                  svn_client_ctx_t *ctx,
3891                  apr_pool_t *pool);
3892
3893
3894/**
3895 * Similar to svn_client_merge2(), but with @a merge_options set to NULL.
3896 *
3897 * @deprecated Provided for backwards compatibility with the 1.3 API.
3898 */
3899SVN_DEPRECATED
3900svn_error_t *
3901svn_client_merge(const char *source1,
3902                 const svn_opt_revision_t *revision1,
3903                 const char *source2,
3904                 const svn_opt_revision_t *revision2,
3905                 const char *target_wcpath,
3906                 svn_boolean_t recurse,
3907                 svn_boolean_t ignore_ancestry,
3908                 svn_boolean_t force,
3909                 svn_boolean_t dry_run,
3910                 svn_client_ctx_t *ctx,
3911                 apr_pool_t *pool);
3912
3913
3914/**
3915 * Perform a reintegration merge of @a source_path_or_url at @a source_peg_revision
3916 * into @a target_wcpath.
3917 * @a target_wcpath must be a single-revision, #svn_depth_infinity,
3918 * pristine, unswitched working copy -- in other words, it must
3919 * reflect a single revision tree, the "target".  The mergeinfo on @a
3920 * source_path_or_url must reflect that all of the target has been merged into it.
3921 * Then this behaves like a merge with svn_client_merge5() from the
3922 * target's URL to the source.
3923 *
3924 * All other options are handled identically to svn_client_merge5().
3925 * The depth of the merge is always #svn_depth_infinity.
3926 *
3927 * @since New in 1.5.
3928 * @deprecated Provided for backwards compatibility with the 1.7 API.
3929 */
3930SVN_DEPRECATED
3931svn_error_t *
3932svn_client_merge_reintegrate(const char *source_path_or_url,
3933                             const svn_opt_revision_t *source_peg_revision,
3934                             const char *target_wcpath,
3935                             svn_boolean_t dry_run,
3936                             const apr_array_header_t *merge_options,
3937                             svn_client_ctx_t *ctx,
3938                             apr_pool_t *pool);
3939
3940/**
3941 * Merge changes from the source branch identified by
3942 * @a source_path_or_url in peg revision @a source_peg_revision,
3943 * into the target branch working copy at @a target_wcpath.
3944 *
3945 * If @a ranges_to_merge is NULL then perform an automatic merge of
3946 * all the eligible changes up to @a source_peg_revision.  If the merge
3947 * required is a reintegrate merge, then return an error if the WC has
3948 * mixed revisions, local modifications and/or switched subtrees; if
3949 * the merge is determined to be of the non-reintegrate kind, then
3950 * return an error if @a allow_mixed_rev is false and the WC contains
3951 * mixed revisions.
3952 *
3953 * If @a ranges_to_merge is not NULL then merge the changes specified
3954 * by the revision ranges in @a ranges_to_merge, or, when honouring
3955 * mergeinfo, only the eligible parts of those revision ranges.
3956 * @a ranges_to_merge is an array of <tt>svn_opt_revision_range_t
3957 * *</tt> ranges.  These ranges may describe additive and/or
3958 * subtractive merge ranges, they may overlap fully or partially,
3959 * and/or they may partially or fully negate each other.  This
3960 * rangelist is not required to be sorted.  If any revision in the
3961 * list of provided ranges has an `unspecified' or unrecognized
3962 * `kind', return #SVN_ERR_CLIENT_BAD_REVISION.
3963 *
3964 * If @a ranges_to_merge is an empty array, then do nothing.
3965 *
3966 * All other options are handled identically to svn_client_merge5().
3967 *
3968 * @since New in 1.8.
3969 */
3970svn_error_t *
3971svn_client_merge_peg5(const char *source_path_or_url,
3972                      const apr_array_header_t *ranges_to_merge,
3973                      const svn_opt_revision_t *source_peg_revision,
3974                      const char *target_wcpath,
3975                      svn_depth_t depth,
3976                      svn_boolean_t ignore_mergeinfo,
3977                      svn_boolean_t diff_ignore_ancestry,
3978                      svn_boolean_t force_delete,
3979                      svn_boolean_t record_only,
3980                      svn_boolean_t dry_run,
3981                      svn_boolean_t allow_mixed_rev,
3982                      const apr_array_header_t *merge_options,
3983                      svn_client_ctx_t *ctx,
3984                      apr_pool_t *pool);
3985
3986/**
3987 * Similar to svn_client_merge_peg5(), but automatic merge is not available
3988 * (@a ranges_to_merge must not be NULL), and the single @a ignore_ancestry
3989 * parameter maps to both @c ignore_mergeinfo and @c diff_ignore_ancestry.
3990 *
3991 * @deprecated Provided for backward compatibility with the 1.7 API.
3992 * @since New in 1.7.
3993 */
3994SVN_DEPRECATED
3995svn_error_t *
3996svn_client_merge_peg4(const char *source_path_or_url,
3997                      const apr_array_header_t *ranges_to_merge,
3998                      const svn_opt_revision_t *source_peg_revision,
3999                      const char *target_wcpath,
4000                      svn_depth_t depth,
4001                      svn_boolean_t ignore_ancestry,
4002                      svn_boolean_t force_delete,
4003                      svn_boolean_t record_only,
4004                      svn_boolean_t dry_run,
4005                      svn_boolean_t allow_mixed_rev,
4006                      const apr_array_header_t *merge_options,
4007                      svn_client_ctx_t *ctx,
4008                      apr_pool_t *pool);
4009
4010/**
4011 * Similar to svn_client_merge_peg4(), but with @a allow_mixed_rev set to
4012 * @c TRUE.  The @a force parameter maps to the @c force_delete parameter
4013 * of svn_client_merge_peg4().
4014 *
4015 * @deprecated Provided for backward compatibility with the 1.6 API.
4016 *
4017 * @since New in 1.5.
4018 */
4019SVN_DEPRECATED
4020svn_error_t *
4021svn_client_merge_peg3(const char *source,
4022                      const apr_array_header_t *ranges_to_merge,
4023                      const svn_opt_revision_t *peg_revision,
4024                      const char *target_wcpath,
4025                      svn_depth_t depth,
4026                      svn_boolean_t ignore_ancestry,
4027                      svn_boolean_t force,
4028                      svn_boolean_t record_only,
4029                      svn_boolean_t dry_run,
4030                      const apr_array_header_t *merge_options,
4031                      svn_client_ctx_t *ctx,
4032                      apr_pool_t *pool);
4033
4034/**
4035 * Similar to svn_client_merge_peg3(), but with @a record_only set to
4036 * @c FALSE, and @a depth set according to @a recurse: if @a recurse
4037 * is TRUE, set @a depth to #svn_depth_infinity, if @a recurse is
4038 * FALSE, set @a depth to #svn_depth_files.
4039 *
4040 * @deprecated Provided for backwards compatibility with the 1.4 API.
4041 *
4042 * @since New in 1.4.
4043 */
4044SVN_DEPRECATED
4045svn_error_t *
4046svn_client_merge_peg2(const char *source,
4047                      const svn_opt_revision_t *revision1,
4048                      const svn_opt_revision_t *revision2,
4049                      const svn_opt_revision_t *peg_revision,
4050                      const char *target_wcpath,
4051                      svn_boolean_t recurse,
4052                      svn_boolean_t ignore_ancestry,
4053                      svn_boolean_t force,
4054                      svn_boolean_t dry_run,
4055                      const apr_array_header_t *merge_options,
4056                      svn_client_ctx_t *ctx,
4057                      apr_pool_t *pool);
4058
4059/**
4060 * Similar to svn_client_merge_peg2(), but with @a merge_options set to
4061 * NULL.
4062 *
4063 * @deprecated Provided for backwards compatibility with the 1.3 API.
4064 *
4065 * @since New in 1.1.
4066 */
4067SVN_DEPRECATED
4068svn_error_t *
4069svn_client_merge_peg(const char *source,
4070                     const svn_opt_revision_t *revision1,
4071                     const svn_opt_revision_t *revision2,
4072                     const svn_opt_revision_t *peg_revision,
4073                     const char *target_wcpath,
4074                     svn_boolean_t recurse,
4075                     svn_boolean_t ignore_ancestry,
4076                     svn_boolean_t force,
4077                     svn_boolean_t dry_run,
4078                     svn_client_ctx_t *ctx,
4079                     apr_pool_t *pool);
4080
4081
4082/** Set @a suggestions to an ordered array of @c const char *
4083 * potential merge sources (expressed as full repository URLs) for @a
4084 * path_or_url at @a peg_revision.  @a path_or_url is a working copy
4085 * path or repository URL.  @a ctx is a context used for
4086 * authentication in the repository case.  Use @a pool for all
4087 * allocations.
4088 *
4089 * @since New in 1.5.
4090 */
4091svn_error_t *
4092svn_client_suggest_merge_sources(apr_array_header_t **suggestions,
4093                                 const char *path_or_url,
4094                                 const svn_opt_revision_t *peg_revision,
4095                                 svn_client_ctx_t *ctx,
4096                                 apr_pool_t *pool);
4097
4098
4099/**
4100 * Get the mergeinfo for a single target node (ignoring any subtrees).
4101 *
4102 * Set @a *mergeinfo to a hash mapping <tt>const char *</tt> merge source
4103 * URLs to <tt>svn_rangelist_t *</tt> rangelists describing the ranges which
4104 * have been merged into @a path_or_url as of @a peg_revision, per
4105 * @a path_or_url's explicit mergeinfo or inherited mergeinfo if no
4106 * explicit mergeinfo if found.  If no explicit or inherited mergeinfo
4107 * is found, then set @a *mergeinfo to NULL.
4108 *
4109 * Use @a pool for all necessary allocations.
4110 *
4111 * If the server doesn't support retrieval of mergeinfo (which will
4112 * never happen for file:// URLs), return an
4113 * #SVN_ERR_UNSUPPORTED_FEATURE error.
4114 *
4115 * @note Unlike most APIs which deal with mergeinfo, this one returns
4116 * data where the keys of the hash are absolute repository URLs rather
4117 * than repository filesystem paths.
4118 *
4119 * @since New in 1.5.
4120 */
4121svn_error_t *
4122svn_client_mergeinfo_get_merged(apr_hash_t **mergeinfo,
4123                                const char *path_or_url,
4124                                const svn_opt_revision_t *peg_revision,
4125                                svn_client_ctx_t *ctx,
4126                                apr_pool_t *pool);
4127
4128
4129/**
4130 * Describe the revisions that either have or have not been merged from
4131 * one source branch (or subtree) into another.
4132 *
4133 * If @a finding_merged is TRUE, then drive log entry callbacks
4134 * @a receiver / @a receiver_baton with the revisions merged from
4135 * @a source_path_or_url (as of @a source_peg_revision) into
4136 * @a target_path_or_url (as of @a target_peg_revision).  If @a
4137 * finding_merged is FALSE then find the revisions eligible for merging.
4138 *
4139 * If both @a source_start_revision and @a source_end_revision are
4140 * unspecified (that is, of kind @c svn_opt_revision_unspecified),
4141 * @a receiver will be called the requested revisions from 0 to
4142 * @a source_peg_revision and in that order (that is, oldest to
4143 * youngest).  Otherwise, both @a source_start_revision and
4144 * @a source_end_revision must be specified, which has two effects:
4145 *
4146 *   - @a receiver will be called only with revisions which fall
4147 *     within range of @a source_start_revision to
4148 *     @a source_end_revision, inclusive, and
4149 *
4150 *   - those revisions will be ordered in the same "direction" as the
4151 *     walk from @a source_start_revision to @a source_end_revision.
4152 *     (If @a source_start_revision is the younger of the two, @a
4153 *     receiver will be called with revisions in youngest-to-oldest
4154 *     order; otherwise, the reverse occurs.)
4155 *
4156 * If @a depth is #svn_depth_empty consider only the explicit or
4157 * inherited mergeinfo on @a target_path_or_url when calculating merged
4158 * revisions from @a source_path_or_url.  If @a depth is #svn_depth_infinity
4159 * then also consider the explicit subtree mergeinfo under @a
4160 * target_path_or_url.
4161 * If a depth other than #svn_depth_empty or #svn_depth_infinity is
4162 * requested then return a #SVN_ERR_UNSUPPORTED_FEATURE error.
4163 *
4164 * In addition to the behavior of @a discover_changed_paths described in
4165 * svn_client_log5(), if set to TRUE it enables detection of sub-tree
4166 * merges that are complete but can't be detected as complete without
4167 * access to the changed paths.  Sub-tree merges detected as complete will
4168 * be included if @a finding_merged is TRUE or filtered if @a finding_merged
4169 * is FALSE.
4170 *
4171 * @a revprops is the same as for svn_client_log5().  Use @a scratch_pool for
4172 * all temporary allocations.
4173 *
4174 * @a ctx is a context used for authentication.
4175 *
4176 * If the server doesn't support retrieval of mergeinfo, return an
4177 * #SVN_ERR_UNSUPPORTED_FEATURE error.
4178 *
4179 * @since New in 1.8.
4180 */
4181svn_error_t *
4182svn_client_mergeinfo_log2(svn_boolean_t finding_merged,
4183                          const char *target_path_or_url,
4184                          const svn_opt_revision_t *target_peg_revision,
4185                          const char *source_path_or_url,
4186                          const svn_opt_revision_t *source_peg_revision,
4187                          const svn_opt_revision_t *source_start_revision,
4188                          const svn_opt_revision_t *source_end_revision,
4189                          svn_log_entry_receiver_t receiver,
4190                          void *receiver_baton,
4191                          svn_boolean_t discover_changed_paths,
4192                          svn_depth_t depth,
4193                          const apr_array_header_t *revprops,
4194                          svn_client_ctx_t *ctx,
4195                          apr_pool_t *scratch_pool);
4196
4197/**
4198 * Similar to svn_client_mergeinfo_log2(), but with @a source_start_revision
4199 * and @a source_end_revision always of kind @c svn_opt_revision_unspecified;
4200 *
4201 * @deprecated Provided for backwards compatibility with the 1.7 API.
4202 * @since New in 1.7.
4203 */
4204SVN_DEPRECATED
4205svn_error_t *
4206svn_client_mergeinfo_log(svn_boolean_t finding_merged,
4207                         const char *target_path_or_url,
4208                         const svn_opt_revision_t *target_peg_revision,
4209                         const char *source_path_or_url,
4210                         const svn_opt_revision_t *source_peg_revision,
4211                         svn_log_entry_receiver_t receiver,
4212                         void *receiver_baton,
4213                         svn_boolean_t discover_changed_paths,
4214                         svn_depth_t depth,
4215                         const apr_array_header_t *revprops,
4216                         svn_client_ctx_t *ctx,
4217                         apr_pool_t *scratch_pool);
4218
4219/**
4220 * Similar to svn_client_mergeinfo_log(), but finds only merged revisions
4221 * and always operates at @a depth #svn_depth_empty.
4222 *
4223 * @deprecated Provided for backwards compatibility with the 1.6 API. Use
4224 * svn_client_mergeinfo_log() instead.
4225 * @since New in 1.5.
4226 */
4227SVN_DEPRECATED
4228svn_error_t *
4229svn_client_mergeinfo_log_merged(const char *path_or_url,
4230                                const svn_opt_revision_t *peg_revision,
4231                                const char *merge_source_path_or_url,
4232                                const svn_opt_revision_t *src_peg_revision,
4233                                svn_log_entry_receiver_t receiver,
4234                                void *receiver_baton,
4235                                svn_boolean_t discover_changed_paths,
4236                                const apr_array_header_t *revprops,
4237                                svn_client_ctx_t *ctx,
4238                                apr_pool_t *pool);
4239
4240/**
4241 * Similar to svn_client_mergeinfo_log(), but finds only eligible revisions
4242 * and always operates at @a depth #svn_depth_empty.
4243 *
4244 * @deprecated Provided for backwards compatibility with the 1.6 API. Use
4245 * svn_client_mergeinfo_log() instead.
4246 * @since New in 1.5.
4247 */
4248SVN_DEPRECATED
4249svn_error_t *
4250svn_client_mergeinfo_log_eligible(const char *path_or_url,
4251                                  const svn_opt_revision_t *peg_revision,
4252                                  const char *merge_source_path_or_url,
4253                                  const svn_opt_revision_t *src_peg_revision,
4254                                  svn_log_entry_receiver_t receiver,
4255                                  void *receiver_baton,
4256                                  svn_boolean_t discover_changed_paths,
4257                                  const apr_array_header_t *revprops,
4258                                  svn_client_ctx_t *ctx,
4259                                  apr_pool_t *pool);
4260
4261/** @} */
4262
4263/**
4264 * @defgroup Cleanup Cleanup an abnormally terminated working copy.
4265 *
4266 * @{
4267 */
4268
4269/** Recursively vacuum a working copy directory @a dir_abspath,
4270 * removing unnecessary data.
4271 *
4272 * If @a include_externals is @c TRUE, recurse into externals and vacuum them
4273 * as well.
4274 *
4275 * If @a remove_unversioned_items is @c TRUE, remove unversioned items
4276 * in @a dir_abspath after successful working copy cleanup.
4277 * If @a remove_ignored_items is @c TRUE, remove ignored unversioned items
4278 * in @a dir_abspath after successful working copy cleanup.
4279 *
4280 * If @a fix_recorded_timestamps is @c TRUE, this function fixes recorded
4281 * timestamps for unmodified files in the working copy, reducing comparision
4282 * time on future checks.
4283 *
4284 * If @a vacuum_pristines is @c TRUE, and @a dir_abspath points to the working
4285 * copy root unreferenced files in the pristine store are removed.
4286 *
4287 * When asked to remove unversioned or ignored items, and the working copy
4288 * is already locked, return #SVN_ERR_WC_LOCKED. This prevents accidental
4289 * working copy corruption in case users run the cleanup operation to
4290 * remove unversioned items while another client is performing some other
4291 * operation on the working copy.
4292 *
4293 * If @a ctx->cancel_func is non-NULL, invoke it with @a
4294 * ctx->cancel_baton at various points during the operation.  If it
4295 * returns an error (typically #SVN_ERR_CANCELLED), return that error
4296 * immediately.
4297 *
4298 * Use @a scratch_pool for any temporary allocations.
4299 *
4300 * @since New in 1.9.
4301 */
4302svn_error_t *
4303svn_client_vacuum(const char *dir_abspath,
4304                  svn_boolean_t remove_unversioned_items,
4305                  svn_boolean_t remove_ignored_items,
4306                  svn_boolean_t fix_recorded_timestamps,
4307                  svn_boolean_t vacuum_pristines,
4308                  svn_boolean_t include_externals,
4309                  svn_client_ctx_t *ctx,
4310                  apr_pool_t *scratch_pool);
4311
4312
4313/** Recursively cleanup a working copy directory @a dir_abspath, finishing any
4314 * incomplete operations, removing lockfiles, etc.
4315 *
4316 * If @a break_locks is @c TRUE, existing working copy locks at or below @a
4317 * dir_abspath are broken, otherwise a normal write lock is obtained.
4318 *
4319 * If @a fix_recorded_timestamps is @c TRUE, this function fixes recorded
4320 * timestamps for unmodified files in the working copy, reducing comparision
4321 * time on future checks.
4322 *
4323 * If @a clear_dav_cache is @c TRUE, the caching of DAV information for older
4324 * mod_dav served repositories is cleared. This clearing invalidates some
4325 * cached information used for pre-HTTPv2 repositories.
4326 *
4327 * If @a vacuum_pristines is @c TRUE, and @a dir_abspath points to the working
4328 * copy root unreferenced files in the pristine store are removed.
4329 *
4330 * If @a include_externals is @c TRUE, recurse into externals and clean
4331 * them up as well.
4332 *
4333 * If @a ctx->cancel_func is non-NULL, invoke it with @a
4334 * ctx->cancel_baton at various points during the operation.  If it
4335 * returns an error (typically #SVN_ERR_CANCELLED), return that error
4336 * immediately.
4337 *
4338 * Use @a scratch_pool for any temporary allocations.
4339 *
4340 * @since New in 1.9.
4341 */
4342svn_error_t *
4343svn_client_cleanup2(const char *dir_abspath,
4344                    svn_boolean_t break_locks,
4345                    svn_boolean_t fix_recorded_timestamps,
4346                    svn_boolean_t clear_dav_cache,
4347                    svn_boolean_t vacuum_pristines,
4348                    svn_boolean_t include_externals,
4349                    svn_client_ctx_t *ctx,
4350                    apr_pool_t *scratch_pool);
4351
4352/** Like svn_client_cleanup2(), but no support for not breaking locks and
4353 * cleaning up externals and using a potentially non absolute path.
4354 *
4355 * @deprecated Provided for limited backwards compatibility with the 1.8 API.
4356 */
4357SVN_DEPRECATED
4358svn_error_t *
4359svn_client_cleanup(const char *dir,
4360                   svn_client_ctx_t *ctx,
4361                   apr_pool_t *scratch_pool);
4362
4363
4364/** @} */
4365
4366/**
4367 * @defgroup Upgrade Upgrade a working copy.
4368 *
4369 * @{
4370 */
4371
4372/** Recursively upgrade a working copy from any older format to the current
4373 * WC metadata storage format.  @a wcroot_dir is the path to the WC root.
4374 *
4375 * Use @a scratch_pool for any temporary allocations.
4376 *
4377 * @since New in 1.7.
4378 */
4379svn_error_t *
4380svn_client_upgrade(const char *wcroot_dir,
4381                   svn_client_ctx_t *ctx,
4382                   apr_pool_t *scratch_pool);
4383
4384
4385/** @} */
4386
4387/**
4388 * @defgroup Relocate Switch a working copy to a different repository.
4389 *
4390 * @{
4391 */
4392
4393/**
4394 * Recursively modify a working copy rooted at @a wcroot_dir, changing
4395 * any repository URLs that begin with @a from_prefix to begin with @a
4396 * to_prefix instead.
4397 *
4398 * @param wcroot_dir Working copy root directory
4399 * @param from_prefix Original URL
4400 * @param to_prefix New URL
4401 * @param ignore_externals If not set, recurse into external working
4402 *        copies after relocating the primary working copy
4403 * @param ctx svn_client_ctx_t
4404 * @param pool The pool from which to perform memory allocations
4405 *
4406 * @since New in 1.7
4407 */
4408svn_error_t *
4409svn_client_relocate2(const char *wcroot_dir,
4410                     const char *from_prefix,
4411                     const char *to_prefix,
4412                     svn_boolean_t ignore_externals,
4413                     svn_client_ctx_t *ctx,
4414                     apr_pool_t *pool);
4415
4416/**
4417 * Similar to svn_client_relocate2(), but with @a ignore_externals
4418 * always TRUE.
4419 *
4420 * @note As of the 1.7 API, @a dir is required to be a working copy
4421 * root directory, and @a recurse is required to be TRUE.
4422 *
4423 * @deprecated Provided for limited backwards compatibility with the
4424 * 1.6 API.
4425 */
4426SVN_DEPRECATED
4427svn_error_t *
4428svn_client_relocate(const char *dir,
4429                    const char *from_prefix,
4430                    const char *to_prefix,
4431                    svn_boolean_t recurse,
4432                    svn_client_ctx_t *ctx,
4433                    apr_pool_t *pool);
4434
4435/** @} */
4436
4437/**
4438 * @defgroup Revert Remove local changes in a repository.
4439 *
4440 * @{
4441 */
4442
4443/**
4444 * Restore the pristine version of working copy @a paths,
4445 * effectively undoing any local mods. This means returning each
4446 * path's versioned status to 'unmodified' and changing its on-disk
4447 * state to match that.
4448 *
4449 * If an item was in a state of conflict, reverting also marks the
4450 * conflict as resolved. If there are conflict marker files attached
4451 * to the item, these are removed.
4452 *
4453 * @a paths is an array of (const char *) local WC paths.
4454 *
4455 * For each path in @a paths, revert it if it is a file.  Else if it is
4456 * a directory, revert according to @a depth:
4457 * If @a depth is #svn_depth_empty, revert just
4458 * the directory; else if #svn_depth_files, revert the directory
4459 * and any files immediately under the directory; else if
4460 * #svn_depth_immediates, revert all of the preceding plus
4461 * immediate subdirectories; else if #svn_depth_infinity,
4462 * revert path and everything under it fully recursively.
4463 *
4464 * @a changelists is an array of <tt>const char *</tt> changelist
4465 * names, used as a restrictive filter on items reverted; that is,
4466 * don't revert any item unless it's a member of one of those
4467 * changelists.  If @a changelists is empty (or altogether @c NULL),
4468 * no changelist filtering occurs.
4469 *
4470 * If @a clear_changelists is TRUE, then changelist information for the
4471 * paths is cleared while reverting.
4472 *
4473 * The @a metadata_only and @a added_keep_local options control the
4474 * extent of reverting. If @a metadata_only is TRUE, the working copy
4475 * files are untouched, but if there are conflict marker files attached
4476 * to these files these markers are removed. Otherwise, if
4477 * @a added_keep_local is TRUE, then all items are reverted except an
4478 * item that was scheduled as plain 'add' (not a copy) will not be
4479 * removed from the working copy. Otherwise, all items are reverted and
4480 * their on-disk state changed to match.
4481 *
4482 * Consult the @c SVN_CONFIG_OPTION_USE_COMMIT_TIMES option in @a ctx to
4483 * determine whether or not to revert timestamp to the time of last
4484 * commit ('use-commit-times = yes').
4485 *
4486 * If @a ctx->notify_func2 is non-NULL, then for each item reverted,
4487 * call @a ctx->notify_func2 with @a ctx->notify_baton2 and the path of
4488 * the reverted item.
4489 *
4490 * If an item specified for reversion is not under version control,
4491 * then do not error, just invoke @a ctx->notify_func2 with @a
4492 * ctx->notify_baton2, using notification code #svn_wc_notify_skip.
4493 *
4494 * @warning The 'revert' command intentionally and permanently loses
4495 * local modifications.
4496 *
4497 * @since New in 1.11.
4498 */
4499svn_error_t *
4500svn_client_revert4(const apr_array_header_t *paths,
4501                   svn_depth_t depth,
4502                   const apr_array_header_t *changelists,
4503                   svn_boolean_t clear_changelists,
4504                   svn_boolean_t metadata_only,
4505                   svn_boolean_t added_keep_local,
4506                   svn_client_ctx_t *ctx,
4507                   apr_pool_t *scratch_pool);
4508
4509/** Similar to svn_client_revert4(), but with @a added_keep_local set to
4510 * TRUE.
4511 *
4512 * @since New in 1.9.
4513 * @deprecated Provided for backwards compatibility with the 1.10 API.
4514 */
4515SVN_DEPRECATED
4516svn_error_t *
4517svn_client_revert3(const apr_array_header_t *paths,
4518                   svn_depth_t depth,
4519                   const apr_array_header_t *changelists,
4520                   svn_boolean_t clear_changelists,
4521                   svn_boolean_t metadata_only,
4522                   svn_client_ctx_t *ctx,
4523                   apr_pool_t *pool);
4524
4525/** Similar to svn_client_revert2, but with @a clear_changelists set to
4526 * FALSE and @a metadata_only set to FALSE.
4527 *
4528 * @since New in 1.5.
4529 * @deprecated Provided for backwards compatibility with the 1.8 API.
4530 */
4531SVN_DEPRECATED
4532svn_error_t *
4533svn_client_revert2(const apr_array_header_t *paths,
4534                   svn_depth_t depth,
4535                   const apr_array_header_t *changelists,
4536                   svn_client_ctx_t *ctx,
4537                   apr_pool_t *pool);
4538
4539
4540/**
4541 * Similar to svn_client_revert2(), but with @a changelists passed as
4542 * @c NULL, and @a depth set according to @a recurse: if @a recurse is
4543 * TRUE, @a depth is #svn_depth_infinity, else if @a recurse is
4544 * FALSE, @a depth is #svn_depth_empty.
4545 *
4546 * @note Most APIs map @a recurse==FALSE to @a depth==svn_depth_files;
4547 * revert is deliberately different.
4548 *
4549 * @deprecated Provided for backwards compatibility with the 1.4 API.
4550 */
4551SVN_DEPRECATED
4552svn_error_t *
4553svn_client_revert(const apr_array_header_t *paths,
4554                  svn_boolean_t recursive,
4555                  svn_client_ctx_t *ctx,
4556                  apr_pool_t *pool);
4557
4558
4559/** @} */
4560
4561/**
4562 * @defgroup Conflicts Dealing with conflicted paths.
4563 *
4564 * @{
4565 */
4566
4567/**
4568 * An opaque type which represents a conflicted node in the working copy.
4569 *
4570 * @since New in 1.10.
4571 */
4572typedef struct svn_client_conflict_t svn_client_conflict_t;
4573
4574/**
4575 * An opaque type which represents a resolution option for a conflict.
4576 *
4577 * @since New in 1.10.
4578 */
4579typedef struct svn_client_conflict_option_t svn_client_conflict_option_t;
4580
4581/**
4582 * A public enumeration of conflict option IDs.
4583 *
4584 * @since New in 1.10, unless noted otherwise.
4585 */
4586typedef enum svn_client_conflict_option_id_t {
4587
4588  /* Options for text and property conflicts.
4589   * These values intentionally mirror svn_wc_conflict_choice_t. */
4590  svn_client_conflict_option_undefined = -1, /* for private use only */
4591  svn_client_conflict_option_postpone = 0,
4592  svn_client_conflict_option_base_text,
4593  svn_client_conflict_option_incoming_text, /* "theirs-full" */
4594  svn_client_conflict_option_working_text,  /* "mine-full" */
4595  svn_client_conflict_option_incoming_text_where_conflicted,
4596  svn_client_conflict_option_working_text_where_conflicted,
4597  svn_client_conflict_option_merged_text,
4598  svn_client_conflict_option_unspecified,
4599  /* Values derived from svn_wc_conflict_choice_t end here. */
4600
4601  /* Tree conflict resolution options start here. */
4602
4603  /* Accept current working copy state. */
4604  svn_client_conflict_option_accept_current_wc_state,
4605
4606  /* Options for local move vs incoming edit on update. */
4607  svn_client_conflict_option_update_move_destination,
4608
4609  /* Options for local delete/replace vs incoming edit on update. */
4610  svn_client_conflict_option_update_any_moved_away_children,
4611
4612  /* Options for incoming add vs local add or obstruction. */
4613  svn_client_conflict_option_incoming_add_ignore,
4614
4615  /* Options for incoming file add vs local file add or obstruction. */
4616  svn_client_conflict_option_incoming_added_file_text_merge,
4617  svn_client_conflict_option_incoming_added_file_replace_and_merge,
4618
4619  /* Options for incoming dir add vs local dir add or obstruction. */
4620  svn_client_conflict_option_incoming_added_dir_merge,
4621  svn_client_conflict_option_incoming_added_dir_replace,
4622  svn_client_conflict_option_incoming_added_dir_replace_and_merge,
4623
4624  /* Options for incoming delete vs any */
4625  svn_client_conflict_option_incoming_delete_ignore,
4626  svn_client_conflict_option_incoming_delete_accept,
4627
4628  /* Options for incoming move vs local edit */
4629  svn_client_conflict_option_incoming_move_file_text_merge,
4630  svn_client_conflict_option_incoming_move_dir_merge,
4631
4632  /* Options for local move vs incoming edit on merge. */
4633  svn_client_conflict_option_local_move_file_text_merge,
4634  svn_client_conflict_option_local_move_dir_merge, /**< @since New in 1.11. */
4635
4636  /* Options for local missing vs incoming edit on merge. */
4637  svn_client_conflict_option_sibling_move_file_text_merge, /**< @since New in 1.11. */
4638  svn_client_conflict_option_sibling_move_dir_merge, /**< @since New in 1.11. */
4639
4640  /* Options for local move vs incoming move on merge. */
4641  svn_client_conflict_option_both_moved_file_merge, /*< @since New in 1.12 */
4642  svn_client_conflict_option_both_moved_file_move_merge, /*< @since New in 1.12 */
4643  svn_client_conflict_option_both_moved_dir_merge, /*< @since New in 1.12 */
4644  svn_client_conflict_option_both_moved_dir_move_merge, /*< @since New in 1.12 */
4645} svn_client_conflict_option_id_t;
4646
4647/**
4648 * Set a merged property value on @a option to @a merged_propval.
4649 *
4650 * Setting the merged value is required before resolving the property
4651 * conflict using an option with ID svn_client_conflict_option_merged_text.
4652 *
4653 * The contents of @a merged_propval are not copied, so the storage it
4654 * points to needs to remain valid until svn_client_conflict_prop_resolve()
4655 * has been called with @a option.
4656 *
4657 * @since New in 1.10.
4658 */
4659void
4660svn_client_conflict_option_set_merged_propval(
4661  svn_client_conflict_option_t *option,
4662  const svn_string_t *merged_propval);
4663
4664/**
4665 * Get a list of possible repository paths which can be applied to @a option.
4666 *
4667 * In some situations, there can be multiple possible destinations for a move.
4668 * One such situation is where a file was copied and moved in the same revision:
4669 *   svn cp a b; svn mv a c; svn commit
4670 * When this move is merged elsewhere, both b and c will appear as valid move
4671 * destinations to the conflict resolver. To resolve such ambiguity, the client
4672 * may call this function to obtain a list of possible destinations the user
4673 * may choose from.
4674 *
4675 * @a *possible_moved_to_repos_relpaths is set to NULL if the @a option does
4676 * not support multiple move targets. API users may assume that only one option
4677 * among those which can be applied to a conflict supports move targets.
4678 *
4679 * The array is allocated in @a result_pool and will have "const char *"
4680 * elements pointing to strings also allocated in @a result_pool.
4681 * All paths are relpaths, and relative to the repository root.
4682 *
4683 * @see svn_client_conflict_option_set_moved_to_repos_relpath2()
4684 * @since New in 1.11.
4685 */
4686svn_error_t *
4687svn_client_conflict_option_get_moved_to_repos_relpath_candidates2(
4688  apr_array_header_t **possible_moved_to_repos_relpaths,
4689  svn_client_conflict_option_t *option,
4690  apr_pool_t *result_pool,
4691  apr_pool_t *scratch_pool);
4692
4693/**
4694 * Get a list of possible repository paths which can be applied to the
4695 * svn_client_conflict_option_incoming_move_file_text_merge, or the
4696 * svn_client_conflict_option_incoming_move_dir_merge resolution @a option.
4697 *
4698 * In SVN 1.10, if a different option is passed in, this function will
4699 * raise an assertion failure. Otherwise this function behaves just like
4700 * svn_client_conflict_option_get_moved_to_repos_relpath_candidates2().
4701 *
4702 * @since New in 1.10.
4703 * @deprecated use svn_client_conflict_option_get_moved_to_repos_relpath_candidates2()
4704 */
4705svn_error_t *
4706svn_client_conflict_option_get_moved_to_repos_relpath_candidates(
4707  apr_array_header_t **possible_moved_to_repos_relpaths,
4708  svn_client_conflict_option_t *option,
4709  apr_pool_t *result_pool,
4710  apr_pool_t *scratch_pool);
4711
4712/**
4713 * Set the preferred moved target repository path. If @a option is not
4714 * applicable to a moved target repository path, do nothing.
4715 *
4716 * @a preferred_move_target_idx must be a valid index into the list returned
4717 * by svn_client_conflict_option_get_moved_to_repos_relpath_candidates().
4718 *
4719 * This function can be called multiple times.
4720 * It affects the output of svn_client_conflict_tree_get_description() and
4721 * svn_client_conflict_option_get_description(). Call these functions again
4722 * to get updated descriptions containing the newly selected move target.
4723 *
4724 * @since New in 1.11.
4725 */
4726svn_error_t *
4727svn_client_conflict_option_set_moved_to_repos_relpath2(
4728  svn_client_conflict_option_t *option,
4729  int preferred_move_target_idx,
4730  svn_client_ctx_t *ctx,
4731  apr_pool_t *scratch_pool);
4732
4733/**
4734 * Like svn_client_conflict_option_set_moved_to_repos_relpath2(), except
4735 * that in SVN 1.10 it raises an assertion failure if an option other
4736 * than svn_client_conflict_option_incoming_move_file_text_merge or
4737 * svn_client_conflict_option_incoming_move_dir_merge is passed.
4738 *
4739 * @since New in 1.10.
4740 * @deprecated use svn_client_conflict_option_set_moved_to_repos_relpath2()
4741 */
4742svn_error_t *
4743svn_client_conflict_option_set_moved_to_repos_relpath(
4744  svn_client_conflict_option_t *option,
4745  int preferred_move_target_idx,
4746  svn_client_ctx_t *ctx,
4747  apr_pool_t *scratch_pool);
4748
4749/**
4750 * Get a list of possible moved-to abspaths in the working copy which can be
4751 * applied to @a option.
4752 *
4753 * All working copy paths in the returned list correspond to one repository
4754 * path which is be one of the possible destinations of a move operation.
4755 * More than one repository-side move target candidate may exist; call
4756 * svn_client_conflict_option_get_moved_to_repos_relpath_candidates() before
4757 * calling this function to let the user select a repository path first.
4758 * Otherwise, one of the repository-side paths will be selected internally.
4759 *
4760 * @a *possible_moved_to_abspaths is set to NULL if the @a option does not
4761 * support multiple move targets. API users may assume that only one option
4762 * among those which can be applied to a conflict supports move targets.
4763 *
4764 * If no possible moved-to paths can be found, return an empty array.
4765 * This doesn't mean that no move happened in the repository. It is possible
4766 * that the move destination is outside the scope of the current working copy,
4767 * for example, in which case the conflict must be resolved in some other way.
4768 *
4769 * @see svn_client_conflict_option_set_moved_to_abspath2()
4770 * @since New in 1.11.
4771 */
4772svn_error_t *
4773svn_client_conflict_option_get_moved_to_abspath_candidates2(
4774  apr_array_header_t **possible_moved_to_abspaths,
4775  svn_client_conflict_option_t *option,
4776  apr_pool_t *result_pool,
4777  apr_pool_t *scratch_pool);
4778
4779/**
4780 * Get a list of possible moved-to abspaths in the working copy which can be
4781 * svn_client_conflict_option_incoming_move_file_text_merge, or the
4782 * svn_client_conflict_option_incoming_move_dir_merge resolution @a option.
4783 *
4784 * In SVN 1.10, if a different option is passed in, this function will
4785 * raise an assertion failure. Otherwise this function behaves just like
4786 * svn_client_conflict_option_get_moved_to_abspath_candidates2().
4787 *
4788 * @since New in 1.10.
4789 * @deprecated use svn_client_conflict_option_get_moved_to_abspath_candidates2()
4790 */
4791svn_error_t *
4792svn_client_conflict_option_get_moved_to_abspath_candidates(
4793  apr_array_header_t **possible_moved_to_abspaths,
4794  svn_client_conflict_option_t *option,
4795  apr_pool_t *result_pool,
4796  apr_pool_t *scratch_pool);
4797
4798/**
4799 * Set the preferred moved target working copy path. If @a option is not
4800 * applicable to a moved target working copy path, do nothing.
4801 *
4802 * @a preferred_move_target_idx must be a valid index into the list
4803 * returned by svn_client_conflict_option_get_moved_to_abspath_candidates2().
4804 *
4805 * This function can be called multiple times.
4806 * It affects the output of svn_client_conflict_tree_get_description() and
4807 * svn_client_conflict_option_get_description(). Call these functions again
4808 * to get updated descriptions containing the newly selected move target.
4809 *
4810 * @since New in 1.11.
4811 */
4812svn_error_t *
4813svn_client_conflict_option_set_moved_to_abspath2(
4814  svn_client_conflict_option_t *option,
4815  int preferred_move_target_idx,
4816  svn_client_ctx_t *ctx,
4817  apr_pool_t *scratch_pool);
4818
4819/**
4820 * Like svn_client_conflict_option_set_moved_to_abspath2(), except that
4821 * in SVN 1.10 this function raises an assertion failure if an option
4822 * other than svn_client_conflict_option_incoming_move_file_text_merge or
4823 * svn_client_conflict_option_incoming_move_dir_merge is passed.
4824 *
4825 * @since New in 1.10.
4826 * @deprecated use svn_client_conflict_option_set_moved_to_abspath2()
4827 */
4828svn_error_t *
4829svn_client_conflict_option_set_moved_to_abspath(
4830  svn_client_conflict_option_t *option,
4831  int preferred_move_target_idx,
4832  svn_client_ctx_t *ctx,
4833  apr_pool_t *scratch_pool);
4834
4835/**
4836 * Given an @a option_id, try to find the corresponding option in @a options,
4837 * which is an array of svn_client_conflict_option_t * elements.
4838 *
4839 * Return NULL if no corresponding option can be be found.
4840 *
4841 * @since New in 1.10.
4842 */
4843svn_client_conflict_option_t *
4844svn_client_conflict_option_find_by_id(
4845  apr_array_header_t *options,
4846  svn_client_conflict_option_id_t option_id);
4847
4848/**
4849 * Return a conflict for the conflicted path @a local_abspath.
4850 *
4851 * @since New in 1.10.
4852 */
4853svn_error_t *
4854svn_client_conflict_get(svn_client_conflict_t **conflict,
4855                        const char *local_abspath,
4856                        svn_client_ctx_t *ctx,
4857                        apr_pool_t *result_pool,
4858                        apr_pool_t *scratch_pool);
4859
4860/**
4861 * Callback for svn_client_conflict_conflict_walk();
4862 *
4863 * The lifetime of @a conflict is limited. Its allocation in
4864 * memory will not persist beyond this callback's execution.
4865 *
4866 * @since New in 1.10.
4867 */
4868typedef svn_error_t *(*svn_client_conflict_walk_func_t)(
4869  void *baton,
4870  svn_client_conflict_t *conflict,
4871  apr_pool_t *scratch_pool);
4872
4873/**
4874 * Walk all conflicts within the specified @a depth of @a local_abspath.
4875 * Pass each conflict found during the walk to the @a conflict_walk_func
4876 * callback, along with @a conflict_walk_func_baton.
4877 * Use cancellation and notification support provided by client context @a ctx.
4878 *
4879 * This callback may choose to resolve the conflict. If the act of resolving
4880 * a conflict creates new conflicts within the walked working copy (as might
4881 * be the case for some tree conflicts), the callback will be invoked for each
4882 * such new conflict as well.
4883 *
4884 * @since New in 1.10.
4885 */
4886svn_error_t *
4887svn_client_conflict_walk(const char *local_abspath,
4888                         svn_depth_t depth,
4889                         svn_client_conflict_walk_func_t conflict_walk_func,
4890                         void *conflict_walk_func_baton,
4891                         svn_client_ctx_t *ctx,
4892                         apr_pool_t *scratch_pool);
4893
4894/**
4895* Indicate the types of conflicts present on the working copy node
4896* described by @a conflict. Any output argument may be @c NULL if
4897* the caller is not interested in the status of a particular type.
4898*
4899* The returned @a *props_conflicted array is allocated in @a result_pool.
4900* It contains the names of conflicted properties. If no property conflict
4901* exists, the array will contain no elements.
4902*
4903* @since New in 1.10.
4904*/
4905svn_error_t *
4906svn_client_conflict_get_conflicted(svn_boolean_t *text_conflicted,
4907                                   apr_array_header_t **props_conflicted,
4908                                   svn_boolean_t *tree_conflicted,
4909                                   svn_client_conflict_t *conflict,
4910                                   apr_pool_t *result_pool,
4911                                   apr_pool_t *scratch_pool);
4912
4913/**
4914 * Return a textual human-readable description of the property conflict
4915 * described by @a conflict, allocated in @a result_pool. The description
4916 * is encoded in UTF-8 and may contain multiple lines separated by
4917 * @c APR_EOL_STR. The last line is not terminated by a newline.
4918 *
4919 * Additionally, the description may be localized to the language used
4920 * by the current locale.
4921 *
4922 * @since New in 1.10.
4923 */
4924svn_error_t *
4925svn_client_conflict_prop_get_description(const char **description,
4926                                         svn_client_conflict_t *conflict,
4927                                         apr_pool_t *result_pool,
4928                                         apr_pool_t *scratch_pool);
4929
4930/**
4931 * Return a textual human-readable description of the tree conflict
4932 * described by @a conflict, allocated in @a result_pool. The description
4933 * is encoded in UTF-8 and may contain multiple lines separated by
4934 * @c APR_EOL_STR. The last line is not terminated by a newline.
4935 *
4936 * Additionally, the description may be localized to the language used
4937 * by the current locale.
4938 *
4939 * While client implementors are free to enhance descriptions by adding
4940 * additional information to the text, or break up very long lines for
4941 * formatting purposes, there is no syntax defined for descriptions, and
4942 * implementors should not rely on any particular parts of descriptions
4943 * to remain stable over time, apart from what is stated below.
4944 * Descriptions may or may not form complete sentences. They may contain
4945 * paths relative to the repository root; such paths always start with "^/",
4946 * and end with either a peg revision (e.g. "@100") or a colon followed by
4947 * a range of revisions (as in svn:mergeinfo, e.g. ":100-200").
4948 * Paths may appear on a line of their own to avoid overlong lines.
4949 * Any revision numbers mentioned elsewhere in the description are
4950 * prefixed with the letter 'r' (e.g. "r99").
4951 *
4952 * The description has two parts: One part describes the "incoming change"
4953 * applied by an update, merge, or switch operation. The other part
4954 * describes the "local change" which occurred in the working copy or
4955 * perhaps in the history of a merge target branch.
4956 * Both parts are provided independently to allow for some flexibility
4957 * when displaying the description. As a convention, displaying the
4958 * "incoming change" first and the "local change" second is recommended.
4959 *
4960 * By default, the description is based only on information available in
4961 * the working copy. If svn_client_conflict_tree_get_details() was already
4962 * called for @a conflict, the description might also contain useful
4963 * information obtained from the repository and provide for a much better
4964 * user experience.
4965 *
4966 * @since New in 1.10.
4967 */
4968svn_error_t *
4969svn_client_conflict_tree_get_description(
4970  const char **incoming_change_description,
4971  const char **local_change_description,
4972  svn_client_conflict_t *conflict,
4973  svn_client_ctx_t *ctx,
4974  apr_pool_t *result_pool,
4975  apr_pool_t *scratch_pool);
4976
4977/**
4978 * Set @a *options to an array of pointers to svn_client_conflict_option_t
4979 * objects applicable to text conflicts described by @a conflict.
4980 *
4981 * @since New in 1.10.
4982 */
4983svn_error_t *
4984svn_client_conflict_text_get_resolution_options(apr_array_header_t **options,
4985                                                svn_client_conflict_t *conflict,
4986                                                svn_client_ctx_t *ctx,
4987                                                apr_pool_t *result_pool,
4988                                                apr_pool_t *scratch_pool);
4989
4990/**
4991 * Set @a *options to an array of pointers to svn_client_conflict_option_t
4992 * objects applicable to property conflicts described by @a conflict.
4993 *
4994 * @since New in 1.10.
4995 */
4996svn_error_t *
4997svn_client_conflict_prop_get_resolution_options(apr_array_header_t **options,
4998                                                svn_client_conflict_t *conflict,
4999                                                svn_client_ctx_t *ctx,
5000                                                apr_pool_t *result_pool,
5001                                                apr_pool_t *scratch_pool);
5002
5003/**
5004 * Set @a *options to an array of pointers to svn_client_conflict_option_t
5005 * objects applicable to the tree conflict described by @a conflict.
5006 *
5007 * By default, the list of options is based only on information available in
5008 * the working copy. If svn_client_conflict_tree_get_details() was already
5009 * called for @a conflict, a more useful list of options might be returned.
5010 *
5011 * @since New in 1.10.
5012 */
5013svn_error_t *
5014svn_client_conflict_tree_get_resolution_options(apr_array_header_t **options,
5015                                                svn_client_conflict_t *conflict,
5016                                                svn_client_ctx_t *ctx,
5017                                                apr_pool_t *result_pool,
5018                                                apr_pool_t *scratch_pool);
5019
5020/**
5021 * Find more information about the tree conflict represented by @a conflict.
5022 *
5023 * A call to svn_client_conflict_tree_get_description() may yield much better
5024 * results after this function has been called.
5025 *
5026 * A call to svn_client_conflict_tree_get_resolution_options() may provide
5027 * more useful resolution options if this function has been called.
5028 *
5029 * This function may contact the repository. Use the authentication baton
5030 * cached in @a ctx for authentication if contacting the repository.
5031 *
5032 * @since New in 1.10.
5033 */
5034svn_error_t *
5035svn_client_conflict_tree_get_details(svn_client_conflict_t *conflict,
5036                                     svn_client_ctx_t *ctx,
5037                                     apr_pool_t *scratch_pool);
5038
5039/**
5040 * Return an ID for @a option. This ID can be used by callers to associate
5041 * arbitrary data with a particular conflict resolution option.
5042 *
5043 * The ID of a particular resolution option will never change in future
5044 * revisions of this API.
5045 *
5046 * @since New in 1.10.
5047 */
5048svn_client_conflict_option_id_t
5049svn_client_conflict_option_get_id(svn_client_conflict_option_t *option);
5050
5051/**
5052 * Return a textual human-readable label of @a option, allocated in
5053 * @a result_pool. The label is encoded in UTF-8 and usually
5054 * contains up to three words.
5055 *
5056 * Additionally, the label may be localized to the language used
5057 * by the current locale.
5058 *
5059 * @since New in 1.10.
5060 */
5061const char *
5062svn_client_conflict_option_get_label(svn_client_conflict_option_t *option,
5063                                     apr_pool_t *result_pool);
5064
5065/**
5066 * Return a textual human-readable description of @a option, allocated in
5067 * @a result_pool. The description is encoded in UTF-8 and may contain
5068 * multiple lines separated by @c APR_EOL_STR.
5069 *
5070 * Additionally, the description may be localized to the language used
5071 * by the current locale.
5072 *
5073 * @since New in 1.10.
5074 */
5075const char *
5076svn_client_conflict_option_get_description(svn_client_conflict_option_t *option,
5077                                           apr_pool_t *result_pool);
5078
5079/**
5080 * Return the ID of the recommended resolution option. If no specific option
5081 * is recommended, return @c svn_client_conflict_option_unspecified;
5082 *
5083 * Client implementations which aim to avoid excessive interactive prompting
5084 * may wish to try a recommended resolution option before falling back to
5085 * asking the user which option to use.
5086 *
5087 * Conflict resolution with a recommended option is not guaranteed to succeed.
5088 * Clients should check for errors when trying to resolve a conflict and fall
5089 * back to other options and/or interactive prompting when the recommended
5090 * option fails to resolve a conflict.
5091 *
5092 * If @a conflict is a tree conflict, svn_client_conflict_tree_get_details()
5093 * should be called before this function to allow for useful recommendations.
5094 *
5095 * @since New in 1.10.
5096 */
5097svn_client_conflict_option_id_t
5098svn_client_conflict_get_recommended_option_id(svn_client_conflict_t *conflict);
5099
5100/**
5101 * Return the absolute path to the conflicted working copy node described
5102 * by @a conflict.
5103 *
5104 * @since New in 1.10.
5105 */
5106const char *
5107svn_client_conflict_get_local_abspath(svn_client_conflict_t *conflict);
5108
5109/**
5110 * Return the operation during which the conflict described by @a
5111 * conflict was recorded.
5112 *
5113 * @since New in 1.10.
5114 */
5115svn_wc_operation_t
5116svn_client_conflict_get_operation(svn_client_conflict_t *conflict);
5117
5118/**
5119 * Return the action an update, switch, or merge operation attempted to
5120 * perform on the working copy node described by @a conflict.
5121 *
5122 * @since New in 1.10.
5123 */
5124svn_wc_conflict_action_t
5125svn_client_conflict_get_incoming_change(svn_client_conflict_t *conflict);
5126
5127/**
5128 * Return the reason why the attempted action performed by an update, switch,
5129 * or merge operation conflicted with the state of the node in the working copy.
5130 *
5131 * During update and switch operations this local change is part of uncommitted
5132 * modifications in the working copy. During merge operations it may
5133 * additionally be part of the history of the merge target branch, anywhere
5134 * between the common ancestor revision and the working copy revision.
5135 *
5136 * @since New in 1.10.
5137 */
5138svn_wc_conflict_reason_t
5139svn_client_conflict_get_local_change(svn_client_conflict_t *conflict);
5140
5141/**
5142 * Return information about the repository associated with @a conflict.
5143 * In case of a foreign-repository merge this will differ from the
5144 * repository information associated with the merge target working copy.
5145 *
5146 * @since New in 1.10.
5147 */
5148svn_error_t *
5149svn_client_conflict_get_repos_info(const char **repos_root_url,
5150                                   const char **repos_uuid,
5151                                   svn_client_conflict_t *conflict,
5152                                   apr_pool_t *result_pool,
5153                                   apr_pool_t *scratch_pool);
5154
5155/**
5156 * Return the repository-relative location and the node kind of the incoming
5157 * old version of the conflicted node described by @a conflict.
5158 *
5159 * If the repository-relative path is not available, the @a
5160 * *incoming_old_repos_relpath will be set to @c NULL,
5161 *
5162 * If the peg revision is not available, @a *incoming_old_regrev will be
5163 * set to SVN_INVALID_REVNUM.
5164 *
5165 * If the node kind is not available or if the node does not exist at the
5166 * specified path and revision, @a *incoming_old_node_kind will be set to
5167 * svn_node_none.
5168 * ### Should return svn_node_unkown if not available?
5169 *
5170 * Any output parameter may be set to @c NULL by the caller to indicate that
5171 * a particular piece of information should not be returned.
5172 *
5173 * In case of tree conflicts, this "path@revision" does not necessarily exist
5174 * in the repository, and it does not necessarily represent the incoming
5175 * change which is responsible for the occurance of the tree conflict.
5176 * The responsible incoming change is generally located somewhere between
5177 * the old and new incoming versions.
5178 *
5179 * @since New in 1.10.
5180 */
5181svn_error_t *
5182svn_client_conflict_get_incoming_old_repos_location(
5183  const char **incoming_old_repos_relpath,
5184  svn_revnum_t *incoming_old_regrev,
5185  svn_node_kind_t *incoming_old_node_kind,
5186  svn_client_conflict_t *conflict,
5187  apr_pool_t *result_pool,
5188  apr_pool_t *scratch_pool);
5189
5190/**
5191 * Like svn_client_conflict_get_incoming_old_repos_location(), expect this
5192 * function returns the same data for the incoming new version.
5193 *
5194 * The same note about tree conflicts applies.
5195 *
5196 * @since New in 1.10.
5197 */
5198svn_error_t *
5199svn_client_conflict_get_incoming_new_repos_location(
5200  const char **incoming_new_repos_relpath,
5201  svn_revnum_t *incoming_new_regrev,
5202  svn_node_kind_t *incoming_new_node_kind,
5203  svn_client_conflict_t *conflict,
5204  apr_pool_t *result_pool,
5205  apr_pool_t *scratch_pool);
5206
5207/**
5208 * Return the node kind of the tree conflict victim described by @a conflict.
5209 * The victim is the local node in the working copy which was affected by the
5210 * tree conflict at the time the conflict was raised.
5211 *
5212 * @since New in 1.10.
5213 */
5214svn_node_kind_t
5215svn_client_conflict_tree_get_victim_node_kind(svn_client_conflict_t *conflict);
5216
5217/**
5218 * Resolve a tree @a conflict using resolution option @a option.
5219 *
5220 * May raise an error in case the tree conflict cannot be resolved yet, for
5221 * instance @c SVN_ERR_WC_OBSTRUCTED_UPDATE, @c SVN_ERR_WC_FOUND_CONFLICT,
5222 * or @c SVN_ERR_WC_CONFLICT_RESOLVER_FAILUE.
5223 * This may happen when other tree conflicts, or unversioned obstructions,
5224 * block the resolution of this tree conflict. In such a case the other
5225 * conflicts should be resolved first and resolution of this conflict should
5226 * be attempted again later.
5227 *
5228 * @since New in 1.10.
5229 */
5230svn_error_t *
5231svn_client_conflict_tree_resolve(svn_client_conflict_t *conflict,
5232                                 svn_client_conflict_option_t *option,
5233                                 svn_client_ctx_t *ctx,
5234                                 apr_pool_t *scratch_pool);
5235
5236/**
5237 * Like svn_client_conflict_tree_resolve(), except that it identifies
5238 * the desired resolution option by ID @a option_id.
5239 *
5240 * If the provided @a option_id is the ID of an option which resolves
5241 * @a conflict, try to resolve the tree conflict using that option.
5242 * Else, return @c SVN_ERR_CLIENT_CONFLICT_OPTION_NOT_APPLICABLE.
5243 *
5244 * @since New in 1.10.
5245 */
5246svn_error_t *
5247svn_client_conflict_tree_resolve_by_id(
5248  svn_client_conflict_t *conflict,
5249  svn_client_conflict_option_id_t option_id,
5250  svn_client_ctx_t *ctx,
5251  apr_pool_t *scratch_pool);
5252
5253/**
5254 * Return the ID of the option this tree @a conflict has been resolved to.
5255 * If the conflict has not been resolved yet, then return
5256 * @c svn_client_conflict_option_unspecified.
5257 *
5258 * @since New in 1.10.
5259 */
5260svn_client_conflict_option_id_t
5261svn_client_conflict_tree_get_resolution(svn_client_conflict_t *conflict);
5262
5263/**
5264 * Return the path to the legacy property conflicts reject file
5265 * for the property conflicts represented by @a conflict.
5266 *
5267 * This function exists for backwards compatibility only and should not be
5268 * used in new code.
5269 *
5270 * @since New in 1.10.
5271 */
5272const char *
5273svn_client_conflict_prop_get_reject_abspath(svn_client_conflict_t *conflict);
5274
5275/**
5276 * Return the set of property values involved in the conflict of property
5277 * PROPNAME described by @a conflict. If a property value is unavailable the
5278 * corresponding output argument is set to @c NULL.
5279 *
5280 * A 3-way diff of these property values can be generated with
5281 * svn_diff_mem_string_diff3(). A merged version with conflict
5282 * markers can be generated with svn_diff_mem_string_output_merge3().
5283 *
5284 * @since New in 1.10.
5285 */
5286svn_error_t *
5287svn_client_conflict_prop_get_propvals(const svn_string_t **base_propval,
5288                                      const svn_string_t **working_propval,
5289                                      const svn_string_t **incoming_old_propval,
5290                                      const svn_string_t **incoming_new_propval,
5291                                      svn_client_conflict_t *conflict,
5292                                      const char *propname,
5293                                      apr_pool_t *result_pool);
5294
5295/**
5296 * Resolve a property @a conflict in property @a propname using resolution
5297 * option @a option. To resolve all properties to the same option at once,
5298 * set @a propname to the empty string "".
5299 *
5300 * @since New in 1.10.
5301 */
5302svn_error_t *
5303svn_client_conflict_prop_resolve(svn_client_conflict_t *conflict,
5304                                 const char *propname,
5305                                 svn_client_conflict_option_t *option,
5306                                 svn_client_ctx_t *ctx,
5307                                 apr_pool_t *scratch_pool);
5308/**
5309 * If the provided @a option_id is the ID of an option which resolves
5310 * @a conflict, resolve the property conflict in property @a propname
5311 * using that option.
5312 * Else, return @c SVN_ERR_CLIENT_CONFLICT_OPTION_NOT_APPLICABLE.
5313 *
5314 * @since New in 1.10.
5315 */
5316svn_error_t *
5317svn_client_conflict_prop_resolve_by_id(
5318  svn_client_conflict_t *conflict,
5319  const char *propname,
5320  svn_client_conflict_option_id_t option_id,
5321  svn_client_ctx_t *ctx,
5322  apr_pool_t *scratch_pool);
5323
5324/**
5325 * Return the ID of the option this property @a conflict in property
5326 * @a propname has been resolved to.
5327 * If the conflict has not been resolved yet, then return
5328 * @c svn_client_conflict_option_unspecified.
5329 *
5330 * @since New in 1.10.
5331 */
5332svn_client_conflict_option_id_t
5333svn_client_conflict_prop_get_resolution(svn_client_conflict_t *conflict,
5334                                        const char *propname);
5335
5336/**
5337 * Return the MIME-type of the working version of the text-conflicted file
5338 * described by @a conflict.
5339 *
5340 * ### Really needed? What about base/incoming_old/incoming_new values?
5341 * @since: New in 1.10.
5342 */
5343const char *
5344svn_client_conflict_text_get_mime_type(svn_client_conflict_t *conflict);
5345
5346/**
5347 * Return absolute paths to the versions of the text-conflicted file
5348 * described by @a conflict.
5349 *
5350 * If a particular content is not available, it is set to @c NULL.
5351 *
5352 * ### Should this be returning svn_stream_t instead of paths?
5353 * @since: New in 1.10.
5354 */
5355svn_error_t *
5356svn_client_conflict_text_get_contents(const char **base_abspath,
5357                                      const char **working_abspath,
5358                                      const char **incoming_old_abspath,
5359                                      const char **incoming_new_abspath,
5360                                      svn_client_conflict_t *conflict,
5361                                      apr_pool_t *result_pool,
5362                                      apr_pool_t *scratch_pool);
5363
5364/**
5365 * Resolve a text @a conflict using resolution option @a option.
5366 *
5367 * @since New in 1.10.
5368 */
5369svn_error_t *
5370svn_client_conflict_text_resolve(svn_client_conflict_t *conflict,
5371                                 svn_client_conflict_option_t *option,
5372                                 svn_client_ctx_t *ctx,
5373                                 apr_pool_t *scratch_pool);
5374
5375/**
5376 * If the provided @a option_id is the ID of an option which resolves
5377 * @a conflict, resolve the text conflict using that option.
5378 * Else, return @c SVN_ERR_CLIENT_CONFLICT_OPTION_NOT_APPLICABLE.
5379 *
5380 * @since New in 1.10.
5381 */
5382svn_error_t *
5383svn_client_conflict_text_resolve_by_id(
5384  svn_client_conflict_t *conflict,
5385  svn_client_conflict_option_id_t option_id,
5386  svn_client_ctx_t *ctx,
5387  apr_pool_t *scratch_pool);
5388
5389/**
5390 * Return the ID of the option this text @a conflict has been resolved to.
5391 * If the conflict has not been resolved yet, then return
5392 * @c svn_client_conflict_option_unspecified.
5393 *
5394 * @since New in 1.10.
5395 */
5396svn_client_conflict_option_id_t
5397svn_client_conflict_text_get_resolution(svn_client_conflict_t *conflict);
5398
5399/** @} */
5400
5401/**
5402 * @defgroup Resolved Mark conflicted paths as resolved.
5403 *
5404 * @{
5405 */
5406
5407/**
5408 * Similar to svn_client_resolve(), but without automatic conflict
5409 * resolution support.
5410 *
5411 * @deprecated Provided for backward compatibility with the 1.4 API.
5412 * Use svn_client_resolve() with @a conflict_choice == @c
5413 * svn_wc_conflict_choose_merged instead.
5414 */
5415SVN_DEPRECATED
5416svn_error_t *
5417svn_client_resolved(const char *path,
5418                    svn_boolean_t recursive,
5419                    svn_client_ctx_t *ctx,
5420                    apr_pool_t *pool);
5421
5422/** Perform automatic conflict resolution on a working copy @a path.
5423 *
5424 * If @a conflict_choice is
5425 *
5426 *   - #svn_wc_conflict_choose_base:
5427 *     resolve the conflict with the old file contents
5428 *
5429 *   - #svn_wc_conflict_choose_mine_full:
5430 *     use the original working contents
5431 *
5432 *   - #svn_wc_conflict_choose_theirs_full:
5433 *     use the new contents
5434 *
5435 *   - #svn_wc_conflict_choose_merged:
5436 *     don't change the contents at all, just remove the conflict
5437 *     status, which is the pre-1.5 behavior.
5438 *
5439 *   - #svn_wc_conflict_choose_theirs_conflict
5440 *     ###...
5441 *
5442 *   - #svn_wc_conflict_choose_mine_conflict
5443 *     ###...
5444 *
5445 *   - svn_wc_conflict_choose_unspecified
5446 *     invoke @a ctx->conflict_func2 with @a ctx->conflict_baton2 to obtain
5447 *     a resolution decision for each conflict.  This can be used to
5448 *     implement interactive conflict resolution but is NOT RECOMMENDED for
5449 *     new code. To perform conflict resolution based on interactive user
5450 *     input on a per-conflict basis, use svn_client_conflict_text_resolve(),
5451 *     svn_client_conflict_prop_resolve(), and
5452 *     svn_client_conflict_tree_resolve() instead of svn_client_resolve().
5453 *
5454 * #svn_wc_conflict_choose_theirs_conflict and
5455 * #svn_wc_conflict_choose_mine_conflict are not legal for binary
5456 * files or properties.
5457 *
5458 * If @a path is not in a state of conflict to begin with, do nothing.
5459 * If @a path's conflict state is removed and @a ctx->notify_func2 is non-NULL,
5460 * call @a ctx->notify_func2 with @a ctx->notify_baton2 and @a path.
5461 * ### with what notification parameters?
5462 *
5463 * If @a depth is #svn_depth_empty, act only on @a path; if
5464 * #svn_depth_files, resolve @a path and its conflicted file
5465 * children (if any); if #svn_depth_immediates, resolve @a path and
5466 * all its immediate conflicted children (both files and directories,
5467 * if any); if #svn_depth_infinity, resolve @a path and every
5468 * conflicted file or directory anywhere beneath it.
5469 *
5470 * Note that this operation will try to lock the parent directory of
5471 * @a path in order to be able to resolve tree-conflicts on @a path.
5472 *
5473 * @since New in 1.5.
5474 */
5475svn_error_t *
5476svn_client_resolve(const char *path,
5477                   svn_depth_t depth,
5478                   svn_wc_conflict_choice_t conflict_choice,
5479                   svn_client_ctx_t *ctx,
5480                   apr_pool_t *pool);
5481
5482
5483/** @} */
5484
5485/**
5486 * @defgroup Copy Copy paths in the working copy and repository.
5487 *
5488 * @{
5489 */
5490
5491/**
5492 * A structure which describes the source of a copy operation--its path,
5493 * revision, and peg revision.
5494 *
5495 * @since New in 1.5.
5496 */
5497typedef struct svn_client_copy_source_t
5498{
5499    /** The source path or URL. */
5500    const char *path;
5501
5502    /** The source operational revision. */
5503    const svn_opt_revision_t *revision;
5504
5505    /** The source peg revision. */
5506    const svn_opt_revision_t *peg_revision;
5507} svn_client_copy_source_t;
5508
5509/** Copy each source in @a sources to @a dst_path.
5510 *
5511 * If multiple @a sources are given, @a dst_path must be a directory,
5512 * and @a sources will be copied as children of @a dst_path.
5513 *
5514 * @a sources is an array of <tt>svn_client_copy_source_t *</tt> elements,
5515 * either all referring to local WC items or all referring to versioned
5516 * items in the repository.
5517 *
5518 * If @a sources has only one item, attempt to copy it to @a dst_path.  If
5519 * @a copy_as_child is TRUE and @a dst_path already exists, attempt to copy the
5520 * item as a child of @a dst_path.  If @a copy_as_child is FALSE and
5521 * @a dst_path already exists, fail with #SVN_ERR_ENTRY_EXISTS if @a dst_path
5522 * is a working copy path and #SVN_ERR_FS_ALREADY_EXISTS if @a dst_path is a
5523 * URL.
5524 *
5525 * If @a sources has multiple items, and @a copy_as_child is TRUE, all
5526 * @a sources are copied as children of @a dst_path.  If any child of
5527 * @a dst_path already exists with the same name any item in @a sources,
5528 * fail with #SVN_ERR_ENTRY_EXISTS if @a dst_path is a working copy path and
5529 * #SVN_ERR_FS_ALREADY_EXISTS if @a dst_path is a URL.
5530 *
5531 * If @a sources has multiple items, and @a copy_as_child is FALSE, fail
5532 * with #SVN_ERR_CLIENT_MULTIPLE_SOURCES_DISALLOWED.
5533 *
5534 * If @a dst_path is a URL, use the authentication baton
5535 * in @a ctx and @a ctx->log_msg_func3/@a ctx->log_msg_baton3 to immediately
5536 * attempt to commit the copy action in the repository.
5537 *
5538 * If @a dst_path is not a URL, then this is just a variant of
5539 * svn_client_add(), where the @a sources are scheduled for addition
5540 * as copies.  No changes will happen to the repository until a commit occurs.
5541 * This scheduling can be removed with svn_client_revert2().
5542 *
5543 * If @a make_parents is TRUE, create any non-existent parent directories
5544 * also.  Otherwise the parent of @a dst_path must already exist.
5545 *
5546 * If @a ignore_externals is set, don't process externals definitions
5547 * as part of this operation.
5548 *
5549 * If @a metadata_only is @c TRUE and copying a file in a working copy,
5550 * everything in the metadata is updated as if the node is moved, but the
5551 * actual disk copy operation is not performed. This feature is useful for
5552 * clients that want to keep the working copy in sync while the actual working
5553 * copy is updated by some other task.
5554 *
5555 * If @a pin_externals is set, pin URLs in copied externals definitions
5556 * to their current revision unless they were already pinned to a
5557 * particular revision. A pinned external uses a URL which points at a
5558 * fixed revision, rather than the HEAD revision. Externals in the copy
5559 * destination are pinned to either a working copy base revision or the
5560 * HEAD revision of a repository (as of the time the copy operation is
5561 * performed), depending on the type of the copy source:
5562 <pre>
5563    copy source: working copy (WC)       REPOS
5564   ------------+------------------------+---------------------------+
5565    copy    WC | external's WC BASE rev | external's repos HEAD rev |
5566    dest:      |------------------------+---------------------------+
5567         REPOS | external's WC BASE rev | external's repos HEAD rev |
5568   ------------+------------------------+---------------------------+
5569 </pre>
5570 * If the copy source is a working copy, then all externals must be checked
5571 * out, be at a single-revision, contain no local modifications, and contain
5572 * no switched subtrees. Else, #SVN_ERR_WC_PATH_UNEXPECTED_STATUS is returned.
5573 *
5574 * If non-NULL, @a externals_to_pin restricts pinning to a subset of externals.
5575 * It is a hash table keyed by either a local absolute path or a URL at which
5576 * an svn:externals property is set. The hash table contains apr_array_header_t*
5577 * elements as returned by svn_wc_parse_externals_description3(). These arrays
5578 * contain elements of type svn_wc_external_item2_t*, each of which corresponds
5579 * to a single line of an svn:externals definition. Externals corresponding to
5580 * these items will be pinned, other externals will not be pinned.
5581 * If @a externals_to_pin is @c NULL then all externals are pinned.
5582 * If @a pin_externals is @c FALSE then @a externals_to_pin is ignored.
5583 *
5584 * If non-NULL, @a revprop_table is a hash table holding additional,
5585 * custom revision properties (<tt>const char *</tt> names mapped to
5586 * <tt>svn_string_t *</tt> values) to be set on the new revision in
5587 * the event that this is a committing operation.  This table cannot
5588 * contain any standard Subversion properties.
5589 *
5590 * @a ctx->log_msg_func3/@a ctx->log_msg_baton3 are a callback/baton combo
5591 * that this function can use to query for a commit log message when one is
5592 * needed.
5593 *
5594 * If @a ctx->notify_func2 is non-NULL, invoke it with @a ctx->notify_baton2
5595 * for each item added at the new location, passing the new, relative path of
5596 * the added item.
5597 *
5598 * If @a commit_callback is non-NULL, then for each successful commit, call
5599 * @a commit_callback with @a commit_baton and a #svn_commit_info_t for
5600 * the commit.
5601 *
5602 * @since New in 1.9.
5603 */
5604svn_error_t *
5605svn_client_copy7(const apr_array_header_t *sources,
5606                 const char *dst_path,
5607                 svn_boolean_t copy_as_child,
5608                 svn_boolean_t make_parents,
5609                 svn_boolean_t ignore_externals,
5610                 svn_boolean_t metadata_only,
5611                 svn_boolean_t pin_externals,
5612                 const apr_hash_t *externals_to_pin,
5613                 const apr_hash_t *revprop_table,
5614                 svn_commit_callback2_t commit_callback,
5615                 void *commit_baton,
5616                 svn_client_ctx_t *ctx,
5617                 apr_pool_t *pool);
5618
5619/**
5620 * Similar to svn_client_copy7(), but doesn't support meta_data_only
5621 * and cannot pin externals.
5622 *
5623 *
5624 * @since New in 1.7.
5625 * @deprecated Provided for backward compatibility with the 1.8 API.
5626 */
5627SVN_DEPRECATED
5628svn_error_t *
5629svn_client_copy6(const apr_array_header_t *sources,
5630                 const char *dst_path,
5631                 svn_boolean_t copy_as_child,
5632                 svn_boolean_t make_parents,
5633                 svn_boolean_t ignore_externals,
5634                 const apr_hash_t *revprop_table,
5635                 svn_commit_callback2_t commit_callback,
5636                 void *commit_baton,
5637                 svn_client_ctx_t *ctx,
5638                 apr_pool_t *pool);
5639
5640/**
5641 * Similar to svn_client_copy6(), but returns the commit info in
5642 * @a *commit_info_p rather than through a callback function.
5643 *
5644 * @since New in 1.6.
5645 * @deprecated Provided for backward compatibility with the 1.6 API.
5646 */
5647SVN_DEPRECATED
5648svn_error_t *
5649svn_client_copy5(svn_commit_info_t **commit_info_p,
5650                 const apr_array_header_t *sources,
5651                 const char *dst_path,
5652                 svn_boolean_t copy_as_child,
5653                 svn_boolean_t make_parents,
5654                 svn_boolean_t ignore_externals,
5655                 const apr_hash_t *revprop_table,
5656                 svn_client_ctx_t *ctx,
5657                 apr_pool_t *pool);
5658
5659/**
5660 * Similar to svn_client_copy5(), with @a ignore_externals set to @c FALSE.
5661 *
5662 * @since New in 1.5.
5663 *
5664 * @deprecated Provided for backward compatibility with the 1.5 API.
5665 */
5666SVN_DEPRECATED
5667svn_error_t *
5668svn_client_copy4(svn_commit_info_t **commit_info_p,
5669                 const apr_array_header_t *sources,
5670                 const char *dst_path,
5671                 svn_boolean_t copy_as_child,
5672                 svn_boolean_t make_parents,
5673                 const apr_hash_t *revprop_table,
5674                 svn_client_ctx_t *ctx,
5675                 apr_pool_t *pool);
5676
5677/**
5678 * Similar to svn_client_copy4(), with only one @a src_path, @a
5679 * copy_as_child set to @c FALSE, @a revprop_table passed as NULL, and
5680 * @a make_parents set to @c FALSE.  Also, use @a src_revision as both
5681 * the operational and peg revision.
5682 *
5683 * @since New in 1.4.
5684 *
5685 * @deprecated Provided for backward compatibility with the 1.4 API.
5686 */
5687SVN_DEPRECATED
5688svn_error_t *
5689svn_client_copy3(svn_commit_info_t **commit_info_p,
5690                 const char *src_path,
5691                 const svn_opt_revision_t *src_revision,
5692                 const char *dst_path,
5693                 svn_client_ctx_t *ctx,
5694                 apr_pool_t *pool);
5695
5696
5697/**
5698 * Similar to svn_client_copy3(), with the difference that if @a dst_path
5699 * already exists and is a directory, copy the item into that directory,
5700 * keeping its name (the last component of @a src_path).
5701 *
5702 * @since New in 1.3.
5703 *
5704 * @deprecated Provided for backward compatibility with the 1.3 API.
5705 */
5706SVN_DEPRECATED
5707svn_error_t *
5708svn_client_copy2(svn_commit_info_t **commit_info_p,
5709                 const char *src_path,
5710                 const svn_opt_revision_t *src_revision,
5711                 const char *dst_path,
5712                 svn_client_ctx_t *ctx,
5713                 apr_pool_t *pool);
5714
5715
5716/**
5717 * Similar to svn_client_copy2(), but uses #svn_client_commit_info_t
5718 * for @a commit_info_p.
5719 *
5720 * @deprecated Provided for backward compatibility with the 1.2 API.
5721 */
5722SVN_DEPRECATED
5723svn_error_t *
5724svn_client_copy(svn_client_commit_info_t **commit_info_p,
5725                const char *src_path,
5726                const svn_opt_revision_t *src_revision,
5727                const char *dst_path,
5728                svn_client_ctx_t *ctx,
5729                apr_pool_t *pool);
5730
5731
5732/** @} */
5733
5734/**
5735 * @defgroup Move Move paths in the working copy or repository.
5736 *
5737 * @{
5738 */
5739
5740/**
5741 * Move @a src_paths to @a dst_path.
5742 *
5743 * @a src_paths is an array of (const char *) paths -- either all WC paths
5744 * or all URLs -- of versioned items.  If multiple @a src_paths are given,
5745 * @a dst_path must be a directory and @a src_paths will be moved as
5746 * children of @a dst_path.
5747 *
5748 * If @a src_paths are repository URLs:
5749 *
5750 *   - @a dst_path must also be a repository URL.
5751 *
5752 *   - The authentication baton in @a ctx and @a ctx->log_msg_func/@a
5753 *     ctx->log_msg_baton are used to commit the move.
5754 *
5755 *   - The move operation will be immediately committed.
5756 *
5757 * If @a src_paths are working copy paths:
5758 *
5759 *   - @a dst_path must also be a working copy path.
5760 *
5761 *   - @a ctx->log_msg_func3 and @a ctx->log_msg_baton3 are ignored.
5762 *
5763 *   - This is a scheduling operation.  No changes will happen to the
5764 *     repository until a commit occurs.  This scheduling can be removed
5765 *     with svn_client_revert2().  If one of @a src_paths is a file it is
5766 *     removed from the working copy immediately.  If one of @a src_path
5767 *     is a directory it will remain in the working copy but all the files,
5768 *     and unversioned items, it contains will be removed.
5769 *
5770 * If @a src_paths has only one item, attempt to move it to @a dst_path.  If
5771 * @a move_as_child is TRUE and @a dst_path already exists, attempt to move the
5772 * item as a child of @a dst_path.  If @a move_as_child is FALSE and
5773 * @a dst_path already exists, fail with #SVN_ERR_ENTRY_EXISTS if @a dst_path
5774 * is a working copy path and #SVN_ERR_FS_ALREADY_EXISTS if @a dst_path is a
5775 * URL.
5776 *
5777 * If @a src_paths has multiple items, and @a move_as_child is TRUE, all
5778 * @a src_paths are moved as children of @a dst_path.  If any child of
5779 * @a dst_path already exists with the same name any item in @a src_paths,
5780 * fail with #SVN_ERR_ENTRY_EXISTS if @a dst_path is a working copy path and
5781 * #SVN_ERR_FS_ALREADY_EXISTS if @a dst_path is a URL.
5782 *
5783 * If @a src_paths has multiple items, and @a move_as_child is FALSE, fail
5784 * with #SVN_ERR_CLIENT_MULTIPLE_SOURCES_DISALLOWED.
5785 *
5786 * If @a make_parents is TRUE, create any non-existent parent directories
5787 * also.  Otherwise, the parent of @a dst_path must already exist.
5788 *
5789 * If @a allow_mixed_revisions is @c FALSE, #SVN_ERR_WC_MIXED_REVISIONS
5790 * will be raised if the move source is a mixed-revision subtree.
5791 * If @a allow_mixed_revisions is TRUE, a mixed-revision move source is
5792 * allowed but the move will degrade to a copy and a delete without local
5793 * move tracking. This parameter should be set to FALSE except where backwards
5794 * compatibility to svn_client_move6() is required.
5795 *
5796 * If @a metadata_only is @c TRUE and moving a file in a working copy,
5797 * everything in the metadata is updated as if the node is moved, but the
5798 * actual disk move operation is not performed. This feature is useful for
5799 * clients that want to keep the working copy in sync while the actual working
5800 * copy is updated by some other task.
5801 *
5802 * If non-NULL, @a revprop_table is a hash table holding additional,
5803 * custom revision properties (<tt>const char *</tt> names mapped to
5804 * <tt>svn_string_t *</tt> values) to be set on the new revision in
5805 * the event that this is a committing operation.  This table cannot
5806 * contain any standard Subversion properties.
5807 *
5808 * @a ctx->log_msg_func3/@a ctx->log_msg_baton3 are a callback/baton combo that
5809 * this function can use to query for a commit log message when one is needed.
5810 *
5811 * If @a ctx->notify_func2 is non-NULL, then for each item moved, call
5812 * @a ctx->notify_func2 with the @a ctx->notify_baton2 twice, once to indicate
5813 * the deletion of the moved thing, and once to indicate the addition of
5814 * the new location of the thing.
5815 *
5816 * ### Is this really true?  What about svn_wc_notify_commit_replaced()? ###
5817 *
5818 * If @a commit_callback is non-NULL, then for each successful commit, call
5819 * @a commit_callback with @a commit_baton and a #svn_commit_info_t for
5820 * the commit.
5821 *
5822 * @since New in 1.8.
5823 */
5824svn_error_t *
5825svn_client_move7(const apr_array_header_t *src_paths,
5826                 const char *dst_path,
5827                 svn_boolean_t move_as_child,
5828                 svn_boolean_t make_parents,
5829                 svn_boolean_t allow_mixed_revisions,
5830                 svn_boolean_t metadata_only,
5831                 const apr_hash_t *revprop_table,
5832                 svn_commit_callback2_t commit_callback,
5833                 void *commit_baton,
5834                 svn_client_ctx_t *ctx,
5835                 apr_pool_t *pool);
5836
5837/**
5838 * Similar to svn_client_move7(), but with @a allow_mixed_revisions always
5839 * set to @c TRUE and @a metadata_only always to @c FALSE.
5840 *
5841 * @since New in 1.7.
5842 * @deprecated Provided for backward compatibility with the 1.7 API.
5843 */
5844SVN_DEPRECATED
5845svn_error_t *
5846svn_client_move6(const apr_array_header_t *src_paths,
5847                 const char *dst_path,
5848                 svn_boolean_t move_as_child,
5849                 svn_boolean_t make_parents,
5850                 const apr_hash_t *revprop_table,
5851                 svn_commit_callback2_t commit_callback,
5852                 void *commit_baton,
5853                 svn_client_ctx_t *ctx,
5854                 apr_pool_t *pool);
5855
5856/**
5857 * Similar to svn_client_move6(), but returns the commit info in
5858 * @a *commit_info_p rather than through a callback function.
5859 *
5860 * A WC-to-WC move will include any modified and/or unversioned children.
5861 * @a force is ignored.
5862 *
5863 * @since New in 1.5.
5864 * @deprecated Provided for backward compatibility with the 1.6 API.
5865 */
5866SVN_DEPRECATED
5867svn_error_t *
5868svn_client_move5(svn_commit_info_t **commit_info_p,
5869                 const apr_array_header_t *src_paths,
5870                 const char *dst_path,
5871                 svn_boolean_t force,
5872                 svn_boolean_t move_as_child,
5873                 svn_boolean_t make_parents,
5874                 const apr_hash_t *revprop_table,
5875                 svn_client_ctx_t *ctx,
5876                 apr_pool_t *pool);
5877
5878/**
5879 * Similar to svn_client_move5(), with only one @a src_path, @a
5880 * move_as_child set to @c FALSE, @a revprop_table passed as NULL, and
5881 * @a make_parents set to @c FALSE.
5882 *
5883 * Note: The behaviour of @a force changed in 1.5 (r860885 and r861421), when
5884 * the 'move' semantics were improved to just move the source including any
5885 * modified and/or unversioned items in it.  Before that, @a force
5886 * controlled what happened to such items, but now @a force is ignored.
5887 *
5888 * @since New in 1.4.
5889 *
5890 * @deprecated Provided for backward compatibility with the 1.4 API.
5891 */
5892SVN_DEPRECATED
5893svn_error_t *
5894svn_client_move4(svn_commit_info_t **commit_info_p,
5895                 const char *src_path,
5896                 const char *dst_path,
5897                 svn_boolean_t force,
5898                 svn_client_ctx_t *ctx,
5899                 apr_pool_t *pool);
5900
5901/**
5902 * Similar to svn_client_move4(), with the difference that if @a dst_path
5903 * already exists and is a directory, move the item into that directory,
5904 * keeping its name (the last component of @a src_path).
5905 *
5906 * @since New in 1.3.
5907 *
5908 * @deprecated Provided for backward compatibility with the 1.3 API.
5909 */
5910SVN_DEPRECATED
5911svn_error_t *
5912svn_client_move3(svn_commit_info_t **commit_info_p,
5913                 const char *src_path,
5914                 const char *dst_path,
5915                 svn_boolean_t force,
5916                 svn_client_ctx_t *ctx,
5917                 apr_pool_t *pool);
5918
5919/**
5920 * Similar to svn_client_move3(), but uses #svn_client_commit_info_t
5921 * for @a commit_info_p.
5922 *
5923 * @deprecated Provided for backward compatibility with the 1.2 API.
5924 *
5925 * @since New in 1.2.
5926 */
5927SVN_DEPRECATED
5928svn_error_t *
5929svn_client_move2(svn_client_commit_info_t **commit_info_p,
5930                 const char *src_path,
5931                 const char *dst_path,
5932                 svn_boolean_t force,
5933                 svn_client_ctx_t *ctx,
5934                 apr_pool_t *pool);
5935
5936/**
5937 * Similar to svn_client_move2(), but an extra argument @a src_revision
5938 * must be passed.  This has no effect, but must be of kind
5939 * #svn_opt_revision_unspecified or #svn_opt_revision_head,
5940 * otherwise error #SVN_ERR_UNSUPPORTED_FEATURE is returned.
5941 *
5942 * @deprecated Provided for backward compatibility with the 1.1 API.
5943 */
5944SVN_DEPRECATED
5945svn_error_t *
5946svn_client_move(svn_client_commit_info_t **commit_info_p,
5947                const char *src_path,
5948                const svn_opt_revision_t *src_revision,
5949                const char *dst_path,
5950                svn_boolean_t force,
5951                svn_client_ctx_t *ctx,
5952                apr_pool_t *pool);
5953
5954/** @} */
5955
5956
5957/** Properties
5958 *
5959 * Note that certain svn-controlled properties must always have their
5960 * values set and stored in UTF8 with LF line endings.  When
5961 * retrieving these properties, callers must convert the values back
5962 * to native locale and native line-endings before displaying them to
5963 * the user.  For help with this task, see
5964 * svn_prop_needs_translation(), svn_subst_translate_string(),  and
5965 * svn_subst_detranslate_string().
5966 *
5967 * @defgroup svn_client_prop_funcs Property functions
5968 * @{
5969 */
5970
5971
5972/**
5973 * Set @a propname to @a propval on @a url.  A @a propval of @c NULL will
5974 * delete the property.
5975 *
5976 * Immediately attempt to commit the property change in the repository,
5977 * using the authentication baton in @a ctx and @a
5978 * ctx->log_msg_func3/@a ctx->log_msg_baton3.
5979 *
5980 * If the property has changed on @a url since revision
5981 * @a base_revision_for_url (which must not be #SVN_INVALID_REVNUM), no
5982 * change will be made and an error will be returned.
5983 *
5984 * If non-NULL, @a revprop_table is a hash table holding additional,
5985 * custom revision properties (<tt>const char *</tt> names mapped to
5986 * <tt>svn_string_t *</tt> values) to be set on the new revision.  This
5987 * table cannot contain any standard Subversion properties.
5988 *
5989 * If @a commit_callback is non-NULL, then call @a commit_callback with
5990 * @a commit_baton and a #svn_commit_info_t for the commit.
5991 *
5992 * If @a propname is an svn-controlled property (i.e. prefixed with
5993 * #SVN_PROP_PREFIX), then the caller is responsible for ensuring that
5994 * the value is UTF8-encoded and uses LF line-endings.
5995 *
5996 * If @a skip_checks is TRUE, do no validity checking.  But if @a
5997 * skip_checks is FALSE, and @a propname is not a valid property for @a
5998 * url, return an error, either #SVN_ERR_ILLEGAL_TARGET (if the property is
5999 * not appropriate for @a url), or * #SVN_ERR_BAD_MIME_TYPE (if @a propname
6000 * is "svn:mime-type", but @a propval is not a valid mime-type).
6001 *
6002 * Use @a scratch_pool for all memory allocation.
6003 *
6004 * @since New in 1.7.
6005 */
6006svn_error_t *
6007svn_client_propset_remote(const char *propname,
6008                          const svn_string_t *propval,
6009                          const char *url,
6010                          svn_boolean_t skip_checks,
6011                          svn_revnum_t base_revision_for_url,
6012                          const apr_hash_t *revprop_table,
6013                          svn_commit_callback2_t commit_callback,
6014                          void *commit_baton,
6015                          svn_client_ctx_t *ctx,
6016                          apr_pool_t *scratch_pool);
6017
6018/**
6019 * Set @a propname to @a propval on each (const char *) target in @a
6020 * targets.  The targets must be all working copy paths.  A @a propval
6021 * of @c NULL will delete the property.
6022 *
6023 * If @a depth is #svn_depth_empty, set the property on each member of
6024 * @a targets only; if #svn_depth_files, set it on @a targets and their
6025 * file children (if any); if #svn_depth_immediates, on @a targets and all
6026 * of their immediate children (both files and directories); if
6027 * #svn_depth_infinity, on @a targets and everything beneath them.
6028 *
6029 * @a changelists is an array of <tt>const char *</tt> changelist
6030 * names, used as a restrictive filter on items whose properties are
6031 * set; that is, don't set properties on any item unless it's a member
6032 * of one of those changelists.  If @a changelists is empty (or
6033 * altogether @c NULL), no changelist filtering occurs.
6034 *
6035 * If @a propname is an svn-controlled property (i.e. prefixed with
6036 * #SVN_PROP_PREFIX), then the caller is responsible for ensuring that
6037 * the value is UTF8-encoded and uses LF line-endings.
6038 *
6039 * If @a skip_checks is TRUE, do no validity checking.  But if @a
6040 * skip_checks is FALSE, and @a propname is not a valid property for @a
6041 * targets, return an error, either #SVN_ERR_ILLEGAL_TARGET (if the
6042 * property is not appropriate for @a targets), or
6043 * #SVN_ERR_BAD_MIME_TYPE (if @a propname is "svn:mime-type", but @a
6044 * propval is not a valid mime-type).
6045 *
6046 * If @a ctx->cancel_func is non-NULL, invoke it passing @a
6047 * ctx->cancel_baton at various places during the operation.
6048 *
6049 * Use @a scratch_pool for all memory allocation.
6050 *
6051 * @since New in 1.7.
6052 */
6053svn_error_t *
6054svn_client_propset_local(const char *propname,
6055                         const svn_string_t *propval,
6056                         const apr_array_header_t *targets,
6057                         svn_depth_t depth,
6058                         svn_boolean_t skip_checks,
6059                         const apr_array_header_t *changelists,
6060                         svn_client_ctx_t *ctx,
6061                         apr_pool_t *scratch_pool);
6062
6063/**
6064 * An amalgamation of svn_client_propset_local() and
6065 * svn_client_propset_remote() that takes only a single target, and
6066 * returns the commit info in @a *commit_info_p rather than through a
6067 * callback function.
6068 *
6069 * @since New in 1.5.
6070 * @deprecated Provided for backward compatibility with the 1.6 API.
6071 */
6072SVN_DEPRECATED
6073svn_error_t *
6074svn_client_propset3(svn_commit_info_t **commit_info_p,
6075                    const char *propname,
6076                    const svn_string_t *propval,
6077                    const char *target,
6078                    svn_depth_t depth,
6079                    svn_boolean_t skip_checks,
6080                    svn_revnum_t base_revision_for_url,
6081                    const apr_array_header_t *changelists,
6082                    const apr_hash_t *revprop_table,
6083                    svn_client_ctx_t *ctx,
6084                    apr_pool_t *pool);
6085
6086/**
6087 * Like svn_client_propset3(), but with @a base_revision_for_url
6088 * always #SVN_INVALID_REVNUM; @a commit_info_p always @c NULL; @a
6089 * changelists always @c NULL; @a revprop_table always @c NULL; and @a
6090 * depth set according to @a recurse: if @a recurse is TRUE, @a depth
6091 * is #svn_depth_infinity, else #svn_depth_empty.
6092 *
6093 * @deprecated Provided for backward compatibility with the 1.4 API.
6094 */
6095SVN_DEPRECATED
6096svn_error_t *
6097svn_client_propset2(const char *propname,
6098                    const svn_string_t *propval,
6099                    const char *target,
6100                    svn_boolean_t recurse,
6101                    svn_boolean_t skip_checks,
6102                    svn_client_ctx_t *ctx,
6103                    apr_pool_t *pool);
6104
6105/**
6106 * Like svn_client_propset2(), but with @a skip_checks always FALSE and a
6107 * newly created @a ctx.
6108 *
6109 * @deprecated Provided for backward compatibility with the 1.1 API.
6110 */
6111SVN_DEPRECATED
6112svn_error_t *
6113svn_client_propset(const char *propname,
6114                   const svn_string_t *propval,
6115                   const char *target,
6116                   svn_boolean_t recurse,
6117                   apr_pool_t *pool);
6118
6119/** Set @a propname to @a propval on revision @a revision in the repository
6120 * represented by @a URL.  Use the authentication baton in @a ctx for
6121 * authentication, and @a pool for all memory allocation.  Return the actual
6122 * rev affected in @a *set_rev.  A @a propval of @c NULL will delete the
6123 * property.
6124 *
6125 * If @a original_propval is non-NULL, then just before setting the
6126 * new value, check that the old value matches @a original_propval;
6127 * if they do not match, return the error #SVN_ERR_RA_OUT_OF_DATE.
6128 * This is to help clients support interactive editing of revprops:
6129 * without this check, the window during which the property may change
6130 * underneath the user is as wide as the amount of time the user
6131 * spends editing the property.  With this check, the window is
6132 * reduced to a small, constant amount of time right before we set the
6133 * new value.  (To check that an old value is still non-existent, set
6134 * @a original_propval->data to NULL, and @a original_propval->len is
6135 * ignored.)
6136 * If the server advertises #SVN_RA_CAPABILITY_ATOMIC_REVPROPS, the
6137 * check of @a original_propval is done atomically.
6138 *
6139 * Note: the representation of "property is not set" in @a
6140 * original_propval differs from the representation in other APIs
6141 * (such as svn_fs_change_rev_prop2() and svn_ra_change_rev_prop2()).
6142 *
6143 * If @a force is TRUE, allow newlines in the author property.
6144 *
6145 * If @a propname is an svn-controlled property (i.e. prefixed with
6146 * #SVN_PROP_PREFIX), then the caller is responsible for ensuring that
6147 * the value UTF8-encoded and uses LF line-endings.
6148 *
6149 * Note that unlike its cousin svn_client_propset3(), this routine
6150 * doesn't affect the working copy at all;  it's a pure network
6151 * operation that changes an *unversioned* property attached to a
6152 * revision.  This can be used to tweak log messages, dates, authors,
6153 * and the like.  Be careful:  it's a lossy operation.
6154
6155 * @a ctx->notify_func2 and @a ctx->notify_baton2 are the notification
6156 * functions and baton which are called upon successful setting of the
6157 * property.
6158 *
6159 * Also note that unless the administrator creates a
6160 * pre-revprop-change hook in the repository, this feature will fail.
6161 *
6162 * @since New in 1.6.
6163 */
6164svn_error_t *
6165svn_client_revprop_set2(const char *propname,
6166                        const svn_string_t *propval,
6167                        const svn_string_t *original_propval,
6168                        const char *URL,
6169                        const svn_opt_revision_t *revision,
6170                        svn_revnum_t *set_rev,
6171                        svn_boolean_t force,
6172                        svn_client_ctx_t *ctx,
6173                        apr_pool_t *pool);
6174
6175/**
6176 * Similar to svn_client_revprop_set2(), but with @a original_propval
6177 * always @c NULL.
6178 *
6179 * @deprecated Provided for backward compatibility with the 1.5 API.
6180 */
6181SVN_DEPRECATED
6182svn_error_t *
6183svn_client_revprop_set(const char *propname,
6184                       const svn_string_t *propval,
6185                       const char *URL,
6186                       const svn_opt_revision_t *revision,
6187                       svn_revnum_t *set_rev,
6188                       svn_boolean_t force,
6189                       svn_client_ctx_t *ctx,
6190                       apr_pool_t *pool);
6191
6192/**
6193 * Set @a *props to a hash table whose keys are absolute paths or URLs
6194 * of items on which property @a propname is explicitly set, and whose
6195 * values are <tt>svn_string_t *</tt> representing the property value for
6196 * @a propname at that path.
6197 *
6198 * If @a inherited_props is not @c NULL, then set @a *inherited_props to a
6199 * depth-first ordered array of #svn_prop_inherited_item_t * structures
6200 * representing the properties inherited by @a target.  If @a target is a
6201 * working copy path, then properties inherited by @a target as far as the
6202 * root of the working copy are obtained from the working copy's actual
6203 * property values.  Properties inherited from above the working copy root
6204 * come from the inherited properties cache.  If @a target is a URL, then
6205 * the inherited properties come from the repository.  If @a inherited_props
6206 * is not @c NULL and no inheritable properties are found, then set
6207 * @a *inherited_props to an empty array.
6208 *
6209 * The #svn_prop_inherited_item_t->path_or_url members of the
6210 * #svn_prop_inherited_item_t * structures in @a *inherited_props are
6211 * URLs if @a target is a URL or if @a target is a working copy path but the
6212 * property represented by the structure is above the working copy root (i.e.
6213 * the inherited property is from the cache).  In all other cases the
6214 * #svn_prop_inherited_item_t->path_or_url members are absolute working copy
6215 * paths.
6216 *
6217 * Allocate @a *props (including keys and values) and @a *inherited_props
6218 * (including its elements) in @a result_pool, use @a scratch_pool for
6219 * temporary allocations.
6220 *
6221 * @a target is a WC absolute path or a URL.
6222 *
6223 * Don't store any path, not even @a target, if it does not have a
6224 * property named @a propname.
6225 *
6226 * If @a revision->kind is #svn_opt_revision_unspecified, then: get
6227 * properties from the working copy if @a target is a working copy
6228 * path, or from the repository head if @a target is a URL.  Else get
6229 * the properties as of @a revision.  The actual node revision
6230 * selected is determined by the path as it exists in @a peg_revision.
6231 * If @a peg_revision->kind is #svn_opt_revision_unspecified, then
6232 * it defaults to #svn_opt_revision_head for URLs or
6233 * #svn_opt_revision_working for WC targets.  Use the authentication
6234 * baton in @a ctx for authentication if contacting the repository.
6235 * If @a actual_revnum is not @c NULL, the actual revision number used
6236 * for the fetch is stored in @a *actual_revnum.
6237 *
6238 * If @a depth is #svn_depth_empty, fetch the property from
6239 * @a target only; if #svn_depth_files, fetch from @a target and its
6240 * file children (if any); if #svn_depth_immediates, from @a target
6241 * and all of its immediate children (both files and directories); if
6242 * #svn_depth_infinity, from @a target and everything beneath it.
6243 *
6244 * @a changelists is an array of <tt>const char *</tt> changelist
6245 * names, used as a restrictive filter on items whose properties are
6246 * gotten; that is, don't get @a propname on any item unless it's a member
6247 * of one of those changelists.  If @a changelists is empty (or
6248 * altogether @c NULL), no changelist filtering occurs.
6249 *
6250 * If error, don't touch @a *props, otherwise @a *props is a hash table
6251 * even if empty.
6252 *
6253 * This function returns SVN_ERR_UNVERSIONED_RESOURCE when it is called on
6254 * unversioned nodes.
6255 *
6256 * @since New in 1.8.
6257 */
6258svn_error_t *
6259svn_client_propget5(apr_hash_t **props,
6260                    apr_array_header_t **inherited_props,
6261                    const char *propname,
6262                    const char *target,  /* abspath or URL */
6263                    const svn_opt_revision_t *peg_revision,
6264                    const svn_opt_revision_t *revision,
6265                    svn_revnum_t *actual_revnum,
6266                    svn_depth_t depth,
6267                    const apr_array_header_t *changelists,
6268                    svn_client_ctx_t *ctx,
6269                    apr_pool_t *result_pool,
6270                    apr_pool_t *scratch_pool);
6271
6272/**
6273 * Similar to svn_client_propget5 but with @a inherited_props always
6274 * passed as NULL.
6275 *
6276 * @since New in 1.7.
6277 * @deprecated Provided for backward compatibility with the 1.7 API.
6278 */
6279SVN_DEPRECATED
6280svn_error_t *
6281svn_client_propget4(apr_hash_t **props,
6282                    const char *propname,
6283                    const char *target,  /* abspath or URL */
6284                    const svn_opt_revision_t *peg_revision,
6285                    const svn_opt_revision_t *revision,
6286                    svn_revnum_t *actual_revnum,
6287                    svn_depth_t depth,
6288                    const apr_array_header_t *changelists,
6289                    svn_client_ctx_t *ctx,
6290                    apr_pool_t *result_pool,
6291                    apr_pool_t *scratch_pool);
6292
6293/**
6294 * Similar to svn_client_propget4(), but with the following change to the
6295 * output hash keys:  keys are `<tt>char *</tt>' paths, prefixed by
6296 * @a target, which is a working copy path or a URL.
6297 *
6298 * This function returns SVN_ERR_ENTRY_NOT_FOUND where svn_client_propget4
6299 * would return SVN_ERR_UNVERSIONED_RESOURCE.
6300 *
6301 * @since New in 1.5.
6302 * @deprecated Provided for backward compatibility with the 1.6 API.
6303 */
6304SVN_DEPRECATED
6305svn_error_t *
6306svn_client_propget3(apr_hash_t **props,
6307                    const char *propname,
6308                    const char *target,
6309                    const svn_opt_revision_t *peg_revision,
6310                    const svn_opt_revision_t *revision,
6311                    svn_revnum_t *actual_revnum,
6312                    svn_depth_t depth,
6313                    const apr_array_header_t *changelists,
6314                    svn_client_ctx_t *ctx,
6315                    apr_pool_t *pool);
6316
6317/**
6318 * Similar to svn_client_propget3(), except that @a actual_revnum and
6319 * @a changelists are always @c NULL, and @a depth is set according to
6320 * @a recurse: if @a recurse is TRUE, then @a depth is
6321 * #svn_depth_infinity, else #svn_depth_empty.
6322 *
6323 * @deprecated Provided for backward compatibility with the 1.4 API.
6324 */
6325SVN_DEPRECATED
6326svn_error_t *
6327svn_client_propget2(apr_hash_t **props,
6328                    const char *propname,
6329                    const char *target,
6330                    const svn_opt_revision_t *peg_revision,
6331                    const svn_opt_revision_t *revision,
6332                    svn_boolean_t recurse,
6333                    svn_client_ctx_t *ctx,
6334                    apr_pool_t *pool);
6335
6336/**
6337 * Similar to svn_client_propget2(), except that @a peg_revision is
6338 * always the same as @a revision.
6339 *
6340 * @deprecated Provided for backward compatibility with the 1.1 API.
6341 */
6342SVN_DEPRECATED
6343svn_error_t *
6344svn_client_propget(apr_hash_t **props,
6345                   const char *propname,
6346                   const char *target,
6347                   const svn_opt_revision_t *revision,
6348                   svn_boolean_t recurse,
6349                   svn_client_ctx_t *ctx,
6350                   apr_pool_t *pool);
6351
6352/** Set @a *propval to the value of @a propname on revision @a revision
6353 * in the repository represented by @a URL.  Use the authentication baton
6354 * in @a ctx for authentication, and @a pool for all memory allocation.
6355 * Return the actual rev queried in @a *set_rev.
6356 *
6357 * If @a propname does not exist on @a revision, set @a *propval to @c NULL.
6358 *
6359 * Note that unlike its cousin svn_client_propget(), this routine
6360 * doesn't affect the working copy at all; it's a pure network
6361 * operation that queries an *unversioned* property attached to a
6362 * revision.  This can query log messages, dates, authors, and the
6363 * like.
6364 */
6365svn_error_t *
6366svn_client_revprop_get(const char *propname,
6367                       svn_string_t **propval,
6368                       const char *URL,
6369                       const svn_opt_revision_t *revision,
6370                       svn_revnum_t *set_rev,
6371                       svn_client_ctx_t *ctx,
6372                       apr_pool_t *pool);
6373
6374/**
6375 * Invoke @a receiver with @a receiver_baton to return the regular explicit, and
6376 * possibly the inherited, properties of @a target, a URL or working copy path.
6377 * @a receiver will be called for each path encountered.
6378 *
6379 * @a target is a WC path or a URL.
6380 *
6381 * If @a revision->kind is #svn_opt_revision_unspecified, then get the
6382 * explicit (and possibly the inherited) properties from the working copy,
6383 * if @a target is a working copy path, or from the repository head if
6384 * @a target is a URL.  Else get the properties as of @a revision.
6385 * The actual node revision selected is determined by the path as it exists
6386 * in @a peg_revision.  If @a peg_revision->kind is
6387 * #svn_opt_revision_unspecified, then it defaults to #svn_opt_revision_head
6388 * for URLs or #svn_opt_revision_working for WC targets.  Use the
6389 * authentication baton cached in @a ctx for authentication if contacting
6390 * the repository.
6391 *
6392 * If @a depth is #svn_depth_empty, list only the properties of
6393 * @a target itself.  If @a depth is #svn_depth_files, and
6394 * @a target is a directory, list the properties of @a target
6395 * and its file entries.  If #svn_depth_immediates, list the properties
6396 * of its immediate file and directory entries.  If #svn_depth_infinity,
6397 * list the properties of its file entries and recurse (with
6398 * #svn_depth_infinity) on directory entries.  #svn_depth_unknown is
6399 * equivalent to #svn_depth_empty.  All other values produce undefined
6400 * results.
6401 *
6402 * @a changelists is an array of <tt>const char *</tt> changelist
6403 * names, used as a restrictive filter on items whose properties are
6404 * listed; that is, don't list properties on any item unless it's a member
6405 * of one of those changelists.  If @a changelists is empty (or
6406 * altogether @c NULL), no changelist filtering occurs.
6407 *
6408 * If @a get_target_inherited_props is true, then also return any inherited
6409 * properties when @a receiver is called for @a target.  If @a target is a
6410 * working copy path, then properties inherited by @a target as far as the
6411 * root of the working copy are obtained from the working copy's actual
6412 * property values.  Properties inherited from above the working copy
6413 * root come from the inherited properties cache.  If @a target is a URL,
6414 * then the inherited properties come from the repository.
6415 * If @a get_target_inherited_props is false, then no inherited properties
6416 * are returned to @a receiver.
6417 *
6418 * If @a target is not found, return the error #SVN_ERR_ENTRY_NOT_FOUND.
6419 *
6420 * @since New in 1.8.
6421 */
6422svn_error_t *
6423svn_client_proplist4(const char *target,
6424                     const svn_opt_revision_t *peg_revision,
6425                     const svn_opt_revision_t *revision,
6426                     svn_depth_t depth,
6427                     const apr_array_header_t *changelists,
6428                     svn_boolean_t get_target_inherited_props,
6429                     svn_proplist_receiver2_t receiver,
6430                     void *receiver_baton,
6431                     svn_client_ctx_t *ctx,
6432                     apr_pool_t *scratch_pool);
6433
6434/**
6435 * Similar to svn_client_proplist4(), except that the @a receiver type
6436 * is a #svn_proplist_receiver_t, @a get_target_inherited_props is
6437 * always passed NULL, and there is no separate scratch pool.
6438 *
6439 * @since New in 1.5.
6440 * @deprecated Provided for backward compatibility with the 1.7 API.
6441 */
6442SVN_DEPRECATED
6443svn_error_t *
6444svn_client_proplist3(const char *target,
6445                     const svn_opt_revision_t *peg_revision,
6446                     const svn_opt_revision_t *revision,
6447                     svn_depth_t depth,
6448                     const apr_array_header_t *changelists,
6449                     svn_proplist_receiver_t receiver,
6450                     void *receiver_baton,
6451                     svn_client_ctx_t *ctx,
6452                     apr_pool_t *pool);
6453
6454/**
6455 * Similar to svn_client_proplist3(), except the properties are
6456 * returned as an array of #svn_client_proplist_item_t * structures
6457 * instead of by invoking the receiver function, there's no support
6458 * for @a changelists filtering, and @a recurse is used instead of a
6459 * #svn_depth_t parameter (FALSE corresponds to #svn_depth_empty,
6460 * and TRUE to #svn_depth_infinity).
6461 *
6462 * @since New in 1.2.
6463 *
6464 * @deprecated Provided for backward compatibility with the 1.4 API.
6465 */
6466SVN_DEPRECATED
6467svn_error_t *
6468svn_client_proplist2(apr_array_header_t **props,
6469                     const char *target,
6470                     const svn_opt_revision_t *peg_revision,
6471                     const svn_opt_revision_t *revision,
6472                     svn_boolean_t recurse,
6473                     svn_client_ctx_t *ctx,
6474                     apr_pool_t *pool);
6475
6476/**
6477 * Similar to svn_client_proplist2(), except that @a peg_revision is
6478 * always the same as @a revision.
6479 *
6480 * @deprecated Provided for backward compatibility with the 1.1 API.
6481 */
6482SVN_DEPRECATED
6483svn_error_t *
6484svn_client_proplist(apr_array_header_t **props,
6485                    const char *target,
6486                    const svn_opt_revision_t *revision,
6487                    svn_boolean_t recurse,
6488                    svn_client_ctx_t *ctx,
6489                    apr_pool_t *pool);
6490
6491/** Set @a *props to a hash of the revision props attached to @a revision in
6492 * the repository represented by @a URL.  Use the authentication baton cached
6493 * in @a ctx for authentication, and @a pool for all memory allocation.
6494 * Return the actual rev queried in @a *set_rev.
6495 *
6496 * The allocated hash maps (<tt>const char *</tt>) property names to
6497 * (#svn_string_t *) property values.
6498 *
6499 * Note that unlike its cousin svn_client_proplist(), this routine
6500 * doesn't read a working copy at all; it's a pure network operation
6501 * that reads *unversioned* properties attached to a revision.
6502 */
6503svn_error_t *
6504svn_client_revprop_list(apr_hash_t **props,
6505                        const char *URL,
6506                        const svn_opt_revision_t *revision,
6507                        svn_revnum_t *set_rev,
6508                        svn_client_ctx_t *ctx,
6509                        apr_pool_t *pool);
6510/** @} */
6511
6512
6513/**
6514 * @defgroup Export Export a tree from version control.
6515 *
6516 * @{
6517 */
6518
6519/**
6520 * Export the contents of either a subversion repository or a
6521 * subversion working copy into a 'clean' directory (meaning a
6522 * directory with no administrative directories).  If @a result_rev
6523 * is not @c NULL and the path being exported is a repository URL, set
6524 * @a *result_rev to the value of the revision actually exported (set
6525 * it to #SVN_INVALID_REVNUM for local exports).
6526 *
6527 * @a from_path_or_url is either the path the working copy on disk, or
6528 * a URL to the repository you wish to export.
6529 *
6530 * When exporting a directory, @a to_path is the path to the directory
6531 * where you wish to create the exported tree; when exporting a file, it
6532 * is the path of the file that will be created.  If @a to_path is the
6533 * empty path, then the basename of the export file/directory in the repository
6534 * will be used.  If @a to_path represents an existing directory, and a
6535 * file is being exported, then a file with the that basename will be
6536 * created under that directory (as with 'copy' operations).
6537 *
6538 * @a peg_revision is the revision where the path is first looked up
6539 * when exporting from a repository.  If @a peg_revision->kind is
6540 * #svn_opt_revision_unspecified, then it defaults to #svn_opt_revision_head
6541 * for URLs or #svn_opt_revision_working for WC targets.
6542 *
6543 * @a revision is the revision that should be exported.
6544 *
6545 * @a peg_revision and @a revision must not be @c NULL.
6546 *
6547 * @a ctx->notify_func2 and @a ctx->notify_baton2 are the notification
6548 * functions and baton which are passed to svn_client_checkout() when
6549 * exporting from a repository.
6550 *
6551 * @a ctx is a context used for authentication in the repository case.
6552 *
6553 * @a overwrite if TRUE will cause the export to overwrite files or
6554 * directories.
6555 *
6556 * If @a ignore_externals is set, don't process externals definitions
6557 * as part of this operation.
6558 *
6559 * If @a ignore_keywords is set, don't expand keywords as part of this
6560 * operation.
6561 *
6562 * @a native_eol allows you to override the standard eol marker on the
6563 * platform you are running on.  Can be either "LF", "CR" or "CRLF" or
6564 * NULL.  If NULL will use the standard eol marker.  Any other value
6565 * will cause the #SVN_ERR_IO_UNKNOWN_EOL error to be returned.
6566 *
6567 * If @a depth is #svn_depth_infinity, export fully recursively.  Else
6568 * if it is #svn_depth_immediates, export @a from_path_or_url and its
6569 * immediate children (if any), but with subdirectories empty and at
6570 * #svn_depth_empty.  Else if #svn_depth_files, export @a
6571 * from_path_or_url and its immediate file children (if any) only.  If
6572 * @a depth is #svn_depth_empty, then export exactly @a
6573 * from_path_or_url and none of its children.
6574 *
6575 * All allocations are done in @a pool.
6576 *
6577 * @since New in 1.7.
6578 */
6579svn_error_t *
6580svn_client_export5(svn_revnum_t *result_rev,
6581                   const char *from_path_or_url,
6582                   const char *to_path,
6583                   const svn_opt_revision_t *peg_revision,
6584                   const svn_opt_revision_t *revision,
6585                   svn_boolean_t overwrite,
6586                   svn_boolean_t ignore_externals,
6587                   svn_boolean_t ignore_keywords,
6588                   svn_depth_t depth,
6589                   const char *native_eol,
6590                   svn_client_ctx_t *ctx,
6591                   apr_pool_t *pool);
6592
6593/**
6594 * Similar to svn_client_export5(), but with @a ignore_keywords set
6595 * to FALSE.
6596 *
6597 * @deprecated Provided for backward compatibility with the 1.6 API.
6598 * @since New in 1.5.
6599 */
6600SVN_DEPRECATED
6601svn_error_t *
6602svn_client_export4(svn_revnum_t *result_rev,
6603                   const char *from_path_or_url,
6604                   const char *to_path,
6605                   const svn_opt_revision_t *peg_revision,
6606                   const svn_opt_revision_t *revision,
6607                   svn_boolean_t overwrite,
6608                   svn_boolean_t ignore_externals,
6609                   svn_depth_t depth,
6610                   const char *native_eol,
6611                   svn_client_ctx_t *ctx,
6612                   apr_pool_t *pool);
6613
6614
6615/**
6616 * Similar to svn_client_export4(), but with @a depth set according to
6617 * @a recurse: if @a recurse is TRUE, set @a depth to
6618 * #svn_depth_infinity, if @a recurse is FALSE, set @a depth to
6619 * #svn_depth_files.
6620 *
6621 * @deprecated Provided for backward compatibility with the 1.4 API.
6622 *
6623 * @since New in 1.2.
6624 */
6625SVN_DEPRECATED
6626svn_error_t *
6627svn_client_export3(svn_revnum_t *result_rev,
6628                   const char *from_path_or_url,
6629                   const char *to_path,
6630                   const svn_opt_revision_t *peg_revision,
6631                   const svn_opt_revision_t *revision,
6632                   svn_boolean_t overwrite,
6633                   svn_boolean_t ignore_externals,
6634                   svn_boolean_t recurse,
6635                   const char *native_eol,
6636                   svn_client_ctx_t *ctx,
6637                   apr_pool_t *pool);
6638
6639
6640/**
6641 * Similar to svn_client_export3(), but with @a peg_revision
6642 * always set to #svn_opt_revision_unspecified, @a overwrite set to
6643 * the value of @a force, @a ignore_externals always FALSE, and
6644 * @a recurse always TRUE.
6645 *
6646 * @since New in 1.1.
6647 * @deprecated Provided for backward compatibility with the 1.1 API.
6648 */
6649SVN_DEPRECATED
6650svn_error_t *
6651svn_client_export2(svn_revnum_t *result_rev,
6652                   const char *from_path_or_url,
6653                   const char *to_path,
6654                   svn_opt_revision_t *revision,
6655                   svn_boolean_t force,
6656                   const char *native_eol,
6657                   svn_client_ctx_t *ctx,
6658                   apr_pool_t *pool);
6659
6660
6661/**
6662 * Similar to svn_client_export2(), but with @a native_eol always set
6663 * to NULL.
6664 *
6665 * @deprecated Provided for backward compatibility with the 1.0 API.
6666 */
6667SVN_DEPRECATED
6668svn_error_t *
6669svn_client_export(svn_revnum_t *result_rev,
6670                  const char *from_path_or_url,
6671                  const char *to_path,
6672                  svn_opt_revision_t *revision,
6673                  svn_boolean_t force,
6674                  svn_client_ctx_t *ctx,
6675                  apr_pool_t *pool);
6676
6677/** @} */
6678
6679/**
6680 * @defgroup List List / ls
6681 *
6682 * @{
6683 */
6684
6685/** The type of function invoked by svn_client_list3() to report the details
6686 * of each directory entry being listed.
6687 *
6688 * @a baton is the baton that was passed to the caller.  @a path is the
6689 * entry's path relative to @a abs_path; it is the empty path when reporting
6690 * the top node of the list operation.  @a dirent contains some or all of
6691 * the directory entry's details, as determined by the caller.  @a lock is
6692 * the entry's lock, if it is locked and if lock information is being
6693 * reported by the caller; otherwise @a lock is NULL.  @a abs_path is the
6694 * repository path of the top node of the list operation; it is relative to
6695 * the repository root and begins with "/".
6696 *
6697 * If svn_client_list3() was called with @a include_externals set to TRUE,
6698 * @a external_parent_url and @a external_target will be set.
6699 * @a external_parent_url is url of the directory which has the
6700 * externals definitions. @a external_target is the target subdirectory of
6701 * externals definitions which is relative to the parent directory that holds
6702 * the external item.
6703 *
6704 * If external_parent_url and external_target are defined, the item being
6705 * listed is part of the external described by external_parent_url and
6706 * external_target. Else, the item is not part of any external.
6707 * Moreover, we will never mix items which are part of separate
6708 * externals, and will always finish listing an external before listing
6709 * the next one.
6710 *
6711 * @a scratch_pool may be used for temporary allocations.
6712 *
6713 * @since New in 1.8.
6714 */
6715typedef svn_error_t *(*svn_client_list_func2_t)(
6716  void *baton,
6717  const char *path,
6718  const svn_dirent_t *dirent,
6719  const svn_lock_t *lock,
6720  const char *abs_path,
6721  const char *external_parent_url,
6722  const char *external_target,
6723  apr_pool_t *scratch_pool);
6724
6725/**
6726 * Similar to #svn_client_list_func2_t, but without any information about
6727 * externals definitions.
6728 *
6729 * @deprecated Provided for backward compatibility with the 1.7 API.
6730 *
6731 * @since New in 1.4
6732 *
6733 * */
6734typedef svn_error_t *(*svn_client_list_func_t)(void *baton,
6735                                               const char *path,
6736                                               const svn_dirent_t *dirent,
6737                                               const svn_lock_t *lock,
6738                                               const char *abs_path,
6739                                               apr_pool_t *pool);
6740
6741/**
6742 * Report the directory entry, and possibly children, for @a
6743 * path_or_url at @a revision.  The actual node revision selected is
6744 * determined by the path as it exists in @a peg_revision.  If @a
6745 * peg_revision->kind is #svn_opt_revision_unspecified, then it defaults
6746 * to #svn_opt_revision_head for URLs or #svn_opt_revision_working
6747 * for WC targets.
6748 *
6749 * Report directory entries by invoking @a list_func/@a baton with @a path
6750 * relative to @a path_or_url.  The dirent for @a path_or_url is reported
6751 * using an empty @a path.  If @a path_or_url is a directory, also report
6752 * its children.  If @a path_or_url is non-existent, return
6753 * #SVN_ERR_FS_NOT_FOUND.
6754 *
6755 * If the @a patterns array of <tt>const char *</tt> is not @c NULL, only
6756 * report paths whose last segment matches one of the specified glob
6757 * patterns.  This does not affect the size of the tree nor the number of
6758 * externals being covered.
6759 *
6760 * If @a fetch_locks is TRUE, include locks when reporting directory entries.
6761 *
6762 * If @a include_externals is TRUE, also list all external items
6763 * reached by recursion. @a depth value passed to the original list target
6764 * applies for the externals also.
6765 *
6766 * Use @a scratch_pool for temporary allocations.
6767 *
6768 * Use authentication baton cached in @a ctx to authenticate against the
6769 * repository.
6770 *
6771 * If @a depth is #svn_depth_empty, list just @a path_or_url itself.
6772 * If @a depth is #svn_depth_files, list @a path_or_url and its file
6773 * entries.  If #svn_depth_immediates, list its immediate file and
6774 * directory entries.  If #svn_depth_infinity, list file entries and
6775 * recurse (with #svn_depth_infinity) on directory entries.
6776 *
6777 * @a dirent_fields controls which fields in the #svn_dirent_t's are
6778 * filled in.  To have them totally filled in use #SVN_DIRENT_ALL,
6779 * otherwise simply bitwise OR together the combination of @c SVN_DIRENT_
6780 * fields you care about.
6781 *
6782 * @since New in 1.10.
6783 */
6784svn_error_t *
6785svn_client_list4(const char *path_or_url,
6786                 const svn_opt_revision_t *peg_revision,
6787                 const svn_opt_revision_t *revision,
6788                 const apr_array_header_t *patterns,
6789                 svn_depth_t depth,
6790                 apr_uint32_t dirent_fields,
6791                 svn_boolean_t fetch_locks,
6792                 svn_boolean_t include_externals,
6793                 svn_client_list_func2_t list_func,
6794                 void *baton,
6795                 svn_client_ctx_t *ctx,
6796                 apr_pool_t *scratch_pool);
6797
6798/** Similar to svn_client_list4(), but with @a patterns set to @c NULL.
6799 *
6800 * @since New in 1.8.
6801 *
6802 * @deprecated Provided for backwards compatibility with the 1.9 API.
6803 */
6804SVN_DEPRECATED
6805svn_error_t *
6806svn_client_list3(const char *path_or_url,
6807                 const svn_opt_revision_t *peg_revision,
6808                 const svn_opt_revision_t *revision,
6809                 svn_depth_t depth,
6810                 apr_uint32_t dirent_fields,
6811                 svn_boolean_t fetch_locks,
6812                 svn_boolean_t include_externals,
6813                 svn_client_list_func2_t list_func,
6814                 void *baton,
6815                 svn_client_ctx_t *ctx,
6816                 apr_pool_t *pool);
6817
6818
6819/** Similar to svn_client_list3(), but with @a include_externals set
6820 * to FALSE, and using a #svn_client_list_func_t as callback.
6821 *
6822 * @since New in 1.5.
6823 *
6824 * @deprecated Provided for backwards compatibility with the 1.7 API.
6825 */
6826SVN_DEPRECATED
6827svn_error_t *
6828svn_client_list2(const char *path_or_url,
6829                 const svn_opt_revision_t *peg_revision,
6830                 const svn_opt_revision_t *revision,
6831                 svn_depth_t depth,
6832                 apr_uint32_t dirent_fields,
6833                 svn_boolean_t fetch_locks,
6834                 svn_client_list_func_t list_func,
6835                 void *baton,
6836                 svn_client_ctx_t *ctx,
6837                 apr_pool_t *pool);
6838
6839/**
6840 * Similar to svn_client_list2(), but with @a recurse instead of @a depth.
6841 * If @a recurse is FALSE, pass #svn_depth_immediates for @a depth; else
6842 * pass #svn_depth_infinity.
6843 *
6844 * @since New in 1.4.
6845 *
6846 * @deprecated Provided for backward compatibility with the 1.4 API.
6847 */
6848SVN_DEPRECATED
6849svn_error_t *
6850svn_client_list(const char *path_or_url,
6851                const svn_opt_revision_t *peg_revision,
6852                const svn_opt_revision_t *revision,
6853                svn_boolean_t recurse,
6854                apr_uint32_t dirent_fields,
6855                svn_boolean_t fetch_locks,
6856                svn_client_list_func_t list_func,
6857                void *baton,
6858                svn_client_ctx_t *ctx,
6859                apr_pool_t *pool);
6860
6861/**
6862 * Same as svn_client_list(), but always passes #SVN_DIRENT_ALL for
6863 * the @a dirent_fields argument and returns all information in two
6864 * hash tables instead of invoking a callback.
6865 *
6866 * Set @a *dirents to a newly allocated hash of directory entries.
6867 * The @a dirents hash maps entry names (<tt>const char *</tt>) to
6868 * #svn_dirent_t *'s.
6869 *
6870 * If @a locks is not @c NULL, set @a *locks to a hash table mapping
6871 * entry names (<tt>const char *</tt>) to #svn_lock_t *'s.
6872 *
6873 * @since New in 1.3.
6874 *
6875 * @deprecated Provided for backward compatibility with the 1.3 API.
6876 * Use svn_client_list2() instead.
6877 */
6878SVN_DEPRECATED
6879svn_error_t *
6880svn_client_ls3(apr_hash_t **dirents,
6881               apr_hash_t **locks,
6882               const char *path_or_url,
6883               const svn_opt_revision_t *peg_revision,
6884               const svn_opt_revision_t *revision,
6885               svn_boolean_t recurse,
6886               svn_client_ctx_t *ctx,
6887               apr_pool_t *pool);
6888
6889/**
6890 * Same as svn_client_ls3(), but without the ability to get locks.
6891 *
6892 * @since New in 1.2.
6893 *
6894 * @deprecated Provided for backward compatibility with the 1.2 API.
6895 * Use svn_client_list2() instead.
6896 */
6897SVN_DEPRECATED
6898svn_error_t *
6899svn_client_ls2(apr_hash_t **dirents,
6900               const char *path_or_url,
6901               const svn_opt_revision_t *peg_revision,
6902               const svn_opt_revision_t *revision,
6903               svn_boolean_t recurse,
6904               svn_client_ctx_t *ctx,
6905               apr_pool_t *pool);
6906
6907/**
6908 * Similar to svn_client_ls2() except that @a peg_revision is always
6909 * the same as @a revision.
6910 *
6911 * @deprecated Provided for backward compatibility with the 1.1 API.
6912 * Use svn_client_list2() instead.
6913 */
6914SVN_DEPRECATED
6915svn_error_t *
6916svn_client_ls(apr_hash_t **dirents,
6917              const char *path_or_url,
6918              svn_opt_revision_t *revision,
6919              svn_boolean_t recurse,
6920              svn_client_ctx_t *ctx,
6921              apr_pool_t *pool);
6922
6923
6924/** @} */
6925
6926/**
6927 * @defgroup Cat View the contents of a file in the repository.
6928 *
6929 * @{
6930 */
6931
6932/**
6933 * Output the content of a file.
6934 *
6935 * @param[out] props           Optional output argument to obtain properties.
6936 * @param[in] out              The stream to which the content will be written.
6937 * @param[in] path_or_url      The path or URL of the file.
6938 * @param[in] peg_revision     The peg revision.
6939 * @param[in] revision         The operative revision.
6940 * @param[in] expand_keywords  When true, keywords (when set) are expanded.
6941 * @param[in] ctx   The standard client context, used for possible
6942 *                  authentication.
6943 *
6944 * @return A pointer to an #svn_error_t of the type (this list is not
6945 *         exhaustive): <br>
6946 *         An unspecified error if @a revision is of kind
6947 *         #svn_opt_revision_previous (or some other kind that requires
6948 *         a local path), because the desired revision cannot be
6949 *         determined. <br>
6950 *         If no error occurred, return #SVN_NO_ERROR.
6951 *
6952 * If @a *props is not NULL it is set to a hash of all the file's
6953 * non-inherited properties. If it is NULL, the properties are only
6954 * used for determining how and if the file should be translated.
6955 *
6956 * @see #svn_client_ctx_t <br> @ref clnt_revisions for
6957 *      a discussion of operative and peg revisions.
6958 *
6959 * @since New in 1.9.
6960 */
6961svn_error_t *
6962svn_client_cat3(apr_hash_t **props,
6963                svn_stream_t *out,
6964                const char *path_or_url,
6965                const svn_opt_revision_t *peg_revision,
6966                const svn_opt_revision_t *revision,
6967                svn_boolean_t expand_keywords,
6968                svn_client_ctx_t *ctx,
6969                apr_pool_t *result_pool,
6970                apr_pool_t *scratch_pool);
6971
6972/**
6973 * Similar to svn_client_cat3() except without the option of directly
6974 * reading the properties, and with @a expand_keywords always TRUE.
6975 *
6976 * @since New in 1.2.
6977 * @deprecated Provided for backward compatibility with the 1.8 API.
6978 */
6979SVN_DEPRECATED
6980svn_error_t *
6981svn_client_cat2(svn_stream_t *out,
6982                const char *path_or_url,
6983                const svn_opt_revision_t *peg_revision,
6984                const svn_opt_revision_t *revision,
6985                svn_client_ctx_t *ctx,
6986                apr_pool_t *pool);
6987
6988
6989/**
6990 * Similar to svn_client_cat2() except that the peg revision is always
6991 * the same as @a revision.
6992 *
6993 * @deprecated Provided for backward compatibility with the 1.1 API.
6994 */
6995SVN_DEPRECATED
6996svn_error_t *
6997svn_client_cat(svn_stream_t *out,
6998               const char *path_or_url,
6999               const svn_opt_revision_t *revision,
7000               svn_client_ctx_t *ctx,
7001               apr_pool_t *pool);
7002
7003/** @} end group: cat */
7004
7005
7006/** Changelist commands
7007 *
7008 * @defgroup svn_client_changelist_funcs Client Changelist Functions
7009 * @{
7010 */
7011
7012/**
7013 * Add each path in @a paths (recursing to @a depth as necessary) to
7014 * @a changelist.  If a path is already a member of another
7015 * changelist, then remove it from the other changelist and add it to
7016 * @a changelist.  (For now, a path cannot belong to two changelists
7017 * at once.)
7018 *
7019 * @a paths is an array of (const char *) local WC paths.
7020 *
7021 * @a changelists is an array of <tt>const char *</tt> changelist
7022 * names, used as a restrictive filter on items whose changelist
7023 * assignments are adjusted; that is, don't tweak the changeset of any
7024 * item unless it's currently a member of one of those changelists.
7025 * If @a changelists is empty (or altogether @c NULL), no changelist
7026 * filtering occurs.
7027 *
7028 * @note This metadata is purely a client-side "bookkeeping"
7029 * convenience, and is entirely managed by the working copy.
7030 *
7031 * @since New in 1.5.
7032 */
7033svn_error_t *
7034svn_client_add_to_changelist(const apr_array_header_t *paths,
7035                             const char *changelist,
7036                             svn_depth_t depth,
7037                             const apr_array_header_t *changelists,
7038                             svn_client_ctx_t *ctx,
7039                             apr_pool_t *pool);
7040
7041/**
7042 * Remove each path in @a paths (recursing to @a depth as necessary)
7043 * from changelists to which they are currently assigned.
7044 *
7045 * @a paths is an array of (const char *) local WC paths.
7046 *
7047 * @a changelists is an array of <tt>const char *</tt> changelist
7048 * names, used as a restrictive filter on items whose changelist
7049 * assignments are removed; that is, don't remove from a changeset any
7050 * item unless it's currently a member of one of those changelists.
7051 * If @a changelists is empty (or altogether @c NULL), all changelist
7052 * assignments in and under each path in @a paths (to @a depth) will
7053 * be removed.
7054 *
7055 * @note This metadata is purely a client-side "bookkeeping"
7056 * convenience, and is entirely managed by the working copy.
7057 *
7058 * @since New in 1.5.
7059 */
7060svn_error_t *
7061svn_client_remove_from_changelists(const apr_array_header_t *paths,
7062                                   svn_depth_t depth,
7063                                   const apr_array_header_t *changelists,
7064                                   svn_client_ctx_t *ctx,
7065                                   apr_pool_t *pool);
7066
7067
7068/**
7069 * Beginning at @a path, crawl to @a depth to discover every path in
7070 * or under @a path which belongs to one of the changelists in @a
7071 * changelists (an array of <tt>const char *</tt> changelist names).
7072 * If @a changelists is @c NULL, discover paths with any changelist.
7073 * Call @a callback_func (with @a callback_baton) each time a
7074 * changelist-having path is discovered.
7075 *
7076 * @a path is a local WC path.
7077 *
7078 * If @a ctx->cancel_func is not @c NULL, invoke it passing @a
7079 * ctx->cancel_baton during the recursive walk.
7080 *
7081 * @since New in 1.5.
7082 */
7083svn_error_t *
7084svn_client_get_changelists(const char *path,
7085                           const apr_array_header_t *changelists,
7086                           svn_depth_t depth,
7087                           svn_changelist_receiver_t callback_func,
7088                           void *callback_baton,
7089                           svn_client_ctx_t *ctx,
7090                           apr_pool_t *pool);
7091
7092/** @} */
7093
7094
7095
7096/** Locking commands
7097 *
7098 * @defgroup svn_client_locking_funcs Client Locking Functions
7099 * @{
7100 */
7101
7102/**
7103 * Lock @a targets in the repository.  @a targets is an array of
7104 * <tt>const char *</tt> paths - either all working copy paths or all URLs.
7105 * All targets must be in the same repository.
7106 *
7107 * If a target is already locked in the repository, no lock will be
7108 * acquired unless @a steal_lock is TRUE, in which case the locks are
7109 * stolen.  @a comment, if non-NULL, is an xml-escapable description
7110 * stored with each lock in the repository.  Each acquired lock will
7111 * be stored in the working copy if the targets are WC paths.
7112 *
7113 * For each target @a ctx->notify_func2/notify_baton2 will be used to indicate
7114 * whether it was locked.  An action of #svn_wc_notify_locked
7115 * means that the path was locked.  If the path was not locked because
7116 * it was out of date or there was already a lock in the repository,
7117 * the notification function will be called with
7118 * #svn_wc_notify_failed_lock, and the error passed in the notification
7119 * structure.
7120 *
7121 * Use @a pool for temporary allocations.
7122 *
7123 * @since New in 1.2.
7124 */
7125svn_error_t *
7126svn_client_lock(const apr_array_header_t *targets,
7127                const char *comment,
7128                svn_boolean_t steal_lock,
7129                svn_client_ctx_t *ctx,
7130                apr_pool_t *pool);
7131
7132/**
7133 * Unlock @a targets in the repository.  @a targets is an array of
7134 * <tt>const char *</tt> paths - either all working copy paths or all URLs.
7135 * All targets must be in the same repository.
7136 *
7137 * If the targets are WC paths, and @a break_lock is FALSE, the working
7138 * copy must contain a lock for each target.
7139 * If this is not the case, or the working copy lock doesn't match the
7140 * lock token in the repository, an error will be signaled.
7141 *
7142 * If the targets are URLs, the locks may be broken even if @a break_lock
7143 * is FALSE, but only if the lock owner is the same as the
7144 * authenticated user.
7145 *
7146 * If @a break_lock is TRUE, the locks will be broken in the
7147 * repository.  In both cases, the locks, if any, will be removed from
7148 * the working copy if the targets are WC paths.
7149 *
7150 * The notification functions in @a ctx will be called for each
7151 * target.  If the target was successfully unlocked,
7152 * #svn_wc_notify_unlocked will be used.  Else, if the error is
7153 * directly related to unlocking the path (see
7154 * #SVN_ERR_IS_UNLOCK_ERROR), #svn_wc_notify_failed_unlock will be
7155 * used and the error will be passed in the notification structure.
7156
7157 * Use @a pool for temporary allocations.
7158 *
7159 * @since New in 1.2.
7160 */
7161svn_error_t *
7162svn_client_unlock(const apr_array_header_t *targets,
7163                  svn_boolean_t break_lock,
7164                  svn_client_ctx_t *ctx,
7165                  apr_pool_t *pool);
7166
7167/** @} */
7168
7169/**
7170 * @defgroup Info Show repository information about a working copy.
7171 *
7172 * @{
7173 */
7174
7175/** The size of the file is unknown.
7176 * Used as value in fields of type @c apr_size_t in #svn_info_t.
7177 *
7178 * @since New in 1.5
7179 * @deprecated Provided for backward compatibility with the 1.6 API.
7180 */
7181#define SVN_INFO_SIZE_UNKNOWN ((apr_size_t) -1)
7182
7183/**
7184 * A structure which describes various system-generated metadata about
7185 * a working-copy path or URL.
7186 *
7187 * @note Fields may be added to the end of this structure in future
7188 * versions.  Therefore, users shouldn't allocate structures of this
7189 * type, to preserve binary compatibility.
7190 *
7191 * @since New in 1.2.
7192 * @deprecated Provided for backward compatibility with the 1.6 API.  The new
7193 * API is #svn_client_info2_t.
7194 */
7195typedef struct svn_info_t
7196{
7197  /** Where the item lives in the repository. */
7198  const char *URL;
7199
7200  /** The revision of the object.  If path_or_url is a working-copy
7201   * path, then this is its current working revnum.  If path_or_url
7202   * is a URL, then this is the repos revision that path_or_url lives in. */
7203  svn_revnum_t rev;
7204
7205  /** The node's kind. */
7206  svn_node_kind_t kind;
7207
7208  /** The root URL of the repository. */
7209  const char *repos_root_URL;
7210
7211  /** The repository's UUID. */
7212  const char *repos_UUID;
7213
7214  /** The last revision in which this object changed. */
7215  svn_revnum_t last_changed_rev;
7216
7217  /** The date of the last_changed_rev. */
7218  apr_time_t last_changed_date;
7219
7220  /** The author of the last_changed_rev. */
7221  const char *last_changed_author;
7222
7223  /** An exclusive lock, if present.  Could be either local or remote. */
7224  svn_lock_t *lock;
7225
7226  /** Whether or not to ignore the next 10 wc-specific fields. */
7227  svn_boolean_t has_wc_info;
7228
7229  /**
7230   * @name Working-copy path fields
7231   * These things only apply to a working-copy path.
7232   * See svn_wc_entry_t for explanations.
7233   * @{
7234   */
7235  svn_wc_schedule_t schedule;
7236  const char *copyfrom_url;
7237  svn_revnum_t copyfrom_rev;
7238  apr_time_t text_time;
7239  apr_time_t prop_time;  /* will always be 0 for svn 1.4 and later */
7240  const char *checksum;
7241  const char *conflict_old;
7242  const char *conflict_new;
7243  const char *conflict_wrk;
7244  const char *prejfile;
7245  /** @since New in 1.5. */
7246  const char *changelist;
7247  /** @since New in 1.5. */
7248  svn_depth_t depth;
7249
7250  /**
7251   * Similar to working_size64, but will be #SVN_INFO_SIZE_UNKNOWN when
7252   * its value would overflow apr_size_t (so when size >= 4 GB - 1 byte).
7253   *
7254   * @deprecated Provided for backward compatibility with the 1.5 API.
7255   */
7256  apr_size_t working_size;
7257
7258  /** @} */
7259
7260  /**
7261   * Similar to size64, but size will be #SVN_INFO_SIZE_UNKNOWN when
7262   * its value would overflow apr_size_t (so when size >= 4 GB - 1 byte).
7263   *
7264   * @deprecated Provided for backward compatibility with the 1.5 API.
7265   */
7266  apr_size_t size;
7267
7268  /**
7269   * The size of the file in the repository (untranslated,
7270   * e.g. without adjustment of line endings and keyword
7271   * expansion). Only applicable for file -- not directory -- URLs.
7272   * For working copy paths, size64 will be #SVN_INVALID_FILESIZE.
7273   * @since New in 1.6.
7274   */
7275  svn_filesize_t size64;
7276
7277  /**
7278   * The size of the file after being translated into its local
7279   * representation, or #SVN_INVALID_FILESIZE if unknown.
7280   * Not applicable for directories.
7281   * @since New in 1.6.
7282   * @name Working-copy path fields
7283   * @{
7284   */
7285  svn_filesize_t working_size64;
7286
7287  /**
7288   * Info on any tree conflict of which this node is a victim. Otherwise NULL.
7289   * @since New in 1.6.
7290   */
7291  svn_wc_conflict_description_t *tree_conflict;
7292
7293  /** @} */
7294
7295} svn_info_t;
7296
7297
7298/**
7299 * The callback invoked by svn_client_info2().  Each invocation
7300 * describes @a path with the information present in @a info.  Note
7301 * that any fields within @a info may be NULL if information is
7302 * unavailable.  Use @a pool for all temporary allocation.
7303 *
7304 * @since New in 1.2.
7305 * @deprecated Provided for backward compatibility with the 1.6 API.  The new
7306 * API is #svn_client_info_receiver2_t.
7307 */
7308typedef svn_error_t *(*svn_info_receiver_t)(
7309  void *baton,
7310  const char *path,
7311  const svn_info_t *info,
7312  apr_pool_t *pool);
7313
7314/**
7315 * Return a duplicate of @a info, allocated in @a pool. No part of the new
7316 * structure will be shared with @a info.
7317 *
7318 * @since New in 1.3.
7319 * @deprecated Provided for backward compatibility with the 1.6 API.  The new
7320 * API is #svn_client_info2_dup().
7321 */
7322SVN_DEPRECATED
7323svn_info_t *
7324svn_info_dup(const svn_info_t *info,
7325             apr_pool_t *pool);
7326
7327/**
7328 * A structure which describes various system-generated metadata about
7329 * a working-copy path or URL.
7330 *
7331 * @note Fields may be added to the end of this structure in future
7332 * versions.  Therefore, users shouldn't allocate structures of this
7333 * type, to preserve binary compatibility.
7334 *
7335 * @since New in 1.7.
7336 */
7337typedef struct svn_client_info2_t
7338{
7339  /** Where the item lives in the repository. */
7340  const char *URL;
7341
7342  /** The revision of the object.  If the target is a working-copy
7343   * path, then this is its current working revnum.  If the target
7344   * is a URL, then this is the repos revision that it lives in. */
7345  svn_revnum_t rev;
7346
7347  /** The root URL of the repository. */
7348  const char *repos_root_URL;
7349
7350  /** The repository's UUID. */
7351  const char *repos_UUID;
7352
7353  /** The node's kind. */
7354  svn_node_kind_t kind;
7355
7356  /** The size of the file in the repository (untranslated,
7357   * e.g. without adjustment of line endings and keyword
7358   * expansion). Only applicable for file -- not directory -- URLs.
7359   * For working copy paths, @a size will be #SVN_INVALID_FILESIZE. */
7360  svn_filesize_t size;
7361
7362  /** The last revision in which this object changed. */
7363  svn_revnum_t last_changed_rev;
7364
7365  /** The date of the last_changed_rev. */
7366  apr_time_t last_changed_date;
7367
7368  /** The author of the last_changed_rev. */
7369  const char *last_changed_author;
7370
7371  /** An exclusive lock, if present.  Could be either local or remote. */
7372  const svn_lock_t *lock;
7373
7374  /** Possible information about the working copy, NULL if not valid. */
7375  const svn_wc_info_t *wc_info;
7376
7377} svn_client_info2_t;
7378
7379/**
7380 * Return a duplicate of @a info, allocated in @a pool. No part of the new
7381 * structure will be shared with @a info.
7382 *
7383 * @since New in 1.7.
7384 */
7385svn_client_info2_t *
7386svn_client_info2_dup(const svn_client_info2_t *info,
7387                     apr_pool_t *pool);
7388
7389/**
7390 * The callback invoked by info retrievers.  Each invocation
7391 * describes @a abspath_or_url with the information present in @a info.
7392 * Use @a scratch_pool for all temporary allocation.
7393 *
7394 * @since New in 1.7.
7395 */
7396typedef svn_error_t *(*svn_client_info_receiver2_t)(
7397                         void *baton,
7398                         const char *abspath_or_url,
7399                         const svn_client_info2_t *info,
7400                         apr_pool_t *scratch_pool);
7401
7402/**
7403 * Invoke @a receiver with @a receiver_baton to return information
7404 * about @a abspath_or_url in @a revision.  The information returned is
7405 * system-generated metadata, not the sort of "property" metadata
7406 * created by users.  See #svn_client_info2_t.
7407 *
7408 * If both revision arguments are either #svn_opt_revision_unspecified
7409 * or @c NULL, then information will be pulled solely from the working copy;
7410 * no network connections will be made.
7411 *
7412 * Otherwise, information will be pulled from a repository.  The
7413 * actual node revision selected is determined by the @a abspath_or_url
7414 * as it exists in @a peg_revision.  If @a peg_revision->kind is
7415 * #svn_opt_revision_unspecified, then it defaults to
7416 * #svn_opt_revision_head for URLs or #svn_opt_revision_working for
7417 * WC targets.
7418 *
7419 * If @a abspath_or_url is not a local path, then if @a revision is of
7420 * kind #svn_opt_revision_previous (or some other kind that requires
7421 * a local path), an error will be returned, because the desired
7422 * revision cannot be determined.
7423 *
7424 * Use the authentication baton cached in @a ctx to authenticate
7425 * against the repository.
7426 *
7427 * If @a abspath_or_url is a file, just invoke @a receiver on it.  If it
7428 * is a directory, then descend according to @a depth.  If @a depth is
7429 * #svn_depth_empty, invoke @a receiver on @a abspath_or_url and
7430 * nothing else; if #svn_depth_files, on @a abspath_or_url and its
7431 * immediate file children; if #svn_depth_immediates, the preceding
7432 * plus on each immediate subdirectory; if #svn_depth_infinity, then
7433 * recurse fully, invoking @a receiver on @a abspath_or_url and
7434 * everything beneath it.
7435 *
7436 * If @a fetch_excluded is TRUE, also also send excluded nodes in the working
7437 * copy to @a receiver, otherwise these are skipped. If @a fetch_actual_only
7438 * is TRUE also send nodes that don't exist as versioned but are still
7439 * tree conflicted.
7440 *
7441 * If @a include_externals is @c TRUE, recurse into externals and report about
7442 * them as well.
7443 *
7444 * @a changelists is an array of <tt>const char *</tt> changelist
7445 * names, used as a restrictive filter on items whose info is
7446 * reported; that is, don't report info about any item unless
7447 * it's a member of one of those changelists.  If @a changelists is
7448 * empty (or altogether @c NULL), no changelist filtering occurs.
7449 *
7450 * @since New in 1.9.
7451 */
7452svn_error_t *
7453svn_client_info4(const char *abspath_or_url,
7454                 const svn_opt_revision_t *peg_revision,
7455                 const svn_opt_revision_t *revision,
7456                 svn_depth_t depth,
7457                 svn_boolean_t fetch_excluded,
7458                 svn_boolean_t fetch_actual_only,
7459                 svn_boolean_t include_externals,
7460                 const apr_array_header_t *changelists,
7461                 svn_client_info_receiver2_t receiver,
7462                 void *receiver_baton,
7463                 svn_client_ctx_t *ctx,
7464                 apr_pool_t *scratch_pool);
7465
7466
7467/** Similar to svn_client_info4, but doesn't support walking externals.
7468 *
7469 * @since New in 1.7.
7470 * @deprecated Provided for backward compatibility with the 1.8 API.
7471 */
7472SVN_DEPRECATED
7473svn_error_t *
7474svn_client_info3(const char *abspath_or_url,
7475                 const svn_opt_revision_t *peg_revision,
7476                 const svn_opt_revision_t *revision,
7477                 svn_depth_t depth,
7478                 svn_boolean_t fetch_excluded,
7479                 svn_boolean_t fetch_actual_only,
7480                 const apr_array_header_t *changelists,
7481                 svn_client_info_receiver2_t receiver,
7482                 void *receiver_baton,
7483                 svn_client_ctx_t *ctx,
7484                 apr_pool_t *scratch_pool);
7485
7486/** Similar to svn_client_info3, but uses an svn_info_receiver_t instead of
7487 * a #svn_client_info_receiver2_t, and @a path_or_url may be a relative path.
7488 *
7489 * @since New in 1.5.
7490 * @deprecated Provided for backward compatibility with the 1.6 API.
7491 */
7492SVN_DEPRECATED
7493svn_error_t *
7494svn_client_info2(const char *path_or_url,
7495                 const svn_opt_revision_t *peg_revision,
7496                 const svn_opt_revision_t *revision,
7497                 svn_info_receiver_t receiver,
7498                 void *receiver_baton,
7499                 svn_depth_t depth,
7500                 const apr_array_header_t *changelists,
7501                 svn_client_ctx_t *ctx,
7502                 apr_pool_t *pool);
7503
7504/**
7505 * Similar to svn_client_info2() but with @a changelists passed as @c
7506 * NULL, and @a depth set according to @a recurse: if @a recurse is
7507 * TRUE, @a depth is #svn_depth_infinity, else #svn_depth_empty.
7508 *
7509 * @deprecated Provided for backward compatibility with the 1.4 API.
7510 */
7511SVN_DEPRECATED
7512svn_error_t *
7513svn_client_info(const char *path_or_url,
7514                const svn_opt_revision_t *peg_revision,
7515                const svn_opt_revision_t *revision,
7516                svn_info_receiver_t receiver,
7517                void *receiver_baton,
7518                svn_boolean_t recurse,
7519                svn_client_ctx_t *ctx,
7520                apr_pool_t *pool);
7521
7522/**
7523 * Set @a *wcroot_abspath to the local abspath of the root of the
7524 * working copy in which @a local_abspath resides.
7525 *
7526 * @since New in 1.7.
7527 */
7528svn_error_t *
7529svn_client_get_wc_root(const char **wcroot_abspath,
7530                       const char *local_abspath,
7531                       svn_client_ctx_t *ctx,
7532                       apr_pool_t *result_pool,
7533                       apr_pool_t *scratch_pool);
7534
7535/**
7536 * Set @a *min_revision and @a *max_revision to the lowest and highest
7537 * revision numbers found within @a local_abspath.  If @a committed is
7538 * TRUE, set @a *min_revision and @a *max_revision to the lowest and
7539 * highest comitted (i.e. "last changed") revision numbers,
7540 * respectively.  NULL may be passed for either of @a min_revision and
7541 * @a max_revision to indicate the caller's lack of interest in the
7542 * value.  Use @a scratch_pool for temporary allocations.
7543 *
7544 * @since New in 1.7.
7545 */
7546svn_error_t *
7547svn_client_min_max_revisions(svn_revnum_t *min_revision,
7548                             svn_revnum_t *max_revision,
7549                             const char *local_abspath,
7550                             svn_boolean_t committed,
7551                             svn_client_ctx_t *ctx,
7552                             apr_pool_t *scratch_pool);
7553
7554/** @} */
7555
7556
7557/**
7558 * @defgroup Patch Apply a patch to the working copy
7559 *
7560 * @{
7561 */
7562
7563/**
7564 * The callback invoked by svn_client_patch() before attempting to patch
7565 * the target file at @a canon_path_from_patchfile (the path as parsed from
7566 * the patch file, but in canonicalized form). The callback can set
7567 * @a *filtered to @c TRUE to prevent the file from being patched, or else
7568 * must set it to @c FALSE.
7569 *
7570 * The callback is also provided with @a patch_abspath, the path of a
7571 * temporary file containing the patched result, and with @a reject_abspath,
7572 * the path to a temporary file containing the diff text of any hunks
7573 * which were rejected during patching.
7574 *
7575 * Because the callback is invoked before the patching attempt is made,
7576 * there is no guarantee that the target file will actually be patched
7577 * successfully. Client implementations must pay attention to notification
7578 * feedback provided by svn_client_patch() to find out which paths were
7579 * patched successfully.
7580 *
7581 * Note also that the files at @a patch_abspath and @a reject_abspath are
7582 * guaranteed to remain on disk after patching only if the
7583 * @a remove_tempfiles parameter for svn_client_patch() is @c FALSE.
7584 *
7585 * The const char * parameters may be allocated in @a scratch_pool which
7586 * will be cleared after each invocation.
7587 *
7588 * @since New in 1.7.
7589 */
7590typedef svn_error_t *(*svn_client_patch_func_t)(
7591  void *baton,
7592  svn_boolean_t *filtered,
7593  const char *canon_path_from_patchfile,
7594  const char *patch_abspath,
7595  const char *reject_abspath,
7596  apr_pool_t *scratch_pool);
7597
7598/**
7599 * Apply a unidiff patch that's located at absolute path
7600 * @a patch_abspath to the working copy directory at @a wc_dir_abspath.
7601 *
7602 * This function makes a best-effort attempt at applying the patch.
7603 * It might skip patch targets which cannot be patched (e.g. targets
7604 * that are outside of the working copy). It will also reject hunks
7605 * which cannot be applied to a target in case the hunk's context
7606 * does not match anywhere in the patch target.
7607 *
7608 * If @a dry_run is TRUE, the patching process is carried out, and full
7609 * notification feedback is provided, but the working copy is not modified.
7610 *
7611 * @a strip_count specifies how many leading path components should be
7612 * stripped from paths obtained from the patch. It is an error if a
7613 * negative strip count is passed.
7614 *
7615 * If @a reverse is @c TRUE, apply patches in reverse, deleting lines
7616 * the patch would add and adding lines the patch would delete.
7617 *
7618 * If @a ignore_whitespace is TRUE, allow patches to be applied if they
7619 * only differ from the target by whitespace.
7620 *
7621 * If @a remove_tempfiles is TRUE, lifetimes of temporary files created
7622 * during patching will be managed internally. Otherwise, the caller should
7623 * take ownership of these files, the names of which can be obtained by
7624 * passing a @a patch_func callback.
7625 *
7626 * If @a patch_func is non-NULL, invoke @a patch_func with @a patch_baton
7627 * for each patch target processed.
7628 *
7629 * If @a ctx->notify_func2 is non-NULL, invoke @a ctx->notify_func2 with
7630 * @a ctx->notify_baton2 as patching progresses.
7631 *
7632 * If @a ctx->cancel_func is non-NULL, invoke it passing @a
7633 * ctx->cancel_baton at various places during the operation.
7634 *
7635 * Use @a scratch_pool for temporary allocations.
7636 *
7637 * @since New in 1.7.
7638 */
7639svn_error_t *
7640svn_client_patch(const char *patch_abspath,
7641                 const char *wc_dir_abspath,
7642                 svn_boolean_t dry_run,
7643                 int strip_count,
7644                 svn_boolean_t reverse,
7645                 svn_boolean_t ignore_whitespace,
7646                 svn_boolean_t remove_tempfiles,
7647                 svn_client_patch_func_t patch_func,
7648                 void *patch_baton,
7649                 svn_client_ctx_t *ctx,
7650                 apr_pool_t *scratch_pool);
7651
7652/** @} */
7653
7654/** @} end group: Client working copy management */
7655
7656/**
7657 *
7658 * @defgroup clnt_sessions Client session related functions
7659 *
7660 * @{
7661 *
7662 */
7663
7664
7665/* Converting paths to URLs. */
7666
7667/** Set @a *url to the URL for @a path_or_url allocated in result_pool.
7668 *
7669 * If @a path_or_url is already a URL, set @a *url to @a path_or_url.
7670 *
7671 * If @a path_or_url is a versioned item, set @a *url to @a
7672 * path_or_url's entry URL.  If @a path_or_url is unversioned (has
7673 * no entry), set @a *url to NULL.
7674 *
7675 * Use @a ctx->wc_ctx to retrieve the information. Use
7676 ** @a scratch_pool for temporary allocations.
7677 *
7678 * @since New in 1.7.
7679 */
7680svn_error_t *
7681svn_client_url_from_path2(const char **url,
7682                          const char *path_or_url,
7683                          svn_client_ctx_t *ctx,
7684                          apr_pool_t *result_pool,
7685                          apr_pool_t *scratch_pool);
7686
7687/** Similar to svn_client_url_from_path2(), but without a context argument.
7688 *
7689 * @since New in 1.5.
7690 * @deprecated Provided for backward compatibility with the 1.6 API.
7691 */
7692SVN_DEPRECATED
7693svn_error_t *
7694svn_client_url_from_path(const char **url,
7695                         const char *path_or_url,
7696                         apr_pool_t *pool);
7697
7698
7699
7700/* Fetching a repository's root URL and UUID. */
7701
7702/** Set @a *repos_root_url and @a *repos_uuid, to the root URL and UUID of
7703 * the repository in which @a abspath_or_url is versioned. Use the
7704 * authentication baton and working copy context cached in @a ctx as
7705 * necessary. @a repos_root_url and/or @a repos_uuid may be NULL if not
7706 * wanted.
7707 *
7708 * This function will open a temporary RA session to the repository if
7709 * necessary to get the information.
7710 *
7711 * Allocate @a *repos_root_url and @a *repos_uuid in @a result_pool.
7712 * Use @a scratch_pool for temporary allocations.
7713 *
7714 * @since New in 1.8.
7715 */
7716svn_error_t *
7717svn_client_get_repos_root(const char **repos_root_url,
7718                          const char **repos_uuid,
7719                          const char *abspath_or_url,
7720                          svn_client_ctx_t *ctx,
7721                          apr_pool_t *result_pool,
7722                          apr_pool_t *scratch_pool);
7723
7724/** Set @a *url to the repository root URL of the repository in which
7725 * @a path_or_url is versioned (or scheduled to be versioned),
7726 * allocated in @a pool.  @a ctx is required for possible repository
7727 * authentication.
7728 *
7729 * @since New in 1.5.
7730 * @deprecated Provided for backward compatibility with the 1.7 API. Use
7731 * svn_client_get_repos_root() instead, with an absolute path.
7732 */
7733SVN_DEPRECATED
7734svn_error_t *
7735svn_client_root_url_from_path(const char **url,
7736                              const char *path_or_url,
7737                              svn_client_ctx_t *ctx,
7738                              apr_pool_t *pool);
7739
7740/** Get repository @a uuid for @a url.
7741 *
7742 * Use a @a pool to open a temporary RA session to @a url, discover the
7743 * repository uuid, and free the session.  Return the uuid in @a uuid,
7744 * allocated in @a pool.  @a ctx is required for possible repository
7745 * authentication.
7746 *
7747 * @deprecated Provided for backward compatibility with the 1.7 API. Use
7748 * svn_client_get_repos_root() instead.
7749 */
7750SVN_DEPRECATED
7751svn_error_t *
7752svn_client_uuid_from_url(const char **uuid,
7753                         const char *url,
7754                         svn_client_ctx_t *ctx,
7755                         apr_pool_t *pool);
7756
7757
7758/** Return the repository @a uuid for working-copy @a local_abspath,
7759 * allocated in @a result_pool.  Use @a ctx->wc_ctx to retrieve the
7760 * information.
7761 *
7762 * Use @a scratch_pool for temporary allocations.
7763 *
7764 * @since New in 1.7.
7765 * @deprecated Provided for backward compatibility with the 1.7 API. Use
7766 * svn_client_get_repos_root() instead.
7767 */
7768SVN_DEPRECATED
7769svn_error_t *
7770svn_client_uuid_from_path2(const char **uuid,
7771                           const char *local_abspath,
7772                           svn_client_ctx_t *ctx,
7773                           apr_pool_t *result_pool,
7774                           apr_pool_t *scratch_pool);
7775
7776/** Similar to svn_client_uuid_from_path2(), but with a relative path and
7777 * an access baton.
7778 *
7779 * @deprecated Provided for backward compatibility with the 1.6 API.
7780 */
7781SVN_DEPRECATED
7782svn_error_t *
7783svn_client_uuid_from_path(const char **uuid,
7784                          const char *path,
7785                          svn_wc_adm_access_t *adm_access,
7786                          svn_client_ctx_t *ctx,
7787                          apr_pool_t *pool);
7788
7789
7790/* Opening RA sessions. */
7791
7792/** Open an RA session rooted at @a url, and return it in @a *session.
7793 *
7794 * Use the authentication baton stored in @a ctx for authentication.
7795 * @a *session is allocated in @a result_pool.
7796 *
7797 * If @a wri_abspath is not NULL, use the working copy identified by @a
7798 * wri_abspath to potentially avoid transferring unneeded data.
7799 *
7800 * @note This function is similar to svn_ra_open4(), but the caller avoids
7801 * having to providing its own callback functions.
7802 * @since New in 1.8.
7803 */
7804svn_error_t *
7805svn_client_open_ra_session2(svn_ra_session_t **session,
7806                           const char *url,
7807                           const char *wri_abspath,
7808                           svn_client_ctx_t *ctx,
7809                           apr_pool_t *result_pool,
7810                           apr_pool_t *scratch_pool);
7811
7812/** Similar to svn_client_open_ra_session2(), but with @ wri_abspath
7813 * always passed as NULL, and with the same pool used as both @a
7814 * result_pool and @a scratch_pool.
7815 *
7816 * @since New in 1.3.
7817 * @deprecated Provided for backward compatibility with the 1.7 API.
7818 */
7819SVN_DEPRECATED
7820svn_error_t *
7821svn_client_open_ra_session(svn_ra_session_t **session,
7822                           const char *url,
7823                           svn_client_ctx_t *ctx,
7824                           apr_pool_t *pool);
7825
7826
7827/** @} end group: Client session related functions */
7828
7829/** @} */
7830
7831#ifdef __cplusplus
7832}
7833#endif /* __cplusplus */
7834
7835#endif  /* SVN_CLIENT_H */
7836