• Björn Gustavsson's avatar
    apply: Remove the quick rejection test · 24ff4d56
    Björn Gustavsson authored
    In the next commit, we will make it possible for blank context
    lines to match beyond the end of the file. That means that a hunk
    with a preimage that has more lines than present in the file may
    be possible to successfully apply. Therefore, we must remove
    the quick rejection test in find_pos().
    
    find_pos() will already work correctly without the quick
    rejection test, but that might not be obvious. Therefore,
    comment the test for handling out-of-range line numbers in
    find_pos() and cast the "line" variable to the same (unsigned)
    type as img->nr.
    
    What are performance implications of removing the quick
    rejection test?
    
    It can only help "git apply" to reject a patch faster. For example,
    if I have a file with one million lines and a patch that removes
    slightly more than 50 percent of the lines and try to apply that
    patch twice, the second attempt will fail slightly faster
    with the test than without (based on actual measurements).
    
    However, there is the pathological case of a patch with many
    more context lines than the default three, and applying that patch
    using "git apply -C1". Without the rejection test, the running
    time will be roughly proportional to the number of context lines
    times the size of the file. That could be handled by writing
    a more complicated rejection test (it would have to count the
    number of blanks at the end of the preimage), but I don't find
    that worth doing until there is a real-world use case that
    would benfit from it.
    
    It would be possible to keep the quick rejection test if
    --whitespace=fix is not given, but I don't like that from
    a testing point of view.
    Signed-off-by: default avatarBjörn Gustavsson <bgustavsson@gmail.com>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    24ff4d56
t4104-apply-boundary.sh 2.87 KB