1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
|
class UsageError < RuntimeError; end
class FormulaUnspecifiedError < UsageError; end
class KegUnspecifiedError < UsageError; end
class MultipleVersionsInstalledError < RuntimeError
attr :name
def initialize name
@name = name
super "#{name} has multiple installed versions"
end
end
class NotAKegError < RuntimeError; end
class NoSuchKegError < RuntimeError
attr :name
def initialize name
@name = name
super "No such keg: #{HOMEBREW_CELLAR}/#{name}"
end
end
class FormulaUnavailableError < RuntimeError
attr :name
attr :dependent, true
def dependent_s
"(dependency of #{dependent})" if dependent and dependent != name
end
def to_s
if name =~ %r{(\w+)/(\w+)/([^/]+)} then <<-EOS.undent
No available formula for #$3 #{dependent_s}
Please tap it and then try again: brew tap #$1/#$2
EOS
else
"No available formula for #{name} #{dependent_s}"
end
end
def initialize name
@name = name
end
end
module Homebrew
class InstallationError < RuntimeError
attr :formula
def initialize formula, message=""
super message
@formula = formula
end
end
end
class CannotInstallFormulaError < RuntimeError
end
class FormulaInstallationAlreadyAttemptedError < Homebrew::InstallationError
def message
"Formula installation already attempted: #{formula}"
end
end
class UnsatisfiedRequirement < Homebrew::InstallationError
attr :dep
def initialize formula, dep
@dep = dep
super formula, "An unsatisfied requirement failed this build."
end
end
class BuildError < Homebrew::InstallationError
attr :exit_status
attr :command
attr :env
def initialize formula, cmd, args, es
@command = cmd
@env = ENV.to_hash
@exit_status = es.exitstatus rescue 1
args = args.map{ |arg| arg.to_s.gsub " ", "\\ " }.join(" ")
super formula, "Failed executing: #{command} #{args}"
end
def was_running_configure?
@command == './configure'
end
def dump
e = self
require 'cmd/--config'
require 'cmd/--env'
e.backtrace[1] =~ %r{Library/Formula/(.+)\.rb:(\d+)}
formula_name = $1
error_line = $2
path = HOMEBREW_REPOSITORY/"Library/Formula/#{formula_name}.rb"
if path.symlink? and path.realpath.to_s =~ %r{^#{HOMEBREW_REPOSITORY}/Library/Taps/(\w+)-(\w+)/}
repo = "#$1/homebrew-#$2"
repo_path = path.realpath.relative_path_from(HOMEBREW_REPOSITORY/"Library/Taps/#$1-#$2").parent.to_s
issues_url = "https://github.com/#$1/homebrew-#$2/issues/new"
else
repo = "mxcl/master"
repo_path = "Library/Formula"
issues_url = ISSUES_URL
end
if ARGV.verbose?
ohai "Exit Status: #{e.exit_status}"
puts "https://github.com/#{repo}/blob/master/#{repo_path}/#{formula_name}.rb#L#{error_line}"
end
ohai "Build Environment"
Homebrew.dump_build_config
puts %["--use-clang" was specified] if ARGV.include? '--use-clang'
puts %["--use-llvm" was specified] if ARGV.include? '--use-llvm'
puts %["--use-gcc" was specified] if ARGV.include? '--use-gcc'
Homebrew.dump_build_env e.env
onoe "#{e.to_s.strip} (#{formula_name}.rb:#{error_line})"
issues = GitHub.issues_for_formula formula_name
if issues.empty?
puts "If `brew doctor` does not, this may help you fix or report the issue:"
puts " #{Tty.em}#{issues_url}#{Tty.reset}"
else
puts "These existing issues may help you:", *issues.map{ |s| " #{Tty.em}#{s}#{Tty.reset}" }
puts "Otherwise, this may help you fix or report the issue:"
puts " #{Tty.em}#{issues_url}#{Tty.reset}"
end
if e.was_running_configure?
puts "We saved the configure log:"
puts " ~/Library/Logs/Homebrew/config.log"
puts "If you report the issue please paste the config.log here:"
puts " #{Tty.em}http://gist.github.com/#{Tty.reset}"
end
end
end
# raised in CurlDownloadStrategy.fetch
class CurlDownloadStrategyError < RuntimeError
end
# raised by safe_system in utils.rb
class ErrorDuringExecution < RuntimeError
end
|