refs.c: update ref_transaction_delete to check for error and return status

Change ref_transaction_delete() to do basic error checking and return
non-zero on error. Update all callers to check the return for
ref_transaction_delete(). There are currently no conditions in _delete that
will return error but there will be in the future. Add an err argument that
will be updated on failure.

Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>
Reviewed-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Ronnie Sahlberg 2014-04-16 15:27:45 -07:00 committed by Junio C Hamano
parent b416af5bcd
commit 8c8bdc0d35
3 changed files with 22 additions and 11 deletions

View File

@ -258,8 +258,9 @@ static const char *parse_cmd_delete(struct strbuf *input, const char *next)
if (*next != line_termination) if (*next != line_termination)
die("delete %s: extra input: %s", refname, next); die("delete %s: extra input: %s", refname, next);


ref_transaction_delete(transaction, refname, old_sha1, if (ref_transaction_delete(transaction, refname, old_sha1,
update_flags, have_old); update_flags, have_old, &err))
die("%s", err.buf);


update_flags = 0; update_flags = 0;
free(refname); free(refname);

12
refs.c
View File

@ -3469,19 +3469,25 @@ int ref_transaction_create(struct ref_transaction *transaction,
return 0; return 0;
} }


void ref_transaction_delete(struct ref_transaction *transaction, int ref_transaction_delete(struct ref_transaction *transaction,
const char *refname, const char *refname,
const unsigned char *old_sha1, const unsigned char *old_sha1,
int flags, int have_old) int flags, int have_old,
struct strbuf *err)
{ {
struct ref_update *update = add_update(transaction, refname); struct ref_update *update;


if (have_old && !old_sha1)
die("BUG: have_old is true but old_sha1 is NULL");

update = add_update(transaction, refname);
update->flags = flags; update->flags = flags;
update->have_old = have_old; update->have_old = have_old;
if (have_old) { if (have_old) {
assert(!is_null_sha1(old_sha1)); assert(!is_null_sha1(old_sha1));
hashcpy(update->old_sha1, old_sha1); hashcpy(update->old_sha1, old_sha1);
} }
return 0;
} }


int update_ref(const char *action, const char *refname, int update_ref(const char *action, const char *refname,

8
refs.h
View File

@ -308,11 +308,15 @@ int ref_transaction_create(struct ref_transaction *transaction,
* Add a reference deletion to transaction. If have_old is true, then * Add a reference deletion to transaction. If have_old is true, then
* old_sha1 holds the value that the reference should have had before * old_sha1 holds the value that the reference should have had before
* the update (which must not be the null SHA-1). * the update (which must not be the null SHA-1).
* Function returns 0 on success and non-zero on failure. A failure to delete
* means that the transaction as a whole has failed and will need to be
* rolled back.
*/ */
void ref_transaction_delete(struct ref_transaction *transaction, int ref_transaction_delete(struct ref_transaction *transaction,
const char *refname, const char *refname,
const unsigned char *old_sha1, const unsigned char *old_sha1,
int flags, int have_old); int flags, int have_old,
struct strbuf *err);


/* /*
* Commit all of the changes that have been queued in transaction, as * Commit all of the changes that have been queued in transaction, as