aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew
diff options
context:
space:
mode:
authorMax Howell2012-03-19 00:15:40 +0000
committerMax Howell2012-03-19 00:28:38 +0000
commitce082c167cba9e5df3c95e429ec510da8a29fa19 (patch)
treea34b89569b6d25a325382605a5e815ac86707c0f /Library/Homebrew
parent45d78a84e6789239e2e95a516d7237bcf2fedcc6 (diff)
downloadhomebrew-ce082c167cba9e5df3c95e429ec510da8a29fa19.tar.bz2
Better error when linking fails
Refs http://stackoverflow.com/questions/9762943 The system ln no longer outputs anything. Though the user can force its output with a --verbose of course. So in cases where it's not the usual of: not writable or existing file, we can ask the user to run with --verbose. I don't particularly like hiding its output, but it just confused the error IMO since it is creating a relative symlink the output was weird every time I've seen it in tickets. I made a print wrapper so that the brew-link output doesn't get mucked up if an exception is thrown.
Diffstat (limited to 'Library/Homebrew')
-rw-r--r--Library/Homebrew/cmd/link.rb28
-rw-r--r--Library/Homebrew/extend/pathname.rb11
2 files changed, 33 insertions, 6 deletions
diff --git a/Library/Homebrew/cmd/link.rb b/Library/Homebrew/cmd/link.rb
index d882ee7ec..09d16c782 100644
--- a/Library/Homebrew/cmd/link.rb
+++ b/Library/Homebrew/cmd/link.rb
@@ -1,4 +1,5 @@
module Homebrew extend self
+
def link
raise KegUnspecifiedError if ARGV.named.empty?
@@ -9,9 +10,30 @@ module Homebrew extend self
end
ARGV.kegs.each do |keg|
- print "Linking #{keg}... "
- puts if ARGV.verbose?
- puts "#{keg.link} symlinks created"
+ print "Linking #{keg}... " do
+ puts if ARGV.verbose?
+ puts "#{keg.link} symlinks created"
+ end
+ end
+ end
+
+ private
+
+ # Allows us to ensure a puts happens before the block exits so that if say,
+ # an exception is thrown, its output starts on a new line.
+ def print str, &block
+ Kernel.print str
+ puts_capture = Class.new do
+ def self.puts str
+ $did_puts = true
+ Kernel.puts str
+ end
end
+
+ puts_capture.instance_eval &block
+
+ ensure
+ puts unless $did_puts
end
+
end
diff --git a/Library/Homebrew/extend/pathname.rb b/Library/Homebrew/extend/pathname.rb
index 1ccbff51c..7412fd157 100644
--- a/Library/Homebrew/extend/pathname.rb
+++ b/Library/Homebrew/extend/pathname.rb
@@ -283,9 +283,14 @@ class Pathname
self.dirname.mkpath
Dir.chdir self.dirname do
# NOTE only system ln -s will create RELATIVE symlinks
- system 'ln', '-s', src.relative_path_from(self.dirname), self.basename
- # ln outputs useful error message for us
- raise "Could not create symlink: #{to_s}." unless $?.success?
+ quiet_system 'ln', '-s', src.relative_path_from(self.dirname), self.basename
+ if not $?.success?
+ raise <<-EOS.undent
+ Could not symlink file: #{src.expand_path}
+ Check #{self} does not already exist.
+ Check #{dirname} is writable.
+ EOS
+ end
end
end