commit: avoid race when creating orphan commits

If HEAD doesn't point at anything during the initial check, then we should make sure that it *still* doesn't point at anything when we are ready to update the reference. Otherwise, another process might commit while we are working (e.g., while we are waiting for the user to edit the commit message) and we will silently overwrite it. This fixes a failing test in t7516. Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu> Reviewed-by: Stefan Beller <sbeller@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Michael Haggerty committed Feb 17, 2015 at 18:00 UTC a933c23e66265eedf822535ac56fcdb4ecb07a8c
2 files changed +2 -2
builtin/commit.c
+1 -1
@@ -1766,7 +1766,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
1766 if (!transaction ||
1767 ref_transaction_update(transaction, "HEAD", sha1,
1768 current_head
1769 - ? current_head->object.sha1 : NULL,
1769 + ? current_head->object.sha1 : null_sha1,
1770 0, sb.buf, &err) ||
1771 ref_transaction_commit(transaction, &err)) {
1772 rollback_index_files();
t/t7516-commit-races.sh
+1 -1
@@ -3,7 +3,7 @@
3 test_description='git commit races'
4 . ./test-lib.sh
5
6 -test_expect_failure 'race to create orphan commit' '
6 +test_expect_success 'race to create orphan commit' '
7 write_script hare-editor <<-\EOF &&
8 git commit --allow-empty -m hare
9 EOF