Alien-SVN
view release on metacpan or search on metacpan
src/subversion/subversion/libsvn_client/export.c view on Meta::CPAN
const char *native_eol;
svn_wc_notify_func2_t notify_func;
void *notify_baton;
const char *origin_abspath;
svn_boolean_t exported;
};
/* Export a file or directory. Implements svn_wc_status_func4_t */
static svn_error_t *
export_node(void *baton,
const char *local_abspath,
const svn_wc_status3_t *status,
apr_pool_t *scratch_pool)
{
struct export_info_baton *eib = baton;
svn_wc_context_t *wc_ctx = eib->wc_ctx;
apr_hash_t *kw = NULL;
svn_subst_eol_style_t style;
apr_hash_t *props;
svn_string_t *eol_style, *keywords, *executable, *special;
const char *eol = NULL;
svn_boolean_t local_mod = FALSE;
apr_time_t tm;
svn_stream_t *source;
svn_stream_t *dst_stream;
const char *dst_tmp;
svn_error_t *err;
const char *to_abspath = svn_dirent_join(
eib->to_path,
svn_dirent_skip_ancestor(eib->origin_abspath,
local_abspath),
scratch_pool);
eib->exported = TRUE;
/* Don't export 'deleted' files and directories unless it's a
revision other than WORKING. These files and directories
don't really exist in WORKING. */
if (eib->revision->kind == svn_opt_revision_working
&& status->node_status == svn_wc_status_deleted)
return SVN_NO_ERROR;
if (status->kind == svn_node_dir)
{
apr_fileperms_t perm = APR_OS_DEFAULT;
/* Try to make the new directory. If this fails because the
directory already exists, check our FORCE flag to see if we
care. */
/* Keep the source directory's permissions if applicable.
Skip retrieving the umask on windows. Apr does not implement setting
filesystem privileges on Windows.
Retrieving the file permissions with APR_FINFO_PROT | APR_FINFO_OWNER
is documented to be 'incredibly expensive' */
#ifndef WIN32
if (eib->revision->kind == svn_opt_revision_working)
{
apr_finfo_t finfo;
SVN_ERR(svn_io_stat(&finfo, local_abspath, APR_FINFO_PROT,
scratch_pool));
perm = finfo.protection;
}
#endif
err = svn_io_dir_make(to_abspath, perm, scratch_pool);
if (err)
{
if (! APR_STATUS_IS_EEXIST(err->apr_err))
return svn_error_trace(err);
if (! eib->overwrite)
SVN_ERR_W(err, _("Destination directory exists, and will not be "
"overwritten unless forced"));
else
svn_error_clear(err);
}
if (eib->notify_func
&& (strcmp(eib->origin_abspath, local_abspath) != 0))
{
svn_wc_notify_t *notify =
svn_wc_create_notify(to_abspath,
svn_wc_notify_update_add, scratch_pool);
notify->kind = svn_node_dir;
(eib->notify_func)(eib->notify_baton, notify, scratch_pool);
}
return SVN_NO_ERROR;
}
else if (status->kind != svn_node_file)
{
if (strcmp(eib->origin_abspath, local_abspath) != 0)
return SVN_NO_ERROR;
return svn_error_createf(SVN_ERR_WC_PATH_NOT_FOUND, NULL,
_("The node '%s' was not found."),
svn_dirent_local_style(local_abspath,
scratch_pool));
}
/* Skip file externals if they are a descendant of the export,
BUT NOT if we are explictly exporting the file external. */
if (status->file_external && strcmp(eib->origin_abspath, local_abspath) != 0)
return SVN_NO_ERROR;
/* Produce overwrite errors for the export root */
if (strcmp(local_abspath, eib->origin_abspath) == 0)
{
svn_node_kind_t to_kind;
SVN_ERR(svn_io_check_path(to_abspath, &to_kind, scratch_pool));
if ((to_kind == svn_node_file || to_kind == svn_node_unknown)
&& !eib->overwrite)
return svn_error_createf(SVN_ERR_ILLEGAL_TARGET, NULL,
_("Destination file '%s' exists, and "
"will not be overwritten unless forced"),
svn_dirent_local_style(to_abspath,
scratch_pool));
else if (to_kind == svn_node_dir)
( run in 0.682 second using v1.01-cache-2.11-cpan-39bf76dae61 )