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