Am 27.02.2017 um 21:04 schrieb Junio C Hamano:
René Scharfe <[email protected]> writes:diff --git a/apply.c b/apply.c index cbf7cc7f2..9219d2737 100644 --- a/apply.c +++ b/apply.c @@ -3652,7 +3652,6 @@ static int check_preimage(struct apply_state *state, if (!old_name) return 0; - assert(patch->is_new <= 0);5c47f4c6 (builtin-apply: accept patch to an empty file) added that line. Its intent was to handle diffs that contain an old name even for a file that's created. Citing from its commit message: "When we cannot be sure by parsing the patch that it is not a creation patch, we shouldn't complain when if there is no such a file." Why not stop complaining also in case we happen to know for sure that it's a creation patch? I.e., why not replace the assert() with: if (patch->is_new == 1) goto is_new;previous = previous_patch(state, patch, &status);When the caller does know is_new is true, old_name must be made/left NULL. That is the invariant this assert is checking to catch an error in the calling code.
There are some places in apply.c that set ->is_new to 1, but none of them set ->old_name to NULL at the same time.
Having to keep these two members in sync sounds iffy anyway. Perhaps accessors can help, e.g. a setter which frees old_name when is_new is set to 1, or a getter which returns NULL for old_name if is_new is 1.
René

