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/11/01 08:00:37 UTC

svn commit: r1029568 - in /gump/trunk/python/gump: actor/document/xdocs/resolver.py core/build/builder.py core/build/maven.py core/build/mvn.py core/model/builder.py core/model/project.py core/run/gumpenv.py

Author: bodewig
Date: Mon Nov  1 07:00:37 2010
New Revision: 1029568

URL: http://svn.apache.org/viewvc?rev=1029568&view=rev
Log:
support Maven 3.x

Modified:
    gump/trunk/python/gump/actor/document/xdocs/resolver.py
    gump/trunk/python/gump/core/build/builder.py
    gump/trunk/python/gump/core/build/maven.py
    gump/trunk/python/gump/core/build/mvn.py
    gump/trunk/python/gump/core/model/builder.py
    gump/trunk/python/gump/core/model/project.py
    gump/trunk/python/gump/core/run/gumpenv.py

Modified: gump/trunk/python/gump/actor/document/xdocs/resolver.py
URL: http://svn.apache.org/viewvc/gump/trunk/python/gump/actor/document/xdocs/resolver.py?rev=1029568&r1=1029567&r2=1029568&view=diff
==============================================================================
--- gump/trunk/python/gump/actor/document/xdocs/resolver.py (original)
+++ gump/trunk/python/gump/actor/document/xdocs/resolver.py Mon Nov  1 07:00:37 2010
@@ -43,7 +43,7 @@ from gump.core.model.tracker import Trac
 from gump.core.model.workspace import Workspace
 from gump.core.model.module import Module
 from gump.core.model.project import Project
-from gump.core.model.builder import Ant,NAnt,Maven,Script,Configure,Make
+from gump.core.model.builder import Ant,NAnt,Maven,Maven1,Script,Configure,Make
 from gump.core.model.object import *
 from gump.core.model.state import *
 
@@ -184,6 +184,7 @@ def getIndexForObject(object):
     elif isinstance(object, Ant) or \
         isinstance(object, NAnt) or \
         isinstance(object, Maven) or \
+        isinstance(object, Maven1) or \
         isinstance(object, Configure) or \
         isinstance(object, Make) or \
         isinstance(object, Script) :

Modified: gump/trunk/python/gump/core/build/builder.py
URL: http://svn.apache.org/viewvc/gump/trunk/python/gump/core/build/builder.py?rev=1029568&r1=1029567&r2=1029568&view=diff
==============================================================================
--- gump/trunk/python/gump/core/build/builder.py (original)
+++ gump/trunk/python/gump/core/build/builder.py Mon Nov  1 07:00:37 2010
@@ -49,8 +49,8 @@ from gump.core.config import dir, defaul
 from gump.core.build.script import ScriptBuilder
 from gump.core.build.ant import AntBuilder
 from gump.core.build.nant import NAntBuilder
-from gump.core.build.maven import MavenBuilder
-from gump.core.build.mvn import Maven2Builder
+from gump.core.build.maven import Maven1Builder
+from gump.core.build.mvn import MavenBuilder
 from gump.core.build.configure import ConfigureBuilder
 from gump.core.build.make import MakeBuilder
 
@@ -81,8 +81,8 @@ class GumpBuilder(gump.core.run.gumprun.
         
         self.ant=AntBuilder(run)
         self.nant=NAntBuilder(run)
-        self.maven=MavenBuilder(run)
-        self.mvn=Maven2Builder(run)
+        self.maven=Maven1Builder(run)
+        self.mvn=MavenBuilder(run)
         self.script=ScriptBuilder(run)
         self.configure = ConfigureBuilder(run)
         self.make = MakeBuilder(run);

Modified: gump/trunk/python/gump/core/build/maven.py
URL: http://svn.apache.org/viewvc/gump/trunk/python/gump/core/build/maven.py?rev=1029568&r1=1029567&r2=1029568&view=diff
==============================================================================
--- gump/trunk/python/gump/core/build/maven.py (original)
+++ gump/trunk/python/gump/core/build/maven.py Mon Nov  1 07:00:37 2010
@@ -175,7 +175,7 @@ def locateMavenProjectFile(project):
 # Classes
 ###############################################################################
 
-class MavenBuilder(RunSpecific):
+class Maven1Builder(RunSpecific):
 
     def __init__(self, run):
         RunSpecific.__init__(self, run)

Modified: gump/trunk/python/gump/core/build/mvn.py
URL: http://svn.apache.org/viewvc/gump/trunk/python/gump/core/build/mvn.py?rev=1029568&r1=1029567&r2=1029568&view=diff
==============================================================================
--- gump/trunk/python/gump/core/build/mvn.py (original)
+++ gump/trunk/python/gump/core/build/mvn.py Mon Nov  1 07:00:37 2010
@@ -20,6 +20,7 @@ import os.path
 
 from gump import log
 from gump.actor.mvnrepoproxy.proxycontrol import PROXY_CONFIG
+from gump.core.model.builder import MVN_VERSION2, MVN_VERSION3
 from gump.core.model.workspace import CommandWorkItem, \
     REASON_BUILD_FAILED, REASON_BUILD_TIMEDOUT, REASON_PREBUILD_FAILED, \
     STATE_FAILED, STATE_SUCCESS,  WORK_TYPE_BUILD
@@ -65,7 +66,7 @@ def getMavenProperties(project):
                                                  property.value, '=')
     return properties
 
