# Part of the A-A-P recipe executive: printing messages # Copyright (C) 2002-2003 Stichting NLnet Labs # Permission to copy and use this file is specified in the file COPYING. # If this file is missing you can find it here: http://www.a-a-p.org/COPYING # All messages are written into a log file. # Only selected messages are printed. # It's OK to import * from this file. import string import os import os.path import sys import Global from Error import * # Message types: msgt_note = "note" # note message msgt_warning = "warning" # warning message (def) msgt_error = "error" # error message (def) msgt_system = "system" # executed system command (def) msgt_result = "result" # result of :sys command msgt_info = "info" # informational message (def) msgt_extra = "extra" # extra informational message msgt_changedir = "changedir" # changing directories msgt_depend = "depend" # message about dependencies msgt_log = "log" # log messages msgt_all = "all" # all messages msgt_print = "print" # :print message # Message modes: msgm_normal = 0 # print message "Aap: msg\n" msgm_start = 1 # print message "Aap: msg" msgm_cont = 2 # print message "msg" # File for logging message. Is opened only after the main recipe is located. logfile = None # Full path of the file used for logging. logname = None def msg_startlog(recdict): """Open the logfile. Can only be done after locating the main recipe file and changing to it's directory.""" from Util import assert_aap_dir, in_aap_dir # Do not create a log if the only target is "cleanALL". if (len(Global.cmd_args.targets) == 1 and Global.cmd_args.targets[0] == "cleanALL"): return # Need the "AAPDIR" directory. if not assert_aap_dir(recdict): return # Rename the old files if aap/log already exists. log8 -> log9, log7 -> # log8, ..., log1 -> log2, log -> log1 log_name = in_aap_dir("log") if os.path.exists(log_name): i = 8 while i >= 0: if i == 0: src = log_name else: src = in_aap_dir("log%d" % i) if os.path.exists(src): dst = in_aap_dir("log%d" % (i + 1)) # May have to delete the destination file log9. if i == 8: from Util import try_delete try_delete(dst) try: os.rename(src, dst) except StandardError, e: print _('Warning: Could not rename "%s" to "%s"') % (src, dst) break i = i - 1 # Open aap/log global logfile try: logfile = open(log_name, "w") except StandardError, e: print _("Warning: Cannot open log file for writing: "), str(e) else: # Turn into an absolute name, we may use chdir. global logname logname = os.path.abspath(log_name) def msg_logname(): """Return the name of the log file.""" return logname def msg_stoplog(): """Stop using a logfile. Used just before finishing the work.""" global logfile, logname if logfile: logfile.close() logfile = None logname = None def msg_msg(recdict, msg, type, mode = msgm_normal, rpstack = None): """ Generic function to print a message "msg" of type "type". All messages are written in the log file (if it exists). A message is displayed if its type is in the MESSAGE variable. The optional "rpstack" can be used to prepend the recipe position to the message. """ if rpstack: from Process import get_recipe_msg msg = get_recipe_msg(rpstack) + msg doprint = 0 if not recdict: doprint = 1 else: from Util import get_var_val_int m = get_var_val_int(recdict, "MESSAGE") if (m is None or string.find(m, type) >= 0 or string.find(m, msgt_all) >= 0): doprint = 1 if doprint: if mode == msgm_normal: print "Aap: " + msg elif mode == msgm_start: print "Aap: " + msg, sys.stdout.flush() else: print msg, sys.stdout.flush() _log(msg, type, mode = mode) def _log(msg, type, mode = msgm_normal): if logfile: try: if mode == msgm_normal: logfile.write("%s:\t%s\n" % (type, msg)) elif mode == msgm_start: logfile.write("%s:\t%s" % (type, msg)) else: logfile.write(msg) except IOError, e: raise UserError, _('Error while writing to log file: ') + str(e) def msg_note(recdict, msg, mode = msgm_normal, rpstack = None): """Print a note message.""" msg_msg(recdict, msg, msgt_note, mode = mode, rpstack = rpstack) def msg_warning(recdict, msg, mode = msgm_normal, rpstack = None): """Print a warning message.""" msg_msg(recdict, msg, msgt_warning, mode = mode, rpstack = rpstack) def msg_error(recdict, msg, mode = msgm_normal, rpstack = None): """Print an error message.""" msg_msg(recdict, msg, msgt_error, mode = mode, rpstack = rpstack) def msg_system(recdict, msg, mode = msgm_normal, rpstack = None): """Print an executed system command.""" if len(msg) and msg[-1] == '\n': msg = msg[:-1] # remove trailing newline msg_msg(recdict, msg, msgt_system, mode = mode, rpstack = rpstack) def msg_result(recdict, msg, mode = msgm_normal, rpstack = None): """Print an executed system command.""" if len(msg) and msg[-1] == '\n': msg = msg[:-1] # remove trailing newline msg_msg(recdict, msg, msgt_result, mode = mode, rpstack = rpstack) def msg_info(recdict, msg, mode = msgm_normal, rpstack = None): """Print an informational message.""" msg_msg(recdict, msg, msgt_info, mode = mode, rpstack = rpstack) def msg_skip(line_nr, recdict, cmd): """Print a message about a skipped command.""" # Try expanding variables in the command. If this fails use the unexpanded # command. from Util import Expand from Commands import expand try: s = expand(line_nr, recdict, cmd, Expand(0, Expand.quote_aap)) except: s = cmd msg_info(recdict, _('skip line %d: %s') % (line_nr, s)) def msg_extra(recdict, msg, mode = msgm_normal, rpstack = None): """Print an extra informational message.""" msg_msg(recdict, msg, msgt_extra, mode = mode, rpstack = rpstack) def msg_changedir(recdict, dir): """Print a message about changing directories.""" # Note: This message is not translated, so that a parser # for the messages isn't confused by various languages. msg_msg(recdict, "Entering directory `%s'" % dir, msgt_changedir) def msg_depend(recdict, msg, level = None): """Print a message about dependencies.""" if level: msg = ("%d - " % level) + msg msg_msg(recdict, msg, msgt_depend) def msg_log(recdict, msg, mode = msgm_normal, rpstack = None): """Log a message only, never printed.""" if rpstack: from Process import get_recipe_msg msg = get_recipe_msg(rpstack) + msg _log(msg, msgt_log, mode = mode) def msg_print(msg): """Print a message always, and log it.""" print msg _log(msg, msgt_print) def msg_init(recdict): """Set the MESSAGE variable according to the command line arguments. Skip this when it's already set from the command line.""" from Util import get_var_val_int if get_var_val_int(recdict, "MESSAGE") is None: if Global.cmd_args.has_option("silent"): recdict["MESSAGE"] = msgt_error elif Global.cmd_args.has_option("verbose"): recdict["MESSAGE"] = msgt_all else: recdict["MESSAGE"] = (msgt_error + "," + msgt_warning + "," + msgt_system + "," + msgt_info) # vim: set sw=4 et sts=4 tw=79 fo+=l: