deprecated.c revision 309511
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
31289180Speter#include <apr_md5.h>
32289180Speter
33251881Speter/* We define this here to remove any further warnings about the usage of
34251881Speter   deprecated functions in this file. */
35251881Speter#define SVN_DEPRECATED
36251881Speter
37251881Speter#include "svn_hash.h"
38251881Speter#include "svn_subst.h"
39251881Speter#include "svn_path.h"
40251881Speter#include "svn_opt.h"
41251881Speter#include "svn_cmdline.h"
42251881Speter#include "svn_version.h"
43251881Speter#include "svn_pools.h"
44251881Speter#include "svn_dso.h"
45251881Speter#include "svn_mergeinfo.h"
46251881Speter#include "svn_utf.h"
47251881Speter#include "svn_xml.h"
48289180Speter#include "svn_auth.h"
49251881Speter
50251881Speter#include "opt.h"
51289180Speter#include "auth.h"
52251881Speter#include "private/svn_opt_private.h"
53251881Speter#include "private/svn_mergeinfo_private.h"
54251881Speter
55251881Speter#include "svn_private_config.h"
56251881Speter
57251881Speter
58251881Speter
59251881Speter
60251881Speter/*** Code. ***/
61251881Speter
62251881Speter/*** From subst.c ***/
63251881Speter/* Convert an old-style svn_subst_keywords_t struct * into a new-style
64251881Speter * keywords hash.  Keyword values are shallow copies, so the produced
65251881Speter * hash must not be assumed to have lifetime longer than the struct it
66251881Speter * is based on.  A NULL input causes a NULL output. */
67251881Speterstatic apr_hash_t *
68251881Speterkwstruct_to_kwhash(const svn_subst_keywords_t *kwstruct,
69251881Speter                   apr_pool_t *pool)
70251881Speter{
71251881Speter  apr_hash_t *kwhash;
72251881Speter
73251881Speter  if (kwstruct == NULL)
74251881Speter    return NULL;
75251881Speter
76251881Speter  kwhash = apr_hash_make(pool);
77251881Speter
78251881Speter  if (kwstruct->revision)
79251881Speter    {
80251881Speter      svn_hash_sets(kwhash, SVN_KEYWORD_REVISION_LONG, kwstruct->revision);
81251881Speter      svn_hash_sets(kwhash, SVN_KEYWORD_REVISION_MEDIUM, kwstruct->revision);
82251881Speter      svn_hash_sets(kwhash, SVN_KEYWORD_REVISION_SHORT, kwstruct->revision);
83251881Speter    }
84251881Speter  if (kwstruct->date)
85251881Speter    {
86251881Speter      svn_hash_sets(kwhash, SVN_KEYWORD_DATE_LONG, kwstruct->date);
87251881Speter      svn_hash_sets(kwhash, SVN_KEYWORD_DATE_SHORT, kwstruct->date);
88251881Speter    }
89251881Speter  if (kwstruct->author)
90251881Speter    {
91251881Speter      svn_hash_sets(kwhash, SVN_KEYWORD_AUTHOR_LONG, kwstruct->author);
92251881Speter      svn_hash_sets(kwhash, SVN_KEYWORD_AUTHOR_SHORT, kwstruct->author);
93251881Speter    }
94251881Speter  if (kwstruct->url)
95251881Speter    {
96251881Speter      svn_hash_sets(kwhash, SVN_KEYWORD_URL_LONG, kwstruct->url);
97251881Speter      svn_hash_sets(kwhash, SVN_KEYWORD_URL_SHORT, kwstruct->url);
98251881Speter    }
99251881Speter  if (kwstruct->id)
100251881Speter    {
101251881Speter      svn_hash_sets(kwhash, SVN_KEYWORD_ID, kwstruct->id);
102251881Speter    }
103251881Speter
104251881Speter  return kwhash;
105251881Speter}
106251881Speter
107251881Speter
108251881Spetersvn_error_t *
109251881Spetersvn_subst_translate_stream3(svn_stream_t *src_stream,
110251881Speter                            svn_stream_t *dst_stream,
111251881Speter                            const char *eol_str,
112251881Speter                            svn_boolean_t repair,
113251881Speter                            apr_hash_t *keywords,
114251881Speter                            svn_boolean_t expand,
115251881Speter                            apr_pool_t *pool)
116251881Speter{
117251881Speter  /* The docstring requires that *some* translation be requested. */
118251881Speter  SVN_ERR_ASSERT(eol_str || keywords);
119251881Speter
120251881Speter  /* We don't want the copy3 to close the provided streams. */
121251881Speter  src_stream = svn_stream_disown(src_stream, pool);
122251881Speter  dst_stream = svn_stream_disown(dst_stream, pool);
123251881Speter
124251881Speter  /* Wrap the destination stream with our translation stream. It is more
125251881Speter     efficient than wrapping the source stream. */
126251881Speter  dst_stream = svn_subst_stream_translated(dst_stream, eol_str, repair,
127251881Speter                                           keywords, expand, pool);
128251881Speter
129251881Speter  return svn_error_trace(svn_stream_copy3(src_stream, dst_stream,
130251881Speter                                          NULL, NULL, pool));
131251881Speter}
132251881Speter
133251881Spetersvn_error_t *
134251881Spetersvn_subst_translate_stream2(svn_stream_t *s, /* src stream */
135251881Speter                            svn_stream_t *d, /* dst stream */
136251881Speter                            const char *eol_str,
137251881Speter                            svn_boolean_t repair,
138251881Speter                            const svn_subst_keywords_t *keywords,
139251881Speter                            svn_boolean_t expand,
140251881Speter                            apr_pool_t *pool)
141251881Speter{
142251881Speter  apr_hash_t *kh = kwstruct_to_kwhash(keywords, pool);
143251881Speter
144251881Speter  return svn_error_trace(svn_subst_translate_stream3(s, d, eol_str, repair,
145251881Speter                                                     kh, expand, pool));
146251881Speter}
147251881Speter
148251881Spetersvn_error_t *
149251881Spetersvn_subst_translate_stream(svn_stream_t *s, /* src stream */
150251881Speter                           svn_stream_t *d, /* dst stream */
151251881Speter                           const char *eol_str,
152251881Speter                           svn_boolean_t repair,
153251881Speter                           const svn_subst_keywords_t *keywords,
154251881Speter                           svn_boolean_t expand)
155251881Speter{
156251881Speter  apr_pool_t *pool = svn_pool_create(NULL);
157251881Speter  svn_error_t *err = svn_subst_translate_stream2(s, d, eol_str, repair,
158251881Speter                                                 keywords, expand, pool);
159251881Speter  svn_pool_destroy(pool);
160251881Speter  return svn_error_trace(err);
161251881Speter}
162251881Speter
163251881Spetersvn_error_t *
164251881Spetersvn_subst_translate_cstring(const char *src,
165251881Speter                            const char **dst,
166251881Speter                            const char *eol_str,
167251881Speter                            svn_boolean_t repair,
168251881Speter                            const svn_subst_keywords_t *keywords,
169251881Speter                            svn_boolean_t expand,
170251881Speter                            apr_pool_t *pool)
171251881Speter{
172251881Speter  apr_hash_t *kh = kwstruct_to_kwhash(keywords, pool);
173251881Speter
174251881Speter  return svn_error_trace(svn_subst_translate_cstring2(src, dst, eol_str,
175251881Speter                                                      repair, kh, expand,
176251881Speter                                                      pool));
177251881Speter}
178251881Speter
179251881Spetersvn_error_t *
180251881Spetersvn_subst_copy_and_translate(const char *src,
181251881Speter                             const char *dst,
182251881Speter                             const char *eol_str,
183251881Speter                             svn_boolean_t repair,
184251881Speter                             const svn_subst_keywords_t *keywords,
185251881Speter                             svn_boolean_t expand,
186251881Speter                             apr_pool_t *pool)
187251881Speter{
188251881Speter  return svn_error_trace(svn_subst_copy_and_translate2(src, dst, eol_str,
189251881Speter                                                       repair, keywords,
190251881Speter                                                       expand, FALSE, pool));
191251881Speter}
192251881Speter
193251881Spetersvn_error_t *
194251881Spetersvn_subst_copy_and_translate2(const char *src,
195251881Speter                              const char *dst,
196251881Speter                              const char *eol_str,
197251881Speter                              svn_boolean_t repair,
198251881Speter                              const svn_subst_keywords_t *keywords,
199251881Speter                              svn_boolean_t expand,
200251881Speter                              svn_boolean_t special,
201251881Speter                              apr_pool_t *pool)
202251881Speter{
203251881Speter  apr_hash_t *kh = kwstruct_to_kwhash(keywords, pool);
204251881Speter
205251881Speter  return svn_error_trace(svn_subst_copy_and_translate3(src, dst, eol_str,
206251881Speter                                                       repair, kh, expand,
207251881Speter                                                       special, pool));
208251881Speter}
209251881Speter
210251881Spetersvn_error_t *
211251881Spetersvn_subst_copy_and_translate3(const char *src,
212251881Speter                              const char *dst,
213251881Speter                              const char *eol_str,
214251881Speter                              svn_boolean_t repair,
215251881Speter                              apr_hash_t *keywords,
216251881Speter                              svn_boolean_t expand,
217251881Speter                              svn_boolean_t special,
218251881Speter                              apr_pool_t *pool)
219251881Speter{
220251881Speter  return svn_error_trace(svn_subst_copy_and_translate4(src, dst, eol_str,
221251881Speter                                                       repair, keywords,
222251881Speter                                                       expand, special,
223251881Speter                                                       NULL, NULL,
224251881Speter                                                       pool));
225251881Speter}
226251881Speter
227251881Speter
228251881Spetersvn_error_t *
229251881Spetersvn_subst_stream_translated_to_normal_form(svn_stream_t **stream,
230251881Speter                                           svn_stream_t *source,
231251881Speter                                           svn_subst_eol_style_t eol_style,
232251881Speter                                           const char *eol_str,
233251881Speter                                           svn_boolean_t always_repair_eols,
234251881Speter                                           apr_hash_t *keywords,
235251881Speter                                           apr_pool_t *pool)
236251881Speter{
237251881Speter  if (eol_style == svn_subst_eol_style_native)
238251881Speter    eol_str = SVN_SUBST_NATIVE_EOL_STR;
239251881Speter  else if (! (eol_style == svn_subst_eol_style_fixed
240251881Speter              || eol_style == svn_subst_eol_style_none))
241251881Speter    return svn_error_create(SVN_ERR_IO_UNKNOWN_EOL, NULL, NULL);
242251881Speter
243251881Speter *stream = svn_subst_stream_translated(source, eol_str,
244251881Speter                                       eol_style == svn_subst_eol_style_fixed
245251881Speter                                       || always_repair_eols,
246251881Speter                                       keywords, FALSE, pool);
247251881Speter
248251881Speter return SVN_NO_ERROR;
249251881Speter}
250251881Speter
251251881Spetersvn_error_t *
252251881Spetersvn_subst_translate_string(svn_string_t **new_value,
253251881Speter                           const svn_string_t *value,
254251881Speter                           const char *encoding,
255251881Speter                           apr_pool_t *pool)
256251881Speter{
257251881Speter  return svn_subst_translate_string2(new_value, NULL, NULL, value,
258251881Speter                                     encoding, FALSE, pool, pool);
259251881Speter}
260251881Speter
261251881Spetersvn_error_t *
262251881Spetersvn_subst_stream_detranslated(svn_stream_t **stream_p,
263251881Speter                              const char *src,
264251881Speter                              svn_subst_eol_style_t eol_style,
265251881Speter                              const char *eol_str,
266251881Speter                              svn_boolean_t always_repair_eols,
267251881Speter                              apr_hash_t *keywords,
268251881Speter                              svn_boolean_t special,
269251881Speter                              apr_pool_t *pool)
270251881Speter{
271251881Speter  svn_stream_t *src_stream;
272251881Speter
273251881Speter  if (special)
274251881Speter    return svn_subst_read_specialfile(stream_p, src, pool, pool);
275251881Speter
276251881Speter  /* This will be closed by svn_subst_stream_translated_to_normal_form
277251881Speter     when the returned stream is closed. */
278251881Speter  SVN_ERR(svn_stream_open_readonly(&src_stream, src, pool, pool));
279251881Speter
280251881Speter  return svn_error_trace(svn_subst_stream_translated_to_normal_form(
281251881Speter                           stream_p, src_stream,
282251881Speter                           eol_style, eol_str,
283251881Speter                           always_repair_eols,
284251881Speter                           keywords, pool));
285251881Speter}
286251881Speter
287251881Spetersvn_error_t *
288251881Spetersvn_subst_translate_to_normal_form(const char *src,
289251881Speter                                   const char *dst,
290251881Speter                                   svn_subst_eol_style_t eol_style,
291251881Speter                                   const char *eol_str,
292251881Speter                                   svn_boolean_t always_repair_eols,
293251881Speter                                   apr_hash_t *keywords,
294251881Speter                                   svn_boolean_t special,
295251881Speter                                   apr_pool_t *pool)
296251881Speter{
297251881Speter
298251881Speter  if (eol_style == svn_subst_eol_style_native)
299251881Speter    eol_str = SVN_SUBST_NATIVE_EOL_STR;
300251881Speter  else if (! (eol_style == svn_subst_eol_style_fixed
301251881Speter              || eol_style == svn_subst_eol_style_none))
302251881Speter    return svn_error_create(SVN_ERR_IO_UNKNOWN_EOL, NULL, NULL);
303251881Speter
304251881Speter  return svn_error_trace(svn_subst_copy_and_translate3(
305251881Speter                           src, dst, eol_str,
306251881Speter                           eol_style == svn_subst_eol_style_fixed
307251881Speter                             || always_repair_eols,
308251881Speter                           keywords,
309251881Speter                           FALSE /* contract keywords */,
310251881Speter                           special,
311251881Speter                           pool));
312251881Speter}
313251881Speter
314251881Speter
315251881Speter/*** From opt.c ***/
316251881Speter/* Same as print_command_info2(), but with deprecated struct revision. */
317251881Speterstatic svn_error_t *
318251881Speterprint_command_info(const svn_opt_subcommand_desc_t *cmd,
319251881Speter                   const apr_getopt_option_t *options_table,
320251881Speter                   svn_boolean_t help,
321251881Speter                   apr_pool_t *pool,
322251881Speter                   FILE *stream)
323251881Speter{
324251881Speter  svn_boolean_t first_time;
325251881Speter  apr_size_t i;
326251881Speter
327251881Speter  /* Print the canonical command name. */
328251881Speter  SVN_ERR(svn_cmdline_fputs(cmd->name, stream, pool));
329251881Speter
330251881Speter  /* Print the list of aliases. */
331251881Speter  first_time = TRUE;
332251881Speter  for (i = 0; i < SVN_OPT_MAX_ALIASES; i++)
333251881Speter    {
334251881Speter      if (cmd->aliases[i] == NULL)
335251881Speter        break;
336251881Speter
337251881Speter      if (first_time) {
338251881Speter        SVN_ERR(svn_cmdline_fputs(" (", stream, pool));
339251881Speter        first_time = FALSE;
340251881Speter      }
341251881Speter      else
342251881Speter        SVN_ERR(svn_cmdline_fputs(", ", stream, pool));
343251881Speter
344251881Speter      SVN_ERR(svn_cmdline_fputs(cmd->aliases[i], stream, pool));
345251881Speter    }
346251881Speter
347251881Speter  if (! first_time)
348251881Speter    SVN_ERR(svn_cmdline_fputs(")", stream, pool));
349251881Speter
350251881Speter  if (help)
351251881Speter    {
352251881Speter      const apr_getopt_option_t *option;
353251881Speter      svn_boolean_t have_options = FALSE;
354251881Speter
355251881Speter      SVN_ERR(svn_cmdline_fprintf(stream, pool, ": %s", _(cmd->help)));
356251881Speter
357251881Speter      /* Loop over all valid option codes attached to the subcommand */
358251881Speter      for (i = 0; i < SVN_OPT_MAX_OPTIONS; i++)
359251881Speter        {
360251881Speter          if (cmd->valid_options[i])
361251881Speter            {
362251881Speter              if (!have_options)
363251881Speter                {
364251881Speter                  SVN_ERR(svn_cmdline_fputs(_("\nValid options:\n"),
365251881Speter                                            stream, pool));
366251881Speter                  have_options = TRUE;
367251881Speter                }
368251881Speter
369251881Speter              /* convert each option code into an option */
370251881Speter              option =
371251881Speter                svn_opt_get_option_from_code2(cmd->valid_options[i],
372251881Speter                                              options_table, NULL, pool);
373251881Speter
374251881Speter              /* print the option's docstring */
375251881Speter              if (option && option->description)
376251881Speter                {
377251881Speter                  const char *optstr;
378251881Speter                  svn_opt_format_option(&optstr, option, TRUE, pool);
379251881Speter                  SVN_ERR(svn_cmdline_fprintf(stream, pool, "  %s\n",
380251881Speter                                              optstr));
381251881Speter                }
382251881Speter            }
383251881Speter        }
384251881Speter
385251881Speter      if (have_options)
386251881Speter        SVN_ERR(svn_cmdline_fprintf(stream, pool, "\n"));
387251881Speter    }
388251881Speter
389251881Speter  return SVN_NO_ERROR;
390251881Speter}
391251881Speter
392251881Speterconst svn_opt_subcommand_desc_t *
393251881Spetersvn_opt_get_canonical_subcommand(const svn_opt_subcommand_desc_t *table,
394251881Speter                                 const char *cmd_name)
395251881Speter{
396251881Speter  int i = 0;
397251881Speter
398251881Speter  if (cmd_name == NULL)
399251881Speter    return NULL;
400251881Speter
401251881Speter  while (table[i].name) {
402251881Speter    int j;
403251881Speter    if (strcmp(cmd_name, table[i].name) == 0)
404251881Speter      return table + i;
405251881Speter    for (j = 0; (j < SVN_OPT_MAX_ALIASES) && table[i].aliases[j]; j++)
406251881Speter      if (strcmp(cmd_name, table[i].aliases[j]) == 0)
407251881Speter        return table + i;
408251881Speter
409251881Speter    i++;
410251881Speter  }
411251881Speter
412251881Speter  /* If we get here, there was no matching subcommand name or alias. */
413251881Speter  return NULL;
414251881Speter}
415251881Speter
416251881Spetervoid
417251881Spetersvn_opt_subcommand_help2(const char *subcommand,
418251881Speter                         const svn_opt_subcommand_desc2_t *table,
419251881Speter                         const apr_getopt_option_t *options_table,
420251881Speter                         apr_pool_t *pool)
421251881Speter{
422251881Speter  svn_opt_subcommand_help3(subcommand, table, options_table,
423251881Speter                           NULL, pool);
424251881Speter}
425251881Speter
426251881Spetervoid
427251881Spetersvn_opt_subcommand_help(const char *subcommand,
428251881Speter                        const svn_opt_subcommand_desc_t *table,
429251881Speter                        const apr_getopt_option_t *options_table,
430251881Speter                        apr_pool_t *pool)
431251881Speter{
432251881Speter  const svn_opt_subcommand_desc_t *cmd =
433251881Speter    svn_opt_get_canonical_subcommand(table, subcommand);
434251881Speter  svn_error_t *err;
435251881Speter
436251881Speter  if (cmd)
437251881Speter    err = print_command_info(cmd, options_table, TRUE, pool, stdout);
438251881Speter  else
439251881Speter    err = svn_cmdline_fprintf(stderr, pool,
440251881Speter                              _("\"%s\": unknown command.\n\n"), subcommand);
441251881Speter
442251881Speter  if (err) {
443251881Speter    svn_handle_error2(err, stderr, FALSE, "svn: ");
444251881Speter    svn_error_clear(err);
445251881Speter  }
446251881Speter}
447251881Speter
448251881Spetersvn_error_t *
449251881Spetersvn_opt_args_to_target_array3(apr_array_header_t **targets_p,
450251881Speter                              apr_getopt_t *os,
451251881Speter                              const apr_array_header_t *known_targets,
452251881Speter                              apr_pool_t *pool)
453251881Speter{
454251881Speter  return svn_error_trace(svn_opt__args_to_target_array(targets_p, os,
455251881Speter                                                       known_targets, pool));
456251881Speter}
457251881Speter
458251881Spetersvn_error_t *
459251881Spetersvn_opt_args_to_target_array2(apr_array_header_t **targets_p,
460251881Speter                              apr_getopt_t *os,
461251881Speter                              const apr_array_header_t *known_targets,
462251881Speter                              apr_pool_t *pool)
463251881Speter{
464251881Speter  svn_error_t *err = svn_opt_args_to_target_array3(targets_p, os,
465251881Speter                                                   known_targets, pool);
466251881Speter
467251881Speter  if (err && err->apr_err == SVN_ERR_RESERVED_FILENAME_SPECIFIED)
468251881Speter    {
469251881Speter      svn_error_clear(err);
470251881Speter      return SVN_NO_ERROR;
471251881Speter    }
472251881Speter
473251881Speter  return err;
474251881Speter}
475251881Speter
476251881Spetersvn_error_t *
477251881Spetersvn_opt_args_to_target_array(apr_array_header_t **targets_p,
478251881Speter                             apr_getopt_t *os,
479251881Speter                             const apr_array_header_t *known_targets,
480251881Speter                             svn_opt_revision_t *start_revision,
481251881Speter                             svn_opt_revision_t *end_revision,
482251881Speter                             svn_boolean_t extract_revisions,
483251881Speter                             apr_pool_t *pool)
484251881Speter{
485251881Speter  apr_array_header_t *output_targets;
486251881Speter
487251881Speter  SVN_ERR(svn_opt_args_to_target_array2(&output_targets, os,
488251881Speter                                        known_targets, pool));
489251881Speter
490251881Speter  if (extract_revisions)
491251881Speter    {
492251881Speter      svn_opt_revision_t temprev;
493251881Speter      const char *path;
494251881Speter
495251881Speter      if (output_targets->nelts > 0)
496251881Speter        {
497251881Speter          path = APR_ARRAY_IDX(output_targets, 0, const char *);
498251881Speter          SVN_ERR(svn_opt_parse_path(&temprev, &path, path, pool));
499251881Speter          if (temprev.kind != svn_opt_revision_unspecified)
500251881Speter            {
501251881Speter              APR_ARRAY_IDX(output_targets, 0, const char *) = path;
502251881Speter              start_revision->kind = temprev.kind;
503251881Speter              start_revision->value = temprev.value;
504251881Speter            }
505251881Speter        }
506251881Speter      if (output_targets->nelts > 1)
507251881Speter        {
508251881Speter          path = APR_ARRAY_IDX(output_targets, 1, const char *);
509251881Speter          SVN_ERR(svn_opt_parse_path(&temprev, &path, path, pool));
510251881Speter          if (temprev.kind != svn_opt_revision_unspecified)
511251881Speter            {
512251881Speter              APR_ARRAY_IDX(output_targets, 1, const char *) = path;
513251881Speter              end_revision->kind = temprev.kind;
514251881Speter              end_revision->value = temprev.value;
515251881Speter            }
516251881Speter        }
517251881Speter    }
518251881Speter
519251881Speter  *targets_p = output_targets;
520251881Speter  return SVN_NO_ERROR;
521251881Speter}
522251881Speter
523251881Spetersvn_error_t *
524251881Spetersvn_opt_print_help3(apr_getopt_t *os,
525251881Speter                    const char *pgm_name,
526251881Speter                    svn_boolean_t print_version,
527251881Speter                    svn_boolean_t quiet,
528251881Speter                    const char *version_footer,
529251881Speter                    const char *header,
530251881Speter                    const svn_opt_subcommand_desc2_t *cmd_table,
531251881Speter                    const apr_getopt_option_t *option_table,
532251881Speter                    const int *global_options,
533251881Speter                    const char *footer,
534251881Speter                    apr_pool_t *pool)
535251881Speter{
536251881Speter  return svn_error_trace(svn_opt_print_help4(os,
537251881Speter                                             pgm_name,
538251881Speter                                             print_version,
539251881Speter                                             quiet,
540251881Speter                                             FALSE,
541251881Speter                                             version_footer,
542251881Speter                                             header,
543251881Speter                                             cmd_table,
544251881Speter                                             option_table,
545251881Speter                                             global_options,
546251881Speter                                             footer,
547251881Speter                                             pool));
548251881Speter}
549251881Speter
550251881Spetersvn_error_t *
551251881Spetersvn_opt_print_help2(apr_getopt_t *os,
552251881Speter                    const char *pgm_name,
553251881Speter                    svn_boolean_t print_version,
554251881Speter                    svn_boolean_t quiet,
555251881Speter                    const char *version_footer,
556251881Speter                    const char *header,
557251881Speter                    const svn_opt_subcommand_desc2_t *cmd_table,
558251881Speter                    const apr_getopt_option_t *option_table,
559251881Speter                    const char *footer,
560251881Speter                    apr_pool_t *pool)
561251881Speter{
562251881Speter  return svn_error_trace(svn_opt_print_help4(os,
563251881Speter                                             pgm_name,
564251881Speter                                             print_version,
565251881Speter                                             quiet,
566251881Speter                                             FALSE,
567251881Speter                                             version_footer,
568251881Speter                                             header,
569251881Speter                                             cmd_table,
570251881Speter                                             option_table,
571251881Speter                                             NULL,
572251881Speter                                             footer,
573251881Speter                                             pool));
574251881Speter}
575251881Speter
576251881Spetersvn_error_t *
577251881Spetersvn_opt_print_help(apr_getopt_t *os,
578251881Speter                   const char *pgm_name,
579251881Speter                   svn_boolean_t print_version,
580251881Speter                   svn_boolean_t quiet,
581251881Speter                   const char *version_footer,
582251881Speter                   const char *header,
583251881Speter                   const svn_opt_subcommand_desc_t *cmd_table,
584251881Speter                   const apr_getopt_option_t *option_table,
585251881Speter                   const char *footer,
586251881Speter                   apr_pool_t *pool)
587251881Speter{
588251881Speter  apr_array_header_t *targets = NULL;
589251881Speter
590251881Speter  if (os)
591251881Speter    SVN_ERR(svn_opt_parse_all_args(&targets, os, pool));
592251881Speter
593251881Speter  if (os && targets->nelts)  /* help on subcommand(s) requested */
594251881Speter    {
595251881Speter      int i;
596251881Speter
597251881Speter      for (i = 0; i < targets->nelts; i++)
598251881Speter        {
599251881Speter          svn_opt_subcommand_help(APR_ARRAY_IDX(targets, i, const char *),
600251881Speter                                  cmd_table, option_table, pool);
601251881Speter        }
602251881Speter    }
603251881Speter  else if (print_version)   /* just --version */
604251881Speter    {
605251881Speter      SVN_ERR(svn_opt__print_version_info(pgm_name, version_footer,
606251881Speter                                          svn_version_extended(FALSE, pool),
607251881Speter                                          quiet, FALSE, pool));
608251881Speter    }
609251881Speter  else if (os && !targets->nelts)            /* `-h', `--help', or `help' */
610251881Speter    svn_opt_print_generic_help(header,
611251881Speter                               cmd_table,
612251881Speter                               option_table,
613251881Speter                               footer,
614251881Speter                               pool,
615251881Speter                               stdout);
616251881Speter  else                                       /* unknown option or cmd */
617251881Speter    SVN_ERR(svn_cmdline_fprintf(stderr, pool,
618251881Speter                                _("Type '%s help' for usage.\n"), pgm_name));
619251881Speter
620251881Speter  return SVN_NO_ERROR;
621251881Speter}
622251881Speter
623251881Spetervoid
624251881Spetersvn_opt_print_generic_help(const char *header,
625251881Speter                           const svn_opt_subcommand_desc_t *cmd_table,
626251881Speter                           const apr_getopt_option_t *opt_table,
627251881Speter                           const char *footer,
628251881Speter                           apr_pool_t *pool, FILE *stream)
629251881Speter{
630251881Speter  int i = 0;
631251881Speter  svn_error_t *err;
632251881Speter
633251881Speter  if (header)
634251881Speter    if ((err = svn_cmdline_fputs(header, stream, pool)))
635251881Speter      goto print_error;
636251881Speter
637251881Speter  while (cmd_table[i].name)
638251881Speter    {
639251881Speter      if ((err = svn_cmdline_fputs("   ", stream, pool))
640251881Speter          || (err = print_command_info(cmd_table + i, opt_table, FALSE,
641251881Speter                                       pool, stream))
642251881Speter          || (err = svn_cmdline_fputs("\n", stream, pool)))
643251881Speter        goto print_error;
644251881Speter      i++;
645251881Speter    }
646251881Speter
647251881Speter  if ((err = svn_cmdline_fputs("\n", stream, pool)))
648251881Speter    goto print_error;
649251881Speter
650251881Speter  if (footer)
651251881Speter    if ((err = svn_cmdline_fputs(footer, stream, pool)))
652251881Speter      goto print_error;
653251881Speter
654251881Speter  return;
655251881Speter
656251881Speter print_error:
657251881Speter  svn_handle_error2(err, stderr, FALSE, "svn: ");
658251881Speter  svn_error_clear(err);
659251881Speter}
660251881Speter
661251881Speter/*** From io.c ***/
662251881Spetersvn_error_t *
663251881Spetersvn_io_open_unique_file2(apr_file_t **file,
664251881Speter                         const char **temp_path,
665251881Speter                         const char *path,
666251881Speter                         const char *suffix,
667251881Speter                         svn_io_file_del_t delete_when,
668251881Speter                         apr_pool_t *pool)
669251881Speter{
670251881Speter  const char *dirpath;
671251881Speter  const char *filename;
672251881Speter
673251881Speter  svn_path_split(path, &dirpath, &filename, pool);
674251881Speter  return svn_error_trace(svn_io_open_uniquely_named(file, temp_path,
675251881Speter                                                    dirpath, filename, suffix,
676251881Speter                                                    delete_when,
677251881Speter                                                    pool, pool));
678251881Speter}
679251881Speter
680251881Spetersvn_error_t *
681251881Spetersvn_io_open_unique_file(apr_file_t **file,
682251881Speter                        const char **temp_path,
683251881Speter                        const char *path,
684251881Speter                        const char *suffix,
685251881Speter                        svn_boolean_t delete_on_close,
686251881Speter                        apr_pool_t *pool)
687251881Speter{
688251881Speter  return svn_error_trace(svn_io_open_unique_file2(file, temp_path,
689251881Speter                                                  path, suffix,
690251881Speter                                                  delete_on_close
691251881Speter                                                    ? svn_io_file_del_on_close
692251881Speter                                                    : svn_io_file_del_none,
693251881Speter                                                  pool));
694251881Speter}
695251881Speter
696251881Spetersvn_error_t *
697251881Spetersvn_io_run_diff(const char *dir,
698251881Speter                const char *const *user_args,
699251881Speter                int num_user_args,
700251881Speter                const char *label1,
701251881Speter                const char *label2,
702251881Speter                const char *from,
703251881Speter                const char *to,
704251881Speter                int *pexitcode,
705251881Speter                apr_file_t *outfile,
706251881Speter                apr_file_t *errfile,
707251881Speter                const char *diff_cmd,
708251881Speter                apr_pool_t *pool)
709251881Speter{
710251881Speter  SVN_ERR(svn_path_cstring_to_utf8(&diff_cmd, diff_cmd, pool));
711251881Speter
712251881Speter  return svn_error_trace(svn_io_run_diff2(dir, user_args, num_user_args,
713251881Speter                                          label1, label2,
714251881Speter                                          from, to, pexitcode,
715251881Speter                                          outfile, errfile, diff_cmd,
716251881Speter                                          pool));
717251881Speter}
718251881Speter
719251881Spetersvn_error_t *
720251881Spetersvn_io_run_diff3_2(int *exitcode,
721251881Speter                   const char *dir,
722251881Speter                   const char *mine,
723251881Speter                   const char *older,
724251881Speter                   const char *yours,
725251881Speter                   const char *mine_label,
726251881Speter                   const char *older_label,
727251881Speter                   const char *yours_label,
728251881Speter                   apr_file_t *merged,
729251881Speter                   const char *diff3_cmd,
730251881Speter                   const apr_array_header_t *user_args,
731251881Speter                   apr_pool_t *pool)
732251881Speter{
733251881Speter  SVN_ERR(svn_path_cstring_to_utf8(&diff3_cmd, diff3_cmd, pool));
734251881Speter
735251881Speter  return svn_error_trace(svn_io_run_diff3_3(exitcode, dir,
736251881Speter                                            mine, older, yours,
737251881Speter                                            mine_label, older_label,
738251881Speter                                            yours_label, merged,
739251881Speter                                            diff3_cmd, user_args, pool));
740251881Speter}
741251881Speter
742251881Spetersvn_error_t *
743251881Spetersvn_io_run_diff3(const char *dir,
744251881Speter                 const char *mine,
745251881Speter                 const char *older,
746251881Speter                 const char *yours,
747251881Speter                 const char *mine_label,
748251881Speter                 const char *older_label,
749251881Speter                 const char *yours_label,
750251881Speter                 apr_file_t *merged,
751251881Speter                 int *exitcode,
752251881Speter                 const char *diff3_cmd,
753251881Speter                 apr_pool_t *pool)
754251881Speter{
755251881Speter  return svn_error_trace(svn_io_run_diff3_2(exitcode, dir, mine, older, yours,
756251881Speter                                            mine_label, older_label,
757251881Speter                                            yours_label,
758251881Speter                                            merged, diff3_cmd, NULL, pool));
759251881Speter}
760251881Speter
761251881Spetersvn_error_t *
762251881Spetersvn_io_remove_file(const char *path,
763251881Speter                   apr_pool_t *scratch_pool)
764251881Speter{
765251881Speter  return svn_error_trace(svn_io_remove_file2(path, FALSE, scratch_pool));
766251881Speter}
767251881Speter
768251881Spetersvn_error_t *svn_io_file_lock(const char *lock_file,
769251881Speter                              svn_boolean_t exclusive,
770251881Speter                              apr_pool_t *pool)
771251881Speter{
772251881Speter  return svn_io_file_lock2(lock_file, exclusive, FALSE, pool);
773251881Speter}
774251881Speter
775251881Spetersvn_error_t *
776251881Spetersvn_io_get_dirents2(apr_hash_t **dirents,
777251881Speter                    const char *path,
778251881Speter                    apr_pool_t *pool)
779251881Speter{
780251881Speter  /* Note that the first part of svn_io_dirent2_t is identical
781251881Speter     to svn_io_dirent_t to allow this construct */
782251881Speter  return svn_error_trace(
783251881Speter            svn_io_get_dirents3(dirents, path, FALSE, pool, pool));
784251881Speter}
785251881Speter
786251881Spetersvn_error_t *
787251881Spetersvn_io_get_dirents(apr_hash_t **dirents,
788251881Speter                   const char *path,
789251881Speter                   apr_pool_t *pool)
790251881Speter{
791251881Speter  /* Note that in C, padding is not allowed at the beginning of structs,
792251881Speter     so this is actually portable, since the kind field of svn_io_dirent_t
793251881Speter     is first in that struct. */
794251881Speter  return svn_io_get_dirents2(dirents, path, pool);
795251881Speter}
796251881Speter
797251881Spetersvn_error_t *
798251881Spetersvn_io_start_cmd2(apr_proc_t *cmd_proc,
799251881Speter                  const char *path,
800251881Speter                  const char *cmd,
801251881Speter                  const char *const *args,
802251881Speter                  svn_boolean_t inherit,
803251881Speter                  svn_boolean_t infile_pipe,
804251881Speter                  apr_file_t *infile,
805251881Speter                  svn_boolean_t outfile_pipe,
806251881Speter                  apr_file_t *outfile,
807251881Speter                  svn_boolean_t errfile_pipe,
808251881Speter                  apr_file_t *errfile,
809251881Speter                  apr_pool_t *pool)
810251881Speter{
811251881Speter  return svn_io_start_cmd3(cmd_proc, path, cmd, args, NULL, inherit,
812251881Speter                           infile_pipe, infile, outfile_pipe, outfile,
813251881Speter                           errfile_pipe, errfile, pool);
814251881Speter}
815251881Speter
816251881Spetersvn_error_t *
817251881Spetersvn_io_start_cmd(apr_proc_t *cmd_proc,
818251881Speter                 const char *path,
819251881Speter                 const char *cmd,
820251881Speter                 const char *const *args,
821251881Speter                 svn_boolean_t inherit,
822251881Speter                 apr_file_t *infile,
823251881Speter                 apr_file_t *outfile,
824251881Speter                 apr_file_t *errfile,
825251881Speter                 apr_pool_t *pool)
826251881Speter{
827251881Speter  return svn_io_start_cmd2(cmd_proc, path, cmd, args, inherit, FALSE,
828251881Speter                           infile, FALSE, outfile, FALSE, errfile, pool);
829251881Speter}
830251881Speter
831251881Spetersvn_error_t *
832251881Spetersvn_io_file_read_full(apr_file_t *file, void *buf,
833251881Speter                      apr_size_t nbytes, apr_size_t *bytes_read,
834251881Speter                      apr_pool_t *pool)
835251881Speter{
836251881Speter  return svn_io_file_read_full2(file, buf, nbytes, bytes_read, NULL, pool);
837251881Speter}
838251881Speter
839251881Speterstruct walk_func_filter_baton_t
840251881Speter{
841251881Speter  svn_io_walk_func_t walk_func;
842251881Speter  void *walk_baton;
843251881Speter};
844251881Speter
845251881Speter/* Implements svn_io_walk_func_t, but only allows APR_DIR and APR_REG
846251881Speter   finfo types through to the wrapped function/baton.  */
847251881Speterstatic svn_error_t *
848251881Speterwalk_func_filter_func(void *baton,
849251881Speter                      const char *path,
850251881Speter                      const apr_finfo_t *finfo,
851251881Speter                      apr_pool_t *pool)
852251881Speter{
853251881Speter  struct walk_func_filter_baton_t *b = baton;
854251881Speter
855251881Speter  if (finfo->filetype == APR_DIR || finfo->filetype == APR_REG)
856251881Speter    SVN_ERR(b->walk_func(b->walk_baton, path, finfo, pool));
857251881Speter
858251881Speter  return SVN_NO_ERROR;
859251881Speter}
860251881Speter
861251881Spetersvn_error_t *
862251881Spetersvn_io_dir_walk(const char *dirname,
863251881Speter                apr_int32_t wanted,
864251881Speter                svn_io_walk_func_t walk_func,
865251881Speter                void *walk_baton,
866251881Speter                apr_pool_t *pool)
867251881Speter{
868251881Speter  struct walk_func_filter_baton_t baton;
869251881Speter  baton.walk_func = walk_func;
870251881Speter  baton.walk_baton = walk_baton;
871251881Speter  return svn_error_trace(svn_io_dir_walk2(dirname, wanted,
872251881Speter                                          walk_func_filter_func,
873251881Speter                                          &baton, pool));
874251881Speter}
875251881Speter
876251881Spetersvn_error_t *
877251881Spetersvn_io_stat_dirent(const svn_io_dirent2_t **dirent_p,
878251881Speter                   const char *path,
879251881Speter                   svn_boolean_t ignore_enoent,
880251881Speter                   apr_pool_t *result_pool,
881251881Speter                   apr_pool_t *scratch_pool)
882251881Speter{
883251881Speter  return svn_error_trace(
884251881Speter            svn_io_stat_dirent2(dirent_p,
885251881Speter                                path,
886251881Speter                                FALSE,
887251881Speter                                ignore_enoent,
888251881Speter                                result_pool,
889251881Speter                                scratch_pool));
890251881Speter}
891251881Speter
892251881Speter/*** From constructors.c ***/
893251881Spetersvn_log_changed_path_t *
894251881Spetersvn_log_changed_path_dup(const svn_log_changed_path_t *changed_path,
895251881Speter                         apr_pool_t *pool)
896251881Speter{
897251881Speter  svn_log_changed_path_t *new_changed_path
898251881Speter    = apr_palloc(pool, sizeof(*new_changed_path));
899251881Speter
900251881Speter  *new_changed_path = *changed_path;
901251881Speter
902251881Speter  if (new_changed_path->copyfrom_path)
903251881Speter    new_changed_path->copyfrom_path =
904251881Speter      apr_pstrdup(pool, new_changed_path->copyfrom_path);
905251881Speter
906251881Speter  return new_changed_path;
907251881Speter}
908251881Speter
909251881Speter/*** From cmdline.c ***/
910251881Spetersvn_error_t *
911251881Spetersvn_cmdline_prompt_user(const char **result,
912251881Speter                        const char *prompt_str,
913251881Speter                        apr_pool_t *pool)
914251881Speter{
915251881Speter  return svn_error_trace(svn_cmdline_prompt_user2(result, prompt_str, NULL,
916251881Speter                                                  pool));
917251881Speter}
918251881Speter
919251881Spetersvn_error_t *
920251881Spetersvn_cmdline_setup_auth_baton(svn_auth_baton_t **ab,
921251881Speter                             svn_boolean_t non_interactive,
922251881Speter                             const char *auth_username,
923251881Speter                             const char *auth_password,
924251881Speter                             const char *config_dir,
925251881Speter                             svn_boolean_t no_auth_cache,
926251881Speter                             svn_config_t *cfg,
927251881Speter                             svn_cancel_func_t cancel_func,
928251881Speter                             void *cancel_baton,
929251881Speter                             apr_pool_t *pool)
930251881Speter{
931251881Speter  return svn_error_trace(svn_cmdline_create_auth_baton(
932251881Speter                           ab, non_interactive,
933251881Speter                           auth_username, auth_password,
934251881Speter                           config_dir, no_auth_cache, FALSE,
935251881Speter                           cfg, cancel_func, cancel_baton, pool));
936251881Speter}
937251881Speter
938251881Speter/*** From dso.c ***/
939251881Spetervoid
940251881Spetersvn_dso_initialize(void)
941251881Speter{
942251881Speter  svn_error_t *err = svn_dso_initialize2();
943251881Speter  if (err)
944251881Speter    {
945251881Speter      svn_error_clear(err);
946251881Speter      abort();
947251881Speter    }
948251881Speter}
949251881Speter
950251881Speter/*** From simple_providers.c ***/
951251881Spetervoid
952251881Spetersvn_auth_get_simple_provider(svn_auth_provider_object_t **provider,
953251881Speter                             apr_pool_t *pool)
954251881Speter{
955251881Speter  svn_auth_get_simple_provider2(provider, NULL, NULL, pool);
956251881Speter}
957251881Speter
958251881Speter/*** From ssl_client_cert_pw_providers.c ***/
959251881Spetervoid
960251881Spetersvn_auth_get_ssl_client_cert_pw_file_provider
961251881Speter  (svn_auth_provider_object_t **provider,
962251881Speter   apr_pool_t *pool)
963251881Speter{
964251881Speter  svn_auth_get_ssl_client_cert_pw_file_provider2(provider, NULL, NULL, pool);
965251881Speter}
966251881Speter
967251881Speter/*** From path.c ***/
968251881Speter
969251881Speter#define SVN_EMPTY_PATH ""
970251881Speter
971251881Speterconst char *
972251881Spetersvn_path_url_add_component(const char *url,
973251881Speter                           const char *component,
974251881Speter                           apr_pool_t *pool)
975251881Speter{
976251881Speter  /* URL can have trailing '/' */
977251881Speter  url = svn_path_canonicalize(url, pool);
978251881Speter
979251881Speter  return svn_path_url_add_component2(url, component, pool);
980251881Speter}
981251881Speter
982251881Spetervoid
983251881Spetersvn_path_split(const char *path,
984251881Speter               const char **dirpath,
985251881Speter               const char **base_name,
986251881Speter               apr_pool_t *pool)
987251881Speter{
988251881Speter  assert(dirpath != base_name);
989251881Speter
990251881Speter  if (dirpath)
991251881Speter    *dirpath = svn_path_dirname(path, pool);
992251881Speter
993251881Speter  if (base_name)
994251881Speter    *base_name = svn_path_basename(path, pool);
995251881Speter}
996251881Speter
997251881Speter
998251881Spetersvn_error_t *
999251881Spetersvn_path_split_if_file(const char *path,
1000251881Speter                       const char **pdirectory,
1001251881Speter                       const char **pfile,
1002251881Speter                       apr_pool_t *pool)
1003251881Speter{
1004251881Speter  apr_finfo_t finfo;
1005251881Speter  svn_error_t *err;
1006251881Speter
1007251881Speter  SVN_ERR_ASSERT(svn_path_is_canonical(path, pool));
1008251881Speter
1009251881Speter  err = svn_io_stat(&finfo, path, APR_FINFO_TYPE, pool);
1010251881Speter  if (err && ! APR_STATUS_IS_ENOENT(err->apr_err))
1011251881Speter    return err;
1012251881Speter
1013251881Speter  if (err || finfo.filetype == APR_REG)
1014251881Speter    {
1015251881Speter      svn_error_clear(err);
1016251881Speter      svn_path_split(path, pdirectory, pfile, pool);
1017251881Speter    }
1018251881Speter  else if (finfo.filetype == APR_DIR)
1019251881Speter    {
1020251881Speter      *pdirectory = path;
1021251881Speter      *pfile = SVN_EMPTY_PATH;
1022251881Speter    }
1023251881Speter  else
1024251881Speter    {
1025251881Speter      return svn_error_createf(SVN_ERR_BAD_FILENAME, NULL,
1026251881Speter                               _("'%s' is neither a file nor a directory name"),
1027251881Speter                               svn_path_local_style(path, pool));
1028251881Speter    }
1029251881Speter
1030251881Speter  return SVN_NO_ERROR;
1031251881Speter}
1032251881Speter
1033251881Speter/*** From stream.c ***/
1034251881Spetersvn_error_t *svn_stream_copy2(svn_stream_t *from, svn_stream_t *to,
1035251881Speter                              svn_cancel_func_t cancel_func,
1036251881Speter                              void *cancel_baton,
1037251881Speter                              apr_pool_t *scratch_pool)
1038251881Speter{
1039251881Speter  return svn_error_trace(svn_stream_copy3(
1040251881Speter                           svn_stream_disown(from, scratch_pool),
1041251881Speter                           svn_stream_disown(to, scratch_pool),
1042251881Speter                           cancel_func, cancel_baton, scratch_pool));
1043251881Speter}
1044251881Speter
1045251881Spetersvn_error_t *svn_stream_copy(svn_stream_t *from, svn_stream_t *to,
1046251881Speter                             apr_pool_t *scratch_pool)
1047251881Speter{
1048251881Speter  return svn_error_trace(svn_stream_copy3(
1049251881Speter                           svn_stream_disown(from, scratch_pool),
1050251881Speter                           svn_stream_disown(to, scratch_pool),
1051251881Speter                           NULL, NULL, scratch_pool));
1052251881Speter}
1053251881Speter
1054251881Spetersvn_stream_t *
1055251881Spetersvn_stream_from_aprfile(apr_file_t *file, apr_pool_t *pool)
1056251881Speter{
1057251881Speter  return svn_stream_from_aprfile2(file, TRUE, pool);
1058251881Speter}
1059251881Speter
1060251881Spetersvn_error_t *
1061251881Spetersvn_stream_contents_same(svn_boolean_t *same,
1062251881Speter                         svn_stream_t *stream1,
1063251881Speter                         svn_stream_t *stream2,
1064251881Speter                         apr_pool_t *pool)
1065251881Speter{
1066251881Speter  return svn_error_trace(svn_stream_contents_same2(
1067251881Speter                           same,
1068251881Speter                           svn_stream_disown(stream1, pool),
1069251881Speter                           svn_stream_disown(stream2, pool),
1070251881Speter                           pool));
1071251881Speter}
1072251881Speter
1073289180Spetervoid
1074289180Spetersvn_stream_set_read(svn_stream_t *stream,
1075289180Speter                    svn_read_fn_t read_fn)
1076289180Speter{
1077289180Speter  svn_stream_set_read2(stream, NULL /* only full read support */,
1078289180Speter                       read_fn);
1079289180Speter}
1080289180Speter
1081289180Spetersvn_error_t *
1082289180Spetersvn_stream_read(svn_stream_t *stream,
1083289180Speter                char *buffer,
1084289180Speter                apr_size_t *len)
1085289180Speter{
1086289180Speter  return svn_error_trace(svn_stream_read_full(stream, buffer, len));
1087289180Speter}
1088289180Speter
1089289180Speterstruct md5_stream_baton
1090289180Speter{
1091289180Speter  const unsigned char **read_digest;
1092289180Speter  const unsigned char **write_digest;
1093289180Speter  svn_checksum_t *read_checksum;
1094289180Speter  svn_checksum_t *write_checksum;
1095289180Speter  svn_stream_t *proxy;
1096289180Speter  apr_pool_t *pool;
1097289180Speter};
1098289180Speter
1099289180Speterstatic svn_error_t *
1100289180Speterread_handler_md5(void *baton, char *buffer, apr_size_t *len)
1101289180Speter{
1102289180Speter  struct md5_stream_baton *btn = baton;
1103289180Speter  return svn_error_trace(svn_stream_read2(btn->proxy, buffer, len));
1104289180Speter}
1105289180Speter
1106289180Speterstatic svn_error_t *
1107289180Speterread_full_handler_md5(void *baton, char *buffer, apr_size_t *len)
1108289180Speter{
1109289180Speter  struct md5_stream_baton *btn = baton;
1110289180Speter  return svn_error_trace(svn_stream_read_full(btn->proxy, buffer, len));
1111289180Speter}
1112289180Speter
1113289180Speterstatic svn_error_t *
1114289180Speterskip_handler_md5(void *baton, apr_size_t len)
1115289180Speter{
1116289180Speter  struct md5_stream_baton *btn = baton;
1117289180Speter  return svn_error_trace(svn_stream_skip(btn->proxy, len));
1118289180Speter}
1119289180Speter
1120289180Speterstatic svn_error_t *
1121289180Speterwrite_handler_md5(void *baton, const char *buffer, apr_size_t *len)
1122289180Speter{
1123289180Speter  struct md5_stream_baton *btn = baton;
1124289180Speter  return svn_error_trace(svn_stream_write(btn->proxy, buffer, len));
1125289180Speter}
1126289180Speter
1127289180Speterstatic svn_error_t *
1128289180Speterclose_handler_md5(void *baton)
1129289180Speter{
1130289180Speter  struct md5_stream_baton *btn = baton;
1131289180Speter
1132289180Speter  SVN_ERR(svn_stream_close(btn->proxy));
1133289180Speter
1134289180Speter  if (btn->read_digest)
1135289180Speter    *btn->read_digest
1136289180Speter      = apr_pmemdup(btn->pool, btn->read_checksum->digest,
1137289180Speter                    APR_MD5_DIGESTSIZE);
1138289180Speter
1139289180Speter  if (btn->write_digest)
1140289180Speter    *btn->write_digest
1141289180Speter      = apr_pmemdup(btn->pool, btn->write_checksum->digest,
1142289180Speter                    APR_MD5_DIGESTSIZE);
1143289180Speter
1144289180Speter  return SVN_NO_ERROR;
1145289180Speter}
1146289180Speter
1147289180Speter
1148289180Spetersvn_stream_t *
1149289180Spetersvn_stream_checksummed(svn_stream_t *stream,
1150289180Speter                       const unsigned char **read_digest,
1151289180Speter                       const unsigned char **write_digest,
1152289180Speter                       svn_boolean_t read_all,
1153289180Speter                       apr_pool_t *pool)
1154289180Speter{
1155289180Speter  svn_stream_t *s;
1156289180Speter  struct md5_stream_baton *baton;
1157289180Speter
1158289180Speter  if (! read_digest && ! write_digest)
1159289180Speter    return stream;
1160289180Speter
1161289180Speter  baton = apr_palloc(pool, sizeof(*baton));
1162289180Speter  baton->read_digest = read_digest;
1163289180Speter  baton->write_digest = write_digest;
1164289180Speter  baton->pool = pool;
1165289180Speter
1166289180Speter  /* Set BATON->proxy to a stream that will fill in BATON->read_checksum
1167289180Speter   * and BATON->write_checksum (if we want them) when it is closed. */
1168289180Speter  baton->proxy
1169289180Speter    = svn_stream_checksummed2(stream,
1170289180Speter                              read_digest ? &baton->read_checksum : NULL,
1171289180Speter                              write_digest ? &baton->write_checksum : NULL,
1172289180Speter                              svn_checksum_md5,
1173289180Speter                              read_all, pool);
1174289180Speter
1175289180Speter  /* Create a stream that will forward its read/write/close operations to
1176289180Speter   * BATON->proxy and will fill in *READ_DIGEST and *WRITE_DIGEST (if we
1177289180Speter   * want them) after it closes BATON->proxy. */
1178289180Speter  s = svn_stream_create(baton, pool);
1179289180Speter  svn_stream_set_read2(s, read_handler_md5, read_full_handler_md5);
1180289180Speter  svn_stream_set_skip(s, skip_handler_md5);
1181289180Speter  svn_stream_set_write(s, write_handler_md5);
1182289180Speter  svn_stream_set_close(s, close_handler_md5);
1183289180Speter  return s;
1184289180Speter}
1185289180Speter
1186251881Speter/*** From path.c ***/
1187251881Speter
1188251881Speterconst char *
1189251881Spetersvn_path_internal_style(const char *path, apr_pool_t *pool)
1190251881Speter{
1191251881Speter  if (svn_path_is_url(path))
1192251881Speter    return svn_uri_canonicalize(path, pool);
1193251881Speter  else
1194251881Speter    return svn_dirent_internal_style(path, pool);
1195251881Speter}
1196251881Speter
1197251881Speter
1198251881Speterconst char *
1199251881Spetersvn_path_local_style(const char *path, apr_pool_t *pool)
1200251881Speter{
1201251881Speter  if (svn_path_is_url(path))
1202251881Speter    return apr_pstrdup(pool, path);
1203251881Speter  else
1204251881Speter    return svn_dirent_local_style(path, pool);
1205251881Speter}
1206251881Speter
1207251881Speterconst char *
1208251881Spetersvn_path_canonicalize(const char *path, apr_pool_t *pool)
1209251881Speter{
1210251881Speter  if (svn_path_is_url(path))
1211251881Speter    return svn_uri_canonicalize(path, pool);
1212251881Speter  else
1213251881Speter    return svn_dirent_canonicalize(path, pool);
1214251881Speter}
1215251881Speter
1216251881Speter
1217251881Speter/*** From mergeinfo.c ***/
1218251881Speter
1219251881Spetersvn_error_t *
1220251881Spetersvn_mergeinfo_inheritable(svn_mergeinfo_t *output,
1221251881Speter                          svn_mergeinfo_t mergeinfo,
1222251881Speter                          const char *path,
1223251881Speter                          svn_revnum_t start,
1224251881Speter                          svn_revnum_t end,
1225251881Speter                          apr_pool_t *pool)
1226251881Speter{
1227251881Speter  return svn_error_trace(svn_mergeinfo_inheritable2(output, mergeinfo, path,
1228251881Speter                                                    start, end,
1229251881Speter                                                    TRUE, pool, pool));
1230251881Speter}
1231251881Speter
1232251881Spetersvn_error_t *
1233251881Spetersvn_rangelist_inheritable(svn_rangelist_t **inheritable_rangelist,
1234251881Speter                          const svn_rangelist_t *rangelist,
1235251881Speter                          svn_revnum_t start,
1236251881Speter                          svn_revnum_t end,
1237251881Speter                          apr_pool_t *pool)
1238251881Speter{
1239251881Speter  return svn_error_trace(svn_rangelist_inheritable2(inheritable_rangelist,
1240251881Speter                                                    rangelist,
1241251881Speter                                                    start, end, TRUE,
1242251881Speter                                                    pool, pool));
1243251881Speter}
1244251881Speter
1245251881Spetersvn_error_t *
1246251881Spetersvn_rangelist_merge(svn_rangelist_t **rangelist,
1247251881Speter                    const svn_rangelist_t *changes,
1248251881Speter                    apr_pool_t *pool)
1249251881Speter{
1250251881Speter  SVN_ERR(svn_rangelist_merge2(*rangelist, changes,
1251251881Speter                               pool, pool));
1252251881Speter
1253251881Speter  return svn_error_trace(
1254251881Speter            svn_rangelist__combine_adjacent_ranges(*rangelist, pool));
1255251881Speter}
1256251881Speter
1257251881Spetersvn_error_t *
1258251881Spetersvn_mergeinfo_diff(svn_mergeinfo_t *deleted, svn_mergeinfo_t *added,
1259251881Speter                   svn_mergeinfo_t from, svn_mergeinfo_t to,
1260251881Speter                   svn_boolean_t consider_inheritance,
1261251881Speter                   apr_pool_t *pool)
1262251881Speter{
1263251881Speter  return svn_error_trace(svn_mergeinfo_diff2(deleted, added, from, to,
1264251881Speter                                             consider_inheritance, pool,
1265251881Speter                                             pool));
1266251881Speter}
1267251881Speter
1268251881Spetersvn_error_t *
1269251881Spetersvn_mergeinfo_merge(svn_mergeinfo_t mergeinfo,
1270251881Speter                    svn_mergeinfo_t changes,
1271251881Speter                    apr_pool_t *pool)
1272251881Speter{
1273251881Speter  return svn_error_trace(svn_mergeinfo_merge2(mergeinfo, changes, pool,
1274251881Speter                         pool));
1275251881Speter}
1276251881Speter
1277251881Spetersvn_error_t *
1278251881Spetersvn_mergeinfo_remove(svn_mergeinfo_t *mergeinfo, svn_mergeinfo_t eraser,
1279251881Speter                     svn_mergeinfo_t whiteboard, apr_pool_t *pool)
1280251881Speter{
1281251881Speter  return svn_mergeinfo_remove2(mergeinfo, eraser, whiteboard, TRUE, pool,
1282251881Speter                               pool);
1283251881Speter}
1284251881Speter
1285251881Spetersvn_error_t *
1286251881Spetersvn_mergeinfo_intersect(svn_mergeinfo_t *mergeinfo,
1287251881Speter                        svn_mergeinfo_t mergeinfo1,
1288251881Speter                        svn_mergeinfo_t mergeinfo2,
1289251881Speter                        apr_pool_t *pool)
1290251881Speter{
1291251881Speter  return svn_mergeinfo_intersect2(mergeinfo, mergeinfo1, mergeinfo2,
1292251881Speter                                  TRUE, pool, pool);
1293251881Speter}
1294251881Speter
1295251881Speter/*** From config.c ***/
1296251881Spetersvn_error_t *
1297251881Spetersvn_config_create(svn_config_t **cfgp,
1298251881Speter                  svn_boolean_t section_names_case_sensitive,
1299251881Speter                  apr_pool_t *result_pool)
1300251881Speter{
1301251881Speter  return svn_error_trace(svn_config_create2(cfgp,
1302251881Speter                                            section_names_case_sensitive,
1303251881Speter                                            FALSE,
1304251881Speter                                            result_pool));
1305251881Speter}
1306251881Speter
1307251881Spetersvn_error_t *
1308251881Spetersvn_config_read2(svn_config_t **cfgp, const char *file,
1309251881Speter                 svn_boolean_t must_exist,
1310251881Speter                 svn_boolean_t section_names_case_sensitive,
1311251881Speter                 apr_pool_t *result_pool)
1312251881Speter{
1313251881Speter  return svn_error_trace(svn_config_read3(cfgp, file,
1314251881Speter                                          must_exist,
1315251881Speter                                          section_names_case_sensitive,
1316251881Speter                                          FALSE,
1317251881Speter                                          result_pool));
1318251881Speter}
1319251881Speter
1320251881Spetersvn_error_t *
1321251881Spetersvn_config_read(svn_config_t **cfgp, const char *file,
1322251881Speter                svn_boolean_t must_exist,
1323251881Speter                apr_pool_t *result_pool)
1324251881Speter{
1325251881Speter  return svn_error_trace(svn_config_read3(cfgp, file,
1326251881Speter                                          must_exist,
1327251881Speter                                          FALSE, FALSE,
1328251881Speter                                          result_pool));
1329251881Speter}
1330251881Speter
1331251881Speter#ifdef SVN_DISABLE_FULL_VERSION_MATCH
1332251881Speter/* This double underscore name is used by the 1.6 command line client.
1333251881Speter   Keeping this name is sufficient for the 1.6 client to use the 1.7
1334251881Speter   libraries at runtime. */
1335251881Spetersvn_error_t *
1336251881Spetersvn_opt__eat_peg_revisions(apr_array_header_t **true_targets_p,
1337251881Speter                           apr_array_header_t *targets,
1338251881Speter                           apr_pool_t *pool);
1339251881Spetersvn_error_t *
1340251881Spetersvn_opt__eat_peg_revisions(apr_array_header_t **true_targets_p,
1341251881Speter                           apr_array_header_t *targets,
1342251881Speter                           apr_pool_t *pool)
1343251881Speter{
1344251881Speter  unsigned int i;
1345251881Speter  apr_array_header_t *true_targets;
1346251881Speter
1347251881Speter  true_targets = apr_array_make(pool, 5, sizeof(const char *));
1348251881Speter
1349251881Speter  for (i = 0; i < targets->nelts; i++)
1350251881Speter    {
1351251881Speter      const char *target = APR_ARRAY_IDX(targets, i, const char *);
1352251881Speter      const char *true_target;
1353251881Speter
1354251881Speter      SVN_ERR(svn_opt__split_arg_at_peg_revision(&true_target, NULL,
1355251881Speter                                                 target, pool));
1356251881Speter      APR_ARRAY_PUSH(true_targets, const char *) = true_target;
1357251881Speter    }
1358251881Speter
1359251881Speter  SVN_ERR_ASSERT(true_targets_p);
1360251881Speter  *true_targets_p = true_targets;
1361251881Speter
1362251881Speter  return SVN_NO_ERROR;
1363251881Speter}
1364251881Speter#endif
1365251881Speter
1366251881Spetervoid
1367251881Spetersvn_xml_make_header(svn_stringbuf_t **str, apr_pool_t *pool)
1368251881Speter{
1369251881Speter  svn_xml_make_header2(str, NULL, pool);
1370251881Speter}
1371251881Speter
1372289180Speter
1373289180Speter/*** From utf.c ***/
1374251881Spetervoid
1375251881Spetersvn_utf_initialize(apr_pool_t *pool)
1376251881Speter{
1377251881Speter  svn_utf_initialize2(FALSE, pool);
1378251881Speter}
1379251881Speter
1380251881Spetersvn_error_t *
1381289180Spetersvn_utf_cstring_from_utf8_ex(const char **dest,
1382289180Speter                             const char *src,
1383289180Speter                             const char *topage,
1384289180Speter                             const char *convset_key,
1385289180Speter                             apr_pool_t *pool)
1386289180Speter{
1387289180Speter  return svn_utf_cstring_from_utf8_ex2(dest, src, topage, pool);
1388289180Speter}
1389289180Speter
1390289180Speter/*** From error.c ***/
1391289180Spetervoid
1392289180Spetersvn_handle_error(svn_error_t *err, FILE *stream, svn_boolean_t fatal)
1393289180Speter{
1394289180Speter  svn_handle_error2(err, stream, fatal, "svn: ");
1395289180Speter}
1396289180Speter
1397289180Spetervoid
1398289180Spetersvn_handle_warning(FILE *stream, svn_error_t *err)
1399289180Speter{
1400289180Speter  svn_handle_warning2(stream, err, "svn: ");
1401289180Speter}
1402289180Speter
1403289180Speter
1404289180Speter/*** From subst.c ***/
1405289180Spetersvn_error_t *
1406251881Spetersvn_subst_build_keywords(svn_subst_keywords_t *kw,
1407251881Speter                         const char *keywords_val,
1408251881Speter                         const char *rev,
1409251881Speter                         const char *url,
1410251881Speter                         apr_time_t date,
1411251881Speter                         const char *author,
1412251881Speter                         apr_pool_t *pool)
1413251881Speter{
1414251881Speter  apr_hash_t *kwhash;
1415251881Speter  const svn_string_t *val;
1416251881Speter
1417251881Speter  SVN_ERR(svn_subst_build_keywords2(&kwhash, keywords_val, rev,
1418251881Speter                                    url, date, author, pool));
1419251881Speter
1420251881Speter  /* The behaviour of pre-1.3 svn_subst_build_keywords, which we are
1421251881Speter   * replicating here, is to write to a slot in the svn_subst_keywords_t
1422251881Speter   * only if the relevant keyword was present in keywords_val, otherwise
1423251881Speter   * leaving that slot untouched. */
1424251881Speter
1425251881Speter  val = svn_hash_gets(kwhash, SVN_KEYWORD_REVISION_LONG);
1426251881Speter  if (val)
1427251881Speter    kw->revision = val;
1428251881Speter
1429251881Speter  val = svn_hash_gets(kwhash, SVN_KEYWORD_DATE_LONG);
1430251881Speter  if (val)
1431251881Speter    kw->date = val;
1432251881Speter
1433251881Speter  val = svn_hash_gets(kwhash, SVN_KEYWORD_AUTHOR_LONG);
1434251881Speter  if (val)
1435251881Speter    kw->author = val;
1436251881Speter
1437251881Speter  val = svn_hash_gets(kwhash, SVN_KEYWORD_URL_LONG);
1438251881Speter  if (val)
1439251881Speter    kw->url = val;
1440251881Speter
1441251881Speter  val = svn_hash_gets(kwhash, SVN_KEYWORD_ID);
1442251881Speter  if (val)
1443251881Speter    kw->id = val;
1444251881Speter
1445251881Speter  return SVN_NO_ERROR;
1446251881Speter}
1447251881Speter
1448257936Speter/*** From version.c ***/
1449257936Spetersvn_error_t *
1450257936Spetersvn_ver_check_list(const svn_version_t *my_version,
1451257936Speter                   const svn_version_checklist_t *checklist)
1452257936Speter{
1453257936Speter  return svn_ver_check_list2(my_version, checklist, svn_ver_compatible);
1454257936Speter}
1455289180Speter
1456289180Speter/*** From win32_crypto.c ***/
1457289180Speter#if defined(WIN32) && !defined(__MINGW32__)
1458289180Spetervoid
1459289180Spetersvn_auth_get_windows_simple_provider(svn_auth_provider_object_t **provider,
1460289180Speter                                     apr_pool_t *pool)
1461289180Speter{
1462289180Speter  svn_auth__get_windows_simple_provider(provider, pool);
1463289180Speter}
1464289180Speter
1465289180Spetervoid
1466289180Spetersvn_auth_get_windows_ssl_client_cert_pw_provider
1467289180Speter   (svn_auth_provider_object_t **provider,
1468289180Speter    apr_pool_t *pool)
1469289180Speter{
1470289180Speter  svn_auth__get_windows_ssl_client_cert_pw_provider(provider, pool);
1471289180Speter}
1472289180Speter
1473289180Spetervoid
1474289180Spetersvn_auth_get_windows_ssl_server_trust_provider
1475289180Speter  (svn_auth_provider_object_t **provider, apr_pool_t *pool)
1476289180Speter{
1477289180Speter  svn_auth__get_windows_ssl_server_trust_provider(provider, pool);
1478289180Speter}
1479289180Speter#endif /* WIN32 && !__MINGW32__ */
1480289180Speter
1481289180Speter/*** From macos_keychain.c ***/
1482289180Speter#if defined(DARWIN)
1483289180Spetervoid
1484289180Spetersvn_auth_get_keychain_simple_provider(svn_auth_provider_object_t **provider,
1485289180Speter                                      apr_pool_t *pool)
1486289180Speter{
1487309511Speter#ifdef SVN_HAVE_KEYCHAIN_SERVICES
1488289180Speter  svn_auth__get_keychain_simple_provider(provider, pool);
1489309511Speter#else
1490309511Speter  svn_auth__get_dummmy_simple_provider(provider, pool);
1491309511Speter#endif
1492289180Speter}
1493289180Speter
1494289180Spetervoid
1495289180Spetersvn_auth_get_keychain_ssl_client_cert_pw_provider
1496289180Speter  (svn_auth_provider_object_t **provider,
1497289180Speter   apr_pool_t *pool)
1498289180Speter{
1499309511Speter#ifdef SVN_HAVE_KEYCHAIN_SERVICES
1500289180Speter  svn_auth__get_keychain_ssl_client_cert_pw_provider(provider, pool);
1501309511Speter#else
1502309511Speter  /* Not really the right type of dummy provider, but doesn't throw NULL
1503309511Speter     errors as just returning NULL would */
1504309511Speter  svn_auth__get_dummmy_simple_provider(provider, pool);
1505309511Speter#endif
1506289180Speter}
1507289180Speter#endif /* DARWIN */
1508289180Speter
1509289180Speter#if !defined(WIN32)
1510289180Spetervoid
1511289180Spetersvn_auth_get_gpg_agent_simple_provider(svn_auth_provider_object_t **provider,
1512289180Speter                                       apr_pool_t *pool)
1513289180Speter{
1514289180Speter#ifdef SVN_HAVE_GPG_AGENT
1515289180Speter  svn_auth__get_gpg_agent_simple_provider(provider, pool);
1516289180Speter#else
1517289180Speter  svn_auth__get_dummmy_simple_provider(provider, pool);
1518289180Speter#endif /* SVN_HAVE_GPG_AGENT */
1519289180Speter}
1520289180Speter#endif /* !WIN32 */
1521289180Speter
1522289180Spetersvn_error_t *
1523289180Spetersvn_cmdline_create_auth_baton(svn_auth_baton_t **ab,
1524289180Speter                              svn_boolean_t non_interactive,
1525289180Speter                              const char *auth_username,
1526289180Speter                              const char *auth_password,
1527289180Speter                              const char *config_dir,
1528289180Speter                              svn_boolean_t no_auth_cache,
1529289180Speter                              svn_boolean_t trust_server_cert,
1530289180Speter                              svn_config_t *cfg,
1531289180Speter                              svn_cancel_func_t cancel_func,
1532289180Speter                              void *cancel_baton,
1533289180Speter                              apr_pool_t *pool)
1534289180Speter{
1535289180Speter  return svn_error_trace(svn_cmdline_create_auth_baton2(ab,
1536289180Speter                                                        non_interactive,
1537289180Speter                                                        auth_username,
1538289180Speter                                                        auth_password,
1539289180Speter                                                        config_dir,
1540289180Speter                                                        no_auth_cache,
1541289180Speter                                                        trust_server_cert,
1542289180Speter                                                        FALSE,
1543289180Speter                                                        FALSE,
1544289180Speter                                                        FALSE,
1545289180Speter                                                        FALSE,
1546289180Speter                                                        cfg,
1547289180Speter                                                        cancel_func,
1548289180Speter                                                        cancel_baton,
1549289180Speter                                                        pool));
1550289180Speter}
1551