class Gergich::Review

Attributes

commit[R]
draft[R]

Public Class Methods

new(commit = Commit.new, draft = Draft.new(commit)) click to toggle source
# File lib/gergich.rb, line 104
def initialize(commit = Commit.new, draft = Draft.new(commit))
  @commit = commit
  @draft = draft
end

Public Instance Methods

already_commented?() click to toggle source
# File lib/gergich.rb, line 190
def already_commented?
  if multi_build_setup?
    my_messages_on_current_revision.any? do |message|
      message["message"] =~ /^#{unique_comment_prefix}/
    end
  else
    my_messages_on_current_revision.any?
  end
end
anything_to_publish?() click to toggle source
# File lib/gergich.rb, line 121
def anything_to_publish?
  !review_info[:comments].empty? ||
    !review_info[:cover_message_parts].empty? ||
    new_score?
end
cover_message() click to toggle source
# File lib/gergich.rb, line 246
def cover_message
  parts = review_info[:cover_message_parts]
  prefix = cover_message_prefix
  parts.unshift prefix if prefix != ""
  parts.join("\n\n")
end
cover_message_prefix() click to toggle source
# File lib/gergich.rb, line 253
def cover_message_prefix
  score = upcoming_score
  prefix_parts = []
  prefix_parts << unique_comment_prefix if multi_build_setup?
  prefix_parts << score if score.negative?
  prefix_parts.join(":")
  # [].join(":") => ""
  # [-2].join(":") => "-2"
  # ["some build prefix", -2].join(":") => "some build prefix:-2"
end
current_label() click to toggle source

currently, cover message only supports the GERGICH_REVIEW_LABEL. i.e., even if gergich has “Code-Review: -2”

# File lib/gergich.rb, line 212
def current_label
  @current_label ||= API.get("/changes/#{commit.change_id}/detail")["labels"]
    .fetch(GERGICH_REVIEW_LABEL, {})
    .fetch("all", [])
    .select { |label| label["username"] == GERGICH_USER }
    .first
end
current_label_date() click to toggle source
# File lib/gergich.rb, line 220
def current_label_date
  @current_label_date ||= current_label && current_label["date"]
end
current_label_is_for_current_revision?() click to toggle source
# File lib/gergich.rb, line 238
def current_label_is_for_current_revision?
  current_label_revision == commit.revision_number
end
current_label_revision() click to toggle source

unfortunately, the revision is not a field in the label json. however, we can match the label timestamp w/ one of our comment timestamps, then grab the comment’s revision.

# File lib/gergich.rb, line 227
def current_label_revision
  return nil if my_messages.empty?

  @current_label_revision ||= begin
    date = current_label_date
    comment_for_current_label = my_messages.find { |message| message["date"] == date } ||
                                my_messages.last
    comment_for_current_label["_revision_number"]
  end
end
current_score() click to toggle source
# File lib/gergich.rb, line 242
def current_score
  (current_label && current_label["value"]) || 0
end
generate_payload() click to toggle source
# File lib/gergich.rb, line 272
def generate_payload
  {
    message: cover_message,
    labels: review_info[:labels],
    comments: review_info[:comments],
    # we don't want the post to fail if another
    # patchset was created in the interim
    strict_labels: false
  }.to_json
end
generate_url() click to toggle source
# File lib/gergich.rb, line 268
def generate_url
  "/changes/#{commit.change_id}/revisions/#{commit.revision_id}/review"
end
multi_build_setup?() click to toggle source
# File lib/gergich.rb, line 181
def multi_build_setup?
  # convert to boolean if this variable exists or not
  !ENV["GERGICH_COMMENT_PREFIX"].nil?
end
my_messages() click to toggle source
# File lib/gergich.rb, line 205
def my_messages
  @my_messages ||= API.get("/changes/#{commit.change_id}/detail")["messages"]
    .select { |message| message["author"] && message["author"]["username"] == GERGICH_USER }
end
my_messages_on_current_revision() click to toggle source
# File lib/gergich.rb, line 200
def my_messages_on_current_revision
  revision_number = commit.revision_number
  my_messages.select { |message| message["_revision_number"] == revision_number }
end
new_score?() click to toggle source
# File lib/gergich.rb, line 127
def new_score?
  if current_label_is_for_current_revision?
    review_info[:score] < current_score.to_i
  else
    true
  end
end
publish!(allow_repost: false) click to toggle source

Public: publish all draft comments/labels/messages

# File lib/gergich.rb, line 110
def publish!(allow_repost: false)
  # only publish if we have something to say or if our last score was negative
  return unless anything_to_publish?

  return if already_commented? && !allow_repost

  API.post(generate_url, generate_payload)

  review_info
end
review_info() click to toggle source
# File lib/gergich.rb, line 264
def review_info
  @review_info ||= draft.info
end
status() click to toggle source

Public: show the current draft for this patchset

# File lib/gergich.rb, line 144
def status
  puts "Gergich DB: #{draft.db_file}"
  unless anything_to_publish?
    puts "Nothing to publish"
    return
  end

  info = commit.info
  puts "Project: #{info[:project]}"
  puts "Branch: #{info[:branch]}"
  puts "Revision: #{info[:revision_id]} (##{commit.revision_number})"
  puts "ChangeId: #{commit.change_id}"
  puts "Files:"
  puts "  #{commit.files.join("\n  ")}"

  puts
  review_info[:labels].each do |name, score|
    puts "#{name}: #{score}"
  end

  puts
  puts "Cover Message:"
  puts cover_message

  return if review_info[:comments].empty?

  puts
  puts "Inline Comments:"
  puts

  review_info[:comments].each do |file, comments|
    comments.each do |comment|
      puts "#{file}:#{comment[:line] || comment[:range]['start_line']}\n#{comment[:message]}"
    end
  end
end
unique_comment_prefix() click to toggle source
# File lib/gergich.rb, line 186
def unique_comment_prefix
  ENV["GERGICH_COMMENT_PREFIX"]
end
upcoming_score() click to toggle source
# File lib/gergich.rb, line 135
def upcoming_score
  if current_label_is_for_current_revision?
    [current_score.to_i, review_info[:score]].min
  else
    review_info[:score]
  end
end