1251881Speter/*
2251881Speter * deprecated.c:  holding file for all deprecated APIs.
3251881Speter *                "we can't lose 'em, but we can shun 'em!"
4251881Speter *
5251881Speter * ====================================================================
6251881Speter *    Licensed to the Apache Software Foundation (ASF) under one
7251881Speter *    or more contributor license agreements.  See the NOTICE file
8251881Speter *    distributed with this work for additional information
9251881Speter *    regarding copyright ownership.  The ASF licenses this file
10251881Speter *    to you under the Apache License, Version 2.0 (the
11251881Speter *    "License"); you may not use this file except in compliance
12251881Speter *    with the License.  You may obtain a copy of the License at
13251881Speter *
14251881Speter *      http://www.apache.org/licenses/LICENSE-2.0
15251881Speter *
16251881Speter *    Unless required by applicable law or agreed to in writing,
17251881Speter *    software distributed under the License is distributed on an
18251881Speter *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
19251881Speter *    KIND, either express or implied.  See the License for the
20251881Speter *    specific language governing permissions and limitations
21251881Speter *    under the License.
22251881Speter * ====================================================================
23251881Speter */
24251881Speter
25251881Speter/* ==================================================================== */
26251881Speter
27251881Speter
28251881Speter
29251881Speter#include <assert.h>
30251881Speter
31251881Speter/* We define this here to remove any further warnings about the usage of
32251881Speter   deprecated functions in this file. */
33251881Speter#define SVN_DEPRECATED
34251881Speter
35251881Speter#include "svn_hash.h"
36251881Speter#include "svn_subst.h"
37251881Speter#include "svn_path.h"
38251881Speter#include "svn_opt.h"
39251881Speter#include "svn_cmdline.h"
40251881Speter#include "svn_version.h"
41251881Speter#include "svn_pools.h"
42251881Speter#include "svn_dso.h"
43251881Speter#include "svn_mergeinfo.h"
44251881Speter#include "svn_utf.h"
45251881Speter#include "svn_xml.h"
46251881Speter
47251881Speter#include "opt.h"
48251881Speter#include "private/svn_opt_private.h"
49251881Speter#include "private/svn_mergeinfo_private.h"
50262253Speter#include "private/svn_subr_private.h"
51251881Speter
52251881Speter#include "svn_private_config.h"
53251881Speter
54251881Speter
55251881Speter
56251881Speter
57251881Speter/*** Code. ***/
58251881Speter
59251881Speter/*** From subst.c ***/
60251881Speter/* Convert an old-style svn_subst_keywords_t struct * into a new-style
61251881Speter * keywords hash.  Keyword values are shallow copies, so the produced
62251881Speter * hash must not be assumed to have lifetime longer than the struct it
63251881Speter * is based on.  A NULL input causes a NULL output. */
64251881Speterstatic apr_hash_t *
65251881Speterkwstruct_to_kwhash(const svn_subst_keywords_t *kwstruct,
66251881Speter                   apr_pool_t *pool)
67251881Speter{
68251881Speter  apr_hash_t *kwhash;
69251881Speter
70251881Speter  if (kwstruct == NULL)
71251881Speter    return NULL;
72251881Speter
73251881Speter  kwhash = apr_hash_make(pool);
74251881Speter
75251881Speter  if (kwstruct->revision)
76251881Speter    {
77251881Speter      svn_hash_sets(kwhash, SVN_KEYWORD_REVISION_LONG, kwstruct->revision);
78251881Speter      svn_hash_sets(kwhash, SVN_KEYWORD_REVISION_MEDIUM, kwstruct->revision);
79251881Speter      svn_hash_sets(kwhash, SVN_KEYWORD_REVISION_SHORT, kwstruct->revision);
80251881Speter    }
81251881Speter  if (kwstruct->date)
82251881Speter    {
83251881Speter      svn_hash_sets(kwhash, SVN_KEYWORD_DATE_LONG, kwstruct->date);
84251881Speter      svn_hash_sets(kwhash, SVN_KEYWORD_DATE_SHORT, kwstruct->date);
85251881Speter    }
86251881Speter  if (kwstruct->author)
87251881Speter    {
88251881Speter      svn_hash_sets(kwhash, SVN_KEYWORD_AUTHOR_LONG, kwstruct->author);
89251881Speter      svn_hash_sets(kwhash, SVN_KEYWORD_AUTHOR_SHORT, kwstruct->author);
90251881Speter    }
91251881Speter  if (kwstruct->url)
92251881Speter    {
93251881Speter      svn_hash_sets(kwhash, SVN_KEYWORD_URL_LONG, kwstruct->url);
94251881Speter      svn_hash_sets(kwhash, SVN_KEYWORD_URL_SHORT, kwstruct->url);
95251881Speter    }
96251881Speter  if (kwstruct->id)
97251881Speter    {
98251881Speter      svn_hash_sets(kwhash, SVN_KEYWORD_ID, kwstruct->id);
99251881Speter    }
100251881Speter
101251881Speter  return kwhash;
102251881Speter}
103251881Speter
104251881Speter
105251881Spetersvn_error_t *
106251881Spetersvn_subst_translate_stream3(svn_stream_t *src_stream,
107251881Speter                            svn_stream_t *dst_stream,
108251881Speter                            const char *eol_str,
109251881Speter                            svn_boolean_t repair,
110251881Speter                            apr_hash_t *keywords,
111251881Speter                            svn_boolean_t expand,
112251881Speter                            apr_pool_t *pool)
113251881Speter{
114251881Speter  /* The docstring requires that *some* translation be requested. */
115251881Speter  SVN_ERR_ASSERT(eol_str || keywords);
116251881Speter
117251881Speter  /* We don't want the copy3 to close the provided streams. */
118251881Speter  src_stream = svn_stream_disown(src_stream, pool);
119251881Speter  dst_stream = svn_stream_disown(dst_stream, pool);
120251881Speter
121251881Speter  /* Wrap the destination stream with our translation stream. It is more
122251881Speter     efficient than wrapping the source stream. */
123251881Speter  dst_stream = svn_subst_stream_translated(dst_stream, eol_str, repair,
124251881Speter                                           keywords, expand, pool);
125251881Speter
126251881Speter  return svn_error_trace(svn_stream_copy3(src_stream, dst_stream,
127251881Speter                                          NULL, NULL, pool));
128251881Speter}
129251881Speter
130251881Spetersvn_error_t *
131251881Spetersvn_subst_translate_stream2(svn_stream_t *s, /* src stream */
132251881Speter                            svn_stream_t *d, /* dst stream */
133251881Speter                            const char *eol_str,
134251881Speter                            svn_boolean_t repair,
135251881Speter                            const svn_subst_keywords_t *keywords,
136251881Speter                            svn_boolean_t expand,
137251881Speter                            apr_pool_t *pool)
138251881Speter{
139251881Speter  apr_hash_t *kh = kwstruct_to_kwhash(keywords, pool);
140251881Speter
141251881Speter  return svn_error_trace(svn_subst_translate_stream3(s, d, eol_str, repair,
142251881Speter                                                     kh, expand, pool));
143251881Speter}
144251881Speter
145251881Spetersvn_error_t *
146251881Spetersvn_subst_translate_stream(svn_stream_t *s, /* src stream */
147251881Speter                           svn_stream_t *d, /* dst stream */
148251881Speter                           const char *eol_str,
149251881Speter                           svn_boolean_t repair,
150251881Speter                           const svn_subst_keywords_t *keywords,
151251881Speter                           svn_boolean_t expand)
152251881Speter{
153251881Speter  apr_pool_t *pool = svn_pool_create(NULL);
154251881Speter  svn_error_t *err = svn_subst_translate_stream2(s, d, eol_str, repair,
155251881Speter                                                 keywords, expand, pool);
156251881Speter  svn_pool_destroy(pool);
157251881Speter  return svn_error_trace(err);
158251881Speter}
159251881Speter
160251881Spetersvn_error_t *
161251881Spetersvn_subst_translate_cstring(const char *src,
162251881Speter                            const char **dst,
163251881Speter                            const char *eol_str,
164251881Speter                            svn_boolean_t repair,
165251881Speter                            const svn_subst_keywords_t *keywords,
166251881Speter                            svn_boolean_t expand,
167251881Speter                            apr_pool_t *pool)
168251881Speter{
169251881Speter  apr_hash_t *kh = kwstruct_to_kwhash(keywords, pool);
170251881Speter
171251881Speter  return svn_error_trace(svn_subst_translate_cstring2(src, dst, eol_str,
172251881Speter                                                      repair, kh, expand,
173251881Speter                                                      pool));
174251881Speter}
175251881Speter
176251881Spetersvn_error_t *
177251881Spetersvn_subst_copy_and_translate(const char *src,
178251881Speter                             const char *dst,
179251881Speter                             const char *eol_str,
180251881Speter                             svn_boolean_t repair,
181251881Speter                             const svn_subst_keywords_t *keywords,
182251881Speter                             svn_boolean_t expand,
183251881Speter                             apr_pool_t *pool)
184251881Speter{
185251881Speter  return svn_error_trace(svn_subst_copy_and_translate2(src, dst, eol_str,
186251881Speter                                                       repair, keywords,
187251881Speter                                                       expand, FALSE, pool));
188251881Speter}
189251881Speter
190251881Spetersvn_error_t *
191251881Spetersvn_subst_copy_and_translate2(const char *src,
192251881Speter                              const char *dst,
193251881Speter                              const char *eol_str,
194251881Speter                              svn_boolean_t repair,
195251881Speter                              const svn_subst_keywords_t *keywords,
196251881Speter                              svn_boolean_t expand,
197251881Speter                              svn_boolean_t special,
198251881Speter                              apr_pool_t *pool)
199251881Speter{
200251881Speter  apr_hash_t *kh = kwstruct_to_kwhash(keywords, pool);
201251881Speter
202251881Speter  return svn_error_trace(svn_subst_copy_and_translate3(src, dst, eol_str,
203251881Speter                                                       repair, kh, expand,
204251881Speter                                                       special, pool));
205251881Speter}
206251881Speter
207251881Spetersvn_error_t *
208251881Spetersvn_subst_copy_and_translate3(const char *src,
209251881Speter                              const char *dst,
210251881Speter                              const char *eol_str,
211251881Speter                              svn_boolean_t repair,
212251881Speter                              apr_hash_t *keywords,
213251881Speter                              svn_boolean_t expand,
214251881Speter                              svn_boolean_t special,
215251881Speter                              apr_pool_t *pool)
216251881Speter{
217251881Speter  return svn_error_trace(svn_subst_copy_and_translate4(src, dst, eol_str,
218251881Speter                                                       repair, keywords,
219251881Speter                                                       expand, special,
220251881Speter                                                       NULL, NULL,
221251881Speter                                                       pool));
222251881Speter}
223251881Speter
224251881Speter
225251881Spetersvn_error_t *
226251881Spetersvn_subst_stream_translated_to_normal_form(svn_stream_t **stream,
227251881Speter                                           svn_stream_t *source,
228251881Speter                                           svn_subst_eol_style_t eol_style,
229251881Speter                                           const char *eol_str,
230251881Speter                                           svn_boolean_t always_repair_eols,
231251881Speter                                           apr_hash_t *keywords,
232251881Speter                                           apr_pool_t *pool)
233251881Speter{
234251881Speter  if (eol_style == svn_subst_eol_style_native)
235251881Speter    eol_str = SVN_SUBST_NATIVE_EOL_STR;
236251881Speter  else if (! (eol_style == svn_subst_eol_style_fixed
237251881Speter              || eol_style == svn_subst_eol_style_none))
238251881Speter    return svn_error_create(SVN_ERR_IO_UNKNOWN_EOL, NULL, NULL);
239251881Speter
240251881Speter *stream = svn_subst_stream_translated(source, eol_str,
241251881Speter                                       eol_style == svn_subst_eol_style_fixed
242251881Speter                                       || always_repair_eols,
243251881Speter                                       keywords, FALSE, pool);
244251881Speter
245251881Speter return SVN_NO_ERROR;
246251881Speter}
247251881Speter
248251881Spetersvn_error_t *
249251881Spetersvn_subst_translate_string(svn_string_t **new_value,
250251881Speter                           const svn_string_t *value,
251251881Speter                           const char *encoding,
252251881Speter                           apr_pool_t *pool)
253251881Speter{
254251881Speter  return svn_subst_translate_string2(new_value, NULL, NULL, value,
255251881Speter                                     encoding, FALSE, pool, pool);
256251881Speter}
257251881Speter
258251881Spetersvn_error_t *
259251881Spetersvn_subst_stream_detranslated(svn_stream_t **stream_p,
260251881Speter                              const char *src,
261251881Speter                              svn_subst_eol_style_t eol_style,
262251881Speter                              const char *eol_str,
263251881Speter                              svn_boolean_t always_repair_eols,
264251881Speter                              apr_hash_t *keywords,
265251881Speter                              svn_boolean_t special,
266251881Speter                              apr_pool_t *pool)
267251881Speter{
268251881Speter  svn_stream_t *src_stream;
269251881Speter
270251881Speter  if (special)
271251881Speter    return svn_subst_read_specialfile(stream_p, src, pool, pool);
272251881Speter
273251881Speter  /* This will be closed by svn_subst_stream_translated_to_normal_form
274251881Speter     when the returned stream is closed. */
275251881Speter  SVN_ERR(svn_stream_open_readonly(&src_stream, src, pool, pool));
276251881Speter
277251881Speter  return svn_error_trace(svn_subst_stream_translated_to_normal_form(
278251881Speter                           stream_p, src_stream,
279251881Speter                           eol_style, eol_str,
280251881Speter                           always_repair_eols,
281251881Speter                           keywords, pool));
282251881Speter}
283251881Speter
284251881Spetersvn_error_t *
285251881Spetersvn_subst_translate_to_normal_form(const char *src,
286251881Speter                                   const char *dst,
287251881Speter                                   svn_subst_eol_style_t eol_style,
288251881Speter                                   const char *eol_str,
289251881Speter                                   svn_boolean_t always_repair_eols,
290251881Speter                                   apr_hash_t *keywords,
291251881Speter                                   svn_boolean_t special,
292251881Speter                                   apr_pool_t *pool)
293251881Speter{
294251881Speter
295251881Speter  if (eol_style == svn_subst_eol_style_native)
296251881Speter    eol_str = SVN_SUBST_NATIVE_EOL_STR;
297251881Speter  else if (! (eol_style == svn_subst_eol_style_fixed
298251881Speter              || eol_style == svn_subst_eol_style_none))
299251881Speter    return svn_error_create(SVN_ERR_IO_UNKNOWN_EOL, NULL, NULL);
300251881Speter
301251881Speter  return svn_error_trace(svn_subst_copy_and_translate3(
302251881Speter                           src, dst, eol_str,
303251881Speter                           eol_style == svn_subst_eol_style_fixed
304251881Speter                             || always_repair_eols,
305251881Speter                           keywords,
306251881Speter                           FALSE /* contract keywords */,
307251881Speter                           special,
308251881Speter                           pool));
309251881Speter}
310251881Speter
311251881Speter
312251881Speter/*** From opt.c ***/
313251881Speter/* Same as print_command_info2(), but with deprecated struct revision. */
314251881Speterstatic svn_error_t *
315251881Speterprint_command_info(const svn_opt_subcommand_desc_t *cmd,
316251881Speter                   const apr_getopt_option_t *options_table,
317251881Speter                   svn_boolean_t help,
318251881Speter                   apr_pool_t *pool,
319251881Speter                   FILE *stream)
320251881Speter{
321251881Speter  svn_boolean_t first_time;
322251881Speter  apr_size_t i;
323251881Speter
324251881Speter  /* Print the canonical command name. */
325251881Speter  SVN_ERR(svn_cmdline_fputs(cmd->name, stream, pool));
326251881Speter
327251881Speter  /* Print the list of aliases. */
328251881Speter  first_time = TRUE;
329251881Speter  for (i = 0; i < SVN_OPT_MAX_ALIASES; i++)
330251881Speter    {
331251881Speter      if (cmd->aliases[i] == NULL)
332251881Speter        break;
333251881Speter
334251881Speter      if (first_time) {
335251881Speter        SVN_ERR(svn_cmdline_fputs(" (", stream, pool));
336251881Speter        first_time = FALSE;
337251881Speter      }
338251881Speter      else
339251881Speter        SVN_ERR(svn_cmdline_fputs(", ", stream, pool));
340251881Speter
341251881Speter      SVN_ERR(svn_cmdline_fputs(cmd->aliases[i], stream, pool));
342251881Speter    }
343251881Speter
344251881Speter  if (! first_time)
345251881Speter    SVN_ERR(svn_cmdline_fputs(")", stream, pool));
346251881Speter
347251881Speter  if (help)
348251881Speter    {
349251881Speter      const apr_getopt_option_t *option;
350251881Speter      svn_boolean_t have_options = FALSE;
351251881Speter
352251881Speter      SVN_ERR(svn_cmdline_fprintf(stream, pool, ": %s", _(cmd->help)));
353251881Speter
354251881Speter      /* Loop over all valid option codes attached to the subcommand */
355251881Speter      for (i = 0; i < SVN_OPT_MAX_OPTIONS; i++)
356251881Speter        {
357251881Speter          if (cmd->valid_options[i])
358251881Speter            {
359251881Speter              if (!have_options)
360251881Speter                {
361251881Speter                  SVN_ERR(svn_cmdline_fputs(_("\nValid options:\n"),
362251881Speter                                            stream, pool));
363251881Speter                  have_options = TRUE;
364251881Speter                }
365251881Speter
366251881Speter              /* convert each option code into an option */
367251881Speter              option =
368251881Speter                svn_opt_get_option_from_code2(cmd->valid_options[i],
369251881Speter                                              options_table, NULL, pool);
370251881Speter
371251881Speter              /* print the option's docstring */
372251881Speter              if (option && option->description)
373251881Speter                {
374251881Speter                  const char *optstr;
375251881Speter                  svn_opt_format_option(&optstr, option, TRUE, pool);
376251881Speter                  SVN_ERR(svn_cmdline_fprintf(stream, pool, "  %s\n",
377251881Speter                                              optstr));
378251881Speter                }
379251881Speter            }
380251881Speter        }
381251881Speter
382251881Speter      if (have_options)
383251881Speter        SVN_ERR(svn_cmdline_fprintf(stream, pool, "\n"));
384251881Speter    }
385251881Speter
386251881Speter  return SVN_NO_ERROR;
387251881Speter}
388251881Speter
389251881Speterconst svn_opt_subcommand_desc_t *
390251881Spetersvn_opt_get_canonical_subcommand(const svn_opt_subcommand_desc_t *table,
391251881Speter                                 const char *cmd_name)
392251881Speter{
393251881Speter  int i = 0;
394251881Speter
395251881Speter  if (cmd_name == NULL)
396251881Speter    return NULL;
397251881Speter
398251881Speter  while (table[i].name) {
399251881Speter    int j;
400251881Speter    if (strcmp(cmd_name, table[i].name) == 0)
401251881Speter      return table + i;
402251881Speter    for (j = 0; (j < SVN_OPT_MAX_ALIASES) && table[i].aliases[j]; j++)
403251881Speter      if (strcmp(cmd_name, table[i].aliases[j]) == 0)
404251881Speter        return table + i;
405251881Speter
406251881Speter    i++;
407251881Speter  }
408251881Speter
409251881Speter  /* If we get here, there was no matching subcommand name or alias. */
410251881Speter  return NULL;
411251881Speter}
412251881Speter
413251881Spetervoid
414251881Spetersvn_opt_subcommand_help2(const char *subcommand,
415251881Speter                         const svn_opt_subcommand_desc2_t *table,
416251881Speter                         const apr_getopt_option_t *options_table,
417251881Speter                         apr_pool_t *pool)
418251881Speter{
419251881Speter  svn_opt_subcommand_help3(subcommand, table, options_table,
420251881Speter                           NULL, pool);
421251881Speter}
422251881Speter
423251881Spetervoid
424251881Spetersvn_opt_subcommand_help(const char *subcommand,
425251881Speter                        const svn_opt_subcommand_desc_t *table,
426251881Speter                        const apr_getopt_option_t *options_table,
427251881Speter                        apr_pool_t *pool)
428251881Speter{
429251881Speter  const svn_opt_subcommand_desc_t *cmd =
430251881Speter    svn_opt_get_canonical_subcommand(table, subcommand);
431251881Speter  svn_error_t *err;
432251881Speter
433251881Speter  if (cmd)
434251881Speter    err = print_command_info(cmd, options_table, TRUE, pool, stdout);
435251881Speter  else
436251881Speter    err = svn_cmdline_fprintf(stderr, pool,
437251881Speter                              _("\"%s\": unknown command.\n\n"), subcommand);
438251881Speter
439251881Speter  if (err) {
440251881Speter    svn_handle_error2(err, stderr, FALSE, "svn: ");
441251881Speter    svn_error_clear(err);
442251881Speter  }
443251881Speter}
444251881Speter
445251881Spetersvn_error_t *
446251881Spetersvn_opt_args_to_target_array3(apr_array_header_t **targets_p,
447251881Speter                              apr_getopt_t *os,
448251881Speter                              const apr_array_header_t *known_targets,
449251881Speter                              apr_pool_t *pool)
450251881Speter{
451251881Speter  return svn_error_trace(svn_opt__args_to_target_array(targets_p, os,
452251881Speter                                                       known_targets, pool));
453251881Speter}
454251881Speter
455251881Spetersvn_error_t *
456251881Spetersvn_opt_args_to_target_array2(apr_array_header_t **targets_p,
457251881Speter                              apr_getopt_t *os,
458251881Speter                              const apr_array_header_t *known_targets,
459251881Speter                              apr_pool_t *pool)
460251881Speter{
461251881Speter  svn_error_t *err = svn_opt_args_to_target_array3(targets_p, os,
462251881Speter                                                   known_targets, pool);
463251881Speter
464251881Speter  if (err && err->apr_err == SVN_ERR_RESERVED_FILENAME_SPECIFIED)
465251881Speter    {
466251881Speter      svn_error_clear(err);
467251881Speter      return SVN_NO_ERROR;
468251881Speter    }
469251881Speter
470251881Speter  return err;
471251881Speter}
472251881Speter
473251881Spetersvn_error_t *
474251881Spetersvn_opt_args_to_target_array(apr_array_header_t **targets_p,
475251881Speter                             apr_getopt_t *os,
476251881Speter                             const apr_array_header_t *known_targets,
477251881Speter                             svn_opt_revision_t *start_revision,
478251881Speter                             svn_opt_revision_t *end_revision,
479251881Speter                             svn_boolean_t extract_revisions,
480251881Speter                             apr_pool_t *pool)
481251881Speter{
482251881Speter  apr_array_header_t *output_targets;
483251881Speter
484251881Speter  SVN_ERR(svn_opt_args_to_target_array2(&output_targets, os,
485251881Speter                                        known_targets, pool));
486251881Speter
487251881Speter  if (extract_revisions)
488251881Speter    {
489251881Speter      svn_opt_revision_t temprev;
490251881Speter      const char *path;
491251881Speter
492251881Speter      if (output_targets->nelts > 0)
493251881Speter        {
494251881Speter          path = APR_ARRAY_IDX(output_targets, 0, const char *);
495251881Speter          SVN_ERR(svn_opt_parse_path(&temprev, &path, path, pool));
496251881Speter          if (temprev.kind != svn_opt_revision_unspecified)
497251881Speter            {
498251881Speter              APR_ARRAY_IDX(output_targets, 0, const char *) = path;
499251881Speter              start_revision->kind = temprev.kind;
500251881Speter              start_revision->value = temprev.value;
501251881Speter            }
502251881Speter        }
503251881Speter      if (output_targets->nelts > 1)
504251881Speter        {
505251881Speter          path = APR_ARRAY_IDX(output_targets, 1, const char *);
506251881Speter          SVN_ERR(svn_opt_parse_path(&temprev, &path, path, pool));
507251881Speter          if (temprev.kind != svn_opt_revision_unspecified)
508251881Speter            {
509251881Speter              APR_ARRAY_IDX(output_targets, 1, const char *) = path;
510251881Speter              end_revision->kind = temprev.kind;
511251881Speter              end_revision->value = temprev.value;
512251881Speter            }
513251881Speter        }
514251881Speter    }
515251881Speter
516251881Speter  *targets_p = output_targets;
517251881Speter  return SVN_NO_ERROR;
518251881Speter}
519251881Speter
520251881Spetersvn_error_t *
521251881Spetersvn_opt_print_help3(apr_getopt_t *os,
522251881Speter                    const char *pgm_name,
523251881Speter                    svn_boolean_t print_version,
524251881Speter                    svn_boolean_t quiet,
525251881Speter                    const char *version_footer,
526251881Speter                    const char *header,
527251881Speter                    const svn_opt_subcommand_desc2_t *cmd_table,
528251881Speter                    const apr_getopt_option_t *option_table,
529251881Speter                    const int *global_options,
530251881Speter                    const char *footer,
531251881Speter                    apr_pool_t *pool)
532251881Speter{
533251881Speter  return svn_error_trace(svn_opt_print_help4(os,
534251881Speter                                             pgm_name,
535251881Speter                                             print_version,
536251881Speter                                             quiet,
537251881Speter                                             FALSE,
538251881Speter                                             version_footer,
539251881Speter                                             header,
540251881Speter                                             cmd_table,
541251881Speter                                             option_table,
542251881Speter                                             global_options,
543251881Speter                                             footer,
544251881Speter                                             pool));
545251881Speter}
546251881Speter
547251881Spetersvn_error_t *
548251881Spetersvn_opt_print_help2(apr_getopt_t *os,
549251881Speter                    const char *pgm_name,
550251881Speter                    svn_boolean_t print_version,
551251881Speter                    svn_boolean_t quiet,
552251881Speter                    const char *version_footer,
553251881Speter                    const char *header,
554251881Speter                    const svn_opt_subcommand_desc2_t *cmd_table,
555251881Speter                    const apr_getopt_option_t *option_table,
556251881Speter                    const char *footer,
557251881Speter                    apr_pool_t *pool)
558251881Speter{
559251881Speter  return svn_error_trace(svn_opt_print_help4(os,
560251881Speter                                             pgm_name,
561251881Speter                                             print_version,
562251881Speter                                             quiet,
563251881Speter                                             FALSE,
564251881Speter                                             version_footer,
565251881Speter                                             header,
566251881Speter                                             cmd_table,
567251881Speter                                             option_table,
568251881Speter                                             NULL,
569251881Speter                                             footer,
570251881Speter                                             pool));
571251881Speter}
572251881Speter
573251881Spetersvn_error_t *
574251881Spetersvn_opt_print_help(apr_getopt_t *os,
575251881Speter                   const char *pgm_name,
576251881Speter                   svn_boolean_t print_version,
577251881Speter                   svn_boolean_t quiet,
578251881Speter                   const char *version_footer,
579251881Speter                   const char *header,
580251881Speter                   const svn_opt_subcommand_desc_t *cmd_table,
581251881Speter                   const apr_getopt_option_t *option_table,
582251881Speter                   const char *footer,
583251881Speter                   apr_pool_t *pool)
584251881Speter{
585251881Speter  apr_array_header_t *targets = NULL;
586251881Speter
587251881Speter  if (os)
588251881Speter    SVN_ERR(svn_opt_parse_all_args(&targets, os, pool));
589251881Speter
590251881Speter  if (os && targets->nelts)  /* help on subcommand(s) requested */
591251881Speter    {
592251881Speter      int i;
593251881Speter
594251881Speter      for (i = 0; i < targets->nelts; i++)
595251881Speter        {
596251881Speter          svn_opt_subcommand_help(APR_ARRAY_IDX(targets, i, const char *),
597251881Speter                                  cmd_table, option_table, pool);
598251881Speter        }
599251881Speter    }
600251881Speter  else if (print_version)   /* just --version */
601251881Speter    {
602251881Speter      SVN_ERR(svn_opt__print_version_info(pgm_name, version_footer,
603251881Speter                                          svn_version_extended(FALSE, pool),
604251881Speter                                          quiet, FALSE, pool));
605251881Speter    }
606251881Speter  else if (os && !targets->nelts)            /* `-h', `--help', or `help' */
607251881Speter    svn_opt_print_generic_help(header,
608251881Speter                               cmd_table,
609251881Speter                               option_table,
610251881Speter                               footer,
611251881Speter                               pool,
612251881Speter                               stdout);
613251881Speter  else                                       /* unknown option or cmd */
614251881Speter    SVN_ERR(svn_cmdline_fprintf(stderr, pool,
615251881Speter                                _("Type '%s help' for usage.\n"), pgm_name));
616251881Speter
617251881Speter  return SVN_NO_ERROR;
618251881Speter}
619251881Speter
620251881Spetervoid
621251881Spetersvn_opt_print_generic_help(const char *header,
622251881Speter                           const svn_opt_subcommand_desc_t *cmd_table,
623251881Speter                           const apr_getopt_option_t *opt_table,
624251881Speter                           const char *footer,
625251881Speter                           apr_pool_t *pool, FILE *stream)
626251881Speter{
627251881Speter  int i = 0;
628251881Speter  svn_error_t *err;
629251881Speter
630251881Speter  if (header)
631251881Speter    if ((err = svn_cmdline_fputs(header, stream, pool)))
632251881Speter      goto print_error;
633251881Speter
634251881Speter  while (cmd_table[i].name)
635251881Speter    {
636251881Speter      if ((err = svn_cmdline_fputs("   ", stream, pool))
637251881Speter          || (err = print_command_info(cmd_table + i, opt_table, FALSE,
638251881Speter                                       pool, stream))
639251881Speter          || (err = svn_cmdline_fputs("\n", stream, pool)))
640251881Speter        goto print_error;
641251881Speter      i++;
642251881Speter    }
643251881Speter
644251881Speter  if ((err = svn_cmdline_fputs("\n", stream, pool)))
645251881Speter    goto print_error;
646251881Speter
647251881Speter  if (footer)
648251881Speter    if ((err = svn_cmdline_fputs(footer, stream, pool)))
649251881Speter      goto print_error;
650251881Speter
651251881Speter  return;
652251881Speter
653251881Speter print_error:
654251881Speter  svn_handle_error2(err, stderr, FALSE, "svn: ");
655251881Speter  svn_error_clear(err);
656251881Speter}
657251881Speter
658251881Speter/*** From io.c ***/
659251881Spetersvn_error_t *
660251881Spetersvn_io_open_unique_file2(apr_file_t **file,
661251881Speter                         const char **temp_path,
662251881Speter                         const char *path,
663251881Speter                         const char *suffix,
664251881Speter                         svn_io_file_del_t delete_when,
665251881Speter                         apr_pool_t *pool)
666251881Speter{
667251881Speter  const char *dirpath;
668251881Speter  const char *filename;
669251881Speter
670251881Speter  svn_path_split(path, &dirpath, &filename, pool);
671251881Speter  return svn_error_trace(svn_io_open_uniquely_named(file, temp_path,
672251881Speter                                                    dirpath, filename, suffix,
673251881Speter                                                    delete_when,
674251881Speter                                                    pool, pool));
675251881Speter}
676251881Speter
677251881Spetersvn_error_t *
678251881Spetersvn_io_open_unique_file(apr_file_t **file,
679251881Speter                        const char **temp_path,
680251881Speter                        const char *path,
681251881Speter                        const char *suffix,
682251881Speter                        svn_boolean_t delete_on_close,
683251881Speter                        apr_pool_t *pool)
684251881Speter{
685251881Speter  return svn_error_trace(svn_io_open_unique_file2(file, temp_path,
686251881Speter                                                  path, suffix,
687251881Speter                                                  delete_on_close
688251881Speter                                                    ? svn_io_file_del_on_close
689251881Speter                                                    : svn_io_file_del_none,
690251881Speter                                                  pool));
691251881Speter}
692251881Speter
693251881Spetersvn_error_t *
694251881Spetersvn_io_run_diff(const char *dir,
695251881Speter                const char *const *user_args,
696251881Speter                int num_user_args,
697251881Speter                const char *label1,
698251881Speter                const char *label2,
699251881Speter                const char *from,
700251881Speter                const char *to,
701251881Speter                int *pexitcode,
702251881Speter                apr_file_t *outfile,
703251881Speter                apr_file_t *errfile,
704251881Speter                const char *diff_cmd,
705251881Speter                apr_pool_t *pool)
706251881Speter{
707251881Speter  SVN_ERR(svn_path_cstring_to_utf8(&diff_cmd, diff_cmd, pool));
708251881Speter
709251881Speter  return svn_error_trace(svn_io_run_diff2(dir, user_args, num_user_args,
710251881Speter                                          label1, label2,
711251881Speter                                          from, to, pexitcode,
712251881Speter                                          outfile, errfile, diff_cmd,
713251881Speter                                          pool));
714251881Speter}
715251881Speter
716251881Spetersvn_error_t *
717251881Spetersvn_io_run_diff3_2(int *exitcode,
718251881Speter                   const char *dir,
719251881Speter                   const char *mine,
720251881Speter                   const char *older,
721251881Speter                   const char *yours,
722251881Speter                   const char *mine_label,
723251881Speter                   const char *older_label,
724251881Speter                   const char *yours_label,
725251881Speter                   apr_file_t *merged,
726251881Speter                   const char *diff3_cmd,
727251881Speter                   const apr_array_header_t *user_args,
728251881Speter                   apr_pool_t *pool)
729251881Speter{
730251881Speter  SVN_ERR(svn_path_cstring_to_utf8(&diff3_cmd, diff3_cmd, pool));
731251881Speter
732251881Speter  return svn_error_trace(svn_io_run_diff3_3(exitcode, dir,
733251881Speter                                            mine, older, yours,
734251881Speter                                            mine_label, older_label,
735251881Speter                                            yours_label, merged,
736251881Speter                                            diff3_cmd, user_args, pool));
737251881Speter}
738251881Speter
739251881Spetersvn_error_t *
740251881Spetersvn_io_run_diff3(const char *dir,
741251881Speter                 const char *mine,
742251881Speter                 const char *older,
743251881Speter                 const char *yours,
744251881Speter                 const char *mine_label,
745251881Speter                 const char *older_label,
746251881Speter                 const char *yours_label,
747251881Speter                 apr_file_t *merged,
748251881Speter                 int *exitcode,
749251881Speter                 const char *diff3_cmd,
750251881Speter                 apr_pool_t *pool)
751251881Speter{
752251881Speter  return svn_error_trace(svn_io_run_diff3_2(exitcode, dir, mine, older, yours,
753251881Speter                                            mine_label, older_label,
754251881Speter                                            yours_label,
755251881Speter                                            merged, diff3_cmd, NULL, pool));
756251881Speter}
757251881Speter
758251881Spetersvn_error_t *
759251881Spetersvn_io_remove_file(const char *path,
760251881Speter                   apr_pool_t *scratch_pool)
761251881Speter{
762251881Speter  return svn_error_trace(svn_io_remove_file2(path, FALSE, scratch_pool));
763251881Speter}
764251881Speter
765251881Spetersvn_error_t *svn_io_file_lock(const char *lock_file,
766251881Speter                              svn_boolean_t exclusive,
767251881Speter                              apr_pool_t *pool)
768251881Speter{
769251881Speter  return svn_io_file_lock2(lock_file, exclusive, FALSE, pool);
770251881Speter}
771251881Speter
772251881Spetersvn_error_t *
773251881Spetersvn_io_get_dirents2(apr_hash_t **dirents,
774251881Speter                    const char *path,
775251881Speter                    apr_pool_t *pool)
776251881Speter{
777251881Speter  /* Note that the first part of svn_io_dirent2_t is identical
778251881Speter     to svn_io_dirent_t to allow this construct */
779251881Speter  return svn_error_trace(
780251881Speter            svn_io_get_dirents3(dirents, path, FALSE, pool, pool));
781251881Speter}
782251881Speter
783251881Spetersvn_error_t *
784251881Spetersvn_io_get_dirents(apr_hash_t **dirents,
785251881Speter                   const char *path,
786251881Speter                   apr_pool_t *pool)
787251881Speter{
788251881Speter  /* Note that in C, padding is not allowed at the beginning of structs,
789251881Speter     so this is actually portable, since the kind field of svn_io_dirent_t
790251881Speter     is first in that struct. */
791251881Speter  return svn_io_get_dirents2(dirents, path, pool);
792251881Speter}
793251881Speter
794251881Spetersvn_error_t *
795251881Spetersvn_io_start_cmd2(apr_proc_t *cmd_proc,
796251881Speter                  const char *path,
797251881Speter                  const char *cmd,
798251881Speter                  const char *const *args,
799251881Speter                  svn_boolean_t inherit,
800251881Speter                  svn_boolean_t infile_pipe,
801251881Speter                  apr_file_t *infile,
802251881Speter                  svn_boolean_t outfile_pipe,
803251881Speter                  apr_file_t *outfile,
804251881Speter                  svn_boolean_t errfile_pipe,
805251881Speter                  apr_file_t *errfile,
806251881Speter                  apr_pool_t *pool)
807251881Speter{
808251881Speter  return svn_io_start_cmd3(cmd_proc, path, cmd, args, NULL, inherit,
809251881Speter                           infile_pipe, infile, outfile_pipe, outfile,
810251881Speter                           errfile_pipe, errfile, pool);
811251881Speter}
812251881Speter
813251881Spetersvn_error_t *
814251881Spetersvn_io_start_cmd(apr_proc_t *cmd_proc,
815251881Speter                 const char *path,
816251881Speter                 const char *cmd,
817251881Speter                 const char *const *args,
818251881Speter                 svn_boolean_t inherit,
819251881Speter                 apr_file_t *infile,
820251881Speter                 apr_file_t *outfile,
821251881Speter                 apr_file_t *errfile,
822251881Speter                 apr_pool_t *pool)
823251881Speter{
824251881Speter  return svn_io_start_cmd2(cmd_proc, path, cmd, args, inherit, FALSE,
825251881Speter                           infile, FALSE, outfile, FALSE, errfile, pool);
826251881Speter}
827251881Speter
828251881Spetersvn_error_t *
829251881Spetersvn_io_file_read_full(apr_file_t *file, void *buf,
830251881Speter                      apr_size_t nbytes, apr_size_t *bytes_read,
831251881Speter                      apr_pool_t *pool)
832251881Speter{
833251881Speter  return svn_io_file_read_full2(file, buf, nbytes, bytes_read, NULL, pool);
834251881Speter}
835251881Speter
836251881Speterstruct walk_func_filter_baton_t
837251881Speter{
838251881Speter  svn_io_walk_func_t walk_func;
839251881Speter  void *walk_baton;
840251881Speter};
841251881Speter
842251881Speter/* Implements svn_io_walk_func_t, but only allows APR_DIR and APR_REG
843251881Speter   finfo types through to the wrapped function/baton.  */
844251881Speterstatic svn_error_t *
845251881Speterwalk_func_filter_func(void *baton,
846251881Speter                      const char *path,
847251881Speter                      const apr_finfo_t *finfo,
848251881Speter                      apr_pool_t *pool)
849251881Speter{
850251881Speter  struct walk_func_filter_baton_t *b = baton;
851251881Speter
852251881Speter  if (finfo->filetype == APR_DIR || finfo->filetype == APR_REG)
853251881Speter    SVN_ERR(b->walk_func(b->walk_baton, path, finfo, pool));
854251881Speter
855251881Speter  return SVN_NO_ERROR;
856251881Speter}
857251881Speter
858251881Spetersvn_error_t *
859251881Spetersvn_io_dir_walk(const char *dirname,
860251881Speter                apr_int32_t wanted,
861251881Speter                svn_io_walk_func_t walk_func,
862251881Speter                void *walk_baton,
863251881Speter                apr_pool_t *pool)
864251881Speter{
865251881Speter  struct walk_func_filter_baton_t baton;
866251881Speter  baton.walk_func = walk_func;
867251881Speter  baton.walk_baton = walk_baton;
868251881Speter  return svn_error_trace(svn_io_dir_walk2(dirname, wanted,
869251881Speter                                          walk_func_filter_func,
870251881Speter                                          &baton, pool));
871251881Speter}
872251881Speter
873251881Spetersvn_error_t *
874251881Spetersvn_io_stat_dirent(const svn_io_dirent2_t **dirent_p,
875251881Speter                   const char *path,
876251881Speter                   svn_boolean_t ignore_enoent,
877251881Speter                   apr_pool_t *result_pool,
878251881Speter                   apr_pool_t *scratch_pool)
879251881Speter{
880251881Speter  return svn_error_trace(
881251881Speter            svn_io_stat_dirent2(dirent_p,
882251881Speter                                path,
883251881Speter                                FALSE,
884251881Speter                                ignore_enoent,
885251881Speter                                result_pool,
886251881Speter                                scratch_pool));
887251881Speter}
888251881Speter
889251881Speter/*** From constructors.c ***/
890251881Spetersvn_log_changed_path_t *
891251881Spetersvn_log_changed_path_dup(const svn_log_changed_path_t *changed_path,
892251881Speter                         apr_pool_t *pool)
893251881Speter{
894251881Speter  svn_log_changed_path_t *new_changed_path
895251881Speter    = apr_palloc(pool, sizeof(*new_changed_path));
896251881Speter
897251881Speter  *new_changed_path = *changed_path;
898251881Speter
899251881Speter  if (new_changed_path->copyfrom_path)
900251881Speter    new_changed_path->copyfrom_path =
901251881Speter      apr_pstrdup(pool, new_changed_path->copyfrom_path);
902251881Speter
903251881Speter  return new_changed_path;
904251881Speter}
905251881Speter
906251881Speter/*** From cmdline.c ***/
907251881Spetersvn_error_t *
908251881Spetersvn_cmdline_prompt_user(const char **result,
909251881Speter                        const char *prompt_str,
910251881Speter                        apr_pool_t *pool)
911251881Speter{
912251881Speter  return svn_error_trace(svn_cmdline_prompt_user2(result, prompt_str, NULL,
913251881Speter                                                  pool));
914251881Speter}
915251881Speter
916251881Spetersvn_error_t *
917251881Spetersvn_cmdline_setup_auth_baton(svn_auth_baton_t **ab,
918251881Speter                             svn_boolean_t non_interactive,
919251881Speter                             const char *auth_username,
920251881Speter                             const char *auth_password,
921251881Speter                             const char *config_dir,
922251881Speter                             svn_boolean_t no_auth_cache,
923251881Speter                             svn_config_t *cfg,
924251881Speter                             svn_cancel_func_t cancel_func,
925251881Speter                             void *cancel_baton,
926251881Speter                             apr_pool_t *pool)
927251881Speter{
928251881Speter  return svn_error_trace(svn_cmdline_create_auth_baton(
929251881Speter                           ab, non_interactive,
930251881Speter                           auth_username, auth_password,
931251881Speter                           config_dir, no_auth_cache, FALSE,
932251881Speter                           cfg, cancel_func, cancel_baton, pool));
933251881Speter}
934251881Speter
935251881Speter/*** From dso.c ***/
936251881Spetervoid
937251881Spetersvn_dso_initialize(void)
938251881Speter{
939251881Speter  svn_error_t *err = svn_dso_initialize2();
940251881Speter  if (err)
941251881Speter    {
942251881Speter      svn_error_clear(err);
943251881Speter      abort();
944251881Speter    }
945251881Speter}
946251881Speter
947251881Speter/*** From simple_providers.c ***/
948251881Spetervoid
949251881Spetersvn_auth_get_simple_provider(svn_auth_provider_object_t **provider,
950251881Speter                             apr_pool_t *pool)
951251881Speter{
952251881Speter  svn_auth_get_simple_provider2(provider, NULL, NULL, pool);
953251881Speter}
954251881Speter
955251881Speter/*** From ssl_client_cert_pw_providers.c ***/
956251881Spetervoid
957251881Spetersvn_auth_get_ssl_client_cert_pw_file_provider
958251881Speter  (svn_auth_provider_object_t **provider,
959251881Speter   apr_pool_t *pool)
960251881Speter{
961251881Speter  svn_auth_get_ssl_client_cert_pw_file_provider2(provider, NULL, NULL, pool);
962251881Speter}
963251881Speter
964251881Speter/*** From path.c ***/
965251881Speter
966251881Speter#define SVN_EMPTY_PATH ""
967251881Speter
968251881Speterconst char *
969251881Spetersvn_path_url_add_component(const char *url,
970251881Speter                           const char *component,
971251881Speter                           apr_pool_t *pool)
972251881Speter{
973251881Speter  /* URL can have trailing '/' */
974251881Speter  url = svn_path_canonicalize(url, pool);
975251881Speter
976251881Speter  return svn_path_url_add_component2(url, component, pool);
977251881Speter}
978251881Speter
979251881Spetervoid
980251881Spetersvn_path_split(const char *path,
981251881Speter               const char **dirpath,
982251881Speter               const char **base_name,
983251881Speter               apr_pool_t *pool)
984251881Speter{
985251881Speter  assert(dirpath != base_name);
986251881Speter
987251881Speter  if (dirpath)
988251881Speter    *dirpath = svn_path_dirname(path, pool);
989251881Speter
990251881Speter  if (base_name)
991251881Speter    *base_name = svn_path_basename(path, pool);
992251881Speter}
993251881Speter
994251881Speter
995251881Spetersvn_error_t *
996251881Spetersvn_path_split_if_file(const char *path,
997251881Speter                       const char **pdirectory,
998251881Speter                       const char **pfile,
999251881Speter                       apr_pool_t *pool)
1000251881Speter{
1001251881Speter  apr_finfo_t finfo;
1002251881Speter  svn_error_t *err;
1003251881Speter
1004251881Speter  SVN_ERR_ASSERT(svn_path_is_canonical(path, pool));
1005251881Speter
1006251881Speter  err = svn_io_stat(&finfo, path, APR_FINFO_TYPE, pool);
1007251881Speter  if (err && ! APR_STATUS_IS_ENOENT(err->apr_err))
1008251881Speter    return err;
1009251881Speter
1010251881Speter  if (err || finfo.filetype == APR_REG)
1011251881Speter    {
1012251881Speter      svn_error_clear(err);
1013251881Speter      svn_path_split(path, pdirectory, pfile, pool);
1014251881Speter    }
1015251881Speter  else if (finfo.filetype == APR_DIR)
1016251881Speter    {
1017251881Speter      *pdirectory = path;
1018251881Speter      *pfile = SVN_EMPTY_PATH;
1019251881Speter    }
1020251881Speter  else
1021251881Speter    {
1022251881Speter      return svn_error_createf(SVN_ERR_BAD_FILENAME, NULL,
1023251881Speter                               _("'%s' is neither a file nor a directory name"),
1024251881Speter                               svn_path_local_style(path, pool));
1025251881Speter    }
1026251881Speter
1027251881Speter  return SVN_NO_ERROR;
1028251881Speter}
1029251881Speter
1030251881Speter/*** From stream.c ***/
1031251881Spetersvn_error_t *svn_stream_copy2(svn_stream_t *from, svn_stream_t *to,
1032251881Speter                              svn_cancel_func_t cancel_func,
1033251881Speter                              void *cancel_baton,
1034251881Speter                              apr_pool_t *scratch_pool)
1035251881Speter{
1036251881Speter  return svn_error_trace(svn_stream_copy3(
1037251881Speter                           svn_stream_disown(from, scratch_pool),
1038251881Speter                           svn_stream_disown(to, scratch_pool),
1039251881Speter                           cancel_func, cancel_baton, scratch_pool));
1040251881Speter}
1041251881Speter
1042251881Spetersvn_error_t *svn_stream_copy(svn_stream_t *from, svn_stream_t *to,
1043251881Speter                             apr_pool_t *scratch_pool)
1044251881Speter{
1045251881Speter  return svn_error_trace(svn_stream_copy3(
1046251881Speter                           svn_stream_disown(from, scratch_pool),
1047251881Speter                           svn_stream_disown(to, scratch_pool),
1048251881Speter                           NULL, NULL, scratch_pool));
1049251881Speter}
1050251881Speter
1051251881Spetersvn_stream_t *
1052251881Spetersvn_stream_from_aprfile(apr_file_t *file, apr_pool_t *pool)
1053251881Speter{
1054251881Speter  return svn_stream_from_aprfile2(file, TRUE, pool);
1055251881Speter}
1056251881Speter
1057251881Spetersvn_error_t *
1058251881Spetersvn_stream_contents_same(svn_boolean_t *same,
1059251881Speter                         svn_stream_t *stream1,
1060251881Speter                         svn_stream_t *stream2,
1061251881Speter                         apr_pool_t *pool)
1062251881Speter{
1063251881Speter  return svn_error_trace(svn_stream_contents_same2(
1064251881Speter                           same,
1065251881Speter                           svn_stream_disown(stream1, pool),
1066251881Speter                           svn_stream_disown(stream2, pool),
1067251881Speter                           pool));
1068251881Speter}
1069251881Speter
1070251881Speter/*** From path.c ***/
1071251881Speter
1072251881Speterconst char *
1073251881Spetersvn_path_internal_style(const char *path, apr_pool_t *pool)
1074251881Speter{
1075251881Speter  if (svn_path_is_url(path))
1076251881Speter    return svn_uri_canonicalize(path, pool);
1077251881Speter  else
1078251881Speter    return svn_dirent_internal_style(path, pool);
1079251881Speter}
1080251881Speter
1081251881Speter
1082251881Speterconst char *
1083251881Spetersvn_path_local_style(const char *path, apr_pool_t *pool)
1084251881Speter{
1085251881Speter  if (svn_path_is_url(path))
1086251881Speter    return apr_pstrdup(pool, path);
1087251881Speter  else
1088251881Speter    return svn_dirent_local_style(path, pool);
1089251881Speter}
1090251881Speter
1091251881Speterconst char *
1092251881Spetersvn_path_canonicalize(const char *path, apr_pool_t *pool)
1093251881Speter{
1094251881Speter  if (svn_path_is_url(path))
1095251881Speter    return svn_uri_canonicalize(path, pool);
1096251881Speter  else
1097251881Speter    return svn_dirent_canonicalize(path, pool);
1098251881Speter}
1099251881Speter
1100251881Speter
1101251881Speter/*** From mergeinfo.c ***/
1102251881Speter
1103251881Spetersvn_error_t *
1104251881Spetersvn_mergeinfo_inheritable(svn_mergeinfo_t *output,
1105251881Speter                          svn_mergeinfo_t mergeinfo,
1106251881Speter                          const char *path,
1107251881Speter                          svn_revnum_t start,
1108251881Speter                          svn_revnum_t end,
1109251881Speter                          apr_pool_t *pool)
1110251881Speter{
1111251881Speter  return svn_error_trace(svn_mergeinfo_inheritable2(output, mergeinfo, path,
1112251881Speter                                                    start, end,
1113251881Speter                                                    TRUE, pool, pool));
1114251881Speter}
1115251881Speter
1116251881Spetersvn_error_t *
1117251881Spetersvn_rangelist_inheritable(svn_rangelist_t **inheritable_rangelist,
1118251881Speter                          const svn_rangelist_t *rangelist,
1119251881Speter                          svn_revnum_t start,
1120251881Speter                          svn_revnum_t end,
1121251881Speter                          apr_pool_t *pool)
1122251881Speter{
1123251881Speter  return svn_error_trace(svn_rangelist_inheritable2(inheritable_rangelist,
1124251881Speter                                                    rangelist,
1125251881Speter                                                    start, end, TRUE,
1126251881Speter                                                    pool, pool));
1127251881Speter}
1128251881Speter
1129251881Spetersvn_error_t *
1130251881Spetersvn_rangelist_merge(svn_rangelist_t **rangelist,
1131251881Speter                    const svn_rangelist_t *changes,
1132251881Speter                    apr_pool_t *pool)
1133251881Speter{
1134251881Speter  SVN_ERR(svn_rangelist_merge2(*rangelist, changes,
1135251881Speter                               pool, pool));
1136251881Speter
1137251881Speter  return svn_error_trace(
1138251881Speter            svn_rangelist__combine_adjacent_ranges(*rangelist, pool));
1139251881Speter}
1140251881Speter
1141251881Spetersvn_error_t *
1142251881Spetersvn_mergeinfo_diff(svn_mergeinfo_t *deleted, svn_mergeinfo_t *added,
1143251881Speter                   svn_mergeinfo_t from, svn_mergeinfo_t to,
1144251881Speter                   svn_boolean_t consider_inheritance,
1145251881Speter                   apr_pool_t *pool)
1146251881Speter{
1147251881Speter  return svn_error_trace(svn_mergeinfo_diff2(deleted, added, from, to,
1148251881Speter                                             consider_inheritance, pool,
1149251881Speter                                             pool));
1150251881Speter}
1151251881Speter
1152251881Spetersvn_error_t *
1153251881Spetersvn_mergeinfo_merge(svn_mergeinfo_t mergeinfo,
1154251881Speter                    svn_mergeinfo_t changes,
1155251881Speter                    apr_pool_t *pool)
1156251881Speter{
1157251881Speter  return svn_error_trace(svn_mergeinfo_merge2(mergeinfo, changes, pool,
1158251881Speter                         pool));
1159251881Speter}
1160251881Speter
1161251881Spetersvn_error_t *
1162251881Spetersvn_mergeinfo_remove(svn_mergeinfo_t *mergeinfo, svn_mergeinfo_t eraser,
1163251881Speter                     svn_mergeinfo_t whiteboard, apr_pool_t *pool)
1164251881Speter{
1165251881Speter  return svn_mergeinfo_remove2(mergeinfo, eraser, whiteboard, TRUE, pool,
1166251881Speter                               pool);
1167251881Speter}
1168251881Speter
1169251881Spetersvn_error_t *
1170251881Spetersvn_mergeinfo_intersect(svn_mergeinfo_t *mergeinfo,
1171251881Speter                        svn_mergeinfo_t mergeinfo1,
1172251881Speter                        svn_mergeinfo_t mergeinfo2,
1173251881Speter                        apr_pool_t *pool)
1174251881Speter{
1175251881Speter  return svn_mergeinfo_intersect2(mergeinfo, mergeinfo1, mergeinfo2,
1176251881Speter                                  TRUE, pool, pool);
1177251881Speter}
1178251881Speter
1179251881Speter/*** From config.c ***/
1180251881Spetersvn_error_t *
1181251881Spetersvn_config_create(svn_config_t **cfgp,
1182251881Speter                  svn_boolean_t section_names_case_sensitive,
1183251881Speter                  apr_pool_t *result_pool)
1184251881Speter{
1185251881Speter  return svn_error_trace(svn_config_create2(cfgp,
1186251881Speter                                            section_names_case_sensitive,
1187251881Speter                                            FALSE,
1188251881Speter                                            result_pool));
1189251881Speter}
1190251881Speter
1191251881Spetersvn_error_t *
1192251881Spetersvn_config_read2(svn_config_t **cfgp, const char *file,
1193251881Speter                 svn_boolean_t must_exist,
1194251881Speter                 svn_boolean_t section_names_case_sensitive,
1195251881Speter                 apr_pool_t *result_pool)
1196251881Speter{
1197251881Speter  return svn_error_trace(svn_config_read3(cfgp, file,
1198251881Speter                                          must_exist,
1199251881Speter                                          section_names_case_sensitive,
1200251881Speter                                          FALSE,
1201251881Speter                                          result_pool));
1202251881Speter}
1203251881Speter
1204251881Spetersvn_error_t *
1205251881Spetersvn_config_read(svn_config_t **cfgp, const char *file,
1206251881Speter                svn_boolean_t must_exist,
1207251881Speter                apr_pool_t *result_pool)
1208251881Speter{
1209251881Speter  return svn_error_trace(svn_config_read3(cfgp, file,
1210251881Speter                                          must_exist,
1211251881Speter                                          FALSE, FALSE,
1212251881Speter                                          result_pool));
1213251881Speter}
1214251881Speter
1215251881Speter#ifdef SVN_DISABLE_FULL_VERSION_MATCH
1216251881Speter/* This double underscore name is used by the 1.6 command line client.
1217251881Speter   Keeping this name is sufficient for the 1.6 client to use the 1.7
1218251881Speter   libraries at runtime. */
1219251881Spetersvn_error_t *
1220251881Spetersvn_opt__eat_peg_revisions(apr_array_header_t **true_targets_p,
1221251881Speter                           apr_array_header_t *targets,
1222251881Speter                           apr_pool_t *pool);
1223251881Spetersvn_error_t *
1224251881Spetersvn_opt__eat_peg_revisions(apr_array_header_t **true_targets_p,
1225251881Speter                           apr_array_header_t *targets,
1226251881Speter                           apr_pool_t *pool)
1227251881Speter{
1228251881Speter  unsigned int i;
1229251881Speter  apr_array_header_t *true_targets;
1230251881Speter
1231251881Speter  true_targets = apr_array_make(pool, 5, sizeof(const char *));
1232251881Speter
1233251881Speter  for (i = 0; i < targets->nelts; i++)
1234251881Speter    {
1235251881Speter      const char *target = APR_ARRAY_IDX(targets, i, const char *);
1236251881Speter      const char *true_target;
1237251881Speter
1238251881Speter      SVN_ERR(svn_opt__split_arg_at_peg_revision(&true_target, NULL,
1239251881Speter                                                 target, pool));
1240251881Speter      APR_ARRAY_PUSH(true_targets, const char *) = true_target;
1241251881Speter    }
1242251881Speter
1243251881Speter  SVN_ERR_ASSERT(true_targets_p);
1244251881Speter  *true_targets_p = true_targets;
1245251881Speter
1246251881Speter  return SVN_NO_ERROR;
1247251881Speter}
1248251881Speter#endif
1249251881Speter
1250251881Spetervoid
1251251881Spetersvn_xml_make_header(svn_stringbuf_t **str, apr_pool_t *pool)
1252251881Speter{
1253251881Speter  svn_xml_make_header2(str, NULL, pool);
1254251881Speter}
1255251881Speter
1256251881Spetervoid
1257251881Spetersvn_utf_initialize(apr_pool_t *pool)
1258251881Speter{
1259251881Speter  svn_utf_initialize2(FALSE, pool);
1260251881Speter}
1261251881Speter
1262251881Spetersvn_error_t *
1263251881Spetersvn_subst_build_keywords(svn_subst_keywords_t *kw,
1264251881Speter                         const char *keywords_val,
1265251881Speter                         const char *rev,
1266251881Speter                         const char *url,
1267251881Speter                         apr_time_t date,
1268251881Speter                         const char *author,
1269251881Speter                         apr_pool_t *pool)
1270251881Speter{
1271251881Speter  apr_hash_t *kwhash;
1272251881Speter  const svn_string_t *val;
1273251881Speter
1274251881Speter  SVN_ERR(svn_subst_build_keywords2(&kwhash, keywords_val, rev,
1275251881Speter                                    url, date, author, pool));
1276251881Speter
1277251881Speter  /* The behaviour of pre-1.3 svn_subst_build_keywords, which we are
1278251881Speter   * replicating here, is to write to a slot in the svn_subst_keywords_t
1279251881Speter   * only if the relevant keyword was present in keywords_val, otherwise
1280251881Speter   * leaving that slot untouched. */
1281251881Speter
1282251881Speter  val = svn_hash_gets(kwhash, SVN_KEYWORD_REVISION_LONG);
1283251881Speter  if (val)
1284251881Speter    kw->revision = val;
1285251881Speter
1286251881Speter  val = svn_hash_gets(kwhash, SVN_KEYWORD_DATE_LONG);
1287251881Speter  if (val)
1288251881Speter    kw->date = val;
1289251881Speter
1290251881Speter  val = svn_hash_gets(kwhash, SVN_KEYWORD_AUTHOR_LONG);
1291251881Speter  if (val)
1292251881Speter    kw->author = val;
1293251881Speter
1294251881Speter  val = svn_hash_gets(kwhash, SVN_KEYWORD_URL_LONG);
1295251881Speter  if (val)
1296251881Speter    kw->url = val;
1297251881Speter
1298251881Speter  val = svn_hash_gets(kwhash, SVN_KEYWORD_ID);
1299251881Speter  if (val)
1300251881Speter    kw->id = val;
1301251881Speter
1302251881Speter  return SVN_NO_ERROR;
1303251881Speter}
1304251881Speter
1305262253Speter/*** From version.c ***/
1306262253Spetersvn_error_t *
1307262253Spetersvn_ver_check_list(const svn_version_t *my_version,
1308262253Speter                   const svn_version_checklist_t *checklist)
1309262253Speter{
1310262253Speter  return svn_ver_check_list2(my_version, checklist, svn_ver_compatible);
1311262253Speter}
1312