free(transaction->updates[i]->committer_info);
free((char *)transaction->updates[i]->new_target);
free((char *)transaction->updates[i]->old_target);
+ free((char *)transaction->updates[i]->rejection_details);
free(transaction->updates[i]);
}
int ref_transaction_maybe_set_rejected(struct ref_transaction *transaction,
size_t update_idx,
- enum ref_transaction_error err)
+ enum ref_transaction_error err,
+ struct strbuf *details)
{
if (update_idx >= transaction->nr)
BUG("trying to set rejection on invalid update index");
transaction->updates[update_idx]->refname, 0);
transaction->updates[update_idx]->rejection_err = err;
+ transaction->updates[update_idx]->rejection_details = strbuf_detach(details, NULL);
ALLOC_GROW(transaction->rejections->update_indices,
transaction->rejections->nr + 1,
transaction->rejections->alloc);
if (!initial_transaction &&
(strset_contains(&conflicting_dirnames, dirname.buf) ||
!refs_read_raw_ref(refs, dirname.buf, &oid, &referent,
- &type, &ignore_errno))) {
+ &type, &ignore_errno))) {
+
+ strbuf_addf(err, _("'%s' exists; cannot create '%s'"),
+ dirname.buf, refname);
+
if (transaction && ref_transaction_maybe_set_rejected(
transaction, *update_idx,
- REF_TRANSACTION_ERROR_NAME_CONFLICT)) {
+ REF_TRANSACTION_ERROR_NAME_CONFLICT, err)) {
strset_remove(&dirnames, dirname.buf);
strset_add(&conflicting_dirnames, dirname.buf);
- continue;
+ goto next_ref;
}
- strbuf_addf(err, _("'%s' exists; cannot create '%s'"),
- dirname.buf, refname);
goto cleanup;
}
if (extras && string_list_has_string(extras, dirname.buf)) {
+ strbuf_addf(err, _("cannot process '%s' and '%s' at the same time"),
+ refname, dirname.buf);
+
if (transaction && ref_transaction_maybe_set_rejected(
transaction, *update_idx,
- REF_TRANSACTION_ERROR_NAME_CONFLICT)) {
+ REF_TRANSACTION_ERROR_NAME_CONFLICT, err)) {
strset_remove(&dirnames, dirname.buf);
- continue;
+ goto next_ref;
}
- strbuf_addf(err, _("cannot process '%s' and '%s' at the same time"),
- refname, dirname.buf);
goto cleanup;
}
}
if (skip &&
string_list_has_string(skip, iter->ref.name))
continue;
+ strbuf_addf(err, _("'%s' exists; cannot create '%s'"),
+ iter->ref.name, refname);
if (transaction && ref_transaction_maybe_set_rejected(
transaction, *update_idx,
- REF_TRANSACTION_ERROR_NAME_CONFLICT))
- continue;
+ REF_TRANSACTION_ERROR_NAME_CONFLICT, err))
+ goto next_ref;
- strbuf_addf(err, _("'%s' exists; cannot create '%s'"),
- iter->ref.name, refname);
goto cleanup;
}
extra_refname = find_descendant_ref(dirname.buf, extras, skip);
if (extra_refname) {
+ strbuf_addf(err, _("cannot process '%s' and '%s' at the same time"),
+ refname, extra_refname);
+
if (transaction && ref_transaction_maybe_set_rejected(
transaction, *update_idx,
- REF_TRANSACTION_ERROR_NAME_CONFLICT))
- continue;
+ REF_TRANSACTION_ERROR_NAME_CONFLICT, err))
+ goto next_ref;
- strbuf_addf(err, _("cannot process '%s' and '%s' at the same time"),
- refname, extra_refname);
goto cleanup;
}
+next_ref:;
}
ret = 0;
update->refname);
ret = REF_TRANSACTION_ERROR_CREATE_EXISTS;
- if (ref_transaction_maybe_set_rejected(transaction, i, ret)) {
- strbuf_reset(err);
+ if (ref_transaction_maybe_set_rejected(transaction, i,
+ ret, err)) {
ret = 0;
continue;
}
oid_to_hex(&update->old_oid));
ret = REF_TRANSACTION_ERROR_INCORRECT_OLD_VALUE;
- if (ref_transaction_maybe_set_rejected(transaction, i, ret)) {
- strbuf_reset(err);
+ if (ref_transaction_maybe_set_rejected(transaction, i,
+ ret, err)) {
ret = 0;
continue;
}
oid_to_hex(&update->old_oid));
ret = REF_TRANSACTION_ERROR_NONEXISTENT_REF;
- if (ref_transaction_maybe_set_rejected(transaction, i, ret)) {
- strbuf_reset(err);
+ if (ref_transaction_maybe_set_rejected(transaction, i,
+ ret, err)) {
ret = 0;
continue;
}