1251881Speter/* 2251881Speter * util.c: general routines defying categorization; eventually I 3251881Speter * suspect they'll end up in libsvn_subr, but don't want to 4251881Speter * pollute that right now. Note that nothing in here is 5251881Speter * specific to working copies. 6251881Speter * 7251881Speter * ==================================================================== 8251881Speter * Licensed to the Apache Software Foundation (ASF) under one 9251881Speter * or more contributor license agreements. See the NOTICE file 10251881Speter * distributed with this work for additional information 11251881Speter * regarding copyright ownership. The ASF licenses this file 12251881Speter * to you under the Apache License, Version 2.0 (the 13251881Speter * "License"); you may not use this file except in compliance 14251881Speter * with the License. You may obtain a copy of the License at 15251881Speter * 16251881Speter * http://www.apache.org/licenses/LICENSE-2.0 17251881Speter * 18251881Speter * Unless required by applicable law or agreed to in writing, 19251881Speter * software distributed under the License is distributed on an 20251881Speter * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 21251881Speter * KIND, either express or implied. See the License for the 22251881Speter * specific language governing permissions and limitations 23251881Speter * under the License. 24251881Speter * ==================================================================== 25251881Speter */ 26251881Speter 27251881Speter#include <apr_pools.h> 28251881Speter#include <apr_file_io.h> 29251881Speter 30251881Speter#include "svn_io.h" 31251881Speter#include "svn_types.h" 32251881Speter#include "svn_error.h" 33251881Speter#include "svn_dirent_uri.h" 34251881Speter#include "svn_path.h" 35251881Speter#include "svn_props.h" 36251881Speter#include "svn_version.h" 37251881Speter 38251881Speter#include "wc.h" /* just for prototypes of things in this .c file */ 39251881Speter#include "entries.h" 40251881Speter#include "private/svn_wc_private.h" 41251881Speter 42251881Speter#include "svn_private_config.h" 43251881Speter 44251881Speter 45251881Spetersvn_error_t * 46251881Spetersvn_wc__ensure_directory(const char *path, 47251881Speter apr_pool_t *pool) 48251881Speter{ 49251881Speter svn_node_kind_t kind; 50251881Speter 51251881Speter SVN_ERR(svn_io_check_path(path, &kind, pool)); 52251881Speter 53251881Speter if (kind != svn_node_none && kind != svn_node_dir) 54251881Speter { 55251881Speter /* If got an error other than dir non-existence, then we can't 56251881Speter ensure this directory's existence, so just return the error. 57251881Speter Might happen if there's a file in the way, for example. */ 58251881Speter return svn_error_createf(APR_ENOTDIR, NULL, 59251881Speter _("'%s' is not a directory"), 60251881Speter svn_dirent_local_style(path, pool)); 61251881Speter } 62251881Speter else if (kind == svn_node_none) 63251881Speter { 64251881Speter /* The dir doesn't exist, and it's our job to change that. */ 65251881Speter SVN_ERR(svn_io_make_dir_recursively(path, pool)); 66251881Speter } 67251881Speter else /* No problem, the dir already existed, so just leave. */ 68251881Speter SVN_ERR_ASSERT(kind == svn_node_dir); 69251881Speter 70251881Speter return SVN_NO_ERROR; 71251881Speter} 72251881Speter 73251881Speter/* Return the library version number. */ 74251881Speterconst svn_version_t * 75251881Spetersvn_wc_version(void) 76251881Speter{ 77251881Speter SVN_VERSION_BODY; 78251881Speter} 79251881Speter 80251881Spetersvn_wc_notify_t * 81251881Spetersvn_wc_create_notify(const char *path, 82251881Speter svn_wc_notify_action_t action, 83251881Speter apr_pool_t *pool) 84251881Speter{ 85251881Speter svn_wc_notify_t *ret = apr_pcalloc(pool, sizeof(*ret)); 86251881Speter ret->path = path; 87251881Speter ret->action = action; 88251881Speter ret->kind = svn_node_unknown; 89251881Speter ret->content_state = ret->prop_state = svn_wc_notify_state_unknown; 90251881Speter ret->lock_state = svn_wc_notify_lock_state_unknown; 91251881Speter ret->revision = SVN_INVALID_REVNUM; 92251881Speter ret->old_revision = SVN_INVALID_REVNUM; 93251881Speter 94251881Speter return ret; 95251881Speter} 96251881Speter 97251881Spetersvn_wc_notify_t * 98251881Spetersvn_wc_create_notify_url(const char *url, 99251881Speter svn_wc_notify_action_t action, 100251881Speter apr_pool_t *pool) 101251881Speter{ 102251881Speter svn_wc_notify_t *ret = svn_wc_create_notify(".", action, pool); 103251881Speter ret->url = url; 104251881Speter 105251881Speter return ret; 106251881Speter} 107251881Speter 108251881Speter/* Pool cleanup function to clear an svn_error_t *. */ 109251881Speterstatic apr_status_t err_cleanup(void *data) 110251881Speter{ 111251881Speter svn_error_clear(data); 112251881Speter 113251881Speter return APR_SUCCESS; 114251881Speter} 115251881Speter 116251881Spetersvn_wc_notify_t * 117251881Spetersvn_wc_dup_notify(const svn_wc_notify_t *notify, 118251881Speter apr_pool_t *pool) 119251881Speter{ 120251881Speter svn_wc_notify_t *ret = apr_palloc(pool, sizeof(*ret)); 121251881Speter 122251881Speter *ret = *notify; 123251881Speter 124251881Speter if (ret->path) 125251881Speter ret->path = apr_pstrdup(pool, ret->path); 126251881Speter if (ret->mime_type) 127251881Speter ret->mime_type = apr_pstrdup(pool, ret->mime_type); 128251881Speter if (ret->lock) 129251881Speter ret->lock = svn_lock_dup(ret->lock, pool); 130251881Speter if (ret->err) 131251881Speter { 132251881Speter ret->err = svn_error_dup(ret->err); 133251881Speter apr_pool_cleanup_register(pool, ret->err, err_cleanup, 134251881Speter apr_pool_cleanup_null); 135251881Speter } 136251881Speter if (ret->changelist_name) 137251881Speter ret->changelist_name = apr_pstrdup(pool, ret->changelist_name); 138251881Speter if (ret->merge_range) 139251881Speter ret->merge_range = svn_merge_range_dup(ret->merge_range, pool); 140251881Speter if (ret->url) 141251881Speter ret->url = apr_pstrdup(pool, ret->url); 142251881Speter if (ret->path_prefix) 143251881Speter ret->path_prefix = apr_pstrdup(pool, ret->path_prefix); 144251881Speter if (ret->prop_name) 145251881Speter ret->prop_name = apr_pstrdup(pool, ret->prop_name); 146251881Speter if (ret->rev_props) 147251881Speter ret->rev_props = svn_prop_hash_dup(ret->rev_props, pool); 148251881Speter 149251881Speter return ret; 150251881Speter} 151251881Speter 152251881Spetersvn_error_t * 153251881Spetersvn_wc_external_item2_create(svn_wc_external_item2_t **item, 154251881Speter apr_pool_t *pool) 155251881Speter{ 156251881Speter *item = apr_pcalloc(pool, sizeof(svn_wc_external_item2_t)); 157251881Speter return SVN_NO_ERROR; 158251881Speter} 159251881Speter 160251881Speter 161251881Spetersvn_wc_external_item2_t * 162251881Spetersvn_wc_external_item2_dup(const svn_wc_external_item2_t *item, 163251881Speter apr_pool_t *pool) 164251881Speter{ 165251881Speter svn_wc_external_item2_t *new_item = apr_palloc(pool, sizeof(*new_item)); 166251881Speter 167251881Speter *new_item = *item; 168251881Speter 169251881Speter if (new_item->target_dir) 170251881Speter new_item->target_dir = apr_pstrdup(pool, new_item->target_dir); 171251881Speter 172251881Speter if (new_item->url) 173251881Speter new_item->url = apr_pstrdup(pool, new_item->url); 174251881Speter 175251881Speter return new_item; 176251881Speter} 177251881Speter 178251881Speter 179251881Spetersvn_boolean_t 180251881Spetersvn_wc_match_ignore_list(const char *str, const apr_array_header_t *list, 181251881Speter apr_pool_t *pool) 182251881Speter{ 183251881Speter /* For now, we simply forward to svn_cstring_match_glob_list. In the 184251881Speter future, if we support more complex ignore patterns, we would iterate 185251881Speter over 'list' ourselves, and decide for each pattern how to handle 186251881Speter it. */ 187251881Speter 188251881Speter return svn_cstring_match_glob_list(str, list); 189251881Speter} 190251881Speter 191251881Spetersvn_wc_conflict_description2_t * 192251881Spetersvn_wc_conflict_description_create_text2(const char *local_abspath, 193251881Speter apr_pool_t *result_pool) 194251881Speter{ 195251881Speter svn_wc_conflict_description2_t *conflict; 196251881Speter 197251881Speter SVN_ERR_ASSERT_NO_RETURN(svn_dirent_is_absolute(local_abspath)); 198251881Speter 199251881Speter conflict = apr_pcalloc(result_pool, sizeof(*conflict)); 200251881Speter conflict->local_abspath = apr_pstrdup(result_pool, local_abspath); 201251881Speter conflict->node_kind = svn_node_file; 202251881Speter conflict->kind = svn_wc_conflict_kind_text; 203251881Speter conflict->action = svn_wc_conflict_action_edit; 204251881Speter conflict->reason = svn_wc_conflict_reason_edited; 205251881Speter return conflict; 206251881Speter} 207251881Speter 208251881Spetersvn_wc_conflict_description2_t * 209251881Spetersvn_wc_conflict_description_create_prop2(const char *local_abspath, 210251881Speter svn_node_kind_t node_kind, 211251881Speter const char *property_name, 212251881Speter apr_pool_t *result_pool) 213251881Speter{ 214251881Speter svn_wc_conflict_description2_t *conflict; 215251881Speter 216251881Speter SVN_ERR_ASSERT_NO_RETURN(svn_dirent_is_absolute(local_abspath)); 217251881Speter 218251881Speter conflict = apr_pcalloc(result_pool, sizeof(*conflict)); 219251881Speter conflict->local_abspath = apr_pstrdup(result_pool, local_abspath); 220251881Speter conflict->node_kind = node_kind; 221251881Speter conflict->kind = svn_wc_conflict_kind_property; 222251881Speter conflict->property_name = apr_pstrdup(result_pool, property_name); 223251881Speter return conflict; 224251881Speter} 225251881Speter 226251881Spetersvn_wc_conflict_description2_t * 227251881Spetersvn_wc_conflict_description_create_tree2( 228251881Speter const char *local_abspath, 229251881Speter svn_node_kind_t node_kind, 230251881Speter svn_wc_operation_t operation, 231251881Speter const svn_wc_conflict_version_t *src_left_version, 232251881Speter const svn_wc_conflict_version_t *src_right_version, 233251881Speter apr_pool_t *result_pool) 234251881Speter{ 235251881Speter svn_wc_conflict_description2_t *conflict; 236251881Speter 237251881Speter SVN_ERR_ASSERT_NO_RETURN(svn_dirent_is_absolute(local_abspath)); 238251881Speter 239251881Speter conflict = apr_pcalloc(result_pool, sizeof(*conflict)); 240251881Speter conflict->local_abspath = apr_pstrdup(result_pool, local_abspath); 241251881Speter conflict->node_kind = node_kind; 242251881Speter conflict->kind = svn_wc_conflict_kind_tree; 243251881Speter conflict->operation = operation; 244251881Speter conflict->src_left_version = svn_wc_conflict_version_dup(src_left_version, 245251881Speter result_pool); 246251881Speter conflict->src_right_version = svn_wc_conflict_version_dup(src_right_version, 247251881Speter result_pool); 248251881Speter return conflict; 249251881Speter} 250251881Speter 251251881Speter 252251881Spetersvn_wc_conflict_description2_t * 253251881Spetersvn_wc__conflict_description2_dup(const svn_wc_conflict_description2_t *conflict, 254251881Speter apr_pool_t *pool) 255251881Speter{ 256251881Speter svn_wc_conflict_description2_t *new_conflict; 257251881Speter 258251881Speter new_conflict = apr_pcalloc(pool, sizeof(*new_conflict)); 259251881Speter 260251881Speter /* Shallow copy all members. */ 261251881Speter *new_conflict = *conflict; 262251881Speter 263251881Speter if (conflict->local_abspath) 264251881Speter new_conflict->local_abspath = apr_pstrdup(pool, conflict->local_abspath); 265251881Speter if (conflict->property_name) 266251881Speter new_conflict->property_name = apr_pstrdup(pool, conflict->property_name); 267251881Speter if (conflict->mime_type) 268251881Speter new_conflict->mime_type = apr_pstrdup(pool, conflict->mime_type); 269251881Speter if (conflict->base_abspath) 270251881Speter new_conflict->base_abspath = apr_pstrdup(pool, conflict->base_abspath); 271251881Speter if (conflict->their_abspath) 272251881Speter new_conflict->their_abspath = apr_pstrdup(pool, conflict->their_abspath); 273251881Speter if (conflict->my_abspath) 274251881Speter new_conflict->my_abspath = apr_pstrdup(pool, conflict->my_abspath); 275251881Speter if (conflict->merged_file) 276251881Speter new_conflict->merged_file = apr_pstrdup(pool, conflict->merged_file); 277251881Speter if (conflict->src_left_version) 278251881Speter new_conflict->src_left_version = 279251881Speter svn_wc_conflict_version_dup(conflict->src_left_version, pool); 280251881Speter if (conflict->src_right_version) 281251881Speter new_conflict->src_right_version = 282251881Speter svn_wc_conflict_version_dup(conflict->src_right_version, pool); 283251881Speter 284251881Speter return new_conflict; 285251881Speter} 286251881Speter 287251881Spetersvn_wc_conflict_version_t * 288251881Spetersvn_wc_conflict_version_create2(const char *repos_url, 289251881Speter const char *repos_uuid, 290251881Speter const char *repos_relpath, 291251881Speter svn_revnum_t revision, 292251881Speter svn_node_kind_t kind, 293251881Speter apr_pool_t *result_pool) 294251881Speter{ 295251881Speter svn_wc_conflict_version_t *version; 296251881Speter 297251881Speter version = apr_pcalloc(result_pool, sizeof(*version)); 298251881Speter 299251881Speter SVN_ERR_ASSERT_NO_RETURN(svn_uri_is_canonical(repos_url, result_pool) 300251881Speter && svn_relpath_is_canonical(repos_relpath) 301251881Speter && SVN_IS_VALID_REVNUM(revision) 302251881Speter /* ### repos_uuid can be NULL :( */); 303251881Speter 304251881Speter version->repos_url = repos_url; 305251881Speter version->peg_rev = revision; 306251881Speter version->path_in_repos = repos_relpath; 307251881Speter version->node_kind = kind; 308251881Speter version->repos_uuid = repos_uuid; 309251881Speter 310251881Speter return version; 311251881Speter} 312251881Speter 313251881Speter 314251881Spetersvn_wc_conflict_version_t * 315251881Spetersvn_wc_conflict_version_dup(const svn_wc_conflict_version_t *version, 316251881Speter apr_pool_t *result_pool) 317251881Speter{ 318251881Speter 319251881Speter svn_wc_conflict_version_t *new_version; 320251881Speter 321251881Speter if (version == NULL) 322251881Speter return NULL; 323251881Speter 324251881Speter new_version = apr_pcalloc(result_pool, sizeof(*new_version)); 325251881Speter 326251881Speter /* Shallow copy all members. */ 327251881Speter *new_version = *version; 328251881Speter 329251881Speter if (version->repos_url) 330251881Speter new_version->repos_url = apr_pstrdup(result_pool, version->repos_url); 331251881Speter 332251881Speter if (version->path_in_repos) 333251881Speter new_version->path_in_repos = apr_pstrdup(result_pool, 334251881Speter version->path_in_repos); 335251881Speter 336251881Speter if (version->repos_uuid) 337251881Speter new_version->repos_uuid = apr_pstrdup(result_pool, version->repos_uuid); 338251881Speter 339251881Speter return new_version; 340251881Speter} 341251881Speter 342251881Speter 343251881Spetersvn_wc_conflict_description_t * 344251881Spetersvn_wc__cd2_to_cd(const svn_wc_conflict_description2_t *conflict, 345251881Speter apr_pool_t *result_pool) 346251881Speter{ 347251881Speter svn_wc_conflict_description_t *new_conflict; 348251881Speter 349251881Speter if (conflict == NULL) 350251881Speter return NULL; 351251881Speter 352251881Speter new_conflict = apr_pcalloc(result_pool, sizeof(*new_conflict)); 353251881Speter 354251881Speter new_conflict->path = apr_pstrdup(result_pool, conflict->local_abspath); 355251881Speter new_conflict->node_kind = conflict->node_kind; 356251881Speter new_conflict->kind = conflict->kind; 357251881Speter new_conflict->action = conflict->action; 358251881Speter new_conflict->reason = conflict->reason; 359251881Speter if (conflict->src_left_version) 360251881Speter new_conflict->src_left_version = 361251881Speter svn_wc_conflict_version_dup(conflict->src_left_version, result_pool); 362251881Speter if (conflict->src_right_version) 363251881Speter new_conflict->src_right_version = 364251881Speter svn_wc_conflict_version_dup(conflict->src_right_version, result_pool); 365251881Speter 366251881Speter switch (conflict->kind) 367251881Speter { 368251881Speter 369251881Speter case svn_wc_conflict_kind_property: 370251881Speter new_conflict->property_name = apr_pstrdup(result_pool, 371251881Speter conflict->property_name); 372251881Speter /* Falling through. */ 373251881Speter 374251881Speter case svn_wc_conflict_kind_text: 375251881Speter new_conflict->is_binary = conflict->is_binary; 376251881Speter if (conflict->mime_type) 377251881Speter new_conflict->mime_type = apr_pstrdup(result_pool, 378251881Speter conflict->mime_type); 379251881Speter if (conflict->base_abspath) 380251881Speter new_conflict->base_file = apr_pstrdup(result_pool, 381251881Speter conflict->base_abspath); 382251881Speter if (conflict->their_abspath) 383251881Speter new_conflict->their_file = apr_pstrdup(result_pool, 384251881Speter conflict->their_abspath); 385251881Speter if (conflict->my_abspath) 386251881Speter new_conflict->my_file = apr_pstrdup(result_pool, 387251881Speter conflict->my_abspath); 388251881Speter if (conflict->merged_file) 389251881Speter new_conflict->merged_file = apr_pstrdup(result_pool, 390251881Speter conflict->merged_file); 391251881Speter break; 392251881Speter 393251881Speter case svn_wc_conflict_kind_tree: 394251881Speter new_conflict->operation = conflict->operation; 395251881Speter break; 396251881Speter } 397251881Speter 398251881Speter /* A NULL access baton is allowable by the API. */ 399251881Speter new_conflict->access = NULL; 400251881Speter 401251881Speter return new_conflict; 402251881Speter} 403251881Speter 404251881Speter 405251881Spetersvn_error_t * 406251881Spetersvn_wc__status2_from_3(svn_wc_status2_t **status, 407251881Speter const svn_wc_status3_t *old_status, 408251881Speter svn_wc_context_t *wc_ctx, 409251881Speter const char *local_abspath, 410251881Speter apr_pool_t *result_pool, 411251881Speter apr_pool_t *scratch_pool) 412251881Speter{ 413251881Speter const svn_wc_entry_t *entry = NULL; 414251881Speter 415251881Speter if (old_status == NULL) 416251881Speter { 417251881Speter *status = NULL; 418251881Speter return SVN_NO_ERROR; 419251881Speter } 420251881Speter 421251881Speter *status = apr_pcalloc(result_pool, sizeof(**status)); 422251881Speter 423251881Speter if (old_status->versioned) 424251881Speter { 425251881Speter svn_error_t *err; 426251881Speter err= svn_wc__get_entry(&entry, wc_ctx->db, local_abspath, FALSE, 427251881Speter svn_node_unknown, result_pool, scratch_pool); 428251881Speter 429251881Speter if (err && err->apr_err == SVN_ERR_NODE_UNEXPECTED_KIND) 430251881Speter svn_error_clear(err); 431251881Speter else 432251881Speter SVN_ERR(err); 433251881Speter } 434251881Speter 435251881Speter (*status)->entry = entry; 436251881Speter (*status)->copied = old_status->copied; 437251881Speter (*status)->repos_lock = svn_lock_dup(old_status->repos_lock, result_pool); 438251881Speter 439251881Speter if (old_status->repos_relpath) 440251881Speter (*status)->url = svn_path_url_add_component2(old_status->repos_root_url, 441251881Speter old_status->repos_relpath, 442251881Speter result_pool); 443251881Speter (*status)->ood_last_cmt_rev = old_status->ood_changed_rev; 444251881Speter (*status)->ood_last_cmt_date = old_status->ood_changed_date; 445251881Speter (*status)->ood_kind = old_status->ood_kind; 446251881Speter (*status)->ood_last_cmt_author = old_status->ood_changed_author; 447251881Speter 448251881Speter if (old_status->conflicted) 449251881Speter { 450251881Speter const svn_wc_conflict_description2_t *tree_conflict; 451251881Speter SVN_ERR(svn_wc__get_tree_conflict(&tree_conflict, wc_ctx, local_abspath, 452251881Speter scratch_pool, scratch_pool)); 453251881Speter (*status)->tree_conflict = svn_wc__cd2_to_cd(tree_conflict, result_pool); 454251881Speter } 455251881Speter 456251881Speter (*status)->switched = old_status->switched; 457251881Speter 458251881Speter (*status)->text_status = old_status->node_status; 459251881Speter (*status)->prop_status = old_status->prop_status; 460251881Speter 461251881Speter (*status)->repos_text_status = old_status->repos_node_status; 462251881Speter (*status)->repos_prop_status = old_status->repos_prop_status; 463251881Speter 464251881Speter /* Some values might be inherited from properties */ 465251881Speter if (old_status->node_status == svn_wc_status_modified 466251881Speter || old_status->node_status == svn_wc_status_conflicted) 467251881Speter (*status)->text_status = old_status->text_status; 468251881Speter 469251881Speter /* (Currently a no-op, but just make sure it is ok) */ 470251881Speter if (old_status->repos_node_status == svn_wc_status_modified 471251881Speter || old_status->repos_node_status == svn_wc_status_conflicted) 472251881Speter (*status)->repos_text_status = old_status->repos_text_status; 473251881Speter 474251881Speter if (old_status->node_status == svn_wc_status_added) 475251881Speter (*status)->prop_status = svn_wc_status_none; /* No separate info */ 476251881Speter 477251881Speter /* Find pristine_text_status value */ 478251881Speter switch (old_status->text_status) 479251881Speter { 480251881Speter case svn_wc_status_none: 481251881Speter case svn_wc_status_normal: 482251881Speter case svn_wc_status_modified: 483251881Speter (*status)->pristine_text_status = old_status->text_status; 484251881Speter break; 485251881Speter case svn_wc_status_conflicted: 486251881Speter default: 487251881Speter /* ### Fetch compare data, or fall back to the documented 488251881Speter not retrieved behavior? */ 489251881Speter (*status)->pristine_text_status = svn_wc_status_none; 490251881Speter break; 491251881Speter } 492251881Speter 493251881Speter /* Find pristine_prop_status value */ 494251881Speter switch (old_status->prop_status) 495251881Speter { 496251881Speter case svn_wc_status_none: 497251881Speter case svn_wc_status_normal: 498251881Speter case svn_wc_status_modified: 499251881Speter if (old_status->node_status != svn_wc_status_added 500251881Speter && old_status->node_status != svn_wc_status_deleted 501251881Speter && old_status->node_status != svn_wc_status_replaced) 502251881Speter { 503251881Speter (*status)->pristine_prop_status = old_status->prop_status; 504251881Speter } 505251881Speter else 506251881Speter (*status)->pristine_prop_status = svn_wc_status_none; 507251881Speter break; 508251881Speter case svn_wc_status_conflicted: 509251881Speter default: 510251881Speter /* ### Fetch compare data, or fall back to the documented 511251881Speter not retrieved behavior? */ 512251881Speter (*status)->pristine_prop_status = svn_wc_status_none; 513251881Speter break; 514251881Speter } 515251881Speter 516251881Speter if (old_status->versioned 517251881Speter && old_status->conflicted 518251881Speter && old_status->node_status != svn_wc_status_obstructed 519251881Speter && (old_status->kind == svn_node_file 520251881Speter || old_status->node_status != svn_wc_status_missing)) 521251881Speter { 522251881Speter svn_boolean_t text_conflict_p, prop_conflict_p; 523251881Speter 524251881Speter /* The entry says there was a conflict, but the user might have 525251881Speter marked it as resolved by deleting the artifact files, so check 526251881Speter for that. */ 527251881Speter SVN_ERR(svn_wc__internal_conflicted_p(&text_conflict_p, 528251881Speter &prop_conflict_p, 529251881Speter NULL, 530251881Speter wc_ctx->db, local_abspath, 531251881Speter scratch_pool)); 532251881Speter 533251881Speter if (text_conflict_p) 534251881Speter (*status)->text_status = svn_wc_status_conflicted; 535251881Speter 536251881Speter if (prop_conflict_p) 537251881Speter (*status)->prop_status = svn_wc_status_conflicted; 538251881Speter } 539251881Speter 540251881Speter return SVN_NO_ERROR; 541251881Speter} 542251881Speter 543251881Speter 544251881Spetersvn_error_t * 545251881Spetersvn_wc__fetch_kind_func(svn_node_kind_t *kind, 546251881Speter void *baton, 547251881Speter const char *path, 548251881Speter svn_revnum_t base_revision, 549251881Speter apr_pool_t *scratch_pool) 550251881Speter{ 551251881Speter struct svn_wc__shim_fetch_baton_t *sfb = baton; 552251881Speter const char *local_abspath = svn_dirent_join(sfb->base_abspath, path, 553251881Speter scratch_pool); 554251881Speter 555251881Speter SVN_ERR(svn_wc__db_read_kind(kind, sfb->db, local_abspath, 556251881Speter FALSE /* allow_missing */, 557251881Speter TRUE /* show_deleted */, 558251881Speter FALSE /* show_hidden */, 559251881Speter scratch_pool)); 560251881Speter 561251881Speter return SVN_NO_ERROR; 562251881Speter} 563251881Speter 564251881Speter 565251881Spetersvn_error_t * 566251881Spetersvn_wc__fetch_props_func(apr_hash_t **props, 567251881Speter void *baton, 568251881Speter const char *path, 569251881Speter svn_revnum_t base_revision, 570251881Speter apr_pool_t *result_pool, 571251881Speter apr_pool_t *scratch_pool) 572251881Speter{ 573251881Speter struct svn_wc__shim_fetch_baton_t *sfb = baton; 574251881Speter const char *local_abspath = svn_dirent_join(sfb->base_abspath, path, 575251881Speter scratch_pool); 576251881Speter svn_error_t *err; 577251881Speter 578251881Speter if (sfb->fetch_base) 579251881Speter err = svn_wc__db_base_get_props(props, sfb->db, local_abspath, result_pool, 580251881Speter scratch_pool); 581251881Speter else 582251881Speter err = svn_wc__db_read_props(props, sfb->db, local_abspath, 583251881Speter result_pool, scratch_pool); 584251881Speter 585251881Speter /* If the path doesn't exist, just return an empty set of props. */ 586251881Speter if (err && err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND) 587251881Speter { 588251881Speter svn_error_clear(err); 589251881Speter *props = apr_hash_make(result_pool); 590251881Speter } 591251881Speter else if (err) 592251881Speter return svn_error_trace(err); 593251881Speter 594251881Speter return SVN_NO_ERROR; 595251881Speter} 596251881Speter 597251881Speter 598251881Spetersvn_error_t * 599251881Spetersvn_wc__fetch_base_func(const char **filename, 600251881Speter void *baton, 601251881Speter const char *path, 602251881Speter svn_revnum_t base_revision, 603251881Speter apr_pool_t *result_pool, 604251881Speter apr_pool_t *scratch_pool) 605251881Speter{ 606251881Speter struct svn_wc__shim_fetch_baton_t *sfb = baton; 607251881Speter const svn_checksum_t *checksum; 608251881Speter svn_error_t *err; 609251881Speter const char *local_abspath = svn_dirent_join(sfb->base_abspath, path, 610251881Speter scratch_pool); 611251881Speter 612251881Speter err = svn_wc__db_base_get_info(NULL, NULL, NULL, NULL, NULL, NULL, 613251881Speter NULL, NULL, NULL, NULL, &checksum, 614251881Speter NULL, NULL, NULL, NULL, NULL, 615251881Speter sfb->db, local_abspath, 616251881Speter scratch_pool, scratch_pool); 617251881Speter if (err && err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND) 618251881Speter { 619251881Speter svn_error_clear(err); 620251881Speter *filename = NULL; 621251881Speter return SVN_NO_ERROR; 622251881Speter } 623251881Speter else if (err) 624251881Speter return svn_error_trace(err); 625251881Speter 626251881Speter if (checksum == NULL) 627251881Speter { 628251881Speter *filename = NULL; 629251881Speter return SVN_NO_ERROR; 630251881Speter } 631251881Speter 632251881Speter SVN_ERR(svn_wc__db_pristine_get_path(filename, sfb->db, local_abspath, 633251881Speter checksum, scratch_pool, scratch_pool)); 634251881Speter 635251881Speter return SVN_NO_ERROR; 636251881Speter} 637