jeffreytse / jekyll-spaceship

🚀 A Jekyll plugin to provide powerful supports for table, mathjax, plantuml, mermaid, emoji, video, audio, youtube, vimeo, dailymotion, soundcloud, spotify, etc.
MIT License
626 stars 67 forks source link

undefined local variable crashes when fetch_img_data fails #35

Closed ryepup closed 3 years ago

ryepup commented 3 years ago

I'm seeing some bugs in error handling when we have failures fetch_img_data in the MermaidProcessor.

Reproduction case

jekyll-spaceship: mermaid-processor: mode: "pre-fetch" src: "http://does-not-exist/svg/"

* add two pages, one with a mermaid diagram
* run `jekyll build`

Expected behavior: we log a "Failed to open TCP connection to does-not-exist" error and continue processing the other file

Actual behavior: we catch the "Failed to open..." error and then throw an unhandled error trying to log, which crashes `jekyll`:

/usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/cores/processor.rb:215:in rescue in fetch_img_data': undefined local variable or methodlogger' for Jekyll::Spaceship::MermaidProcessor:Class (NameError) from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/cores/processor.rb:203:in fetch_img_data' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/processors/mermaid-processor.rb:70:inhandle_mermaid' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/processors/mermaid-processor.rb:56:in block in handle_mermaid_block' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/processors/mermaid-processor.rb:47:inscan' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/processors/mermaid-processor.rb:47:in handle_mermaid_block' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/processors/mermaid-processor.rb:39:inblock in on_handle_markdown' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/processors/mermaid-processor.rb:38:in each' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/processors/mermaid-processor.rb:38:inon_handle_markdown' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/cores/processor.rb:118:in dispatch' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/cores/manager.rb:61:inblock in dispatch' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/cores/manager.rb:60:in each' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/cores/manager.rb:60:indispatch' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/cores/manager.rb:32:in block in hook' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/cores/manager.rb:48:inblock in hook' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/hooks.rb:99:in block in trigger' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/hooks.rb:98:ineach' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/hooks.rb:98:in trigger' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/page.rb:181:intrigger_hooks' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/renderer.rb:61:in run' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/site.rb:532:inrender_regenerated' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/site.rb:524:in block in render_pages' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/site.rb:523:ineach' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/site.rb:523:in render_pages' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/site.rb:208:inrender' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/site.rb:80:in process' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/command.rb:28:inprocess_site' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/commands/build.rb:65:in build' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/commands/build.rb:36:inprocess' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/command.rb:91:in block in process_with_graceful_fail' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/command.rb:91:ineach' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/command.rb:91:in process_with_graceful_fail' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/commands/serve.rb:86:inblock (2 levels) in init_with_program' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary/command.rb:221:in block in execute' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary/command.rb:221:ineach' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary/command.rb:221:in execute' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary/program.rb:44:ingo' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary.rb:21:in program' from /usr/gem/gems/jekyll-4.1.1/exe/jekyll:15:in<top (required)>' from /usr/local/bundle/bin/jekyll:29:in load' from /usr/local/bundle/bin/jekyll:29:in

