[PATCH] receive-pack: refuse all commands if one fails in atomic mode

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This patch will be incorporated into the right places in v3 of the series.

Signed-off-by: Stefan Beller <sbeller@xxxxxxxxxx>
---

Notes:
    I don't want to resend the patch series today to accumulate comments,
    but this makes the last test pass, which is the whole point of the series.
    
    I'll put it into the right places in a reroll.

 builtin/receive-pack.c | 13 ++++++++++++-
 t/t5543-atomic-push.sh |  2 +-
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c
index 0803fd2..3477f7c 100644
--- a/builtin/receive-pack.c
+++ b/builtin/receive-pack.c
@@ -1122,7 +1122,18 @@ static void execute_commands(struct command *commands,
 	}
 
 	if (use_atomic) {
-		if (ref_transaction_commit(transaction, &err)) {
+		/* update(...) may abort early (i.e. because the hook refused to
+		 * update that ref), which then doesn't even record a transaction
+		 * regarding that ref. Make sure all commands are without error
+		 * and then commit atomically. */
+		for (cmd = commands; cmd; cmd = cmd->next)
+			if (cmd->error_string)
+				break;
+		if (cmd) {
+			for (cmd = commands; cmd; cmd = cmd->next)
+				if (!cmd->error_string)
+					cmd->error_string = "atomic push failure";
+		} else if (ref_transaction_commit(transaction, &err)) {
 			rp_error("%s", err.buf);
 			for (cmd = commands; cmd; cmd = cmd->next)
 				cmd->error_string = err.buf;
diff --git a/t/t5543-atomic-push.sh b/t/t5543-atomic-push.sh
index 6354fc0..f0e54d9 100755
--- a/t/t5543-atomic-push.sh
+++ b/t/t5543-atomic-push.sh
@@ -142,7 +142,7 @@ test_expect_success 'atomic push fails if one tag fails remotely' '
 	test_ref_upstream second $(git -C workbench rev-parse --verify HEAD@{1})
 '
 
-test_expect_failure 'atomic push obeys update hook preventing a branch to be pushed' '
+test_expect_success 'atomic push obeys update hook preventing a branch to be pushed' '
 	mk_repo_pair &&
 	(
 		cd workbench &&
-- 
2.2.0.31.gad78000.dirty

--
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




[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]