lib/taskjuggler/Tj3AppBase.rb in taskjuggler-3.1.0 vs lib/taskjuggler/Tj3AppBase.rb in taskjuggler-3.2.0

- old
+ new

@@ -16,19 +16,19 @@ require 'term/ansicolor' require 'taskjuggler/Tj3Config' require 'taskjuggler/RuntimeConfig' require 'taskjuggler/TjTime' require 'taskjuggler/TextFormatter' +require 'taskjuggler/MessageHandler' require 'taskjuggler/Log' class TaskJuggler - class TjRuntimeError < RuntimeError - end - class Tj3AppBase + include MessageHandler + def initialize # Indent and width of options. The deriving class may has to change # this. @optsSummaryWidth = 22 @optsSummaryIndent = 5 @@ -40,10 +40,13 @@ # If stdout is not a tty, we don't use ANSI escape sequences to color # the terminal output. Additionally, we have the --no-color option to # force colors off in case this does not work properly. Term::ANSIColor.coloring = STDOUT.tty? + + # Make sure the MessageHandler is set to default values. + MessageHandlerInstance.instance.reset end def processArguments(argv) @opts = OptionParser.new @opts.summary_width = @optsSummaryWidth @@ -64,10 +67,11 @@ @configFile = arg end @opts.on('--silent', format("Don't show program and progress information")) do @silent = true + MessageHandlerInstance.instance.outputLevel = :warning TaskJuggler::Log.silent = true end @opts.on('--no-color', format(<<'EOT' Don't use ANSI contol sequences to color the terminal output. Colors should @@ -95,28 +99,34 @@ begin files = @opts.parse(argv) rescue OptionParser::ParseError => msg puts @opts.to_s + "\n" - error(msg.message, 2) + error('tj3app_bad_cmd_options', msg.message) end files end def main(argv = ARGV) if Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new(@mininumRubyVersion) - error('This program requires at least Ruby version ' + + error('tj3app_ruby_version', + 'This program requires at least Ruby version ' + "#{@mininumRubyVersion}!") end # Install signal handler to exit gracefully on CTRL-C. intHandler = Kernel.trap('INT') do - error("Aborting on user request!") + begin + fatal('tj3app_user_abort', "Aborting on user request!") + rescue RuntimeError + exit 1 + end end + retVal = 0 begin args = processArguments(argv) # If DEBUG mode has been enabled, we restore the INT trap handler again # to get Ruby backtrackes. @@ -130,33 +140,42 @@ "#{AppConfig.license}\n" end @rc = RuntimeConfig.new(AppConfig.packageName, @configFile) - appMain(args) + begin + MessageHandlerInstance.instance.trapSetup = true + retVal = appMain(args) + MessageHandlerInstance.instance.trapSetup = false + rescue TjRuntimeError + # We have hit a sitatuation that we can't recover from. A message + # was severed via the MessageHandler to inform the user and we now + # abort the program. + return 1 + end + rescue Exception => e if e.is_a?(SystemExit) || e.is_a?(Interrupt) # Don't show backtrace on user interrupt unless we are in debug mode. $stderr.puts e.backtrace.join("\n") if $DEBUG 1 else - error("Ups, you have triggered a bug in #{AppConfig.softwareName}!\n" + - "#{e}\n" + - e.backtrace.join("\n") + - "Please see the user manual on how to get this bug fixed!") + fatal('crash_trap', "#{e}\n#{e.backtrace.join("\n")}\n\n" + + "#{'*' * 79}\nYou have triggered a bug in " + + "#{AppConfig.softwareName} version #{AppConfig.version}!\n" + + "Please see the user manual on how to get this bug fixed!\n" + + "#{'*' * 79}\n") end end + + # Exit value in case everything was fine. + retVal end private def quit exit 0 - end - - def error(message, exitVal = 1) - $stderr.puts "\nERROR: #{message}" - exit exitVal end def format(str, indent = nil) indent = @optsSummaryWidth + @optsSummaryIndent + 1 unless indent TextFormatter.new(79, indent).format(str)[indent..-1]