refs.c: make update_ref_write update a strbuf on failure

Change update_ref_write to also update an error strbuf on failure. This makes the error available to ref_transaction_commit callers if the transaction failed due to update_ref_sha1/write_ref_sha1 failures. Reviewed-by: Jonathan Nieder <jrnieder@gmail.com> Signed-off-by: Ronnie Sahlberg <sahlberg@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com> Acked-by: Michael Haggerty <mhagger@alum.mit.edu>

Ronnie Sahlberg committed Jun 20, 2014 at 07:42 UTC c1703d7634a61b4d08d77fa0d9ca7e7ad92c3cb8
1 file changed +6 -3
refs.c
+6 -3
@@ -3353,10 +3353,13 @@ static struct ref_lock *update_ref_lock(const char *refname,
3353
3354 static int update_ref_write(const char *action, const char *refname,
3355 const unsigned char *sha1, struct ref_lock *lock,
3356 - enum action_on_err onerr)
3356 + struct strbuf *err, enum action_on_err onerr)
3357 {
3358 if (write_ref_sha1(lock, sha1, action) < 0) {
3359 const char *str = "Cannot update the ref '%s'.";
3360 + if (err)
3361 + strbuf_addf(err, str, refname);
3362 +
3363 switch (onerr) {
3364 case UPDATE_REFS_MSG_ON_ERR: error(str, refname); break;
3365 case UPDATE_REFS_DIE_ON_ERR: die(str, refname); break;
@@ -3477,7 +3480,7 @@ int update_ref(const char *action, const char *refname,
3480 lock = update_ref_lock(refname, oldval, flags, NULL, onerr);
3481 if (!lock)
3482 return 1;
3480 - return update_ref_write(action, refname, sha1, lock, onerr);
3483 + return update_ref_write(action, refname, sha1, lock, NULL, onerr);
3484 }
3485
3486 static int ref_update_compare(const void *r1, const void *r2)
@@ -3559,7 +3562,7 @@ int ref_transaction_commit(struct ref_transaction *transaction,
3562 ret = update_ref_write(msg,
3563 update->refname,
3564 update->new_sha1,
3562 - update->lock, onerr);
3565 + update->lock, err, onerr);
3566 update->lock = NULL; /* freed by update_ref_write */
3567 if (ret)
3568 goto cleanup;