ronisbr / TerminalPager.jl

Pure Julia implementation of the command less
MIT License
116 stars 8 forks source link

Pager crashes when searching for non-existent pattern under certain conditions #12

Closed DimitarVanguelov closed 3 years ago

DimitarVanguelov commented 3 years ago

When searching for a pattern that does not appear in the pager output, after having just searched for a pattern, pager crashes.

To replicate the issue, construct a random matrix and pipe into pager:

rand(100, 100) |> pager

Once in pager mode, search for a pattern that you see (e.g. / 0.7). All instances of that pattern will be highlighted, and something like (match 1 of 1464) 41% will appear on the bottom right. If you hit escape at this point, there is no issue. However, if you search for another pattern and that pattern does not exist (e.g. /.123456), while the search results from the previous search are still shown, pager will crash with the following stacktrace:

ERROR: BoundsError: attempt to access 0-element Vector{Tuple{Int64, Int64, Int64}} at index [1]
Stacktrace:
  [1] getindex
    @ ./array.jl:801 [inlined]
  [2] _move_view_to_match!
    @ ~/.julia/packages/TerminalPager/C06ZN/src/search.jl:109 [inlined]
  [3] _pager_event_process!(pagerd::TerminalPager.Pager)
    @ TerminalPager ~/.julia/packages/TerminalPager/C06ZN/src/pager.jl:313
  [4] _pager!(term::REPL.Terminals.TTYTerminal, str::String; freeze_columns::Int64, freeze_rows::Int64, change_freeze::Bool, hashelp::Bool)
    @ TerminalPager ~/.julia/packages/TerminalPager/C06ZN/src/pager.jl:130
  [5] _pager!
    @ ~/.julia/packages/TerminalPager/C06ZN/src/pager.jl:80 [inlined]
  [6] _pager(str::String; kwargs::Base.Iterators.Pairs{Union{}, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ TerminalPager ~/.julia/packages/TerminalPager/C06ZN/src/pager.jl:59
  [7] _pager
    @ ~/.julia/packages/TerminalPager/C06ZN/src/pager.jl:53 [inlined]
  [8] #pager#28
    @ ~/.julia/packages/TerminalPager/C06ZN/src/TerminalPager.jl:49 [inlined]
  [9] pager
    @ ~/.julia/packages/TerminalPager/C06ZN/src/TerminalPager.jl:49 [inlined]
 [10] #pager#27
    @ ~/.julia/packages/TerminalPager/C06ZN/src/TerminalPager.jl:46 [inlined]
 [11] pager
    @ ~/.julia/packages/TerminalPager/C06ZN/src/TerminalPager.jl:45 [inlined]
 [12] |>(x::Matrix{Float64}, f::typeof(pager))
    @ Base ./operators.jl:858
 [13] top-level scope
    @ REPL[6]:1 
julia> versioninfo()
Julia Version 1.6.0
Commit f9720dc2eb (2021-03-24 12:55 UTC)
Platform Info:
  OS: Linux (x86_64-pc-linux-gnu)
  CPU: AMD Ryzen 7 PRO 4750U with Radeon Graphics
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-11.0.1 (ORCJIT, znver2)
ronisbr commented 3 years ago

Hi @EarthGoddessDude

Good catch. It should be fixed in main. Can you please test?

DimitarVanguelov commented 3 years ago

@ronisbr, my pleasure. Looks good on main, no more crash in that scenario.