From ce082c167cba9e5df3c95e429ec510da8a29fa19 Mon Sep 17 00:00:00 2001 From: Max Howell Date: Mon, 19 Mar 2012 00:15:40 +0000 Subject: 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. --- Library/Homebrew/cmd/link.rb | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) (limited to 'Library/Homebrew/cmd') 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 -- cgit v1.2.3