-def getMavenCommand(project):
+def getMavenCommand(project, executable = 'mvn'):
     """ Build an Maven command for this project """
     maven = project.mvn
 
@@ -82,7 +83,7 @@ def getMavenCommand(project):
     basedir = maven.getBaseDirectory() or project.getBaseDirectory()
 
     # Run Maven...
-    cmd = Cmd('mvn', 'build_' + project.getModule().getName() + '_' + \
+    cmd = Cmd(executable, 'build_' + project.getModule().getName() + '_' + \
                 project.getName(), basedir)
 
     cmd.addParameter('--batch-mode')
@@ -116,19 +117,19 @@ def getMavenCommand(project):
 def needsSeparateLocalRepository(project):
     return project.mvn.needsSeparateLocalRepository()
 
-class Maven2Builder(RunSpecific):
+class MavenBuilder(RunSpecific):
 
     def __init__(self, run):
         RunSpecific.__init__(self, run)
 
     def buildProject(self, project, languageHelper, stats):
         """
-        Build a Maven2 project
+        Build a Maven 2.x/3.x project
         """
 
         workspace = self.run.getWorkspace()
 
-        log.debug('Run Maven2 on Project: #[' + `project.getPosition()` + '] '\
+        log.debug('Run Maven on Project: #[' + `project.getPosition()` + '] '\
                   + project.getName())
 
         self.performPreBuild(project, languageHelper, stats)
@@ -138,7 +139,17 @@ class Maven2Builder(RunSpecific):
             #
             # Get the appropriate build command...
             #
-            cmd = getMavenCommand(project)
+            home = None
+            if project.getMvn().getVersion() == MVN_VERSION2:
+                home = self.run.env.m2_home
+            elif project.getMvn().getVersion() == MVN_VERSION3:
+                home = self.run.env.m3_home
+
+            if home:
+                cmd = getMavenCommand(project, home + '/bin/mvn')
+                cmd.addEnvironment('M2_HOME', home)
+            else:
+                cmd = getMavenCommand(project)
 
             if cmd:
                 # Get/set JVM properties
@@ -179,7 +190,7 @@ class Maven2Builder(RunSpecific):
         if project.okToPerformWork():
             try:
                 settingsFile = self.generateMvnSettings(project, languageHelper)
-                project.addDebug('(Gump generated) Maven2 Settings in: ' + \
+                project.addDebug('(Gump generated) Maven Settings in: ' + \
                                      settingsFile)
 
                 try:
@@ -191,7 +202,7 @@ class Maven2Builder(RunSpecific):
                                   '] Failed', exc_info = 1)
 
             except Exception, details:
-                message = 'Generate Maven2 Settings Failed:' + str(details)
+                message = 'Generate Maven Settings Failed:' + str(details)
                 log.error(message, exc_info = 1)
                 project.addError(message)
                 project.changeState(STATE_FAILED, REASON_PREBUILD_FAILED)
@@ -201,18 +212,18 @@ class Maven2Builder(RunSpecific):
         command.dump()
 
     def generateMvnSettings(self, project, _languageHelper):
-        """Set repository for a Maven2 project"""
+        """Set repository for a Maven project"""
 
         settingsFile = locateMavenSettings(project)
         # Ensure containing directory exists, or make it.
         settingsdir = os.path.dirname(settingsFile)
         if not os.path.exists(settingsdir):
-            project.addInfo('Making directory for Maven2 settings: [' \
+            project.addInfo('Making directory for Maven settings: [' \
                                 + settingsdir + ']')
             os.makedirs(settingsdir)
 
         if os.path.exists(settingsFile):
-            project.addWarning('Overriding Maven2 settings: [' + settingsFile \
+            project.addWarning('Overriding Maven settings: [' + settingsFile \
                                    + ']')
 
         if needsSeparateLocalRepository(project):

Modified: gump/trunk/python/gump/core/model/builder.py
URL: http://svn.apache.org/viewvc/gump/trunk/python/gump/core/model/builder.py?rev=1029568&r1=1029567&r2=1029568&view=diff
==============================================================================
--- gump/trunk/python/gump/core/model/builder.py (original)
+++ gump/trunk/python/gump/core/model/builder.py Mon Nov  1 07:00:37 2010
@@ -272,8 +272,8 @@ class NAnt(BaseAnt):
     pass
 
 # represents an <maven/> element
-class Maven(Builder):
-    """ A Maven command (within a project)"""
+class Maven1(Builder):
+    """ A Maven 1.x command (within a project)"""
     def __init__(self, dom, project):
         Builder.__init__(self, dom, project)
 
@@ -289,10 +289,15 @@ class Maven(Builder):
         i = getIndent(indent + 1)
         output.write(i + 'Goal: ' + self.getGoal() + '\n')
 
+MVN_VERSION2 = '2'
+MVN_VERSION3 = '3'
+
 # represents an <mvn/> element
-class Maven2(Builder):
-    """ A Maven command (within a project)"""
-    def __init__(self, dom, project):
+class Maven(Builder):
+    
+    """ A Maven 2.x/3.x command (within a project)"""
+
+    def __init__(self, dom, project, version = MVN_VERSION2):
         Builder.__init__(self, dom, project)
 
         self.goal = self.getDomAttributeValue('goal', 'package')
@@ -300,6 +305,7 @@ class Maven2(Builder):
         self.local_repo = self.getDomAttributeValue('separateLocalRepository',
                                                     'False')
         self.profile = self.getDomAttributeValue('profile')
+        self.version = version
 
     def getGoal(self):
         """ The goal to execute """
@@ -330,7 +336,11 @@ class Maven2(Builder):
             return None
         return self.local_repo
 
-class Mvn2Install(Maven2):
+    def getVersion(self):
+        """ The configured version of Maven to use """
+        return self.version
+
+class MvnInstall(Maven):
     """ Installs a single file into the local mvn repository """
 
     ARTIFACT_ID = 'artifactId'
@@ -341,28 +351,28 @@ class Mvn2Install(Maven2):
     POM = 'pom'
     VERSION = 'version'
 
-    def __init__(self, dom, project):
-        Maven2.__init__(self, dom, project)
-        self.goal = Mvn2Install.GOAL
-        self.packaging = self.getDomAttributeValue(Mvn2Install.PACKAGING,
-                                                   Mvn2Install.POM)
-        self.file = self.getDomAttributeValue(Mvn2Install.FILE, 'pom.xml')
-        self.version = self.getDomAttributeValue(Mvn2Install.VERSION)
-        self.artifactId = self.getDomAttributeValue(Mvn2Install.ARTIFACT_ID)
+    def __init__(self, dom, project, version = MVN_VERSION2):
+        Maven.__init__(self, dom, project, version)
+        self.goal = MvnInstall.GOAL
+        self.packaging = self.getDomAttributeValue(MvnInstall.PACKAGING,
+                                                   MvnInstall.POM)
+        self.file = self.getDomAttributeValue(MvnInstall.FILE, 'pom.xml')
+        self.version = self.getDomAttributeValue(MvnInstall.VERSION)
+        self.artifactId = self.getDomAttributeValue(MvnInstall.ARTIFACT_ID)
 
     def expand(self, project, workspace):
         """ Turns the builder's attributes into properties """
         Builder.expand(self, project, workspace)
 
         impl = getDOMImplementation()
-        self._add_property(impl, Mvn2Install.ARTIFACT_ID,
+        self._add_property(impl, MvnInstall.ARTIFACT_ID,
                            self.artifactId or project.getName())
         self._add_property(impl, 'groupId', project.getArtifactGroup())
-        self._add_property(impl, Mvn2Install.PACKAGING, self.packaging)
-        self._add_property(impl, Mvn2Install.FILE, self.file)
+        self._add_property(impl, MvnInstall.PACKAGING, self.packaging)
+        self._add_property(impl, MvnInstall.FILE, self.file)
         if self.version:
-            self._add_property(impl, Mvn2Install.VERSION, self.version)
-        elif not self.packaging == Mvn2Install.POM:
+            self._add_property(impl, MvnInstall.VERSION, self.version)
+        elif not self.packaging == MvnInstall.POM:
             project.addError("version attribute is mandatory if the file is"
                              + " not a POM.")
 
@@ -373,7 +383,7 @@ class Mvn2Install(Maven2):
         """
         props = PropertyContainer.getProperties(self)[:]
 
-        if not self.version and self.packaging == Mvn2Install.POM:
+        if not self.version and self.packaging == MvnInstall.POM:
             try:
                 pomDoc = self._read_pom()
                 root = pomDoc.documentElement
@@ -396,12 +406,12 @@ class Mvn2Install(Maven2):
                                           + ' version which is not supported'
                                           + ' by Gump.  You must provide an'
                                           + ' explicit version attribute to'
-                                          + ' mvn2install.')
+                                          + ' mvninstall.')
                 else:
                     impl = getDOMImplementation()
-                    dom = _create_dom_property(impl, Mvn2Install.VERSION,
+                    dom = _create_dom_property(impl, MvnInstall.VERSION,
                                                version_text)
-                    prop = Property(Mvn2Install.VERSION, dom, self.project)
+                    prop = Property(MvnInstall.VERSION, dom, self.project)
                     prop.complete(self.project, self.project.getWorkspace())
                     props.append(prop)
             except Exception, details:
@@ -429,12 +439,12 @@ def _create_dom_property(impl, name, val
 def _extract_version_from_pom(root):
     """ Tries to extract the version DOM element from a POM DOM tree """
     version = None
-    if hasDomChild(root, Mvn2Install.VERSION):
-        version = getDomChild(root, Mvn2Install.VERSION)
-    elif hasDomChild(root, Mvn2Install.PARENT):
-        parent = getDomChild(root, Mvn2Install.PARENT)
-        if hasDomChild(parent, Mvn2Install.VERSION):
-            version = getDomChild(parent, Mvn2Install.VERSION)
+    if hasDomChild(root, MvnInstall.VERSION):
+        version = getDomChild(root, MvnInstall.VERSION)
+    elif hasDomChild(root, MvnInstall.PARENT):
+        parent = getDomChild(root, MvnInstall.PARENT)
+        if hasDomChild(parent, MvnInstall.VERSION):
+            version = getDomChild(parent, MvnInstall.VERSION)
     return version
 
 # represents an <configure/> element

Modified: gump/trunk/python/gump/core/model/project.py
URL: http://svn.apache.org/viewvc/gump/trunk/python/gump/core/model/project.py?rev=1029568&r1=1029567&r2=1029568&view=diff
==============================================================================
--- gump/trunk/python/gump/core/model/project.py (original)
+++ gump/trunk/python/gump/core/model/project.py Mon Nov  1 07:00:37 2010
@@ -28,8 +28,8 @@ import gump.util.process.command
 
 from gump import log
 from gump.core.config import default
-from gump.core.model.builder import Ant, NAnt, Maven, Maven2, Mvn2Install, \
-    Script, Configure, Make
+from gump.core.model.builder import Ant, NAnt, Maven1, Maven, MvnInstall, \
+    MVN_VERSION2, MVN_VERSION3, Script, Configure, Make
 from gump.core.model.depend import Dependable, importDomDependency
 from gump.core.model.misc import AddressPair, \
     Resultable, Positioned, Mkdir, Delete, Report, Work
@@ -449,24 +449,35 @@ class Project(NamedModelObject, Statable
             # :TODO:#1: transferAnnotations(self.xml.nant, self)
 
         # Import any <maven part [if not packaged]
-        if self.hasDomChild('maven') and not packaged:
-            self.maven = Maven(self.getDomChild('maven'), self)
-            self.builder.append(self.maven)
+        for tag in ['maven', 'mvn1']:
+            if self.hasDomChild(tag) and not packaged:
+                self.maven = Maven1(self.getDomChild(tag), self)
+                self.builder.append(self.maven)
 
             # Copy over any XML errors/warnings
             # :TODO:#1: transferAnnotations(self.xml.maven, self)
 
         # Import any <mvn part [if not packaged]
-        if self.hasDomChild('mvn') and not packaged:
-            self.mvn = Maven2(self.getDomChild('mvn'), self)
-            self.builder.append(self.mvn)
+        for tag in ['mvn', 'mvn2']:
+            if self.hasDomChild(tag) and not packaged:
+                self.mvn = Maven(self.getDomChild(tag), self, MVN_VERSION2)
+                self.builder.append(self.mvn)
+
+            # Copy over any XML errors/warnings
+            # :TODO:#1: transferAnnotations(self.xml.maven, self)
+
+        # Import any <mvninstall part [if not packaged]
+        for tag in ['mvninstall', 'mvn2install']:
+            if self.hasDomChild(tag) and not packaged:
+                self.mvn = MvnInstall(self.getDomChild(tag), self)
+                self.builder.append(self.mvn)
 
             # Copy over any XML errors/warnings
             # :TODO:#1: transferAnnotations(self.xml.maven, self)
 
-        # Import any <mvn2install part [if not packaged]
-        if self.hasDomChild('mvn2install') and not packaged:
-            self.mvn = Mvn2Install(self.getDomChild('mvn2install'), self)
+        # Import any <mvn3 part [if not packaged]
+        if self.hasDomChild('mvn3') and not packaged:
+            self.mvn = Maven(self.getDomChild('mvn3'), self, MVN_VERSION3)
             self.builder.append(self.mvn)
 
             # Copy over any XML errors/warnings

Modified: gump/trunk/python/gump/core/run/gumpenv.py
URL: http://svn.apache.org/viewvc/gump/trunk/python/gump/core/run/gumpenv.py?rev=1029568&r1=1029567&r2=1029568&view=diff
==============================================================================
--- gump/trunk/python/gump/core/run/gumpenv.py (original)
+++ gump/trunk/python/gump/core/run/gumpenv.py Mon Nov  1 07:00:37 2010
@@ -77,6 +77,9 @@ class GumpEnvironment(Annotatable, Worka
         self.nant_command = None
         self.noMaven = False
         self.noMaven2 = False
+        self.noMaven3 = False
+        self.m2_home = None
+        self.m3_home = None
         self.noSvn = False
         self.noCvs = False
         self.noP4 = False
@@ -149,15 +152,24 @@ class GumpEnvironment(Annotatable, Worka
                                 ' no maven builds.')
 
         if not self.noMaven2 and not self._checkEnvVariable('M2_HOME', False):
-            self.noMaven = True
+            self.noMaven2 = True
             self.addWarning('M2_HOME environmental variable not found, ' + \
-                                ' no mvn builds.')
+                                ' no mvn2 builds.')
+        else:
+            self.m2_home = os.environ['M2_HOME']
+
+        if not self.noMaven3 and not self._checkEnvVariable('M3_HOME', False):
+            self.noMaven3 = True
+            self.addWarning('M3_HOME environmental variable not found, ' + \
+                                ' no mvn3 builds.')
+        else:
+            self.m3_home = os.environ['M3_HOME']
 
         if not self.noMvnRepoProxy \
                 and not self._checkEnvVariable('MVN_PROXY_HOME', False):
             self.noMvnRepoProxy = True
             self.addWarning('MVN_PROXY_HOME environmental variable not' + \
-                                ' found, no using a proxy for Maven2' + \
+                                ' found, not using a proxy for Maven' + \
                                 ' repository')
 
         # Check for executables
@@ -195,7 +207,13 @@ class GumpEnvironment(Annotatable, Worka
 
 
         self.noMaven2 = not self.noMaven2 and not \
-            self._checkWithDashVersion('mvn', "no Maven 2.x builds")
+            self._checkWithDashVersion(self.m2_home + '/bin/mvn',
+                                       "no Maven 2.x builds")
+
+        self.noMaven3 = not self.noMaven3 and not \
+            self._checkWithDashVersion(self.m3_home + '/bin/mvn',
+                                       "no Maven 3.x builds",
+                                       cmd_env = {'M2_HOME' : self.m3_home})
 
         self._check_nant()
         self.noMono = self._checkWithDashVersion('mono', "no Mono runtime")
@@ -297,20 +315,21 @@ class GumpEnvironment(Annotatable, Worka
         return self.javaProperties
 
     def _checkWithDashVersion(self, commandName, consequence,
-                              version = '--version'):
+                              version = '--version',
+                              cmd_env = None):
         """
         Determine whether a particular command is or is not available
         by using the --version switch
         """
         ok = self._checkExecutable(commandName, version, False, False,
-                                   'check_' + commandName)
+                                   'check_' + commandName, cmd_env)
         if not ok:
             self.addWarning('"' + commandName + '" command not found, '
                             + consequence)
         return ok
 
     def _checkExecutable(self, exe, options, mandatory, logOutput = False,
-                         name = None):
+                         name = None, cmd_env = None):
         """
         Determine whether a particular command is or is not available.
         """
@@ -321,6 +340,10 @@ class GumpEnvironment(Annotatable, Worka
             cmd = gump.util.process.command.getCmdFromString(exe + " " + \
                                                                  options,
                                                              name)
+            if cmd_env:
+                for env_key in cmd_env.keys():
+                    cmd.addEnvironment(env_key, cmd_env[env_key])
+
             result = execute(cmd)
             ok = result.isOk()
             if ok: