ajack       2004/03/01 10:58:01

  Modified:    python/gump/model project.py state.py module.py property.py
                        workspace.py object.py
               python/gump/document forrest.py
               python/gump/results resulter.py model.py
               python/gump/utils tools.py
               profile  gump.xml
               python/gump engine.py
  Log:
  1) Tinkering w/ adding a Tracker [one day will link to]

  2) Results ...

  2.1) Gathering results from other servers [downloading/parsing results.xml]

  2.2) Generating results.xml for this server

  3) Making 'catDirectoryToFileHolder' do a directory listing also, for debugging.

  
  Revision  Changes    Path
  1.58      +8 -4      gump/python/gump/model/project.py
  
  Index: project.py
  ===================================================================
  RCS file: /home/cvs/gump/python/gump/model/project.py,v
  retrieving revision 1.57
  retrieving revision 1.58
  diff -u -r1.57 -r1.58
  --- project.py        29 Feb 2004 19:16:19 -0000      1.57
  +++ project.py        1 Mar 2004 18:58:00 -0000       1.58
  @@ -66,6 +66,7 @@
   
   from gump.model.state import *
   from gump.model.object import ModelObject, NamedModelObject, Jar,    \
  +                                Resultable, \
                                    Mkdir, Delete, JunitReport, Work
   from gump.model.stats import Statable, Statistics
   from gump.model.property import Property
  @@ -178,10 +179,13 @@
           return os.pathsep.join(self.getSimpleClasspathList())
               
   
  -class Project(NamedModelObject, Statable):
  +class Project(NamedModelObject, Statable, Resultable):
       """A single project"""
       def __init__(self,xml,workspace):
        NamedModelObject.__init__(self,xml.getName(),xml,workspace)
  +     
  +     Statable.__init__(self)
  +     Resultable.__init__(self)
        
        # Navigation
           self.module=None # Module has to claim ownership
  
  
  
  1.12      +24 -3     gump/python/gump/model/state.py
  
  Index: state.py
  ===================================================================
  RCS file: /home/cvs/gump/python/gump/model/state.py,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- state.py  17 Feb 2004 21:54:20 -0000      1.11
  +++ state.py  1 Mar 2004 18:58:00 -0000       1.12
  @@ -148,6 +148,19 @@
                       REASON_BUILD_TIMEDOUT : "BuildTimedOut",
                       REASON_MISSING_OUTPUTS : "MissingBuildOutputs" }    
                       
  +namedReasonCode = { "NotSet" : REASON_UNSET,
  +                    "CompletePackageInstall" : REASON_PACKAGE,
  +                    "BadPackageInstallation" : REASON_PACKAGE_BAD,
  +                    "CircularDependency" : REASON_CIRCULAR,
  +                    "ConfigurationFailed" : REASON_CONFIG_FAILED,
  +                    "UpdateFailed" : REASON_UPDATE_FAILED,
  +                    "SynchronizeFailed" : REASON_SYNC_FAILED,
  +                    "Pre-BuildFailed" : REASON_PREBUILD_FAILED,
  +                    "BuildFailed" : REASON_BUILD_FAILED,
  +                    "Post-BuildFailed" : REASON_POSTBUILD_FAILED,
  +                    "BuildTimedOut" : REASON_BUILD_TIMEDOUT,
  +                    "MissingBuildOutputs" : REASON_MISSING_OUTPUTS }    
  +                    
   reasonCodeDescriptions = {   REASON_UNSET : "Not Set",
                       REASON_PACKAGE : "Complete Package Install",
                       REASON_PACKAGE_BAD : "Bad Package Installation",
  @@ -166,6 +179,14 @@
       
   def reasonDescription(reasonCode):
       return reasonCodeDescriptions.get(reasonCode,'Unknown Reason:' + 
str(reasonCode))
  +    
  +def reasonForName(name):
  +    return namedReasonCode.get(name,STATE_UNSET)    
  +    
  +def getStatePairFromNames(stateName,reasonName):
  +    state=stateForName(stateName)
  +    reason=reasonForName(reasonName)    
  +    return StatePair(state,reason)
             
   class StatePair:
       """Contains a State Plus Reason"""
  
  
  
  1.34      +8 -5      gump/python/gump/model/module.py
  
  Index: module.py
  ===================================================================
  RCS file: /home/cvs/gump/python/gump/model/module.py,v
  retrieving revision 1.33
  retrieving revision 1.34
  diff -u -r1.33 -r1.34
  --- module.py 23 Feb 2004 20:55:08 -0000      1.33
  +++ module.py 1 Mar 2004 18:58:00 -0000       1.34
  @@ -67,7 +67,7 @@
   from gump.model.state import *
   from gump.model.stats import Statable, Statistics
   from gump.model.project import *
  -from gump.model.object import NamedModelObject
  +from gump.model.object import NamedModelObject, Resultable
   from gump.utils import getIndent
   from gump.utils.note import transferAnnotations, Annotatable
   
  @@ -192,11 +192,14 @@
       unnamedModule.complete(workspace)
       return unnamedModule
           
  -class Module(NamedModelObject, Statable):
  +class Module(NamedModelObject, Statable, Resultable):
       """Set of Modules (which contain projects)"""
       def __init__(self,xml,workspace):
        NamedModelObject.__init__(self,xml.getName(),xml,workspace)
                
  +     Statable.__init__(self)
  +     Resultable.__init__(self)
  +     
        self.totalDepends=[]
        self.totalDependees=[]
        
  
  
  
  1.13      +12 -10    gump/python/gump/model/property.py
  
  Index: property.py
  ===================================================================
  RCS file: /home/cvs/gump/python/gump/model/property.py,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- property.py       10 Feb 2004 00:43:19 -0000      1.12
  +++ property.py       1 Mar 2004 18:58:00 -0000       1.13
  @@ -137,6 +137,7 @@
               # If a property on a project..
               #
               if not parent==workspace: 
  +                relativeProject=None
                   # If on a referenced project
                   if self.xml.project:
                       if not workspace.hasProject(self.xml.project):
  @@ -148,13 +149,14 @@
                   else:
                       # Relative to this project...
                       relativeProject=responsibleParty
  -                                        
  -                #
  -                # Path relative to module's srcdir (doesn't work in workspace)
  -                #        
  -                self.value=os.path.abspath(os.path.join(     \
  -                        relativeProject.getModule().getSourceDirectory(),    \
  -                        self.xml.path))
  +                
  +                if relativeProject:                        
  +                    #
  +                    # Path relative to module's srcdir (doesn't work in workspace)
  +                    #        
  +                    self.value=os.path.abspath(os.path.join( \
  +                            relativeProject.getModule().getSourceDirectory(),       
 \
  +                            self.xml.path))
               else:
                   responsibleParty.addError('Can\'t have path on property on 
workspace: ' + \
                       + self.getName())
  
  
  
  1.31      +9 -7      gump/python/gump/model/workspace.py
  
  Index: workspace.py
  ===================================================================
  RCS file: /home/cvs/gump/python/gump/model/workspace.py,v
  retrieving revision 1.30
  retrieving revision 1.31
  diff -u -r1.30 -r1.31
  --- workspace.py      29 Feb 2004 19:16:19 -0000      1.30
  +++ workspace.py      1 Mar 2004 18:58:00 -0000       1.31
  @@ -76,7 +76,7 @@
   from gump.model.module import Module, createUnnamedModule
   from gump.model.project import Project, ProjectSummary
   from gump.model.profile import Profile
  -from gump.model.object import NamedModelObject
  +from gump.model.object import NamedModelObject, Resultable
   from gump.model.property import PropertyContainer
   from gump.model.stats import Statable, Statistics
   from gump.utils.note import transferAnnotations, Annotatable
  @@ -91,7 +91,7 @@
   BAD_ENVIRONMENT=3
   
   
  -class Workspace(NamedModelObject, PropertyContainer, Statable):
  +class Workspace(NamedModelObject, PropertyContainer, Statable, Resultable):
       """Gump Workspace"""
       def __init__(self,xmlworkspace):
       
  @@ -102,8 +102,10 @@
                   name=xmlworkspace.getName()
               
        NamedModelObject.__init__(self,name,xmlworkspace)       
  -     PropertyContainer.__init__(self)
  -     
  +     PropertyContainer.__init__(self)    
  +     Statable.__init__(self)
  +     Resultable.__init__(self)
  +             
        #
        # Named repositories (e.g. CVS,SVN,etc.)
        # Named modules
  
  
  
  1.19      +39 -4     gump/python/gump/model/object.py
  
  Index: object.py
  ===================================================================
  RCS file: /home/cvs/gump/python/gump/model/object.py,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- object.py 24 Feb 2004 19:32:28 -0000      1.18
  +++ object.py 1 Mar 2004 18:58:00 -0000       1.19
  @@ -270,7 +270,42 @@
           """ Display the contents of this object """
           output.write(getIndent(indent)+'Name: ' + self.name + '\n')
           ModelObject.dump(self,indent+1,output)
  -
  +          
  +class Resultable:
  +    def __init__(self): 
  +        pass
  +    
  +    # Stats are loaded separately and cached on here,
  +    # hence they may exist on an object at all times.
  +    def hasServerResults(self):
  +        return hasattr(self,'serverResults')
  +        
  +    def setServerResults(self,serverResults):
  +        self.serverResults=serverResults
  +        
  +    def getServerResults(self):
  +        if not self.hasServerResults():
  +            raise RuntimeError, "ServerResults not available [yet]: " \
  +                    + self.getName()
  +        return self.serverResults
  +        
  +    
  +    # Stats are loaded separately and cached on here,
  +    # hence they may exist on an object at all times.
  +    def hasResults(self):
  +        return hasattr(self,'results')
  +        
  +    def setResults(self,results):
  +        self.results=results
  +        
  +    def getResults(self):
  +        if not self.hasResults():
  +            raise RuntimeError, "Results not available [yet]: " \
  +                    + self.getName()
  +        return self.results
  +        
  +        
  +        
   # represents a <nag/> element
   class Nag(ModelObject):
       def __init__(self,toaddr,fromaddr):
  
  
  
  1.87      +30 -10    gump/python/gump/document/forrest.py
  
  Index: forrest.py
  ===================================================================
  RCS file: /home/cvs/gump/python/gump/document/forrest.py,v
  retrieving revision 1.86
  retrieving revision 1.87
  diff -u -r1.86 -r1.87
  --- forrest.py        26 Feb 2004 19:15:01 -0000      1.86
  +++ forrest.py        1 Mar 2004 18:58:00 -0000       1.87
  @@ -1387,18 +1387,36 @@
           serversSection.createParagraph('These links represent this location on 
other servers.')      
           serversTable=serversSection.createTable()
           serverRow=serversTable.createRow()
  +        
  +        serverResults=None
  +        if isinstance(linkable,Resultable):
  +            serverResults=linkable.getServerResults()
  +            
           for server in servers: 
  +        
  +            # If we know state on the other server.
  +            statePair=None
  +            if serverResults and serverResults.has_key(server):
  +                results=serverResults[server]
  +                statePair=results.getStatePair()
  +                                
               # If we can resolve this object to a URL, then do
  +            xdocNode=None
  +                        
               if server.hasResolver():
  -                serverRow.createData().createFork(   \
  -                        server.getResolver().getUrl(linkable), \
  -                        'On ' + server.getName() )
  +                xdocNode=serverRow.createData().createFork(  \
  +                        server.getResolver().getUrl(linkable))
               else:
                   # Else just link to the server.
                   if server.hasUrl():
  -                    serverRow.createData().createFork(       \
  -                            server.getUrl(), \
  -                            '~ ' + server.getName() )    
  +                    xdocNode=serverRow.createData().createFork(      \
  +                            server.getUrl())  
  +            
  +            if xdocNode and statePair:
  +                depth=getDepthForObject(linkable)
  +                self.insertStatePairIconAtDepth(xdocNode, statePair,depth)
  +            else:
  +                xdocNode.createText('On ' + server.getName())
                   
                           
       def documentProperties(self,xdocNode,propertyContainer,title='Properties'):
  @@ -1837,7 +1855,9 @@
       def insertStatePairIcon(self,xdocNode,toObject,fromObject):
           pair=toObject.getStatePair()
           depth=getDepthForObject(fromObject)
  -        
  +        self.insertStatePairIconAtDepth(xdocNode,pair,depth)
  +                
  +    def insertStatePairIconAtDepth(self,xdocNode,pair,depth):
           # :TODO: Move this to some resolver, and share with RSS
           sname=stateDescription(pair.state)
           rstring=reasonDescription(pair.reason)    
  
  
  
  1.5       +83 -7     gump/python/gump/results/resulter.py
  
  Index: resulter.py
  ===================================================================
  RCS file: /home/cvs/gump/python/gump/results/resulter.py,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- resulter.py       28 Feb 2004 00:24:32 -0000      1.4
  +++ resulter.py       1 Mar 2004 18:58:00 -0000       1.5
  @@ -82,11 +82,41 @@
           self.gumpSet=run.getGumpSet()

           

           self.serverResults = {}

  +        self.serversLoaded = 0

           

  -    #def getResultsFor(self, object):

  -    #    for server in self.workspace.getServers():

  +    def getServerResultFor(sefl, server, object):

  +        results=self.getResultsForAllServers(object)

  +        if results.has_key(server):

  +            return results[server]

  +        

  +    def getResultsForAllServers(self, object):

  +        results = {}

  +        

  +        # Loda on demand

  +        if not self.seerversLoaded:

  +            self.loadResultsForServers()

               

  +        # For all servers, extract any result

  +        for server in self.workspace.getServers():

  +            result=None

  +            if self.serverResults.has_key(server):

  +                serverResults=self.serverResults[server]

  +                if isinstance(object,NamedObject):

  +                    name=object.getName()

  +                    if isinstance(object,Workspace):                    

  +                        result=serverResults

  +                    elif isinstance(object,Module):                    

  +                        result=serverResults.getModuleResult(name)

  +                    elif isinstance(object,Project):

  +                        result=serverResults.getProjectResult(name)

  +                    else:

  +                        raise RuntimeError('Not understood')

  +                

  +            if result:

  +                results[server] = result

           

  +        return results

  +            

       def loadResultsForServers(self):

           for server in self.workspace.getServers():       

               if not server in self.serverResults:

  @@ -105,22 +135,52 @@
           loader =  WorkspaceResultLoader()        

           return loader.loadFromUrl(url)

           

  -    def generateResults(self,where=None):

  +    def gatherResults(self):

           """

  -        Generate a results file

  +        Gather results from servers and set onto workspace/modules/projects

           """

  -        

  +      

  +        # For all modules...

  +        for module in self.workspace.getModules():        

  +                if not self.gumpSet.inModules(module): continue

  +                

  +                #

  +                # Gather results for this module

  +                #

  +                moduleResults = self.getResultsForAllServers(module)

  +

  +                if moduleResults:

  +                    module.setServerResults(moduleResults)

  +                

  +                # Add projects

  +                for project in module.getProjects():

  +                    if not self.gumpSet.inSequence(project): continue    

  +                    

  +                    #

  +                    # Gather results for this project

  +                    #

  +                    projectResults = self.getResultsForAllServers(project)

  +

  +                    if projectResults:

  +                        project.setServerResults(projectResults)

  +                

  +    def generateResults(self,where=None):

  +        """ Generate a results file """

           workspaceResults = self.constructResults()

           

           # If not told where to stick it, contstruct...

           if not where: where=workspaceResults.getName()+'.xml'

           

           workspaceResults.writeXMLToFile(where)

  -        

  +

       def constructResults(self):

           """

  -        Generate a results file

  +        Construct result objects from tree of states

           """

  +        

  +        if self.workspace.hasResults():

  +            return self.workspace.getResults()

  +        

           # Create

           workspaceResults = WorkspaceResult(self.workspace.getName())

       

  @@ -138,6 +198,8 @@
                   # Stats?

                   moduleResults.setStatePair(module.getStatePair())

                   

  +                module.setResults(moduleResults)

  +                

                   # Add projects

                   for project in module.getProjects():

                       if not self.gumpSet.inSequence(project): continue    

  @@ -149,6 +211,9 @@
                       

                       # Set attributes:

                       projectResults.setStatePair(project.getStatePair())

  +                                    

  +                    # Stash on project

  +                    project.setResults(projectResults)                

                   

                       # Stash on moduleResult

                       moduleResults.setProjectResult(projectResults)

  @@ -159,6 +224,9 @@
                   # Stash moduleResult on workspaceResult

                   workspaceResults.setModuleResult(moduleResults)

                   

  +        # Stash on workspace

  +        self.workspace.setResults(workspaceResults)

  +                

           return workspaceResults

               

       

  @@ -171,4 +239,12 @@
       

       # Generate the output...

       resulter.generateResults(where)

  +    

  +def gatherResults(run):

  +    

  +    # Generate results around this run...

  +    resulter=Resulter(run)

  +    

  +    # Generate the output...

  +    resulter.gatherResults()

       
  
  
  
  1.4       +14 -2     gump/python/gump/results/model.py
  
  Index: model.py
  ===================================================================
  RCS file: /home/cvs/gump/python/gump/results/model.py,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- model.py  28 Feb 2004 00:11:39 -0000      1.3
  +++ model.py  1 Mar 2004 18:58:00 -0000       1.4
  @@ -100,6 +100,12 @@
       def setComplete(self,complete):

          self.completionPerformed=complete

            

  +    def completeState(self,node=None):

  +        if not node: node=self.dom

  +        stateName=node.getAttribute('state')

  +        reasonName=node.getAttribute('reason')

  +        self.setStatePair(getStatePairFromNames(stateName,reasonName))

  +        

       #

       # Same if same type, and same name

       # i.e project context X is not equals to module context X

  @@ -220,6 +226,10 @@
                       

       def complete(self): 

           if self.isComplete() or not self.hasDom(): return

  +                

  +        # Workspace dom is document, but stuff on first

  +        # element

  +        self.completeState(self.dom.documentElement)

           

           #

           # Import all modules

  @@ -276,7 +286,9 @@
               

       def complete(self): 

           if self.isComplete() or not self.hasDom(): return

  -            

  +                        

  +        self.completeState()

  +        

           for domprojectresult in self.dom.getElementsByTagName('projectResult'):     
       

               
projectResult=ProjectResult(domprojectresult.getAttribute('name'),domprojectresult,self)

               projectResult.complete()

  @@ -309,6 +321,6 @@
           

       def complete(self): 

           if self.isComplete(): return

  -    

  +        self.completeState()

           self.setComplete(1)

           

  
  
  
  1.14      +5 -3      gump/python/gump/utils/tools.py
  
  Index: tools.py
  ===================================================================
  RCS file: /home/cvs/gump/python/gump/utils/tools.py,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- tools.py  25 Feb 2004 13:23:32 -0000      1.13
  +++ tools.py  1 Mar 2004 18:58:00 -0000       1.14
  @@ -143,6 +143,8 @@
       
   def 
catDirectoryContentsToFileHolder(holder,directory,type=FILE_TYPE_MISC,name=None):
       try:
  +        listDirectoryToFileHolder(holder,directory,type,name)
  +        
           if os.path.exists(directory) and  os.path.isdir(directory):
               for fileName in os.listdir(directory):
                   baseName=name    
  
  
  
  1.311     +4 -0      gump/profile/gump.xml
  
  Index: gump.xml
  ===================================================================
  RCS file: /home/cvs/gump/profile/gump.xml,v
  retrieving revision 1.310
  retrieving revision 1.311
  diff -u -r1.310 -r1.311
  --- gump.xml  29 Feb 2004 19:03:39 -0000      1.310
  +++ gump.xml  1 Mar 2004 18:58:01 -0000       1.311
  @@ -353,6 +353,10 @@
     <server href="server/lsd.xml"/>
     <server href="server/dotnot.xml"/>
     <server href="server/covalent.xml"/>
  +
  +<!-- tracker definitions -->
  +
  +  <tracker href="tracker/apache-jira.xml"/>
     
   </profile>
   
  
  
  
  1.66      +20 -15    gump/python/gump/engine.py
  
  Index: engine.py
  ===================================================================
  RCS file: /home/cvs/gump/python/gump/engine.py,v
  retrieving revision 1.65
  retrieving revision 1.66
  diff -u -r1.65 -r1.66
  --- engine.py 28 Feb 2004 00:10:38 -0000      1.65
  +++ engine.py 1 Mar 2004 18:58:01 -0000       1.66
  @@ -123,7 +123,7 @@
           self.preprocess(run)
           
           #
  -        # Laod the statistics (so we can use them during
  +        # Load the statistics (so we can use them during
           # other operations).
           #
           logResourceUtilization('Before load statistics')
  @@ -134,32 +134,38 @@
           #
           logResourceUtilization('Before update')
           self.update(run)
  -
  -        logResourceUtilization('Before build')
           
           #
           # Run the build commands
           #
  +        logResourceUtilization('Before build')
           self.buildAll(run)
     
  +        #
  +        # Gather results.xml from other servers/workspaces
  +        #
  +        logResourceUtilization('Before generate results')
  +        gatherResults(run)
  +        
  +  
  +        # Update Statistics/Results on full runs            
           if run.getGumpSet().isFull():
  +            
               logResourceUtilization('Before statistics update')
  -        
  -            # Update Statistics
               self.updateStatistics(run)
  -              
  -        
  +            
  +            #
  +            # Generate results.xml for this run, on this server/workspace
  +            #
  +            logResourceUtilization('Before generate results')
  +            generateResults(run)
  +                    
           #
           # Provide a news feed (or few)
           #
           logResourceUtilization('Before syndicate')
           syndicate(run)
  -                 
  -        #
  -        # Generate results.xml
  -        #
  -        generateResults(run)
  -        
  +                        
           #   
           # Build HTML Result (via Forrest or ...)
           #
  @@ -569,8 +575,7 @@
                       if not os.path.exists(jarPath):
                           project.changeState(STATE_FAILED,REASON_MISSING_OUTPUTS)
                           outputsOk=0
  -                        project.addError("Missing Output: " + str(jarPath))
  -                            
  +                        project.addError("Missing Output: " + str(jarPath))         
                   
                                    
                   if outputsOk: 
                       # If we have a <license name='...
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to