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