Class: Gitlab::Chat::Output

Inherits:
Object
  • Object
show all
Defined in:
lib/gitlab/chat/output.rb

Overview

Class for gathering and formatting the output of a Ci::Build.

Constant Summary collapse

MissingBuildSectionError =
Class.new(StandardError)
PRIMARY_SECTION =

The primary trace section to look for.

'chat_reply'
FALLBACK_SECTION =

The backup trace section in case the primary one could not be found.

'step_script'
LEGACY_SECTION =

step_script used to be build_script before runner 13.1

'build_script'

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(build) ⇒ Output

build - The Ci::Build to obtain the output from.



21
22
23
# File 'lib/gitlab/chat/output.rb', line 21

def initialize(build)
  @build = build
end

Instance Attribute Details

#buildObject (readonly)

Returns the value of attribute build.



7
8
9
# File 'lib/gitlab/chat/output.rb', line 7

def build
  @build
end

Instance Method Details

#find_build_trace_section(name) ⇒ Object

Returns the trace section for the given name, or nil if the section could not be found.

name - The name of the trace section to find.



65
66
67
# File 'lib/gitlab/chat/output.rb', line 65

def find_build_trace_section(name)
  trace_sections.find { |s| s[:name] == name }
end

#to_sObject

Returns a String containing the output of the build.

The output does not include the command that was executed.



28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/gitlab/chat/output.rb', line 28

def to_s
  offset, length = read_offset_and_length

  trace.read do |stream|
    stream.seek(offset)

    output = stream
      .stream
      .read(length)
      .force_encoding(Encoding.default_external)

    without_executed_command_line(output)
  end
end

#traceObject



73
74
75
# File 'lib/gitlab/chat/output.rb', line 73

def trace
  @trace ||= build.trace
end

#trace_sectionsObject



69
70
71
# File 'lib/gitlab/chat/output.rb', line 69

def trace_sections
  @trace_sections ||= trace.extract_sections
end

#without_executed_command_line(output) ⇒ Object

Removes the line containing the executed command from the build output.

output - A String containing the output of a trace section.



46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/gitlab/chat/output.rb', line 46

def without_executed_command_line(output)
  # If `output.split("\n")` produces an empty Array then the slicing that
  # follows it will produce a nil. For example:
  #
  #     "\n".split("\n")        # => []
  #     "\n".split("\n")[1..] # => nil
  #
  # To work around this we only "join" if we're given an Array.
  if (converted = output.split("\n")[1..])
    converted.join("\n")
  else
    ''
  end
end