When the --check option was used with multiple patch files which modify the same files, the patch can fail because the previously modified contents aren't written to the disk.
So save the in memory patch contents across the processing of multiple patch files. Added a new test case for --check with multiple patch files. Signed-off-by: Robert Fitzsimons <[EMAIL PROTECTED]> --- apply.c | 10 ++++- t/t4105-apply-check.sh | 89 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 t/t4105-apply-check.sh 797cc1bdcc647b9fb744784969c814145803407d diff --git a/apply.c b/apply.c --- a/apply.c +++ b/apply.c @@ -1439,13 +1439,16 @@ static int use_patch(struct patch *p) return 1; } +struct patch *master_list = NULL; +struct patch *master_list_prev = NULL; + static int apply_patch(int fd) { int newfd; unsigned long offset, size; char *buffer = read_patch_file(fd, &size); - struct patch *list = NULL, **listp = &list; - struct patch *list_prev = NULL; + struct patch *list = master_list, **listp = &list; + struct patch *list_prev = master_list_prev; int skipped_patch = 0; if (!buffer) @@ -1504,6 +1507,9 @@ static int apply_patch(int fd) if (summary) summary_patch_list(list); + master_list = list; + master_list_prev = list_prev; + free(buffer); return 0; } diff --git a/t/t4105-apply-check.sh b/t/t4105-apply-check.sh new file mode 100644 --- /dev/null +++ b/t/t4105-apply-check.sh @@ -0,0 +1,89 @@ +#!/bin/sh +# +# Copyright (c) 2005 Junio C Hamano +# Copyright (c) 2005 Robert Fitzsimons +# + +test_description='git-apply --check with multiple files. + +' +. ./test-lib.sh + +# setup + +cat > patch1.patch <<\EOF +diff --git a/main.c b/main.c +new file mode 100644 +--- /dev/null ++++ b/main.c +@@ -0,0 +1,23 @@ ++#include <stdio.h> ++ ++void print_int(int num); ++int func(int num); ++ ++int main() { ++ int i; ++ ++ for (i = 0; i < 10; i++) { ++ print_int(func(i)); ++ } ++ ++ return 0; ++} ++ ++int func(int num) { ++ return num * num; ++} ++ ++void print_int(int num) { ++ printf("%d", num); ++} ++ +EOF +cat > patch2.patch <<\EOF +diff --git a/main.c b/main.c +--- a/main.c ++++ b/main.c +@@ -10,6 +10,8 @@ + print_int(func(i)); + } + ++ printf("\n"); ++ + return 0; + } + +EOF +cat > patch3.patch <<\EOF +diff --git a/main.c b/main.c +--- a/main.c ++++ b/main.c +@@ -18,6 +20,6 @@ + } + + void print_int(int num) { +- printf("%d", num); ++ printf("%d ", num); + } + +EOF + +test_expect_success "S = test 1 (files)" \ + 'git-apply patch1.patch patch2.patch patch3.patch' +rm -f main.c + +test_expect_success "S = test 2 (files --check)" \ + 'git-apply --check patch1.patch patch2.patch patch3.patch' +rm -f main.c + +test_expect_success "S = test 3 (stdin)" \ + 'cat patch1.patch patch2.patch patch3.patch | git-apply' +rm -f main.c + +test_expect_success "S = test 4 (stdin --check)" \ + 'cat patch1.patch patch2.patch patch3.patch | git-apply --check' +rm -f main.c + +test_done + - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html