home *** CD-ROM | disk | FTP | other *** search
- # Copyright 2001 (C) ActiveState Tool Corp., All Rights Reserved.
- #
- import string
- import ppmconfig
- import traceback
- from sys import exc_info, stderr
- from types import *
- from formatter import DumbWriter
- from cStringIO import StringIO
-
-
- class ErrorReporter:
- def __init__(self, tracer, formatter):
- self.tracer = tracer
- self.formatter = formatter
-
- def LowError(self, msg):
- #low priority errors are considered level 2 tracing messages
- self.tracer.log('Error: '+str(msg) , 2)
-
- def Error(self, msg):
- #errors are considered level 1 tracing messages
- self.tracer.log('ERROR: '+str(msg) , 1)
-
- def Fatal(self, msg):
- #fatal errors are considered level 0 tracing messages and cause the
- #program to halt
- self.tracer.log('FATAL ERROR: '+ str(msg) , 0)
-
- def Warn(self, msg):
- #warnings are considered level 3 messages.
- self.tracer.log('WARNING :' + str(msg) , 3)
-
- def Msg(self, msg):
- #this is just a message which is considered level 4 tracing message
- self.tracer.log(str(msg) , 4)
-
- class basic(Exception):
- def __init__(self):
- self.__msg__ = self.__doc__
-
- def __repr__(self):
- return self.__msg__
- __str__ = __repr__
-
- class AlreadyInstalled(basic):
- """Package is already installed"""
- def __init__(self):
- basic.__init__(self)
-
- class InvalidRegx(basic):
- ""
- def __init__(self,msg):
- self.__doc__ += str(msg)
- basic.__init__(self)
-
- class BadPPD(basic):
- """bad ppd found: """
- def __init__(self,msg):
- self.__doc__ +=str(msg)
- basic.__init__(self)
-
- class NodeNotFound(basic):
- """The specified node can not be found."""
- def __init__(self):
- basic.__init__(self)
-
- class ProtocolError(basic):
- """protocol error"""
- def __init__(self,msg):
- self.__doc__ += str(msg)
- basic.__init__(self)
-
- class FailInstall(basic):
- """Package can not be installed: """
- def __init__(self,msg):
- self.__doc__ += str(msg)
- basic.__init__(self)
-
- class PackageNotFound(basic):
- """Package can not be found."""
- def __inti__(self):
- basic.__init__(self)
-
- class BadConfigFile(basic):
- """Error reading config file: """
- def __init__(self,msg):
- self.__doc__ += msg
- basic.__init__(self)
-
- class StderrErrorDisplay:
- def display(self, msg, severity):
- stderr.write("\n"+msg+"\n")
-
- class Win32ErrorDisplay:
- def display(self, msg, severity):
- from win32ui import MessageBox
- MessageBox(msg, "PPM")
-
- class Tracer:
- def __init__(self):
- # for now, override the displayer like this:
- # errorreporter.tracer.displayer = Win32Displayer()
- self.displayer = StderrErrorDisplay() # by default...
- self.disable_log = 0
- self.fname = ''
- self.file = None
- self.tl = 0
- self.verbose = 0
-
- def init(self, fname):
- try:
- import os
- if os.path.getsize(fname)>1.024e+6:
- os.remove(fname)
- except (OSError, IOError), e:
- pass
-
- try:
- self.file = open(fname , 'a+')
- self.fname = fname
- except IOError, e:
- printfunc('Can not access the log file. Logging is disabled: %s' % e)
- self.disable_log = 1
-
- def SetLogName(self, fname):
- if hasattr(self, "file") and hasattr(self, "fname"):
- if self.file and self.fname != fname:
- self.file.close()
- else:
- import os
- try:
- if os.path.getsize(fname)>1.024e+6:
- os.remove(fname)
- self.file = open(fname , 'a+')
- self.fname = fname
- except IOError, e:
- print 'Can not access the log file. Logging is disabled: %s' % e
- self.disable_log = 1
- else:
- import os
- try:
- if os.path.getsize(fname)>1.024e+6:
- os.remove(fname)
- except (OSError, IOError):
- pass
- try:
- self.file = open(fname , 'a+')
- self.fname = fname
- except IOError, e:
- print 'Can not access the log file. Logging is disabled: %s' % e
- self.disable_log = 1
-
- def log(self, msg, msg_tl = 0 ): # XXX this is not how you do
- # optional arguments in pyhon.
- if not self.file:
- self.init('PPM.LOG')
-
- # warnings and low priority errors are not
- # printed on the screen in any mode.
- if (self.verbose and int(msg_tl)>3) or msg_tl<2:
- self.displayer.display(msg, msg_tl)
-
- # add stack trace to the error messages, prior to logging
- if int(self.tl) >= int(msg_tl):
- if msg_tl<3:
- tracebak = exc_info()[2]
- if tracebak:
- info = traceback.extract_tb(tracebak , 1)[0]
- msg += '<'+'FILENAME:'+str(info[0])+'--FUNCTION:'+str(info[2])+\
- '--LINE NO:'+str(info[1])+'>'
- if not self.disable_log:
- self.file.write(msg+'\n')
- self.file.flush()
-
- def cnvrtVersion(versionStr,ln):
- versionStr=str(versionStr) # un-unicode if necessary
- versions = []
- for ver in versionStr.split("."):
- try:
- versions.append(int(ver))
- except ValueError:
- versions.append(0)
-
- versionStr = ".".join([str(version) for version in versions])
-
- if len(versionStr)<ln:
- versionStr += ' '*(ln - len(versionStr))
- elif len(versionStr)>ln:
- versionStr = versionStr[:ln]
- return versionStr
-
- # adjust the index to word boundaries
- def AdjustWordBoundaryBackward(str,pos):
- SPACE = ' '
- try:
- if str[pos] != SPACE:
- while str[pos-1]!=SPACE:
- pos -= 1
- return pos
- except IndexError:
- return pos
-
- def AdjustWordBoundaryForward(str,pos):
- SPACE = ' '
- try:
- while str[pos]==SPACE:
- pos +=1
- return pos
- except IndexError:
- return pos
-
- def formatAbs(str, column, indent):
- out = StringIO()
- writer = DumbWriter(out, 49)
- writer.send_flowing_data(str)
- lines = out.getvalue().strip().splitlines()
- prefix = " " * indent
- lines = [lines[0]] + [prefix + line for line in lines[1:]]
- return "\n".join(lines)
-
- def oldformatAbs(abs,ln,margin):
- TAB_SIZE = 8
- LARGEST_WORD_SIZE = 15
- abs = string.replace(abs,'\n',' ')
- abs = string.replace(abs,'\t',' '*TAB_SIZE)
- abs = string.replace(abs,'\r','')
- abs.strip()
- if len(abs)<=ln or len(abs)==0:
- return abs
- else:
- MyAbs = ''
- LineNo = 0
- i =0
- OldEndPos = 0
- while i<=len(abs):
- dummy = ln*(1+LineNo)
- EndPos = AdjustWordBoundaryBackward(abs,dummy)
- StartPos = AdjustWordBoundaryForward(abs,OldEndPos)
- if LineNo: MyAbs += ' '*margin
- # do not wrap if the following happens
- if EndPos<StartPos or \
- (dummy-EndPos)>LARGEST_WORD_SIZE:
- MyAbs += abs[StartPos:dummy]
- if dummy < len(abs):
- MyAbs += '\n'
- i += dummy - OldEndPos
- OldEndPos = dummy
- else:
- MyAbs += abs[StartPos:EndPos]
- if EndPos < len(abs):
- MyAbs += '\n'
- i += EndPos - OldEndPos
- OldEndPos = EndPos
- LineNo += 1
-
- return MyAbs
-
- class Formatter:
-
- def __init__(self):
- self.interactive = 0
- self.verbose = 0
- self.TotalLines = 0
- self.maxname=18
- self.maxversion=7
- import os
- if os.environ.has_key('COLUMNS'):
- self.columns = os.environ['COLUMNS']
- else:
- self.columns = 80
- self.maxabs = self.columns - self.maxname - self.maxversion - 6
-
- def reInit(self):
- self.maxabs = self.columns - self.maxname - self.maxversion - 6
-
- def FormatPackage(self,obj):
- if len(obj.name) > self.maxname:
- PackName = obj.name[:self.maxname]
- else:
- PackName = obj.name+' '*(self.maxname - len(obj.name))
- Version = cnvrtVersion(obj.version, self.maxversion)
- Abstract = formatAbs(obj.abstract,self.maxabs,\
- self.columns-self.maxabs)
- FormatStr = '%s'+' '*1+'[ %s ]'+' '*1+'%s'
- return FormatStr % (PackName , Version, Abstract)
-
- def formatPackage(self,obj):
- self.reInit()
- if isinstance(obj, ppmconfig.InstalledPackage):
- s = self.FormatPackage(obj)
- self.TotalLines += string.count(s,'\n')+1
- return s
-
- if isinstance(obj, ppmconfig.Package):
- s = self.FormatPackage(obj)
- self.TotalLines += string.count(s,'\n')+1
- return s
-
- def formatOptions(self, obj, printfunc):
- if type(obj) is DictType:
- for x in obj.keys():
- printfunc( x+' = '+str(obj[x]))
-
- if isinstance(obj, ppmconfig.Repository):
- printfunc( 'Repository Name: %s ' % obj.name)
- printfunc( '\t Address: '+obj.uri)
- printfunc( '\t Namespace: '+obj.namespace)
-
- if type(obj) is ListType:
- # calls itself with every item in the list
- for o in obj:
- self.formatOptions(o, printfunc)
-
- errorreporter = ErrorReporter(Tracer(), Formatter())
-
-