diff --git a/Library/Homebrew/cmd/link.rb b/Library/Homebrew/cmd/link.rb index d882ee7ec6..09d16c7824 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 1ccbff51cf..7412fd157c 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