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_types.h"
36#include "svn_wc.h"
37#include "svn_client.h"
38#include "svn_string.h"
39#include "svn_opt.h"
40#include "svn_auth.h"
41#include "svn_cmdline.h"
42
43#ifdef __cplusplus
44extern "C" {
45#endif /* __cplusplus */
46
47
48/*** Option processing ***/
49
50/* --accept actions */
51typedef enum svn_cl__accept_t
52{
53  /* invalid accept action */
54  svn_cl__accept_invalid = -2,
55
56  /* unspecified accept action */
57  svn_cl__accept_unspecified = -1,
58
59  /* Leave conflicts alone, for later resolution. */
60  svn_cl__accept_postpone,
61
62  /* Resolve the conflict with the pre-conflict base file. */
63  svn_cl__accept_base,
64
65  /* Resolve the conflict with the current working file. */
66  svn_cl__accept_working,
67
68  /* Resolve the conflicted hunks by choosing the corresponding text
69     from the pre-conflict working copy file. */
70  svn_cl__accept_mine_conflict,
71
72  /* Resolve the conflicted hunks by choosing the corresponding text
73     from the post-conflict base copy file. */
74  svn_cl__accept_theirs_conflict,
75
76  /* Resolve the conflict by taking the entire pre-conflict working
77     copy file. */
78  svn_cl__accept_mine_full,
79
80  /* Resolve the conflict by taking the entire post-conflict base file. */
81  svn_cl__accept_theirs_full,
82
83  /* Launch user's editor and resolve conflict with edited file. */
84  svn_cl__accept_edit,
85
86  /* Launch user's resolver and resolve conflict with edited file. */
87  svn_cl__accept_launch,
88
89  /* Use recommended resolution if available, else leave the conflict alone. */
90  svn_cl__accept_recommended
91
92} svn_cl__accept_t;
93
94/* --accept action user input words */
95#define SVN_CL__ACCEPT_POSTPONE "postpone"
96#define SVN_CL__ACCEPT_BASE "base"
97#define SVN_CL__ACCEPT_WORKING "working"
98#define SVN_CL__ACCEPT_MINE_CONFLICT "mine-conflict"
99#define SVN_CL__ACCEPT_THEIRS_CONFLICT "theirs-conflict"
100#define SVN_CL__ACCEPT_MINE_FULL "mine-full"
101#define SVN_CL__ACCEPT_THEIRS_FULL "theirs-full"
102#define SVN_CL__ACCEPT_EDIT "edit"
103#define SVN_CL__ACCEPT_LAUNCH "launch"
104#define SVN_CL__ACCEPT_RECOMMENDED "recommended"
105
106/* Return the svn_cl__accept_t value corresponding to WORD, using exact
107 * case-sensitive string comparison. Return svn_cl__accept_invalid if WORD
108 * is empty or is not one of the known values. */
109svn_cl__accept_t
110svn_cl__accept_from_word(const char *word);
111
112
113/*** Mergeinfo flavors. ***/
114
115/* --show-revs values */
116typedef enum svn_cl__show_revs_t {
117  svn_cl__show_revs_invalid = -1,
118  svn_cl__show_revs_merged,
119  svn_cl__show_revs_eligible
120} svn_cl__show_revs_t;
121
122/* --show-revs user input words */
123#define SVN_CL__SHOW_REVS_MERGED   "merged"
124#define SVN_CL__SHOW_REVS_ELIGIBLE "eligible"
125
126/* Return svn_cl__show_revs_t value corresponding to word. */
127svn_cl__show_revs_t
128svn_cl__show_revs_from_word(const char *word);
129
130
131/* Unit types for file size conversion. */
132typedef enum svn_cl__size_unit_t
133  {
134    SVN_CL__SIZE_UNIT_NONE = 0,       /* Default, no conversion. */
135    SVN_CL__SIZE_UNIT_XML = -1,       /* Conversion for XML output. */
136    SVN_CL__SIZE_UNIT_BASE_10 = 1000, /* Use base-10 SI units. */
137    SVN_CL__SIZE_UNIT_BASE_2 = 1024   /* Use base-2 SI units. */
138  } svn_cl__size_unit_t;
139
140
141/*** Command dispatch. ***/
142
143/* Hold results of option processing that are shared by multiple
144   commands. */
145typedef struct svn_cl__opt_state_t
146{
147  /* An array of svn_opt_revision_range_t *'s representing revisions
148     ranges indicated on the command-line via the -r and -c options.
149     For each range in the list, if only one revision was provided
150     (-rN), its 'end' member remains 'svn_opt_revision_unspecified'.
151     This array always has at least one element, even if that is a
152     null range in which both ends are 'svn_opt_revision_unspecified'. */
153  apr_array_header_t *revision_ranges;
154
155  /* These are simply a copy of the range start and end values present
156     in the first item of the revision_ranges list. */
157  svn_opt_revision_t start_revision;
158  svn_opt_revision_t end_revision;
159
160  /* Flag which is only set if the '-c' option was used. */
161  svn_boolean_t used_change_arg;
162
163  /* Flag which is only set if the '-r' option was used. */
164  svn_boolean_t used_revision_arg;
165
166  /* Max number of log messages to get back from svn_client_log2. */
167  int limit;
168
169  /* After option processing is done, reflects the switch actually
170     given on the command line, or svn_depth_unknown if none. */
171  svn_depth_t depth;
172
173  /* Was --no-unlock specified? */
174  svn_boolean_t no_unlock;
175
176  const char *message;           /* log message (not converted to UTF-8) */
177  svn_boolean_t force;           /* be more forceful, as in "svn rm -f ..." */
178  svn_boolean_t force_log;       /* force validity of a suspect log msg file */
179  svn_boolean_t incremental;     /* yield output suitable for concatenation */
180  svn_boolean_t quiet;           /* sssh...avoid unnecessary output */
181  svn_boolean_t non_interactive; /* do no interactive prompting */
182  svn_boolean_t version;         /* print version information */
183  svn_boolean_t verbose;         /* be verbose */
184  svn_boolean_t update;          /* contact the server for the full story */
185  svn_stringbuf_t *filedata;     /* contents of file used as option data
186                                    (not converted to UTF-8) */
187  const char *encoding;          /* the locale/encoding of 'message' and of
188                                    'filedata' (not converted to UTF-8) */
189  svn_boolean_t help;            /* print usage message */
190  const char *auth_username;     /* auth username */
191  const char *auth_password;     /* auth password */
192  svn_boolean_t auth_password_from_stdin; /* read password from stdin */
193  const char *extensions;        /* subprocess extension args */
194  apr_array_header_t *targets;   /* target list from file */
195  svn_boolean_t xml;             /* output in xml, e.g., "svn log --xml" */
196  svn_boolean_t no_ignore;       /* disregard default ignores & svn:ignore's */
197  svn_boolean_t no_auth_cache;   /* do not cache authentication information */
198  struct
199    {
200  const char *diff_cmd;              /* the external diff command to use
201                                        (not converted to UTF-8) */
202  svn_boolean_t internal_diff;       /* override diff_cmd in config file */
203  svn_boolean_t no_diff_added;       /* do not show diffs for deleted files */
204  svn_boolean_t no_diff_deleted;     /* do not show diffs for deleted files */
205  svn_boolean_t show_copies_as_adds; /* do not diff copies with their source */
206  svn_boolean_t notice_ancestry;     /* notice ancestry for diff-y operations */
207  svn_boolean_t summarize;           /* create a summary of a diff */
208  svn_boolean_t use_git_diff_format; /* Use git's extended diff format */
209  svn_boolean_t ignore_properties;   /* ignore properties */
210  svn_boolean_t properties_only;     /* Show properties only */
211  svn_boolean_t patch_compatible;    /* Output compatible with GNU patch */
212    } diff;
213  svn_boolean_t ignore_ancestry; /* ignore ancestry for merge-y operations */
214  svn_boolean_t ignore_externals;/* ignore externals definitions */
215  svn_boolean_t stop_on_copy;    /* don't cross copies during processing */
216  svn_boolean_t dry_run;         /* try operation but make no changes */
217  svn_boolean_t revprop;         /* operate on a revision property */
218  const char *merge_cmd;         /* the external merge command to use
219                                    (not converted to UTF-8) */
220  const char *editor_cmd;        /* the external editor command to use
221                                    (not converted to UTF-8) */
222  svn_boolean_t record_only;     /* whether to record mergeinfo */
223  const char *old_target;        /* diff target */
224  const char *new_target;        /* diff target */
225  svn_boolean_t relocate;        /* rewrite urls (svn switch) */
226  const char *config_dir;        /* over-riding configuration directory */
227  apr_array_header_t *config_options; /* over-riding configuration options */
228  svn_boolean_t autoprops;       /* enable automatic properties */
229  svn_boolean_t no_autoprops;    /* disable automatic properties */
230  const char *native_eol;        /* override system standard eol marker */
231  svn_boolean_t remove;          /* deassociate a changelist */
232  apr_array_header_t *changelists; /* changelist filters */
233  svn_boolean_t keep_changelists;/* don't remove changelists after commit */
234  svn_boolean_t keep_local;      /* delete path only from repository */
235  svn_boolean_t all_revprops;    /* retrieve all revprops */
236  svn_boolean_t no_revprops;     /* retrieve no revprops */
237  apr_hash_t *revprop_table;     /* table of revision properties to get/set
238                                    (not converted to UTF-8) */
239  svn_boolean_t parents;         /* create intermediate directories */
240  svn_boolean_t use_merge_history; /* use/display extra merge information */
241  svn_cl__accept_t accept_which;   /* how to handle conflicts */
242  svn_cl__show_revs_t show_revs;   /* mergeinfo flavor */
243  svn_depth_t set_depth;           /* new sticky ambient depth value */
244  svn_boolean_t reintegrate;      /* use "reintegrate" merge-source heuristic */
245  /* trust server SSL certs that would otherwise be rejected as "untrusted" */
246  svn_boolean_t trust_server_cert_unknown_ca;
247  svn_boolean_t trust_server_cert_cn_mismatch;
248  svn_boolean_t trust_server_cert_expired;
249  svn_boolean_t trust_server_cert_not_yet_valid;
250  svn_boolean_t trust_server_cert_other_failure;
251  int strip; /* number of leading path components to strip */
252  svn_boolean_t ignore_keywords;   /* do not expand keywords */
253  svn_boolean_t reverse_diff;      /* reverse a diff (e.g. when patching) */
254  svn_boolean_t ignore_whitespace; /* don't account for whitespace when
255                                      patching */
256  svn_boolean_t show_diff;         /* produce diff output (maps to --diff) */
257  svn_boolean_t allow_mixed_rev;   /* Allow operation on mixed-revision WC */
258  svn_boolean_t include_externals; /* Recurses (in)to file & dir externals */
259  svn_boolean_t show_inherited_props;  /* get inherited properties */
260  apr_array_header_t* search_patterns; /* pattern arguments for --search */
261  svn_boolean_t mergeinfo_log;     /* show log message in mergeinfo command */
262  svn_boolean_t remove_unversioned;/* remove unversioned items */
263  svn_boolean_t remove_ignored;    /* remove ignored items */
264  svn_boolean_t remove_added;      /* reverting added item also removes it */
265  svn_boolean_t no_newline;        /* do not output the trailing newline */
266  svn_boolean_t show_passwords;    /* show cached passwords */
267  svn_boolean_t pin_externals;     /* pin externals to last-changed revisions */
268  const char *show_item;           /* print only the given item */
269  svn_boolean_t adds_as_modification; /* update 'add vs add' no tree conflict */
270  svn_boolean_t vacuum_pristines; /* remove unreferenced pristines */
271  svn_boolean_t drop;             /* drop shelf after successful unshelve */
272  svn_cl__size_unit_t file_size_unit; /* file size format */
273  enum svn_cl__viewspec_t {
274      svn_cl__viewspec_unspecified = 0 /* default */,
275      svn_cl__viewspec_classic,
276      svn_cl__viewspec_svn11
277  } viewspec;                     /* value of --x-viewspec */
278} svn_cl__opt_state_t;
279
280/* Conflict stats for operations such as update and merge. */
281typedef struct svn_cl__conflict_stats_t svn_cl__conflict_stats_t;
282
283typedef struct svn_cl__cmd_baton_t
284{
285  svn_cl__opt_state_t *opt_state;
286  svn_cl__conflict_stats_t *conflict_stats;
287  svn_client_ctx_t *ctx;
288} svn_cl__cmd_baton_t;
289
290
291/* Add an identifier here for long options that don't have a short
292   option. Options that have both long and short options should just
293   use the short option letter as identifier.  */
294typedef enum svn_cl__longopt_t {
295  opt_auth_password = SVN_OPT_FIRST_LONGOPT_ID,
296  opt_auth_password_from_stdin,
297  opt_auth_username,
298  opt_autoprops,
299  opt_changelist,
300  opt_config_dir,
301  opt_config_options,
302  /* diff options */
303  opt_diff_cmd,
304  opt_internal_diff,
305  opt_no_diff_added,
306  opt_no_diff_deleted,
307  opt_show_copies_as_adds,
308  opt_notice_ancestry,
309  opt_summarize,
310  opt_use_git_diff_format,
311  opt_ignore_properties,
312  opt_properties_only,
313  opt_patch_compatible,
314  /* end of diff options */
315  opt_dry_run,
316  opt_editor_cmd,
317  opt_encoding,
318  opt_force_log,
319  opt_force,
320  opt_keep_changelists,
321  opt_ignore_ancestry,
322  opt_ignore_externals,
323  opt_incremental,
324  opt_merge_cmd,
325  opt_native_eol,
326  opt_new_cmd,
327  opt_no_auth_cache,
328  opt_no_autoprops,
329  opt_no_ignore,
330  opt_no_unlock,
331  opt_non_interactive,
332  opt_force_interactive,
333  opt_old_cmd,
334  opt_record_only,
335  opt_relocate,
336  opt_remove,
337  opt_revprop,
338  opt_stop_on_copy,
339  opt_strict,                   /* ### DEPRECATED */
340  opt_targets,
341  opt_depth,
342  opt_set_depth,
343  opt_version,
344  opt_xml,
345  opt_keep_local,
346  opt_with_revprop,
347  opt_with_all_revprops,
348  opt_with_no_revprops,
349  opt_parents,
350  opt_accept,
351  opt_show_revs,
352  opt_reintegrate,
353  opt_trust_server_cert,
354  opt_trust_server_cert_failures,
355  opt_strip,
356  opt_ignore_keywords,
357  opt_reverse_diff,
358  opt_ignore_whitespace,
359  opt_diff,
360  opt_allow_mixed_revisions,
361  opt_include_externals,
362  opt_show_inherited_props,
363  opt_search,
364  opt_search_and,
365  opt_mergeinfo_log,
366  opt_remove_unversioned,
367  opt_remove_ignored,
368  opt_remove_added,
369  opt_no_newline,
370  opt_show_passwords,
371  opt_pin_externals,
372  opt_show_item,
373  opt_adds_as_modification,
374  opt_vacuum_pristines,
375  opt_drop,
376  opt_viewspec,
377} svn_cl__longopt_t;
378
379/* Options for giving a log message.  (Some of these also have other uses.)
380 */
381#define SVN_CL__LOG_MSG_OPTIONS 'm', 'F', \
382                                opt_force_log, \
383                                opt_editor_cmd, \
384                                opt_encoding, \
385                                opt_with_revprop
386
387
388/* Declare all the command procedures */
389svn_opt_subcommand_t
390  svn_cl__add,
391  svn_cl__auth,
392  svn_cl__blame,
393  svn_cl__cat,
394  svn_cl__changelist,
395  svn_cl__checkout,
396  svn_cl__cleanup,
397  svn_cl__commit,
398  svn_cl__copy,
399  svn_cl__delete,
400  svn_cl__diff,
401  svn_cl__export,
402  svn_cl__help,
403  svn_cl__import,
404  svn_cl__info,
405  svn_cl__lock,
406  svn_cl__log,
407  svn_cl__list,
408  svn_cl__merge,
409  svn_cl__mergeinfo,
410  svn_cl__mkdir,
411  svn_cl__move,
412  svn_cl__patch,
413  svn_cl__propdel,
414  svn_cl__propedit,
415  svn_cl__propget,
416  svn_cl__proplist,
417  svn_cl__propset,
418  svn_cl__relocate,
419  svn_cl__revert,
420  svn_cl__resolve,
421  svn_cl__resolved,
422  svn_cl__status,
423  svn_cl__switch,
424  svn_cl__unlock,
425  svn_cl__update,
426  svn_cl__upgrade;
427
428
429/* See definition in svn.c for documentation. */
430extern const svn_opt_subcommand_desc3_t *svn_cl__cmd_table;
431
432/* See definition in svn.c for documentation. */
433extern const int svn_cl__global_options[];
434
435/* See definition in svn.c for documentation. */
436extern const apr_getopt_option_t svn_cl__options[];
437
438
439/* A helper for the many subcommands that wish to merely warn when
440 * invoked on an unversioned, nonexistent, or otherwise innocuously
441 * errorful resource.  Meant to be wrapped with SVN_ERR().
442 *
443 * If ERR is null, return SVN_NO_ERROR.
444 *
445 * Else if ERR->apr_err is one of the error codes supplied in varargs,
446 * then handle ERR as a warning (unless QUIET is true), clear ERR, and
447 * return SVN_NO_ERROR, and push the value of ERR->apr_err into the
448 * ERRORS_SEEN array, if ERRORS_SEEN is not NULL.
449 *
450 * Else return ERR.
451 *
452 * Typically, error codes like SVN_ERR_UNVERSIONED_RESOURCE,
453 * SVN_ERR_ENTRY_NOT_FOUND, etc, are supplied in varargs.  Don't
454 * forget to terminate the argument list with 0 (or APR_SUCCESS).
455 */
456svn_error_t *
457svn_cl__try(svn_error_t *err,
458            apr_array_header_t *errors_seen,
459            svn_boolean_t quiet,
460            ...);
461
462
463/* Our cancellation callback. */
464extern svn_cancel_func_t svn_cl__check_cancel;
465
466
467
468/* Various conflict-resolution callbacks. */
469
470/* Opaque baton type for svn_cl__conflict_func_interactive(). */
471typedef struct svn_cl__interactive_conflict_baton_t
472  svn_cl__interactive_conflict_baton_t;
473
474/* Return a new, initialized, conflict stats structure, allocated in
475 * POOL. */
476svn_cl__conflict_stats_t *
477svn_cl__conflict_stats_create(apr_pool_t *pool);
478
479/* Update CONFLICT_STATS to reflect that a conflict on PATH_LOCAL of kind
480 * CONFLICT_KIND is resolved.  (There is no support for updating the
481 * 'skipped paths' stats, since skips cannot be 'resolved'.) */
482void
483svn_cl__conflict_stats_resolved(svn_cl__conflict_stats_t *conflict_stats,
484                                const char *path_local,
485                                svn_wc_conflict_kind_t conflict_kind);
486
487/* Set *CONFLICTED_PATHS to the conflicted paths contained in CONFLICT_STATS.
488 * If no conflicted path exists, set *CONFLICTED_PATHS to NULL. */
489svn_error_t *
490svn_cl__conflict_stats_get_paths(apr_array_header_t **conflicted_paths,
491                                 svn_cl__conflict_stats_t *conflict_stats,
492                                 apr_pool_t *result_pool,
493                                 apr_pool_t *scratch_pool);
494
495/* Print the conflict stats accumulated in CONFLICT_STATS.
496 *
497 * Return any error encountered during printing.
498 * See also svn_cl__notifier_print_conflict_stats().
499 */
500svn_error_t *
501svn_cl__print_conflict_stats(svn_cl__conflict_stats_t *conflict_stats,
502                             apr_pool_t *scratch_pool);
503
504/*
505 * Interactively resolve the conflict a @a CONFLICT.
506 * TODO: more docs
507 */
508svn_error_t *
509svn_cl__resolve_conflict(svn_boolean_t *quit,
510                         svn_boolean_t *external_failed,
511                         svn_boolean_t *printed_summary,
512                         svn_client_conflict_t *conflict,
513                         svn_cl__accept_t accept_which,
514                         const char *editor_cmd,
515                         const char *path_prefix,
516                         svn_cmdline_prompt_baton_t *pb,
517                         svn_cl__conflict_stats_t *conflict_stats,
518                         svn_client_ctx_t *ctx,
519                         apr_pool_t *scratch_pool);
520
521/*
522 * Interactively resolve conflicts for all TARGETS.
523 * TODO: more docs
524 */
525svn_error_t *
526svn_cl__walk_conflicts(apr_array_header_t *targets,
527                       svn_cl__conflict_stats_t *conflict_stats,
528                       svn_cl__opt_state_t *opt_state,
529                       svn_client_ctx_t *ctx,
530                       apr_pool_t *scratch_pool);
531
532
533/*** Command-line output functions -- printing to the user. ***/
534
535/* Print out commit information found in COMMIT_INFO to the console.
536 * POOL is used for temporay allocations.
537 * COMMIT_INFO should not be NULL.
538 *
539 * This function implements svn_commit_callback2_t.
540 */
541svn_error_t *
542svn_cl__print_commit_info(const svn_commit_info_t *commit_info,
543                          void *baton,
544                          apr_pool_t *pool);
545
546
547/* Convert the date in DATA to a human-readable UTF-8-encoded string
548 * *HUMAN_CSTRING, or set the latter to "(invalid date)" if DATA is not
549 * a valid date.  DATA should be as expected by svn_time_from_cstring().
550 *
551 * Do all allocations in POOL.
552 */
553svn_error_t *
554svn_cl__time_cstring_to_human_cstring(const char **human_cstring,
555                                      const char *data,
556                                      apr_pool_t *pool);
557
558
559/* Print STATUS for PATH to stdout for human consumption.  Prints in
560   abbreviated format by default, or DETAILED format if flag is set.
561
562   When SUPPRESS_EXTERNALS_PLACEHOLDERS is set, avoid printing
563   externals placeholder lines ("X lines").
564
565   When DETAILED is set, use SHOW_LAST_COMMITTED to toggle display of
566   the last-committed-revision and last-committed-author.
567
568   If SKIP_UNRECOGNIZED is TRUE, this function will not print out
569   unversioned items found in the working copy.
570
571   When DETAILED is set, and REPOS_LOCKS is set, treat missing repository locks
572   as broken WC locks.
573
574   Increment *TEXT_CONFLICTS, *PROP_CONFLICTS, or *TREE_CONFLICTS if
575   a conflict was encountered.
576
577   Use TARGET_ABSPATH and TARGET_PATH to shorten PATH into something
578   relative to the target as necessary.
579*/
580svn_error_t *
581svn_cl__print_status(const char *target_abspath,
582                     const char *target_path,
583                     const char *path,
584                     const svn_client_status_t *status,
585                     svn_boolean_t suppress_externals_placeholders,
586                     svn_boolean_t detailed,
587                     svn_boolean_t show_last_committed,
588                     svn_boolean_t skip_unrecognized,
589                     svn_boolean_t repos_locks,
590                     unsigned int *text_conflicts,
591                     unsigned int *prop_conflicts,
592                     unsigned int *tree_conflicts,
593                     svn_client_ctx_t *ctx,
594                     apr_pool_t *pool);
595
596
597/* Print STATUS for PATH in XML to stdout.  Use POOL for temporary
598   allocations.
599
600   Use TARGET_ABSPATH and TARGET_PATH to shorten PATH into something
601   relative to the target as necessary.
602 */
603svn_error_t *
604svn_cl__print_status_xml(const char *target_abspath,
605                         const char *target_path,
606                         const char *path,
607                         const svn_client_status_t *status,
608                         svn_client_ctx_t *ctx,
609                         apr_pool_t *pool);
610
611/* Output a commit xml element to *OUTSTR.  If *OUTSTR is NULL, allocate it
612   first from POOL, otherwise append to it.  If AUTHOR or DATE is
613   NULL, it will be omitted. */
614void
615svn_cl__print_xml_commit(svn_stringbuf_t **outstr,
616                         svn_revnum_t revision,
617                         const char *author,
618                         const char *date,
619                         apr_pool_t *pool);
620
621/* Output an XML "<lock>" element describing LOCK to *OUTSTR.  If *OUTSTR is
622   NULL, allocate it first from POOL, otherwise append to it. */
623void
624svn_cl__print_xml_lock(svn_stringbuf_t **outstr,
625                       const svn_lock_t *lock,
626                       apr_pool_t *pool);
627
628/* Do the following things that are commonly required before accessing revision
629   properties.  Ensure that REVISION is specified explicitly and is not
630   relative to a working-copy item.  Ensure that exactly one target is
631   specified in TARGETS.  Set *URL to the URL of the target.  Return an
632   appropriate error if any of those checks or operations fail. Use CTX for
633   accessing the working copy
634 */
635svn_error_t *
636svn_cl__revprop_prepare(const svn_opt_revision_t *revision,
637                        const apr_array_header_t *targets,
638                        const char **URL,
639                        svn_client_ctx_t *ctx,
640                        apr_pool_t *pool);
641
642/* Search for a merge tool command in environment variables,
643   and use it to perform the merge of the four given files.
644   WC_PATH is the path of the file that is in conflict, relative
645   to the merge target.
646   Use POOL for all allocations.
647
648   CONFIG is a hash of svn_config_t * items keyed on a configuration
649   category (SVN_CONFIG_CATEGORY_CONFIG et al), and may be NULL.
650
651   Upon success, set *REMAINS_IN_CONFLICT to indicate whether the
652   merge result contains conflict markers.
653   */
654svn_error_t *
655svn_cl__merge_file_externally(const char *base_path,
656                              const char *their_path,
657                              const char *my_path,
658                              const char *merged_path,
659                              const char *wc_path,
660                              apr_hash_t *config,
661                              svn_boolean_t *remains_in_conflict,
662                              apr_pool_t *pool);
663
664/* Like svn_cl__merge_file_externally, but using a built-in merge tool
665 * with help from an external editor specified by EDITOR_CMD. */
666svn_error_t *
667svn_cl__merge_file(svn_boolean_t *remains_in_conflict,
668                   const char *base_path,
669                   const char *their_path,
670                   const char *my_path,
671                   const char *merged_path,
672                   const char *wc_path,
673                   const char *path_prefix,
674                   const char *editor_cmd,
675                   apr_hash_t *config,
676                   svn_cancel_func_t cancel_func,
677                   void *cancel_baton,
678                   apr_pool_t *scratch_pool);
679
680
681/*** Notification functions to display results on the terminal. */
682
683/* Set *NOTIFY_FUNC_P and *NOTIFY_BATON_P to a notifier/baton for all
684 * operations, allocated in POOL.
685 */
686svn_error_t *
687svn_cl__get_notifier(svn_wc_notify_func2_t *notify_func_p,
688                     void **notify_baton_p,
689                     svn_cl__conflict_stats_t *conflict_stats,
690                     apr_pool_t *pool);
691
692/* Make the notifier for use with BATON print the appropriate summary
693 * line at the end of the output.
694 */
695svn_error_t *
696svn_cl__notifier_mark_checkout(void *baton);
697
698/* Make the notifier for use with BATON print the appropriate summary
699 * line at the end of the output.
700 */
701svn_error_t *
702svn_cl__notifier_mark_export(void *baton);
703
704/* Make the notifier for use with BATON print the appropriate notifications
705 * for a wc to repository copy
706 */
707svn_error_t *
708svn_cl__notifier_mark_wc_to_repos_copy(void *baton);
709
710/* Baton for use with svn_cl__check_externals_failed_notify_wrapper(). */
711struct svn_cl__check_externals_failed_notify_baton
712{
713  svn_wc_notify_func2_t wrapped_func; /* The "real" notify_func2. */
714  void *wrapped_baton;                /* The "real" notify_func2 baton. */
715  svn_boolean_t had_externals_error;  /* Did something fail in an external? */
716};
717
718/* Notification function wrapper (implements `svn_wc_notify_func2_t').
719   Use with an svn_cl__check_externals_failed_notify_baton BATON. */
720void
721svn_cl__check_externals_failed_notify_wrapper(void *baton,
722                                              const svn_wc_notify_t *n,
723                                              apr_pool_t *pool);
724
725/* Print the conflict stats accumulated in BATON, which is the
726 * notifier baton from svn_cl__get_notifier().  This is just like
727 * calling svn_cl__print_conflict_stats().
728 *
729 * Return any error encountered during printing.
730 */
731svn_error_t *
732svn_cl__notifier_print_conflict_stats(void *baton, apr_pool_t *scratch_pool);
733
734
735/*** Log message callback stuffs. ***/
736
737/* Allocate in POOL a baton for use with svn_cl__get_log_message().
738
739   OPT_STATE is the set of command-line options given.
740
741   BASE_DIR is a directory in which to create temporary files if an
742   external editor is used to edit the log message.  If BASE_DIR is
743   NULL, the current working directory (`.') will be used, and
744   therefore the user must have the proper permissions on that
745   directory.  ### todo: What *should* happen in the NULL case is that
746   we ask APR to tell us where a suitable tmp directory is (like, /tmp
747   on Unix and C:\Windows\Temp on Win32 or something), and use it.
748   But APR doesn't yet have that capability.
749
750   CONFIG is a client configuration hash of svn_config_t * items keyed
751   on config categories, and may be NULL.
752
753   NOTE: While the baton itself will be allocated from POOL, the items
754   add to it are added by reference, not duped into POOL!*/
755svn_error_t *
756svn_cl__make_log_msg_baton(void **baton,
757                           svn_cl__opt_state_t *opt_state,
758                           const char *base_dir,
759                           apr_hash_t *config,
760                           apr_pool_t *pool);
761
762/* A function of type svn_client_get_commit_log3_t. */
763svn_error_t *
764svn_cl__get_log_message(const char **log_msg,
765                        const char **tmp_file,
766                        const apr_array_header_t *commit_items,
767                        void *baton,
768                        apr_pool_t *pool);
769
770/* Handle the cleanup of a log message, using the data in the
771   LOG_MSG_BATON, in the face of COMMIT_ERR.  This may mean removing a
772   temporary file left by an external editor, or it may be a complete
773   no-op.  COMMIT_ERR may be NULL to indicate to indicate that the
774   function should act as though no commit error occurred. Use POOL
775   for temporary allocations.
776
777   All error returns from this function are guaranteed to at least
778   include COMMIT_ERR, and perhaps additional errors attached to the
779   end of COMMIT_ERR's chain.  */
780svn_error_t *
781svn_cl__cleanup_log_msg(void *log_msg_baton,
782                        svn_error_t *commit_err,
783                        apr_pool_t *pool);
784
785/* Add a message about --force if appropriate */
786svn_error_t *
787svn_cl__may_need_force(svn_error_t *err);
788
789/* Write the STRING to the stdio STREAM, returning an error if it fails.
790
791   This function is equal to svn_cmdline_fputs() minus the utf8->local
792   encoding translation.  */
793svn_error_t *
794svn_cl__error_checked_fputs(const char *string, FILE* stream);
795
796/* If STRING is non-null, append it, wrapped in a simple XML CDATA element
797   named TAGNAME, to the string SB.  Use POOL for temporary allocations. */
798void
799svn_cl__xml_tagged_cdata(svn_stringbuf_t **sb,
800                         apr_pool_t *pool,
801                         const char *tagname,
802                         const char *string);
803
804/* Print the XML prolog and document root element start-tag to stdout, using
805   TAGNAME as the root element name.  Use POOL for temporary allocations. */
806svn_error_t *
807svn_cl__xml_print_header(const char *tagname, apr_pool_t *pool);
808
809/* Print the XML document root element end-tag to stdout, using TAGNAME as the
810   root element name.  Use POOL for temporary allocations. */
811svn_error_t *
812svn_cl__xml_print_footer(const char *tagname, apr_pool_t *pool);
813
814
815/* For use in XML output, return a non-localised string representation
816 * of KIND, being "none" or "dir" or "file" or, in any other case,
817 * the empty string. */
818const char *
819svn_cl__node_kind_str_xml(svn_node_kind_t kind);
820
821/* Return a (possibly localised) string representation of KIND, being "none" or
822   "dir" or "file" or, in any other case, the empty string. */
823const char *
824svn_cl__node_kind_str_human_readable(svn_node_kind_t kind);
825
826/* Set *RESULT to the size of a file, formatted according to BASE.
827   For base-10 and base-2 units, the size is constrained to at most
828   three significant digits.
829
830   If LONG_UNITS is TRUE, any unit suffixes will be the whole SI symbol,
831   e.g., KiB, MiB, etc; otherwise only the first letters will be used.
832
833   File sizes are never negative, so we don't handle that case other than
834   making sure that the scale adjustment will work.
835
836   The result will be allocated from RESULT_POOL. */
837svn_error_t *
838svn_cl__format_file_size(const char **result,
839                         svn_filesize_t size,
840                         svn_cl__size_unit_t base,
841                         svn_boolean_t long_units,
842                         apr_pool_t *result_pool);
843
844
845/** Provides an XML name for a given OPERATION.
846 * Note: POOL is currently not used.
847 */
848const char *
849svn_cl__operation_str_xml(svn_wc_operation_t operation, apr_pool_t *pool);
850
851/** Return a possibly localized human readable string for
852 * a given OPERATION.
853 * Note: POOL is currently not used.
854 */
855const char *
856svn_cl__operation_str_human_readable(svn_wc_operation_t operation,
857                                     apr_pool_t *pool);
858
859
860/* What use is a property name intended for.
861   Used by svn_cl__check_svn_prop_name to customize error messages. */
862typedef enum svn_cl__prop_use_e
863  {
864    svn_cl__prop_use_set,       /* setting the property */
865    svn_cl__prop_use_edit,      /* editing the property */
866    svn_cl__prop_use_use        /* using the property name */
867  }
868svn_cl__prop_use_t;
869
870/* If PROPNAME looks like but is not identical to one of the svn:
871 * poperties, raise an error and suggest a better spelling. Names that
872 * raise errors look like this:
873 *
874 *   - start with svn: but do not exactly match a known property; or,
875 *   - start with a 3-letter prefix that differs in only one letter
876 *     from "svn:", and the rest exactly matches a known propery.
877 *
878 * If REVPROP is TRUE, only check revision property names; otherwise
879 * only check node property names.
880 *
881 * Use SCRATCH_POOL for temporary allocations.
882 */
883svn_error_t *
884svn_cl__check_svn_prop_name(const char *propname,
885                            svn_boolean_t revprop,
886                            svn_cl__prop_use_t prop_use,
887                            apr_pool_t *scratch_pool);
888
889/* If PROPNAME is one of the svn: properties with a boolean value, and
890 * PROPVAL looks like an attempt to turn the property off (i.e., it's
891 * "off", "no", "false", or ""), then print a warning to the user that
892 * setting the property to this value might not do what they expect.
893 * Perform temporary allocations in POOL.
894 */
895void
896svn_cl__check_boolean_prop_val(const char *propname,
897                               const char *propval,
898                               apr_pool_t *pool);
899
900/* De-streamifying wrapper around svn_client_get_changelists(), which
901   is called for each target in TARGETS to populate *PATHS (a list of
902   paths assigned to one of the CHANGELISTS.
903   If all targets are to be included, may set *PATHS to TARGETS without
904   reallocating. */
905svn_error_t *
906svn_cl__changelist_paths(apr_array_header_t **paths,
907                         const apr_array_header_t *changelists,
908                         const apr_array_header_t *targets,
909                         svn_depth_t depth,
910                         svn_client_ctx_t *ctx,
911                         apr_pool_t *result_pool,
912                         apr_pool_t *scratch_pool);
913
914/* Like svn_client_args_to_target_array() but, if the only error is that some
915 * arguments are reserved file names, then print warning messages for those
916 * targets, store the rest of the targets in TARGETS_P and return success. */
917svn_error_t *
918svn_cl__args_to_target_array_print_reserved(apr_array_header_t **targets_p,
919                                            apr_getopt_t *os,
920                                            const apr_array_header_t *known_targets,
921                                            svn_client_ctx_t *ctx,
922                                            svn_boolean_t keep_dest_origpath_on_truepath_collision,
923                                            apr_pool_t *pool);
924
925/* Return a string showing a conflicted node's kind, URL and revision,
926 * to the extent that that information is available. If REPOS_ROOT_URL or
927 * REPOS_RELPATH are NULL, this prints just a 'none' node kind.
928 * WC_REPOS_ROOT_URL should reflect the target working copy's repository
929 * root URL. If the node is from that same URL, the printed URL is abbreviated
930 * to caret notation (^/). WC_REPOS_ROOT_URL may be NULL, in which case
931 * this function tries to print the conflicted node's complete URL. */
932const char *
933svn_cl__node_description(const char *repos_root_url,
934                         const char *repos_relpath,
935                         svn_revnum_t peg_rev,
936                         svn_node_kind_t node_kind,
937                         const char *wc_repos_root_URL,
938                         apr_pool_t *pool);
939
940/* Return, in @a *true_targets_p, a shallow copy of @a targets with any
941 * empty peg revision specifier snipped off the end of each element.  If any
942 * target has a non-empty peg revision specifier, throw an error.  The user
943 * may have specified a peg revision where it doesn't make sense to do so,
944 * or may have forgotten to escape an '@' character in a filename.
945 *
946 * This function is useful for subcommands for which peg revisions
947 * do not make any sense. Such subcommands still need to allow an empty
948 * peg revision to be specified on the command line so that users of
949 * the command line client can consistently escape '@' characters
950 * in filenames by appending an '@' character, regardless of the
951 * subcommand being used.
952 *
953 * It is safe to pass the address of @a targets as @a true_targets_p.
954 *
955 * Do all allocations in @a pool. */
956svn_error_t *
957svn_cl__eat_peg_revisions(apr_array_header_t **true_targets_p,
958                          const apr_array_header_t *targets,
959                          apr_pool_t *pool);
960
961/* Return an error if TARGETS contains a mixture of URLs and paths; otherwise
962 * return SVN_NO_ERROR. */
963svn_error_t *
964svn_cl__assert_homogeneous_target_type(const apr_array_header_t *targets);
965
966/* Return an error if TARGETS contains a URL; otherwise return SVN_NO_ERROR. */
967svn_error_t *
968svn_cl__check_targets_are_local_paths(const apr_array_header_t *targets);
969
970/* Return an error if TARGET is a URL; otherwise return SVN_NO_ERROR. */
971svn_error_t *
972svn_cl__check_target_is_local_path(const char *target);
973
974/* Return a copy of PATH, converted to the local path style, skipping
975 * PARENT_PATH if it is non-null and is a parent of or equal to PATH.
976 *
977 * This function assumes PARENT_PATH and PATH are both absolute "dirents"
978 * or both relative "dirents". */
979const char *
980svn_cl__local_style_skip_ancestor(const char *parent_path,
981                                  const char *path,
982                                  apr_pool_t *pool);
983
984/* If the user is setting a mime-type to mark one of the TARGETS as binary,
985 * as determined by property name PROPNAME and value PROPVAL, then check
986 * whether Subversion's own binary-file detection recognizes the target as
987 * a binary file. If Subversion doesn't consider the target to be a binary
988 * file, assume the user is making an error and print a warning to inform
989 * the user that some operations might fail on the file in the future. */
990svn_error_t *
991svn_cl__propset_print_binary_mime_type_warning(apr_array_header_t *targets,
992                                               const char *propname,
993                                               const svn_string_t *propval,
994                                               apr_pool_t *scratch_pool);
995
996/* A wrapper around the deprecated svn_client_merge_reintegrate. */
997svn_error_t *
998svn_cl__deprecated_merge_reintegrate(const char *source_path_or_url,
999                                     const svn_opt_revision_t *src_peg_revision,
1000                                     const char *target_wcpath,
1001                                     svn_boolean_t dry_run,
1002                                     const apr_array_header_t *merge_options,
1003                                     svn_client_ctx_t *ctx,
1004                                     apr_pool_t *pool);
1005
1006
1007/* Forward declaration of the similarity check context. */
1008typedef struct svn_cl__simcheck_context_t svn_cl__simcheck_context_t;
1009
1010/* Token definition for the similarity check. */
1011typedef struct svn_cl__simcheck_t
1012{
1013  /* The token we're checking for similarity. */
1014  svn_string_t token;
1015
1016  /* User data associated with this token. */
1017  const void *data;
1018
1019  /*
1020   * The following fields are populated by svn_cl__similarity_check.
1021   */
1022
1023  /* Similarity score [0..SVN_STRING__SIM_RANGE_MAX] */
1024  apr_size_t score;
1025
1026  /* Number of characters of difference from the key. */
1027  apr_size_t diff;
1028
1029  /* Similarity check context (private) */
1030  svn_cl__simcheck_context_t *context;
1031} svn_cl__simcheck_t;
1032
1033/* Find the entries in TOKENS that are most similar to KEY.
1034 * TOKEN_COUNT is the number of entries in the (mutable) TOKENS array.
1035 * Use SCRATCH_POOL for temporary allocations.
1036 *
1037 * On return, the TOKENS array will be sorted according to similarity
1038 * to KEY, in descending order. The return value will be zero if the
1039 * first token is an exact match; otherwise, it will be one more than
1040 * the number of tokens that are at least two-thirds similar to KEY.
1041 */
1042apr_size_t
1043svn_cl__similarity_check(const char *key,
1044                         svn_cl__simcheck_t **tokens,
1045                         apr_size_t token_count,
1046                         apr_pool_t *scratch_pool);
1047
1048/* Return in FUNC_P and BATON_P a callback that prints a summary diff,
1049 * according to the options XML and IGNORE_PROPERTIES.
1050 *
1051 * ANCHOR is a URL or local path to be prefixed to the printed paths.
1052 */
1053svn_error_t *
1054svn_cl__get_diff_summary_writer(svn_client_diff_summarize_func_t *func_p,
1055                                void **baton_p,
1056                                svn_boolean_t xml,
1057                                svn_boolean_t ignore_properties,
1058                                const char *anchor,
1059                                apr_pool_t *result_pool,
1060                                apr_pool_t *scratch_pool);
1061
1062#ifdef __cplusplus
1063}
1064#endif /* __cplusplus */
1065
1066#endif /* SVN_CL_H */
1067