Exception: ErrorDuringExecution Private

Inherits:
RuntimeError
  • Object
show all
Defined in:
exceptions.rb

Overview

This class is part of a private API. This class may only be used in the Homebrew/brew repository. Third parties should avoid using this class if possible, as it may be removed or changed without warning.

Raised when a system command fails.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(cmd, status:, output: nil, secrets: []) ⇒ void

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:



853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
# File 'exceptions.rb', line 853

def initialize(cmd, status:, output: nil, secrets: [])
  redacted_cmd = Formatter.redact_secrets(cmd.shelljoin.gsub('\=', "="), secrets)
  cmd = cmd.map do |arg|
    case arg
    when String then Formatter.redact_secrets(arg, secrets)
    when Array then arg.map { |value| Formatter.redact_secrets(value, secrets) }
    when Hash then arg.transform_values { |value| Formatter.redact_secrets(value, secrets) if value }
    else arg
    end
  end
  @cmd = cmd
  @status = status
  output = output&.map { |type, line| [type, Formatter.redact_secrets(line, secrets)] }
  @output = output

  @exitstatus = T.let(
    case status
    when Integer
      status
    when Hash
      status["exitstatus"]
    else
      status.exitstatus
    end,
    T.nilable(Integer),
  )

  @termsig = T.let(
    case status
    when Integer
      nil
    when Hash
      status["termsig"]
    else
      status.termsig
    end,
    T.nilable(Integer),
  )

  reason = if exitstatus
    "exited with #{exitstatus}"
  elsif (t = termsig)
    "was terminated by uncaught signal #{Signal.signame(t)}"
  else
    raise ArgumentError, "Status neither has `exitstatus` nor `termsig`."
  end

  s = "Failure while executing; `#{redacted_cmd}` #{reason}."

  if Array(output).present?
    format_output_line = lambda do |type_line|
      type, line = *type_line
      if type == :stderr
        Formatter.error(line)
      else
        line
      end
    end

    s << " Here's the output:\n"
    s << Array(output).map(&format_output_line).join
    s << "\n" unless s.end_with?("\n")
  end

  super s.freeze
end

Instance Attribute Details

#cmd ⇒ Array<Pathname, String, Array<String>, Hash{String => String, nil}, nil> (readonly)

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



831
832
833
# File 'exceptions.rb', line 831

def cmd
  @cmd
end

#exitstatus ⇒ Integer? (readonly)

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



834
835
836
# File 'exceptions.rb', line 834

def exitstatus
  @exitstatus
end

#output ⇒ Array<Array<([String, Symbol], String)>>? (readonly)

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



843
844
845
# File 'exceptions.rb', line 843

def output
  @output
end

#status ⇒ Integer, ... (readonly)

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



837
838
839
# File 'exceptions.rb', line 837

def status
  @status
end

#termsig ⇒ Integer? (readonly)

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



840
841
842
# File 'exceptions.rb', line 840

def termsig
  @termsig
end

Instance Method Details

#stderr ⇒ String

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



921
922
923
# File 'exceptions.rb', line 921

def stderr
  Array(output).select { |type,| type == :stderr }.map(&:last).join
end