Skip to content

Commit a9a3e82

Browse files
committed
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>
1 parent 7eef32d commit a9a3e82

File tree

2 files changed

+27
-3
lines changed

2 files changed

+27
-3
lines changed

builtin-apply.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2296,7 +2296,8 @@ static int apply_data(struct patch *patch, struct stat *st, struct cache_entry *
22962296

22972297
strbuf_init(&buf, 0);
22982298

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)) {
23002301
if (tpatch == (struct patch *) -1) {
23012302
return error("patch %s has been renamed/deleted",
23022303
patch->old_name);
@@ -2375,7 +2376,7 @@ static int verify_index_match(struct cache_entry *ce, struct stat *st)
23752376
static int check_preimage(struct patch *patch, struct cache_entry **ce, struct stat *st)
23762377
{
23772378
const char *old_name = patch->old_name;
2378-
struct patch *tpatch;
2379+
struct patch *tpatch = NULL;
23792380
int stat_ret = 0;
23802381
unsigned st_mode = 0;
23812382

@@ -2389,7 +2390,9 @@ static int check_preimage(struct patch *patch, struct cache_entry **ce, struct s
23892390
return 0;
23902391

23912392
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) {
23932396
if (tpatch == (struct patch *) -1) {
23942397
return error("%s: has been deleted/renamed", old_name);
23952398
}
@@ -2399,6 +2402,7 @@ static int check_preimage(struct patch *patch, struct cache_entry **ce, struct s
23992402
if (stat_ret && errno != ENOENT)
24002403
return error("%s: %s", old_name, strerror(errno));
24012404
}
2405+
24022406
if (check_index && !tpatch) {
24032407
int pos = cache_name_pos(old_name, strlen(old_name));
24042408
if (pos < 0) {

t/t4112-apply-renames.sh

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ typedef struct __jmp_buf jmp_buf[1];
3636
3737
#endif /* _SETJMP_H */
3838
EOF
39+
cat >klibc/README <<\EOF
40+
This is a simple readme file.
41+
EOF
3942

4043
cat >patch <<\EOF
4144
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
113116
114117
-#endif /* _SETJMP_H */
115118
+#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.
116136
EOF
117137

118138
find klibc -type f -print | xargs git update-index --add --

0 commit comments

Comments
 (0)