You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@gump.apache.org by bo...@apache.org on 2010/06/29 05:51:36 UTC
svn commit: r958813 - in /gump/live: ./ python/gump/actor/mvnrepoproxy/
python/gump/core/model/ python/gump/core/update/
Author: bodewig
Date: Tue Jun 29 03:51:36 2010
New Revision: 958813
URL: http://svn.apache.org/viewvc?rev=958813&view=rev
Log:
merge a few changes from trunk: generic output and wait for proxy
Added:
gump/live/python/gump/core/model/output.py
- copied unchanged from r958453, gump/trunk/python/gump/core/model/output.py
Modified:
gump/live/ (props changed)
gump/live/python/gump/actor/mvnrepoproxy/proxycontrol.py
gump/live/python/gump/core/model/__init__.py
gump/live/python/gump/core/model/misc.py
gump/live/python/gump/core/model/project.py
gump/live/python/gump/core/update/bzr.py (props changed)
gump/live/python/gump/core/update/darcs.py (props changed)
gump/live/python/gump/core/update/hg.py (props changed)
Propchange: gump/live/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Jun 29 03:51:36 2010
@@ -1 +1 @@
-/gump/trunk:746160,746727,746892,747270,747272-747273,747656,748010,748018,748028,748661,748967,760784-761159,815848,953630-954169,955387,957107,957408
+/gump/trunk:746160,746727,746892,747270,747272-747273,747656,748010,748018,748028,748661,748967,760784-761159,815848,953630-954169,955387,955837,956771,957107,957408,958453
Modified: gump/live/python/gump/actor/mvnrepoproxy/proxycontrol.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/actor/mvnrepoproxy/proxycontrol.py?rev=958813&r1=958812&r2=958813&view=diff
==============================================================================
--- gump/live/python/gump/actor/mvnrepoproxy/proxycontrol.py (original)
+++ gump/live/python/gump/actor/mvnrepoproxy/proxycontrol.py Tue Jun 29 03:51:36 2010
@@ -17,26 +17,27 @@
import os
import os.path
-import sys
import time
import urllib
from gump import log
-from gump.core.run.gumprun import *
+from gump.core.model.output import OUTPUT_JAR, OUTPUT_POM
+from gump.core.run.actor import AbstractRunActor, FinalizeRunEvent, \
+ InitializeRunEvent
-class MvnRepositoryProxyController(gump.core.run.actor.AbstractRunActor):
+class MvnRepositoryProxyController(AbstractRunActor):
"""
Starts/Stops the proxy, adds artifacts to it when a project has
been built, collects the results.
"""
- def __init__(self, run, javaCommand='java'):
- gump.core.run.actor.AbstractRunActor.__init__(self, run)
+ def __init__(self, run, javaCommand = 'java'):
+ AbstractRunActor.__init__(self, run)
self.proxyURL = "http://localhost:%s/" \
% (run.getWorkspace().mvnRepoProxyPort)
self.java = javaCommand
- def processProject(self,project):
+ def processProject(self, project):
"""
Process a project (i.e. publish it's artifacts to the proxy)
"""
@@ -44,13 +45,16 @@ class MvnRepositoryProxyController(gump.
if project.okToPerformWork() and project.hasOutputs():
groupId = project.getArtifactGroup()
for output in project.getOutputs():
- fileName = os.path.abspath(output.getPath())
- try:
- log.info('Publishing \'%s\' to proxy' % (fileName))
- self.publish(groupId, output.getId(), fileName)
- except:
- log.error('Failed to publish \'%s\' to proxy' % (fileName),
- exc_info=1)
+ if output.getType() == OUTPUT_JAR \
+ or output.getType() == OUTPUT_POM:
+ fileName = os.path.abspath(output.getPath())
+ try:
+ log.info('Publishing \'%s\' output \'%s\' to proxy'
+ % (output.getType(), fileName))
+ self.publish(groupId, output.getId(), fileName)
+ except:
+ log.error('Failed to publish \'%s\' to proxy' %
+ (fileName), exc_info = 1)
def processOtherEvent(self, event):
if isinstance(event, InitializeRunEvent):
@@ -74,6 +78,16 @@ class MvnRepositoryProxyController(gump.
# TODO emulate spawnlp on non-Unix platforms
os.spawnlp(os.P_NOWAIT, self.java, self.java, '-jar', proxyJar,
self.workspace.mvnRepoProxyPort)
+ # Hang back for a bit while the proxy starts up
+ for _pWait in range(10):
+ try:
+ urllib.urlopen(self.proxyURL)
+ # Not reached until urlopen succeeds
+ log.info('mvn Repository proxy started')
+ break
+ except IOError:
+ time.sleep(1)
+ continue
except:
log.error('--- Failed to start proxy', exc_info=1)
@@ -86,13 +100,14 @@ class MvnRepositoryProxyController(gump.
proxyLogContent = proxyLogRequest.read()
proxyLogRequest.close()
# TODO xdocs-Documenter is hard-coded here
- proxyLogFile = open(os.path.join(os.path.join(self.workspace.getBaseDirectory(),
- 'xdocs-work'),
- proxyLogFileName), 'w')
+ proxyLogFile = open(os.path.join(
+ os.path.join(self.workspace.getBaseDirectory(),
+ 'xdocs-work'),
+ proxyLogFileName), 'w')
proxyLogFile.write(proxyLogContent)
- proxyLogFile.close();
+ proxyLogFile.close()
except:
- log.error('--- Failed to store ' + proxyLogFileName, exc_info=1)
+ log.error('--- Failed to store ' + proxyLogFileName, exc_info = 1)
log.info('Stopping mvn repository proxy')
try:
@@ -100,4 +115,4 @@ class MvnRepositoryProxyController(gump.
# allow Java process to stop before the Python process terminates
time.sleep(5)
except:
- log.error('--- Failed to stop proxy', exc_info=1)
+ log.error('--- Failed to stop proxy', exc_info = 1)
Modified: gump/live/python/gump/core/model/__init__.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/core/model/__init__.py?rev=958813&r1=958812&r2=958813&view=diff
==============================================================================
--- gump/live/python/gump/core/model/__init__.py (original)
+++ gump/live/python/gump/core/model/__init__.py Tue Jun 29 03:51:36 2010
@@ -41,7 +41,7 @@
###############################################################################
# tell Python what modules make up the gump.core.model package
-__all__ = ["misc","state", \
+__all__ = ["misc","state", "output", \
"object","project","module","workspace","repository", \
"builder","profile",]
Modified: gump/live/python/gump/core/model/misc.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/core/model/misc.py?rev=958813&r1=958812&r2=958813&view=diff
==============================================================================
--- gump/live/python/gump/core/model/misc.py (original)
+++ gump/live/python/gump/core/model/misc.py Tue Jun 29 03:51:36 2010
@@ -18,261 +18,210 @@
"""
This module contains miscellaneous model objects
-
+
"""
-from time import localtime, strftime, tzname
-from string import lower, capitalize
+import os
-#from gump.util.note import *
-#from gump.util.work import *
-#from gump.util.file import *
-#from gump.util.owner import *
-from gump.util.domutils import *
-from gump.core.model.object import *
+from gump.core.model.object import NamedModelObject, ModelObject
class Positioned:
def __init__(self):
- self.posn=-1
- self.total=-1
-
- def setPosition(self,posn):
+ self.posn = -1
+ self.total = -1
+
+ def setPosition(self, posn):
""" Set this object's position (within some sequence) """
- self.posn=posn
-
- def setTotal(self,total):
- """ Set the total length of sequence """
- self.total=total
+ self.posn = posn
+
+ def setTotal(self, total):
+ """ Set the total length of sequence """
+ self.total = total
def getPosition(self):
- """ Return either a tuple or a position, dependent upon if total is set. Mainly for presentation in ``. """
+ """ Return either a tuple or a position, dependent upon if
+ total is set. Mainly for presentation in ``. """
if -1 != self.total:
- return (self.posn,self.total)
+ return (self.posn, self.total)
if -1 != self.posn:
return self.posn
-
+
def getPositionIndex(self):
""" Get index in sequence """
return self.posn
-
+
class Resultable:
def __init__(self):
pass
-
- # Stats are loaded separately and cached on here,
+
+ # 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
-
+ 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,
+
+
+ # 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
-
+ 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):
- ModelObject.__init__(self,xml,workspace)
-
-# represents a <javadoc/> element
-class Javadoc(ModelObject): pass
-
-# represents a <description/> element
-class Description(ModelObject): pass
-
-# represents a <home/> element
-class Home(ModelObject): pass
-
-# represents an <output/> element
-class BaseOutput(NamedModelObject):
- def __init__(self,name,dom,owner):
- NamedModelObject.__init__(self,name,dom,owner)
- self.id=''
- self.type=''
-
- def setPath(self,path):
- self.path=path
-
- def getPath(self):
- return self.path;
-
- def hasId(self):
- if self.id: return True
- return False
-
- def setId(self,id):
- self.id = id
-
- def getId(self):
- return self.id
-
- def getType(self):
- return self.type
-
-# represents a <jar/> element
-class Jar(BaseOutput):
- """ Represents a <jar/> element."""
- pass
-
-class Assembly(BaseOutput):
- """ Represents an <assembly/> element."""
- pass
class Resolvable(ModelObject):
"""
- A ModelObject that can be resolved relative to it's owning model or workspace
- e.g. JUnitReport or Work
+ A ModelObject that can be resolved relative to it's owning model
+ or workspace e.g. JUnitReport or Work
"""
- def __init__(self,dom,owner):
- ModelObject.__init__(self,dom,owner)
- self.path=None
-
+ def __init__(self, dom, owner):
+ ModelObject.__init__(self, dom, owner)
+ self.path = None
+
def complete(self):
- if self.isComplete(): return
-
-
+ if self.isComplete():
+ return
+
+
if self.hasDomAttribute('nested'):
- self.path=os.path.abspath(
- os.path.join( self.owner.getModule().getWorkingDirectory(),
- self.getDomAttributeValue('nested')))
+ self.path = os.path.abspath(
+ os.path.join(self.owner.getModule().getWorkingDirectory(),
+ self.getDomAttributeValue('nested')))
elif self.hasDomAttribute('parent'):
- self.path=os.path.abspath(
- os.path.join(self.owner.getWorkspace().getBaseDirectory(),
- self.getDomAttributeValue('parent')))
-
+ self.path = os.path.abspath(
+ os.path.join(self.owner.getWorkspace().getBaseDirectory(),
+ self.getDomAttributeValue('parent')))
+
# Done, don't redo
- self.setComplete(True)
-
- def getResolvedPath(self):
+ self.setComplete(True)
+
+ def getResolvedPath(self):
return self.path
-
+
# represents a <junitreport/> element
class JunitReport(Resolvable):
- def __init__(self,dom,owner):
- Resolvable.__init__(self,dom,owner)
-
+ def __init__(self, dom, owner):
+ Resolvable.__init__(self, dom, owner)
+
# represents a <work/> element
class Work(Resolvable):
- def __init__(self,dom,owner):
- Resolvable.__init__(self,dom,owner)
-
+ def __init__(self, dom, owner):
+ Resolvable.__init__(self, dom, owner)
+
class DirResolvable(ModelObject):
"""
- Common code for getting a directory (attribute) and
- returning that as a path relative to the
+ Common code for getting a directory (attribute) and
+ returning that as a path relative to the
"""
- def __init__(self,dom,owner):
- ModelObject.__init__(self,dom,owner)
- self.dir=None
-
+ def __init__(self, dom, owner):
+ ModelObject.__init__(self, dom, owner)
+ self.dir = None
+
def complete(self):
- if self.isComplete(): return
-
+ if self.isComplete():
+ return
+
if self.hasDomAttribute('dir'):
- dirString=self.getDomAttributeValue('dir')
-
+ dirString = self.getDomAttributeValue('dir')
+
# Security attempt
# :TODO: Move to a one-time check
if '..' in dirString:
self.owner.addError('Bad directory attribute %s on <%s' % \
dirString, self.__class__.__name__)
- dirString='bogus'
-
- self.dir=os.path.abspath(
- os.path.join( self.owner.getModule().getWorkingDirectory(),
- dirString))
-
+ dirString = 'bogus'
+
+ self.dir = os.path.abspath(
+ os.path.join(self.owner.getModule().getWorkingDirectory(),
+ dirString))
+
# Done, don't redo
- self.setComplete(True)
+ self.setComplete(True)
def hasDirectory(self):
"""
Does it have a directory?
"""
- if self.dir: return True
+ if self.dir:
+ return True
return False
-
- def getDirectory(self):
+
+ def getDirectory(self):
"""
Get the directory.
"""
return self.dir
-
-
+
+
# represents a <mkdir/> element
class Mkdir(DirResolvable):
- def __init__(self,dom,owner):
- DirResolvable.__init__(self,dom,owner)
-
+ def __init__(self, dom, owner):
+ DirResolvable.__init__(self, dom, owner)
+
# represents a <delete/> element
class Delete(DirResolvable):
- def __init__(self,dom,owner):
- DirResolvable.__init__(self,dom,owner)
- self.file=None
-
+ def __init__(self, dom, owner):
+ DirResolvable.__init__(self, dom, owner)
+ self.file = None
+
def complete(self):
- if self.isComplete(): return
-
+ if self.isComplete():
+ return
+
DirResolvable.complete(self)
-
+
if self.hasDomAttribute('file'):
- file=self.getDomAttributeValue('file')
-
+ file = self.getDomAttributeValue('file')
+
# Security attempt
# :TODO: Move to a one-time check
if '..' in file:
self.owner.addError('Bad file attribute %s on <%s' % \
file, self.__class__.__name__)
- file='bogus'
-
- self.file=os.path.abspath(
- os.path.join( self.owner.getModule().getWorkingDirectory(),
- file))
-
+ file = 'bogus'
+
+ self.file = os.path.abspath(
+ os.path.join(self.owner.getModule().getWorkingDirectory(),
+ file))
+
# Done, don't redo
- self.setComplete(True)
-
+ self.setComplete(True)
+
def hasFile(self):
- if self.file: return True
+ if self.file:
+ return True
return False
-
- def getFile(self):
+
+ def getFile(self):
return self.file
-
+
class AddressPair:
- def __init__(self,toAddr,fromAddr):
- self.toAddr=toAddr
- self.fromAddr=fromAddr
-
+ def __init__(self, toAddr, fromAddr):
+ self.toAddr = toAddr
+ self.fromAddr = fromAddr
+
def __str__(self):
return '[To:' + self.toAddr + ', From:' + self.fromAddr + ']'
-
+
def getToAddress(self):
return self.toAddr
-
+
def getFromAddress(self):
return self.fromAddr
-
-
+
+
Modified: gump/live/python/gump/core/model/project.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/core/model/project.py?rev=958813&r1=958812&r2=958813&view=diff
==============================================================================
--- gump/live/python/gump/core/model/project.py (original)
+++ gump/live/python/gump/core/model/project.py Tue Jun 29 03:51:36 2010
@@ -31,10 +31,10 @@ from gump.core.config import default
from gump.core.model.builder import Ant, NAnt, Maven, Maven2, Script, \
Configure, Make
from gump.core.model.depend import Dependable, importDomDependency
-from gump.core.model.misc import Jar, Assembly, BaseOutput, \
- Resultable, Positioned, Mkdir, Delete, JunitReport, Work, \
- AddressPair
+from gump.core.model.misc import AddressPair, \
+ Resultable, Positioned, Mkdir, Delete, JunitReport, Work
from gump.core.model.object import NamedModelObject
+from gump.core.model.output import Output
from gump.core.model.state import REASON_CONFIG_FAILED, STATE_FAILED, \
STATE_PREREQ_FAILED, REASON_MISSING_OUTPUTS
from gump.core.model.stats import Statable, Statistics
@@ -105,7 +105,7 @@ class Project(NamedModelObject, Statable
self.packageNames = None
#############################################################
- # Outputs (Jars, Assemblies)
+ # Outputs (like jars, assemblies, poms ...)
#
self.outputs = {}
self.outputs_expanded = False
@@ -519,8 +519,9 @@ class Project(NamedModelObject, Statable
self.home = os.path.abspath(
os.path.join(workspace.getBaseDirectory(), parent))
else:
- message = ('Unable to complete project.home for %s [not nested/parent] : %s') \
- % (self.name, home)
+ message = ('Unable to complete project.home for %s' +
+ ' [not nested/parent] : %s') \
+ % (self.name, home)
self.addError(message)
log.warning(message)
self.home = None
@@ -555,28 +556,30 @@ class Project(NamedModelObject, Statable
self.addError('Missing \'name\' on <license')
#
- # Resolve jars/assemblies/outputs
+ # Resolve outputs
#
- outputTypes = {'jar' : Jar,
- 'assembly' : Assembly,
- 'output' : BaseOutput}
+ outputTypes = ['jar',
+ 'assembly',
+ 'output',
+ 'pom']
- for (tag, clazz) in outputTypes.iteritems():
+ for tag in outputTypes:
for tdom in self.getDomChildIterator(tag):
- name = self.expandVariables(
- getDomAttributeValue(tdom, 'name'))
+ name = self.expandVariables(getDomAttributeValue(tdom, 'name'))
if self.home and name:
- output = clazz(name, tdom, self)
+ output = Output(name, tdom, self)
output.complete()
output.setPath(os.path.abspath(os.path.join(self.home,
name)))
+ if not output.getType() and tag != 'output':
+ output.setType(tag)
self.addOutput(output)
else:
self.addError('Missing \'name\' on <' + tag)
- # Fix 'ids' on all Jars/Assemblies/Outputs which don't have them
+ # Fix 'ids' on all outputs which don't have them
if self.hasOutputs():
if 1 == self.getOutputCount():
output = self.getOutputAt(0)
@@ -602,8 +605,8 @@ class Project(NamedModelObject, Statable
newId = newId[:reduction]
# Assign...
self.addDebug('Output [' + basename + \
- '] identifier set to output basename: [' \
- + newId + ']')
+ '] identifier set to output ' + \
+ 'basename: [' + newId + ']')
output.setId(newId)
# Grab all the work
@@ -662,13 +665,14 @@ class Project(NamedModelObject, Statable
for circProject in new_visited:
circProject.changeState(STATE_FAILED,
REASON_CONFIG_FAILED)
- circProject.addError("Circular Dependency. Path: %s -> %s." % \
- (new_visited,
- depProject.getName()))
-
- self.addError("Dependency broken, removing dependency on %s from %s." % \
- (depProject.getName(),
- self.getName()))
+ circProject.addError("Circular Dependency. Path: " + \
+ "%s -> %s." % \
+ (new_visited,
+ depProject.getName()))
+
+ self.addError("Dependency broken, removing dependency " + \
+ "on %s from %s." % \
+ (depProject.getName(), self.getName()))
removes.append(dependency)
else:
@@ -720,9 +724,11 @@ class Project(NamedModelObject, Statable
for badOpt in badOptions:
(xmloption, reason) = badOpt
- self.addWarning("Bad *Optional* Dependency. Project: %s : %s" \
- % (getDomAttributeValue(xmloption, 'project'),
- reason))
+ self.addWarning("Bad *Optional* Dependency. " + \
+ "Project: %s : %s" \
+ % (getDomAttributeValue(xmloption,
+ 'project'),
+ reason))
else:
self.addInfo("This is a packaged project, location: " + self.home)
Propchange: gump/live/python/gump/core/update/bzr.py
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Jun 29 03:51:36 2010
@@ -1 +1 @@
-/gump/trunk/python/gump/core/update/bzr.py:815848,953630-954169,955387,957107,957408
+/gump/trunk/python/gump/core/update/bzr.py:815848,953630-954169,955387,955837,956771,957107,957408,958453
Propchange: gump/live/python/gump/core/update/darcs.py
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Jun 29 03:51:36 2010
@@ -1 +1 @@
-/gump/trunk/python/gump/core/update/darcs.py:815848,953630-954169,955387,957107,957408
+/gump/trunk/python/gump/core/update/darcs.py:815848,953630-954169,955387,955837,956771,957107,957408,958453
Propchange: gump/live/python/gump/core/update/hg.py
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Jun 29 03:51:36 2010
@@ -1 +1 @@
-/gump/trunk/python/gump/core/update/hg.py:815848,953630-954169,955387,957107,957408
+/gump/trunk/python/gump/core/update/hg.py:815848,953630-954169,955387,955837,956771,957107,957408,958453