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/* We define this here to remove any further warnings about the usage of
26251881Speter   deprecated functions in this file. */
27251881Speter#define SVN_DEPRECATED
28251881Speter
29251881Speter#include <apr_md5.h>
30251881Speter
31251881Speter#include "svn_wc.h"
32251881Speter#include "svn_subst.h"
33251881Speter#include "svn_pools.h"
34251881Speter#include "svn_props.h"
35251881Speter#include "svn_hash.h"
36251881Speter#include "svn_time.h"
37251881Speter#include "svn_dirent_uri.h"
38251881Speter#include "svn_path.h"
39251881Speter
40251881Speter#include "private/svn_subr_private.h"
41251881Speter#include "private/svn_wc_private.h"
42251881Speter
43251881Speter#include "wc.h"
44251881Speter#include "entries.h"
45251881Speter#include "lock.h"
46251881Speter#include "props.h"
47251881Speter#include "translate.h"
48251881Speter#include "workqueue.h"
49251881Speter
50251881Speter#include "svn_private_config.h"
51251881Speter
52251881Speter/* baton for traversal_info_update */
53251881Speterstruct traversal_info_update_baton
54251881Speter{
55251881Speter  struct svn_wc_traversal_info_t *traversal;
56251881Speter  svn_wc__db_t *db;
57251881Speter};
58251881Speter
59251881Speter/* Helper for updating svn_wc_traversal_info_t structures
60251881Speter * Implements svn_wc_external_update_t */
61251881Speterstatic svn_error_t *
62251881Spetertraversal_info_update(void *baton,
63251881Speter                      const char *local_abspath,
64251881Speter                      const svn_string_t *old_val,
65251881Speter                      const svn_string_t *new_val,
66251881Speter                      svn_depth_t depth,
67251881Speter                      apr_pool_t *scratch_pool)
68251881Speter{
69251881Speter  const char *dup_path;
70251881Speter  svn_wc_adm_access_t *adm_access;
71251881Speter  struct traversal_info_update_baton *ub = baton;
72251881Speter  apr_pool_t *dup_pool = ub->traversal->pool;
73251881Speter  const char *dup_val = NULL;
74251881Speter
75251881Speter  /* We make the abspath relative by retrieving the access baton
76251881Speter     for the specific directory */
77251881Speter  adm_access = svn_wc__adm_retrieve_internal2(ub->db, local_abspath,
78251881Speter                                              scratch_pool);
79251881Speter
80251881Speter  if (adm_access)
81251881Speter    dup_path = apr_pstrdup(dup_pool, svn_wc_adm_access_path(adm_access));
82251881Speter  else
83251881Speter    dup_path = apr_pstrdup(dup_pool, local_abspath);
84251881Speter
85251881Speter  if (old_val)
86251881Speter    {
87251881Speter      dup_val = apr_pstrmemdup(dup_pool, old_val->data, old_val->len);
88251881Speter
89251881Speter      svn_hash_sets(ub->traversal->externals_old, dup_path, dup_val);
90251881Speter    }
91251881Speter
92251881Speter  if (new_val)
93251881Speter    {
94251881Speter      /* In most cases the value is identical */
95251881Speter      if (old_val != new_val)
96251881Speter        dup_val = apr_pstrmemdup(dup_pool, new_val->data, new_val->len);
97251881Speter
98251881Speter      svn_hash_sets(ub->traversal->externals_new, dup_path, dup_val);
99251881Speter    }
100251881Speter
101251881Speter  svn_hash_sets(ub->traversal->depths, dup_path, svn_depth_to_word(depth));
102251881Speter
103251881Speter  return SVN_NO_ERROR;
104251881Speter}
105251881Speter
106251881Speter/* Helper for functions that used to gather traversal_info */
107251881Speterstatic svn_error_t *
108251881Spetergather_traversal_info(svn_wc_context_t *wc_ctx,
109251881Speter                      const char *local_abspath,
110251881Speter                      const char *path,
111251881Speter                      svn_depth_t depth,
112251881Speter                      struct svn_wc_traversal_info_t *traversal_info,
113251881Speter                      svn_boolean_t gather_as_old,
114251881Speter                      svn_boolean_t gather_as_new,
115251881Speter                      apr_pool_t *scratch_pool)
116251881Speter{
117251881Speter  apr_hash_t *externals;
118251881Speter  apr_hash_t *ambient_depths;
119251881Speter  apr_hash_index_t *hi;
120251881Speter
121251881Speter  SVN_ERR(svn_wc__externals_gather_definitions(&externals, &ambient_depths,
122251881Speter                                               wc_ctx, local_abspath,
123251881Speter                                               depth,
124251881Speter                                               scratch_pool, scratch_pool));
125251881Speter
126251881Speter  for (hi = apr_hash_first(scratch_pool, externals);
127251881Speter       hi;
128251881Speter       hi = apr_hash_next(hi))
129251881Speter    {
130251881Speter      const char *node_abspath = svn__apr_hash_index_key(hi);
131251881Speter      const char *relpath;
132251881Speter
133251881Speter      relpath = svn_dirent_join(path,
134251881Speter                                svn_dirent_skip_ancestor(local_abspath,
135251881Speter                                                         node_abspath),
136251881Speter                                traversal_info->pool);
137251881Speter
138251881Speter      if (gather_as_old)
139251881Speter        svn_hash_sets(traversal_info->externals_old, relpath,
140251881Speter                      svn__apr_hash_index_val(hi));
141251881Speter
142251881Speter      if (gather_as_new)
143251881Speter        svn_hash_sets(traversal_info->externals_new, relpath,
144251881Speter                      svn__apr_hash_index_val(hi));
145251881Speter
146251881Speter      svn_hash_sets(traversal_info->depths, relpath,
147251881Speter                    svn_hash_gets(ambient_depths, node_abspath));
148251881Speter    }
149251881Speter
150251881Speter  return SVN_NO_ERROR;
151251881Speter}
152251881Speter
153251881Speter
154251881Speter/*** From adm_crawler.c ***/
155251881Speter
156251881Spetersvn_error_t *
157251881Spetersvn_wc_crawl_revisions4(const char *path,
158251881Speter                        svn_wc_adm_access_t *adm_access,
159251881Speter                        const svn_ra_reporter3_t *reporter,
160251881Speter                        void *report_baton,
161251881Speter                        svn_boolean_t restore_files,
162251881Speter                        svn_depth_t depth,
163251881Speter                        svn_boolean_t honor_depth_exclude,
164251881Speter                        svn_boolean_t depth_compatibility_trick,
165251881Speter                        svn_boolean_t use_commit_times,
166251881Speter                        svn_wc_notify_func2_t notify_func,
167251881Speter                        void *notify_baton,
168251881Speter                        svn_wc_traversal_info_t *traversal_info,
169251881Speter                        apr_pool_t *pool)
170251881Speter{
171251881Speter  svn_wc_context_t *wc_ctx;
172251881Speter  svn_wc__db_t *wc_db = svn_wc__adm_get_db(adm_access);
173251881Speter  const char *local_abspath;
174251881Speter
175251881Speter  SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL, wc_db, pool));
176251881Speter  SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
177251881Speter
178251881Speter  SVN_ERR(svn_wc_crawl_revisions5(wc_ctx,
179251881Speter                                  local_abspath,
180251881Speter                                  reporter,
181251881Speter                                  report_baton,
182251881Speter                                  restore_files,
183251881Speter                                  depth,
184251881Speter                                  honor_depth_exclude,
185251881Speter                                  depth_compatibility_trick,
186251881Speter                                  use_commit_times,
187251881Speter                                  NULL /* cancel_func */,
188251881Speter                                  NULL /* cancel_baton */,
189251881Speter                                  notify_func,
190251881Speter                                  notify_baton,
191251881Speter                                  pool));
192251881Speter
193251881Speter  if (traversal_info)
194251881Speter    SVN_ERR(gather_traversal_info(wc_ctx, local_abspath, path, depth,
195251881Speter                                  traversal_info, TRUE, FALSE, pool));
196251881Speter
197251881Speter  return svn_error_trace(svn_wc_context_destroy(wc_ctx));
198251881Speter}
199251881Speter
200251881Speter/*** Compatibility wrapper: turns an svn_ra_reporter2_t into an
201251881Speter     svn_ra_reporter3_t.
202251881Speter
203251881Speter     This code looks like it duplicates code in libsvn_ra/ra_loader.c,
204251881Speter     but it does not.  That code makes an new thing look like an old
205251881Speter     thing; this code makes an old thing look like a new thing. ***/
206251881Speter
207251881Speterstruct wrap_3to2_report_baton {
208251881Speter  const svn_ra_reporter2_t *reporter;
209251881Speter  void *baton;
210251881Speter};
211251881Speter
212251881Speter/* */
213251881Speterstatic svn_error_t *wrap_3to2_set_path(void *report_baton,
214251881Speter                                       const char *path,
215251881Speter                                       svn_revnum_t revision,
216251881Speter                                       svn_depth_t depth,
217251881Speter                                       svn_boolean_t start_empty,
218251881Speter                                       const char *lock_token,
219251881Speter                                       apr_pool_t *pool)
220251881Speter{
221251881Speter  struct wrap_3to2_report_baton *wrb = report_baton;
222251881Speter
223251881Speter  return wrb->reporter->set_path(wrb->baton, path, revision, start_empty,
224251881Speter                                 lock_token, pool);
225251881Speter}
226251881Speter
227251881Speter/* */
228251881Speterstatic svn_error_t *wrap_3to2_delete_path(void *report_baton,
229251881Speter                                          const char *path,
230251881Speter                                          apr_pool_t *pool)
231251881Speter{
232251881Speter  struct wrap_3to2_report_baton *wrb = report_baton;
233251881Speter
234251881Speter  return wrb->reporter->delete_path(wrb->baton, path, pool);
235251881Speter}
236251881Speter
237251881Speter/* */
238251881Speterstatic svn_error_t *wrap_3to2_link_path(void *report_baton,
239251881Speter                                        const char *path,
240251881Speter                                        const char *url,
241251881Speter                                        svn_revnum_t revision,
242251881Speter                                        svn_depth_t depth,
243251881Speter                                        svn_boolean_t start_empty,
244251881Speter                                        const char *lock_token,
245251881Speter                                        apr_pool_t *pool)
246251881Speter{
247251881Speter  struct wrap_3to2_report_baton *wrb = report_baton;
248251881Speter
249251881Speter  return wrb->reporter->link_path(wrb->baton, path, url, revision,
250251881Speter                                  start_empty, lock_token, pool);
251251881Speter}
252251881Speter
253251881Speter/* */
254251881Speterstatic svn_error_t *wrap_3to2_finish_report(void *report_baton,
255251881Speter                                            apr_pool_t *pool)
256251881Speter{
257251881Speter  struct wrap_3to2_report_baton *wrb = report_baton;
258251881Speter
259251881Speter  return wrb->reporter->finish_report(wrb->baton, pool);
260251881Speter}
261251881Speter
262251881Speter/* */
263251881Speterstatic svn_error_t *wrap_3to2_abort_report(void *report_baton,
264251881Speter                                           apr_pool_t *pool)
265251881Speter{
266251881Speter  struct wrap_3to2_report_baton *wrb = report_baton;
267251881Speter
268251881Speter  return wrb->reporter->abort_report(wrb->baton, pool);
269251881Speter}
270251881Speter
271251881Speterstatic const svn_ra_reporter3_t wrap_3to2_reporter = {
272251881Speter  wrap_3to2_set_path,
273251881Speter  wrap_3to2_delete_path,
274251881Speter  wrap_3to2_link_path,
275251881Speter  wrap_3to2_finish_report,
276251881Speter  wrap_3to2_abort_report
277251881Speter};
278251881Speter
279251881Spetersvn_error_t *
280251881Spetersvn_wc_crawl_revisions3(const char *path,
281251881Speter                        svn_wc_adm_access_t *adm_access,
282251881Speter                        const svn_ra_reporter3_t *reporter,
283251881Speter                        void *report_baton,
284251881Speter                        svn_boolean_t restore_files,
285251881Speter                        svn_depth_t depth,
286251881Speter                        svn_boolean_t depth_compatibility_trick,
287251881Speter                        svn_boolean_t use_commit_times,
288251881Speter                        svn_wc_notify_func2_t notify_func,
289251881Speter                        void *notify_baton,
290251881Speter                        svn_wc_traversal_info_t *traversal_info,
291251881Speter                        apr_pool_t *pool)
292251881Speter{
293251881Speter  return svn_wc_crawl_revisions4(path,
294251881Speter                                 adm_access,
295251881Speter                                 reporter, report_baton,
296251881Speter                                 restore_files,
297251881Speter                                 depth,
298251881Speter                                 FALSE,
299251881Speter                                 depth_compatibility_trick,
300251881Speter                                 use_commit_times,
301251881Speter                                 notify_func,
302251881Speter                                 notify_baton,
303251881Speter                                 traversal_info,
304251881Speter                                 pool);
305251881Speter}
306251881Speter
307251881Spetersvn_error_t *
308251881Spetersvn_wc_crawl_revisions2(const char *path,
309251881Speter                        svn_wc_adm_access_t *adm_access,
310251881Speter                        const svn_ra_reporter2_t *reporter,
311251881Speter                        void *report_baton,
312251881Speter                        svn_boolean_t restore_files,
313251881Speter                        svn_boolean_t recurse,
314251881Speter                        svn_boolean_t use_commit_times,
315251881Speter                        svn_wc_notify_func2_t notify_func,
316251881Speter                        void *notify_baton,
317251881Speter                        svn_wc_traversal_info_t *traversal_info,
318251881Speter                        apr_pool_t *pool)
319251881Speter{
320251881Speter  struct wrap_3to2_report_baton wrb;
321251881Speter  wrb.reporter = reporter;
322251881Speter  wrb.baton = report_baton;
323251881Speter
324251881Speter  return svn_wc_crawl_revisions3(path,
325251881Speter                                 adm_access,
326251881Speter                                 &wrap_3to2_reporter, &wrb,
327251881Speter                                 restore_files,
328251881Speter                                 SVN_DEPTH_INFINITY_OR_FILES(recurse),
329251881Speter                                 FALSE,
330251881Speter                                 use_commit_times,
331251881Speter                                 notify_func,
332251881Speter                                 notify_baton,
333251881Speter                                 traversal_info,
334251881Speter                                 pool);
335251881Speter}
336251881Speter
337251881Speter
338251881Speter/* Baton for compat_call_notify_func below.  */
339251881Speterstruct compat_notify_baton_t {
340251881Speter  /* Wrapped func/baton. */
341251881Speter  svn_wc_notify_func_t func;
342251881Speter  void *baton;
343251881Speter};
344251881Speter
345251881Speter
346251881Speter/* Implements svn_wc_notify_func2_t.  Call BATON->func (BATON is of type
347251881Speter   svn_wc__compat_notify_baton_t), passing BATON->baton and the appropriate
348251881Speter   arguments from NOTIFY.  */
349251881Speterstatic void
350251881Spetercompat_call_notify_func(void *baton,
351251881Speter                        const svn_wc_notify_t *n,
352251881Speter                        apr_pool_t *pool)
353251881Speter{
354251881Speter  struct compat_notify_baton_t *nb = baton;
355251881Speter
356251881Speter  if (nb->func)
357251881Speter    (*nb->func)(nb->baton, n->path, n->action, n->kind, n->mime_type,
358251881Speter                n->content_state, n->prop_state, n->revision);
359251881Speter}
360251881Speter
361251881Speter
362251881Speter/*** Compatibility wrapper: turns an svn_ra_reporter_t into an
363251881Speter     svn_ra_reporter2_t.
364251881Speter
365251881Speter     This code looks like it duplicates code in libsvn_ra/ra_loader.c,
366251881Speter     but it does not.  That code makes an new thing look like an old
367251881Speter     thing; this code makes an old thing look like a new thing. ***/
368251881Speter
369251881Speterstruct wrap_2to1_report_baton {
370251881Speter  const svn_ra_reporter_t *reporter;
371251881Speter  void *baton;
372251881Speter};
373251881Speter
374251881Speter/* */
375251881Speterstatic svn_error_t *wrap_2to1_set_path(void *report_baton,
376251881Speter                                       const char *path,
377251881Speter                                       svn_revnum_t revision,
378251881Speter                                       svn_boolean_t start_empty,
379251881Speter                                       const char *lock_token,
380251881Speter                                       apr_pool_t *pool)
381251881Speter{
382251881Speter  struct wrap_2to1_report_baton *wrb = report_baton;
383251881Speter
384251881Speter  return wrb->reporter->set_path(wrb->baton, path, revision, start_empty,
385251881Speter                                 pool);
386251881Speter}
387251881Speter
388251881Speter/* */
389251881Speterstatic svn_error_t *wrap_2to1_delete_path(void *report_baton,
390251881Speter                                          const char *path,
391251881Speter                                          apr_pool_t *pool)
392251881Speter{
393251881Speter  struct wrap_2to1_report_baton *wrb = report_baton;
394251881Speter
395251881Speter  return wrb->reporter->delete_path(wrb->baton, path, pool);
396251881Speter}
397251881Speter
398251881Speter/* */
399251881Speterstatic svn_error_t *wrap_2to1_link_path(void *report_baton,
400251881Speter                                        const char *path,
401251881Speter                                        const char *url,
402251881Speter                                        svn_revnum_t revision,
403251881Speter                                        svn_boolean_t start_empty,
404251881Speter                                        const char *lock_token,
405251881Speter                                        apr_pool_t *pool)
406251881Speter{
407251881Speter  struct wrap_2to1_report_baton *wrb = report_baton;
408251881Speter
409251881Speter  return wrb->reporter->link_path(wrb->baton, path, url, revision,
410251881Speter                                  start_empty, pool);
411251881Speter}
412251881Speter
413251881Speter/* */
414251881Speterstatic svn_error_t *wrap_2to1_finish_report(void *report_baton,
415251881Speter                                            apr_pool_t *pool)
416251881Speter{
417251881Speter  struct wrap_2to1_report_baton *wrb = report_baton;
418251881Speter
419251881Speter  return wrb->reporter->finish_report(wrb->baton, pool);
420251881Speter}
421251881Speter
422251881Speter/* */
423251881Speterstatic svn_error_t *wrap_2to1_abort_report(void *report_baton,
424251881Speter                                           apr_pool_t *pool)
425251881Speter{
426251881Speter  struct wrap_2to1_report_baton *wrb = report_baton;
427251881Speter
428251881Speter  return wrb->reporter->abort_report(wrb->baton, pool);
429251881Speter}
430251881Speter
431251881Speterstatic const svn_ra_reporter2_t wrap_2to1_reporter = {
432251881Speter  wrap_2to1_set_path,
433251881Speter  wrap_2to1_delete_path,
434251881Speter  wrap_2to1_link_path,
435251881Speter  wrap_2to1_finish_report,
436251881Speter  wrap_2to1_abort_report
437251881Speter};
438251881Speter
439251881Spetersvn_error_t *
440251881Spetersvn_wc_crawl_revisions(const char *path,
441251881Speter                       svn_wc_adm_access_t *adm_access,
442251881Speter                       const svn_ra_reporter_t *reporter,
443251881Speter                       void *report_baton,
444251881Speter                       svn_boolean_t restore_files,
445251881Speter                       svn_boolean_t recurse,
446251881Speter                       svn_boolean_t use_commit_times,
447251881Speter                       svn_wc_notify_func_t notify_func,
448251881Speter                       void *notify_baton,
449251881Speter                       svn_wc_traversal_info_t *traversal_info,
450251881Speter                       apr_pool_t *pool)
451251881Speter{
452251881Speter  struct wrap_2to1_report_baton wrb;
453251881Speter  struct compat_notify_baton_t nb;
454251881Speter
455251881Speter  wrb.reporter = reporter;
456251881Speter  wrb.baton = report_baton;
457251881Speter
458251881Speter  nb.func = notify_func;
459251881Speter  nb.baton = notify_baton;
460251881Speter
461251881Speter  return svn_wc_crawl_revisions2(path, adm_access, &wrap_2to1_reporter, &wrb,
462251881Speter                                 restore_files, recurse, use_commit_times,
463251881Speter                                 compat_call_notify_func, &nb,
464251881Speter                                 traversal_info,
465251881Speter                                 pool);
466251881Speter}
467251881Speter
468251881Spetersvn_error_t *
469251881Spetersvn_wc_transmit_text_deltas2(const char **tempfile,
470251881Speter                             unsigned char digest[],
471251881Speter                             const char *path,
472251881Speter                             svn_wc_adm_access_t *adm_access,
473251881Speter                             svn_boolean_t fulltext,
474251881Speter                             const svn_delta_editor_t *editor,
475251881Speter                             void *file_baton,
476251881Speter                             apr_pool_t *pool)
477251881Speter{
478251881Speter  const char *local_abspath;
479251881Speter  svn_wc_context_t *wc_ctx;
480251881Speter  const svn_checksum_t *new_text_base_md5_checksum;
481251881Speter
482251881Speter  SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
483251881Speter  SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL /* config */,
484251881Speter                                         svn_wc__adm_get_db(adm_access),
485251881Speter                                         pool));
486251881Speter
487251881Speter  SVN_ERR(svn_wc__internal_transmit_text_deltas(tempfile,
488251881Speter                                                (digest
489251881Speter                                                 ? &new_text_base_md5_checksum
490251881Speter                                                 : NULL),
491251881Speter                                                NULL, wc_ctx->db,
492251881Speter                                                local_abspath, fulltext,
493251881Speter                                                editor, file_baton,
494251881Speter                                                pool, pool));
495251881Speter
496251881Speter  if (digest)
497251881Speter    memcpy(digest, new_text_base_md5_checksum->digest, APR_MD5_DIGESTSIZE);
498251881Speter
499251881Speter  return svn_error_trace(svn_wc_context_destroy(wc_ctx));
500251881Speter}
501251881Speter
502251881Spetersvn_error_t *
503251881Spetersvn_wc_transmit_text_deltas(const char *path,
504251881Speter                            svn_wc_adm_access_t *adm_access,
505251881Speter                            svn_boolean_t fulltext,
506251881Speter                            const svn_delta_editor_t *editor,
507251881Speter                            void *file_baton,
508251881Speter                            const char **tempfile,
509251881Speter                            apr_pool_t *pool)
510251881Speter{
511251881Speter  return svn_wc_transmit_text_deltas2(tempfile, NULL, path, adm_access,
512251881Speter                                      fulltext, editor, file_baton, pool);
513251881Speter}
514251881Speter
515251881Spetersvn_error_t *
516251881Spetersvn_wc_transmit_prop_deltas(const char *path,
517251881Speter                            svn_wc_adm_access_t *adm_access,
518251881Speter                            const svn_wc_entry_t *entry,
519251881Speter                            const svn_delta_editor_t *editor,
520251881Speter                            void *baton,
521251881Speter                            const char **tempfile,
522251881Speter                            apr_pool_t *pool)
523251881Speter{
524251881Speter  const char *local_abspath;
525251881Speter  svn_wc_context_t *wc_ctx;
526251881Speter
527251881Speter  if (tempfile)
528251881Speter    *tempfile = NULL;
529251881Speter
530251881Speter  SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
531251881Speter  SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL /* config */,
532251881Speter                                         svn_wc__adm_get_db(adm_access),
533251881Speter                                         pool));
534251881Speter
535251881Speter  SVN_ERR(svn_wc_transmit_prop_deltas2(wc_ctx, local_abspath, editor, baton,
536251881Speter                                       pool));
537251881Speter
538251881Speter  return svn_error_trace(svn_wc_context_destroy(wc_ctx));
539251881Speter}
540251881Speter
541251881Speter/*** From adm_files.c ***/
542251881Spetersvn_error_t *
543251881Spetersvn_wc_ensure_adm3(const char *path,
544251881Speter                   const char *uuid,
545251881Speter                   const char *url,
546251881Speter                   const char *repos,
547251881Speter                   svn_revnum_t revision,
548251881Speter                   svn_depth_t depth,
549251881Speter                   apr_pool_t *pool)
550251881Speter{
551251881Speter  const char *local_abspath;
552251881Speter  svn_wc_context_t *wc_ctx;
553251881Speter
554251881Speter  if (uuid == NULL)
555251881Speter    return svn_error_create(SVN_ERR_BAD_UUID, NULL, NULL);
556251881Speter  if (repos == NULL)
557251881Speter    return svn_error_create(SVN_ERR_BAD_URL, NULL, NULL);
558251881Speter
559251881Speter  SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
560251881Speter  SVN_ERR(svn_wc_context_create(&wc_ctx, NULL /* config */, pool, pool));
561251881Speter
562251881Speter  SVN_ERR(svn_wc_ensure_adm4(wc_ctx, local_abspath, url, repos, uuid, revision,
563251881Speter                             depth, pool));
564251881Speter
565251881Speter  return svn_error_trace(svn_wc_context_destroy(wc_ctx));
566251881Speter}
567251881Speter
568251881Spetersvn_error_t *
569251881Spetersvn_wc_ensure_adm2(const char *path,
570251881Speter                   const char *uuid,
571251881Speter                   const char *url,
572251881Speter                   const char *repos,
573251881Speter                   svn_revnum_t revision,
574251881Speter                   apr_pool_t *pool)
575251881Speter{
576251881Speter  return svn_wc_ensure_adm3(path, uuid, url, repos, revision,
577251881Speter                            svn_depth_infinity, pool);
578251881Speter}
579251881Speter
580251881Speter
581251881Spetersvn_error_t *
582251881Spetersvn_wc_ensure_adm(const char *path,
583251881Speter                  const char *uuid,
584251881Speter                  const char *url,
585251881Speter                  svn_revnum_t revision,
586251881Speter                  apr_pool_t *pool)
587251881Speter{
588251881Speter  return svn_wc_ensure_adm2(path, uuid, url, NULL, revision, pool);
589251881Speter}
590251881Speter
591251881Spetersvn_error_t *
592251881Spetersvn_wc_create_tmp_file(apr_file_t **fp,
593251881Speter                       const char *path,
594251881Speter                       svn_boolean_t delete_on_close,
595251881Speter                       apr_pool_t *pool)
596251881Speter{
597251881Speter  return svn_wc_create_tmp_file2(fp, NULL, path,
598251881Speter                                 delete_on_close
599251881Speter                                 ? svn_io_file_del_on_close
600251881Speter                                 : svn_io_file_del_none,
601251881Speter                                 pool);
602251881Speter}
603251881Speter
604251881Spetersvn_error_t *
605251881Spetersvn_wc_create_tmp_file2(apr_file_t **fp,
606251881Speter                        const char **new_name,
607251881Speter                        const char *path,
608251881Speter                        svn_io_file_del_t delete_when,
609251881Speter                        apr_pool_t *pool)
610251881Speter{
611251881Speter  svn_wc_context_t *wc_ctx;
612251881Speter  const char *local_abspath;
613251881Speter  const char *temp_dir;
614251881Speter  svn_error_t *err;
615251881Speter
616251881Speter  SVN_ERR_ASSERT(fp || new_name);
617251881Speter
618251881Speter  SVN_ERR(svn_wc_context_create(&wc_ctx, NULL /* config */, pool, pool));
619251881Speter
620251881Speter  SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
621251881Speter  err = svn_wc__get_tmpdir(&temp_dir, wc_ctx, local_abspath, pool, pool);
622251881Speter  err = svn_error_compose_create(err, svn_wc_context_destroy(wc_ctx));
623251881Speter  if (err)
624251881Speter    return svn_error_trace(err);
625251881Speter
626251881Speter  SVN_ERR(svn_io_open_unique_file3(fp, new_name, temp_dir,
627251881Speter                                   delete_when, pool, pool));
628251881Speter
629251881Speter  return SVN_NO_ERROR;
630251881Speter}
631251881Speter
632251881Speter
633251881Speter/*** From adm_ops.c ***/
634251881Spetersvn_error_t *
635251881Spetersvn_wc_get_pristine_contents(svn_stream_t **contents,
636251881Speter                             const char *path,
637251881Speter                             apr_pool_t *result_pool,
638251881Speter                             apr_pool_t *scratch_pool)
639251881Speter{
640251881Speter  svn_wc_context_t *wc_ctx;
641251881Speter  const char *local_abspath;
642251881Speter
643251881Speter  SVN_ERR(svn_wc_context_create(&wc_ctx, NULL, scratch_pool, scratch_pool));
644251881Speter  SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, scratch_pool));
645251881Speter
646251881Speter  SVN_ERR(svn_wc_get_pristine_contents2(contents,
647251881Speter                                        wc_ctx,
648251881Speter                                        local_abspath,
649251881Speter                                        result_pool,
650251881Speter                                        scratch_pool));
651251881Speter
652251881Speter  return svn_error_trace(svn_wc_context_destroy(wc_ctx));
653251881Speter}
654251881Speter
655251881Speter
656251881Spetersvn_error_t *
657251881Spetersvn_wc_queue_committed2(svn_wc_committed_queue_t *queue,
658251881Speter                        const char *path,
659251881Speter                        svn_wc_adm_access_t *adm_access,
660251881Speter                        svn_boolean_t recurse,
661251881Speter                        const apr_array_header_t *wcprop_changes,
662251881Speter                        svn_boolean_t remove_lock,
663251881Speter                        svn_boolean_t remove_changelist,
664251881Speter                        const svn_checksum_t *md5_checksum,
665251881Speter                        apr_pool_t *scratch_pool)
666251881Speter{
667251881Speter  svn_wc_context_t *wc_ctx;
668251881Speter  const char *local_abspath;
669251881Speter  const svn_checksum_t *sha1_checksum = NULL;
670251881Speter
671251881Speter  SVN_ERR(svn_wc_context_create(&wc_ctx, NULL, scratch_pool, scratch_pool));
672251881Speter  SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, scratch_pool));
673251881Speter
674251881Speter  if (md5_checksum != NULL)
675251881Speter    {
676251881Speter      svn_error_t *err;
677251881Speter      err = svn_wc__db_pristine_get_sha1(&sha1_checksum, wc_ctx->db,
678251881Speter                                         local_abspath, md5_checksum,
679251881Speter                                         svn_wc__get_committed_queue_pool(queue),
680251881Speter                                         scratch_pool);
681251881Speter
682251881Speter      /* Don't fail on SHA1 not found */
683251881Speter      if (err && err->apr_err == SVN_ERR_WC_DB_ERROR)
684251881Speter        {
685251881Speter          svn_error_clear(err);
686251881Speter          sha1_checksum = NULL;
687251881Speter        }
688251881Speter      else
689251881Speter        SVN_ERR(err);
690251881Speter    }
691251881Speter
692251881Speter  SVN_ERR(svn_wc_queue_committed3(queue, wc_ctx, local_abspath, recurse,
693251881Speter                                  wcprop_changes,
694251881Speter                                  remove_lock, remove_changelist,
695251881Speter                                  sha1_checksum, scratch_pool));
696251881Speter
697251881Speter  return svn_error_trace(svn_wc_context_destroy(wc_ctx));
698251881Speter}
699251881Speter
700251881Spetersvn_error_t *
701251881Spetersvn_wc_queue_committed(svn_wc_committed_queue_t **queue,
702251881Speter                       const char *path,
703251881Speter                       svn_wc_adm_access_t *adm_access,
704251881Speter                       svn_boolean_t recurse,
705251881Speter                       const apr_array_header_t *wcprop_changes,
706251881Speter                       svn_boolean_t remove_lock,
707251881Speter                       svn_boolean_t remove_changelist,
708251881Speter                       const unsigned char *digest,
709251881Speter                       apr_pool_t *pool)
710251881Speter{
711251881Speter  const svn_checksum_t *md5_checksum;
712251881Speter
713251881Speter  if (digest)
714251881Speter    md5_checksum = svn_checksum__from_digest_md5(
715251881Speter                     digest, svn_wc__get_committed_queue_pool(*queue));
716251881Speter  else
717251881Speter    md5_checksum = NULL;
718251881Speter
719251881Speter  return svn_wc_queue_committed2(*queue, path, adm_access, recurse,
720251881Speter                                 wcprop_changes, remove_lock,
721251881Speter                                 remove_changelist, md5_checksum, pool);
722251881Speter}
723251881Speter
724251881Spetersvn_error_t *
725251881Spetersvn_wc_process_committed_queue(svn_wc_committed_queue_t *queue,
726251881Speter                               svn_wc_adm_access_t *adm_access,
727251881Speter                               svn_revnum_t new_revnum,
728251881Speter                               const char *rev_date,
729251881Speter                               const char *rev_author,
730251881Speter                               apr_pool_t *pool)
731251881Speter{
732251881Speter  svn_wc_context_t *wc_ctx;
733251881Speter
734251881Speter  SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL,
735251881Speter                                         svn_wc__adm_get_db(adm_access),
736251881Speter                                         pool));
737251881Speter  SVN_ERR(svn_wc_process_committed_queue2(queue, wc_ctx, new_revnum,
738251881Speter                                          rev_date, rev_author,
739251881Speter                                          NULL, NULL, pool));
740251881Speter  SVN_ERR(svn_wc_context_destroy(wc_ctx));
741251881Speter
742251881Speter  return SVN_NO_ERROR;
743251881Speter}
744251881Speter
745251881Spetersvn_error_t *
746251881Spetersvn_wc_process_committed4(const char *path,
747251881Speter                          svn_wc_adm_access_t *adm_access,
748251881Speter                          svn_boolean_t recurse,
749251881Speter                          svn_revnum_t new_revnum,
750251881Speter                          const char *rev_date,
751251881Speter                          const char *rev_author,
752251881Speter                          const apr_array_header_t *wcprop_changes,
753251881Speter                          svn_boolean_t remove_lock,
754251881Speter                          svn_boolean_t remove_changelist,
755251881Speter                          const unsigned char *digest,
756251881Speter                          apr_pool_t *pool)
757251881Speter{
758251881Speter  svn_wc__db_t *db = svn_wc__adm_get_db(adm_access);
759251881Speter  const char *local_abspath;
760251881Speter  const svn_checksum_t *md5_checksum;
761251881Speter  const svn_checksum_t *sha1_checksum = NULL;
762251881Speter  apr_time_t new_date;
763251881Speter  apr_hash_t *wcprop_changes_hash;
764251881Speter
765251881Speter  SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
766251881Speter
767251881Speter  if (rev_date)
768251881Speter    SVN_ERR(svn_time_from_cstring(&new_date, rev_date, pool));
769251881Speter  else
770251881Speter    new_date = 0;
771251881Speter
772251881Speter  if (digest)
773251881Speter    md5_checksum = svn_checksum__from_digest_md5(digest, pool);
774251881Speter  else
775251881Speter    md5_checksum = NULL;
776251881Speter
777251881Speter  if (md5_checksum != NULL)
778251881Speter    {
779251881Speter      svn_error_t *err;
780251881Speter      err = svn_wc__db_pristine_get_sha1(&sha1_checksum, db,
781251881Speter                                         local_abspath, md5_checksum,
782251881Speter                                         pool, pool);
783251881Speter
784251881Speter      if (err && err->apr_err == SVN_ERR_WC_DB_ERROR)
785251881Speter        {
786251881Speter          svn_error_clear(err);
787251881Speter          sha1_checksum = NULL;
788251881Speter        }
789251881Speter      else
790251881Speter        SVN_ERR(err);
791251881Speter    }
792251881Speter
793251881Speter  wcprop_changes_hash = svn_wc__prop_array_to_hash(wcprop_changes, pool);
794251881Speter  SVN_ERR(svn_wc__process_committed_internal(db, local_abspath, recurse, TRUE,
795251881Speter                                             new_revnum, new_date, rev_author,
796251881Speter                                             wcprop_changes_hash,
797251881Speter                                             !remove_lock, !remove_changelist,
798251881Speter                                             sha1_checksum, NULL, pool));
799251881Speter
800251881Speter  /* Run the log file(s) we just created. */
801251881Speter  return svn_error_trace(svn_wc__wq_run(db, local_abspath, NULL, NULL, pool));
802251881Speter}
803251881Speter
804251881Speter
805251881Spetersvn_error_t *
806251881Spetersvn_wc_process_committed3(const char *path,
807251881Speter                          svn_wc_adm_access_t *adm_access,
808251881Speter                          svn_boolean_t recurse,
809251881Speter                          svn_revnum_t new_revnum,
810251881Speter                          const char *rev_date,
811251881Speter                          const char *rev_author,
812251881Speter                          const apr_array_header_t *wcprop_changes,
813251881Speter                          svn_boolean_t remove_lock,
814251881Speter                          const unsigned char *digest,
815251881Speter                          apr_pool_t *pool)
816251881Speter{
817251881Speter  return svn_wc_process_committed4(path, adm_access, recurse, new_revnum,
818251881Speter                                   rev_date, rev_author, wcprop_changes,
819251881Speter                                   remove_lock, FALSE, digest, pool);
820251881Speter}
821251881Speter
822251881Spetersvn_error_t *
823251881Spetersvn_wc_process_committed2(const char *path,
824251881Speter                          svn_wc_adm_access_t *adm_access,
825251881Speter                          svn_boolean_t recurse,
826251881Speter                          svn_revnum_t new_revnum,
827251881Speter                          const char *rev_date,
828251881Speter                          const char *rev_author,
829251881Speter                          const apr_array_header_t *wcprop_changes,
830251881Speter                          svn_boolean_t remove_lock,
831251881Speter                          apr_pool_t *pool)
832251881Speter{
833251881Speter  return svn_wc_process_committed3(path, adm_access, recurse, new_revnum,
834251881Speter                                   rev_date, rev_author, wcprop_changes,
835251881Speter                                   remove_lock, NULL, pool);
836251881Speter}
837251881Speter
838251881Spetersvn_error_t *
839251881Spetersvn_wc_process_committed(const char *path,
840251881Speter                         svn_wc_adm_access_t *adm_access,
841251881Speter                         svn_boolean_t recurse,
842251881Speter                         svn_revnum_t new_revnum,
843251881Speter                         const char *rev_date,
844251881Speter                         const char *rev_author,
845251881Speter                         const apr_array_header_t *wcprop_changes,
846251881Speter                         apr_pool_t *pool)
847251881Speter{
848251881Speter  return svn_wc_process_committed2(path, adm_access, recurse, new_revnum,
849251881Speter                                   rev_date, rev_author, wcprop_changes,
850251881Speter                                   FALSE, pool);
851251881Speter}
852251881Speter
853251881Spetersvn_error_t *
854251881Spetersvn_wc_maybe_set_repos_root(svn_wc_adm_access_t *adm_access,
855251881Speter                            const char *path,
856251881Speter                            const char *repos,
857251881Speter                            apr_pool_t *pool)
858251881Speter{
859251881Speter  return SVN_NO_ERROR;
860251881Speter}
861251881Speter
862251881Spetersvn_error_t *
863251881Spetersvn_wc_delete3(const char *path,
864251881Speter               svn_wc_adm_access_t *adm_access,
865251881Speter               svn_cancel_func_t cancel_func,
866251881Speter               void *cancel_baton,
867251881Speter               svn_wc_notify_func2_t notify_func,
868251881Speter               void *notify_baton,
869251881Speter               svn_boolean_t keep_local,
870251881Speter               apr_pool_t *pool)
871251881Speter{
872251881Speter  svn_wc_context_t *wc_ctx;
873251881Speter  svn_wc__db_t *wc_db = svn_wc__adm_get_db(adm_access);
874251881Speter  svn_wc_adm_access_t *dir_access;
875251881Speter  const char *local_abspath;
876251881Speter
877251881Speter  SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL, wc_db, pool));
878251881Speter  SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
879251881Speter
880251881Speter  /* Open access batons for everything below path, because we used to open
881251881Speter     these before. */
882251881Speter  SVN_ERR(svn_wc_adm_probe_try3(&dir_access, adm_access, path,
883251881Speter                                TRUE, -1, cancel_func, cancel_baton, pool));
884251881Speter
885251881Speter  SVN_ERR(svn_wc_delete4(wc_ctx,
886251881Speter                         local_abspath,
887251881Speter                         keep_local,
888251881Speter                         TRUE,
889251881Speter                         cancel_func, cancel_baton,
890251881Speter                         notify_func, notify_baton,
891251881Speter                         pool));
892251881Speter
893251881Speter  return svn_error_trace(svn_wc_context_destroy(wc_ctx));
894251881Speter}
895251881Speter
896251881Spetersvn_error_t *
897251881Spetersvn_wc_delete2(const char *path,
898251881Speter               svn_wc_adm_access_t *adm_access,
899251881Speter               svn_cancel_func_t cancel_func,
900251881Speter               void *cancel_baton,
901251881Speter               svn_wc_notify_func2_t notify_func,
902251881Speter               void *notify_baton,
903251881Speter               apr_pool_t *pool)
904251881Speter{
905251881Speter  return svn_wc_delete3(path, adm_access, cancel_func, cancel_baton,
906251881Speter                        notify_func, notify_baton, FALSE, pool);
907251881Speter}
908251881Speter
909251881Spetersvn_error_t *
910251881Spetersvn_wc_delete(const char *path,
911251881Speter              svn_wc_adm_access_t *adm_access,
912251881Speter              svn_cancel_func_t cancel_func,
913251881Speter              void *cancel_baton,
914251881Speter              svn_wc_notify_func_t notify_func,
915251881Speter              void *notify_baton,
916251881Speter              apr_pool_t *pool)
917251881Speter{
918251881Speter  struct compat_notify_baton_t nb;
919251881Speter
920251881Speter  nb.func = notify_func;
921251881Speter  nb.baton = notify_baton;
922251881Speter
923251881Speter  return svn_wc_delete2(path, adm_access, cancel_func, cancel_baton,
924251881Speter                        compat_call_notify_func, &nb, pool);
925251881Speter}
926251881Speter
927251881Spetersvn_error_t *
928251881Spetersvn_wc_add_from_disk(svn_wc_context_t *wc_ctx,
929251881Speter                     const char *local_abspath,
930251881Speter                     svn_wc_notify_func2_t notify_func,
931251881Speter                     void *notify_baton,
932251881Speter                     apr_pool_t *scratch_pool)
933251881Speter{
934251881Speter  SVN_ERR(svn_wc_add_from_disk2(wc_ctx, local_abspath, NULL,
935251881Speter                                 notify_func, notify_baton, scratch_pool));
936251881Speter  return SVN_NO_ERROR;
937251881Speter}
938251881Speter
939251881Spetersvn_error_t *
940251881Spetersvn_wc_add3(const char *path,
941251881Speter            svn_wc_adm_access_t *parent_access,
942251881Speter            svn_depth_t depth,
943251881Speter            const char *copyfrom_url,
944251881Speter            svn_revnum_t copyfrom_rev,
945251881Speter            svn_cancel_func_t cancel_func,
946251881Speter            void *cancel_baton,
947251881Speter            svn_wc_notify_func2_t notify_func,
948251881Speter            void *notify_baton,
949251881Speter            apr_pool_t *pool)
950251881Speter{
951251881Speter  svn_wc_context_t *wc_ctx;
952251881Speter  svn_wc__db_t *wc_db = svn_wc__adm_get_db(parent_access);
953251881Speter  const char *local_abspath;
954251881Speter
955251881Speter  SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL, wc_db, pool));
956251881Speter  SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
957251881Speter
958251881Speter  SVN_ERR(svn_wc_add4(wc_ctx, local_abspath,
959251881Speter                      depth, copyfrom_url,
960251881Speter                      copyfrom_rev,
961251881Speter                      cancel_func, cancel_baton,
962251881Speter                      notify_func, notify_baton, pool));
963251881Speter
964251881Speter  /* Make sure the caller gets the new access baton in the set. */
965251881Speter  if (svn_wc__adm_retrieve_internal2(wc_db, local_abspath, pool) == NULL)
966251881Speter    {
967251881Speter      svn_node_kind_t kind;
968251881Speter
969251881Speter      SVN_ERR(svn_wc__db_read_kind(&kind, wc_db, local_abspath,
970251881Speter                                   FALSE /* allow_missing */,
971251881Speter                                   TRUE /* show_deleted */,
972251881Speter                                   FALSE /* show_hidden */, pool));
973251881Speter      if (kind == svn_node_dir)
974251881Speter        {
975251881Speter          svn_wc_adm_access_t *adm_access;
976251881Speter
977251881Speter          /* Open the access baton in adm_access' pool to give it the same
978251881Speter             lifetime */
979251881Speter          SVN_ERR(svn_wc_adm_open3(&adm_access, parent_access, path, TRUE,
980251881Speter                                   copyfrom_url ? -1 : 0,
981251881Speter                                   cancel_func, cancel_baton,
982251881Speter                                   svn_wc_adm_access_pool(parent_access)));
983251881Speter        }
984251881Speter    }
985251881Speter
986251881Speter  return svn_error_trace(svn_wc_context_destroy(wc_ctx));
987251881Speter}
988251881Speter
989251881Speter
990251881Spetersvn_error_t *
991251881Spetersvn_wc_add2(const char *path,
992251881Speter            svn_wc_adm_access_t *parent_access,
993251881Speter            const char *copyfrom_url,
994251881Speter            svn_revnum_t copyfrom_rev,
995251881Speter            svn_cancel_func_t cancel_func,
996251881Speter            void *cancel_baton,
997251881Speter            svn_wc_notify_func2_t notify_func,
998251881Speter            void *notify_baton,
999251881Speter            apr_pool_t *pool)
1000251881Speter{
1001251881Speter  return svn_wc_add3(path, parent_access, svn_depth_infinity,
1002251881Speter                     copyfrom_url, copyfrom_rev,
1003251881Speter                     cancel_func, cancel_baton,
1004251881Speter                     notify_func, notify_baton, pool);
1005251881Speter}
1006251881Speter
1007251881Spetersvn_error_t *
1008251881Spetersvn_wc_add(const char *path,
1009251881Speter           svn_wc_adm_access_t *parent_access,
1010251881Speter           const char *copyfrom_url,
1011251881Speter           svn_revnum_t copyfrom_rev,
1012251881Speter           svn_cancel_func_t cancel_func,
1013251881Speter           void *cancel_baton,
1014251881Speter           svn_wc_notify_func_t notify_func,
1015251881Speter           void *notify_baton,
1016251881Speter           apr_pool_t *pool)
1017251881Speter{
1018251881Speter  struct compat_notify_baton_t nb;
1019251881Speter
1020251881Speter  nb.func = notify_func;
1021251881Speter  nb.baton = notify_baton;
1022251881Speter
1023251881Speter  return svn_wc_add2(path, parent_access, copyfrom_url, copyfrom_rev,
1024251881Speter                     cancel_func, cancel_baton,
1025251881Speter                     compat_call_notify_func, &nb, pool);
1026251881Speter}
1027251881Speter
1028251881Spetersvn_error_t *
1029251881Spetersvn_wc_revert3(const char *path,
1030251881Speter               svn_wc_adm_access_t *parent_access,
1031251881Speter               svn_depth_t depth,
1032251881Speter               svn_boolean_t use_commit_times,
1033251881Speter               const apr_array_header_t *changelist_filter,
1034251881Speter               svn_cancel_func_t cancel_func,
1035251881Speter               void *cancel_baton,
1036251881Speter               svn_wc_notify_func2_t notify_func,
1037251881Speter               void *notify_baton,
1038251881Speter               apr_pool_t *pool)
1039251881Speter{
1040251881Speter  svn_wc_context_t *wc_ctx;
1041251881Speter  svn_wc__db_t *wc_db = svn_wc__adm_get_db(parent_access);
1042251881Speter  const char *local_abspath;
1043251881Speter
1044251881Speter  SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL, wc_db, pool));
1045251881Speter  SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
1046251881Speter
1047251881Speter  SVN_ERR(svn_wc_revert4(wc_ctx,
1048251881Speter                         local_abspath,
1049251881Speter                         depth,
1050251881Speter                         use_commit_times,
1051251881Speter                         changelist_filter,
1052251881Speter                         cancel_func, cancel_baton,
1053251881Speter                         notify_func, notify_baton,
1054251881Speter                         pool));
1055251881Speter
1056251881Speter  return svn_error_trace(svn_wc_context_destroy(wc_ctx));
1057251881Speter}
1058251881Speter
1059251881Spetersvn_error_t *
1060251881Spetersvn_wc_revert2(const char *path,
1061251881Speter               svn_wc_adm_access_t *parent_access,
1062251881Speter               svn_boolean_t recursive,
1063251881Speter               svn_boolean_t use_commit_times,
1064251881Speter               svn_cancel_func_t cancel_func,
1065251881Speter               void *cancel_baton,
1066251881Speter               svn_wc_notify_func2_t notify_func,
1067251881Speter               void *notify_baton,
1068251881Speter               apr_pool_t *pool)
1069251881Speter{
1070251881Speter  return svn_wc_revert3(path, parent_access,
1071251881Speter                        SVN_DEPTH_INFINITY_OR_EMPTY(recursive),
1072251881Speter                        use_commit_times, NULL, cancel_func, cancel_baton,
1073251881Speter                        notify_func, notify_baton, pool);
1074251881Speter}
1075251881Speter
1076251881Spetersvn_error_t *
1077251881Spetersvn_wc_revert(const char *path,
1078251881Speter              svn_wc_adm_access_t *parent_access,
1079251881Speter              svn_boolean_t recursive,
1080251881Speter              svn_boolean_t use_commit_times,
1081251881Speter              svn_cancel_func_t cancel_func,
1082251881Speter              void *cancel_baton,
1083251881Speter              svn_wc_notify_func_t notify_func,
1084251881Speter              void *notify_baton,
1085251881Speter              apr_pool_t *pool)
1086251881Speter{
1087251881Speter  struct compat_notify_baton_t nb;
1088251881Speter
1089251881Speter  nb.func = notify_func;
1090251881Speter  nb.baton = notify_baton;
1091251881Speter
1092251881Speter  return svn_wc_revert2(path, parent_access, recursive, use_commit_times,
1093251881Speter                        cancel_func, cancel_baton,
1094251881Speter                        compat_call_notify_func, &nb, pool);
1095251881Speter}
1096251881Speter
1097251881Spetersvn_error_t *
1098251881Spetersvn_wc_remove_from_revision_control(svn_wc_adm_access_t *adm_access,
1099251881Speter                                    const char *name,
1100251881Speter                                    svn_boolean_t destroy_wf,
1101251881Speter                                    svn_boolean_t instant_error,
1102251881Speter                                    svn_cancel_func_t cancel_func,
1103251881Speter                                    void *cancel_baton,
1104251881Speter                                    apr_pool_t *pool)
1105251881Speter{
1106251881Speter  svn_wc_context_t *wc_ctx;
1107251881Speter  svn_wc__db_t *wc_db = svn_wc__adm_get_db(adm_access);
1108251881Speter  const char *local_abspath = svn_dirent_join(
1109251881Speter                                    svn_wc__adm_access_abspath(adm_access),
1110251881Speter                                    name,
1111251881Speter                                    pool);
1112251881Speter
1113251881Speter  /* name must be an entry in adm_access, fail if not */
1114251881Speter  SVN_ERR_ASSERT(strcmp(svn_dirent_basename(name, NULL), name) == 0);
1115251881Speter  SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL, wc_db, pool));
1116251881Speter
1117251881Speter  SVN_ERR(svn_wc_remove_from_revision_control2(wc_ctx,
1118251881Speter                                               local_abspath,
1119251881Speter                                               destroy_wf,
1120251881Speter                                               instant_error,
1121251881Speter                                               cancel_func, cancel_baton,
1122251881Speter                                               pool));
1123251881Speter
1124251881Speter  return svn_error_trace(svn_wc_context_destroy(wc_ctx));
1125251881Speter}
1126251881Speter
1127251881Spetersvn_error_t *
1128251881Spetersvn_wc_resolved_conflict4(const char *path,
1129251881Speter                          svn_wc_adm_access_t *adm_access,
1130251881Speter                          svn_boolean_t resolve_text,
1131251881Speter                          svn_boolean_t resolve_props,
1132251881Speter                          svn_boolean_t resolve_tree,
1133251881Speter                          svn_depth_t depth,
1134251881Speter                          svn_wc_conflict_choice_t conflict_choice,
1135251881Speter                          svn_wc_notify_func2_t notify_func,
1136251881Speter                          void *notify_baton,
1137251881Speter                          svn_cancel_func_t cancel_func,
1138251881Speter                          void *cancel_baton,
1139251881Speter                          apr_pool_t *pool)
1140251881Speter{
1141251881Speter  svn_wc_context_t *wc_ctx;
1142251881Speter  svn_wc__db_t *wc_db = svn_wc__adm_get_db(adm_access);
1143251881Speter  const char *local_abspath;
1144251881Speter
1145251881Speter  SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
1146251881Speter  SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL, wc_db, pool));
1147251881Speter
1148251881Speter  SVN_ERR(svn_wc_resolved_conflict5(wc_ctx,
1149251881Speter                                    local_abspath,
1150251881Speter                                    depth,
1151251881Speter                                    resolve_text,
1152251881Speter                                    resolve_props ? "" : NULL,
1153251881Speter                                    resolve_tree,
1154251881Speter                                    conflict_choice,
1155251881Speter                                    cancel_func,
1156251881Speter                                    cancel_baton,
1157251881Speter                                    notify_func,
1158251881Speter                                    notify_baton,
1159251881Speter                                    pool));
1160251881Speter
1161251881Speter  return svn_error_trace(svn_wc_context_destroy(wc_ctx));
1162251881Speter
1163251881Speter}
1164251881Speter
1165251881Spetersvn_error_t *
1166251881Spetersvn_wc_resolved_conflict(const char *path,
1167251881Speter                         svn_wc_adm_access_t *adm_access,
1168251881Speter                         svn_boolean_t resolve_text,
1169251881Speter                         svn_boolean_t resolve_props,
1170251881Speter                         svn_boolean_t recurse,
1171251881Speter                         svn_wc_notify_func_t notify_func,
1172251881Speter                         void *notify_baton,
1173251881Speter                         apr_pool_t *pool)
1174251881Speter{
1175251881Speter  struct compat_notify_baton_t nb;
1176251881Speter
1177251881Speter  nb.func = notify_func;
1178251881Speter  nb.baton = notify_baton;
1179251881Speter
1180251881Speter  return svn_wc_resolved_conflict2(path, adm_access,
1181251881Speter                                   resolve_text, resolve_props, recurse,
1182251881Speter                                   compat_call_notify_func, &nb,
1183251881Speter                                   NULL, NULL, pool);
1184251881Speter
1185251881Speter}
1186251881Speter
1187251881Spetersvn_error_t *
1188251881Spetersvn_wc_resolved_conflict2(const char *path,
1189251881Speter                          svn_wc_adm_access_t *adm_access,
1190251881Speter                          svn_boolean_t resolve_text,
1191251881Speter                          svn_boolean_t resolve_props,
1192251881Speter                          svn_boolean_t recurse,
1193251881Speter                          svn_wc_notify_func2_t notify_func,
1194251881Speter                          void *notify_baton,
1195251881Speter                          svn_cancel_func_t cancel_func,
1196251881Speter                          void *cancel_baton,
1197251881Speter                          apr_pool_t *pool)
1198251881Speter{
1199251881Speter  return svn_wc_resolved_conflict3(path, adm_access, resolve_text,
1200251881Speter                                   resolve_props,
1201251881Speter                                   SVN_DEPTH_INFINITY_OR_EMPTY(recurse),
1202251881Speter                                   svn_wc_conflict_choose_merged,
1203251881Speter                                   notify_func, notify_baton, cancel_func,
1204251881Speter                                   cancel_baton, pool);
1205251881Speter}
1206251881Speter
1207251881Spetersvn_error_t *
1208251881Spetersvn_wc_resolved_conflict3(const char *path,
1209251881Speter                          svn_wc_adm_access_t *adm_access,
1210251881Speter                          svn_boolean_t resolve_text,
1211251881Speter                          svn_boolean_t resolve_props,
1212251881Speter                          svn_depth_t depth,
1213251881Speter                          svn_wc_conflict_choice_t conflict_choice,
1214251881Speter                          svn_wc_notify_func2_t notify_func,
1215251881Speter                          void *notify_baton,
1216251881Speter                          svn_cancel_func_t cancel_func,
1217251881Speter                          void *cancel_baton,
1218251881Speter                          apr_pool_t *pool)
1219251881Speter{
1220251881Speter  return svn_wc_resolved_conflict4(path, adm_access, resolve_text,
1221251881Speter                                   resolve_props, FALSE, depth,
1222251881Speter                                   svn_wc_conflict_choose_merged,
1223251881Speter                                   notify_func, notify_baton, cancel_func,
1224251881Speter                                   cancel_baton, pool);
1225251881Speter}
1226251881Speter
1227251881Spetersvn_error_t *
1228251881Spetersvn_wc_add_lock(const char *path,
1229251881Speter                const svn_lock_t *lock,
1230251881Speter                svn_wc_adm_access_t *adm_access,
1231251881Speter                apr_pool_t *pool)
1232251881Speter{
1233251881Speter  const char *local_abspath;
1234251881Speter  svn_wc_context_t *wc_ctx;
1235251881Speter
1236251881Speter  SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
1237251881Speter  SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL /* config */,
1238251881Speter                                         svn_wc__adm_get_db(adm_access),
1239251881Speter                                         pool));
1240251881Speter
1241251881Speter  SVN_ERR(svn_wc_add_lock2(wc_ctx, local_abspath, lock, pool));
1242251881Speter
1243251881Speter  return svn_error_trace(svn_wc_context_destroy(wc_ctx));
1244251881Speter}
1245251881Speter
1246251881Spetersvn_error_t *
1247251881Spetersvn_wc_remove_lock(const char *path,
1248251881Speter                   svn_wc_adm_access_t *adm_access,
1249251881Speter                   apr_pool_t *pool)
1250251881Speter{
1251251881Speter  const char *local_abspath;
1252251881Speter  svn_wc_context_t *wc_ctx;
1253251881Speter
1254251881Speter  SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
1255251881Speter  SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL /* config */,
1256251881Speter                                         svn_wc__adm_get_db(adm_access),
1257251881Speter                                         pool));
1258251881Speter
1259251881Speter  SVN_ERR(svn_wc_remove_lock2(wc_ctx, local_abspath, pool));
1260251881Speter
1261251881Speter  return svn_error_trace(svn_wc_context_destroy(wc_ctx));
1262251881Speter
1263251881Speter}
1264251881Speter
1265251881Spetersvn_error_t *
1266251881Spetersvn_wc_get_ancestry(char **url,
1267251881Speter                    svn_revnum_t *rev,
1268251881Speter                    const char *path,
1269251881Speter                    svn_wc_adm_access_t *adm_access,
1270251881Speter                    apr_pool_t *pool)
1271251881Speter{
1272251881Speter  const char *local_abspath;
1273251881Speter  const svn_wc_entry_t *entry;
1274251881Speter
1275251881Speter  SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
1276251881Speter
1277251881Speter  SVN_ERR(svn_wc__get_entry(&entry, svn_wc__adm_get_db(adm_access),
1278251881Speter                            local_abspath, FALSE,
1279251881Speter                            svn_node_unknown,
1280251881Speter                            pool, pool));
1281251881Speter
1282251881Speter  if (url)
1283251881Speter    *url = apr_pstrdup(pool, entry->url);
1284251881Speter
1285251881Speter  if (rev)
1286251881Speter    *rev = entry->revision;
1287251881Speter
1288251881Speter  return SVN_NO_ERROR;
1289251881Speter}
1290251881Speter
1291251881Spetersvn_error_t *
1292251881Spetersvn_wc_set_changelist(const char *path,
1293251881Speter                      const char *changelist,
1294251881Speter                      svn_wc_adm_access_t *adm_access,
1295251881Speter                      svn_cancel_func_t cancel_func,
1296251881Speter                      void *cancel_baton,
1297251881Speter                      svn_wc_notify_func2_t notify_func,
1298251881Speter                      void *notify_baton,
1299251881Speter                      apr_pool_t *pool)
1300251881Speter{
1301251881Speter  const char *local_abspath;
1302251881Speter  svn_wc_context_t *wc_ctx;
1303251881Speter
1304251881Speter  SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
1305251881Speter  SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL /* config */,
1306251881Speter                                         svn_wc__adm_get_db(adm_access),
1307251881Speter                                         pool));
1308251881Speter
1309251881Speter  SVN_ERR(svn_wc_set_changelist2(wc_ctx, local_abspath, changelist,
1310251881Speter                                 svn_depth_empty, NULL,
1311251881Speter                                 cancel_func, cancel_baton, notify_func,
1312251881Speter                                 notify_baton, pool));
1313251881Speter
1314251881Speter  return svn_error_trace(svn_wc_context_destroy(wc_ctx));
1315251881Speter}
1316251881Speter
1317251881Speter
1318251881Speter/*** From diff.c ***/
1319251881Speter/* Used to wrap svn_wc_diff_callbacks_t. */
1320251881Speterstruct diff_callbacks_wrapper_baton {
1321251881Speter  const svn_wc_diff_callbacks_t *callbacks;
1322251881Speter  void *baton;
1323251881Speter};
1324251881Speter
1325251881Speter/* An svn_wc_diff_callbacks3_t function for wrapping svn_wc_diff_callbacks_t. */
1326251881Speterstatic svn_error_t *
1327251881Speterwrap_3to1_file_changed(svn_wc_adm_access_t *adm_access,
1328251881Speter                       svn_wc_notify_state_t *contentstate,
1329251881Speter                       svn_wc_notify_state_t *propstate,
1330251881Speter                       svn_boolean_t *tree_conflicted,
1331251881Speter                       const char *path,
1332251881Speter                       const char *tmpfile1,
1333251881Speter                       const char *tmpfile2,
1334251881Speter                       svn_revnum_t rev1,
1335251881Speter                       svn_revnum_t rev2,
1336251881Speter                       const char *mimetype1,
1337251881Speter                       const char *mimetype2,
1338251881Speter                       const apr_array_header_t *propchanges,
1339251881Speter                       apr_hash_t *originalprops,
1340251881Speter                       void *diff_baton)
1341251881Speter{
1342251881Speter  struct diff_callbacks_wrapper_baton *b = diff_baton;
1343251881Speter
1344251881Speter  if (tree_conflicted)
1345251881Speter    *tree_conflicted = FALSE;
1346251881Speter
1347251881Speter  if (tmpfile2 != NULL)
1348251881Speter    SVN_ERR(b->callbacks->file_changed(adm_access, contentstate, path,
1349251881Speter                                       tmpfile1, tmpfile2,
1350251881Speter                                       rev1, rev2, mimetype1, mimetype2,
1351251881Speter                                       b->baton));
1352251881Speter  if (propchanges->nelts > 0)
1353251881Speter    SVN_ERR(b->callbacks->props_changed(adm_access, propstate, path,
1354251881Speter                                        propchanges, originalprops,
1355251881Speter                                        b->baton));
1356251881Speter
1357251881Speter  return SVN_NO_ERROR;
1358251881Speter}
1359251881Speter
1360251881Speter/* An svn_wc_diff_callbacks3_t function for wrapping svn_wc_diff_callbacks_t. */
1361251881Speterstatic svn_error_t *
1362251881Speterwrap_3to1_file_added(svn_wc_adm_access_t *adm_access,
1363251881Speter                     svn_wc_notify_state_t *contentstate,
1364251881Speter                     svn_wc_notify_state_t *propstate,
1365251881Speter                     svn_boolean_t *tree_conflicted,
1366251881Speter                     const char *path,
1367251881Speter                     const char *tmpfile1,
1368251881Speter                     const char *tmpfile2,
1369251881Speter                     svn_revnum_t rev1,
1370251881Speter                     svn_revnum_t rev2,
1371251881Speter                     const char *mimetype1,
1372251881Speter                     const char *mimetype2,
1373251881Speter                     const apr_array_header_t *propchanges,
1374251881Speter                     apr_hash_t *originalprops,
1375251881Speter                     void *diff_baton)
1376251881Speter{
1377251881Speter  struct diff_callbacks_wrapper_baton *b = diff_baton;
1378251881Speter
1379251881Speter  if (tree_conflicted)
1380251881Speter    *tree_conflicted = FALSE;
1381251881Speter
1382251881Speter  SVN_ERR(b->callbacks->file_added(adm_access, contentstate, path,
1383251881Speter                                   tmpfile1, tmpfile2, rev1, rev2,
1384251881Speter                                   mimetype1, mimetype2, b->baton));
1385251881Speter  if (propchanges->nelts > 0)
1386251881Speter    SVN_ERR(b->callbacks->props_changed(adm_access, propstate, path,
1387251881Speter                                        propchanges, originalprops,
1388251881Speter                                        b->baton));
1389251881Speter
1390251881Speter  return SVN_NO_ERROR;
1391251881Speter}
1392251881Speter
1393251881Speter/* An svn_wc_diff_callbacks3_t function for wrapping svn_wc_diff_callbacks_t. */
1394251881Speterstatic svn_error_t *
1395251881Speterwrap_3to1_file_deleted(svn_wc_adm_access_t *adm_access,
1396251881Speter                       svn_wc_notify_state_t *state,
1397251881Speter                       svn_boolean_t *tree_conflicted,
1398251881Speter                       const char *path,
1399251881Speter                       const char *tmpfile1,
1400251881Speter                       const char *tmpfile2,
1401251881Speter                       const char *mimetype1,
1402251881Speter                       const char *mimetype2,
1403251881Speter                       apr_hash_t *originalprops,
1404251881Speter                       void *diff_baton)
1405251881Speter{
1406251881Speter  struct diff_callbacks_wrapper_baton *b = diff_baton;
1407251881Speter
1408251881Speter  if (tree_conflicted)
1409251881Speter    *tree_conflicted = FALSE;
1410251881Speter
1411251881Speter  SVN_ERR_ASSERT(originalprops);
1412251881Speter
1413251881Speter  return b->callbacks->file_deleted(adm_access, state, path,
1414251881Speter                                    tmpfile1, tmpfile2, mimetype1, mimetype2,
1415251881Speter                                    b->baton);
1416251881Speter}
1417251881Speter
1418251881Speter/* An svn_wc_diff_callbacks3_t function for wrapping svn_wc_diff_callbacks_t. */
1419251881Speterstatic svn_error_t *
1420251881Speterwrap_3to1_dir_added(svn_wc_adm_access_t *adm_access,
1421251881Speter                    svn_wc_notify_state_t *state,
1422251881Speter                    svn_boolean_t *tree_conflicted,
1423251881Speter                    const char *path,
1424251881Speter                    svn_revnum_t rev,
1425251881Speter                    void *diff_baton)
1426251881Speter{
1427251881Speter  struct diff_callbacks_wrapper_baton *b = diff_baton;
1428251881Speter
1429251881Speter  if (tree_conflicted)
1430251881Speter    *tree_conflicted = FALSE;
1431251881Speter
1432251881Speter  return b->callbacks->dir_added(adm_access, state, path, rev, b->baton);
1433251881Speter}
1434251881Speter
1435251881Speter/* An svn_wc_diff_callbacks3_t function for wrapping svn_wc_diff_callbacks_t. */
1436251881Speterstatic svn_error_t *
1437251881Speterwrap_3to1_dir_deleted(svn_wc_adm_access_t *adm_access,
1438251881Speter                      svn_wc_notify_state_t *state,
1439251881Speter                      svn_boolean_t *tree_conflicted,
1440251881Speter                      const char *path,
1441251881Speter                      void *diff_baton)
1442251881Speter{
1443251881Speter  struct diff_callbacks_wrapper_baton *b = diff_baton;
1444251881Speter
1445251881Speter  if (tree_conflicted)
1446251881Speter    *tree_conflicted = FALSE;
1447251881Speter
1448251881Speter  return b->callbacks->dir_deleted(adm_access, state, path, b->baton);
1449251881Speter}
1450251881Speter
1451251881Speter/* An svn_wc_diff_callbacks3_t function for wrapping svn_wc_diff_callbacks_t. */
1452251881Speterstatic svn_error_t *
1453251881Speterwrap_3to1_dir_props_changed(svn_wc_adm_access_t *adm_access,
1454251881Speter                            svn_wc_notify_state_t *state,
1455251881Speter                            svn_boolean_t *tree_conflicted,
1456251881Speter                            const char *path,
1457251881Speter                            const apr_array_header_t *propchanges,
1458251881Speter                            apr_hash_t *originalprops,
1459251881Speter                            void *diff_baton)
1460251881Speter{
1461251881Speter  struct diff_callbacks_wrapper_baton *b = diff_baton;
1462251881Speter
1463251881Speter  if (tree_conflicted)
1464251881Speter    *tree_conflicted = FALSE;
1465251881Speter
1466251881Speter  return b->callbacks->props_changed(adm_access, state, path, propchanges,
1467251881Speter                                     originalprops, b->baton);
1468251881Speter}
1469251881Speter
1470251881Speter/* An svn_wc_diff_callbacks3_t function for wrapping svn_wc_diff_callbacks_t
1471251881Speter   and svn_wc_diff_callbacks2_t. */
1472251881Speterstatic svn_error_t *
1473251881Speterwrap_3to1or2_dir_opened(svn_wc_adm_access_t *adm_access,
1474251881Speter                        svn_boolean_t *tree_conflicted,
1475251881Speter                        const char *path,
1476251881Speter                        svn_revnum_t rev,
1477251881Speter                        void *diff_baton)
1478251881Speter{
1479251881Speter  if (tree_conflicted)
1480251881Speter    *tree_conflicted = FALSE;
1481251881Speter  /* Do nothing. */
1482251881Speter  return SVN_NO_ERROR;
1483251881Speter}
1484251881Speter
1485251881Speter/* An svn_wc_diff_callbacks3_t function for wrapping svn_wc_diff_callbacks_t
1486251881Speter   and svn_wc_diff_callbacks2_t. */
1487251881Speterstatic svn_error_t *
1488251881Speterwrap_3to1or2_dir_closed(svn_wc_adm_access_t *adm_access,
1489251881Speter                        svn_wc_notify_state_t *propstate,
1490251881Speter                        svn_wc_notify_state_t *contentstate,
1491251881Speter                        svn_boolean_t *tree_conflicted,
1492251881Speter                        const char *path,
1493251881Speter                        void *diff_baton)
1494251881Speter{
1495251881Speter  if (contentstate)
1496251881Speter    *contentstate = svn_wc_notify_state_unknown;
1497251881Speter  if (propstate)
1498251881Speter    *propstate = svn_wc_notify_state_unknown;
1499251881Speter  if (tree_conflicted)
1500251881Speter    *tree_conflicted = FALSE;
1501251881Speter  /* Do nothing. */
1502251881Speter  return SVN_NO_ERROR;
1503251881Speter}
1504251881Speter
1505251881Speter/* Used to wrap svn_diff_callbacks_t as an svn_wc_diff_callbacks3_t. */
1506251881Speterstatic struct svn_wc_diff_callbacks3_t diff_callbacks_wrapper = {
1507251881Speter  wrap_3to1_file_changed,
1508251881Speter  wrap_3to1_file_added,
1509251881Speter  wrap_3to1_file_deleted,
1510251881Speter  wrap_3to1_dir_added,
1511251881Speter  wrap_3to1_dir_deleted,
1512251881Speter  wrap_3to1_dir_props_changed,
1513251881Speter  wrap_3to1or2_dir_opened,
1514251881Speter  wrap_3to1or2_dir_closed
1515251881Speter};
1516251881Speter
1517251881Speter
1518251881Speter
1519251881Speter/* Used to wrap svn_wc_diff_callbacks2_t. */
1520251881Speterstruct diff_callbacks2_wrapper_baton {
1521251881Speter  const svn_wc_diff_callbacks2_t *callbacks2;
1522251881Speter  void *baton;
1523251881Speter};
1524251881Speter
1525251881Speter/* An svn_wc_diff_callbacks3_t function for wrapping
1526251881Speter * svn_wc_diff_callbacks2_t. */
1527251881Speterstatic svn_error_t *
1528251881Speterwrap_3to2_file_changed(svn_wc_adm_access_t *adm_access,
1529251881Speter                       svn_wc_notify_state_t *contentstate,
1530251881Speter                       svn_wc_notify_state_t *propstate,
1531251881Speter                       svn_boolean_t *tree_conflicted,
1532251881Speter                       const char *path,
1533251881Speter                       const char *tmpfile1,
1534251881Speter                       const char *tmpfile2,
1535251881Speter                       svn_revnum_t rev1,
1536251881Speter                       svn_revnum_t rev2,
1537251881Speter                       const char *mimetype1,
1538251881Speter                       const char *mimetype2,
1539251881Speter                       const apr_array_header_t *propchanges,
1540251881Speter                       apr_hash_t *originalprops,
1541251881Speter                       void *diff_baton)
1542251881Speter{
1543251881Speter  struct diff_callbacks2_wrapper_baton *b = diff_baton;
1544251881Speter
1545251881Speter  if (tree_conflicted)
1546251881Speter    *tree_conflicted = FALSE;
1547251881Speter
1548251881Speter  return b->callbacks2->file_changed(adm_access, contentstate, propstate,
1549251881Speter                                     path, tmpfile1, tmpfile2,
1550251881Speter                                     rev1, rev2, mimetype1, mimetype2,
1551251881Speter                                     propchanges, originalprops, b->baton);
1552251881Speter}
1553251881Speter
1554251881Speter/* An svn_wc_diff_callbacks3_t function for wrapping
1555251881Speter * svn_wc_diff_callbacks2_t. */
1556251881Speterstatic svn_error_t *
1557251881Speterwrap_3to2_file_added(svn_wc_adm_access_t *adm_access,
1558251881Speter                     svn_wc_notify_state_t *contentstate,
1559251881Speter                     svn_wc_notify_state_t *propstate,
1560251881Speter                     svn_boolean_t *tree_conflicted,
1561251881Speter                     const char *path,
1562251881Speter                     const char *tmpfile1,
1563251881Speter                     const char *tmpfile2,
1564251881Speter                     svn_revnum_t rev1,
1565251881Speter                     svn_revnum_t rev2,
1566251881Speter                     const char *mimetype1,
1567251881Speter                     const char *mimetype2,
1568251881Speter                     const apr_array_header_t *propchanges,
1569251881Speter                     apr_hash_t *originalprops,
1570251881Speter                     void *diff_baton)
1571251881Speter{
1572251881Speter  struct diff_callbacks2_wrapper_baton *b = diff_baton;
1573251881Speter
1574251881Speter  if (tree_conflicted)
1575251881Speter    *tree_conflicted = FALSE;
1576251881Speter
1577251881Speter  return b->callbacks2->file_added(adm_access, contentstate, propstate, path,
1578251881Speter                                   tmpfile1, tmpfile2, rev1, rev2,
1579251881Speter                                   mimetype1, mimetype2, propchanges,
1580251881Speter                                   originalprops, b->baton);
1581251881Speter}
1582251881Speter
1583251881Speter/* An svn_wc_diff_callbacks3_t function for wrapping
1584251881Speter * svn_wc_diff_callbacks2_t. */
1585251881Speterstatic svn_error_t *
1586251881Speterwrap_3to2_file_deleted(svn_wc_adm_access_t *adm_access,
1587251881Speter                       svn_wc_notify_state_t *state,
1588251881Speter                       svn_boolean_t *tree_conflicted,
1589251881Speter                       const char *path,
1590251881Speter                       const char *tmpfile1,
1591251881Speter                       const char *tmpfile2,
1592251881Speter                       const char *mimetype1,
1593251881Speter                       const char *mimetype2,
1594251881Speter                       apr_hash_t *originalprops,
1595251881Speter                       void *diff_baton)
1596251881Speter{
1597251881Speter  struct diff_callbacks2_wrapper_baton *b = diff_baton;
1598251881Speter
1599251881Speter  if (tree_conflicted)
1600251881Speter    *tree_conflicted = FALSE;
1601251881Speter
1602251881Speter  return b->callbacks2->file_deleted(adm_access, state, path,
1603251881Speter                                     tmpfile1, tmpfile2, mimetype1, mimetype2,
1604251881Speter                                     originalprops, b->baton);
1605251881Speter}
1606251881Speter
1607251881Speter/* An svn_wc_diff_callbacks3_t function for wrapping
1608251881Speter * svn_wc_diff_callbacks2_t. */
1609251881Speterstatic svn_error_t *
1610251881Speterwrap_3to2_dir_added(svn_wc_adm_access_t *adm_access,
1611251881Speter                    svn_wc_notify_state_t *state,
1612251881Speter                    svn_boolean_t *tree_conflicted,
1613251881Speter                    const char *path,
1614251881Speter                    svn_revnum_t rev,
1615251881Speter                    void *diff_baton)
1616251881Speter{
1617251881Speter  struct diff_callbacks2_wrapper_baton *b = diff_baton;
1618251881Speter
1619251881Speter  if (tree_conflicted)
1620251881Speter    *tree_conflicted = FALSE;
1621251881Speter
1622251881Speter  return b->callbacks2->dir_added(adm_access, state, path, rev, b->baton);
1623251881Speter}
1624251881Speter
1625251881Speter/* An svn_wc_diff_callbacks3_t function for wrapping
1626251881Speter * svn_wc_diff_callbacks2_t. */
1627251881Speterstatic svn_error_t *
1628251881Speterwrap_3to2_dir_deleted(svn_wc_adm_access_t *adm_access,
1629251881Speter                      svn_wc_notify_state_t *state,
1630251881Speter                      svn_boolean_t *tree_conflicted,
1631251881Speter                      const char *path,
1632251881Speter                      void *diff_baton)
1633251881Speter{
1634251881Speter  struct diff_callbacks2_wrapper_baton *b = diff_baton;
1635251881Speter
1636251881Speter  if (tree_conflicted)
1637251881Speter    *tree_conflicted = FALSE;
1638251881Speter
1639251881Speter  return b->callbacks2->dir_deleted(adm_access, state, path, b->baton);
1640251881Speter}
1641251881Speter
1642251881Speter/* An svn_wc_diff_callbacks3_t function for wrapping
1643251881Speter * svn_wc_diff_callbacks2_t. */
1644251881Speterstatic svn_error_t *
1645251881Speterwrap_3to2_dir_props_changed(svn_wc_adm_access_t *adm_access,
1646251881Speter                            svn_wc_notify_state_t *state,
1647251881Speter                            svn_boolean_t *tree_conflicted,
1648251881Speter                            const char *path,
1649251881Speter                            const apr_array_header_t *propchanges,
1650251881Speter                            apr_hash_t *originalprops,
1651251881Speter                            void *diff_baton)
1652251881Speter{
1653251881Speter  struct diff_callbacks2_wrapper_baton *b = diff_baton;
1654251881Speter
1655251881Speter  if (tree_conflicted)
1656251881Speter    *tree_conflicted = FALSE;
1657251881Speter
1658251881Speter  return b->callbacks2->dir_props_changed(adm_access, state, path, propchanges,
1659251881Speter                                          originalprops, b->baton);
1660251881Speter}
1661251881Speter
1662251881Speter/* Used to wrap svn_diff_callbacks2_t as an svn_wc_diff_callbacks3_t. */
1663251881Speterstatic struct svn_wc_diff_callbacks3_t diff_callbacks2_wrapper = {
1664251881Speter  wrap_3to2_file_changed,
1665251881Speter  wrap_3to2_file_added,
1666251881Speter  wrap_3to2_file_deleted,
1667251881Speter  wrap_3to2_dir_added,
1668251881Speter  wrap_3to2_dir_deleted,
1669251881Speter  wrap_3to2_dir_props_changed,
1670251881Speter  wrap_3to1or2_dir_opened,
1671251881Speter  wrap_3to1or2_dir_closed
1672251881Speter};
1673251881Speter
1674251881Speter
1675251881Speter
1676251881Speter/* Used to wrap svn_wc_diff_callbacks3_t. */
1677251881Speterstruct diff_callbacks3_wrapper_baton {
1678251881Speter  const svn_wc_diff_callbacks3_t *callbacks3;
1679251881Speter  svn_wc__db_t *db;
1680251881Speter  void *baton;
1681251881Speter  const char *anchor;
1682251881Speter  const char *anchor_abspath;
1683251881Speter};
1684251881Speter
1685251881Speterstatic svn_error_t *
1686251881Speterwrap_4to3_file_opened(svn_boolean_t *tree_conflicted,
1687251881Speter                      svn_boolean_t *skip,
1688251881Speter                      const char *path,
1689251881Speter                      svn_revnum_t rev,
1690251881Speter                      void *diff_baton,
1691251881Speter                      apr_pool_t *scratch_pool)
1692251881Speter{
1693251881Speter  return SVN_NO_ERROR;
1694251881Speter}
1695251881Speter
1696251881Speter/* An svn_wc_diff_callbacks4_t function for wrapping
1697251881Speter * svn_wc_diff_callbacks3_t. */
1698251881Speterstatic svn_error_t *
1699251881Speterwrap_4to3_file_changed(svn_wc_notify_state_t *contentstate,
1700251881Speter                       svn_wc_notify_state_t *propstate,
1701251881Speter                       svn_boolean_t *tree_conflicted,
1702251881Speter                       const char *path,
1703251881Speter                       const char *tmpfile1,
1704251881Speter                       const char *tmpfile2,
1705251881Speter                       svn_revnum_t rev1,
1706251881Speter                       svn_revnum_t rev2,
1707251881Speter                       const char *mimetype1,
1708251881Speter                       const char *mimetype2,
1709251881Speter                       const apr_array_header_t *propchanges,
1710251881Speter                       apr_hash_t *originalprops,
1711251881Speter                       void *diff_baton,
1712251881Speter                       apr_pool_t *scratch_pool)
1713251881Speter{
1714251881Speter  struct diff_callbacks3_wrapper_baton *b = diff_baton;
1715251881Speter  svn_wc_adm_access_t *adm_access;
1716251881Speter  const char *dir = svn_relpath_dirname(path, scratch_pool);
1717251881Speter
1718251881Speter  adm_access = svn_wc__adm_retrieve_internal2(
1719251881Speter                        b->db,
1720251881Speter                        svn_dirent_join(b->anchor_abspath, dir, scratch_pool),
1721251881Speter                        scratch_pool);
1722251881Speter
1723251881Speter  return b->callbacks3->file_changed(adm_access, contentstate, propstate,
1724251881Speter                                     tree_conflicted,
1725251881Speter                                     svn_dirent_join(b->anchor, path,
1726251881Speter                                                     scratch_pool),
1727251881Speter                                     tmpfile1, tmpfile2,
1728251881Speter                                     rev1, rev2, mimetype1, mimetype2,
1729251881Speter                                     propchanges, originalprops, b->baton);
1730251881Speter}
1731251881Speter
1732251881Speter/* An svn_wc_diff_callbacks4_t function for wrapping
1733251881Speter * svn_wc_diff_callbacks3_t. */
1734251881Speterstatic svn_error_t *
1735251881Speterwrap_4to3_file_added(svn_wc_notify_state_t *contentstate,
1736251881Speter                     svn_wc_notify_state_t *propstate,
1737251881Speter                     svn_boolean_t *tree_conflicted,
1738251881Speter                     const char *path,
1739251881Speter                     const char *tmpfile1,
1740251881Speter                     const char *tmpfile2,
1741251881Speter                     svn_revnum_t rev1,
1742251881Speter                     svn_revnum_t rev2,
1743251881Speter                     const char *mimetype1,
1744251881Speter                     const char *mimetype2,
1745251881Speter                     const char *copyfrom_path,
1746251881Speter                     svn_revnum_t copyfrom_revision,
1747251881Speter                     const apr_array_header_t *propchanges,
1748251881Speter                     apr_hash_t *originalprops,
1749251881Speter                     void *diff_baton,
1750251881Speter                     apr_pool_t *scratch_pool)
1751251881Speter{
1752251881Speter  struct diff_callbacks3_wrapper_baton *b = diff_baton;
1753251881Speter  svn_wc_adm_access_t *adm_access;
1754251881Speter  const char *dir = svn_relpath_dirname(path, scratch_pool);
1755251881Speter
1756251881Speter  adm_access = svn_wc__adm_retrieve_internal2(
1757251881Speter                        b->db,
1758251881Speter                        svn_dirent_join(b->anchor_abspath, dir, scratch_pool),
1759251881Speter                        scratch_pool);
1760251881Speter
1761251881Speter  return b->callbacks3->file_added(adm_access, contentstate, propstate,
1762251881Speter                                   tree_conflicted,
1763251881Speter                                   svn_dirent_join(b->anchor, path,
1764251881Speter                                                   scratch_pool),
1765251881Speter                                   tmpfile1, tmpfile2,
1766251881Speter                                   rev1, rev2, mimetype1, mimetype2,
1767251881Speter                                   propchanges, originalprops, b->baton);
1768251881Speter}
1769251881Speter
1770251881Speter/* An svn_wc_diff_callbacks4_t function for wrapping
1771251881Speter * svn_wc_diff_callbacks3_t. */
1772251881Speterstatic svn_error_t *
1773251881Speterwrap_4to3_file_deleted(svn_wc_notify_state_t *state,
1774251881Speter                       svn_boolean_t *tree_conflicted,
1775251881Speter                       const char *path,
1776251881Speter                       const char *tmpfile1,
1777251881Speter                       const char *tmpfile2,
1778251881Speter                       const char *mimetype1,
1779251881Speter                       const char *mimetype2,
1780251881Speter                       apr_hash_t *originalprops,
1781251881Speter                       void *diff_baton,
1782251881Speter                       apr_pool_t *scratch_pool)
1783251881Speter{
1784251881Speter  struct diff_callbacks3_wrapper_baton *b = diff_baton;
1785251881Speter  svn_wc_adm_access_t *adm_access;
1786251881Speter  const char *dir = svn_relpath_dirname(path, scratch_pool);
1787251881Speter
1788251881Speter  adm_access = svn_wc__adm_retrieve_internal2(
1789251881Speter                        b->db,
1790251881Speter                        svn_dirent_join(b->anchor_abspath, dir, scratch_pool),
1791251881Speter                        scratch_pool);
1792251881Speter
1793251881Speter  return b->callbacks3->file_deleted(adm_access, state, tree_conflicted,
1794251881Speter                                     svn_dirent_join(b->anchor, path,
1795251881Speter                                                     scratch_pool),
1796251881Speter                                     tmpfile1, tmpfile2,
1797251881Speter                                     mimetype1, mimetype2, originalprops,
1798251881Speter                                     b->baton);
1799251881Speter}
1800251881Speter
1801251881Speter/* An svn_wc_diff_callbacks4_t function for wrapping
1802251881Speter * svn_wc_diff_callbacks3_t. */
1803251881Speterstatic svn_error_t *
1804251881Speterwrap_4to3_dir_added(svn_wc_notify_state_t *state,
1805251881Speter                    svn_boolean_t *tree_conflicted,
1806251881Speter                    svn_boolean_t *skip,
1807251881Speter                    svn_boolean_t *skip_children,
1808251881Speter                    const char *path,
1809251881Speter                    svn_revnum_t rev,
1810251881Speter                    const char *copyfrom_path,
1811251881Speter                    svn_revnum_t copyfrom_revision,
1812251881Speter                    void *diff_baton,
1813251881Speter                    apr_pool_t *scratch_pool)
1814251881Speter{
1815251881Speter  struct diff_callbacks3_wrapper_baton *b = diff_baton;
1816251881Speter  svn_wc_adm_access_t *adm_access;
1817251881Speter
1818251881Speter  adm_access = svn_wc__adm_retrieve_internal2(
1819251881Speter                        b->db,
1820251881Speter                        svn_dirent_join(b->anchor_abspath, path, scratch_pool),
1821251881Speter                        scratch_pool);
1822251881Speter
1823251881Speter  return b->callbacks3->dir_added(adm_access, state, tree_conflicted,
1824251881Speter                                  svn_dirent_join(b->anchor, path,
1825251881Speter                                                     scratch_pool),
1826251881Speter                                  rev, b->baton);
1827251881Speter}
1828251881Speter
1829251881Speter/* An svn_wc_diff_callbacks4_t function for wrapping
1830251881Speter * svn_wc_diff_callbacks3_t. */
1831251881Speterstatic svn_error_t *
1832251881Speterwrap_4to3_dir_deleted(svn_wc_notify_state_t *state,
1833251881Speter                      svn_boolean_t *tree_conflicted,
1834251881Speter                      const char *path,
1835251881Speter                      void *diff_baton,
1836251881Speter                      apr_pool_t *scratch_pool)
1837251881Speter{
1838251881Speter  struct diff_callbacks3_wrapper_baton *b = diff_baton;
1839251881Speter  svn_wc_adm_access_t *adm_access;
1840251881Speter
1841251881Speter  adm_access = svn_wc__adm_retrieve_internal2(
1842251881Speter                        b->db,
1843251881Speter                        svn_dirent_join(b->anchor_abspath, path, scratch_pool),
1844251881Speter                        scratch_pool);
1845251881Speter
1846251881Speter  return b->callbacks3->dir_deleted(adm_access, state, tree_conflicted,
1847251881Speter                                    svn_dirent_join(b->anchor, path,
1848251881Speter                                                     scratch_pool),
1849251881Speter                                    b->baton);
1850251881Speter}
1851251881Speter
1852251881Speter/* An svn_wc_diff_callbacks4_t function for wrapping
1853251881Speter * svn_wc_diff_callbacks3_t. */
1854251881Speterstatic svn_error_t *
1855251881Speterwrap_4to3_dir_props_changed(svn_wc_notify_state_t *propstate,
1856251881Speter                            svn_boolean_t *tree_conflicted,
1857251881Speter                            const char *path,
1858251881Speter                            svn_boolean_t dir_was_added,
1859251881Speter                            const apr_array_header_t *propchanges,
1860251881Speter                            apr_hash_t *original_props,
1861251881Speter                            void *diff_baton,
1862251881Speter                            apr_pool_t *scratch_pool)
1863251881Speter{
1864251881Speter  struct diff_callbacks3_wrapper_baton *b = diff_baton;
1865251881Speter  svn_wc_adm_access_t *adm_access;
1866251881Speter
1867251881Speter  adm_access = svn_wc__adm_retrieve_internal2(
1868251881Speter                        b->db,
1869251881Speter                        svn_dirent_join(b->anchor_abspath, path, scratch_pool),
1870251881Speter                        scratch_pool);
1871251881Speter
1872251881Speter  return b->callbacks3->dir_props_changed(adm_access, propstate,
1873251881Speter                                          tree_conflicted,
1874251881Speter                                          svn_dirent_join(b->anchor, path,
1875251881Speter                                                     scratch_pool),
1876251881Speter                                          propchanges, original_props,
1877251881Speter                                          b->baton);
1878251881Speter}
1879251881Speter
1880251881Speter/* An svn_wc_diff_callbacks4_t function for wrapping
1881251881Speter * svn_wc_diff_callbacks3_t. */
1882251881Speterstatic svn_error_t *
1883251881Speterwrap_4to3_dir_opened(svn_boolean_t *tree_conflicted,
1884251881Speter                     svn_boolean_t *skip,
1885251881Speter                     svn_boolean_t *skip_children,
1886251881Speter                     const char *path,
1887251881Speter                     svn_revnum_t rev,
1888251881Speter                     void *diff_baton,
1889251881Speter                     apr_pool_t *scratch_pool)
1890251881Speter{
1891251881Speter  struct diff_callbacks3_wrapper_baton *b = diff_baton;
1892251881Speter  svn_wc_adm_access_t *adm_access;
1893251881Speter
1894251881Speter  adm_access = svn_wc__adm_retrieve_internal2(
1895251881Speter                        b->db,
1896251881Speter                        svn_dirent_join(b->anchor_abspath, path, scratch_pool),
1897251881Speter                        scratch_pool);
1898251881Speter  if (skip_children)
1899251881Speter    *skip_children = FALSE;
1900251881Speter
1901251881Speter  return b->callbacks3->dir_opened(adm_access, tree_conflicted,
1902251881Speter                                   svn_dirent_join(b->anchor, path,
1903251881Speter                                                     scratch_pool),
1904251881Speter                                   rev, b->baton);
1905251881Speter}
1906251881Speter
1907251881Speter/* An svn_wc_diff_callbacks4_t function for wrapping
1908251881Speter * svn_wc_diff_callbacks3_t. */
1909251881Speterstatic svn_error_t *
1910251881Speterwrap_4to3_dir_closed(svn_wc_notify_state_t *contentstate,
1911251881Speter                     svn_wc_notify_state_t *propstate,
1912251881Speter                     svn_boolean_t *tree_conflicted,
1913251881Speter                     const char *path,
1914251881Speter                     svn_boolean_t dir_was_added,
1915251881Speter                     void *diff_baton,
1916251881Speter                     apr_pool_t *scratch_pool)
1917251881Speter{
1918251881Speter  struct diff_callbacks3_wrapper_baton *b = diff_baton;
1919251881Speter  svn_wc_adm_access_t *adm_access;
1920251881Speter
1921251881Speter  adm_access = svn_wc__adm_retrieve_internal2(
1922251881Speter                        b->db,
1923251881Speter                        svn_dirent_join(b->anchor_abspath, path, scratch_pool),
1924251881Speter                        scratch_pool);
1925251881Speter
1926251881Speter  return b->callbacks3->dir_closed(adm_access, contentstate, propstate,
1927251881Speter                                   tree_conflicted,
1928251881Speter                                   svn_dirent_join(b->anchor, path,
1929251881Speter                                                     scratch_pool),
1930251881Speter                                   b->baton);
1931251881Speter}
1932251881Speter
1933251881Speter
1934251881Speter/* Used to wrap svn_diff_callbacks3_t as an svn_wc_diff_callbacks4_t. */
1935251881Speterstatic struct svn_wc_diff_callbacks4_t diff_callbacks3_wrapper = {
1936251881Speter  wrap_4to3_file_opened,
1937251881Speter  wrap_4to3_file_changed,
1938251881Speter  wrap_4to3_file_added,
1939251881Speter  wrap_4to3_file_deleted,
1940251881Speter  wrap_4to3_dir_deleted,
1941251881Speter  wrap_4to3_dir_opened,
1942251881Speter  wrap_4to3_dir_added,
1943251881Speter  wrap_4to3_dir_props_changed,
1944251881Speter  wrap_4to3_dir_closed
1945251881Speter};
1946251881Speter
1947251881Speter
1948251881Spetersvn_error_t *
1949251881Spetersvn_wc_get_diff_editor6(const svn_delta_editor_t **editor,
1950251881Speter                        void **edit_baton,
1951251881Speter                        svn_wc_context_t *wc_ctx,
1952251881Speter                        const char *anchor_abspath,
1953251881Speter                        const char *target,
1954251881Speter                        svn_depth_t depth,
1955251881Speter                        svn_boolean_t ignore_ancestry,
1956251881Speter                        svn_boolean_t show_copies_as_adds,
1957251881Speter                        svn_boolean_t use_git_diff_format,
1958251881Speter                        svn_boolean_t use_text_base,
1959251881Speter                        svn_boolean_t reverse_order,
1960251881Speter                        svn_boolean_t server_performs_filtering,
1961251881Speter                        const apr_array_header_t *changelist_filter,
1962251881Speter                        const svn_wc_diff_callbacks4_t *callbacks,
1963251881Speter                        void *callback_baton,
1964251881Speter                        svn_cancel_func_t cancel_func,
1965251881Speter                        void *cancel_baton,
1966251881Speter                        apr_pool_t *result_pool,
1967251881Speter                        apr_pool_t *scratch_pool)
1968251881Speter{
1969251881Speter  return svn_error_trace(
1970251881Speter    svn_wc__get_diff_editor(editor, edit_baton,
1971251881Speter                            wc_ctx,
1972251881Speter                            anchor_abspath, target,
1973251881Speter                            depth,
1974251881Speter                            ignore_ancestry, show_copies_as_adds,
1975251881Speter                            use_git_diff_format, use_text_base,
1976251881Speter                            reverse_order, server_performs_filtering,
1977251881Speter                            changelist_filter,
1978251881Speter                            callbacks, callback_baton,
1979251881Speter                            cancel_func, cancel_baton,
1980251881Speter                            result_pool, scratch_pool));
1981251881Speter}
1982251881Speter
1983251881Speter
1984251881Spetersvn_error_t *
1985251881Spetersvn_wc_get_diff_editor5(svn_wc_adm_access_t *anchor,
1986251881Speter                        const char *target,
1987251881Speter                        const svn_wc_diff_callbacks3_t *callbacks,
1988251881Speter                        void *callback_baton,
1989251881Speter                        svn_depth_t depth,
1990251881Speter                        svn_boolean_t ignore_ancestry,
1991251881Speter                        svn_boolean_t use_text_base,
1992251881Speter                        svn_boolean_t reverse_order,
1993251881Speter                        svn_cancel_func_t cancel_func,
1994251881Speter                        void *cancel_baton,
1995251881Speter                        const apr_array_header_t *changelist_filter,
1996251881Speter                        const svn_delta_editor_t **editor,
1997251881Speter                        void **edit_baton,
1998251881Speter                        apr_pool_t *pool)
1999251881Speter{
2000251881Speter  struct diff_callbacks3_wrapper_baton *b = apr_palloc(pool, sizeof(*b));
2001251881Speter  svn_wc_context_t *wc_ctx;
2002251881Speter  svn_wc__db_t *db = svn_wc__adm_get_db(anchor);
2003251881Speter
2004251881Speter  SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL, db, pool));
2005251881Speter
2006251881Speter  b->callbacks3 = callbacks;
2007251881Speter  b->baton = callback_baton;
2008251881Speter  b->db = db;
2009251881Speter  b->anchor = svn_wc_adm_access_path(anchor);
2010251881Speter  b->anchor_abspath = svn_wc__adm_access_abspath(anchor);
2011251881Speter
2012251881Speter  SVN_ERR(svn_wc_get_diff_editor6(editor,
2013251881Speter                                   edit_baton,
2014251881Speter                                   wc_ctx,
2015251881Speter                                   b->anchor_abspath,
2016251881Speter                                   target,
2017251881Speter                                   depth,
2018251881Speter                                   ignore_ancestry,
2019251881Speter                                   FALSE,
2020251881Speter                                   FALSE,
2021251881Speter                                   use_text_base,
2022251881Speter                                   reverse_order,
2023251881Speter                                   FALSE,
2024251881Speter                                   changelist_filter,
2025251881Speter                                   &diff_callbacks3_wrapper,
2026251881Speter                                   b,
2027251881Speter                                   cancel_func,
2028251881Speter                                   cancel_baton,
2029251881Speter                                   pool,
2030251881Speter                                   pool));
2031251881Speter
2032251881Speter  /* Can't destroy wc_ctx. It is used by the diff editor */
2033251881Speter
2034251881Speter   return SVN_NO_ERROR;
2035251881Speter}
2036251881Speter
2037251881Spetersvn_error_t *
2038251881Spetersvn_wc_get_diff_editor4(svn_wc_adm_access_t *anchor,
2039251881Speter                        const char *target,
2040251881Speter                        const svn_wc_diff_callbacks2_t *callbacks,
2041251881Speter                        void *callback_baton,
2042251881Speter                        svn_depth_t depth,
2043251881Speter                        svn_boolean_t ignore_ancestry,
2044251881Speter                        svn_boolean_t use_text_base,
2045251881Speter                        svn_boolean_t reverse_order,
2046251881Speter                        svn_cancel_func_t cancel_func,
2047251881Speter                        void *cancel_baton,
2048251881Speter                        const apr_array_header_t *changelist_filter,
2049251881Speter                        const svn_delta_editor_t **editor,
2050251881Speter                        void **edit_baton,
2051251881Speter                        apr_pool_t *pool)
2052251881Speter{
2053251881Speter  struct diff_callbacks2_wrapper_baton *b = apr_palloc(pool, sizeof(*b));
2054251881Speter  b->callbacks2 = callbacks;
2055251881Speter  b->baton = callback_baton;
2056251881Speter  return svn_wc_get_diff_editor5(anchor,
2057251881Speter                                 target,
2058251881Speter                                 &diff_callbacks2_wrapper,
2059251881Speter                                 b,
2060251881Speter                                 depth,
2061251881Speter                                 ignore_ancestry,
2062251881Speter                                 use_text_base,
2063251881Speter                                 reverse_order,
2064251881Speter                                 cancel_func,
2065251881Speter                                 cancel_baton,
2066251881Speter                                 changelist_filter,
2067251881Speter                                 editor,
2068251881Speter                                 edit_baton,
2069251881Speter                                 pool);
2070251881Speter}
2071251881Speter
2072251881Spetersvn_error_t *
2073251881Spetersvn_wc_get_diff_editor3(svn_wc_adm_access_t *anchor,
2074251881Speter                        const char *target,
2075251881Speter                        const svn_wc_diff_callbacks2_t *callbacks,
2076251881Speter                        void *callback_baton,
2077251881Speter                        svn_boolean_t recurse,
2078251881Speter                        svn_boolean_t ignore_ancestry,
2079251881Speter                        svn_boolean_t use_text_base,
2080251881Speter                        svn_boolean_t reverse_order,
2081251881Speter                        svn_cancel_func_t cancel_func,
2082251881Speter                        void *cancel_baton,
2083251881Speter                        const svn_delta_editor_t **editor,
2084251881Speter                        void **edit_baton,
2085251881Speter                        apr_pool_t *pool)
2086251881Speter{
2087251881Speter  return svn_wc_get_diff_editor4(anchor,
2088251881Speter                                 target,
2089251881Speter                                 callbacks,
2090251881Speter                                 callback_baton,
2091251881Speter                                 SVN_DEPTH_INFINITY_OR_FILES(recurse),
2092251881Speter                                 ignore_ancestry,
2093251881Speter                                 use_text_base,
2094251881Speter                                 reverse_order,
2095251881Speter                                 cancel_func,
2096251881Speter                                 cancel_baton,
2097251881Speter                                 NULL,
2098251881Speter                                 editor,
2099251881Speter                                 edit_baton,
2100251881Speter                                 pool);
2101251881Speter}
2102251881Speter
2103251881Spetersvn_error_t *
2104251881Spetersvn_wc_get_diff_editor2(svn_wc_adm_access_t *anchor,
2105251881Speter                        const char *target,
2106251881Speter                        const svn_wc_diff_callbacks_t *callbacks,
2107251881Speter                        void *callback_baton,
2108251881Speter                        svn_boolean_t recurse,
2109251881Speter                        svn_boolean_t ignore_ancestry,
2110251881Speter                        svn_boolean_t use_text_base,
2111251881Speter                        svn_boolean_t reverse_order,
2112251881Speter                        svn_cancel_func_t cancel_func,
2113251881Speter                        void *cancel_baton,
2114251881Speter                        const svn_delta_editor_t **editor,
2115251881Speter                        void **edit_baton,
2116251881Speter                        apr_pool_t *pool)
2117251881Speter{
2118251881Speter  struct diff_callbacks_wrapper_baton *b = apr_palloc(pool, sizeof(*b));
2119251881Speter  b->callbacks = callbacks;
2120251881Speter  b->baton = callback_baton;
2121251881Speter  return svn_wc_get_diff_editor5(anchor, target, &diff_callbacks_wrapper, b,
2122251881Speter                                 SVN_DEPTH_INFINITY_OR_FILES(recurse),
2123251881Speter                                 ignore_ancestry, use_text_base,
2124251881Speter                                 reverse_order, cancel_func, cancel_baton,
2125251881Speter                                 NULL, editor, edit_baton, pool);
2126251881Speter}
2127251881Speter
2128251881Spetersvn_error_t *
2129251881Spetersvn_wc_get_diff_editor(svn_wc_adm_access_t *anchor,
2130251881Speter                       const char *target,
2131251881Speter                       const svn_wc_diff_callbacks_t *callbacks,
2132251881Speter                       void *callback_baton,
2133251881Speter                       svn_boolean_t recurse,
2134251881Speter                       svn_boolean_t use_text_base,
2135251881Speter                       svn_boolean_t reverse_order,
2136251881Speter                       svn_cancel_func_t cancel_func,
2137251881Speter                       void *cancel_baton,
2138251881Speter                       const svn_delta_editor_t **editor,
2139251881Speter                       void **edit_baton,
2140251881Speter                       apr_pool_t *pool)
2141251881Speter{
2142251881Speter  return svn_wc_get_diff_editor2(anchor, target, callbacks, callback_baton,
2143251881Speter                                 recurse, FALSE, use_text_base, reverse_order,
2144251881Speter                                 cancel_func, cancel_baton,
2145251881Speter                                 editor, edit_baton, pool);
2146251881Speter}
2147251881Speter
2148251881Spetersvn_error_t *
2149251881Spetersvn_wc_diff5(svn_wc_adm_access_t *anchor,
2150251881Speter             const char *target,
2151251881Speter             const svn_wc_diff_callbacks3_t *callbacks,
2152251881Speter             void *callback_baton,
2153251881Speter             svn_depth_t depth,
2154251881Speter             svn_boolean_t ignore_ancestry,
2155251881Speter             const apr_array_header_t *changelist_filter,
2156251881Speter             apr_pool_t *pool)
2157251881Speter{
2158251881Speter  struct diff_callbacks3_wrapper_baton *b = apr_palloc(pool, sizeof(*b));
2159251881Speter  svn_wc_context_t *wc_ctx;
2160251881Speter  svn_wc__db_t *db = svn_wc__adm_get_db(anchor);
2161251881Speter
2162251881Speter  SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL, db, pool));
2163251881Speter
2164251881Speter  b->callbacks3 = callbacks;
2165251881Speter  b->baton = callback_baton;
2166251881Speter  b->anchor = svn_wc_adm_access_path(anchor);
2167251881Speter  b->anchor_abspath = svn_wc__adm_access_abspath(anchor);
2168251881Speter
2169251881Speter  SVN_ERR(svn_wc_diff6(wc_ctx,
2170251881Speter                       svn_dirent_join(b->anchor_abspath, target, pool),
2171251881Speter                       &diff_callbacks3_wrapper,
2172251881Speter                       b,
2173251881Speter                       depth,
2174251881Speter                       ignore_ancestry,
2175251881Speter                       FALSE,
2176251881Speter                       FALSE,
2177251881Speter                       changelist_filter,
2178251881Speter                       NULL, NULL,
2179251881Speter                       pool));
2180251881Speter
2181251881Speter  return svn_error_trace(svn_wc_context_destroy(wc_ctx));
2182251881Speter}
2183251881Speter
2184251881Spetersvn_error_t *
2185251881Spetersvn_wc_diff4(svn_wc_adm_access_t *anchor,
2186251881Speter             const char *target,
2187251881Speter             const svn_wc_diff_callbacks2_t *callbacks,
2188251881Speter             void *callback_baton,
2189251881Speter             svn_depth_t depth,
2190251881Speter             svn_boolean_t ignore_ancestry,
2191251881Speter             const apr_array_header_t *changelist_filter,
2192251881Speter             apr_pool_t *pool)
2193251881Speter{
2194251881Speter  struct diff_callbacks2_wrapper_baton *b = apr_palloc(pool, sizeof(*b));
2195251881Speter  b->callbacks2 = callbacks;
2196251881Speter  b->baton = callback_baton;
2197251881Speter
2198251881Speter  return svn_wc_diff5(anchor, target, &diff_callbacks2_wrapper, b,
2199251881Speter                      depth, ignore_ancestry, changelist_filter, pool);
2200251881Speter}
2201251881Speter
2202251881Spetersvn_error_t *
2203251881Spetersvn_wc_diff3(svn_wc_adm_access_t *anchor,
2204251881Speter             const char *target,
2205251881Speter             const svn_wc_diff_callbacks2_t *callbacks,
2206251881Speter             void *callback_baton,
2207251881Speter             svn_boolean_t recurse,
2208251881Speter             svn_boolean_t ignore_ancestry,
2209251881Speter             apr_pool_t *pool)
2210251881Speter{
2211251881Speter  return svn_wc_diff4(anchor, target, callbacks, callback_baton,
2212251881Speter                      SVN_DEPTH_INFINITY_OR_FILES(recurse), ignore_ancestry,
2213251881Speter                      NULL, pool);
2214251881Speter}
2215251881Speter
2216251881Spetersvn_error_t *
2217251881Spetersvn_wc_diff2(svn_wc_adm_access_t *anchor,
2218251881Speter             const char *target,
2219251881Speter             const svn_wc_diff_callbacks_t *callbacks,
2220251881Speter             void *callback_baton,
2221251881Speter             svn_boolean_t recurse,
2222251881Speter             svn_boolean_t ignore_ancestry,
2223251881Speter             apr_pool_t *pool)
2224251881Speter{
2225251881Speter  struct diff_callbacks_wrapper_baton *b = apr_pcalloc(pool, sizeof(*b));
2226251881Speter  b->callbacks = callbacks;
2227251881Speter  b->baton = callback_baton;
2228251881Speter  return svn_wc_diff5(anchor, target, &diff_callbacks_wrapper, b,
2229251881Speter                      SVN_DEPTH_INFINITY_OR_FILES(recurse), ignore_ancestry,
2230251881Speter                      NULL, pool);
2231251881Speter}
2232251881Speter
2233251881Spetersvn_error_t *
2234251881Spetersvn_wc_diff(svn_wc_adm_access_t *anchor,
2235251881Speter            const char *target,
2236251881Speter            const svn_wc_diff_callbacks_t *callbacks,
2237251881Speter            void *callback_baton,
2238251881Speter            svn_boolean_t recurse,
2239251881Speter            apr_pool_t *pool)
2240251881Speter{
2241251881Speter  return svn_wc_diff2(anchor, target, callbacks, callback_baton,
2242251881Speter                      recurse, FALSE, pool);
2243251881Speter}
2244251881Speter
2245251881Speter/*** From entries.c ***/
2246251881Spetersvn_error_t *
2247251881Spetersvn_wc_walk_entries2(const char *path,
2248251881Speter                     svn_wc_adm_access_t *adm_access,
2249251881Speter                     const svn_wc_entry_callbacks_t *walk_callbacks,
2250251881Speter                     void *walk_baton,
2251251881Speter                     svn_boolean_t show_hidden,
2252251881Speter                     svn_cancel_func_t cancel_func,
2253251881Speter                     void *cancel_baton,
2254251881Speter                     apr_pool_t *pool)
2255251881Speter{
2256251881Speter  svn_wc_entry_callbacks2_t walk_cb2 = { 0 };
2257251881Speter  walk_cb2.found_entry = walk_callbacks->found_entry;
2258251881Speter  walk_cb2.handle_error = svn_wc__walker_default_error_handler;
2259251881Speter  return svn_wc_walk_entries3(path, adm_access,
2260251881Speter                              &walk_cb2, walk_baton, svn_depth_infinity,
2261251881Speter                              show_hidden, cancel_func, cancel_baton, pool);
2262251881Speter}
2263251881Speter
2264251881Spetersvn_error_t *
2265251881Spetersvn_wc_walk_entries(const char *path,
2266251881Speter                    svn_wc_adm_access_t *adm_access,
2267251881Speter                    const svn_wc_entry_callbacks_t *walk_callbacks,
2268251881Speter                    void *walk_baton,
2269251881Speter                    svn_boolean_t show_hidden,
2270251881Speter                    apr_pool_t *pool)
2271251881Speter{
2272251881Speter  return svn_wc_walk_entries2(path, adm_access, walk_callbacks,
2273251881Speter                              walk_baton, show_hidden, NULL, NULL,
2274251881Speter                              pool);
2275251881Speter}
2276251881Speter
2277251881Spetersvn_error_t *
2278251881Spetersvn_wc_mark_missing_deleted(const char *path,
2279251881Speter                            svn_wc_adm_access_t *parent,
2280251881Speter                            apr_pool_t *pool)
2281251881Speter{
2282251881Speter  /* With a single DB a node will never be missing */
2283251881Speter  return svn_error_createf(SVN_ERR_WC_PATH_FOUND, NULL,
2284251881Speter                           _("Unexpectedly found '%s': "
2285251881Speter                             "path is marked 'missing'"),
2286251881Speter                           svn_dirent_local_style(path, pool));
2287251881Speter}
2288251881Speter
2289251881Speter
2290251881Speter/*** From props.c ***/
2291251881Spetersvn_error_t *
2292251881Spetersvn_wc_parse_externals_description2(apr_array_header_t **externals_p,
2293251881Speter                                    const char *parent_directory,
2294251881Speter                                    const char *desc,
2295251881Speter                                    apr_pool_t *pool)
2296251881Speter{
2297251881Speter  apr_array_header_t *list;
2298251881Speter  apr_pool_t *subpool = svn_pool_create(pool);
2299251881Speter
2300251881Speter  SVN_ERR(svn_wc_parse_externals_description3(externals_p ? &list : NULL,
2301251881Speter                                              parent_directory, desc,
2302251881Speter                                              TRUE, subpool));
2303251881Speter
2304251881Speter  if (externals_p)
2305251881Speter    {
2306251881Speter      int i;
2307251881Speter
2308251881Speter      *externals_p = apr_array_make(pool, list->nelts,
2309251881Speter                                    sizeof(svn_wc_external_item_t *));
2310251881Speter      for (i = 0; i < list->nelts; i++)
2311251881Speter        {
2312251881Speter          svn_wc_external_item2_t *item2 = APR_ARRAY_IDX(list, i,
2313251881Speter                                             svn_wc_external_item2_t *);
2314251881Speter          svn_wc_external_item_t *item = apr_palloc(pool, sizeof (*item));
2315251881Speter
2316251881Speter          if (item2->target_dir)
2317251881Speter            item->target_dir = apr_pstrdup(pool, item2->target_dir);
2318251881Speter          if (item2->url)
2319251881Speter            item->url = apr_pstrdup(pool, item2->url);
2320251881Speter          item->revision = item2->revision;
2321251881Speter
2322251881Speter          APR_ARRAY_PUSH(*externals_p, svn_wc_external_item_t *) = item;
2323251881Speter        }
2324251881Speter    }
2325251881Speter
2326251881Speter  svn_pool_destroy(subpool);
2327251881Speter
2328251881Speter  return SVN_NO_ERROR;
2329251881Speter}
2330251881Speter
2331251881Speter
2332251881Spetersvn_error_t *
2333251881Spetersvn_wc_parse_externals_description(apr_hash_t **externals_p,
2334251881Speter                                   const char *parent_directory,
2335251881Speter                                   const char *desc,
2336251881Speter                                   apr_pool_t *pool)
2337251881Speter{
2338251881Speter  apr_array_header_t *list;
2339251881Speter
2340251881Speter  SVN_ERR(svn_wc_parse_externals_description2(externals_p ? &list : NULL,
2341251881Speter                                              parent_directory, desc, pool));
2342251881Speter
2343251881Speter  /* Store all of the items into the hash if that was requested. */
2344251881Speter  if (externals_p)
2345251881Speter    {
2346251881Speter      int i;
2347251881Speter
2348251881Speter      *externals_p = apr_hash_make(pool);
2349251881Speter      for (i = 0; i < list->nelts; i++)
2350251881Speter        {
2351251881Speter          svn_wc_external_item_t *item;
2352251881Speter          item = APR_ARRAY_IDX(list, i, svn_wc_external_item_t *);
2353251881Speter
2354251881Speter          svn_hash_sets(*externals_p, item->target_dir, item);
2355251881Speter        }
2356251881Speter    }
2357251881Speter  return SVN_NO_ERROR;
2358251881Speter}
2359251881Speter
2360251881Spetersvn_error_t *
2361251881Spetersvn_wc_prop_set3(const char *name,
2362251881Speter                 const svn_string_t *value,
2363251881Speter                 const char *path,
2364251881Speter                 svn_wc_adm_access_t *adm_access,
2365251881Speter                 svn_boolean_t skip_checks,
2366251881Speter                 svn_wc_notify_func2_t notify_func,
2367251881Speter                 void *notify_baton,
2368251881Speter                 apr_pool_t *pool)
2369251881Speter{
2370251881Speter  svn_wc_context_t *wc_ctx;
2371251881Speter  const char *local_abspath;
2372251881Speter  svn_error_t *err;
2373251881Speter
2374251881Speter  SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
2375251881Speter  SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL /* config */,
2376251881Speter                                         svn_wc__adm_get_db(adm_access),
2377251881Speter                                         pool));
2378251881Speter
2379251881Speter  err = svn_wc_prop_set4(wc_ctx, local_abspath,
2380251881Speter                         name, value,
2381251881Speter                         svn_depth_empty,
2382251881Speter                         skip_checks, NULL /* changelist_filter */,
2383251881Speter                         NULL, NULL /* cancellation */,
2384251881Speter                         notify_func, notify_baton,
2385251881Speter                         pool);
2386251881Speter
2387251881Speter  if (err && err->apr_err == SVN_ERR_WC_INVALID_SCHEDULE)
2388251881Speter    svn_error_clear(err);
2389251881Speter  else
2390251881Speter    SVN_ERR(err);
2391251881Speter
2392251881Speter  return svn_error_trace(svn_wc_context_destroy(wc_ctx));
2393251881Speter}
2394251881Speter
2395251881Spetersvn_error_t *
2396251881Spetersvn_wc_prop_set2(const char *name,
2397251881Speter                 const svn_string_t *value,
2398251881Speter                 const char *path,
2399251881Speter                 svn_wc_adm_access_t *adm_access,
2400251881Speter                 svn_boolean_t skip_checks,
2401251881Speter                 apr_pool_t *pool)
2402251881Speter{
2403251881Speter  return svn_wc_prop_set3(name, value, path, adm_access, skip_checks,
2404251881Speter                          NULL, NULL, pool);
2405251881Speter}
2406251881Speter
2407251881Spetersvn_error_t *
2408251881Spetersvn_wc_prop_set(const char *name,
2409251881Speter                const svn_string_t *value,
2410251881Speter                const char *path,
2411251881Speter                svn_wc_adm_access_t *adm_access,
2412251881Speter                apr_pool_t *pool)
2413251881Speter{
2414251881Speter  return svn_wc_prop_set2(name, value, path, adm_access, FALSE, pool);
2415251881Speter}
2416251881Speter
2417251881Spetersvn_error_t *
2418251881Spetersvn_wc_prop_list(apr_hash_t **props,
2419251881Speter                 const char *path,
2420251881Speter                 svn_wc_adm_access_t *adm_access,
2421251881Speter                 apr_pool_t *pool)
2422251881Speter{
2423251881Speter  svn_wc_context_t *wc_ctx;
2424251881Speter  const char *local_abspath;
2425251881Speter  svn_error_t *err;
2426251881Speter
2427251881Speter  SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
2428251881Speter  SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL /* config */,
2429251881Speter                                         svn_wc__adm_get_db(adm_access), pool));
2430251881Speter
2431251881Speter  err = svn_wc_prop_list2(props, wc_ctx, local_abspath, pool, pool);
2432251881Speter  if (err && err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND)
2433251881Speter    {
2434251881Speter      *props = apr_hash_make(pool);
2435251881Speter      svn_error_clear(err);
2436251881Speter      err = NULL;
2437251881Speter    }
2438251881Speter
2439251881Speter  return svn_error_compose_create(err, svn_wc_context_destroy(wc_ctx));
2440251881Speter}
2441251881Speter
2442251881Spetersvn_error_t *
2443251881Spetersvn_wc_prop_get(const svn_string_t **value,
2444251881Speter                const char *name,
2445251881Speter                const char *path,
2446251881Speter                svn_wc_adm_access_t *adm_access,
2447251881Speter                apr_pool_t *pool)
2448251881Speter{
2449251881Speter
2450251881Speter  svn_wc_context_t *wc_ctx;
2451251881Speter  const char *local_abspath;
2452251881Speter  svn_error_t *err;
2453251881Speter
2454251881Speter  SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
2455251881Speter  SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL /* config */,
2456251881Speter                                         svn_wc__adm_get_db(adm_access), pool));
2457251881Speter
2458251881Speter  err = svn_wc_prop_get2(value, wc_ctx, local_abspath, name, pool, pool);
2459251881Speter
2460251881Speter  if (err && err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND)
2461251881Speter    {
2462251881Speter      *value = NULL;
2463251881Speter      svn_error_clear(err);
2464251881Speter      err = NULL;
2465251881Speter    }
2466251881Speter
2467251881Speter  return svn_error_compose_create(err, svn_wc_context_destroy(wc_ctx));
2468251881Speter}
2469251881Speter
2470251881Speter/* baton for conflict_func_1to2_wrapper */
2471251881Speterstruct conflict_func_1to2_baton
2472251881Speter{
2473251881Speter  svn_wc_conflict_resolver_func_t inner_func;
2474251881Speter  void *inner_baton;
2475251881Speter};
2476251881Speter
2477251881Speter
2478251881Speter/* Implements svn_wc_conflict_resolver_func2_t */
2479251881Speterstatic svn_error_t *
2480251881Speterconflict_func_1to2_wrapper(svn_wc_conflict_result_t **result,
2481251881Speter                           const svn_wc_conflict_description2_t *conflict,
2482251881Speter                           void *baton,
2483251881Speter                           apr_pool_t *result_pool,
2484251881Speter                           apr_pool_t *scratch_pool)
2485251881Speter{
2486251881Speter  struct conflict_func_1to2_baton *btn = baton;
2487251881Speter  svn_wc_conflict_description_t *cd = svn_wc__cd2_to_cd(conflict,
2488251881Speter                                                        scratch_pool);
2489251881Speter
2490251881Speter  return svn_error_trace(btn->inner_func(result, cd, btn->inner_baton,
2491251881Speter                                         result_pool));
2492251881Speter}
2493251881Speter
2494251881Spetersvn_error_t *
2495251881Spetersvn_wc_merge_props2(svn_wc_notify_state_t *state,
2496251881Speter                    const char *path,
2497251881Speter                    svn_wc_adm_access_t *adm_access,
2498251881Speter                    apr_hash_t *baseprops,
2499251881Speter                    const apr_array_header_t *propchanges,
2500251881Speter                    svn_boolean_t base_merge,
2501251881Speter                    svn_boolean_t dry_run,
2502251881Speter                    svn_wc_conflict_resolver_func_t conflict_func,
2503251881Speter                    void *conflict_baton,
2504251881Speter                    apr_pool_t *scratch_pool)
2505251881Speter{
2506251881Speter  const char *local_abspath;
2507251881Speter  svn_error_t *err;
2508251881Speter  svn_wc_context_t *wc_ctx;
2509251881Speter  struct conflict_func_1to2_baton conflict_wrapper;
2510251881Speter
2511251881Speter  if (base_merge && !dry_run)
2512251881Speter    return svn_error_create(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
2513251881Speter                            U_("base_merge=TRUE is no longer supported; "
2514251881Speter                               "see notes/api-errata/1.7/wc006.txt"));
2515251881Speter
2516251881Speter  SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, scratch_pool));
2517251881Speter
2518251881Speter  conflict_wrapper.inner_func = conflict_func;
2519251881Speter  conflict_wrapper.inner_baton = conflict_baton;
2520251881Speter
2521251881Speter  SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL,
2522251881Speter                                         svn_wc__adm_get_db(adm_access),
2523251881Speter                                         scratch_pool));
2524251881Speter
2525251881Speter  err = svn_wc_merge_props3(state,
2526251881Speter                            wc_ctx,
2527251881Speter                            local_abspath,
2528251881Speter                            NULL /* left_version */,
2529251881Speter                            NULL /* right_version */,
2530251881Speter                            baseprops,
2531251881Speter                            propchanges,
2532251881Speter                            dry_run,
2533251881Speter                            conflict_func ? conflict_func_1to2_wrapper
2534251881Speter                                          : NULL,
2535251881Speter                            &conflict_wrapper,
2536251881Speter                            NULL, NULL,
2537251881Speter                            scratch_pool);
2538251881Speter
2539251881Speter  if (err)
2540251881Speter    switch(err->apr_err)
2541251881Speter      {
2542251881Speter        case SVN_ERR_WC_PATH_NOT_FOUND:
2543251881Speter        case SVN_ERR_WC_PATH_UNEXPECTED_STATUS:
2544251881Speter          err->apr_err = SVN_ERR_UNVERSIONED_RESOURCE;
2545251881Speter          break;
2546251881Speter      }
2547251881Speter  return svn_error_trace(
2548251881Speter            svn_error_compose_create(err,
2549251881Speter                                     svn_wc_context_destroy(wc_ctx)));
2550251881Speter}
2551251881Speter
2552251881Spetersvn_error_t *
2553251881Spetersvn_wc_merge_props(svn_wc_notify_state_t *state,
2554251881Speter                   const char *path,
2555251881Speter                   svn_wc_adm_access_t *adm_access,
2556251881Speter                   apr_hash_t *baseprops,
2557251881Speter                   const apr_array_header_t *propchanges,
2558251881Speter                   svn_boolean_t base_merge,
2559251881Speter                   svn_boolean_t dry_run,
2560251881Speter                   apr_pool_t *pool)
2561251881Speter{
2562251881Speter  return svn_wc_merge_props2(state, path, adm_access, baseprops, propchanges,
2563251881Speter                             base_merge, dry_run, NULL, NULL, pool);
2564251881Speter}
2565251881Speter
2566251881Speter
2567251881Spetersvn_error_t *
2568251881Spetersvn_wc_merge_prop_diffs(svn_wc_notify_state_t *state,
2569251881Speter                        const char *path,
2570251881Speter                        svn_wc_adm_access_t *adm_access,
2571251881Speter                        const apr_array_header_t *propchanges,
2572251881Speter                        svn_boolean_t base_merge,
2573251881Speter                        svn_boolean_t dry_run,
2574251881Speter                        apr_pool_t *pool)
2575251881Speter{
2576251881Speter  /* NOTE: Here, we use implementation knowledge.  The public
2577251881Speter     svn_wc_merge_props2 doesn't allow NULL as baseprops argument, but we know
2578251881Speter     that it works. */
2579251881Speter  return svn_wc_merge_props2(state, path, adm_access, NULL, propchanges,
2580251881Speter                             base_merge, dry_run, NULL, NULL, pool);
2581251881Speter}
2582251881Speter
2583251881Spetersvn_error_t *
2584251881Spetersvn_wc_get_prop_diffs(apr_array_header_t **propchanges,
2585251881Speter                      apr_hash_t **original_props,
2586251881Speter                      const char *path,
2587251881Speter                      svn_wc_adm_access_t *adm_access,
2588251881Speter                      apr_pool_t *pool)
2589251881Speter{
2590251881Speter  svn_wc_context_t *wc_ctx;
2591251881Speter  const char *local_abspath;
2592251881Speter
2593251881Speter  SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
2594251881Speter  SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL /* config */,
2595251881Speter                                         svn_wc__adm_get_db(adm_access), pool));
2596251881Speter
2597251881Speter  SVN_ERR(svn_wc_get_prop_diffs2(propchanges, original_props, wc_ctx,
2598251881Speter                                 local_abspath, pool, pool));
2599251881Speter
2600251881Speter  return svn_error_trace(svn_wc_context_destroy(wc_ctx));
2601251881Speter}
2602251881Speter
2603251881Speter
2604251881Spetersvn_error_t *
2605251881Spetersvn_wc_props_modified_p(svn_boolean_t *modified_p,
2606251881Speter                        const char *path,
2607251881Speter                        svn_wc_adm_access_t *adm_access,
2608251881Speter                        apr_pool_t *pool)
2609251881Speter{
2610251881Speter  svn_wc_context_t *wc_ctx;
2611251881Speter  const char *local_abspath;
2612251881Speter  svn_error_t *err;
2613251881Speter
2614251881Speter  SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
2615251881Speter  SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL /* config */,
2616251881Speter                                         svn_wc__adm_get_db(adm_access), pool));
2617251881Speter
2618251881Speter  err = svn_wc_props_modified_p2(modified_p,
2619251881Speter                                 wc_ctx,
2620251881Speter                                 local_abspath,
2621251881Speter                                 pool);
2622251881Speter
2623251881Speter  if (err)
2624251881Speter    {
2625251881Speter      if (err->apr_err != SVN_ERR_WC_PATH_NOT_FOUND)
2626251881Speter        return svn_error_trace(err);
2627251881Speter
2628251881Speter      svn_error_clear(err);
2629251881Speter      *modified_p = FALSE;
2630251881Speter    }
2631251881Speter
2632251881Speter  return svn_error_trace(svn_wc_context_destroy(wc_ctx));
2633251881Speter}
2634251881Speter
2635251881Speter
2636251881Speter/*** From status.c ***/
2637251881Speter
2638251881Speterstruct status4_wrapper_baton
2639251881Speter{
2640251881Speter  svn_wc_status_func3_t old_func;
2641251881Speter  void *old_baton;
2642251881Speter  const char *anchor_abspath;
2643251881Speter  const char *anchor_relpath;
2644251881Speter  svn_wc_context_t *wc_ctx;
2645251881Speter};
2646251881Speter
2647251881Speter/* */
2648251881Speterstatic svn_error_t *
2649251881Speterstatus4_wrapper_func(void *baton,
2650251881Speter                     const char *local_abspath,
2651251881Speter                     const svn_wc_status3_t *status,
2652251881Speter                     apr_pool_t *scratch_pool)
2653251881Speter{
2654251881Speter  struct status4_wrapper_baton *swb = baton;
2655251881Speter  svn_wc_status2_t *dup;
2656251881Speter  const char *path = local_abspath;
2657251881Speter
2658251881Speter  SVN_ERR(svn_wc__status2_from_3(&dup, status, swb->wc_ctx, local_abspath,
2659251881Speter                                 scratch_pool, scratch_pool));
2660251881Speter
2661251881Speter  if (swb->anchor_abspath != NULL)
2662251881Speter    {
2663251881Speter      path = svn_dirent_join(
2664251881Speter                swb->anchor_relpath,
2665251881Speter                svn_dirent_skip_ancestor(swb->anchor_abspath, local_abspath),
2666251881Speter                scratch_pool);
2667251881Speter    }
2668251881Speter
2669251881Speter  return (*swb->old_func)(swb->old_baton, path, dup, scratch_pool);
2670251881Speter}
2671251881Speter
2672251881Speter
2673251881Spetersvn_error_t *
2674251881Spetersvn_wc_get_status_editor5(const svn_delta_editor_t **editor,
2675251881Speter                          void **edit_baton,
2676251881Speter                          void **set_locks_baton,
2677251881Speter                          svn_revnum_t *edit_revision,
2678251881Speter                          svn_wc_context_t *wc_ctx,
2679251881Speter                          const char *anchor_abspath,
2680251881Speter                          const char *target_basename,
2681251881Speter                          svn_depth_t depth,
2682251881Speter                          svn_boolean_t get_all,
2683251881Speter                          svn_boolean_t no_ignore,
2684251881Speter                          svn_boolean_t depth_as_sticky,
2685251881Speter                          svn_boolean_t server_performs_filtering,
2686251881Speter                          const apr_array_header_t *ignore_patterns,
2687251881Speter                          svn_wc_status_func4_t status_func,
2688251881Speter                          void *status_baton,
2689251881Speter                          svn_cancel_func_t cancel_func,
2690251881Speter                          void *cancel_baton,
2691251881Speter                          apr_pool_t *result_pool,
2692251881Speter                          apr_pool_t *scratch_pool)
2693251881Speter{
2694251881Speter  return svn_error_trace(
2695251881Speter    svn_wc__get_status_editor(editor, edit_baton,
2696251881Speter                              set_locks_baton,
2697251881Speter                              edit_revision,
2698251881Speter                              wc_ctx,
2699251881Speter                              anchor_abspath,
2700251881Speter                              target_basename,
2701251881Speter                              depth,
2702251881Speter                              get_all, no_ignore,
2703251881Speter                              depth_as_sticky,
2704251881Speter                              server_performs_filtering,
2705251881Speter                              ignore_patterns,
2706251881Speter                              status_func, status_baton,
2707251881Speter                              cancel_func, cancel_baton,
2708251881Speter                              result_pool,
2709251881Speter                              scratch_pool));
2710251881Speter}
2711251881Speter
2712251881Speter
2713251881Spetersvn_error_t *
2714251881Spetersvn_wc_get_status_editor4(const svn_delta_editor_t **editor,
2715251881Speter                          void **edit_baton,
2716251881Speter                          void **set_locks_baton,
2717251881Speter                          svn_revnum_t *edit_revision,
2718251881Speter                          svn_wc_adm_access_t *anchor,
2719251881Speter                          const char *target,
2720251881Speter                          svn_depth_t depth,
2721251881Speter                          svn_boolean_t get_all,
2722251881Speter                          svn_boolean_t no_ignore,
2723251881Speter                          const apr_array_header_t *ignore_patterns,
2724251881Speter                          svn_wc_status_func3_t status_func,
2725251881Speter                          void *status_baton,
2726251881Speter                          svn_cancel_func_t cancel_func,
2727251881Speter                          void *cancel_baton,
2728251881Speter                          svn_wc_traversal_info_t *traversal_info,
2729251881Speter                          apr_pool_t *pool)
2730251881Speter{
2731251881Speter  struct status4_wrapper_baton *swb = apr_palloc(pool, sizeof(*swb));
2732251881Speter  svn_wc__db_t *wc_db;
2733251881Speter  svn_wc_context_t *wc_ctx;
2734251881Speter  const char *anchor_abspath;
2735251881Speter
2736251881Speter  swb->old_func = status_func;
2737251881Speter  swb->old_baton = status_baton;
2738251881Speter
2739251881Speter  wc_db = svn_wc__adm_get_db(anchor);
2740251881Speter
2741251881Speter  SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL /* config */,
2742251881Speter                                         wc_db, pool));
2743251881Speter
2744251881Speter  swb->wc_ctx = wc_ctx;
2745251881Speter
2746251881Speter  anchor_abspath = svn_wc__adm_access_abspath(anchor);
2747251881Speter
2748251881Speter  if (!svn_dirent_is_absolute(svn_wc_adm_access_path(anchor)))
2749251881Speter    {
2750251881Speter      swb->anchor_abspath = anchor_abspath;
2751251881Speter      swb->anchor_relpath = svn_wc_adm_access_path(anchor);
2752251881Speter    }
2753251881Speter  else
2754251881Speter    {
2755251881Speter      swb->anchor_abspath = NULL;
2756251881Speter      swb->anchor_relpath = NULL;
2757251881Speter    }
2758251881Speter
2759251881Speter  /* Before subversion 1.7 status always handled depth as sticky. 1.7 made
2760251881Speter     the output of svn status by default match the result of what would be
2761251881Speter     updated by a similar svn update. (Following the documentation) */
2762251881Speter
2763251881Speter  SVN_ERR(svn_wc_get_status_editor5(editor, edit_baton, set_locks_baton,
2764251881Speter                                    edit_revision, wc_ctx, anchor_abspath,
2765251881Speter                                    target, depth, get_all,
2766251881Speter                                    no_ignore,
2767251881Speter                                    (depth != svn_depth_unknown) /*as_sticky*/,
2768251881Speter                                    FALSE /* server_performs_filtering */,
2769251881Speter                                    ignore_patterns,
2770251881Speter                                    status4_wrapper_func, swb,
2771251881Speter                                    cancel_func, cancel_baton,
2772251881Speter                                    pool, pool));
2773251881Speter
2774251881Speter  if (traversal_info)
2775251881Speter    {
2776251881Speter      const char *local_path = svn_wc_adm_access_path(anchor);
2777251881Speter      const char *local_abspath = anchor_abspath;
2778251881Speter      if (*target)
2779251881Speter        {
2780251881Speter          local_path = svn_dirent_join(local_path, target, pool);
2781251881Speter          local_abspath = svn_dirent_join(local_abspath, target, pool);
2782251881Speter        }
2783251881Speter
2784251881Speter      SVN_ERR(gather_traversal_info(wc_ctx, local_abspath, local_path, depth,
2785251881Speter                                    traversal_info, TRUE, TRUE,
2786251881Speter                                    pool));
2787251881Speter    }
2788251881Speter
2789251881Speter  /* We can't destroy wc_ctx here, because the editor needs it while it's
2790251881Speter     driven. */
2791251881Speter  return SVN_NO_ERROR;
2792251881Speter}
2793251881Speter
2794251881Speterstruct status_editor3_compat_baton
2795251881Speter{
2796251881Speter  svn_wc_status_func2_t old_func;
2797251881Speter  void *old_baton;
2798251881Speter};
2799251881Speter
2800251881Speter/* */
2801251881Speterstatic svn_error_t *
2802251881Speterstatus_editor3_compat_func(void *baton,
2803251881Speter                           const char *path,
2804251881Speter                           svn_wc_status2_t *status,
2805251881Speter                           apr_pool_t *pool)
2806251881Speter{
2807251881Speter  struct status_editor3_compat_baton *secb = baton;
2808251881Speter
2809251881Speter  secb->old_func(secb->old_baton, path, status);
2810251881Speter  return SVN_NO_ERROR;
2811251881Speter}
2812251881Speter
2813251881Spetersvn_error_t *
2814251881Spetersvn_wc_get_status_editor3(const svn_delta_editor_t **editor,
2815251881Speter                          void **edit_baton,
2816251881Speter                          void **set_locks_baton,
2817251881Speter                          svn_revnum_t *edit_revision,
2818251881Speter                          svn_wc_adm_access_t *anchor,
2819251881Speter                          const char *target,
2820251881Speter                          svn_depth_t depth,
2821251881Speter                          svn_boolean_t get_all,
2822251881Speter                          svn_boolean_t no_ignore,
2823251881Speter                          const apr_array_header_t *ignore_patterns,
2824251881Speter                          svn_wc_status_func2_t status_func,
2825251881Speter                          void *status_baton,
2826251881Speter                          svn_cancel_func_t cancel_func,
2827251881Speter                          void *cancel_baton,
2828251881Speter                          svn_wc_traversal_info_t *traversal_info,
2829251881Speter                          apr_pool_t *pool)
2830251881Speter{
2831251881Speter  /* This baton must live beyond this function. Alloc on heap.  */
2832251881Speter  struct status_editor3_compat_baton *secb = apr_palloc(pool, sizeof(*secb));
2833251881Speter
2834251881Speter  secb->old_func = status_func;
2835251881Speter  secb->old_baton = status_baton;
2836251881Speter
2837251881Speter  return svn_wc_get_status_editor4(editor, edit_baton, set_locks_baton,
2838251881Speter                                   edit_revision, anchor, target, depth,
2839251881Speter                                   get_all, no_ignore, ignore_patterns,
2840251881Speter                                   status_editor3_compat_func, secb,
2841251881Speter                                   cancel_func, cancel_baton, traversal_info,
2842251881Speter                                   pool);
2843251881Speter}
2844251881Speter
2845251881Spetersvn_error_t *
2846251881Spetersvn_wc_get_status_editor2(const svn_delta_editor_t **editor,
2847251881Speter                          void **edit_baton,
2848251881Speter                          void **set_locks_baton,
2849251881Speter                          svn_revnum_t *edit_revision,
2850251881Speter                          svn_wc_adm_access_t *anchor,
2851251881Speter                          const char *target,
2852251881Speter                          apr_hash_t *config,
2853251881Speter                          svn_boolean_t recurse,
2854251881Speter                          svn_boolean_t get_all,
2855251881Speter                          svn_boolean_t no_ignore,
2856251881Speter                          svn_wc_status_func2_t status_func,
2857251881Speter                          void *status_baton,
2858251881Speter                          svn_cancel_func_t cancel_func,
2859251881Speter                          void *cancel_baton,
2860251881Speter                          svn_wc_traversal_info_t *traversal_info,
2861251881Speter                          apr_pool_t *pool)
2862251881Speter{
2863251881Speter  apr_array_header_t *ignores;
2864251881Speter
2865251881Speter  SVN_ERR(svn_wc_get_default_ignores(&ignores, config, pool));
2866251881Speter  return svn_wc_get_status_editor3(editor,
2867251881Speter                                   edit_baton,
2868251881Speter                                   set_locks_baton,
2869251881Speter                                   edit_revision,
2870251881Speter                                   anchor,
2871251881Speter                                   target,
2872251881Speter                                   SVN_DEPTH_INFINITY_OR_IMMEDIATES(recurse),
2873251881Speter                                   get_all,
2874251881Speter                                   no_ignore,
2875251881Speter                                   ignores,
2876251881Speter                                   status_func,
2877251881Speter                                   status_baton,
2878251881Speter                                   cancel_func,
2879251881Speter                                   cancel_baton,
2880251881Speter                                   traversal_info,
2881251881Speter                                   pool);
2882251881Speter}
2883251881Speter
2884251881Speter
2885251881Speter/* Helpers for deprecated svn_wc_status_editor(), of type
2886251881Speter   svn_wc_status_func2_t. */
2887251881Speterstruct old_status_func_cb_baton
2888251881Speter{
2889251881Speter  svn_wc_status_func_t original_func;
2890251881Speter  void *original_baton;
2891251881Speter};
2892251881Speter
2893251881Speter/* */
2894251881Speterstatic void old_status_func_cb(void *baton,
2895251881Speter                               const char *path,
2896251881Speter                               svn_wc_status2_t *status)
2897251881Speter{
2898251881Speter  struct old_status_func_cb_baton *b = baton;
2899251881Speter  svn_wc_status_t *stat = (svn_wc_status_t *) status;
2900251881Speter
2901251881Speter  b->original_func(b->original_baton, path, stat);
2902251881Speter}
2903251881Speter
2904251881Spetersvn_error_t *
2905251881Spetersvn_wc_get_status_editor(const svn_delta_editor_t **editor,
2906251881Speter                         void **edit_baton,
2907251881Speter                         svn_revnum_t *edit_revision,
2908251881Speter                         svn_wc_adm_access_t *anchor,
2909251881Speter                         const char *target,
2910251881Speter                         apr_hash_t *config,
2911251881Speter                         svn_boolean_t recurse,
2912251881Speter                         svn_boolean_t get_all,
2913251881Speter                         svn_boolean_t no_ignore,
2914251881Speter                         svn_wc_status_func_t status_func,
2915251881Speter                         void *status_baton,
2916251881Speter                         svn_cancel_func_t cancel_func,
2917251881Speter                         void *cancel_baton,
2918251881Speter                         svn_wc_traversal_info_t *traversal_info,
2919251881Speter                         apr_pool_t *pool)
2920251881Speter{
2921251881Speter  struct old_status_func_cb_baton *b = apr_pcalloc(pool, sizeof(*b));
2922251881Speter  apr_array_header_t *ignores;
2923251881Speter  b->original_func = status_func;
2924251881Speter  b->original_baton = status_baton;
2925251881Speter  SVN_ERR(svn_wc_get_default_ignores(&ignores, config, pool));
2926251881Speter  return svn_wc_get_status_editor3(editor, edit_baton, NULL, edit_revision,
2927251881Speter                                   anchor, target,
2928251881Speter                                   SVN_DEPTH_INFINITY_OR_IMMEDIATES(recurse),
2929251881Speter                                   get_all, no_ignore, ignores,
2930251881Speter                                   old_status_func_cb, b,
2931251881Speter                                   cancel_func, cancel_baton,
2932251881Speter                                   traversal_info, pool);
2933251881Speter}
2934251881Speter
2935251881Spetersvn_error_t *
2936251881Spetersvn_wc_status(svn_wc_status_t **status,
2937251881Speter              const char *path,
2938251881Speter              svn_wc_adm_access_t *adm_access,
2939251881Speter              apr_pool_t *pool)
2940251881Speter{
2941251881Speter  svn_wc_status2_t *stat2;
2942251881Speter
2943251881Speter  SVN_ERR(svn_wc_status2(&stat2, path, adm_access, pool));
2944251881Speter  *status = (svn_wc_status_t *) stat2;
2945251881Speter  return SVN_NO_ERROR;
2946251881Speter}
2947251881Speter
2948251881Speter
2949251881Speterstatic svn_wc_conflict_description_t *
2950251881Speterconflict_description_dup(const svn_wc_conflict_description_t *conflict,
2951251881Speter                         apr_pool_t *pool)
2952251881Speter{
2953251881Speter  svn_wc_conflict_description_t *new_conflict;
2954251881Speter
2955251881Speter  new_conflict = apr_pcalloc(pool, sizeof(*new_conflict));
2956251881Speter
2957251881Speter  /* Shallow copy all members. */
2958251881Speter  *new_conflict = *conflict;
2959251881Speter
2960251881Speter  if (conflict->path)
2961251881Speter    new_conflict->path = apr_pstrdup(pool, conflict->path);
2962251881Speter  if (conflict->property_name)
2963251881Speter    new_conflict->property_name = apr_pstrdup(pool, conflict->property_name);
2964251881Speter  if (conflict->mime_type)
2965251881Speter    new_conflict->mime_type = apr_pstrdup(pool, conflict->mime_type);
2966251881Speter  /* NOTE: We cannot make a deep copy of adm_access. */
2967251881Speter  if (conflict->base_file)
2968251881Speter    new_conflict->base_file = apr_pstrdup(pool, conflict->base_file);
2969251881Speter  if (conflict->their_file)
2970251881Speter    new_conflict->their_file = apr_pstrdup(pool, conflict->their_file);
2971251881Speter  if (conflict->my_file)
2972251881Speter    new_conflict->my_file = apr_pstrdup(pool, conflict->my_file);
2973251881Speter  if (conflict->merged_file)
2974251881Speter    new_conflict->merged_file = apr_pstrdup(pool, conflict->merged_file);
2975251881Speter  if (conflict->src_left_version)
2976251881Speter    new_conflict->src_left_version =
2977251881Speter      svn_wc_conflict_version_dup(conflict->src_left_version, pool);
2978251881Speter  if (conflict->src_right_version)
2979251881Speter    new_conflict->src_right_version =
2980251881Speter      svn_wc_conflict_version_dup(conflict->src_right_version, pool);
2981251881Speter
2982251881Speter  return new_conflict;
2983251881Speter}
2984251881Speter
2985251881Speter
2986251881Spetersvn_wc_status2_t *
2987251881Spetersvn_wc_dup_status2(const svn_wc_status2_t *orig_stat,
2988251881Speter                   apr_pool_t *pool)
2989251881Speter{
2990251881Speter  svn_wc_status2_t *new_stat = apr_palloc(pool, sizeof(*new_stat));
2991251881Speter
2992251881Speter  /* Shallow copy all members. */
2993251881Speter  *new_stat = *orig_stat;
2994251881Speter
2995251881Speter  /* Now go back and dup the deep items into this pool. */
2996251881Speter  if (orig_stat->entry)
2997251881Speter    new_stat->entry = svn_wc_entry_dup(orig_stat->entry, pool);
2998251881Speter
2999251881Speter  if (orig_stat->repos_lock)
3000251881Speter    new_stat->repos_lock = svn_lock_dup(orig_stat->repos_lock, pool);
3001251881Speter
3002251881Speter  if (orig_stat->url)
3003251881Speter    new_stat->url = apr_pstrdup(pool, orig_stat->url);
3004251881Speter
3005251881Speter  if (orig_stat->ood_last_cmt_author)
3006251881Speter    new_stat->ood_last_cmt_author
3007251881Speter      = apr_pstrdup(pool, orig_stat->ood_last_cmt_author);
3008251881Speter
3009251881Speter  if (orig_stat->tree_conflict)
3010251881Speter    new_stat->tree_conflict
3011251881Speter      = conflict_description_dup(orig_stat->tree_conflict, pool);
3012251881Speter
3013251881Speter  /* Return the new hotness. */
3014251881Speter  return new_stat;
3015251881Speter}
3016251881Speter
3017251881Spetersvn_wc_status_t *
3018251881Spetersvn_wc_dup_status(const svn_wc_status_t *orig_stat,
3019251881Speter                  apr_pool_t *pool)
3020251881Speter{
3021251881Speter  svn_wc_status_t *new_stat = apr_palloc(pool, sizeof(*new_stat));
3022251881Speter
3023251881Speter  /* Shallow copy all members. */
3024251881Speter  *new_stat = *orig_stat;
3025251881Speter
3026251881Speter  /* Now go back and dup the deep item into this pool. */
3027251881Speter  if (orig_stat->entry)
3028251881Speter    new_stat->entry = svn_wc_entry_dup(orig_stat->entry, pool);
3029251881Speter
3030251881Speter  /* Return the new hotness. */
3031251881Speter  return new_stat;
3032251881Speter}
3033251881Speter
3034251881Spetersvn_error_t *
3035251881Spetersvn_wc_get_ignores(apr_array_header_t **patterns,
3036251881Speter                   apr_hash_t *config,
3037251881Speter                   svn_wc_adm_access_t *adm_access,
3038251881Speter                   apr_pool_t *pool)
3039251881Speter{
3040251881Speter  svn_wc_context_t *wc_ctx;
3041251881Speter  const char *local_abspath;
3042251881Speter
3043251881Speter  SVN_ERR(svn_dirent_get_absolute(&local_abspath,
3044251881Speter                                  svn_wc_adm_access_path(adm_access), pool));
3045251881Speter
3046251881Speter  SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL /* config */,
3047251881Speter                                         svn_wc__adm_get_db(adm_access),
3048251881Speter                                         pool));
3049251881Speter
3050251881Speter  SVN_ERR(svn_wc_get_ignores2(patterns, wc_ctx, local_abspath, config, pool,
3051251881Speter                              pool));
3052251881Speter
3053251881Speter  return svn_error_trace(svn_wc_context_destroy(wc_ctx));
3054251881Speter}
3055251881Speter
3056251881Spetersvn_error_t *
3057251881Spetersvn_wc_status2(svn_wc_status2_t **status,
3058251881Speter               const char *path,
3059251881Speter               svn_wc_adm_access_t *adm_access,
3060251881Speter               apr_pool_t *pool)
3061251881Speter{
3062251881Speter  const char *local_abspath;
3063251881Speter  svn_wc_context_t *wc_ctx;
3064251881Speter  svn_wc_status3_t *stat3;
3065251881Speter
3066251881Speter  SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
3067251881Speter  SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL /* config */,
3068251881Speter                                         svn_wc__adm_get_db(adm_access),
3069251881Speter                                         pool));
3070251881Speter
3071251881Speter  SVN_ERR(svn_wc_status3(&stat3, wc_ctx, local_abspath, pool, pool));
3072251881Speter  SVN_ERR(svn_wc__status2_from_3(status, stat3, wc_ctx, local_abspath,
3073251881Speter                                 pool, pool));
3074251881Speter
3075251881Speter  return svn_error_trace(svn_wc_context_destroy(wc_ctx));
3076251881Speter}
3077251881Speter
3078251881Speter
3079251881Speter/*** From update_editor.c ***/
3080251881Speter
3081251881Spetersvn_error_t *
3082251881Spetersvn_wc_add_repos_file3(const char *dst_path,
3083251881Speter                       svn_wc_adm_access_t *adm_access,
3084251881Speter                       svn_stream_t *new_base_contents,
3085251881Speter                       svn_stream_t *new_contents,
3086251881Speter                       apr_hash_t *new_base_props,
3087251881Speter                       apr_hash_t *new_props,
3088251881Speter                       const char *copyfrom_url,
3089251881Speter                       svn_revnum_t copyfrom_rev,
3090251881Speter                       svn_cancel_func_t cancel_func,
3091251881Speter                       void *cancel_baton,
3092251881Speter                       svn_wc_notify_func2_t notify_func,
3093251881Speter                       void *notify_baton,
3094251881Speter                       apr_pool_t *pool)
3095251881Speter{
3096251881Speter  const char *local_abspath;
3097251881Speter  svn_wc_context_t *wc_ctx;
3098251881Speter
3099251881Speter  SVN_ERR(svn_dirent_get_absolute(&local_abspath, dst_path, pool));
3100251881Speter  SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL /* config */,
3101251881Speter                                         svn_wc__adm_get_db(adm_access),
3102251881Speter                                         pool));
3103251881Speter
3104251881Speter  SVN_ERR(svn_wc_add_repos_file4(wc_ctx,
3105251881Speter                                 local_abspath,
3106251881Speter                                 new_base_contents,
3107251881Speter                                 new_contents,
3108251881Speter                                 new_base_props,
3109251881Speter                                 new_props,
3110251881Speter                                 copyfrom_url,
3111251881Speter                                 copyfrom_rev,
3112251881Speter                                 cancel_func, cancel_baton,
3113251881Speter                                 pool));
3114251881Speter
3115251881Speter  return svn_error_trace(svn_wc_context_destroy(wc_ctx));
3116251881Speter}
3117251881Speter
3118251881Spetersvn_error_t *
3119251881Spetersvn_wc_add_repos_file2(const char *dst_path,
3120251881Speter                       svn_wc_adm_access_t *adm_access,
3121251881Speter                       const char *new_text_base_path,
3122251881Speter                       const char *new_text_path,
3123251881Speter                       apr_hash_t *new_base_props,
3124251881Speter                       apr_hash_t *new_props,
3125251881Speter                       const char *copyfrom_url,
3126251881Speter                       svn_revnum_t copyfrom_rev,
3127251881Speter                       apr_pool_t *pool)
3128251881Speter{
3129251881Speter  svn_stream_t *new_base_contents;
3130251881Speter  svn_stream_t *new_contents = NULL;
3131251881Speter
3132251881Speter  SVN_ERR(svn_stream_open_readonly(&new_base_contents, new_text_base_path,
3133251881Speter                                   pool, pool));
3134251881Speter
3135251881Speter  if (new_text_path)
3136251881Speter    {
3137251881Speter      /* NOTE: the specified path may *not* be under version control.
3138251881Speter         It is most likely sitting in .svn/tmp/. Thus, we cannot use the
3139251881Speter         typical WC functions to access "special", "keywords" or "EOL"
3140251881Speter         information. We need to look at the properties given to us. */
3141251881Speter
3142251881Speter      /* If the new file is special, then we can simply open the given
3143251881Speter         contents since it is already in normal form. */
3144251881Speter      if (svn_hash_gets(new_props, SVN_PROP_SPECIAL) != NULL)
3145251881Speter        {
3146251881Speter          SVN_ERR(svn_stream_open_readonly(&new_contents, new_text_path,
3147251881Speter                                           pool, pool));
3148251881Speter        }
3149251881Speter      else
3150251881Speter        {
3151251881Speter          /* The new text contents need to be detrans'd into normal form. */
3152251881Speter          svn_subst_eol_style_t eol_style;
3153251881Speter          const char *eol_str;
3154251881Speter          apr_hash_t *keywords = NULL;
3155251881Speter          svn_string_t *list;
3156251881Speter
3157251881Speter          list = svn_hash_gets(new_props, SVN_PROP_KEYWORDS);
3158251881Speter          if (list != NULL)
3159251881Speter            {
3160251881Speter              /* Since we are detranslating, all of the keyword values
3161251881Speter                 can be "". */
3162251881Speter              SVN_ERR(svn_subst_build_keywords2(&keywords,
3163251881Speter                                                list->data,
3164251881Speter                                                "", "", 0, "",
3165251881Speter                                                pool));
3166251881Speter              if (apr_hash_count(keywords) == 0)
3167251881Speter                keywords = NULL;
3168251881Speter            }
3169251881Speter
3170251881Speter          svn_subst_eol_style_from_value(&eol_style, &eol_str,
3171251881Speter                                         svn_hash_gets(new_props,
3172251881Speter                                                       SVN_PROP_EOL_STYLE));
3173251881Speter
3174251881Speter          if (svn_subst_translation_required(eol_style, eol_str, keywords,
3175251881Speter                                             FALSE, FALSE))
3176251881Speter            {
3177251881Speter              SVN_ERR(svn_subst_stream_detranslated(&new_contents,
3178251881Speter                                                    new_text_path,
3179251881Speter                                                    eol_style, eol_str,
3180251881Speter                                                    FALSE,
3181251881Speter                                                    keywords,
3182251881Speter                                                    FALSE,
3183251881Speter                                                    pool));
3184251881Speter            }
3185251881Speter          else
3186251881Speter            {
3187251881Speter              SVN_ERR(svn_stream_open_readonly(&new_contents, new_text_path,
3188251881Speter                                               pool, pool));
3189251881Speter            }
3190251881Speter        }
3191251881Speter    }
3192251881Speter
3193251881Speter  SVN_ERR(svn_wc_add_repos_file3(dst_path, adm_access,
3194251881Speter                                 new_base_contents, new_contents,
3195251881Speter                                 new_base_props, new_props,
3196251881Speter                                 copyfrom_url, copyfrom_rev,
3197251881Speter                                 NULL, NULL, NULL, NULL,
3198251881Speter                                 pool));
3199251881Speter
3200251881Speter  /* The API contract states that the text files will be removed upon
3201251881Speter     successful completion. add_repos_file3() does not remove the files
3202251881Speter     since it only has streams on them. Toss 'em now. */
3203251881Speter  svn_error_clear(svn_io_remove_file(new_text_base_path, pool));
3204251881Speter  if (new_text_path)
3205251881Speter    svn_error_clear(svn_io_remove_file(new_text_path, pool));
3206251881Speter
3207251881Speter  return SVN_NO_ERROR;
3208251881Speter}
3209251881Speter
3210251881Speter
3211251881Spetersvn_error_t *
3212251881Spetersvn_wc_add_repos_file(const char *dst_path,
3213251881Speter                      svn_wc_adm_access_t *adm_access,
3214251881Speter                      const char *new_text_path,
3215251881Speter                      apr_hash_t *new_props,
3216251881Speter                      const char *copyfrom_url,
3217251881Speter                      svn_revnum_t copyfrom_rev,
3218251881Speter                      apr_pool_t *pool)
3219251881Speter{
3220251881Speter  return svn_wc_add_repos_file2(dst_path, adm_access,
3221251881Speter                                new_text_path, NULL,
3222251881Speter                                new_props, NULL,
3223251881Speter                                copyfrom_url, copyfrom_rev,
3224251881Speter                                pool);
3225251881Speter}
3226251881Speter
3227251881Spetersvn_error_t *
3228251881Spetersvn_wc_get_actual_target(const char *path,
3229251881Speter                         const char **anchor,
3230251881Speter                         const char **target,
3231251881Speter                         apr_pool_t *pool)
3232251881Speter{
3233251881Speter  svn_wc_context_t *wc_ctx;
3234251881Speter
3235251881Speter  SVN_ERR(svn_wc_context_create(&wc_ctx, NULL, pool, pool));
3236251881Speter  SVN_ERR(svn_wc_get_actual_target2(anchor, target, wc_ctx, path, pool, pool));
3237251881Speter
3238251881Speter  return svn_error_trace(svn_wc_context_destroy(wc_ctx));
3239251881Speter}
3240251881Speter
3241251881Speter/* This function has no internal variant as its behavior on switched
3242251881Speter   non-directories is not what you would expect. But this happens to
3243251881Speter   be the legacy behavior of this function. */
3244251881Spetersvn_error_t *
3245251881Spetersvn_wc_is_wc_root2(svn_boolean_t *wc_root,
3246251881Speter                   svn_wc_context_t *wc_ctx,
3247251881Speter                   const char *local_abspath,
3248251881Speter                   apr_pool_t *scratch_pool)
3249251881Speter{
3250251881Speter  svn_boolean_t is_root;
3251251881Speter  svn_boolean_t is_switched;
3252251881Speter  svn_node_kind_t kind;
3253251881Speter  svn_error_t *err;
3254251881Speter  SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
3255251881Speter
3256251881Speter  err = svn_wc__db_is_switched(&is_root, &is_switched, &kind,
3257251881Speter                               wc_ctx->db, local_abspath, scratch_pool);
3258251881Speter
3259251881Speter  if (err)
3260251881Speter    {
3261251881Speter      if (err->apr_err != SVN_ERR_WC_PATH_NOT_FOUND &&
3262251881Speter          err->apr_err != SVN_ERR_WC_NOT_WORKING_COPY)
3263251881Speter        return svn_error_trace(err);
3264251881Speter
3265251881Speter      return svn_error_create(SVN_ERR_ENTRY_NOT_FOUND, err, err->message);
3266251881Speter    }
3267251881Speter
3268251881Speter  *wc_root = is_root || (kind == svn_node_dir && is_switched);
3269251881Speter
3270251881Speter  return SVN_NO_ERROR;
3271251881Speter}
3272251881Speter
3273251881Spetersvn_error_t *
3274251881Spetersvn_wc_is_wc_root(svn_boolean_t *wc_root,
3275251881Speter                  const char *path,
3276251881Speter                  svn_wc_adm_access_t *adm_access,
3277251881Speter                  apr_pool_t *pool)
3278251881Speter{
3279251881Speter  svn_wc_context_t *wc_ctx;
3280251881Speter  const char *local_abspath;
3281251881Speter  svn_error_t *err;
3282251881Speter
3283251881Speter  /* Subversion <= 1.6 said that '.' or a drive root is a WC root. */
3284251881Speter  if (svn_path_is_empty(path) || svn_dirent_is_root(path, strlen(path)))
3285251881Speter    {
3286251881Speter      *wc_root = TRUE;
3287251881Speter      return SVN_NO_ERROR;
3288251881Speter    }
3289251881Speter
3290251881Speter  SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
3291251881Speter  SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL /* config */,
3292251881Speter                                         svn_wc__adm_get_db(adm_access),
3293251881Speter                                         pool));
3294251881Speter
3295251881Speter  err = svn_wc_is_wc_root2(wc_root, wc_ctx, local_abspath, pool);
3296251881Speter
3297251881Speter  if (err
3298251881Speter      && (err->apr_err == SVN_ERR_WC_NOT_WORKING_COPY
3299251881Speter          || err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND))
3300251881Speter    {
3301251881Speter      /* Subversion <= 1.6 said that an unversioned path is a WC root. */
3302251881Speter      svn_error_clear(err);
3303251881Speter      *wc_root = TRUE;
3304251881Speter    }
3305251881Speter  else
3306251881Speter    SVN_ERR(err);
3307251881Speter
3308251881Speter  return svn_error_trace(svn_wc_context_destroy(wc_ctx));
3309251881Speter}
3310251881Speter
3311251881Speter
3312251881Spetersvn_error_t *
3313251881Spetersvn_wc_get_update_editor4(const svn_delta_editor_t **editor,
3314251881Speter                          void **edit_baton,
3315251881Speter                          svn_revnum_t *target_revision,
3316251881Speter                          svn_wc_context_t *wc_ctx,
3317251881Speter                          const char *anchor_abspath,
3318251881Speter                          const char *target_basename,
3319251881Speter                          svn_boolean_t use_commit_times,
3320251881Speter                          svn_depth_t depth,
3321251881Speter                          svn_boolean_t depth_is_sticky,
3322251881Speter                          svn_boolean_t allow_unver_obstructions,
3323251881Speter                          svn_boolean_t adds_as_modification,
3324251881Speter                          svn_boolean_t server_performs_filtering,
3325251881Speter                          svn_boolean_t clean_checkout,
3326251881Speter                          const char *diff3_cmd,
3327251881Speter                          const apr_array_header_t *preserved_exts,
3328251881Speter                          svn_wc_dirents_func_t fetch_dirents_func,
3329251881Speter                          void *fetch_dirents_baton,
3330251881Speter                          svn_wc_conflict_resolver_func2_t conflict_func,
3331251881Speter                          void *conflict_baton,
3332251881Speter                          svn_wc_external_update_t external_func,
3333251881Speter                          void *external_baton,
3334251881Speter                          svn_cancel_func_t cancel_func,
3335251881Speter                          void *cancel_baton,
3336251881Speter                          svn_wc_notify_func2_t notify_func,
3337251881Speter                          void *notify_baton,
3338251881Speter                          apr_pool_t *result_pool,
3339251881Speter                          apr_pool_t *scratch_pool)
3340251881Speter{
3341251881Speter  return svn_error_trace(
3342251881Speter    svn_wc__get_update_editor(editor, edit_baton,
3343251881Speter                              target_revision,
3344251881Speter                              wc_ctx,
3345251881Speter                              anchor_abspath,
3346251881Speter                              target_basename, NULL,
3347251881Speter                              use_commit_times,
3348251881Speter                              depth, depth_is_sticky,
3349251881Speter                              allow_unver_obstructions,
3350251881Speter                              adds_as_modification,
3351251881Speter                              server_performs_filtering,
3352251881Speter                              clean_checkout,
3353251881Speter                              diff3_cmd,
3354251881Speter                              preserved_exts,
3355251881Speter                              fetch_dirents_func, fetch_dirents_baton,
3356251881Speter                              conflict_func, conflict_baton,
3357251881Speter                              external_func, external_baton,
3358251881Speter                              cancel_func, cancel_baton,
3359251881Speter                              notify_func, notify_baton,
3360251881Speter                              result_pool, scratch_pool));
3361251881Speter}
3362251881Speter
3363251881Speter
3364251881Spetersvn_error_t *
3365251881Spetersvn_wc_get_update_editor3(svn_revnum_t *target_revision,
3366251881Speter                          svn_wc_adm_access_t *anchor,
3367251881Speter                          const char *target,
3368251881Speter                          svn_boolean_t use_commit_times,
3369251881Speter                          svn_depth_t depth,
3370251881Speter                          svn_boolean_t depth_is_sticky,
3371251881Speter                          svn_boolean_t allow_unver_obstructions,
3372251881Speter                          svn_wc_notify_func2_t notify_func,
3373251881Speter                          void *notify_baton,
3374251881Speter                          svn_cancel_func_t cancel_func,
3375251881Speter                          void *cancel_baton,
3376251881Speter                          svn_wc_conflict_resolver_func_t conflict_func,
3377251881Speter                          void *conflict_baton,
3378251881Speter                          svn_wc_get_file_t fetch_func,
3379251881Speter                          void *fetch_baton,
3380251881Speter                          const char *diff3_cmd,
3381251881Speter                          const apr_array_header_t *preserved_exts,
3382251881Speter                          const svn_delta_editor_t **editor,
3383251881Speter                          void **edit_baton,
3384251881Speter                          svn_wc_traversal_info_t *traversal_info,
3385251881Speter                          apr_pool_t *pool)
3386251881Speter{
3387251881Speter  svn_wc_context_t *wc_ctx;
3388251881Speter  svn_wc__db_t *db = svn_wc__adm_get_db(anchor);
3389251881Speter  svn_wc_external_update_t external_func = NULL;
3390251881Speter  struct traversal_info_update_baton *eb = NULL;
3391251881Speter  struct conflict_func_1to2_baton *cfw = NULL;
3392251881Speter
3393251881Speter  SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL, db, pool));
3394251881Speter
3395251881Speter  if (traversal_info)
3396251881Speter    {
3397251881Speter      eb = apr_palloc(pool, sizeof(*eb));
3398251881Speter      eb->db = db;
3399251881Speter      eb->traversal = traversal_info;
3400251881Speter      external_func = traversal_info_update;
3401251881Speter    }
3402251881Speter
3403251881Speter  if (conflict_func)
3404251881Speter    {
3405251881Speter      cfw = apr_pcalloc(pool, sizeof(*cfw));
3406251881Speter      cfw->inner_func = conflict_func;
3407251881Speter      cfw->inner_baton = conflict_baton;
3408251881Speter    }
3409251881Speter
3410251881Speter  if (diff3_cmd)
3411251881Speter    SVN_ERR(svn_path_cstring_to_utf8(&diff3_cmd, diff3_cmd, pool));
3412251881Speter
3413251881Speter  SVN_ERR(svn_wc_get_update_editor4(editor, edit_baton,
3414251881Speter                                    target_revision,
3415251881Speter                                    wc_ctx,
3416251881Speter                                    svn_wc__adm_access_abspath(anchor),
3417251881Speter                                    target,
3418251881Speter                                    use_commit_times,
3419251881Speter                                    depth, depth_is_sticky,
3420251881Speter                                    allow_unver_obstructions,
3421251881Speter                                    TRUE /* adds_as_modification */,
3422251881Speter                                    FALSE /* server_performs_filtering */,
3423251881Speter                                    FALSE /* clean_checkout */,
3424251881Speter                                    diff3_cmd,
3425251881Speter                                    preserved_exts,
3426251881Speter                                    NULL, NULL, /* fetch_dirents_func, baton */
3427251881Speter                                    conflict_func ? conflict_func_1to2_wrapper
3428251881Speter                                                  : NULL,
3429251881Speter                                    cfw,
3430251881Speter                                    external_func, eb,
3431251881Speter                                    cancel_func, cancel_baton,
3432251881Speter                                    notify_func, notify_baton,
3433251881Speter                                    pool, pool));
3434251881Speter
3435251881Speter  /* We can't destroy wc_ctx here, because the editor needs it while it's
3436251881Speter     driven. */
3437251881Speter  return SVN_NO_ERROR;
3438251881Speter}
3439251881Speter
3440251881Spetersvn_error_t *
3441251881Spetersvn_wc_get_update_editor2(svn_revnum_t *target_revision,
3442251881Speter                          svn_wc_adm_access_t *anchor,
3443251881Speter                          const char *target,
3444251881Speter                          svn_boolean_t use_commit_times,
3445251881Speter                          svn_boolean_t recurse,
3446251881Speter                          svn_wc_notify_func2_t notify_func,
3447251881Speter                          void *notify_baton,
3448251881Speter                          svn_cancel_func_t cancel_func,
3449251881Speter                          void *cancel_baton,
3450251881Speter                          const char *diff3_cmd,
3451251881Speter                          const svn_delta_editor_t **editor,
3452251881Speter                          void **edit_baton,
3453251881Speter                          svn_wc_traversal_info_t *traversal_info,
3454251881Speter                          apr_pool_t *pool)
3455251881Speter{
3456251881Speter  return svn_wc_get_update_editor3(target_revision, anchor, target,
3457251881Speter                                   use_commit_times,
3458251881Speter                                   SVN_DEPTH_INFINITY_OR_FILES(recurse), FALSE,
3459251881Speter                                   FALSE, notify_func, notify_baton,
3460251881Speter                                   cancel_func, cancel_baton, NULL, NULL,
3461251881Speter                                   NULL, NULL,
3462251881Speter                                   diff3_cmd, NULL, editor, edit_baton,
3463251881Speter                                   traversal_info, pool);
3464251881Speter}
3465251881Speter
3466251881Spetersvn_error_t *
3467251881Spetersvn_wc_get_update_editor(svn_revnum_t *target_revision,
3468251881Speter                         svn_wc_adm_access_t *anchor,
3469251881Speter                         const char *target,
3470251881Speter                         svn_boolean_t use_commit_times,
3471251881Speter                         svn_boolean_t recurse,
3472251881Speter                         svn_wc_notify_func_t notify_func,
3473251881Speter                         void *notify_baton,
3474251881Speter                         svn_cancel_func_t cancel_func,
3475251881Speter                         void *cancel_baton,
3476251881Speter                         const char *diff3_cmd,
3477251881Speter                         const svn_delta_editor_t **editor,
3478251881Speter                         void **edit_baton,
3479251881Speter                         svn_wc_traversal_info_t *traversal_info,
3480251881Speter                         apr_pool_t *pool)
3481251881Speter{
3482251881Speter  /* This baton must live beyond this function. Alloc on heap.  */
3483251881Speter  struct compat_notify_baton_t *nb = apr_palloc(pool, sizeof(*nb));
3484251881Speter
3485251881Speter  nb->func = notify_func;
3486251881Speter  nb->baton = notify_baton;
3487251881Speter
3488251881Speter  return svn_wc_get_update_editor3(target_revision, anchor, target,
3489251881Speter                                   use_commit_times,
3490251881Speter                                   SVN_DEPTH_INFINITY_OR_FILES(recurse), FALSE,
3491251881Speter                                   FALSE, compat_call_notify_func, nb,
3492251881Speter                                   cancel_func, cancel_baton, NULL, NULL,
3493251881Speter                                   NULL, NULL,
3494251881Speter                                   diff3_cmd, NULL, editor, edit_baton,
3495251881Speter                                   traversal_info, pool);
3496251881Speter}
3497251881Speter
3498251881Speter
3499251881Spetersvn_error_t *
3500251881Spetersvn_wc_get_switch_editor4(const svn_delta_editor_t **editor,
3501251881Speter                          void **edit_baton,
3502251881Speter                          svn_revnum_t *target_revision,
3503251881Speter                          svn_wc_context_t *wc_ctx,
3504251881Speter                          const char *anchor_abspath,
3505251881Speter                          const char *target_basename,
3506251881Speter                          const char *switch_url,
3507251881Speter                          svn_boolean_t use_commit_times,
3508251881Speter                          svn_depth_t depth,
3509251881Speter                          svn_boolean_t depth_is_sticky,
3510251881Speter                          svn_boolean_t allow_unver_obstructions,
3511251881Speter                          svn_boolean_t server_performs_filtering,
3512251881Speter                          const char *diff3_cmd,
3513251881Speter                          const apr_array_header_t *preserved_exts,
3514251881Speter                          svn_wc_dirents_func_t fetch_dirents_func,
3515251881Speter                          void *fetch_dirents_baton,
3516251881Speter                          svn_wc_conflict_resolver_func2_t conflict_func,
3517251881Speter                          void *conflict_baton,
3518251881Speter                          svn_wc_external_update_t external_func,
3519251881Speter                          void *external_baton,
3520251881Speter                          svn_cancel_func_t cancel_func,
3521251881Speter                          void *cancel_baton,
3522251881Speter                          svn_wc_notify_func2_t notify_func,
3523251881Speter                          void *notify_baton,
3524251881Speter                          apr_pool_t *result_pool,
3525251881Speter                          apr_pool_t *scratch_pool)
3526251881Speter{
3527251881Speter  return svn_error_trace(
3528251881Speter    svn_wc__get_switch_editor(editor, edit_baton,
3529251881Speter                              target_revision,
3530251881Speter                              wc_ctx,
3531251881Speter                              anchor_abspath, target_basename,
3532251881Speter                              switch_url, NULL,
3533251881Speter                              use_commit_times,
3534251881Speter                              depth, depth_is_sticky,
3535251881Speter                              allow_unver_obstructions,
3536251881Speter                              server_performs_filtering,
3537251881Speter                              diff3_cmd,
3538251881Speter                              preserved_exts,
3539251881Speter                              fetch_dirents_func, fetch_dirents_baton,
3540251881Speter                              conflict_func, conflict_baton,
3541251881Speter                              external_func, external_baton,
3542251881Speter                              cancel_func, cancel_baton,
3543251881Speter                              notify_func, notify_baton,
3544251881Speter                              result_pool, scratch_pool));
3545251881Speter}
3546251881Speter
3547251881Speter
3548251881Spetersvn_error_t *
3549251881Spetersvn_wc_get_switch_editor3(svn_revnum_t *target_revision,
3550251881Speter                          svn_wc_adm_access_t *anchor,
3551251881Speter                          const char *target,
3552251881Speter                          const char *switch_url,
3553251881Speter                          svn_boolean_t use_commit_times,
3554251881Speter                          svn_depth_t depth,
3555251881Speter                          svn_boolean_t depth_is_sticky,
3556251881Speter                          svn_boolean_t allow_unver_obstructions,
3557251881Speter                          svn_wc_notify_func2_t notify_func,
3558251881Speter                          void *notify_baton,
3559251881Speter                          svn_cancel_func_t cancel_func,
3560251881Speter                          void *cancel_baton,
3561251881Speter                          svn_wc_conflict_resolver_func_t conflict_func,
3562251881Speter                          void *conflict_baton,
3563251881Speter                          const char *diff3_cmd,
3564251881Speter                          const apr_array_header_t *preserved_exts,
3565251881Speter                          const svn_delta_editor_t **editor,
3566251881Speter                          void **edit_baton,
3567251881Speter                          svn_wc_traversal_info_t *traversal_info,
3568251881Speter                          apr_pool_t *pool)
3569251881Speter{
3570251881Speter  svn_wc_context_t *wc_ctx;
3571251881Speter  svn_wc__db_t *db = svn_wc__adm_get_db(anchor);
3572251881Speter  svn_wc_external_update_t external_func = NULL;
3573251881Speter  struct traversal_info_update_baton *eb = NULL;
3574251881Speter  struct conflict_func_1to2_baton *cfw = NULL;
3575251881Speter
3576251881Speter  SVN_ERR_ASSERT(switch_url && svn_uri_is_canonical(switch_url, pool));
3577251881Speter
3578251881Speter  SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL, db, pool));
3579251881Speter
3580251881Speter  if (traversal_info)
3581251881Speter    {
3582251881Speter      eb = apr_palloc(pool, sizeof(*eb));
3583251881Speter      eb->db = db;
3584251881Speter      eb->traversal = traversal_info;
3585251881Speter      external_func = traversal_info_update;
3586251881Speter    }
3587251881Speter
3588251881Speter  if (conflict_func)
3589251881Speter    {
3590251881Speter      cfw = apr_pcalloc(pool, sizeof(*cfw));
3591251881Speter      cfw->inner_func = conflict_func;
3592251881Speter      cfw->inner_baton = conflict_baton;
3593251881Speter    }
3594251881Speter
3595251881Speter  if (diff3_cmd)
3596251881Speter    SVN_ERR(svn_path_cstring_to_utf8(&diff3_cmd, diff3_cmd, pool));
3597251881Speter
3598251881Speter  SVN_ERR(svn_wc_get_switch_editor4(editor, edit_baton,
3599251881Speter                                    target_revision,
3600251881Speter                                    wc_ctx,
3601251881Speter                                    svn_wc__adm_access_abspath(anchor),
3602251881Speter                                    target, switch_url,
3603251881Speter                                    use_commit_times,
3604251881Speter                                    depth, depth_is_sticky,
3605251881Speter                                    allow_unver_obstructions,
3606251881Speter                                    FALSE /* server_performs_filtering */,
3607251881Speter                                    diff3_cmd,
3608251881Speter                                    preserved_exts,
3609251881Speter                                    NULL, NULL, /* fetch_dirents_func, baton */
3610251881Speter                                    conflict_func ? conflict_func_1to2_wrapper
3611251881Speter                                                  : NULL,
3612251881Speter                                    cfw,
3613251881Speter                                    external_func, eb,
3614251881Speter                                    cancel_func, cancel_baton,
3615251881Speter                                    notify_func, notify_baton,
3616251881Speter                                    pool, pool));
3617251881Speter
3618251881Speter  /* We can't destroy wc_ctx here, because the editor needs it while it's
3619251881Speter     driven. */
3620251881Speter  return SVN_NO_ERROR;
3621251881Speter}
3622251881Speter
3623251881Spetersvn_error_t *
3624251881Spetersvn_wc_get_switch_editor2(svn_revnum_t *target_revision,
3625251881Speter                          svn_wc_adm_access_t *anchor,
3626251881Speter                          const char *target,
3627251881Speter                          const char *switch_url,
3628251881Speter                          svn_boolean_t use_commit_times,
3629251881Speter                          svn_boolean_t recurse,
3630251881Speter                          svn_wc_notify_func2_t notify_func,
3631251881Speter                          void *notify_baton,
3632251881Speter                          svn_cancel_func_t cancel_func,
3633251881Speter                          void *cancel_baton,
3634251881Speter                          const char *diff3_cmd,
3635251881Speter                          const svn_delta_editor_t **editor,
3636251881Speter                          void **edit_baton,
3637251881Speter                          svn_wc_traversal_info_t *traversal_info,
3638251881Speter                          apr_pool_t *pool)
3639251881Speter{
3640251881Speter  SVN_ERR_ASSERT(switch_url);
3641251881Speter
3642251881Speter  return svn_wc_get_switch_editor3(target_revision, anchor, target,
3643251881Speter                                   switch_url, use_commit_times,
3644251881Speter                                   SVN_DEPTH_INFINITY_OR_FILES(recurse), FALSE,
3645251881Speter                                   FALSE, notify_func, notify_baton,
3646251881Speter                                   cancel_func, cancel_baton,
3647251881Speter                                   NULL, NULL, diff3_cmd,
3648251881Speter                                   NULL, editor, edit_baton, traversal_info,
3649251881Speter                                   pool);
3650251881Speter}
3651251881Speter
3652251881Spetersvn_error_t *
3653251881Spetersvn_wc_get_switch_editor(svn_revnum_t *target_revision,
3654251881Speter                         svn_wc_adm_access_t *anchor,
3655251881Speter                         const char *target,
3656251881Speter                         const char *switch_url,
3657251881Speter                         svn_boolean_t use_commit_times,
3658251881Speter                         svn_boolean_t recurse,
3659251881Speter                         svn_wc_notify_func_t notify_func,
3660251881Speter                         void *notify_baton,
3661251881Speter                         svn_cancel_func_t cancel_func,
3662251881Speter                         void *cancel_baton,
3663251881Speter                         const char *diff3_cmd,
3664251881Speter                         const svn_delta_editor_t **editor,
3665251881Speter                         void **edit_baton,
3666251881Speter                         svn_wc_traversal_info_t *traversal_info,
3667251881Speter                         apr_pool_t *pool)
3668251881Speter{
3669251881Speter  /* This baton must live beyond this function. Alloc on heap.  */
3670251881Speter  struct compat_notify_baton_t *nb = apr_palloc(pool, sizeof(*nb));
3671251881Speter
3672251881Speter  nb->func = notify_func;
3673251881Speter  nb->baton = notify_baton;
3674251881Speter
3675251881Speter  return svn_wc_get_switch_editor3(target_revision, anchor, target,
3676251881Speter                                   switch_url, use_commit_times,
3677251881Speter                                   SVN_DEPTH_INFINITY_OR_FILES(recurse), FALSE,
3678251881Speter                                   FALSE, compat_call_notify_func, nb,
3679251881Speter                                   cancel_func, cancel_baton,
3680251881Speter                                   NULL, NULL, diff3_cmd,
3681251881Speter                                   NULL, editor, edit_baton, traversal_info,
3682251881Speter                                   pool);
3683251881Speter}
3684251881Speter
3685251881Speter
3686251881Spetersvn_error_t *
3687251881Spetersvn_wc_external_item_create(const svn_wc_external_item2_t **item,
3688251881Speter                            apr_pool_t *pool)
3689251881Speter{
3690251881Speter  *item = apr_pcalloc(pool, sizeof(svn_wc_external_item2_t));
3691251881Speter  return SVN_NO_ERROR;
3692251881Speter}
3693251881Speter
3694251881Spetersvn_wc_external_item_t *
3695251881Spetersvn_wc_external_item_dup(const svn_wc_external_item_t *item,
3696251881Speter                         apr_pool_t *pool)
3697251881Speter{
3698251881Speter  svn_wc_external_item_t *new_item = apr_palloc(pool, sizeof(*new_item));
3699251881Speter
3700251881Speter  *new_item = *item;
3701251881Speter
3702251881Speter  if (new_item->target_dir)
3703251881Speter    new_item->target_dir = apr_pstrdup(pool, new_item->target_dir);
3704251881Speter
3705251881Speter  if (new_item->url)
3706251881Speter    new_item->url = apr_pstrdup(pool, new_item->url);
3707251881Speter
3708251881Speter  return new_item;
3709251881Speter}
3710251881Speter
3711251881Speter
3712251881Spetersvn_wc_traversal_info_t *
3713251881Spetersvn_wc_init_traversal_info(apr_pool_t *pool)
3714251881Speter{
3715251881Speter  svn_wc_traversal_info_t *ti = apr_palloc(pool, sizeof(*ti));
3716251881Speter
3717251881Speter  ti->pool           = pool;
3718251881Speter  ti->externals_old  = apr_hash_make(pool);
3719251881Speter  ti->externals_new  = apr_hash_make(pool);
3720251881Speter  ti->depths         = apr_hash_make(pool);
3721251881Speter
3722251881Speter  return ti;
3723251881Speter}
3724251881Speter
3725251881Speter
3726251881Spetervoid
3727251881Spetersvn_wc_edited_externals(apr_hash_t **externals_old,
3728251881Speter                        apr_hash_t **externals_new,
3729251881Speter                        svn_wc_traversal_info_t *traversal_info)
3730251881Speter{
3731251881Speter  *externals_old = traversal_info->externals_old;
3732251881Speter  *externals_new = traversal_info->externals_new;
3733251881Speter}
3734251881Speter
3735251881Speter
3736251881Spetervoid
3737251881Spetersvn_wc_traversed_depths(apr_hash_t **depths,
3738251881Speter                        svn_wc_traversal_info_t *traversal_info)
3739251881Speter{
3740251881Speter  *depths = traversal_info->depths;
3741251881Speter}
3742251881Speter
3743251881Speter
3744251881Speter/*** From lock.c ***/
3745251881Speter
3746251881Speter/* To preserve API compatibility with Subversion 1.0.0 */
3747251881Spetersvn_error_t *
3748251881Spetersvn_wc_adm_open(svn_wc_adm_access_t **adm_access,
3749251881Speter                svn_wc_adm_access_t *associated,
3750251881Speter                const char *path,
3751251881Speter                svn_boolean_t write_lock,
3752251881Speter                svn_boolean_t tree_lock,
3753251881Speter                apr_pool_t *pool)
3754251881Speter{
3755251881Speter  return svn_wc_adm_open3(adm_access, associated, path, write_lock,
3756251881Speter                          (tree_lock ? -1 : 0), NULL, NULL, pool);
3757251881Speter}
3758251881Speter
3759251881Spetersvn_error_t *
3760251881Spetersvn_wc_adm_open2(svn_wc_adm_access_t **adm_access,
3761251881Speter                 svn_wc_adm_access_t *associated,
3762251881Speter                 const char *path,
3763251881Speter                 svn_boolean_t write_lock,
3764251881Speter                 int levels_to_lock,
3765251881Speter                 apr_pool_t *pool)
3766251881Speter{
3767251881Speter  return svn_wc_adm_open3(adm_access, associated, path, write_lock,
3768251881Speter                          levels_to_lock, NULL, NULL, pool);
3769251881Speter}
3770251881Speter
3771251881Spetersvn_error_t *
3772251881Spetersvn_wc_adm_probe_open(svn_wc_adm_access_t **adm_access,
3773251881Speter                      svn_wc_adm_access_t *associated,
3774251881Speter                      const char *path,
3775251881Speter                      svn_boolean_t write_lock,
3776251881Speter                      svn_boolean_t tree_lock,
3777251881Speter                      apr_pool_t *pool)
3778251881Speter{
3779251881Speter  return svn_wc_adm_probe_open3(adm_access, associated, path,
3780251881Speter                                write_lock, (tree_lock ? -1 : 0),
3781251881Speter                                NULL, NULL, pool);
3782251881Speter}
3783251881Speter
3784251881Speter
3785251881Spetersvn_error_t *
3786251881Spetersvn_wc_adm_probe_open2(svn_wc_adm_access_t **adm_access,
3787251881Speter                       svn_wc_adm_access_t *associated,
3788251881Speter                       const char *path,
3789251881Speter                       svn_boolean_t write_lock,
3790251881Speter                       int levels_to_lock,
3791251881Speter                       apr_pool_t *pool)
3792251881Speter{
3793251881Speter  return svn_wc_adm_probe_open3(adm_access, associated, path, write_lock,
3794251881Speter                                levels_to_lock, NULL, NULL, pool);
3795251881Speter}
3796251881Speter
3797251881Spetersvn_error_t *
3798251881Spetersvn_wc_adm_probe_try2(svn_wc_adm_access_t **adm_access,
3799251881Speter                      svn_wc_adm_access_t *associated,
3800251881Speter                      const char *path,
3801251881Speter                      svn_boolean_t write_lock,
3802251881Speter                      int levels_to_lock,
3803251881Speter                      apr_pool_t *pool)
3804251881Speter{
3805251881Speter  return svn_wc_adm_probe_try3(adm_access, associated, path, write_lock,
3806251881Speter                               levels_to_lock, NULL, NULL, pool);
3807251881Speter}
3808251881Speter
3809251881Spetersvn_error_t *
3810251881Spetersvn_wc_adm_probe_try(svn_wc_adm_access_t **adm_access,
3811251881Speter                     svn_wc_adm_access_t *associated,
3812251881Speter                     const char *path,
3813251881Speter                     svn_boolean_t write_lock,
3814251881Speter                     svn_boolean_t tree_lock,
3815251881Speter                     apr_pool_t *pool)
3816251881Speter{
3817251881Speter  return svn_wc_adm_probe_try3(adm_access, associated, path, write_lock,
3818251881Speter                               (tree_lock ? -1 : 0), NULL, NULL, pool);
3819251881Speter}
3820251881Speter
3821251881Spetersvn_error_t *
3822251881Spetersvn_wc_adm_close(svn_wc_adm_access_t *adm_access)
3823251881Speter{
3824251881Speter  /* This is the only pool we have access to. */
3825251881Speter  apr_pool_t *scratch_pool = svn_wc_adm_access_pool(adm_access);
3826251881Speter
3827251881Speter  return svn_wc_adm_close2(adm_access, scratch_pool);
3828251881Speter}
3829251881Speter
3830251881Spetersvn_error_t *
3831251881Spetersvn_wc_locked(svn_boolean_t *locked,
3832251881Speter              const char *path,
3833251881Speter              apr_pool_t *pool)
3834251881Speter{
3835251881Speter  svn_wc_context_t *wc_ctx;
3836251881Speter  const char *local_abspath;
3837251881Speter
3838251881Speter  SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
3839251881Speter  SVN_ERR(svn_wc_context_create(&wc_ctx, NULL, pool, pool));
3840251881Speter
3841251881Speter  SVN_ERR(svn_wc_locked2(NULL, locked, wc_ctx, local_abspath, pool));
3842251881Speter
3843251881Speter  return svn_error_trace(svn_wc_context_destroy(wc_ctx));
3844251881Speter}
3845251881Speter
3846251881Spetersvn_error_t *
3847251881Spetersvn_wc_check_wc(const char *path,
3848251881Speter                int *wc_format,
3849251881Speter                apr_pool_t *pool)
3850251881Speter{
3851251881Speter  svn_wc_context_t *wc_ctx;
3852251881Speter  const char *local_abspath;
3853251881Speter
3854251881Speter  SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
3855251881Speter  SVN_ERR(svn_wc_context_create(&wc_ctx, NULL, pool, pool));
3856251881Speter
3857251881Speter  SVN_ERR(svn_wc_check_wc2(wc_format, wc_ctx, local_abspath, pool));
3858251881Speter
3859251881Speter  return svn_error_trace(svn_wc_context_destroy(wc_ctx));
3860251881Speter}
3861251881Speter
3862251881Speter
3863251881Speter/*** From translate.c ***/
3864251881Speter
3865251881Spetersvn_error_t *
3866251881Spetersvn_wc_translated_file(const char **xlated_p,
3867251881Speter                       const char *vfile,
3868251881Speter                       svn_wc_adm_access_t *adm_access,
3869251881Speter                       svn_boolean_t force_repair,
3870251881Speter                       apr_pool_t *pool)
3871251881Speter{
3872251881Speter  return svn_wc_translated_file2(xlated_p, vfile, vfile, adm_access,
3873251881Speter                                 SVN_WC_TRANSLATE_TO_NF
3874251881Speter                                 | (force_repair ?
3875251881Speter                                    SVN_WC_TRANSLATE_FORCE_EOL_REPAIR : 0),
3876251881Speter                                 pool);
3877251881Speter}
3878251881Speter
3879251881Spetersvn_error_t *
3880251881Spetersvn_wc_translated_stream(svn_stream_t **stream,
3881251881Speter                         const char *path,
3882251881Speter                         const char *versioned_file,
3883251881Speter                         svn_wc_adm_access_t *adm_access,
3884251881Speter                         apr_uint32_t flags,
3885251881Speter                         apr_pool_t *pool)
3886251881Speter{
3887251881Speter  const char *local_abspath;
3888251881Speter  const char *versioned_abspath;
3889251881Speter
3890251881Speter  SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
3891251881Speter  SVN_ERR(svn_dirent_get_absolute(&versioned_abspath, versioned_file, pool));
3892251881Speter
3893251881Speter  return svn_error_trace(
3894251881Speter    svn_wc__internal_translated_stream(stream, svn_wc__adm_get_db(adm_access),
3895251881Speter                                       local_abspath, versioned_abspath, flags,
3896251881Speter                                       pool, pool));
3897251881Speter}
3898251881Speter
3899251881Spetersvn_error_t *
3900251881Spetersvn_wc_translated_file2(const char **xlated_path,
3901251881Speter                        const char *src,
3902251881Speter                        const char *versioned_file,
3903251881Speter                        svn_wc_adm_access_t *adm_access,
3904251881Speter                        apr_uint32_t flags,
3905251881Speter                        apr_pool_t *pool)
3906251881Speter{
3907251881Speter  const char *versioned_abspath;
3908251881Speter  const char *root;
3909251881Speter  const char *tmp_root;
3910251881Speter  const char *src_abspath;
3911251881Speter
3912251881Speter  SVN_ERR(svn_dirent_get_absolute(&versioned_abspath, versioned_file, pool));
3913251881Speter  SVN_ERR(svn_dirent_get_absolute(&src_abspath, src, pool));
3914251881Speter
3915251881Speter  SVN_ERR(svn_wc__internal_translated_file(xlated_path, src_abspath,
3916251881Speter                                           svn_wc__adm_get_db(adm_access),
3917251881Speter                                           versioned_abspath,
3918251881Speter                                           flags, NULL, NULL, pool, pool));
3919251881Speter
3920251881Speter  if (strcmp(*xlated_path, src_abspath) == 0)
3921251881Speter    *xlated_path = src;
3922251881Speter  else if (! svn_dirent_is_absolute(versioned_file))
3923251881Speter    {
3924251881Speter      SVN_ERR(svn_io_temp_dir(&tmp_root, pool));
3925251881Speter      if (! svn_dirent_is_child(tmp_root, *xlated_path, pool))
3926251881Speter        {
3927251881Speter          SVN_ERR(svn_dirent_get_absolute(&root, "", pool));
3928251881Speter
3929251881Speter          if (svn_dirent_is_child(root, *xlated_path, pool))
3930251881Speter            *xlated_path = svn_dirent_is_child(root, *xlated_path, pool);
3931251881Speter        }
3932251881Speter    }
3933251881Speter
3934251881Speter  return SVN_NO_ERROR;
3935251881Speter}
3936251881Speter
3937251881Speter/*** From relocate.c ***/
3938251881Spetersvn_error_t *
3939251881Spetersvn_wc_relocate3(const char *path,
3940251881Speter                 svn_wc_adm_access_t *adm_access,
3941251881Speter                 const char *from,
3942251881Speter                 const char *to,
3943251881Speter                 svn_boolean_t recurse,
3944251881Speter                 svn_wc_relocation_validator3_t validator,
3945251881Speter                 void *validator_baton,
3946251881Speter                 apr_pool_t *pool)
3947251881Speter{
3948251881Speter  const char *local_abspath;
3949251881Speter  svn_wc_context_t *wc_ctx;
3950251881Speter
3951251881Speter  if (! recurse)
3952251881Speter    SVN_ERR(svn_error_create(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
3953251881Speter                             _("Non-recursive relocation not supported")));
3954251881Speter
3955251881Speter  SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
3956251881Speter  SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL /* config */,
3957251881Speter                                         svn_wc__adm_get_db(adm_access),
3958251881Speter                                         pool));
3959251881Speter
3960251881Speter  SVN_ERR(svn_wc_relocate4(wc_ctx, local_abspath, from, to,
3961251881Speter                           validator, validator_baton, pool));
3962251881Speter
3963251881Speter  return svn_error_trace(svn_wc_context_destroy(wc_ctx));
3964251881Speter}
3965251881Speter
3966251881Speter/* Compatibility baton and wrapper. */
3967251881Speterstruct compat2_baton {
3968251881Speter  svn_wc_relocation_validator2_t validator;
3969251881Speter  void *baton;
3970251881Speter};
3971251881Speter
3972251881Speter/* Compatibility baton and wrapper. */
3973251881Speterstruct compat_baton {
3974251881Speter  svn_wc_relocation_validator_t validator;
3975251881Speter  void *baton;
3976251881Speter};
3977251881Speter
3978251881Speter/* This implements svn_wc_relocate_validator3_t. */
3979251881Speterstatic svn_error_t *
3980251881Spetercompat2_validator(void *baton,
3981251881Speter                  const char *uuid,
3982251881Speter                  const char *url,
3983251881Speter                  const char *root_url,
3984251881Speter                  apr_pool_t *pool)
3985251881Speter{
3986251881Speter  struct compat2_baton *cb = baton;
3987251881Speter  /* The old callback type doesn't set root_url. */
3988251881Speter  return cb->validator(cb->baton, uuid,
3989251881Speter                       (root_url ? root_url : url), (root_url != NULL),
3990251881Speter                       pool);
3991251881Speter}
3992251881Speter
3993251881Speter/* This implements svn_wc_relocate_validator3_t. */
3994251881Speterstatic svn_error_t *
3995251881Spetercompat_validator(void *baton,
3996251881Speter                 const char *uuid,
3997251881Speter                 const char *url,
3998251881Speter                 const char *root_url,
3999251881Speter                 apr_pool_t *pool)
4000251881Speter{
4001251881Speter  struct compat_baton *cb = baton;
4002251881Speter  /* The old callback type doesn't allow uuid to be NULL. */
4003251881Speter  if (uuid)
4004251881Speter    return cb->validator(cb->baton, uuid, url);
4005251881Speter  return SVN_NO_ERROR;
4006251881Speter}
4007251881Speter
4008251881Spetersvn_error_t *
4009251881Spetersvn_wc_relocate2(const char *path,
4010251881Speter                 svn_wc_adm_access_t *adm_access,
4011251881Speter                 const char *from,
4012251881Speter                 const char *to,
4013251881Speter                 svn_boolean_t recurse,
4014251881Speter                 svn_wc_relocation_validator2_t validator,
4015251881Speter                 void *validator_baton,
4016251881Speter                 apr_pool_t *pool)
4017251881Speter{
4018251881Speter  struct compat2_baton cb;
4019251881Speter
4020251881Speter  cb.validator = validator;
4021251881Speter  cb.baton = validator_baton;
4022251881Speter
4023251881Speter  return svn_wc_relocate3(path, adm_access, from, to, recurse,
4024251881Speter                          compat2_validator, &cb, pool);
4025251881Speter}
4026251881Speter
4027251881Spetersvn_error_t *
4028251881Spetersvn_wc_relocate(const char *path,
4029251881Speter                svn_wc_adm_access_t *adm_access,
4030251881Speter                const char *from,
4031251881Speter                const char *to,
4032251881Speter                svn_boolean_t recurse,
4033251881Speter                svn_wc_relocation_validator_t validator,
4034251881Speter                void *validator_baton,
4035251881Speter                apr_pool_t *pool)
4036251881Speter{
4037251881Speter  struct compat_baton cb;
4038251881Speter
4039251881Speter  cb.validator = validator;
4040251881Speter  cb.baton = validator_baton;
4041251881Speter
4042251881Speter  return svn_wc_relocate3(path, adm_access, from, to, recurse,
4043251881Speter                          compat_validator, &cb, pool);
4044251881Speter}
4045251881Speter
4046251881Speter
4047251881Speter/*** From log.c ***/
4048251881Speter
4049251881Spetersvn_error_t *
4050251881Spetersvn_wc_cleanup2(const char *path,
4051251881Speter                const char *diff3_cmd,
4052251881Speter                svn_cancel_func_t cancel_func,
4053251881Speter                void *cancel_baton,
4054251881Speter                apr_pool_t *pool)
4055251881Speter{
4056251881Speter  svn_wc_context_t *wc_ctx;
4057251881Speter  const char *local_abspath;
4058251881Speter
4059251881Speter  SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
4060251881Speter  SVN_ERR(svn_wc_context_create(&wc_ctx, NULL, pool, pool));
4061251881Speter
4062251881Speter  SVN_ERR(svn_wc_cleanup3(wc_ctx, local_abspath, cancel_func,
4063251881Speter                          cancel_baton, pool));
4064251881Speter
4065251881Speter  return svn_error_trace(svn_wc_context_destroy(wc_ctx));
4066251881Speter}
4067251881Speter
4068251881Spetersvn_error_t *
4069251881Spetersvn_wc_cleanup(const char *path,
4070251881Speter               svn_wc_adm_access_t *optional_adm_access,
4071251881Speter               const char *diff3_cmd,
4072251881Speter               svn_cancel_func_t cancel_func,
4073251881Speter               void *cancel_baton,
4074251881Speter               apr_pool_t *pool)
4075251881Speter{
4076251881Speter  return svn_wc_cleanup2(path, diff3_cmd, cancel_func, cancel_baton, pool);
4077251881Speter}
4078251881Speter
4079251881Speter/*** From questions.c ***/
4080251881Speter
4081251881Spetersvn_error_t *
4082251881Spetersvn_wc_has_binary_prop(svn_boolean_t *has_binary_prop,
4083251881Speter                       const char *path,
4084251881Speter                       svn_wc_adm_access_t *adm_access,
4085251881Speter                       apr_pool_t *pool)
4086251881Speter{
4087251881Speter  svn_wc__db_t *db = svn_wc__adm_get_db(adm_access);
4088251881Speter  const char *local_abspath;
4089251881Speter  const svn_string_t *value;
4090251881Speter
4091251881Speter  SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
4092251881Speter
4093251881Speter  SVN_ERR(svn_wc__internal_propget(&value, db, local_abspath,
4094251881Speter                                   SVN_PROP_MIME_TYPE,
4095251881Speter                                   pool, pool));
4096251881Speter
4097251881Speter  if (value && (svn_mime_type_is_binary(value->data)))
4098251881Speter    *has_binary_prop = TRUE;
4099251881Speter  else
4100251881Speter    *has_binary_prop = FALSE;
4101251881Speter
4102251881Speter  return SVN_NO_ERROR;
4103251881Speter}
4104251881Speter
4105251881Spetersvn_error_t *
4106251881Spetersvn_wc_conflicted_p2(svn_boolean_t *text_conflicted_p,
4107251881Speter                     svn_boolean_t *prop_conflicted_p,
4108251881Speter                     svn_boolean_t *tree_conflicted_p,
4109251881Speter                     const char *path,
4110251881Speter                     svn_wc_adm_access_t *adm_access,
4111251881Speter                     apr_pool_t *pool)
4112251881Speter{
4113251881Speter  const char *local_abspath;
4114251881Speter  svn_wc_context_t *wc_ctx;
4115251881Speter  svn_error_t *err;
4116251881Speter
4117251881Speter  SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
4118251881Speter  SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL /* config */,
4119251881Speter                                         svn_wc__adm_get_db(adm_access),
4120251881Speter                                         pool));
4121251881Speter
4122251881Speter  err = svn_wc_conflicted_p3(text_conflicted_p, prop_conflicted_p,
4123251881Speter                             tree_conflicted_p, wc_ctx, local_abspath, pool);
4124251881Speter
4125251881Speter  if (err && err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND)
4126251881Speter    {
4127251881Speter      svn_error_clear(err);
4128251881Speter
4129251881Speter      if (text_conflicted_p)
4130251881Speter        *text_conflicted_p = FALSE;
4131251881Speter      if (prop_conflicted_p)
4132251881Speter        *prop_conflicted_p = FALSE;
4133251881Speter      if (tree_conflicted_p)
4134251881Speter        *tree_conflicted_p = FALSE;
4135251881Speter    }
4136251881Speter  else if (err)
4137251881Speter    return err;
4138251881Speter
4139251881Speter  return SVN_NO_ERROR;
4140251881Speter}
4141251881Speter
4142251881Spetersvn_error_t *
4143251881Spetersvn_wc_conflicted_p(svn_boolean_t *text_conflicted_p,
4144251881Speter                    svn_boolean_t *prop_conflicted_p,
4145251881Speter                    const char *dir_path,
4146251881Speter                    const svn_wc_entry_t *entry,
4147251881Speter                    apr_pool_t *pool)
4148251881Speter{
4149251881Speter  svn_node_kind_t kind;
4150251881Speter  const char *path;
4151251881Speter
4152251881Speter  *text_conflicted_p = FALSE;
4153251881Speter  *prop_conflicted_p = FALSE;
4154251881Speter
4155251881Speter  if (entry->conflict_old)
4156251881Speter    {
4157251881Speter      path = svn_dirent_join(dir_path, entry->conflict_old, pool);
4158251881Speter      SVN_ERR(svn_io_check_path(path, &kind, pool));
4159251881Speter      *text_conflicted_p = (kind == svn_node_file);
4160251881Speter    }
4161251881Speter
4162251881Speter  if ((! *text_conflicted_p) && (entry->conflict_new))
4163251881Speter    {
4164251881Speter      path = svn_dirent_join(dir_path, entry->conflict_new, pool);
4165251881Speter      SVN_ERR(svn_io_check_path(path, &kind, pool));
4166251881Speter      *text_conflicted_p = (kind == svn_node_file);
4167251881Speter    }
4168251881Speter
4169251881Speter  if ((! *text_conflicted_p) && (entry->conflict_wrk))
4170251881Speter    {
4171251881Speter      path = svn_dirent_join(dir_path, entry->conflict_wrk, pool);
4172251881Speter      SVN_ERR(svn_io_check_path(path, &kind, pool));
4173251881Speter      *text_conflicted_p = (kind == svn_node_file);
4174251881Speter    }
4175251881Speter
4176251881Speter  if (entry->prejfile)
4177251881Speter    {
4178251881Speter      path = svn_dirent_join(dir_path, entry->prejfile, pool);
4179251881Speter      SVN_ERR(svn_io_check_path(path, &kind, pool));
4180251881Speter      *prop_conflicted_p = (kind == svn_node_file);
4181251881Speter    }
4182251881Speter
4183251881Speter  return SVN_NO_ERROR;
4184251881Speter}
4185251881Speter
4186251881Spetersvn_error_t *
4187251881Spetersvn_wc_text_modified_p(svn_boolean_t *modified_p,
4188251881Speter                       const char *filename,
4189251881Speter                       svn_boolean_t force_comparison,
4190251881Speter                       svn_wc_adm_access_t *adm_access,
4191251881Speter                       apr_pool_t *pool)
4192251881Speter{
4193251881Speter  svn_wc_context_t *wc_ctx;
4194251881Speter  svn_wc__db_t *db = svn_wc__adm_get_db(adm_access);
4195251881Speter  const char *local_abspath;
4196251881Speter
4197251881Speter  SVN_ERR(svn_dirent_get_absolute(&local_abspath, filename, pool));
4198251881Speter  SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL, db, pool));
4199251881Speter
4200251881Speter  SVN_ERR(svn_wc_text_modified_p2(modified_p, wc_ctx, local_abspath,
4201251881Speter                                  force_comparison, pool));
4202251881Speter
4203251881Speter  return svn_error_trace(svn_wc_context_destroy(wc_ctx));
4204251881Speter}
4205251881Speter
4206251881Speter
4207251881Speter/*** From copy.c ***/
4208251881Spetersvn_error_t *
4209251881Spetersvn_wc_copy2(const char *src,
4210251881Speter             svn_wc_adm_access_t *dst_parent,
4211251881Speter             const char *dst_basename,
4212251881Speter             svn_cancel_func_t cancel_func,
4213251881Speter             void *cancel_baton,
4214251881Speter             svn_wc_notify_func2_t notify_func,
4215251881Speter             void *notify_baton,
4216251881Speter             apr_pool_t *pool)
4217251881Speter{
4218251881Speter  svn_wc_context_t *wc_ctx;
4219251881Speter  svn_wc__db_t *wc_db = svn_wc__adm_get_db(dst_parent);
4220251881Speter  const char *src_abspath;
4221251881Speter  const char *dst_abspath;
4222251881Speter
4223251881Speter  SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL, wc_db, pool));
4224251881Speter  SVN_ERR(svn_dirent_get_absolute(&src_abspath, src, pool));
4225251881Speter
4226251881Speter  dst_abspath = svn_dirent_join(svn_wc__adm_access_abspath(dst_parent),
4227251881Speter                                dst_basename, pool);
4228251881Speter
4229251881Speter  SVN_ERR(svn_wc_copy3(wc_ctx,
4230251881Speter                       src_abspath,
4231251881Speter                       dst_abspath,
4232251881Speter                       FALSE /* metadata_only */,
4233251881Speter                       cancel_func, cancel_baton,
4234251881Speter                       notify_func, notify_baton,
4235251881Speter                       pool));
4236251881Speter
4237251881Speter  return svn_error_trace(svn_wc_context_destroy(wc_ctx));
4238251881Speter}
4239251881Speter
4240251881Spetersvn_error_t *
4241251881Spetersvn_wc_copy(const char *src_path,
4242251881Speter            svn_wc_adm_access_t *dst_parent,
4243251881Speter            const char *dst_basename,
4244251881Speter            svn_cancel_func_t cancel_func,
4245251881Speter            void *cancel_baton,
4246251881Speter            svn_wc_notify_func_t notify_func,
4247251881Speter            void *notify_baton,
4248251881Speter            apr_pool_t *pool)
4249251881Speter{
4250251881Speter  struct compat_notify_baton_t nb;
4251251881Speter
4252251881Speter  nb.func = notify_func;
4253251881Speter  nb.baton = notify_baton;
4254251881Speter
4255251881Speter  return svn_wc_copy2(src_path, dst_parent, dst_basename, cancel_func,
4256251881Speter                      cancel_baton, compat_call_notify_func,
4257251881Speter                      &nb, pool);
4258251881Speter}
4259251881Speter
4260251881Speter
4261251881Speter/*** From merge.c ***/
4262251881Speter
4263251881Spetersvn_error_t *
4264251881Spetersvn_wc_merge4(enum svn_wc_merge_outcome_t *merge_outcome,
4265251881Speter              svn_wc_context_t *wc_ctx,
4266251881Speter              const char *left_abspath,
4267251881Speter              const char *right_abspath,
4268251881Speter              const char *target_abspath,
4269251881Speter              const char *left_label,
4270251881Speter              const char *right_label,
4271251881Speter              const char *target_label,
4272251881Speter              const svn_wc_conflict_version_t *left_version,
4273251881Speter              const svn_wc_conflict_version_t *right_version,
4274251881Speter              svn_boolean_t dry_run,
4275251881Speter              const char *diff3_cmd,
4276251881Speter              const apr_array_header_t *merge_options,
4277251881Speter              const apr_array_header_t *prop_diff,
4278251881Speter              svn_wc_conflict_resolver_func2_t conflict_func,
4279251881Speter              void *conflict_baton,
4280251881Speter              svn_cancel_func_t cancel_func,
4281251881Speter              void *cancel_baton,
4282251881Speter              apr_pool_t *scratch_pool)
4283251881Speter{
4284251881Speter  return svn_error_trace(
4285251881Speter            svn_wc_merge5(merge_outcome,
4286251881Speter                          NULL /* merge_props_outcome */,
4287251881Speter                          wc_ctx,
4288251881Speter                          left_abspath,
4289251881Speter                          right_abspath,
4290251881Speter                          target_abspath,
4291251881Speter                          left_label,
4292251881Speter                          right_label,
4293251881Speter                          target_label,
4294251881Speter                          left_version,
4295251881Speter                          right_version,
4296251881Speter                          dry_run,
4297251881Speter                          diff3_cmd,
4298251881Speter                          merge_options,
4299251881Speter                          NULL /* original_props */,
4300251881Speter                          prop_diff,
4301251881Speter                          conflict_func, conflict_baton,
4302251881Speter                          cancel_func, cancel_baton,
4303251881Speter                          scratch_pool));
4304251881Speter}
4305251881Speter
4306251881Spetersvn_error_t *
4307251881Spetersvn_wc_merge3(enum svn_wc_merge_outcome_t *merge_outcome,
4308251881Speter              const char *left,
4309251881Speter              const char *right,
4310251881Speter              const char *merge_target,
4311251881Speter              svn_wc_adm_access_t *adm_access,
4312251881Speter              const char *left_label,
4313251881Speter              const char *right_label,
4314251881Speter              const char *target_label,
4315251881Speter              svn_boolean_t dry_run,
4316251881Speter              const char *diff3_cmd,
4317251881Speter              const apr_array_header_t *merge_options,
4318251881Speter              const apr_array_header_t *prop_diff,
4319251881Speter              svn_wc_conflict_resolver_func_t conflict_func,
4320251881Speter              void *conflict_baton,
4321251881Speter              apr_pool_t *pool)
4322251881Speter{
4323251881Speter  svn_wc_context_t *wc_ctx;
4324251881Speter  svn_wc__db_t *db = svn_wc__adm_get_db(adm_access);
4325251881Speter  const char *left_abspath, *right_abspath, *target_abspath;
4326251881Speter  struct conflict_func_1to2_baton cfw;
4327251881Speter
4328251881Speter  SVN_ERR(svn_dirent_get_absolute(&left_abspath, left, pool));
4329251881Speter  SVN_ERR(svn_dirent_get_absolute(&right_abspath, right, pool));
4330251881Speter  SVN_ERR(svn_dirent_get_absolute(&target_abspath, merge_target, pool));
4331251881Speter
4332251881Speter  SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL /* config */, db, pool));
4333251881Speter
4334251881Speter  cfw.inner_func = conflict_func;
4335251881Speter  cfw.inner_baton = conflict_baton;
4336251881Speter
4337251881Speter  if (diff3_cmd)
4338251881Speter    SVN_ERR(svn_path_cstring_to_utf8(&diff3_cmd, diff3_cmd, pool));
4339251881Speter
4340251881Speter  SVN_ERR(svn_wc_merge4(merge_outcome,
4341251881Speter                        wc_ctx,
4342251881Speter                        left_abspath,
4343251881Speter                        right_abspath,
4344251881Speter                        target_abspath,
4345251881Speter                        left_label,
4346251881Speter                        right_label,
4347251881Speter                        target_label,
4348251881Speter                        NULL,
4349251881Speter                        NULL,
4350251881Speter                        dry_run,
4351251881Speter                        diff3_cmd,
4352251881Speter                        merge_options,
4353251881Speter                        prop_diff,
4354251881Speter                        conflict_func ? conflict_func_1to2_wrapper : NULL,
4355251881Speter                        &cfw,
4356251881Speter                        NULL, NULL,
4357251881Speter                        pool));
4358251881Speter
4359251881Speter  return svn_error_trace(svn_wc_context_destroy(wc_ctx));
4360251881Speter}
4361251881Speter
4362251881Spetersvn_error_t *
4363251881Spetersvn_wc_merge2(enum svn_wc_merge_outcome_t *merge_outcome,
4364251881Speter              const char *left,
4365251881Speter              const char *right,
4366251881Speter              const char *merge_target,
4367251881Speter              svn_wc_adm_access_t *adm_access,
4368251881Speter              const char *left_label,
4369251881Speter              const char *right_label,
4370251881Speter              const char *target_label,
4371251881Speter              svn_boolean_t dry_run,
4372251881Speter              const char *diff3_cmd,
4373251881Speter              const apr_array_header_t *merge_options,
4374251881Speter              apr_pool_t *pool)
4375251881Speter{
4376251881Speter  return svn_wc_merge3(merge_outcome,
4377251881Speter                       left, right, merge_target, adm_access,
4378251881Speter                       left_label, right_label, target_label,
4379251881Speter                       dry_run, diff3_cmd, merge_options, NULL,
4380251881Speter                       NULL, NULL, pool);
4381251881Speter}
4382251881Speter
4383251881Spetersvn_error_t *
4384251881Spetersvn_wc_merge(const char *left,
4385251881Speter             const char *right,
4386251881Speter             const char *merge_target,
4387251881Speter             svn_wc_adm_access_t *adm_access,
4388251881Speter             const char *left_label,
4389251881Speter             const char *right_label,
4390251881Speter             const char *target_label,
4391251881Speter             svn_boolean_t dry_run,
4392251881Speter             enum svn_wc_merge_outcome_t *merge_outcome,
4393251881Speter             const char *diff3_cmd,
4394251881Speter             apr_pool_t *pool)
4395251881Speter{
4396251881Speter  return svn_wc_merge3(merge_outcome,
4397251881Speter                       left, right, merge_target, adm_access,
4398251881Speter                       left_label, right_label, target_label,
4399251881Speter                       dry_run, diff3_cmd, NULL, NULL, NULL,
4400251881Speter                       NULL, pool);
4401251881Speter}
4402251881Speter
4403251881Speter
4404251881Speter/*** From util.c ***/
4405251881Speter
4406251881Spetersvn_wc_conflict_version_t *
4407251881Spetersvn_wc_conflict_version_create(const char *repos_url,
4408251881Speter                               const char *path_in_repos,
4409251881Speter                               svn_revnum_t peg_rev,
4410251881Speter                               svn_node_kind_t node_kind,
4411251881Speter                               apr_pool_t *pool)
4412251881Speter{
4413251881Speter  return svn_wc_conflict_version_create2(repos_url, NULL, path_in_repos,
4414251881Speter                                         peg_rev, node_kind, pool);
4415251881Speter}
4416251881Speter
4417251881Spetersvn_wc_conflict_description_t *
4418251881Spetersvn_wc_conflict_description_create_text(const char *path,
4419251881Speter                                        svn_wc_adm_access_t *adm_access,
4420251881Speter                                        apr_pool_t *pool)
4421251881Speter{
4422251881Speter  svn_wc_conflict_description_t *conflict;
4423251881Speter
4424251881Speter  conflict = apr_pcalloc(pool, sizeof(*conflict));
4425251881Speter  conflict->path = path;
4426251881Speter  conflict->node_kind = svn_node_file;
4427251881Speter  conflict->kind = svn_wc_conflict_kind_text;
4428251881Speter  conflict->access = adm_access;
4429251881Speter  conflict->action = svn_wc_conflict_action_edit;
4430251881Speter  conflict->reason = svn_wc_conflict_reason_edited;
4431251881Speter  return conflict;
4432251881Speter}
4433251881Speter
4434251881Spetersvn_wc_conflict_description_t *
4435251881Spetersvn_wc_conflict_description_create_prop(const char *path,
4436251881Speter                                        svn_wc_adm_access_t *adm_access,
4437251881Speter                                        svn_node_kind_t node_kind,
4438251881Speter                                        const char *property_name,
4439251881Speter                                        apr_pool_t *pool)
4440251881Speter{
4441251881Speter  svn_wc_conflict_description_t *conflict;
4442251881Speter
4443251881Speter  conflict = apr_pcalloc(pool, sizeof(*conflict));
4444251881Speter  conflict->path = path;
4445251881Speter  conflict->node_kind = node_kind;
4446251881Speter  conflict->kind = svn_wc_conflict_kind_property;
4447251881Speter  conflict->access = adm_access;
4448251881Speter  conflict->property_name = property_name;
4449251881Speter  return conflict;
4450251881Speter}
4451251881Speter
4452251881Spetersvn_wc_conflict_description_t *
4453251881Spetersvn_wc_conflict_description_create_tree(
4454251881Speter                            const char *path,
4455251881Speter                            svn_wc_adm_access_t *adm_access,
4456251881Speter                            svn_node_kind_t node_kind,
4457251881Speter                            svn_wc_operation_t operation,
4458251881Speter                            svn_wc_conflict_version_t *src_left_version,
4459251881Speter                            svn_wc_conflict_version_t *src_right_version,
4460251881Speter                            apr_pool_t *pool)
4461251881Speter{
4462251881Speter  svn_wc_conflict_description_t *conflict;
4463251881Speter
4464251881Speter  conflict = apr_pcalloc(pool, sizeof(*conflict));
4465251881Speter  conflict->path = path;
4466251881Speter  conflict->node_kind = node_kind;
4467251881Speter  conflict->kind = svn_wc_conflict_kind_tree;
4468251881Speter  conflict->access = adm_access;
4469251881Speter  conflict->operation = operation;
4470251881Speter  conflict->src_left_version = src_left_version;
4471251881Speter  conflict->src_right_version = src_right_version;
4472251881Speter  return conflict;
4473251881Speter}
4474251881Speter
4475251881Speter
4476251881Speter/*** From revision_status.c ***/
4477251881Speter
4478251881Spetersvn_error_t *
4479251881Spetersvn_wc_revision_status(svn_wc_revision_status_t **result_p,
4480251881Speter                       const char *wc_path,
4481251881Speter                       const char *trail_url,
4482251881Speter                       svn_boolean_t committed,
4483251881Speter                       svn_cancel_func_t cancel_func,
4484251881Speter                       void *cancel_baton,
4485251881Speter                       apr_pool_t *pool)
4486251881Speter{
4487251881Speter  svn_wc_context_t *wc_ctx;
4488251881Speter  const char *local_abspath;
4489251881Speter
4490251881Speter  SVN_ERR(svn_dirent_get_absolute(&local_abspath, wc_path, pool));
4491251881Speter  SVN_ERR(svn_wc_context_create(&wc_ctx, NULL /* config */, pool, pool));
4492251881Speter
4493251881Speter  SVN_ERR(svn_wc_revision_status2(result_p, wc_ctx, local_abspath, trail_url,
4494251881Speter                                  committed, cancel_func, cancel_baton, pool,
4495251881Speter                                  pool));
4496251881Speter
4497251881Speter  return svn_error_trace(svn_wc_context_destroy(wc_ctx));
4498251881Speter}
4499251881Speter
4500251881Speter/*** From crop.c ***/
4501251881Spetersvn_error_t *
4502251881Spetersvn_wc_crop_tree(svn_wc_adm_access_t *anchor,
4503251881Speter                 const char *target,
4504251881Speter                 svn_depth_t depth,
4505251881Speter                 svn_wc_notify_func2_t notify_func,
4506251881Speter                 void *notify_baton,
4507251881Speter                 svn_cancel_func_t cancel_func,
4508251881Speter                 void *cancel_baton,
4509251881Speter                 apr_pool_t *pool)
4510251881Speter{
4511251881Speter  svn_wc_context_t *wc_ctx;
4512251881Speter  svn_wc__db_t *db = svn_wc__adm_get_db(anchor);
4513251881Speter  const char *local_abspath;
4514251881Speter
4515251881Speter  local_abspath = svn_dirent_join(svn_wc__adm_access_abspath(anchor),
4516251881Speter                                  target, pool);
4517251881Speter
4518251881Speter  SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL, db, pool));
4519251881Speter
4520251881Speter  if (depth == svn_depth_exclude)
4521251881Speter    {
4522251881Speter      SVN_ERR(svn_wc_exclude(wc_ctx,
4523251881Speter                             local_abspath,
4524251881Speter                             cancel_func, cancel_baton,
4525251881Speter                             notify_func, notify_baton,
4526251881Speter                             pool));
4527251881Speter    }
4528251881Speter  else
4529251881Speter    {
4530251881Speter      SVN_ERR(svn_wc_crop_tree2(wc_ctx,
4531251881Speter                                local_abspath,
4532251881Speter                                depth,
4533251881Speter                                cancel_func, cancel_baton,
4534251881Speter                                notify_func, notify_baton,
4535251881Speter                                pool));
4536251881Speter    }
4537251881Speter
4538251881Speter  return svn_error_trace(svn_wc_context_destroy(wc_ctx));
4539251881Speter}
4540251881Speter
4541251881Spetersvn_error_t *
4542251881Spetersvn_wc_move(svn_wc_context_t *wc_ctx,
4543251881Speter            const char *src_abspath,
4544251881Speter            const char *dst_abspath,
4545251881Speter            svn_boolean_t metadata_only,
4546251881Speter            svn_cancel_func_t cancel_func,
4547251881Speter            void *cancel_baton,
4548251881Speter            svn_wc_notify_func2_t notify_func,
4549251881Speter            void *notify_baton,
4550251881Speter            apr_pool_t *scratch_pool)
4551251881Speter{
4552251881Speter  return svn_error_trace(svn_wc__move2(wc_ctx, src_abspath, dst_abspath,
4553251881Speter                                       metadata_only,
4554251881Speter                                       TRUE, /* allow_mixed_revisions */
4555251881Speter                                       cancel_func, cancel_baton,
4556251881Speter                                       notify_func, notify_baton,
4557251881Speter                                       scratch_pool));
4558251881Speter}
4559251881Speter
4560251881Spetersvn_error_t *
4561251881Spetersvn_wc_read_kind(svn_node_kind_t *kind,
4562251881Speter                 svn_wc_context_t *wc_ctx,
4563251881Speter                 const char *abspath,
4564251881Speter                 svn_boolean_t show_hidden,
4565251881Speter                 apr_pool_t *scratch_pool)
4566251881Speter{
4567251881Speter  return svn_error_trace(
4568251881Speter          svn_wc_read_kind2(kind,
4569251881Speter                            wc_ctx, abspath,
4570251881Speter                            TRUE /* show_deleted */,
4571251881Speter                            show_hidden,
4572251881Speter                            scratch_pool));
4573251881Speter
4574251881Speter  /*if (db_kind == svn_node_dir)
4575251881Speter    *kind = svn_node_dir;
4576251881Speter  else if (db_kind == svn_node_file || db_kind == svn_node_symlink)
4577251881Speter    *kind = svn_node_file;
4578251881Speter  else
4579251881Speter    *kind = svn_node_none;*/
4580251881Speter
4581251881Speter  return SVN_NO_ERROR;
4582251881Speter}
4583