Skip to content

Commit

Permalink
git-apply --reject: send rejects to .rej files.
Browse files Browse the repository at this point in the history
... just like everybody else does, instead of sending it to the standard
output, which was just silly.

Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Junio C Hamano committed Aug 18, 2006
1 parent 57dc397 commit 82e2765
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 49 deletions.
82 changes: 50 additions & 32 deletions builtin-apply.c
Original file line number Diff line number Diff line change
Expand Up @@ -2242,36 +2242,61 @@ static void write_out_one_result(struct patch *patch, int phase)

static int write_out_one_reject(struct patch *patch)
{
FILE *rej;
char namebuf[PATH_MAX];
struct fragment *frag;
int rejects = 0;
int cnt = 0;

for (rejects = 0, frag = patch->fragments; frag; frag = frag->next) {
for (cnt = 0, frag = patch->fragments; frag; frag = frag->next) {
if (!frag->rejected)
continue;
if (rejects == 0) {
rejects = 1;
printf("** Rejected hunk(s) for ");
if (patch->old_name && patch->new_name &&
strcmp(patch->old_name, patch->new_name)) {
write_name_quoted(NULL, 0,
patch->old_name, 1, stdout);
fputs(" => ", stdout);
write_name_quoted(NULL, 0,
patch->new_name, 1, stdout);
}
else {
const char *n = patch->new_name;
if (!n)
n = patch->old_name;
write_name_quoted(NULL, 0, n, 1, stdout);
}
printf(" **\n");
cnt++;
}

if (!cnt)
return 0;

/* This should not happen, because a removal patch that leaves
* contents are marked "rejected" at the patch level.
*/
if (!patch->new_name)
die("internal error");

cnt = strlen(patch->new_name);
if (ARRAY_SIZE(namebuf) <= cnt + 5) {
cnt = ARRAY_SIZE(namebuf) - 5;
fprintf(stderr,
"warning: truncating .rej filename to %.*s.rej",
cnt - 1, patch->new_name);
}
memcpy(namebuf, patch->new_name, cnt);
memcpy(namebuf + cnt, ".rej", 5);

rej = fopen(namebuf, "w");
if (!rej)
return error("cannot open %s: %s", namebuf, strerror(errno));

/* Normal git tools never deal with .rej, so do not pretend
* this is a git patch by saying --git nor give extended
* headers. While at it, maybe please "kompare" that wants
* the trailing TAB and some garbage at the end of line ;-).
*/
fprintf(rej, "diff a/%s b/%s\t(rejected hunks)\n",
patch->new_name, patch->new_name);
for (cnt = 0, frag = patch->fragments;
frag;
cnt++, frag = frag->next) {
if (!frag->rejected) {
fprintf(stderr, "Hunk #%d applied cleanly.\n", cnt);
continue;
}
printf("%.*s", frag->size, frag->patch);
fprintf(stderr, "Rejected hunk #%d.\n", cnt);
fprintf(rej, "%.*s", frag->size, frag->patch);
if (frag->patch[frag->size-1] != '\n')
putchar('\n');
fputc('\n', rej);
}
return rejects;
fclose(rej);
return -1;
}

static int write_out_results(struct patch *list, int skipped_patch)
Expand All @@ -2288,16 +2313,9 @@ static int write_out_results(struct patch *list, int skipped_patch)
while (l) {
if (l->rejected)
errs = 1;
else
else {
write_out_one_result(l, phase);
l = l->next;
}
}
if (apply_with_reject) {
l = list;
while (l) {
if (!l->rejected) {
if (write_out_one_reject(l))
if (phase == 1 && write_out_one_reject(l))
errs = 1;
}
l = l->next;
Expand Down
47 changes: 30 additions & 17 deletions t/t4117-apply-reject.sh
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,12 @@ test_expect_success setup '
echo $i
done >file1 &&
git diff >patch.1 &&
cat file1 >clean &&
for i in 1 E 2 3 4 5 6 7 8 9 10 11 12 C 13 14 15 16 17 18 19 20 F 21
do
echo $i
done >expected &&
mv file1 file2 &&
git update-index --add --remove file1 file2 &&
Expand Down Expand Up @@ -53,44 +59,51 @@ test_expect_success 'apply without --reject should fail' '

test_expect_success 'apply with --reject should fail but update the file' '
cat saved.file1 >file1
cat saved.file1 >file1 &&
rm -f file1.rej file2.rej &&
if git apply --reject patch.1 >rejects
if git apply --reject patch.1
then
echo "succeeds with --reject?"
exit 1
fi
cat rejects
for i in 1 E 2 3 4 5 6 7 8 9 10 11 12 C 13 14 15 16 17 18 19 20 F 21
do
echo $i
done >expected.file1 &&
diff -u file1 expected.file1
diff -u file1 expected &&
cat file1.rej &&
if test -f file2.rej
then
echo "file2 should not have been touched"
exit 1
fi
'

test_expect_success 'apply with --reject should fail but update the file' '
cat saved.file1 >file1
cat saved.file1 >file1 &&
rm -f file1.rej file2.rej file2 &&
if git apply --reject patch.2 >rejects
then
echo "succeeds with --reject?"
exit 1
fi
cat rejects
for i in 1 E 2 3 4 5 6 7 8 9 10 11 12 C 13 14 15 16 17 18 19 20 F 21
do
echo $i
done >expected.file2 &&
test -f file1 && {
echo "file1 still exists?"
exit 1
}
diff -u file2 expected.file2
diff -u file2 expected &&
cat file2.rej &&
if test -f file1.rej
then
echo "file2 should not have been touched"
exit 1
fi
'

test_done

0 comments on commit 82e2765

Please sign in to comment.