# Part of the A-A-P recipe executive: printing messages

# Copyright (C) 2002 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 Global
from Error import *

msgt_warning = "warning"        # warning message
msgt_error = "error"            # error message
msgt_system = "system"          # executed system command
msgt_result = "result"          # result of :sys command
msgt_info = "info"              # informational message
msgt_extra = "extra"            # extra informational message
msgt_changedir = "changedir"    # changing directories
msgt_depend = "depend"          # message about dependencies
msgt_all = "all"                # all messages
msgt_print = "print"            # :print message

# 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():
   """Open the logfile.  Can only be done after locating the main recipe file
      and changing to it's directory."""
   # First need the "aap" directory.
   from Util import assert_aap_dir
   if not assert_aap_dir():
       return

   # Rename the old files if aap/log already exists.  log8 -> log9, log7 ->
   # log8, ..., log1 -> log2, log -> log1
   if os.path.exists("aap/log"):
       i = 8
       while i >= 0:
           if i == 0:
               src = "aap/log"
           else:
               src = "aap/log%d" % i
           if os.path.exists(src):
               dst = "aap/log%d" % (i + 1)
               # May have to delete the destination file log9.
               if i == 8:
                   try:
                       os.remove(dst)
                   except:
                       pass
               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("aap/log", "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("aap/log")


def msg_logname():
   """Return the name of the log file."""
   return logname


def msg_msg(msg, type):
   """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."""
   if (not Global.work
           or string.find(Global.work.globals["MESSAGE"], type) >= 0
           or string.find(Global.work.globals["MESSAGE"], msgt_all) >= 0):
       print "Aap: " + msg
   msg_log(msg, type)

def msg_log(msg, type):
   if logfile:
       try:
           logfile.write("%s:\t%s\n" % (type, msg))
       except IOError, e:
           raise UserError, _('Error while writing to log file: ') + str(e)

def msg_warning(msg):
   """Print a warning message."""
   msg_msg(msg, msgt_warning)

def msg_error(msg):
   """Print an error message."""
   msg_msg(msg, msgt_error)

def msg_system(msg):
   """Print an executed system command."""
   if msg[-1] == '\n':
       msg = msg[:-1]      # remove trailing newline
   msg_msg(msg, msgt_system)

def msg_result(msg):
   """Print an executed system command."""
   if msg[-1] == '\n':
       msg = msg[:-1]      # remove trailing newline
   msg_msg(msg, msgt_result)

def msg_info(msg):
   """Print an informational message."""
   msg_msg(msg, msgt_info)

def msg_extra(msg):
   """Print an extra informational message."""
   msg_msg(msg, msgt_extra)

def msg_changedir(msg):
   """Print a message about changing directories."""
   msg_msg(msg, msgt_changedir)

def msg_depend(msg):
   """Print a message about dependencies."""
   msg_msg(msg, msgt_depend)

def msg_print(msg):
   """Print a message always, and log it."""
   print msg
   msg_log(msg, msgt_print)


def msg_init(globals):
   """Set the MESSAGE variable according to the command line arguments.
      Skip this when it's already set from the command line."""
   if not globals.has_key("MESSAGE"):
       if Global.cmd_args.has_option("silent"):
           globals["MESSAGE"] = msgt_error
       elif Global.cmd_args.has_option("verbose"):
           globals["MESSAGE"] = msgt_all
       else:
           globals["MESSAGE"] = (msgt_changedir + ","
                           + msgt_error + "," + msgt_system + "," + msgt_info)

# vim: set sw=4 sts=4 tw=79 fo+=l: