@matheusbsbs / matheus-bagliano / commits / a9a3e82e6d
Fork 0

apply: fix copy/rename breakage

7ebd52a (Merge branch 'dz/apply-again', 2008-07-01) taught "git-apply" to grok a (non-git) patch that is a concatenation of separate patches that touch the same file number of times, by recording the postimage of patch application of previous round and using it as the preimage for later rounds. This "incremental" mode of patch application fundamentally contradicts with the way git rename/copy patches are designed. When a git patch talks about a file A getting modified, and a new file B created out of A, like this: diff --git a/A b/A --- a/A +++ b/A ... change text here ... diff --git a/A b/B copy from A copy to B --- a/A +++ b/B ... change text here ... the second change to produce B does not depend on what is done to A with the first change in any way. This is explicitly done so for reviewability of individual patches. With this commit, we do not look at 'fn_table' that records the postimage of previous round when applying a patch to produce a new file out of an existing file. Signed-off-by: Junio C Hamano <gitster@pobox.com>

Junio C Hamano committed Jul 9, 2008 at 19:58 UTC a9a3e82e6d0018ff42ec11fd9560c1ff47add824
2 files changed +27 -3
builtin-apply.c
+7 -3
@@ -2296,7 +2296,8 @@ static int apply_data(struct patch *patch, struct stat *st, struct cache_entry *
2296
2297 strbuf_init(&buf, 0);
2298
2299 - if ((tpatch = in_fn_table(patch->old_name)) != NULL) {
2299 + if (!(patch->is_copy || patch->is_rename) &&
2300 + ((tpatch = in_fn_table(patch->old_name)) != NULL)) {
2301 if (tpatch == (struct patch *) -1) {
2302 return error("patch %s has been renamed/deleted",
2303 patch->old_name);
@@ -2375,7 +2376,7 @@ static int verify_index_match(struct cache_entry *ce, struct stat *st)
2376 static int check_preimage(struct patch *patch, struct cache_entry **ce, struct stat *st)
2377 {
2378 const char *old_name = patch->old_name;
2378 - struct patch *tpatch;
2379 + struct patch *tpatch = NULL;
2380 int stat_ret = 0;
2381 unsigned st_mode = 0;
2382
@@ -2389,7 +2390,9 @@ static int check_preimage(struct patch *patch, struct cache_entry **ce, struct s
2390 return 0;
2391
2392 assert(patch->is_new <= 0);
2392 - if ((tpatch = in_fn_table(old_name)) != NULL) {
2393 +
2394 + if (!(patch->is_copy || patch->is_rename) &&
2395 + (tpatch = in_fn_table(old_name)) != NULL) {
2396 if (tpatch == (struct patch *) -1) {
2397 return error("%s: has been deleted/renamed", old_name);
2398 }
@@ -2399,6 +2402,7 @@ static int check_preimage(struct patch *patch, struct cache_entry **ce, struct s
2402 if (stat_ret && errno != ENOENT)
2403 return error("%s: %s", old_name, strerror(errno));
2404 }
2405 +
2406 if (check_index && !tpatch) {
2407 int pos = cache_name_pos(old_name, strlen(old_name));
2408 if (pos < 0) {
t/t4112-apply-renames.sh
+20
@@ -36,6 +36,9 @@ typedef struct __jmp_buf jmp_buf[1];
36
37 #endif /* _SETJMP_H */
38 EOF
39 +cat >klibc/README <<\EOF
40 +This is a simple readme file.
41 +EOF
42
43 cat >patch <<\EOF
44 diff --git a/klibc/arch/x86_64/include/klibc/archsetjmp.h b/include/arch/cris/klibc/archsetjmp.h
@@ -113,6 +116,23 @@ rename to include/arch/m32r/klibc/archsetjmp.h
116
117 -#endif /* _SETJMP_H */
118 +#endif /* _KLIBC_ARCHSETJMP_H */
119 +diff --git a/klibc/README b/klibc/README
120 +--- a/klibc/README
121 ++++ b/klibc/README
122 +@@ -1,1 +1,4 @@
123 + This is a simple readme file.
124 ++And we add a few
125 ++lines at the
126 ++end of it.
127 +diff --git a/klibc/README b/klibc/arch/README
128 +copy from klibc/README
129 +copy to klibc/arch/README
130 +--- a/klibc/README
131 ++++ b/klibc/arch/README
132 +@@ -1,1 +1,3 @@
133 + This is a simple readme file.
134 ++And we copy it to one level down, and
135 ++add a few lines at the end of it.
136 EOF
137
138 find klibc -type f -print | xargs git update-index --add --