svn_error_t * svn_wc__status2_from_3(svn_wc_status2_t **status, const svn_wc_status3_t *old_status, svn_wc_context_t *wc_ctx, const char *local_abspath, apr_pool_t *result_pool, apr_pool_t *scratch_pool) { const svn_wc_entry_t *entry = NULL; if (old_status == NULL) { *status = NULL; return SVN_NO_ERROR; } *status = apr_pcalloc(result_pool, sizeof(**status)); if (old_status->versioned) { svn_error_t *err; err= svn_wc__get_entry(&entry, wc_ctx->db, local_abspath, FALSE, svn_node_unknown, result_pool, scratch_pool); if (err && err->apr_err == SVN_ERR_NODE_UNEXPECTED_KIND) svn_error_clear(err); else SVN_ERR(err); } (*status)->entry = entry; (*status)->copied = old_status->copied; (*status)->repos_lock = svn_lock_dup(old_status->repos_lock, result_pool); if (old_status->repos_relpath) (*status)->url = svn_path_url_add_component2(old_status->repos_root_url, old_status->repos_relpath, result_pool); (*status)->ood_last_cmt_rev = old_status->ood_changed_rev; (*status)->ood_last_cmt_date = old_status->ood_changed_date; (*status)->ood_kind = old_status->ood_kind; (*status)->ood_last_cmt_author = old_status->ood_changed_author; if (old_status->conflicted) { const svn_wc_conflict_description2_t *tree_conflict; SVN_ERR(svn_wc__get_tree_conflict(&tree_conflict, wc_ctx, local_abspath, scratch_pool, scratch_pool)); (*status)->tree_conflict = svn_wc__cd2_to_cd(tree_conflict, result_pool); } (*status)->switched = old_status->switched; (*status)->text_status = old_status->node_status; (*status)->prop_status = old_status->prop_status; (*status)->repos_text_status = old_status->repos_node_status; (*status)->repos_prop_status = old_status->repos_prop_status; /* Some values might be inherited from properties */ if (old_status->node_status == svn_wc_status_modified || old_status->node_status == svn_wc_status_conflicted) (*status)->text_status = old_status->text_status; /* (Currently a no-op, but just make sure it is ok) */ if (old_status->repos_node_status == svn_wc_status_modified || old_status->repos_node_status == svn_wc_status_conflicted) (*status)->text_status = old_status->repos_text_status; if (old_status->node_status == svn_wc_status_added) (*status)->prop_status = svn_wc_status_none; /* No separate info */ /* Find pristine_text_status value */ switch (old_status->text_status) { case svn_wc_status_none: case svn_wc_status_normal: case svn_wc_status_modified: (*status)->pristine_text_status = old_status->text_status; break; case svn_wc_status_conflicted: default: /* ### Fetch compare data, or fall back to the documented not retrieved behavior? */ (*status)->pristine_text_status = svn_wc_status_none; break; } /* Find pristine_prop_status value */ switch (old_status->prop_status) { case svn_wc_status_none: case svn_wc_status_normal: case svn_wc_status_modified: if (old_status->node_status != svn_wc_status_added && old_status->node_status != svn_wc_status_deleted && old_status->node_status != svn_wc_status_replaced) { (*status)->pristine_prop_status = old_status->prop_status; } else (*status)->pristine_prop_status = svn_wc_status_none; break; case svn_wc_status_conflicted: default: /* ### Fetch compare data, or fall back to the documented not retrieved behavior? */ (*status)->pristine_prop_status = svn_wc_status_none; break; } if (old_status->versioned && old_status->conflicted && old_status->node_status != svn_wc_status_obstructed && (old_status->kind == svn_node_file || old_status->node_status != svn_wc_status_missing)) { svn_boolean_t text_conflict_p, prop_conflict_p; /* The entry says there was a conflict, but the user might have marked it as resolved by deleting the artifact files, so check for that. */ SVN_ERR(svn_wc__internal_conflicted_p(&text_conflict_p, &prop_conflict_p, NULL, wc_ctx->db, local_abspath, scratch_pool)); if (text_conflict_p) (*status)->text_status = svn_wc_status_conflicted; if (prop_conflict_p) (*status)->prop_status = svn_wc_status_conflicted; } return SVN_NO_ERROR; }
svn_error_t * svn_wc__add_tree_conflict(svn_wc_context_t *wc_ctx, const svn_wc_conflict_description2_t *conflict, apr_pool_t *scratch_pool) { svn_boolean_t existing_conflict; svn_skel_t *conflict_skel; svn_error_t *err; SVN_ERR_ASSERT(conflict != NULL); SVN_ERR_ASSERT(conflict->operation == svn_wc_operation_merge || (conflict->reason != svn_wc_conflict_reason_moved_away && conflict->reason != svn_wc_conflict_reason_moved_here)); /* Re-adding an existing tree conflict victim is an error. */ err = svn_wc__internal_conflicted_p(NULL, NULL, &existing_conflict, wc_ctx->db, conflict->local_abspath, scratch_pool); if (err) { if (err->apr_err != SVN_ERR_WC_PATH_NOT_FOUND) return svn_error_trace(err); svn_error_clear(err); } else if (existing_conflict) return svn_error_createf(SVN_ERR_WC_PATH_UNEXPECTED_STATUS, NULL, _("Attempt to add tree conflict that already " "exists at '%s'"), svn_dirent_local_style(conflict->local_abspath, scratch_pool)); else if (!conflict) return SVN_NO_ERROR; conflict_skel = svn_wc__conflict_skel_create(scratch_pool); SVN_ERR(svn_wc__conflict_skel_add_tree_conflict(conflict_skel, wc_ctx->db, conflict->local_abspath, conflict->reason, conflict->action, NULL, scratch_pool, scratch_pool)); switch (conflict->operation) { case svn_wc_operation_update: default: SVN_ERR(svn_wc__conflict_skel_set_op_update(conflict_skel, conflict->src_left_version, conflict->src_right_version, scratch_pool, scratch_pool)); break; case svn_wc_operation_switch: SVN_ERR(svn_wc__conflict_skel_set_op_switch(conflict_skel, conflict->src_left_version, conflict->src_right_version, scratch_pool, scratch_pool)); break; case svn_wc_operation_merge: SVN_ERR(svn_wc__conflict_skel_set_op_merge(conflict_skel, conflict->src_left_version, conflict->src_right_version, scratch_pool, scratch_pool)); break; } return svn_error_trace( svn_wc__db_op_mark_conflict(wc_ctx->db, conflict->local_abspath, conflict_skel, NULL, scratch_pool)); }