All of lore.kernel.org
 help / color / mirror / Atom feed
From: Li Chen <me@linux.beauty>
To: "phillipwood" <phillip.wood@dunelm.org.uk>,
	"git" <git@vger.kernel.org>, "Junio C Hamano" <gitster@pobox.com>,
	"Kristoffer Haugsbakk" <kristofferhaugsbakk@fastmail.com>
Subject: [PATCH v5 08/29] trailer: handle trailer append failures gently
Date: Wed, 22 Oct 2025 13:39:28 +0800	[thread overview]
Message-ID: <20251022053951.602605-9-me@linux.beauty> (raw)
In-Reply-To: <20251022053951.602605-1-me@linux.beauty>

Added write_file_buf_gently so callers can rewrite
files while surfacing errors instead of aborting.

Updated amend_file_with_trailers to release buffers
and propagate trailer and write failures back to the caller,
because amend_file_with_trailers shuold not die.

Signed-off-by: Li Chen <chenl311@chinatelecom.cn>
---
 trailer.c | 14 ++++++++++----
 wrapper.c | 16 ++++++++++++++++
 wrapper.h |  6 ++++++
 3 files changed, 32 insertions(+), 4 deletions(-)

diff --git a/trailer.c b/trailer.c
index ac6ac2ac20..1f317f4d37 100644
--- a/trailer.c
+++ b/trailer.c
@@ -9,6 +9,7 @@
 #include "commit.h"
 #include "trailer.h"
 #include "list.h"
+#include "wrapper.h"
 /*
  * Copyright (c) 2013, 2014 Christian Couder <chriscool@tuxfamily.org>
  */
@@ -1308,11 +1309,16 @@ int amend_file_with_trailers(const char *path,
 	if (strbuf_read_file(&buf, path, 0) < 0)
 		return error_errno("could not read '%s'", path);
 
-	if (amend_strbuf_with_trailers(&buf, trailer_args))
-		die("failed to append trailers");
+	if (amend_strbuf_with_trailers(&buf, trailer_args)) {
+		strbuf_release(&buf);
+		return error("failed to append trailers");
+	}
+
+	if (write_file_buf_gently(path, buf.buf, buf.len)) {
+		strbuf_release(&buf);
+		return -1;
+	}
 
-	/* `write_file_buf()` aborts on error internally */
-	write_file_buf(path, buf.buf, buf.len);
 	strbuf_release(&buf);
 	return 0;
 }
diff --git a/wrapper.c b/wrapper.c
index 3d507d4204..1f12dbb2fa 100644
--- a/wrapper.c
+++ b/wrapper.c
@@ -688,6 +688,22 @@ void write_file_buf(const char *path, const char *buf, size_t len)
 		die_errno(_("could not close '%s'"), path);
 }
 
