class Brakeman::Pager

Public Class Methods

new(tracker, pager = :less, output = $stdout) click to toggle source
# File lib/brakeman/report/pager.rb, line 3
def initialize tracker, pager = :less, output = $stdout
  @tracker = tracker
  @pager = pager
  @output = output
  @less_available = @less_options = nil
end

Public Instance Methods

in_ci?() click to toggle source
# File lib/brakeman/report/pager.rb, line 71
def in_ci?
  ci = ENV["CI"]

  ci.is_a? String and ci.downcase == "true"
end
less_available?() click to toggle source
# File lib/brakeman/report/pager.rb, line 77
def less_available?
  return @less_available unless @less_available.nil?

  @less_available = system("which less > /dev/null")
end
less_options() click to toggle source
# File lib/brakeman/report/pager.rb, line 83
def less_options
  # -R show colors
  # -F exit if output fits on one screen
  # -X do not clear screen after less exits

  return @less_options if @less_options

  @less_options = []

  if system("which less > /dev/null")
    less_help = `less -?`

    ["-R ", "-F ", "-X "].each do |opt|
      if less_help.include? opt
        @less_options << opt
      end
    end
  end

  @less_options
end
no_pager(text) click to toggle source
# File lib/brakeman/report/pager.rb, line 41
def no_pager text
  @output.puts text
end
page_output(text) click to toggle source
# File lib/brakeman/report/pager.rb, line 24
def page_output text
  case @pager
  when :none
    no_pager text
  when :highline
    page_via_highline text
  when :less
    if less_available?
      page_via_less text
    else
      page_via_highline text
    end
  else
    no_pager text
  end
end
page_report(report, format) click to toggle source
# File lib/brakeman/report/pager.rb, line 10
def page_report report, format
  if @pager == :less
    set_color
  end

  text = report.format(format)

  if in_ci?
    no_pager text
  else
    page_output text
  end
end
page_via_highline(text) click to toggle source
# File lib/brakeman/report/pager.rb, line 45
def page_via_highline text
  Brakeman.load_brakeman_dependency 'highline'
  h = ::HighLine.new($stdin, @output)
  h.page_at = :auto
  h.say text
end
page_via_less(text) click to toggle source
# File lib/brakeman/report/pager.rb, line 52
def page_via_less text
  # Adapted from https://github.com/piotrmurach/tty-pager/

  write_io = open("|less #{less_options.join}", 'w')
  pid = write_io.pid

  write_io.write(text)
  write_io.close

  Process.waitpid2(pid, Process::WNOHANG)
rescue Errno::ECHILD
  # on jruby 9x waiting on pid raises (per tty-pager)
  true
rescue => e
  warn "[Error] #{e}"
  warn "[Error] Could not use pager. Set --no-pager to avoid this issue."
  no_pager text
end
set_color() click to toggle source
# File lib/brakeman/report/pager.rb, line 105
def set_color
  return unless @tracker

  unless less_options.include? "-R " or @tracker.options[:output_color] == :force
    @tracker.options[:output_color] = false
  end
end