]> git.ipfire.org Git - thirdparty/git.git/commit
fast-export: fix regression skipping some merge-commits
authorMartin Ågren <martin.agren@gmail.com>
Fri, 20 Apr 2018 22:12:31 +0000 (00:12 +0200)
committerJunio C Hamano <gitster@pobox.com>
Sat, 21 Apr 2018 03:43:40 +0000 (12:43 +0900)
commitbe011bbe001facf71bd636494eb253aa5151d26a
treefd5252a98f4a1d79c5a73213edc6a88f0e4a1fc1
parentd32eb83c1db7d0a8bb54fe743c6d1dd674d372c5
fast-export: fix regression skipping some merge-commits

7199203937 (object_array: add and use `object_array_pop()`, 2017-09-23)
noted that the pattern `object = array.objects[--array.nr].item` could
be abstracted as `object = object_array_pop(&array)`.

Unfortunately, one of the conversions was horribly wrong. Between
grabbing the last object (i.e., peeking at it) and decreasing the object
count, the original code would sometimes return early. The updated code
on the other hand, will always pop the last element, then maybe do the
early return without doing anything with the object.

The end result is that merge commits where all the parents have still
not been exported will simply be dropped, meaning that they will be
completely missing from the exported data.

Re-add a commit when it is not yet time to handle it. An alternative
that was considered was to peek-then-pop. That carries some risk with it
since the peeking and popping need to act on the same object, in a
concerted fashion.

Add a test that would have caught this.

Reported-by: Isaac Chou <Isaac.Chou@microfocus.com>
Analyzed-by: Isaac Chou <Isaac.Chou@microfocus.com>
Helped-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Martin Ågren <martin.agren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/fast-export.c
t/t9350-fast-export.sh