+int write_file_buf_gently(const char *path, const char *buf, size_t len)
+{
+	int fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0666);
+
+	if (fd < 0)
+		return error_errno(_("could not open '%s'"), path);
+	if (write_in_full(fd, buf, len) < 0) {
+		int ret = error_errno(_("could not write to '%s'"), path);
+		close(fd);
+		return ret;
+	}
+	if (close(fd))
+		return error_errno(_("could not close '%s'"), path);
+	return 0;
+}
+
 void write_file(const char *path, const char *fmt, ...)
 {
 	va_list params;
diff --git a/wrapper.h b/wrapper.h
index 44a8597ac3..e5f867b200 100644
--- a/wrapper.h
+++ b/wrapper.h
@@ -56,6 +56,12 @@ static inline ssize_t write_str_in_full(int fd, const char *str)
  */
 void write_file_buf(const char *path, const char *buf, size_t len);
 
+/**
+ * Like write_file_buf(), but report errors instead of exiting. Returns 0 on
+ * success or a negative value on error after emitting a message.
+ */
+int write_file_buf_gently(const char *path, const char *buf, size_t len);
+
 /**
  * Like write_file_buf(), but format the contents into a buffer first.
  * Additionally, write_file() will append a newline if one is not already
-- 
2.51.0


  parent reply	other threads:[~2025-10-22  5:41 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-10-22  5:39 [PATCH v5 00/29] rebase: support --trailer Li Chen
2025-10-22  5:39 ` [PATCH v5 01/29] trailer: append trailers in-process and drop the fork to `interpret-trailers` Li Chen
2025-10-23 13:21   ` Phillip Wood
2025-11-04 11:53     ` Li Chen
2025-10-22  5:39 ` [PATCH v5 02/29] trailer: restore interpret_trailers helper Li Chen
2025-10-22  5:39 ` [PATCH v5 03/29] trailer: drop --trailer prefix handling in amend helper Li Chen
2025-10-22  5:39 ` [PATCH v5 04/29] trailer: move config_head and arg_head to if storage Li Chen
2025-10-22  5:39 ` [PATCH v5 05/29] trailer: use bool for had_trailer_before Li Chen
2025-10-22  5:39 ` [PATCH v5 06/29] interpret-trailers: buffer stdout output Li Chen
2025-10-22  5:39 ` [PATCH v5 07/29] trailer: mirror interpret-trailers output flow Li Chen
2025-10-22  5:39 ` Li Chen [this message]
2025-10-22  5:39 ` [PATCH v5 09/29] rebase: support --trailer Li Chen
2025-10-23 13:21   ` Phillip Wood
2025-10-22  5:39 ` [PATCH v5 10/29] rebase: inline trailer state paths Li Chen
2025-10-22  5:39 ` [PATCH v5 11/29] rebase: reuse buffer for trailer args Li Chen
2025-10-22  5:39 ` [PATCH v5 12/29] rebase: drop redundant strbuf_release call Li Chen
2025-10-22  5:39 ` [PATCH v5 13/29] rebase: skip stripping of --trailer option prefix Li Chen
2025-10-22  5:39 ` [PATCH v5 14/29] rebase: die on invalid trailer args Li Chen
2025-10-22  5:39 ` [PATCH v5 15/29] rebase: validate trailers with configured separators Li Chen
2025-10-22  5:39 ` [PATCH v5 16/29] sequencer: add trailers to message before writing file Li Chen
2025-10-22  5:39 ` [PATCH v5 17/29] t3440: create expect files at point of use Li Chen
2025-10-22  5:39 ` [PATCH v5 18/29] t3440: check apply backend error includes option Li Chen
2025-10-22  5:39 ` [PATCH v5 19/29] t3440: use test_commit_message for trailer checks Li Chen
2025-10-22  5:39 ` [PATCH v5 20/29] t3440: drop redundant resets and pass branch to rebase where needed Li Chen
2025-10-22  5:39 ` [PATCH v5 21/29] t3440: assert trailer on HEAD after conflict rebase Li Chen
2025-10-22  5:39 ` [PATCH v5 22/29] rebase: persist --trailer options across restarts Li Chen
2025-10-22  5:39 ` [PATCH v5 23/29] t3440: remove redundant --keep-empty Li Chen
2025-10-22  5:39 ` [PATCH v5 24/29] t3440: use helper for trailer checks Li Chen
2025-10-22  5:39 ` [PATCH v5 25/29] t3440: test --trailer without values Li Chen
2025-10-22  5:39 ` [PATCH v5 26/29] t3440: convert ex.com to example.com Li Chen
2025-10-22  5:39 ` [PATCH v5 27/29] t3440: ensure trailers persist after rebase continue Li Chen
2025-10-22  5:39 ` [PATCH v5 28/29] t3440: exercise trailer config mapping Li Chen
2025-10-22  5:39 ` [PATCH v5 29/29] sequencer: honor --trailer with fixup -C Li Chen

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=20251022053951.602605-9-me@linux.beauty \
    --to=me@linux.beauty \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=kristofferhaugsbakk@fastmail.com \
    --cc=phillip.wood@dunelm.org.uk \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.