diff -up ./builtin/apply.c.original ./builtin/apply.c
--- ./builtin/apply.c.original 2023-05-18 14:44:01.287997256 +0900
+++ ./builtin/apply.c 2023-05-18 14:44:45.513756974 +0900
@@ -4151,7 +4151,7 @@ static int write_out_one_reject(struct p
FILE *rej;
char namebuf[PATH_MAX];
struct fragment *frag;
- int cnt = 0;
+ int fd, cnt = 0;
struct strbuf sb = STRBUF_INIT;
for (cnt = 0, frag = patch->fragments; frag; frag = frag->next) {
@@ -4190,7 +4190,17 @@ static int write_out_one_reject(struct p
memcpy(namebuf, patch->new_name, cnt);
memcpy(namebuf + cnt, ".rej", 5);
- rej = fopen(namebuf, "w");
+ fd = open(namebuf, O_CREAT | O_EXCL | O_WRONLY, 0666);
+ if (fd < 0) {
+ if (errno != EEXIST)
+ die_errno(_("cannot open %s"), namebuf);
+ if (unlink(namebuf))
+ die_errno(_("cannot unlink '%s'"), namebuf);
+ fd = open(namebuf, O_CREAT | O_EXCL | O_WRONLY, 0666);
+ if (fd < 0)
+ die_errno(_("cannot open %s"), namebuf);
+ }
+ rej = fdopen(fd, "w");
if (!rej)
return error(_("cannot open %s: %s"), namebuf, strerror(errno));
diff -up ./t/t4115-apply-symlink.sh.original ./t/t4115-apply-symlink.sh
--- ./t/t4115-apply-symlink.sh.original 2023-05-18 14:45:50.675876356 +0900
+++ ./t/t4115-apply-symlink.sh 2023-05-18 14:46:42.075759315 +0900
@@ -46,4 +46,19 @@ test_expect_success SYMLINKS 'apply --in
'
+test_expect_success SYMLINKS '--reject removes .rej symlink if it exists' '
+ test_when_finished "git reset --hard && git clean -dfx" &&
+
+ test_commit file &&
+ echo modified >file.t &&
+ git diff -- file.t >patch &&
+ echo modified-again >file.t &&
+
+ ln -s foo file.t.rej &&
+ test_must_fail git apply patch --reject 2>err &&
+ test_i18ngrep "Rejected hunk" err &&
+ test_path_is_missing foo &&
+ test_path_is_file file.t.rej
+'
+
test_done