Class: Kennel::GithubReporter

Inherits:
Object
  • Object
show all
Defined in:
lib/kennel/github_reporter.rb

Constant Summary collapse

MAX_COMMENT_SIZE =
65536
TRUNCATED_MSG =

finish the code block so it look nice

"\n```\n... (truncated)"

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(token, ref: "HEAD") ⇒ GithubReporter

Returns a new instance of GithubReporter.



15
16
17
18
19
20
21
22
23
24
# File 'lib/kennel/github_reporter.rb', line 15

def initialize(token, ref: "HEAD")
  @token = token
  commit = Utils.capture_sh("git show #{ref}")
  @sha = commit[/^Merge: \S+ (\S+)/, 1] || commit[/\Acommit (\S+)/, 1] || raise("Unable to find commit")
  @pr = commit[/^\s+.*\(#(\d+)\)/, 1] # from squash
  @repo_part = ENV["GITHUB_REPOSITORY"] || begin
    origin = ENV["PROJECT_REPOSITORY"] || Utils.capture_sh("git remote -v").split("\n").first
    origin[%r{github\.com[:/](\S+?)(\.git|$)}, 1] || raise("no origin found in #{origin}")
  end
end

Class Method Details

.report(token, &block) ⇒ Object



9
10
11
12
# File 'lib/kennel/github_reporter.rb', line 9

def report(token, &block)
  return yield unless token
  new(token).report(&block)
end

Instance Method Details

#comment(body) ⇒ Object



36
37
38
39
40
41
42
43
44
# File 'lib/kennel/github_reporter.rb', line 36

def comment(body)
  # truncate to maximum allowed comment size for github to avoid 422
  if body.bytesize > MAX_COMMENT_SIZE
    body = body.byteslice(0, MAX_COMMENT_SIZE - TRUNCATED_MSG.bytesize) + TRUNCATED_MSG
  end

  path = (@pr ? "/repos/#{@repo_part}/issues/#{@pr}/comments" : "/repos/#{@repo_part}/commits/#{@sha}/comments")
  post path, body: body
end

#report(&block) ⇒ Object



26
27
28
29
30
31
32
33
# File 'lib/kennel/github_reporter.rb', line 26

def report(&block)
  output = Console.tee_output(&block).strip
rescue StandardError
  output = "Error:\n#{$ERROR_INFO.message}"
  raise
ensure
  comment "```\n#{output || "Error"}\n```"
end