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]