class Gitlab::Shell::History

def history_file

def history_file
  if defined?(@history_file)
    @history_file
  else
    @history_file = File.open(history_file_path, 'w', 0600).tap do |file|
      file.sync = true
    end
  end
rescue Errno::EACCES
  warn 'History not saved; unable to open your history file for writing.'
  @history_file = false
end

def history_file_path

def history_file_path
  File.expand_path(@file_path)
end

def initialize(options={})

def initialize(options={})
  @file_path = options[:file_path] || DEFAULT_FILE_PATH
  Readline::HISTORY.clear
end

def lines

def lines
  Readline::HISTORY.to_a.last(max_lines)
end

def load

def load
  read_from_file { |line| Readline::HISTORY << line.chomp }
end

def max_lines

def max_lines
  (ENV['GITLAB_HISTFILESIZE'] || DEFAULT_HISTFILESIZE).to_i
end

def push(line)

def push(line)
  Readline::HISTORY << line
end

def read_from_file

def read_from_file
  path = history_file_path
  File.foreach(path) { |line| yield(line) } if File.exist?(path)
rescue => error
  warn "History file not loaded: #{error.message}"
end

def save

def save
  lines.each { |line| history_file.puts line if history_file }
end