/*
* revert.c: wrapper around wc revert functionality.
*
* ====================================================================
* Copyright (c) 2000-2004 CollabNet. All rights reserved.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
* are also available at http://subversion.tigris.org/license-1.html.
* If newer versions of this license are posted there, you may use a
* newer version instead, at your option.
*
* This software consists of voluntary contributions made by many
* individuals. For exact contribution history, see the revision
* history and logs, available at http://subversion.tigris.org/.
* ====================================================================
*/
/* ==================================================================== */
/*** Includes. ***/
#include "svn_wc.h"
#include "svn_client.h"
#include "svn_pools.h"
#include "svn_error.h"
#include "svn_time.h"
#include "svn_config.h"
#include "client.h"
/*** Code. ***/
/* Attempt to revert PATH, recursively if RECURSIVE is true and PATH
is a directory, else non-recursively. Consult CTX to determine
whether or not to revert timestamp to the time of last commit
('use-commit-times = yes'). Use POOL for temporary allocation.
If PATH is unversioned, return SVN_ERR_UNVERSIONED_RESOURCE. */
static svn_error_t *
revert(const char *path,
svn_boolean_t recursive,
svn_boolean_t use_commit_times,
svn_client_ctx_t *ctx,
apr_pool_t *pool)
{
svn_wc_adm_access_t *adm_access, *target_access;
const char *target;
svn_error_t *err;
SVN_ERR(svn_wc_adm_open_anchor(&adm_access, &target_access, &target, path,
TRUE, recursive ? -1 : 0,
ctx->cancel_func, ctx->cancel_baton,
pool));
err = svn_wc_revert2(path, adm_access, recursive, use_commit_times,
ctx->cancel_func, ctx->cancel_baton,
ctx->notify_func2, ctx->notify_baton2,
pool);
if (err)
{
/* If target isn't versioned, just send a 'skip'
notification and move on. */
if (err->apr_err == SVN_ERR_ENTRY_NOT_FOUND
|| err->apr_err == SVN_ERR_UNVERSIONED_RESOURCE)
{
if (ctx->notify_func2)
(*ctx->notify_func2)
(ctx->notify_baton2,
svn_wc_create_notify(path, svn_wc_notify_skip, pool),
pool);
svn_error_clear(err);
}
else
return err;
}
SVN_ERR(svn_wc_adm_close(adm_access));
return SVN_NO_ERROR;
}
svn_error_t *
svn_client_revert(const apr_array_header_t *paths,
svn_boolean_t recursive,
svn_client_ctx_t *ctx,
apr_pool_t *pool)
{
apr_pool_t *subpool;
svn_error_t *err = SVN_NO_ERROR;
int i;
svn_config_t *cfg;
svn_boolean_t use_commit_times;
cfg = ctx->config ? apr_hash_get(ctx->config, SVN_CONFIG_CATEGORY_CONFIG,
APR_HASH_KEY_STRING) : NULL;
SVN_ERR(svn_config_get_bool(cfg, &use_commit_times,
SVN_CONFIG_SECTION_MISCELLANY,
SVN_CONFIG_OPTION_USE_COMMIT_TIMES,
FALSE));
subpool = svn_pool_create(pool);
for (i = 0; i < paths->nelts; i++)
{
const char *path = APR_ARRAY_IDX(paths, i, const char *);
svn_pool_clear(subpool);
/* See if we've been asked to cancel this operation. */
if ((ctx->cancel_func)
&& ((err = ctx->cancel_func(ctx->cancel_baton))))
goto errorful;
err = revert(path, recursive, use_commit_times, ctx, subpool);
if (err)
goto errorful;
}
errorful:
svn_pool_destroy(subpool);
/* Sleep to ensure timestamp integrity. */
svn_sleep_for_timestamps();
return err;
}
syntax highlighted by Code2HTML, v. 0.9.1