forked from ritthisakdi/homebrew
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcaveats.rb
217 lines (192 loc) · 6.84 KB
/
caveats.rb
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
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
class Caveats
attr_reader :f
def initialize(f)
@f = f
end
def caveats
caveats = []
begin
build, f.build = f.build, Tab.for_formula(f)
s = f.caveats.to_s
caveats << s.chomp + "\n" if s.length > 0
ensure
f.build = build
end
caveats << keg_only_text
caveats << bash_completion_caveats
caveats << zsh_completion_caveats
caveats << fish_completion_caveats
caveats << plist_caveats
caveats << python_caveats
caveats << app_caveats
caveats << elisp_caveats
caveats.compact.join("\n")
end
def empty?
caveats.empty?
end
private
def keg
@keg ||= [f.prefix, f.opt_prefix, f.linked_keg].map do |d|
Keg.new(d.resolved_path) rescue nil
end.compact.first
end
def keg_only_text
return unless f.keg_only?
s = "This formula is keg-only, which means it was not symlinked into #{HOMEBREW_PREFIX}."
s << "\n\n#{f.keg_only_reason}"
if f.lib.directory? || f.include.directory?
s <<
<<-EOS.undent_________________________________________________________72
Generally there are no consequences of this for you. If you build your
own software and it requires this formula, you'll need to add to your
build variables:
EOS
s << " LDFLAGS: -L#{f.opt_lib}\n" if f.lib.directory?
s << " CPPFLAGS: -I#{f.opt_include}\n" if f.include.directory?
end
s << "\n"
end
def bash_completion_caveats
if keg && keg.completion_installed?(:bash) then <<-EOS.undent
Bash completion has been installed to:
#{HOMEBREW_PREFIX}/etc/bash_completion.d
EOS
end
end
def zsh_completion_caveats
if keg && keg.completion_installed?(:zsh) then <<-EOS.undent
zsh completion has been installed to:
#{HOMEBREW_PREFIX}/share/zsh/site-functions
EOS
end
end
def fish_completion_caveats
if keg && keg.completion_installed?(:fish) && which("fish") then <<-EOS.undent
fish completion has been installed to:
#{HOMEBREW_PREFIX}/share/fish/vendor_completions.d
EOS
end
end
def python_caveats
return unless keg
return unless keg.python_site_packages_installed?
s = nil
homebrew_site_packages = Language::Python.homebrew_site_packages
user_site_packages = Language::Python.user_site_packages "python"
pth_file = user_site_packages/"homebrew.pth"
instructions = <<-EOS.undent.gsub(/^/, " ")
mkdir -p #{user_site_packages}
echo 'import site; site.addsitedir("#{homebrew_site_packages}")' >> #{pth_file}
EOS
if f.keg_only?
keg_site_packages = f.opt_prefix/"lib/python2.7/site-packages"
unless Language::Python.in_sys_path?("python", keg_site_packages)
s = <<-EOS.undent
If you need Python to find bindings for this keg-only formula, run:
echo #{keg_site_packages} >> #{homebrew_site_packages/f.name}.pth
EOS
s += instructions unless Language::Python.reads_brewed_pth_files?("python")
end
return s
end
return if Language::Python.reads_brewed_pth_files?("python")
if !Language::Python.in_sys_path?("python", homebrew_site_packages)
s = <<-EOS.undent
Python modules have been installed and Homebrew's site-packages is not
in your Python sys.path, so you will not be able to import the modules
this formula installed. If you plan to develop with these modules,
please run:
EOS
s += instructions
elsif keg.python_pth_files_installed?
s = <<-EOS.undent
This formula installed .pth files to Homebrew's site-packages and your
Python isn't configured to process them, so you will not be able to
import the modules this formula installed. If you plan to develop
with these modules, please run:
EOS
s += instructions
end
s
end
def app_caveats
if keg && keg.app_installed?
<<-EOS.undent
.app bundles were installed.
Run `brew linkapps #{keg.name}` to symlink these to /Applications.
EOS
end
end
def elisp_caveats
return if f.keg_only?
if keg && keg.elisp_installed?
<<-EOS.undent
Emacs Lisp files have been installed to:
#{HOMEBREW_PREFIX}/share/emacs/site-lisp/#{f.name}
EOS
end
end
def plist_caveats
s = []
if f.plist || (keg && keg.plist_installed?)
destination = if f.plist_startup
"/Library/LaunchDaemons"
else
"~/Library/LaunchAgents"
end
plist_filename = if f.plist
f.plist_path.basename
else
File.basename Dir["#{keg}/*.plist"].first
end
plist_link = "#{destination}/#{plist_filename}"
plist_domain = f.plist_path.basename(".plist")
destination_path = Pathname.new File.expand_path destination
plist_path = destination_path/plist_filename
# we readlink because this path probably doesn't exist since caveats
# occurs before the link step of installation
# Yosemite security measures mildly tighter rules:
# https://github.com/Homebrew/homebrew/issues/33815
if !plist_path.file? || !plist_path.symlink?
if f.plist_startup
s << "To have launchd start #{f.full_name} at startup:"
s << " sudo mkdir -p #{destination}" unless destination_path.directory?
s << " sudo cp -fv #{f.opt_prefix}/*.plist #{destination}"
s << " sudo chown root #{plist_link}"
else
s << "To have launchd start #{f.full_name} at login:"
s << " mkdir -p #{destination}" unless destination_path.directory?
s << " ln -sfv #{f.opt_prefix}/*.plist #{destination}"
end
s << "Then to load #{f.full_name} now:"
if f.plist_startup
s << " sudo launchctl load #{plist_link}"
else
s << " launchctl load #{plist_link}"
end
# For startup plists, we cannot tell whether it's running on launchd,
# as it requires for `sudo launchctl list` to get real result.
elsif f.plist_startup
s << "To reload #{f.full_name} after an upgrade:"
s << " sudo launchctl unload #{plist_link}"
s << " sudo cp -fv #{f.opt_prefix}/*.plist #{destination}"
s << " sudo chown root #{plist_link}"
s << " sudo launchctl load #{plist_link}"
elsif Kernel.system "/bin/launchctl list #{plist_domain} &>/dev/null"
s << "To reload #{f.full_name} after an upgrade:"
s << " launchctl unload #{plist_link}"
s << " launchctl load #{plist_link}"
else
s << "To load #{f.full_name}:"
s << " launchctl load #{plist_link}"
end
if f.plist_manual
s << "Or, if you don't want/need launchctl, you can just run:"
s << " #{f.plist_manual}"
end
s << "" << "WARNING: launchctl will fail when run under tmux." if ENV["TMUX"]
end
s.join("\n") unless s.empty?
end
end