' /usr/local/lib/ruby/2.7.0/net/http.rb:960:in initialize': Failed to open TCP connection to does-not-exist:80 (getaddrinfo: Name does not resolve) (SocketError) from /usr/local/lib/ruby/2.7.0/net/http.rb:960:inopen' from /usr/local/lib/ruby/2.7.0/net/http.rb:960:in block in connect' from /usr/local/lib/ruby/2.7.0/timeout.rb:95:inblock in timeout' from /usr/local/lib/ruby/2.7.0/timeout.rb:105:in timeout' from /usr/local/lib/ruby/2.7.0/net/http.rb:958:inconnect' from /usr/local/lib/ruby/2.7.0/net/http.rb:943:in do_start' from /usr/local/lib/ruby/2.7.0/net/http.rb:932:instart' from /usr/local/lib/ruby/2.7.0/net/http.rb:606:in start' from /usr/local/lib/ruby/2.7.0/net/http.rb:481:inget_response' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/cores/processor.rb:205:in fetch_img_data' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/processors/mermaid-processor.rb:70:inhandle_mermaid' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/processors/mermaid-processor.rb:56:in block in handle_mermaid_block' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/processors/mermaid-processor.rb:47:inscan' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/processors/mermaid-processor.rb:47:in handle_mermaid_block' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/processors/mermaid-processor.rb:39:inblock in on_handle_markdown' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/processors/mermaid-processor.rb:38:in each' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/processors/mermaid-processor.rb:38:inon_handle_markdown' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/cores/processor.rb:118:in dispatch' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/cores/manager.rb:61:inblock in dispatch' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/cores/manager.rb:60:in each' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/cores/manager.rb:60:indispatch' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/cores/manager.rb:32:in block in hook' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/cores/manager.rb:48:inblock in hook' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/hooks.rb:99:in block in trigger' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/hooks.rb:98:ineach' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/hooks.rb:98:in trigger' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/page.rb:181:intrigger_hooks' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/renderer.rb:61:in run' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/site.rb:532:inrender_regenerated' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/site.rb:524:in block in render_pages' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/site.rb:523:ineach' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/site.rb:523:in render_pages' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/site.rb:208:inrender' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/site.rb:80:in process' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/command.rb:28:inprocess_site' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/commands/build.rb:65:in build' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/commands/build.rb:36:inprocess' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/command.rb:91:in block in process_with_graceful_fail' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/command.rb:91:ineach' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/command.rb:91:in process_with_graceful_fail' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/commands/serve.rb:86:inblock (2 levels) in init_with_program' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary/command.rb:221:in block in execute' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary/command.rb:221:ineach' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary/command.rb:221:in execute' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary/program.rb:44:ingo' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary.rb:21:in program' from /usr/gem/gems/jekyll-4.1.1/exe/jekyll:15:in<top (required)>' from /usr/local/bundle/bin/jekyll:29:in load' from /usr/local/bundle/bin/jekyll:29:in
' /usr/local/lib/ruby/2.7.0/net/http.rb:960:in initialize': getaddrinfo: Name does not resolve (SocketError) from /usr/local/lib/ruby/2.7.0/net/http.rb:960:inopen' from /usr/local/lib/ruby/2.7.0/net/http.rb:960:in block in connect' from /usr/local/lib/ruby/2.7.0/timeout.rb:95:inblock in timeout' from /usr/local/lib/ruby/2.7.0/timeout.rb:105:in timeout' from /usr/local/lib/ruby/2.7.0/net/http.rb:958:inconnect' from /usr/local/lib/ruby/2.7.0/net/http.rb:943:in do_start' from /usr/local/lib/ruby/2.7.0/net/http.rb:932:instart' from /usr/local/lib/ruby/2.7.0/net/http.rb:606:in start' from /usr/local/lib/ruby/2.7.0/net/http.rb:481:inget_response' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/cores/processor.rb:205:in fetch_img_data' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/processors/mermaid-processor.rb:70:inhandle_mermaid' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/processors/mermaid-processor.rb:56:in block in handle_mermaid_block' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/processors/mermaid-processor.rb:47:inscan' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/processors/mermaid-processor.rb:47:in handle_mermaid_block' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/processors/mermaid-processor.rb:39:inblock in on_handle_markdown' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/processors/mermaid-processor.rb:38:in each' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/processors/mermaid-processor.rb:38:inon_handle_markdown' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/cores/processor.rb:118:in dispatch' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/cores/manager.rb:61:inblock in dispatch' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/cores/manager.rb:60:in each' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/cores/manager.rb:60:indispatch' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/cores/manager.rb:32:in block in hook' from /usr/gem/gems/jekyll-spaceship-0.9.5/lib/jekyll-spaceship/cores/manager.rb:48:inblock in hook' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/hooks.rb:99:in block in trigger' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/hooks.rb:98:ineach' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/hooks.rb:98:in trigger' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/page.rb:181:intrigger_hooks' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/renderer.rb:61:in run' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/site.rb:532:inrender_regenerated' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/site.rb:524:in block in render_pages' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/site.rb:523:ineach' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/site.rb:523:in render_pages' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/site.rb:208:inrender' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/site.rb:80:in process' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/command.rb:28:inprocess_site' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/commands/build.rb:65:in build' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/commands/build.rb:36:inprocess' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/command.rb:91:in block in process_with_graceful_fail' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/command.rb:91:ineach' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/command.rb:91:in process_with_graceful_fail' from /usr/gem/gems/jekyll-4.1.1/lib/jekyll/commands/serve.rb:86:inblock (2 levels) in init_with_program' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary/command.rb:221:in block in execute' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary/command.rb:221:ineach' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary/command.rb:221:in execute' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary/program.rb:44:ingo' from /usr/gem/gems/mercenary-0.4.0/lib/mercenary.rb:21:in program' from /usr/gem/gems/jekyll-4.1.1/exe/jekyll:15:in<top (required)>' from /usr/local/bundle/bin/jekyll:29:in load' from /usr/local/bundle/bin/jekyll:29:in
'



## Analysis

The error is thrown from https://github.com/jeffreytse/jekyll-spaceship/blob/e1a5bf7356b0292022a430dd6cea9daab625bc35/lib/jekyll-spaceship/cores/processor.rb#L208

I'm not very familiar with ruby OO, but it seems like the base class's `initialize` to set the logger https://github.com/jeffreytse/jekyll-spaceship/blob/f9a9a658e8f0f2d5cba84d36ac43b720b16cc4bc/lib/jekyll-spaceship/cores/processor.rb#L43 is somehow not taking effect in sub-classes like `MermaidProcessor`?

Or maybe the way we call `fetch_img_data` inside `MermaidProcessor` is somehow changing the context and losing a reference to the logger? https://github.com/jeffreytse/jekyll-spaceship/blob/f9a9a658e8f0f2d5cba84d36ac43b720b16cc4bc/lib/jekyll-spaceship/processors/mermaid-processor.rb#L70
jeffreytse commented 3 years ago

Hi @ryepup

🎉 The latest gem version v0.9.6 has been released.

Thanks and regards