Re: [PATCH 2/2] apply: handle assertion failure gracefully
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Feb 27, 2017, 22:33 UTC
- Message-ID
- <xmqq1sujnu1g.fsf@gitster.mtv.corp.google.com>
- In-Reply-To
- <f191e3a8-a55b-7030-ebbb-3f46c74fdc94@web.de>
René Scharfe <l.s.r@web.de> writes:
Show 32 quoted lines
> Am 27.02.2017 um 21:04 schrieb Junio C Hamano: >> René Scharfe <l.s.r@web.de> 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.
I thought all of these are flipping ->is_new that used to be -1 (unknown) to (now we know it is new), and sets only new_name without doing anything to old_name, because they know originally both names are set to NULL.
> 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.
Definitely, the setter would make it harder to make the mistake.