class Airbrake::Filters::GitLastCheckoutFilter

Attaches git checkout info to `context`. The info includes:

* username
* email
* revision
* time

This information is used to track deploys automatically.

@api private @since v2.12.0

Constants

MIN_HEAD_COLS

@return [Integer] least possible amount of columns in git's `logs/HEAD`

file (checkout information is omitted)

Attributes

weight[R]

@return [Integer]

Public Class Methods

new(root_directory) click to toggle source

@param [String] root_directory

# File lib/airbrake-ruby/filters/git_last_checkout_filter.rb, line 26
def initialize(root_directory)
  @git_path = File.join(root_directory, '.git')
  @weight = 116
  @last_checkout = nil
end

Public Instance Methods

call(notice) click to toggle source

@macro call_filter

# File lib/airbrake-ruby/filters/git_last_checkout_filter.rb, line 33
def call(notice)
  return if notice[:context].key?(:lastCheckout)

  if @last_checkout
    notice[:context][:lastCheckout] = @last_checkout
    return
  end

  return unless File.exist?(@git_path)
  return unless (checkout = last_checkout)
  notice[:context][:lastCheckout] = checkout
end

Private Instance Methods

checkout_line?(line) click to toggle source
# File lib/airbrake-ruby/filters/git_last_checkout_filter.rb, line 81
def checkout_line?(line)
  line.include?("\tclone:") ||
    line.include?("\tpull:") ||
    line.include?("\tcheckout:")
end
last_checkout() click to toggle source

rubocop:disable Metrics/AbcSize

# File lib/airbrake-ruby/filters/git_last_checkout_filter.rb, line 49
def last_checkout
  return unless (line = last_checkout_line)

  parts = line.chomp.split("\t").first.split(' ')
  if parts.size < MIN_HEAD_COLS
    logger.error(
      "#{LOG_LABEL} Airbrake::#{self.class.name}: can't parse line: #{line}",
    )
    return
  end

  author = parts[2..-4]
  @last_checkout = {
    username: author[0..1].join(' '),
    email: parts[-3][1..-2],
    revision: parts[1],
    time: timestamp(parts[-2].to_i),
  }
end
last_checkout_line() click to toggle source

rubocop:enable Metrics/AbcSize

# File lib/airbrake-ruby/filters/git_last_checkout_filter.rb, line 70
def last_checkout_line
  head_path = File.join(@git_path, 'logs', 'HEAD')
  return unless File.exist?(head_path)

  last_line = nil
  IO.foreach(head_path) do |line|
    last_line = line if checkout_line?(line)
  end
  last_line
end
timestamp(utime) click to toggle source
# File lib/airbrake-ruby/filters/git_last_checkout_filter.rb, line 87
def timestamp(utime)
  Time.at(utime).to_datetime.rfc3339
end