1251881Speter/*
2251881Speter * cleanup-cmd.c -- Subversion cleanup command
3251881Speter *
4251881Speter * ====================================================================
5251881Speter *    Licensed to the Apache Software Foundation (ASF) under one
6251881Speter *    or more contributor license agreements.  See the NOTICE file
7251881Speter *    distributed with this work for additional information
8251881Speter *    regarding copyright ownership.  The ASF licenses this file
9251881Speter *    to you under the Apache License, Version 2.0 (the
10251881Speter *    "License"); you may not use this file except in compliance
11251881Speter *    with the License.  You may obtain a copy of the License at
12251881Speter *
13251881Speter *      http://www.apache.org/licenses/LICENSE-2.0
14251881Speter *
15251881Speter *    Unless required by applicable law or agreed to in writing,
16251881Speter *    software distributed under the License is distributed on an
17251881Speter *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
18251881Speter *    KIND, either express or implied.  See the License for the
19251881Speter *    specific language governing permissions and limitations
20251881Speter *    under the License.
21251881Speter * ====================================================================
22251881Speter */
23251881Speter
24251881Speter/* ==================================================================== */
25251881Speter
26251881Speter
27251881Speter
28251881Speter/*** Includes. ***/
29251881Speter
30251881Speter#include "svn_client.h"
31251881Speter#include "svn_path.h"
32251881Speter#include "svn_pools.h"
33251881Speter#include "svn_error.h"
34251881Speter#include "cl.h"
35251881Speter
36251881Speter#include "svn_private_config.h"
37251881Speter
38251881Speter
39251881Speter/*** Code. ***/
40251881Speter
41251881Speter/* This implements the `svn_opt_subcommand_t' interface. */
42251881Spetersvn_error_t *
43251881Spetersvn_cl__cleanup(apr_getopt_t *os,
44251881Speter                void *baton,
45251881Speter                apr_pool_t *pool)
46251881Speter{
47251881Speter  svn_cl__opt_state_t *opt_state = ((svn_cl__cmd_baton_t *) baton)->opt_state;
48251881Speter  svn_client_ctx_t *ctx = ((svn_cl__cmd_baton_t *) baton)->ctx;
49251881Speter  apr_array_header_t *targets;
50299742Sdim  apr_pool_t *iterpool;
51251881Speter  int i;
52251881Speter
53251881Speter  SVN_ERR(svn_cl__args_to_target_array_print_reserved(&targets, os,
54251881Speter                                                      opt_state->targets,
55251881Speter                                                      ctx, FALSE, pool));
56251881Speter
57251881Speter  /* Add "." if user passed 0 arguments */
58251881Speter  svn_opt_push_implicit_dot_target(targets, pool);
59251881Speter
60251881Speter  SVN_ERR(svn_cl__check_targets_are_local_paths(targets));
61251881Speter
62251881Speter  SVN_ERR(svn_cl__eat_peg_revisions(&targets, targets, pool));
63251881Speter
64299742Sdim  iterpool = svn_pool_create(pool);
65251881Speter  for (i = 0; i < targets->nelts; i++)
66251881Speter    {
67251881Speter      const char *target = APR_ARRAY_IDX(targets, i, const char *);
68299742Sdim      const char *target_abspath;
69251881Speter
70299742Sdim      svn_pool_clear(iterpool);
71251881Speter      SVN_ERR(svn_cl__check_cancel(ctx->cancel_baton));
72299742Sdim
73299742Sdim      SVN_ERR(svn_dirent_get_absolute(&target_abspath, target, iterpool));
74299742Sdim
75299742Sdim      if (opt_state->remove_unversioned || opt_state->remove_ignored)
76251881Speter        {
77299742Sdim          svn_error_t *err = svn_client_vacuum(target_abspath,
78299742Sdim                                               opt_state->remove_unversioned,
79299742Sdim                                               opt_state->remove_ignored,
80299742Sdim                                               TRUE /* fix_timestamps */,
81299742Sdim                                               FALSE /* vacuum_pristines */,
82299742Sdim                                               opt_state->include_externals,
83299742Sdim                                               ctx, iterpool);
84299742Sdim
85299742Sdim          if (err && err->apr_err == SVN_ERR_WC_LOCKED)
86299742Sdim            err = svn_error_create(SVN_ERR_WC_LOCKED, err,
87299742Sdim                                     _("Working copy locked; if no other "
88299742Sdim                                       "Subversion client is currently "
89299742Sdim                                       "using the working copy, try running "
90299742Sdim                                       "'svn cleanup' without the "
91299742Sdim                                       "--remove-unversioned and "
92299742Sdim                                       "--remove-ignored options first."));
93299742Sdim          else if (err && err->apr_err == SVN_ERR_WC_NOT_WORKING_COPY)
94299742Sdim            err = svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, err,
95299742Sdim                                     _("Cannot remove unversioned or ignored "
96299742Sdim                                       "items from something that is not a "
97299742Sdim                                       "working copy"));
98299742Sdim
99299742Sdim          SVN_ERR(err);
100299742Sdim        }
101299742Sdim      else
102299742Sdim        {
103299742Sdim          svn_error_t *err = svn_client_cleanup2(target_abspath,
104299742Sdim                                                 TRUE /* break_locks */,
105299742Sdim                                                 TRUE /* fix_timestamps */,
106299742Sdim                                                 TRUE /* clear_dav_cache */,
107299742Sdim                                                 TRUE /* vacuum_pristines */,
108299742Sdim                                                 opt_state->include_externals,
109299742Sdim                                                 ctx, iterpool);
110299742Sdim
111299742Sdim          if (err && err->apr_err == SVN_ERR_WC_LOCKED)
112251881Speter            {
113251881Speter              const char *wcroot_abspath;
114299742Sdim              svn_error_t *err2;
115251881Speter
116251881Speter              err2 = svn_client_get_wc_root(&wcroot_abspath, target_abspath,
117299742Sdim                                            ctx, iterpool, iterpool);
118251881Speter              if (err2)
119251881Speter                err =  svn_error_compose_create(err, err2);
120251881Speter              else
121251881Speter                err = svn_error_createf(SVN_ERR_WC_LOCKED, err,
122251881Speter                                        _("Working copy locked; try running "
123251881Speter                                          "'svn cleanup' on the root of the "
124251881Speter                                          "working copy ('%s') instead."),
125251881Speter                                          svn_dirent_local_style(wcroot_abspath,
126299742Sdim                                                                 iterpool));
127251881Speter            }
128299742Sdim          SVN_ERR(err);
129251881Speter        }
130251881Speter    }
131251881Speter
132299742Sdim  svn_pool_destroy(iterpool);
133251881Speter  return SVN_NO_ERROR;
134251881Speter}
135