Message.py :  » Build » A-A-P » aap-1.091 » Python Open Source

Home
Python Open Source
1.3.1.2 Python
2.Ajax
3.Aspect Oriented
4.Blog
5.Build
6.Business Application
7.Chart Report
8.Content Management Systems
9.Cryptographic
10.Database
11.Development
12.Editor
13.Email
14.ERP
15.Game 2D 3D
16.GIS
17.GUI
18.IDE
19.Installer
20.IRC
21.Issue Tracker
22.Language Interface
23.Log
24.Math
25.Media Sound Audio
26.Mobile
27.Network
28.Parser
29.PDF
30.Project Management
31.RSS
32.Search
33.Security
34.Template Engines
35.Test
36.UML
37.USB Serial
38.Web Frameworks
39.Web Server
40.Web Services
41.Web Unit
42.Wiki
43.Windows
44.XML
Python Open Source » Build » A A P 
A A P » aap 1.091 » Message.py
# 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:
www.java2java.com | Contact Us
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.