From: Stefan Beller <sbeller@google.com>
To: gitster@pobox.com, mhagger@alum.mit.edu, peff@peff.net,
git@vger.kernel.org, loic@dachary.org
Cc: Stefan Beller <sbeller@google.com>
Subject: [PATCH] refs.c: clean up write_ref_sha1 returns
Date: Mon, 26 Jan 2015 13:10:38 -0800 [thread overview]
Message-ID: <1422306638-23785-1-git-send-email-sbeller@google.com> (raw)
In-Reply-To: <CAGZ79kbQiVQJyZC8mKaSUnOpY6YJc0TYdX=msuZDXLd7DxmTmQ@mail.gmail.com>
write_ref_sha1 now either returns 0 for a successful write or !=0 if an
error occurred. This cleanup results in cleaning the code at other places
as well where we had to set force_write to make the write_ref_sha1(...)
|| commit_ref(...) combination work. Also the checks for the optimisation
of old and new sha1 values being the same has been moved to a helper
function so that check is not part of write_ref_sha1 or commit_ref any
more.
Signed-off-by: Stefan Beller <sbeller@google.com>
---
Notes:
v1:
applies on top of origin/sb/atomic-push-fix (79370dd9656)
This undoes some of the changes of previous patches
such as removing the check if old and new sha1 are equal
and not being forced to rewrite the value.
Junio, I think this patch adresses the concerns you raised.
I can redo the atomic-push-fix series with this cleanup merged
into the appropriate patches or you could just queue it on top
of said series.
refs.c | 27 +++++++++++++++------------
1 file changed, 15 insertions(+), 12 deletions(-)
diff --git a/refs.c b/refs.c
index 2594b23..c8fd4a4 100644
--- a/refs.c
+++ b/refs.c
@@ -2817,9 +2817,6 @@ static int close_ref(struct ref_lock *lock)
static int commit_ref(struct ref_lock *lock, const unsigned char *sha1)
{
- if (!lock->force_write && !hashcmp(lock->old_sha1, sha1))
- return 0;
-
if (commit_lock_file(lock->lk))
return -1;
return 0;
@@ -2880,7 +2877,6 @@ int rename_ref(const char *oldrefname, const char *newrefname, const char *logms
error("unable to lock %s for update", newrefname);
goto rollback;
}
- lock->force_write = 1;
hashcpy(lock->old_sha1, orig_sha1);
if (write_ref_sha1(lock, orig_sha1, logmsg)
|| commit_ref(lock, orig_sha1)) {
@@ -2899,7 +2895,6 @@ int rename_ref(const char *oldrefname, const char *newrefname, const char *logms
goto rollbacklog;
}
- lock->force_write = 1;
flag = log_all_ref_updates;
log_all_ref_updates = 0;
if (write_ref_sha1(lock, orig_sha1, NULL)
@@ -3062,12 +3057,22 @@ int is_branch(const char *refname)
return !strcmp(refname, "HEAD") || starts_with(refname, "refs/heads/");
}
+static int should_write_ref_sha1(struct ref_lock *lock,
+ const unsigned char *new_sha1)
+{
+ /* If the old and new sha1 are equal only write if forced to. */
+ if (!lock->force_write && !hashcmp(lock->old_sha1, new_sha1))
+ return 0;
+ /* null sha indicates deletion, so don't write it */
+ return !is_null_sha1(new_sha1);
+}
+
/*
* Write sha1 into the ref specified by the lock. Make sure that errno
* is sane on error.
*/
-static int write_ref_sha1(struct ref_lock *lock,
- const unsigned char *sha1, const char *logmsg)
+static int write_ref_sha1(struct ref_lock *lock, const unsigned char *sha1,
+ const char *logmsg)
{
static char term = '\n';
struct object *o;
@@ -3076,8 +3081,6 @@ static int write_ref_sha1(struct ref_lock *lock,
errno = EINVAL;
return -1;
}
- if (!lock->force_write && !hashcmp(lock->old_sha1, sha1))
- return 0;
o = parse_object(sha1);
if (!o) {
@@ -3752,7 +3755,7 @@ int ref_transaction_commit(struct ref_transaction *transaction,
update->refname);
goto cleanup;
}
- if (!is_null_sha1(update->new_sha1)) {
+ if (should_write_ref_sha1(update->lock, update->new_sha1)) {
if (write_ref_sha1(update->lock, update->new_sha1,
update->msg)) {
strbuf_addf(err, "Cannot write to the ref lock '%s'.",
@@ -3769,7 +3772,7 @@ int ref_transaction_commit(struct ref_transaction *transaction,
for (i = 0; i < n; i++) {
struct ref_update *update = updates[i];
- if (!is_null_sha1(update->new_sha1)) {
+ if (should_write_ref_sha1(update->lock, update->new_sha1)) {
if (commit_ref(update->lock, update->new_sha1)) {
strbuf_addf(err, "Cannot update the ref '%s'.",
update->refname);
@@ -3785,7 +3788,7 @@ int ref_transaction_commit(struct ref_transaction *transaction,
for (i = 0; i < n; i++) {
struct ref_update *update = updates[i];
- if (update->lock) {
+ if (is_null_sha1(update->new_sha1)) {
if (delete_ref_loose(update->lock, update->type, err)) {
ret = TRANSACTION_GENERIC_ERROR;
goto cleanup;
--
2.2.1.62.g3f15098
next prev parent reply other threads:[~2015-01-26 21:10 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-01-22 2:32 [PATCHv2 0/5] Fix bug in large transactions Stefan Beller
2015-01-22 2:32 ` [PATCHv2 1/5] update-ref: test handling large transactions properly Stefan Beller
2015-01-22 10:54 ` Michael Haggerty
2015-01-22 13:07 ` Jeff King
2015-01-22 2:32 ` [PATCHv2 2/5] t7004: rename ULIMIT test prerequisite to ULIMIT_STACK_SIZE Stefan Beller
2015-01-22 2:32 ` [PATCHv2 3/5] refs.c: remove lock_fd from struct ref_lock Stefan Beller
2015-01-22 2:32 ` [PATCHv2 4/5] refs.c: have a write_sha1_to_lock_file wrapper Stefan Beller
2015-01-22 2:32 ` [PATCHv2 5/5] refs.c: enable large transactions Stefan Beller
2015-01-22 11:24 ` Michael Haggerty
2015-01-22 13:10 ` Jeff King
2015-01-22 16:33 ` Michael Haggerty
2015-01-22 19:24 ` Stefan Beller
2015-01-22 23:11 ` [RFC PATCH 0/5] So you dislike the sequence of system calls? Stefan Beller
2015-01-22 23:11 ` [PATCH 1/5] fixup for "refs.c: enable large transactions" Stefan Beller
2015-01-22 23:11 ` [PATCH 2/5] refs.c: remove unlock_ref from write_ref_sha1 Stefan Beller
2015-01-22 23:11 ` [PATCH 3/5] refs.c: move static functions to close and commit refs Stefan Beller
2015-01-22 23:11 ` [PATCH 4/5] refs.c: remove committing the ref from write_ref_sha1 Stefan Beller
2015-01-22 23:11 ` [PATCH 5/5] refs.c: write values to lock files early for committing Stefan Beller
2015-01-22 12:59 ` [PATCHv2 5/5] refs.c: enable large transactions Ramsay Jones
2015-01-22 19:16 ` Stefan Beller
2015-01-22 19:51 ` Ramsay Jones
2015-01-22 20:13 ` Ramsay Jones
2015-01-22 20:20 ` Stefan Beller
2015-01-22 20:59 ` Ramsay Jones
2015-01-22 12:05 ` [PATCHv2 0/5] Fix bug in " Michael Haggerty
2015-01-23 20:03 ` [PATCHv3 0/6] " Stefan Beller
2015-01-23 20:03 ` [PATCHv3 1/6] update-ref: test handling large transactions properly Stefan Beller
2015-01-23 20:03 ` [PATCHv3 2/6] t7004: rename ULIMIT test prerequisite to ULIMIT_STACK_SIZE Stefan Beller
2015-01-23 20:03 ` [PATCHv3 3/6] refs.c: remove lock_fd from struct ref_lock Stefan Beller
2015-01-23 20:04 ` [PATCHv3 4/6] refs.c: move static functions to close and commit refs Stefan Beller
2015-01-23 20:04 ` [PATCHv3 5/6] refs.c: remove unlock_ref and commit_ref from write_ref_sha1 Stefan Beller
2015-01-23 23:57 ` Junio C Hamano
2015-01-24 0:22 ` Stefan Beller
2015-01-24 0:39 ` Junio C Hamano
2015-01-24 1:04 ` Stefan Beller
2015-01-24 1:29 ` Junio C Hamano
2015-01-23 20:04 ` [PATCHv3 6/6] refs.c: enable large transactions Stefan Beller
2015-01-24 0:14 ` Junio C Hamano
2015-01-24 0:24 ` Stefan Beller
2015-01-24 0:38 ` Junio C Hamano
2015-01-26 19:30 ` Stefan Beller
2015-01-26 21:10 ` Stefan Beller [this message]
2015-01-27 3:22 ` [PATCH] refs.c: clean up write_ref_sha1 returns Junio C Hamano
2015-01-28 21:35 ` Stefan Beller
2015-01-27 3:17 ` [PATCHv3 6/6] refs.c: enable large transactions Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1422306638-23785-1-git-send-email-sbeller@google.com \
--to=sbeller@google.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=loic@dachary.org \
--cc=mhagger@alum.mit.edu \
--cc=peff@peff.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).