1/* 2 * resolve-cmd.c -- Subversion resolve subcommand 3 * 4 * ==================================================================== 5 * Licensed to the Apache Software Foundation (ASF) under one 6 * or more contributor license agreements. See the NOTICE file 7 * distributed with this work for additional information 8 * regarding copyright ownership. The ASF licenses this file 9 * to you under the Apache License, Version 2.0 (the 10 * "License"); you may not use this file except in compliance 11 * with the License. You may obtain a copy of the License at 12 * 13 * http://www.apache.org/licenses/LICENSE-2.0 14 * 15 * Unless required by applicable law or agreed to in writing, 16 * software distributed under the License is distributed on an 17 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 18 * KIND, either express or implied. See the License for the 19 * specific language governing permissions and limitations 20 * under the License. 21 * ==================================================================== 22 */ 23 24/* ==================================================================== */ 25 26 27 28/*** Includes. ***/ 29#include "svn_path.h" 30#include "svn_client.h" 31#include "svn_error.h" 32#include "svn_pools.h" 33#include "cl.h" 34 35#include "svn_private_config.h" 36 37 38 39/*** Code. ***/ 40 41/* This implements the `svn_opt_subcommand_t' interface. */ 42svn_error_t * 43svn_cl__resolve(apr_getopt_t *os, 44 void *baton, 45 apr_pool_t *scratch_pool) 46{ 47 svn_cl__opt_state_t *opt_state = ((svn_cl__cmd_baton_t *) baton)->opt_state; 48 svn_client_ctx_t *ctx = ((svn_cl__cmd_baton_t *) baton)->ctx; 49 svn_wc_conflict_choice_t conflict_choice; 50 svn_error_t *err; 51 apr_array_header_t *targets; 52 int i; 53 apr_pool_t *iterpool; 54 svn_boolean_t had_error = FALSE; 55 56 switch (opt_state->accept_which) 57 { 58 case svn_cl__accept_working: 59 conflict_choice = svn_wc_conflict_choose_merged; 60 break; 61 case svn_cl__accept_base: 62 conflict_choice = svn_wc_conflict_choose_base; 63 break; 64 case svn_cl__accept_theirs_conflict: 65 conflict_choice = svn_wc_conflict_choose_theirs_conflict; 66 break; 67 case svn_cl__accept_mine_conflict: 68 conflict_choice = svn_wc_conflict_choose_mine_conflict; 69 break; 70 case svn_cl__accept_theirs_full: 71 conflict_choice = svn_wc_conflict_choose_theirs_full; 72 break; 73 case svn_cl__accept_mine_full: 74 conflict_choice = svn_wc_conflict_choose_mine_full; 75 break; 76 case svn_cl__accept_unspecified: 77 if (opt_state->non_interactive) 78 return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, 79 _("missing --accept option")); 80 conflict_choice = svn_wc_conflict_choose_unspecified; 81 break; 82 default: 83 return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, 84 _("invalid 'accept' ARG")); 85 } 86 87 SVN_ERR(svn_cl__args_to_target_array_print_reserved(&targets, os, 88 opt_state->targets, 89 ctx, FALSE, 90 scratch_pool)); 91 if (! targets->nelts) 92 svn_opt_push_implicit_dot_target(targets, scratch_pool); 93 94 if (opt_state->depth == svn_depth_unknown) 95 { 96 if (opt_state->accept_which == svn_cl__accept_unspecified) 97 opt_state->depth = svn_depth_infinity; 98 else 99 opt_state->depth = svn_depth_empty; 100 } 101 102 SVN_ERR(svn_cl__eat_peg_revisions(&targets, targets, scratch_pool)); 103 104 SVN_ERR(svn_cl__check_targets_are_local_paths(targets)); 105 106 iterpool = svn_pool_create(scratch_pool); 107 for (i = 0; i < targets->nelts; i++) 108 { 109 const char *target = APR_ARRAY_IDX(targets, i, const char *); 110 svn_pool_clear(iterpool); 111 SVN_ERR(svn_cl__check_cancel(ctx->cancel_baton)); 112 err = svn_client_resolve(target, 113 opt_state->depth, conflict_choice, 114 ctx, 115 iterpool); 116 if (err) 117 { 118 svn_handle_warning2(stderr, err, "svn: "); 119 svn_error_clear(err); 120 had_error = TRUE; 121 } 122 } 123 svn_pool_destroy(iterpool); 124 125 if (had_error) 126 return svn_error_create(SVN_ERR_CL_ERROR_PROCESSING_EXTERNALS, NULL, 127 _("Failure occurred resolving one or more " 128 "conflicts")); 129 130 return SVN_NO_ERROR; 131} 132