Thread (2 messages) 2 messages, 2 authors, 2017-02-27

Re: [PATCH 2/2] apply: handle assertion failure gracefully

From: René Scharfe <hidden>
Date: 2017-02-27 22:20:39

Am 27.02.2017 um 21:04 schrieb Junio C Hamano:
René Scharfe [off-list ref] writes:
quoted
quoted
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;
quoted
 	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é
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help