Alien-SVN
view release on metacpan or search on metacpan
src/subversion/subversion/libsvn_client/commit_util.c view on Meta::CPAN
{
SVN_ERR_ASSERT(parent_baton);
err = editor->open_file(path, parent_baton,
item->revision,
file_pool, &file_baton);
if (err)
goto fixup_error;
}
/* Add this file mod to the FILE_MODS hash. */
mod->item = item;
mod->file_baton = file_baton;
svn_hash_sets(file_mods, item->session_relpath, mod);
}
else if (file_baton)
{
/* Close any outstanding file batons that didn't get caught by
the "has local mods" conditional above. */
err = editor->close_file(file_baton, NULL, file_pool);
if (err)
goto fixup_error;
}
return SVN_NO_ERROR;
fixup_error:
return svn_error_trace(fixup_commit_error(local_abspath,
icb->base_url,
path, kind,
err, ctx, pool));
}
svn_error_t *
svn_client__do_commit(const char *base_url,
const apr_array_header_t *commit_items,
const svn_delta_editor_t *editor,
void *edit_baton,
const char *notify_path_prefix,
apr_hash_t **sha1_checksums,
svn_client_ctx_t *ctx,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
apr_hash_t *file_mods = apr_hash_make(scratch_pool);
apr_hash_t *items_hash = apr_hash_make(scratch_pool);
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
apr_hash_index_t *hi;
int i;
struct item_commit_baton cb_baton;
apr_array_header_t *paths =
apr_array_make(scratch_pool, commit_items->nelts, sizeof(const char *));
/* Ditto for the checksums. */
if (sha1_checksums)
*sha1_checksums = apr_hash_make(result_pool);
/* Build a hash from our COMMIT_ITEMS array, keyed on the
relative paths (which come from the item URLs). And
keep an array of those decoded paths, too. */
for (i = 0; i < commit_items->nelts; i++)
{
svn_client_commit_item3_t *item =
APR_ARRAY_IDX(commit_items, i, svn_client_commit_item3_t *);
const char *path = item->session_relpath;
svn_hash_sets(items_hash, path, item);
APR_ARRAY_PUSH(paths, const char *) = path;
}
/* Setup the callback baton. */
cb_baton.editor = editor;
cb_baton.edit_baton = edit_baton;
cb_baton.file_mods = file_mods;
cb_baton.notify_path_prefix = notify_path_prefix;
cb_baton.ctx = ctx;
cb_baton.commit_items = items_hash;
cb_baton.base_url = base_url;
/* Drive the commit editor! */
SVN_ERR(svn_delta_path_driver2(editor, edit_baton, paths, TRUE,
do_item_commit, &cb_baton, scratch_pool));
/* Transmit outstanding text deltas. */
for (hi = apr_hash_first(scratch_pool, file_mods);
hi;
hi = apr_hash_next(hi))
{
struct file_mod_t *mod = svn__apr_hash_index_val(hi);
const svn_client_commit_item3_t *item = mod->item;
const svn_checksum_t *new_text_base_md5_checksum;
const svn_checksum_t *new_text_base_sha1_checksum;
svn_boolean_t fulltext = FALSE;
svn_error_t *err;
svn_pool_clear(iterpool);
/* Transmit the entry. */
if (ctx->cancel_func)
SVN_ERR(ctx->cancel_func(ctx->cancel_baton));
if (ctx->notify_func2)
{
svn_wc_notify_t *notify;
notify = svn_wc_create_notify(item->path,
svn_wc_notify_commit_postfix_txdelta,
iterpool);
notify->kind = svn_node_file;
notify->path_prefix = notify_path_prefix;
ctx->notify_func2(ctx->notify_baton2, notify, iterpool);
}
/* If the node has no history, transmit full text */
if ((item->state_flags & SVN_CLIENT_COMMIT_ITEM_ADD)
&& ! (item->state_flags & SVN_CLIENT_COMMIT_ITEM_IS_COPY))
fulltext = TRUE;
err = svn_wc_transmit_text_deltas3(&new_text_base_md5_checksum,
&new_text_base_sha1_checksum,
ctx->wc_ctx, item->path,
fulltext, editor, mod->file_baton,
( run in 0.651 second using v1.01-cache-2.11-cpan-172d661cebc )