Ronnie Sahlberg wrote: > --- a/refs.c > +++ b/refs.c > @@ -3308,6 +3308,12 @@ struct ref_update { > const char refname[FLEX_ARRAY]; > }; > > +enum ref_transaction_status { > + REF_TRANSACTION_OPEN = 0, > + REF_TRANSACTION_CLOSED = 1, > + REF_TRANSACTION_ERROR = 2, What is the difference between _TRANSACTION_CLOSED and _TRANSACTION_ERROR? [...] > @@ -3340,6 +3347,11 @@ void ref_transaction_free(struct ref_transaction *transaction) > > void ref_transaction_rollback(struct ref_transaction *transaction) > { > + if (!transaction) > + return; > + > + transaction->status = REF_TRANSACTION_ERROR; > + > ref_transaction_free(transaction); Once the transaction is freed, transaction->status is not reachable any more so no one can tell that you've set it to _ERROR. What is the intended effect? [...] > @@ -3366,6 +3378,9 @@ int ref_transaction_update(struct ref_transaction *transaction, > if (have_old && !old_sha1) > die("BUG: have_old is true but old_sha1 is NULL"); > > + if (transaction->status != REF_TRANSACTION_OPEN) > + die("BUG: update on transaction that is not open"); Ok. [...] > @@ -3538,6 +3564,9 @@ int ref_transaction_commit(struct ref_transaction *transaction, > clear_loose_ref_cache(&ref_cache); > > cleanup: > + transaction->status = ret ? REF_TRANSACTION_ERROR > + : REF_TRANSACTION_CLOSED; Nit: odd use of whitespace. Overall thoughts: I like the idea of enforcing the API more strictly ("after an error, the only permitted operations are..."). The details leave me a little confused because I don't think anything is distinguishing between _CLOSED and _ERROR. Maybe the enum only needs two states. Thanks, Jonathan -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html