Alien-SVN
view release on metacpan or search on metacpan
src/subversion/subversion/libsvn_repos/delta.c view on Meta::CPAN
static svn_error_t *replace_file_or_dir(struct context *c,
void *dir_baton,
svn_depth_t depth,
const char *source_path,
const char *target_path,
const char *edit_path,
svn_node_kind_t tgt_kind,
apr_pool_t *pool);
static svn_error_t *absent_file_or_dir(struct context *c,
void *dir_baton,
const char *edit_path,
svn_node_kind_t tgt_kind,
apr_pool_t *pool);
static svn_error_t *delta_dirs(struct context *c,
void *dir_baton,
svn_depth_t depth,
const char *source_path,
const char *target_path,
const char *edit_path,
apr_pool_t *pool);
#define MAYBE_DEMOTE_DEPTH(depth) \
(((depth) == svn_depth_immediates || (depth) == svn_depth_files) \
? svn_depth_empty \
: (depth))
/* Return the error 'SVN_ERR_AUTHZ_ROOT_UNREADABLE' if PATH in ROOT is
* unreadable according to AUTHZ_READ_FUNC with AUTHZ_READ_BATON.
*
* PATH should be the implicit root path of an editor drive, that is,
* the path used by editor->open_root().
*/
static svn_error_t *
authz_root_check(svn_fs_root_t *root,
const char *path,
svn_repos_authz_func_t authz_read_func,
void *authz_read_baton,
apr_pool_t *pool)
{
svn_boolean_t allowed;
if (authz_read_func)
{
SVN_ERR(authz_read_func(&allowed, root, path, authz_read_baton, pool));
if (! allowed)
return svn_error_create(SVN_ERR_AUTHZ_ROOT_UNREADABLE, 0,
_("Unable to open root of edit"));
}
return SVN_NO_ERROR;
}
static svn_error_t *
not_a_dir_error(const char *role,
const char *path)
{
return svn_error_createf
(SVN_ERR_FS_NOT_DIRECTORY, 0,
"Invalid %s directory '%s'",
role, path ? path : "(null)");
}
/* Public interface to computing directory deltas. */
svn_error_t *
svn_repos_dir_delta2(svn_fs_root_t *src_root,
const char *src_parent_dir,
const char *src_entry,
svn_fs_root_t *tgt_root,
const char *tgt_fullpath,
const svn_delta_editor_t *editor,
void *edit_baton,
svn_repos_authz_func_t authz_read_func,
void *authz_read_baton,
svn_boolean_t text_deltas,
svn_depth_t depth,
svn_boolean_t entry_props,
svn_boolean_t ignore_ancestry,
apr_pool_t *pool)
{
void *root_baton = NULL;
struct context c;
const char *src_fullpath;
const svn_fs_id_t *src_id, *tgt_id;
svn_node_kind_t src_kind, tgt_kind;
svn_revnum_t rootrev;
int distance;
const char *authz_root_path;
/* SRC_PARENT_DIR must be valid. */
if (src_parent_dir)
src_parent_dir = svn_relpath_canonicalize(src_parent_dir, pool);
else
return not_a_dir_error("source parent", src_parent_dir);
/* TGT_FULLPATH must be valid. */
if (tgt_fullpath)
tgt_fullpath = svn_relpath_canonicalize(tgt_fullpath, pool);
else
return svn_error_create(SVN_ERR_FS_PATH_SYNTAX, 0,
_("Invalid target path"));
if (depth == svn_depth_exclude)
return svn_error_create(SVN_ERR_REPOS_BAD_ARGS, NULL,
_("Delta depth 'exclude' not supported"));
/* Calculate the fs path implicitly used for editor->open_root, so
we can do an authz check on that path first. */
if (*src_entry)
authz_root_path = svn_relpath_dirname(tgt_fullpath, pool);
else
authz_root_path = tgt_fullpath;
/* Construct the full path of the source item. */
src_fullpath = svn_relpath_join(src_parent_dir, src_entry, pool);
/* Get the node kinds for the source and target paths. */
SVN_ERR(svn_fs_check_path(&tgt_kind, tgt_root, tgt_fullpath, pool));
SVN_ERR(svn_fs_check_path(&src_kind, src_root, src_fullpath, pool));
/* If neither of our paths exists, we don't really have anything to do. */
if ((tgt_kind == svn_node_none) && (src_kind == svn_node_none))
goto cleanup;
/* If either the source or the target is a non-directory, we
require that a SRC_ENTRY be supplied. */
if ((! *src_entry) && ((src_kind != svn_node_dir)
|| tgt_kind != svn_node_dir))
return svn_error_create
(SVN_ERR_FS_PATH_SYNTAX, 0,
_("Invalid editor anchoring; at least one of the "
"input paths is not a directory and there was no source entry"));
/* Set the global target revision if one can be determined. */
if (svn_fs_is_revision_root(tgt_root))
{
SVN_ERR(editor->set_target_revision
(edit_baton, svn_fs_revision_root_revision(tgt_root), pool));
}
else if (svn_fs_is_txn_root(tgt_root))
{
SVN_ERR(editor->set_target_revision
(edit_baton, svn_fs_txn_root_base_revision(tgt_root), pool));
}
/* Setup our pseudo-global structure here. We need these variables
throughout the deltafication process, so pass them around by
reference to all the helper functions. */
c.editor = editor;
c.source_root = src_root;
c.target_root = tgt_root;
c.authz_read_func = authz_read_func;
c.authz_read_baton = authz_read_baton;
c.text_deltas = text_deltas;
( run in 1.487 second using v1.01-cache-2.11-cpan-524268b4103 )