cl.h revision 262253
1/*
2 * cl.h:  shared stuff in the command line program
3 *
4 * ====================================================================
5 *    Licensed to the Apache Software Foundation (ASF) under one
6 *    or more contributor license agreements.  See the NOTICE file
7 *    distributed with this work for additional information
8 *    regarding copyright ownership.  The ASF licenses this file
9 *    to you under the Apache License, Version 2.0 (the
10 *    "License"); you may not use this file except in compliance
11 *    with the License.  You may obtain a copy of the License at
12 *
13 *      http://www.apache.org/licenses/LICENSE-2.0
14 *
15 *    Unless required by applicable law or agreed to in writing,
16 *    software distributed under the License is distributed on an
17 *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
18 *    KIND, either express or implied.  See the License for the
19 *    specific language governing permissions and limitations
20 *    under the License.
21 * ====================================================================
22 */
23
24/* ==================================================================== */
25
26
27
28#ifndef SVN_CL_H
29#define SVN_CL_H
30
31/*** Includes. ***/
32#include <apr_tables.h>
33#include <apr_getopt.h>
34
35#include "svn_wc.h"
36#include "svn_client.h"
37#include "svn_string.h"
38#include "svn_opt.h"
39#include "svn_auth.h"
40#include "svn_cmdline.h"
41
42#ifdef __cplusplus
43extern "C" {
44#endif /* __cplusplus */
45
46
47/*** Option processing ***/
48
49/* --accept actions */
50typedef enum svn_cl__accept_t
51{
52  /* invalid accept action */
53  svn_cl__accept_invalid = -2,
54
55  /* unspecified accept action */
56  svn_cl__accept_unspecified = -1,
57
58  /* Leave conflicts alone, for later resolution. */
59  svn_cl__accept_postpone,
60
61  /* Resolve the conflict with the pre-conflict base file. */
62  svn_cl__accept_base,
63
64  /* Resolve the conflict with the current working file. */
65  svn_cl__accept_working,
66
67  /* Resolve the conflicted hunks by choosing the corresponding text
68     from the pre-conflict working copy file. */
69  svn_cl__accept_mine_conflict,
70
71  /* Resolve the conflicted hunks by choosing the corresponding text
72     from the post-conflict base copy file. */
73  svn_cl__accept_theirs_conflict,
74
75  /* Resolve the conflict by taking the entire pre-conflict working
76     copy file. */
77  svn_cl__accept_mine_full,
78
79  /* Resolve the conflict by taking the entire post-conflict base file. */
80  svn_cl__accept_theirs_full,
81
82  /* Launch user's editor and resolve conflict with edited file. */
83  svn_cl__accept_edit,
84
85  /* Launch user's resolver and resolve conflict with edited file. */
86  svn_cl__accept_launch
87
88} svn_cl__accept_t;
89
90/* --accept action user input words */
91#define SVN_CL__ACCEPT_POSTPONE "postpone"
92#define SVN_CL__ACCEPT_BASE "base"
93#define SVN_CL__ACCEPT_WORKING "working"
94#define SVN_CL__ACCEPT_MINE_CONFLICT "mine-conflict"
95#define SVN_CL__ACCEPT_THEIRS_CONFLICT "theirs-conflict"
96#define SVN_CL__ACCEPT_MINE_FULL "mine-full"
97#define SVN_CL__ACCEPT_THEIRS_FULL "theirs-full"
98#define SVN_CL__ACCEPT_EDIT "edit"
99#define SVN_CL__ACCEPT_LAUNCH "launch"
100
101/* Return the svn_cl__accept_t value corresponding to WORD, using exact
102 * case-sensitive string comparison. Return svn_cl__accept_invalid if WORD
103 * is empty or is not one of the known values. */
104svn_cl__accept_t
105svn_cl__accept_from_word(const char *word);
106
107
108/*** Mergeinfo flavors. ***/
109
110/* --show-revs values */
111typedef enum svn_cl__show_revs_t {
112  svn_cl__show_revs_invalid = -1,
113  svn_cl__show_revs_merged,
114  svn_cl__show_revs_eligible
115} svn_cl__show_revs_t;
116
117/* --show-revs user input words */
118#define SVN_CL__SHOW_REVS_MERGED   "merged"
119#define SVN_CL__SHOW_REVS_ELIGIBLE "eligible"
120
121/* Return svn_cl__show_revs_t value corresponding to word. */
122svn_cl__show_revs_t
123svn_cl__show_revs_from_word(const char *word);
124
125
126/*** Command dispatch. ***/
127
128/* Hold results of option processing that are shared by multiple
129   commands. */
130typedef struct svn_cl__opt_state_t
131{
132  /* An array of svn_opt_revision_range_t *'s representing revisions
133     ranges indicated on the command-line via the -r and -c options.
134     For each range in the list, if only one revision was provided
135     (-rN), its 'end' member remains 'svn_opt_revision_unspecified'.
136     This array always has at least one element, even if that is a
137     null range in which both ends are 'svn_opt_revision_unspecified'. */
138  apr_array_header_t *revision_ranges;
139
140  /* These are simply a copy of the range start and end values present
141     in the first item of the revision_ranges list. */
142  svn_opt_revision_t start_revision;
143  svn_opt_revision_t end_revision;
144
145  /* Flag which is only set if the '-c' option was used. */
146  svn_boolean_t used_change_arg;
147
148  /* Flag which is only set if the '-r' option was used. */
149  svn_boolean_t used_revision_arg;
150
151  /* Max number of log messages to get back from svn_client_log2. */
152  int limit;
153
154  /* After option processing is done, reflects the switch actually
155     given on the command line, or svn_depth_unknown if none. */
156  svn_depth_t depth;
157
158  /* Was --no-unlock specified? */
159  svn_boolean_t no_unlock;
160
161  const char *message;           /* log message */
162  svn_boolean_t force;           /* be more forceful, as in "svn rm -f ..." */
163  svn_boolean_t force_log;       /* force validity of a suspect log msg file */
164  svn_boolean_t incremental;     /* yield output suitable for concatenation */
165  svn_boolean_t quiet;           /* sssh...avoid unnecessary output */
166  svn_boolean_t non_interactive; /* do no interactive prompting */
167  svn_boolean_t version;         /* print version information */
168  svn_boolean_t verbose;         /* be verbose */
169  svn_boolean_t update;          /* contact the server for the full story */
170  svn_boolean_t strict;          /* do strictly what was requested */
171  svn_stringbuf_t *filedata;     /* contents of file used as option data */
172  const char *encoding;          /* the locale/encoding of the data*/
173  svn_boolean_t help;            /* print usage message */
174  const char *auth_username;     /* auth username */ /* UTF-8! */
175  const char *auth_password;     /* auth password */ /* UTF-8! */
176  const char *extensions;        /* subprocess extension args */ /* UTF-8! */
177  apr_array_header_t *targets;   /* target list from file */ /* UTF-8! */
178  svn_boolean_t xml;             /* output in xml, e.g., "svn log --xml" */
179  svn_boolean_t no_ignore;       /* disregard default ignores & svn:ignore's */
180  svn_boolean_t no_auth_cache;   /* do not cache authentication information */
181  struct
182    {
183  const char *diff_cmd;              /* the external diff command to use */
184  svn_boolean_t internal_diff;       /* override diff_cmd in config file */
185  svn_boolean_t no_diff_added;       /* do not show diffs for deleted files */
186  svn_boolean_t no_diff_deleted;     /* do not show diffs for deleted files */
187  svn_boolean_t show_copies_as_adds; /* do not diff copies with their source */
188  svn_boolean_t notice_ancestry;     /* notice ancestry for diff-y operations */
189  svn_boolean_t summarize;           /* create a summary of a diff */
190  svn_boolean_t use_git_diff_format; /* Use git's extended diff format */
191  svn_boolean_t ignore_properties;   /* ignore properties */
192  svn_boolean_t properties_only;     /* Show properties only */
193  svn_boolean_t patch_compatible;    /* Output compatible with GNU patch */
194    } diff;
195  svn_boolean_t ignore_ancestry; /* ignore ancestry for merge-y operations */
196  svn_boolean_t ignore_externals;/* ignore externals definitions */
197  svn_boolean_t stop_on_copy;    /* don't cross copies during processing */
198  svn_boolean_t dry_run;         /* try operation but make no changes */
199  svn_boolean_t revprop;         /* operate on a revision property */
200  const char *merge_cmd;         /* the external merge command to use */
201  const char *editor_cmd;        /* the external editor command to use */
202  svn_boolean_t record_only;     /* whether to record mergeinfo */
203  const char *old_target;        /* diff target */
204  const char *new_target;        /* diff target */
205  svn_boolean_t relocate;        /* rewrite urls (svn switch) */
206  const char *config_dir;        /* over-riding configuration directory */
207  apr_array_header_t *config_options; /* over-riding configuration options */
208  svn_boolean_t autoprops;       /* enable automatic properties */
209  svn_boolean_t no_autoprops;    /* disable automatic properties */
210  const char *native_eol;        /* override system standard eol marker */
211  svn_boolean_t remove;          /* deassociate a changelist */
212  apr_array_header_t *changelists; /* changelist filters */
213  const char *changelist;        /* operate on this changelist
214                                    THIS IS TEMPORARY (LAST OF CHANGELISTS) */
215  svn_boolean_t keep_changelists;/* don't remove changelists after commit */
216  svn_boolean_t keep_local;      /* delete path only from repository */
217  svn_boolean_t all_revprops;    /* retrieve all revprops */
218  svn_boolean_t no_revprops;     /* retrieve no revprops */
219  apr_hash_t *revprop_table;     /* table of revision properties to get/set */
220  svn_boolean_t parents;         /* create intermediate directories */
221  svn_boolean_t use_merge_history; /* use/display extra merge information */
222  svn_cl__accept_t accept_which;   /* how to handle conflicts */
223  svn_cl__show_revs_t show_revs;   /* mergeinfo flavor */
224  svn_depth_t set_depth;           /* new sticky ambient depth value */
225  svn_boolean_t reintegrate;      /* use "reintegrate" merge-source heuristic */
226  svn_boolean_t trust_server_cert; /* trust server SSL certs that would
227                                      otherwise be rejected as "untrusted" */
228  int strip; /* number of leading path components to strip */
229  svn_boolean_t ignore_keywords;   /* do not expand keywords */
230  svn_boolean_t reverse_diff;      /* reverse a diff (e.g. when patching) */
231  svn_boolean_t ignore_whitespace; /* don't account for whitespace when
232                                      patching */
233  svn_boolean_t show_diff;         /* produce diff output (maps to --diff) */
234  svn_boolean_t allow_mixed_rev;   /* Allow operation on mixed-revision WC */
235  svn_boolean_t include_externals; /* Recurses (in)to file & dir externals */
236  svn_boolean_t show_inherited_props;  /* get inherited properties */
237  apr_array_header_t* search_patterns; /* pattern arguments for --search */
238} svn_cl__opt_state_t;
239
240
241typedef struct svn_cl__cmd_baton_t
242{
243  svn_cl__opt_state_t *opt_state;
244  svn_client_ctx_t *ctx;
245} svn_cl__cmd_baton_t;
246
247
248/* Declare all the command procedures */
249svn_opt_subcommand_t
250  svn_cl__add,
251  svn_cl__blame,
252  svn_cl__cat,
253  svn_cl__changelist,
254  svn_cl__checkout,
255  svn_cl__cleanup,
256  svn_cl__commit,
257  svn_cl__copy,
258  svn_cl__delete,
259  svn_cl__diff,
260  svn_cl__export,
261  svn_cl__help,
262  svn_cl__import,
263  svn_cl__info,
264  svn_cl__lock,
265  svn_cl__log,
266  svn_cl__list,
267  svn_cl__merge,
268  svn_cl__mergeinfo,
269  svn_cl__mkdir,
270  svn_cl__move,
271  svn_cl__patch,
272  svn_cl__propdel,
273  svn_cl__propedit,
274  svn_cl__propget,
275  svn_cl__proplist,
276  svn_cl__propset,
277  svn_cl__relocate,
278  svn_cl__revert,
279  svn_cl__resolve,
280  svn_cl__resolved,
281  svn_cl__status,
282  svn_cl__switch,
283  svn_cl__unlock,
284  svn_cl__update,
285  svn_cl__upgrade;
286
287
288/* See definition in svn.c for documentation. */
289extern const svn_opt_subcommand_desc2_t svn_cl__cmd_table[];
290
291/* See definition in svn.c for documentation. */
292extern const int svn_cl__global_options[];
293
294/* See definition in svn.c for documentation. */
295extern const apr_getopt_option_t svn_cl__options[];
296
297
298/* A helper for the many subcommands that wish to merely warn when
299 * invoked on an unversioned, nonexistent, or otherwise innocuously
300 * errorful resource.  Meant to be wrapped with SVN_ERR().
301 *
302 * If ERR is null, return SVN_NO_ERROR.
303 *
304 * Else if ERR->apr_err is one of the error codes supplied in varargs,
305 * then handle ERR as a warning (unless QUIET is true), clear ERR, and
306 * return SVN_NO_ERROR, and push the value of ERR->apr_err into the
307 * ERRORS_SEEN array, if ERRORS_SEEN is not NULL.
308 *
309 * Else return ERR.
310 *
311 * Typically, error codes like SVN_ERR_UNVERSIONED_RESOURCE,
312 * SVN_ERR_ENTRY_NOT_FOUND, etc, are supplied in varargs.  Don't
313 * forget to terminate the argument list with SVN_NO_ERROR.
314 */
315svn_error_t *
316svn_cl__try(svn_error_t *err,
317            apr_array_header_t *errors_seen,
318            svn_boolean_t quiet,
319            ...);
320
321
322/* Our cancellation callback. */
323svn_error_t *
324svn_cl__check_cancel(void *baton);
325
326
327
328/* Various conflict-resolution callbacks. */
329
330/* Opaque baton type for svn_cl__conflict_func_interactive(). */
331typedef struct svn_cl__interactive_conflict_baton_t
332  svn_cl__interactive_conflict_baton_t;
333
334/* Conflict stats for operations such as update and merge. */
335typedef struct svn_cl__conflict_stats_t svn_cl__conflict_stats_t;
336
337/* Return a new, initialized, conflict stats structure, allocated in
338 * POOL. */
339svn_cl__conflict_stats_t *
340svn_cl__conflict_stats_create(apr_pool_t *pool);
341
342/* Update CONFLICT_STATS to reflect that a conflict on PATH_LOCAL of kind
343 * CONFLICT_KIND is resolved.  (There is no support for updating the
344 * 'skipped paths' stats, since skips cannot be 'resolved'.) */
345void
346svn_cl__conflict_stats_resolved(svn_cl__conflict_stats_t *conflict_stats,
347                                const char *path_local,
348                                svn_wc_conflict_kind_t conflict_kind);
349
350
351/* Create and return an baton for use with svn_cl__conflict_func_interactive
352 * in *B, allocated from RESULT_POOL, and initialised with the values
353 * ACCEPT_WHICH, CONFIG, EDITOR_CMD, CANCEL_FUNC and CANCEL_BATON. */
354svn_error_t *
355svn_cl__get_conflict_func_interactive_baton(
356  svn_cl__interactive_conflict_baton_t **b,
357  svn_cl__accept_t accept_which,
358  apr_hash_t *config,
359  const char *editor_cmd,
360  svn_cl__conflict_stats_t *conflict_stats,
361  svn_cancel_func_t cancel_func,
362  void *cancel_baton,
363  apr_pool_t *result_pool);
364
365/* A callback capable of doing interactive conflict resolution.
366
367   The BATON must come from svn_cl__get_conflict_func_interactive_baton().
368   Resolves based on the --accept option if one was given to that function,
369   otherwise prompts the user to choose one of the three fulltexts, edit
370   the merged file on the spot, or just skip the conflict (to be resolved
371   later), among other options.
372
373   Implements svn_wc_conflict_resolver_func2_t.
374 */
375svn_error_t *
376svn_cl__conflict_func_interactive(svn_wc_conflict_result_t **result,
377                                  const svn_wc_conflict_description2_t *desc,
378                                  void *baton,
379                                  apr_pool_t *result_pool,
380                                  apr_pool_t *scratch_pool);
381
382
383/*** Command-line output functions -- printing to the user. ***/
384
385/* Print out commit information found in COMMIT_INFO to the console.
386 * POOL is used for temporay allocations.
387 * COMMIT_INFO should not be NULL.
388 *
389 * This function implements svn_commit_callback2_t.
390 */
391svn_error_t *
392svn_cl__print_commit_info(const svn_commit_info_t *commit_info,
393                          void *baton,
394                          apr_pool_t *pool);
395
396
397/* Convert the date in DATA to a human-readable UTF-8-encoded string
398 * *HUMAN_CSTRING, or set the latter to "(invalid date)" if DATA is not
399 * a valid date.  DATA should be as expected by svn_time_from_cstring().
400 *
401 * Do all allocations in POOL.
402 */
403svn_error_t *
404svn_cl__time_cstring_to_human_cstring(const char **human_cstring,
405                                      const char *data,
406                                      apr_pool_t *pool);
407
408
409/* Print STATUS for PATH to stdout for human consumption.  Prints in
410   abbreviated format by default, or DETAILED format if flag is set.
411
412   When SUPPRESS_EXTERNALS_PLACEHOLDERS is set, avoid printing
413   externals placeholder lines ("X lines").
414
415   When DETAILED is set, use SHOW_LAST_COMMITTED to toggle display of
416   the last-committed-revision and last-committed-author.
417
418   If SKIP_UNRECOGNIZED is TRUE, this function will not print out
419   unversioned items found in the working copy.
420
421   When DETAILED is set, and REPOS_LOCKS is set, treat missing repository locks
422   as broken WC locks.
423
424   Increment *TEXT_CONFLICTS, *PROP_CONFLICTS, or *TREE_CONFLICTS if
425   a conflict was encountered.
426
427   Use TARGET_ABSPATH and TARGET_PATH to shorten PATH into something
428   relative to the target as necessary.
429*/
430svn_error_t *
431svn_cl__print_status(const char *target_abspath,
432                     const char *target_path,
433                     const char *path,
434                     const svn_client_status_t *status,
435                     svn_boolean_t suppress_externals_placeholders,
436                     svn_boolean_t detailed,
437                     svn_boolean_t show_last_committed,
438                     svn_boolean_t skip_unrecognized,
439                     svn_boolean_t repos_locks,
440                     unsigned int *text_conflicts,
441                     unsigned int *prop_conflicts,
442                     unsigned int *tree_conflicts,
443                     svn_client_ctx_t *ctx,
444                     apr_pool_t *pool);
445
446
447/* Print STATUS for PATH in XML to stdout.  Use POOL for temporary
448   allocations.
449
450   Use TARGET_ABSPATH and TARGET_PATH to shorten PATH into something
451   relative to the target as necessary.
452 */
453svn_error_t *
454svn_cl__print_status_xml(const char *target_abspath,
455                         const char *target_path,
456                         const char *path,
457                         const svn_client_status_t *status,
458                         svn_client_ctx_t *ctx,
459                         apr_pool_t *pool);
460
461/* Output a commit xml element to *OUTSTR.  If *OUTSTR is NULL, allocate it
462   first from POOL, otherwise append to it.  If AUTHOR or DATE is
463   NULL, it will be omitted. */
464void
465svn_cl__print_xml_commit(svn_stringbuf_t **outstr,
466                         svn_revnum_t revision,
467                         const char *author,
468                         const char *date,
469                         apr_pool_t *pool);
470
471/* Output an XML "<lock>" element describing LOCK to *OUTSTR.  If *OUTSTR is
472   NULL, allocate it first from POOL, otherwise append to it. */
473void
474svn_cl__print_xml_lock(svn_stringbuf_t **outstr,
475                       const svn_lock_t *lock,
476                       apr_pool_t *pool);
477
478/* Do the following things that are commonly required before accessing revision
479   properties.  Ensure that REVISION is specified explicitly and is not
480   relative to a working-copy item.  Ensure that exactly one target is
481   specified in TARGETS.  Set *URL to the URL of the target.  Return an
482   appropriate error if any of those checks or operations fail. Use CTX for
483   accessing the working copy
484 */
485svn_error_t *
486svn_cl__revprop_prepare(const svn_opt_revision_t *revision,
487                        const apr_array_header_t *targets,
488                        const char **URL,
489                        svn_client_ctx_t *ctx,
490                        apr_pool_t *pool);
491
492/* Search for a merge tool command in environment variables,
493   and use it to perform the merge of the four given files.
494   WC_PATH is the path of the file that is in conflict, relative
495   to the merge target.
496   Use POOL for all allocations.
497
498   CONFIG is a hash of svn_config_t * items keyed on a configuration
499   category (SVN_CONFIG_CATEGORY_CONFIG et al), and may be NULL.
500
501   Upon success, set *REMAINS_IN_CONFLICT to indicate whether the
502   merge result contains conflict markers.
503   */
504svn_error_t *
505svn_cl__merge_file_externally(const char *base_path,
506                              const char *their_path,
507                              const char *my_path,
508                              const char *merged_path,
509                              const char *wc_path,
510                              apr_hash_t *config,
511                              svn_boolean_t *remains_in_conflict,
512                              apr_pool_t *pool);
513
514/* Like svn_cl__merge_file_externally, but using a built-in merge tool
515 * with help from an external editor specified by EDITOR_CMD. */
516svn_error_t *
517svn_cl__merge_file(const char *base_path,
518                   const char *their_path,
519                   const char *my_path,
520                   const char *merged_path,
521                   const char *wc_path,
522                   const char *path_prefix,
523                   const char *editor_cmd,
524                   apr_hash_t *config,
525                   svn_boolean_t *remains_in_conflict,
526                   apr_pool_t *scratch_pool);
527
528
529/*** Notification functions to display results on the terminal. */
530
531/* Set *NOTIFY_FUNC_P and *NOTIFY_BATON_P to a notifier/baton for all
532 * operations, allocated in POOL.
533 */
534svn_error_t *
535svn_cl__get_notifier(svn_wc_notify_func2_t *notify_func_p,
536                     void **notify_baton_p,
537                     svn_cl__conflict_stats_t *conflict_stats,
538                     apr_pool_t *pool);
539
540/* Make the notifier for use with BATON print the appropriate summary
541 * line at the end of the output.
542 */
543svn_error_t *
544svn_cl__notifier_mark_checkout(void *baton);
545
546/* Make the notifier for use with BATON print the appropriate summary
547 * line at the end of the output.
548 */
549svn_error_t *
550svn_cl__notifier_mark_export(void *baton);
551
552/* Make the notifier for use with BATON print the appropriate notifications
553 * for a wc to repository copy
554 */
555svn_error_t *
556svn_cl__notifier_mark_wc_to_repos_copy(void *baton);
557
558/* Baton for use with svn_cl__check_externals_failed_notify_wrapper(). */
559struct svn_cl__check_externals_failed_notify_baton
560{
561  svn_wc_notify_func2_t wrapped_func; /* The "real" notify_func2. */
562  void *wrapped_baton;                /* The "real" notify_func2 baton. */
563  svn_boolean_t had_externals_error;  /* Did something fail in an external? */
564};
565
566/* Notification function wrapper (implements `svn_wc_notify_func2_t').
567   Use with an svn_cl__check_externals_failed_notify_baton BATON. */
568void
569svn_cl__check_externals_failed_notify_wrapper(void *baton,
570                                              const svn_wc_notify_t *n,
571                                              apr_pool_t *pool);
572
573/* Print the conflict stats accumulated in BATON, which is the
574 * notifier baton from svn_cl__get_notifier().
575 * Return any error encountered during printing.
576 */
577svn_error_t *
578svn_cl__notifier_print_conflict_stats(void *baton, apr_pool_t *scratch_pool);
579
580
581/*** Log message callback stuffs. ***/
582
583/* Allocate in POOL a baton for use with svn_cl__get_log_message().
584
585   OPT_STATE is the set of command-line options given.
586
587   BASE_DIR is a directory in which to create temporary files if an
588   external editor is used to edit the log message.  If BASE_DIR is
589   NULL, the current working directory (`.') will be used, and
590   therefore the user must have the proper permissions on that
591   directory.  ### todo: What *should* happen in the NULL case is that
592   we ask APR to tell us where a suitable tmp directory is (like, /tmp
593   on Unix and C:\Windows\Temp on Win32 or something), and use it.
594   But APR doesn't yet have that capability.
595
596   CONFIG is a client configuration hash of svn_config_t * items keyed
597   on config categories, and may be NULL.
598
599   NOTE: While the baton itself will be allocated from POOL, the items
600   add to it are added by reference, not duped into POOL!*/
601svn_error_t *
602svn_cl__make_log_msg_baton(void **baton,
603                           svn_cl__opt_state_t *opt_state,
604                           const char *base_dir,
605                           apr_hash_t *config,
606                           apr_pool_t *pool);
607
608/* A function of type svn_client_get_commit_log3_t. */
609svn_error_t *
610svn_cl__get_log_message(const char **log_msg,
611                        const char **tmp_file,
612                        const apr_array_header_t *commit_items,
613                        void *baton,
614                        apr_pool_t *pool);
615
616/* Handle the cleanup of a log message, using the data in the
617   LOG_MSG_BATON, in the face of COMMIT_ERR.  This may mean removing a
618   temporary file left by an external editor, or it may be a complete
619   no-op.  COMMIT_ERR may be NULL to indicate to indicate that the
620   function should act as though no commit error occurred. Use POOL
621   for temporary allocations.
622
623   All error returns from this function are guaranteed to at least
624   include COMMIT_ERR, and perhaps additional errors attached to the
625   end of COMMIT_ERR's chain.  */
626svn_error_t *
627svn_cl__cleanup_log_msg(void *log_msg_baton,
628                        svn_error_t *commit_err,
629                        apr_pool_t *pool);
630
631/* Add a message about --force if appropriate */
632svn_error_t *
633svn_cl__may_need_force(svn_error_t *err);
634
635/* Write the STRING to the stdio STREAM, returning an error if it fails.
636
637   This function is equal to svn_cmdline_fputs() minus the utf8->local
638   encoding translation.  */
639svn_error_t *
640svn_cl__error_checked_fputs(const char *string, FILE* stream);
641
642/* If STRING is non-null, append it, wrapped in a simple XML CDATA element
643   named TAGNAME, to the string SB.  Use POOL for temporary allocations. */
644void
645svn_cl__xml_tagged_cdata(svn_stringbuf_t **sb,
646                         apr_pool_t *pool,
647                         const char *tagname,
648                         const char *string);
649
650/* Print the XML prolog and document root element start-tag to stdout, using
651   TAGNAME as the root element name.  Use POOL for temporary allocations. */
652svn_error_t *
653svn_cl__xml_print_header(const char *tagname, apr_pool_t *pool);
654
655/* Print the XML document root element end-tag to stdout, using TAGNAME as the
656   root element name.  Use POOL for temporary allocations. */
657svn_error_t *
658svn_cl__xml_print_footer(const char *tagname, apr_pool_t *pool);
659
660
661/* For use in XML output, return a non-localised string representation
662 * of KIND, being "none" or "dir" or "file" or, in any other case,
663 * the empty string. */
664const char *
665svn_cl__node_kind_str_xml(svn_node_kind_t kind);
666
667/* Return a (possibly localised) string representation of KIND, being "none" or
668   "dir" or "file" or, in any other case, the empty string. */
669const char *
670svn_cl__node_kind_str_human_readable(svn_node_kind_t kind);
671
672
673/** Provides an XML name for a given OPERATION.
674 * Note: POOL is currently not used.
675 */
676const char *
677svn_cl__operation_str_xml(svn_wc_operation_t operation, apr_pool_t *pool);
678
679/** Return a possibly localized human readable string for
680 * a given OPERATION.
681 * Note: POOL is currently not used.
682 */
683const char *
684svn_cl__operation_str_human_readable(svn_wc_operation_t operation,
685                                     apr_pool_t *pool);
686
687
688/* What use is a property name intended for.
689   Used by svn_cl__check_svn_prop_name to customize error messages. */
690typedef enum svn_cl__prop_use_e
691  {
692    svn_cl__prop_use_set,       /* setting the property */
693    svn_cl__prop_use_edit,      /* editing the property */
694    svn_cl__prop_use_use        /* using the property name */
695  }
696svn_cl__prop_use_t;
697
698/* If PROPNAME looks like but is not identical to one of the svn:
699 * poperties, raise an error and suggest a better spelling. Names that
700 * raise errors look like this:
701 *
702 *   - start with svn: but do not exactly match a known property; or,
703 *   - start with a 3-letter prefix that differs in only one letter
704 *     from "svn:", and the rest exactly matches a known propery.
705 *
706 * If REVPROP is TRUE, only check revision property names; otherwise
707 * only check node property names.
708 *
709 * Use SCRATCH_POOL for temporary allocations.
710 */
711svn_error_t *
712svn_cl__check_svn_prop_name(const char *propname,
713                            svn_boolean_t revprop,
714                            svn_cl__prop_use_t prop_use,
715                            apr_pool_t *scratch_pool);
716
717/* If PROPNAME is one of the svn: properties with a boolean value, and
718 * PROPVAL looks like an attempt to turn the property off (i.e., it's
719 * "off", "no", "false", or ""), then print a warning to the user that
720 * setting the property to this value might not do what they expect.
721 * Perform temporary allocations in POOL.
722 */
723void
724svn_cl__check_boolean_prop_val(const char *propname,
725                               const char *propval,
726                               apr_pool_t *pool);
727
728/* De-streamifying wrapper around svn_client_get_changelists(), which
729   is called for each target in TARGETS to populate *PATHS (a list of
730   paths assigned to one of the CHANGELISTS.
731   If all targets are to be included, may set *PATHS to TARGETS without
732   reallocating. */
733svn_error_t *
734svn_cl__changelist_paths(apr_array_header_t **paths,
735                         const apr_array_header_t *changelists,
736                         const apr_array_header_t *targets,
737                         svn_depth_t depth,
738                         svn_client_ctx_t *ctx,
739                         apr_pool_t *result_pool,
740                         apr_pool_t *scratch_pool);
741
742/* Like svn_client_args_to_target_array() but, if the only error is that some
743 * arguments are reserved file names, then print warning messages for those
744 * targets, store the rest of the targets in TARGETS_P and return success. */
745svn_error_t *
746svn_cl__args_to_target_array_print_reserved(apr_array_header_t **targets_p,
747                                            apr_getopt_t *os,
748                                            const apr_array_header_t *known_targets,
749                                            svn_client_ctx_t *ctx,
750                                            svn_boolean_t keep_dest_origpath_on_truepath_collision,
751                                            apr_pool_t *pool);
752
753/* Return a string showing NODE's kind, URL and revision, to the extent that
754 * that information is available in NODE. If NODE itself is NULL, this prints
755 * just a 'none' node kind.
756 * WC_REPOS_ROOT_URL should reflect the target working copy's repository
757 * root URL. If NODE is from that same URL, the printed URL is abbreviated
758 * to caret notation (^/). WC_REPOS_ROOT_URL may be NULL, in which case
759 * this function tries to print the conflicted node's complete URL. */
760const char *
761svn_cl__node_description(const svn_wc_conflict_version_t *node,
762                         const char *wc_repos_root_URL,
763                         apr_pool_t *pool);
764
765/* Return, in @a *true_targets_p, a shallow copy of @a targets with any
766 * empty peg revision specifier snipped off the end of each element.  If any
767 * target has a non-empty peg revision specifier, throw an error.  The user
768 * may have specified a peg revision where it doesn't make sense to do so,
769 * or may have forgotten to escape an '@' character in a filename.
770 *
771 * This function is useful for subcommands for which peg revisions
772 * do not make any sense. Such subcommands still need to allow an empty
773 * peg revision to be specified on the command line so that users of
774 * the command line client can consistently escape '@' characters
775 * in filenames by appending an '@' character, regardless of the
776 * subcommand being used.
777 *
778 * It is safe to pass the address of @a targets as @a true_targets_p.
779 *
780 * Do all allocations in @a pool. */
781svn_error_t *
782svn_cl__eat_peg_revisions(apr_array_header_t **true_targets_p,
783                          const apr_array_header_t *targets,
784                          apr_pool_t *pool);
785
786/* Return an error if TARGETS contains a mixture of URLs and paths; otherwise
787 * return SVN_NO_ERROR. */
788svn_error_t *
789svn_cl__assert_homogeneous_target_type(const apr_array_header_t *targets);
790
791/* Return an error if TARGETS contains a URL; otherwise return SVN_NO_ERROR. */
792svn_error_t *
793svn_cl__check_targets_are_local_paths(const apr_array_header_t *targets);
794
795/* Return an error if TARGET is a URL; otherwise return SVN_NO_ERROR. */
796svn_error_t *
797svn_cl__check_target_is_local_path(const char *target);
798
799/* Return a copy of PATH, converted to the local path style, skipping
800 * PARENT_PATH if it is non-null and is a parent of or equal to PATH.
801 *
802 * This function assumes PARENT_PATH and PATH are both absolute "dirents"
803 * or both relative "dirents". */
804const char *
805svn_cl__local_style_skip_ancestor(const char *parent_path,
806                                  const char *path,
807                                  apr_pool_t *pool);
808
809/* If the user is setting a mime-type to mark one of the TARGETS as binary,
810 * as determined by property name PROPNAME and value PROPVAL, then check
811 * whether Subversion's own binary-file detection recognizes the target as
812 * a binary file. If Subversion doesn't consider the target to be a binary
813 * file, assume the user is making an error and print a warning to inform
814 * the user that some operations might fail on the file in the future. */
815svn_error_t *
816svn_cl__propset_print_binary_mime_type_warning(apr_array_header_t *targets,
817                                               const char *propname,
818                                               const svn_string_t *propval,
819                                               apr_pool_t *scratch_pool);
820
821/* A wrapper around the deprecated svn_client_merge_reintegrate. */
822svn_error_t *
823svn_cl__deprecated_merge_reintegrate(const char *source_path_or_url,
824                                     const svn_opt_revision_t *src_peg_revision,
825                                     const char *target_wcpath,
826                                     svn_boolean_t dry_run,
827                                     const apr_array_header_t *merge_options,
828                                     svn_client_ctx_t *ctx,
829                                     apr_pool_t *pool);
830
831#ifdef __cplusplus
832}
833#endif /* __cplusplus */
834
835#endif /* SVN_CL_H */
836