fetch.c: change s_update_ref to use a ref transaction
Change s_update_ref to use a ref transaction for the ref update. Signed-off-by: Ronnie Sahlberg <sahlberg@google.com> Signed-off-by: Jonathan Nieder <jrnieder@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
28e6a97e39
commit
cd94f76572
@ -404,23 +404,37 @@ static int s_update_ref(const char *action,
|
|||||||
{
|
{
|
||||||
char msg[1024];
|
char msg[1024];
|
||||||
char *rla = getenv("GIT_REFLOG_ACTION");
|
char *rla = getenv("GIT_REFLOG_ACTION");
|
||||||
static struct ref_lock *lock;
|
struct ref_transaction *transaction;
|
||||||
|
struct strbuf err = STRBUF_INIT;
|
||||||
|
int ret, df_conflict = 0;
|
||||||
|
|
||||||
if (dry_run)
|
if (dry_run)
|
||||||
return 0;
|
return 0;
|
||||||
if (!rla)
|
if (!rla)
|
||||||
rla = default_rla.buf;
|
rla = default_rla.buf;
|
||||||
snprintf(msg, sizeof(msg), "%s: %s", rla, action);
|
snprintf(msg, sizeof(msg), "%s: %s", rla, action);
|
||||||
lock = lock_any_ref_for_update(ref->name,
|
|
||||||
check_old ? ref->old_sha1 : NULL,
|
transaction = ref_transaction_begin(&err);
|
||||||
0, NULL);
|
if (!transaction ||
|
||||||
if (!lock)
|
ref_transaction_update(transaction, ref->name, ref->new_sha1,
|
||||||
return errno == ENOTDIR ? STORE_REF_ERROR_DF_CONFLICT :
|
ref->old_sha1, 0, check_old, msg, &err))
|
||||||
STORE_REF_ERROR_OTHER;
|
goto fail;
|
||||||
if (write_ref_sha1(lock, ref->new_sha1, msg) < 0)
|
|
||||||
return errno == ENOTDIR ? STORE_REF_ERROR_DF_CONFLICT :
|
ret = ref_transaction_commit(transaction, &err);
|
||||||
STORE_REF_ERROR_OTHER;
|
if (ret) {
|
||||||
|
df_conflict = (ret == TRANSACTION_NAME_CONFLICT);
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
ref_transaction_free(transaction);
|
||||||
|
strbuf_release(&err);
|
||||||
return 0;
|
return 0;
|
||||||
|
fail:
|
||||||
|
ref_transaction_free(transaction);
|
||||||
|
error("%s", err.buf);
|
||||||
|
strbuf_release(&err);
|
||||||
|
return df_conflict ? STORE_REF_ERROR_DF_CONFLICT
|
||||||
|
: STORE_REF_ERROR_OTHER;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define REFCOL_WIDTH 10
|
#define REFCOL_WIDTH 10
|
||||||
|
Loading…
Reference in New Issue
Block a user