You are viewing a plain text version of this content. The canonical link for it is here.
Posted to general@gump.apache.org by aj...@apache.org on 2003/10/23 21:38:17 UTC

cvs commit: jakarta-gump/python/gump launcher.py logic.py utils.py document.py conf.py

ajack       2003/10/23 12:38:17

  Modified:    project  krysalis-ruper.xml krysalis-centipede.xml
                        krysalis-template-smoketest.xml
               profile  gump.xml minimal-profile.xml
               .        .cvsignore gumpy.sh gumpytest.sh
               python/gump launcher.py logic.py utils.py document.py
                        conf.py
  Removed:     profile  krysalis.xml
  Log:
  Try N+1(or more) on CLASSPATH, and:
  
  1) Cleanup file that ought not be needed any more
  2) gumpy cleans tmp directories
  3) Added some gump python tests
  4) Starting to clean up some brute force inherit="all"
  5) Show first/last good builds as date/time not float
  6) Only show CLASSPATH in doc if the project will be built w/ ant/script
  
  Revision  Changes    Path
  1.13      +3 -4      jakarta-gump/project/krysalis-ruper.xml
  
  Index: krysalis-ruper.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-gump/project/krysalis-ruper.xml,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- krysalis-ruper.xml	7 Sep 2003 20:49:16 -0000	1.12
  +++ krysalis-ruper.xml	23 Oct 2003 19:38:15 -0000	1.13
  @@ -67,7 +67,7 @@
         <property name="DATE_STAMP" value="@@DATE@@"/>        	
       </ant>
      
  -    <depend project="ant" inherit="all"/>
  +    <depend project="ant" inherit="runtime"/>
       <depend project="krysalis-ruper-core" inherit="all"/>
       <depend project="krysalis-version-ant" inherit="all"/>
       
  @@ -97,8 +97,7 @@
    
     <project name="krysalis-ruper">
       
  -   
  -      	<depend project="krysalis-centipede" inherit="all"/> 
  +      	<depend project="krysalis-centipede" inherit="runtime"/> 
       	<depend project="xml-xerces"/>
       	<depend project="commons-vfs"/>
       	<depend project="commons-logging"/>
  @@ -125,7 +124,7 @@
       <depend project="eclipse"/>
       <work nested="build/classes"/>
       <depend project="krysalis-centipede" inherit="all"/>
  -    <depend project="ant" inherit="all"/>
  +    <depend project="ant" inherit="runtime"/>
         	
       <ant basedir="." buildfile="centibuild.xml" target="gump" vm="1.2">
         	<property name="ant.home" project="ant" reference="home"/>
  
  
  
  1.8       +14 -15    jakarta-gump/project/krysalis-centipede.xml
  
  Index: krysalis-centipede.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-gump/project/krysalis-centipede.xml,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- krysalis-centipede.xml	11 Oct 2003 22:39:07 -0000	1.7
  +++ krysalis-centipede.xml	23 Oct 2003 19:38:15 -0000	1.8
  @@ -95,19 +95,18 @@
           	<property name="ant.home" project="ant" reference="home"/>
           </ant>
       
  -        <depend project="ant" inherit="all"  />
  -        <depend project="ant-contrib" inherit="all" />
  -		<!-- depend project="ant-embed-optional" inherit="all" / -->
  -		<depend project="commons-jxpath" inherit="all" />
  -		<depend project="commons-logging" inherit="all" />
  -		<depend project="commons-vfs" inherit="all" />
  -		<depend project="jakarta-regexp" inherit="all" />
  -		<depend project="krysalis-ruper-core" inherit="all" />
  -		<depend project="krysalis-version-core" inherit="all" />
  -		<depend project="krysalis-ruper-ant" inherit="all" />
  -		<depend project="krysalis-version-ant" inherit="all" />
  -		<depend project="xml-xalan2" inherit="all"  />
  -        <depend project="xml-xerces" inherit="all" />
  +        <depend project="ant" inherit="runtime"  />
  +        <depend project="ant-contrib" />
  +		<depend project="commons-jxpath"/>
  +		<depend project="commons-logging"  />
  +		<depend project="commons-vfs" />
  +		<depend project="jakarta-regexp" />
  +		<depend project="krysalis-ruper-core"  />
  +		<depend project="krysalis-version-core"  />
  +		<depend project="krysalis-ruper-ant" />
  +		<depend project="krysalis-version-ant" />
  +		<depend project="xml-xalan2"  />
  +        <depend project="xml-xerces" />
   
   		<jar name="lib/krysalis-centipede.jar"  />
           <!-- Work dirs to be included in classpath  -->
  @@ -139,8 +138,8 @@
           <ant buildfile="build-site.xml" target="gump-site" vm="1.2">
           	<property name="ant.home" project="ant" reference="home"/>
           </ant>
  -      <depend project="krysalis-centipede" inherit="all" />
  -      <depend project="ant" inherit="all" />
  +      <depend project="krysalis-centipede" inherit="runtime" />
  +      <depend project="ant" inherit="runtime" />
           
           <nag to="krysalis-developers@lists.sourceforge.net"
               from="Nicola Ken Barozzi &lt;nicolaken@apache.org&gt;"/>
  
  
  
  1.3       +46 -46    jakarta-gump/project/krysalis-template-smoketest.xml
  
  Index: krysalis-template-smoketest.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-gump/project/krysalis-template-smoketest.xml,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- krysalis-template-smoketest.xml	2 Oct 2003 06:59:12 -0000	1.2
  +++ krysalis-template-smoketest.xml	23 Oct 2003 19:38:16 -0000	1.3
  @@ -1,46 +1,46 @@
  -<?xml version="1.0" encoding="UTF-8"?>
  -<module name="krysalis-template-smoke-test" fullname="Krysalis Smoke Test">
  -	<url href="http://www.krysalis.org/templates/smoke-test"/>
  -	<site hostname="krysalis.sourceforge.net"
  -		remotedir="/home/groups/k/kr/krysalis/htdocs/templates/smoke-test"/>
  -	<cvs repository="sourceforge" host-prefix="cvs.krysalis" dir="krysalis"
  -		module="krysalis-template/smoke-test"
  -		cvsweb="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/krysalis/krysalis-template/smoke-test"
  -		/>
  -	<description>Smoke Test is for testing Centipede.</description>
  -	<detailed>Smoke Test is a template for a Centipede module. It is primarly
  -		used for testing Centipede.</detailed>
  -	<what>
  -		<goal>Make Centipede project that covers all cents but test quickly.</goal>
  -	</what>
  -	<why>Centipede needs a module other than his own for serious testing.</why>
  -	<vendor>Krysalis Community Project</vendor>
  -	<licence legal="./legal">This software is released under the Krysalis Patchy
  -		Software License 1.1_01. For detailed legal and licensing issues, please
  -		read the LICENSE.* files in the /legal directory.</licence>
  -	<credits>
  -		<credit>This software includes software developed by the Apache Software
  -			Foundation (http://www.apache.org/).</credit>
  -	</credits>
  -	<project name="krysalis-template-smoketest" fullname="Krysalis Smoke Test">
  -		<version major="0" minor="0" fix="1" tag="HEAD"/>
  -		<package>smoketest</package>
  -		<ant target="gump" vm="1.2">
  -                  <property name="ant.home" reference="home" project="ant"/>
  -                </ant>    
  -		<depend project="jakarta-log4j" version="1.2.6"/>
  -		<depend project="krysalis-template-smoketest-supplied" version="supplied" export="true"/>
  -		<depend project="krysalis-centipede" inherit="all" />
  -		<work nested="build/classes"/>
  -		<home nested="build"/>
  -		<code type="java/plain" dir="src/java"/>
  -		<test type="test/junit" dir="src/test"/>
  -		<documentation type="xml/forrest" dir="src/documentation"/>
  -		
  -
  -	</project>
  -	<project name="krysalis-template-smoketest-supplied">
  -		<jar name="lib/helloworld-0.0.1-alpha1-200209130001.jar"/>
  -	</project>
  -</module>
  -
  +<?xml version="1.0" encoding="UTF-8"?>
  +<module name="krysalis-template-smoke-test" fullname="Krysalis Smoke Test">
  +	<url href="http://www.krysalis.org/templates/smoke-test"/>
  +	<site hostname="krysalis.sourceforge.net"
  +		remotedir="/home/groups/k/kr/krysalis/htdocs/templates/smoke-test"/>
  +	<cvs repository="sourceforge" host-prefix="cvs.krysalis" dir="krysalis"
  +		module="krysalis-template/smoke-test"
  +		cvsweb="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/krysalis/krysalis-template/smoke-test"
  +		/>
  +	<description>Smoke Test is for testing Centipede.</description>
  +	<detailed>Smoke Test is a template for a Centipede module. It is primarly
  +		used for testing Centipede.</detailed>
  +	<what>
  +		<goal>Make Centipede project that covers all cents but test quickly.</goal>
  +	</what>
  +	<why>Centipede needs a module other than his own for serious testing.</why>
  +	<vendor>Krysalis Community Project</vendor>
  +	<licence legal="./legal">This software is released under the Krysalis Patchy
  +		Software License 1.1_01. For detailed legal and licensing issues, please
  +		read the LICENSE.* files in the /legal directory.</licence>
  +	<credits>
  +		<credit>This software includes software developed by the Apache Software
  +			Foundation (http://www.apache.org/).</credit>
  +	</credits>
  +	<project name="krysalis-template-smoketest" fullname="Krysalis Smoke Test">
  +		<version major="0" minor="0" fix="1" tag="HEAD"/>
  +		<package>smoketest</package>
  +		<ant target="gump" vm="1.2">
  +                  <property name="ant.home" reference="home" project="ant"/>
  +                </ant>    
  +		<depend project="jakarta-log4j" version="1.2.6"/>
  +		<depend project="krysalis-template-smoketest-supplied" version="supplied" export="true"/>
  +		<depend project="krysalis-centipede" inherit="runtime" />
  +		<work nested="build/classes"/>
  +		<home nested="build"/>
  +		<code type="java/plain" dir="src/java"/>
  +		<test type="test/junit" dir="src/test"/>
  +		<documentation type="xml/forrest" dir="src/documentation"/>
  +		
  +
  +	</project>
  +	<project name="krysalis-template-smoketest-supplied">
  +		<jar name="lib/helloworld-0.0.1-alpha1-200209130001.jar"/>
  +	</project>
  +</module>
  +
  
  
  
  1.270     +1 -1      jakarta-gump/profile/gump.xml
  
  Index: gump.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-gump/profile/gump.xml,v
  retrieving revision 1.269
  retrieving revision 1.270
  diff -u -r1.269 -r1.270
  --- gump.xml	17 Oct 2003 23:13:26 -0000	1.269
  +++ gump.xml	23 Oct 2003 19:38:16 -0000	1.270
  @@ -1,5 +1,5 @@
   <profile name="gump">
  -
  +  
   <!-- Apache.Ant -->
   
     <module href="project/ant.xml"/>
  
  
  
  1.4       +0 -5      jakarta-gump/profile/minimal-profile.xml
  
  Index: minimal-profile.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-gump/profile/minimal-profile.xml,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- minimal-profile.xml	17 Oct 2003 23:13:26 -0000	1.3
  +++ minimal-profile.xml	23 Oct 2003 19:38:16 -0000	1.4
  @@ -58,10 +58,5 @@
       <repository href="repository/whichever.xml"/>
       <repository href="repository/xml.xml"/>
   
  -  <!-- server definitions. I have no idea what these are for. Leaving
  -       them doesn't harm. -->
  -  <server href="server/daedalus.apache.org.xml"/>
  -  <server href="server/icarus.apache.org.xml"/>
  -
   </profile>
   
  
  
  
  1.16      +1 -0      jakarta-gump/.cvsignore
  
  Index: .cvsignore
  ===================================================================
  RCS file: /home/cvs/jakarta-gump/.cvsignore,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- .cvsignore	5 Sep 2003 23:08:48 -0000	1.15
  +++ .cvsignore	23 Oct 2003 19:38:16 -0000	1.16
  @@ -14,3 +14,4 @@
   tmp
   *~
   LOCAL-ENV.bat
  +local-env.sh
  
  
  
  1.16      +22 -16    jakarta-gump/gumpy.sh
  
  Index: gumpy.sh
  ===================================================================
  RCS file: /home/cvs/jakarta-gump/gumpy.sh,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- gumpy.sh	14 Oct 2003 05:29:36 -0000	1.15
  +++ gumpy.sh	23 Oct 2003 19:38:16 -0000	1.16
  @@ -34,6 +34,7 @@
   export GUMPY_VERSION="1.0.3"
   export GUMP_PYTHON=$GUMP/python
   export GUMP_TMP=$GUMP/tmp
  +export GUMP_WS_TMP=$GUMP_WS/tmp
   export GUMP_HOST=`hostname -s`
   export GUMP_DATE=`date`
   export GUMP_LOG=$GUMP_LOG_DIR/gumpy.html
  @@ -99,20 +100,28 @@
   cp -R `grep profile $GUMP_HOST.xml  | cut -d\" -f2` $GUMP_PROFILE_LOG_DIR
   
   #
  +##########################################################
  +#
   # Preliminary cleanup
   #
  -cd $GUMP_TMP
  -if [ -f check_forrest.txt ] ; then
  -	rm check_forrest.txt 
  +
  +# Gump level tmp
  +if [ -d $GUMP_TMP ] ; then
  +	cd $GUMP_TMP
  +	rm -f *.txt
   fi
  -if [ -f forrest.txt ] ; then
  -	rm forrest.txt 
  +# Gump work tmp
  +if [ -d $GUMP_WS_TMP ] ; then
  +	cd $GUMP_WS/tmp
  +	rm -f *.txt
   fi
  -if [ -f $GUMP_WS/forrest/build/tmp/brokenlinks.txt ] ; then
  -	rm $GUMP_WS/forrest/build/tmp/brokenlinks.txt
  +# Clear the forrest build area...
  +if [ -d $GUMP_WS/forrest/build/ ] ; then
  +	rm -rf $GUMP_WS/forrest/build/
   fi
   
   #
  +###########################################################
   # Do a CVS update
   #
   echo $SEPARATOR >> $GUMP_LOG
  @@ -122,7 +131,7 @@
   
   
   #
  -# Set the PYTHONPATH & cd appropriately
  +# Set the PYTHONPATH
   #
   export PYTHONPATH=$GUMP_PYTHON
   
  @@ -179,16 +188,20 @@
   cd $GUMP
   
   echo \</XMP\> >> $GUMP_LOG
  -pkill -P $$ 
   
  -# $Log$
  -# Revision 1.15  2003/10/14 05:29:36  ajack
  -# Merged check.py into integrate.py (so removed from gumpy.sh)
   #
  -# Revision 1.2  2003/05/30 22:02:56  nickchalko
  -# Fixing incomplete update from Adam
  -# PR:
  -# Obtained from:
  -# Submitted by:Adam Jack ajack@TrySybase.com
  -# Reviewed by:
  +# Ensure nothing we started (directly) is left running after we end...
  +#
  +pkill -KILL -P $$ 
  +
  +# $Log$
  +# Revision 1.16  2003/10/23 19:38:16  ajack
  +# Try N+1(or more) on CLASSPATH, and:
  +# 
  +# 1) Cleanup file that ought not be needed any more
  +# 2) gumpy cleans tmp directories
  +# 3) Added some gump python tests
  +# 4) Starting to clean up some brute force inherit="all"
  +# 5) Show first/last good builds as date/time not float
  +# 6) Only show CLASSPATH in doc if the project will be built w/ ant/script
   #
  
  
  
  1.2       +7 -0      jakarta-gump/gumpytest.sh
  
  Index: gumpytest.sh
  ===================================================================
  RCS file: /home/cvs/jakarta-gump/gumpytest.sh,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- gumpytest.sh	22 Oct 2003 20:00:50 -0000	1.1
  +++ gumpytest.sh	23 Oct 2003 19:38:16 -0000	1.2
  @@ -7,3 +7,10 @@
   
   export
   pwd
  +
  +#
  +# Perform some CLASSPATH checks
  +#
  +echo "CLASSPATH checks"
  +python gump/logic.py krysalis-ruper-ant
  +python gump/logic.py commons-graph
  \ No newline at end of file
  
  
  
  1.30      +31 -11    jakarta-gump/python/gump/launcher.py
  
  Index: launcher.py
  ===================================================================
  RCS file: /home/cvs/jakarta-gump/python/gump/launcher.py,v
  retrieving revision 1.29
  retrieving revision 1.30
  diff -u -r1.29 -r1.30
  --- launcher.py	20 Oct 2003 23:58:37 -0000	1.29
  +++ launcher.py	23 Oct 2003 19:38:16 -0000	1.30
  @@ -241,6 +241,7 @@
           self.status=CMD_STATUS_NOT_YET_RUN
           self.output=None
           self.elapsed=0
  +        self.signal=0
           self.exit_code=-1
           
       def overview(self,indent):
  @@ -250,6 +251,8 @@
             overview += indent+"Output: " + self.output
           if self.elapsed:
             overview += indent+"Elapsed: " + str(self.elapsed)
  +        if self.signal:
  +          overview += indent+"Signal: " + str(self.signal)
           if self.exit_code:
             overview += indent+"ExitCode: " + str(self.exit_code)
           
  @@ -383,22 +386,39 @@
           timer.setDaemon(1)
           timer.start()
   
  +        #
           # Execute Command & Wait
  -        result.exit_code=os.system(execString + ' >>' + str(outputFile) + ' 2>&1')
  +        #
  +        waitcode=os.system(execString + ' >>' + str(outputFile) + ' 2>&1')
           
  -        # Stop it (if still running)
  -        timer.cancel()              
  -
  +        #
  +        # The resturn code (from wait) is (on Unix):
  +        #
  +        #	a 16 bit number
  +        #	top byte	=	exit status
  +        #	low byte	=	signal that killed it
  +        #
  +        result.signal=(waitcode & 0xFF)
  +        result.exit_code=(waitcode & 0xFF00)
  +        
  +        #
  +        # Assume timed out if this is not running...
  +        #
  +        if not timer.isAlive():
  +            result.status=CMD_STATUS_TIMED_OUT
  +            log.error('Command timed out. [' + execString + '] [' + str(timeout) + '] seconds.')
           # Process Outputs (exit_code and stderr/stdout)
  -        if result.exit_code < 0:
  -          result.status=CMD_STATUS_TIMED_OUT
  -          log.error('Failed to launch/execute command. [' + execString + ']. ExitCode: ' + str(result.exit_code))
           elif result.exit_code > 0:    
  -          result.status=CMD_STATUS_FAILED
  -          log.error('Failed to launch/execute command. [' + execString + ']. ExitCode: ' + str(result.exit_code))
  +            result.status=CMD_STATUS_FAILED
  +            log.error('Failed to launch/execute command. [' + execString + ']. ExitCode: ' + str(result.exit_code))
           else:
  -          result.status=CMD_STATUS_SUCCESS
  -          
  +            result.status=CMD_STATUS_SUCCESS
  +    
  +        #
  +        # Stop it (if still running)
  +        #
  +        timer.cancel()            
  +                  
           #
           # Clean Up Empty Output Files
           #
  
  
  
  1.39      +66 -36    jakarta-gump/python/gump/logic.py
  
  Index: logic.py
  ===================================================================
  RCS file: /home/cvs/jakarta-gump/python/gump/logic.py,v
  retrieving revision 1.38
  retrieving revision 1.39
  diff -u -r1.38 -r1.39
  --- logic.py	22 Oct 2003 21:49:39 -0000	1.38
  +++ logic.py	23 Oct 2003 19:38:16 -0000	1.39
  @@ -218,6 +218,13 @@
                 
       return result
   
  +def hasBuildCommand(project):
  +    hasBuild=0
  +    # I.e has an <ant or <script element
  +    if project.ant or project.script: hasBuild=1    
  +    return hasBuild
  +
  +
   def getBuildCommand(workspace,module,project,context):
   
       # get the ant element (if it exests)
  @@ -419,15 +426,22 @@
   # :TODO: Runtime?
   #
   # BOOTCLASSPATH?
  -def getClasspathList(project,workspace,context):
  +def getClasspathList(project,workspace,context,debug=0):
     """Get a TOTAL classpath for a project (including it's dependencies)"""
  -  
  -  # Start with the system classpath (later remove this)
  -  classpath=getSystemClasspathList()
   
     # Context for this project
     pctxt=context.getProjectContextForProject(project)
   
  +  #
  +  # Do this once only... storing it on the context
  +  #
  +  if hasattr(pctxt,'resolvedClasspath'):
  +      if debug: print "Claspath previously resolved..."
  +      return pctxt.resolvedClasspath
  +  
  +  # Start with the system classpath (later remove this)
  +  classpath=getSystemClasspathList()
  +
     # Add this project's work directories
     srcdir=Module.list[project.module].srcdir
     for work in project.work:
  @@ -439,45 +453,59 @@
         else:
             log.error("<work element without nested or parent attributes on " \
                 + project.name + " in " + project.module)
  -    
  +
         if path:
  -          classpath.append(AnnotatedPath(path,pctxt,None,'Working Directory'))
  +          classpath.append(AnnotatedPath(path,pctxt,None,'Work Entity'))
  +          if debug: print "Work Entity:   " + path 
   
     # Append dependent projects (including optional)
     visited=[]
     
  -  # Does it have any depends?
  +  # Does it have any depends? Process all of them...
     if project.depend:
       # For each
       for depend in project.depend:
  -        for path in getDependOutputList(project,pctxt,depend,context,visited):
  +        for path in getDependOutputList(pctxt,project,pctxt,depend,context,visited,0,debug):
             if not path in classpath:
                 classpath.append(path)
                 
     # Same as above, but for optional...
     if project.option:    
       for option in project.option:
  -        for path in getDependOutputList(project,pctxt,option,context,visited):
  +        for path in getDependOutputList(pctxt,project,pctxt,option,context,visited,0,debug):
             if not path in classpath:
                 classpath.append(path)
  -              
  +  
  +  #
  +  # Store so we don't do this twice.
  +  #            
  +  pctxt.resolvedClasspath = classpath
  +  
     return classpath
   
   #
  -# :TODO: Runtime Dependency?
  +# Perform this 'dependency' (mandatory or optional)
   #
  -def getDependOutputList(parent,parentctxt,depend,context,visited):      
  +# 1) Bring in the JARs (or those specified by id in depend ids)
  +# 2) Do NOT bring in the working entities (directories/jars)
  +# 3) Bring in the sub-depends (or optional) if inherit='all' or 'hard'
  +# 4) Bring in the runtime sub-depends if inherit='runtime'
  +#
  +def getDependOutputList(beneficiary,parent,parentctxt,depend,context,visited,depth=0,debug=0):      
     """Get a classpath of outputs for a project (including it's dependencies)"""            
      
     # Don't loop...
  -  if depend in visited:
  -      # print "Visited : " + str(depend)
  -      #print "Visits  : "
  -      #for v in visited:
  -      #    print " - " + str(v)
  +  if depend in visited:  
  +      beneficiary.addInfo("Duplicated dependency [" + str(depend) + "]")          
  +      if debug:
  +        print str(depth) + ") Already Visited : " + str(depend)
  +        print str(depth) + ") Previously Visits  : "
  +        for v in visited:
  +          print str(depth) + ")  - " + str(v)
         return []
     visited.append(depend)
  -  #print "Perform : " + str(depend) + " in " + parent.name
  +  if debug:
  +      print str(depth) + ") Perform : " + str(depend) + " in " + parent.name
             
     #
     # Check we can get the project...
  @@ -485,7 +513,7 @@
     projectname=depend.project
     if not Project.list.has_key(projectname):
         if projectname:
  -          parentctxt.addError("Unknown project (in acquiring classpath) [" + projectname \
  +          beneficiary.addError("Unknown project (in acquiring classpath) [" + projectname \
                     + "] for [" + str(depend) + "]")
         return []
         
  @@ -540,6 +568,7 @@
             if ids: dependStr += ' Id = ' + jar.id
             path=AnnotatedPath(jar.path,pctxt,parentctxt,dependStr)                  
             if not path in classpath:
  +              if debug:   print str(depth) + ') Append JAR : ' + str(path)
                 classpath.append(path)
   
     #
  @@ -551,29 +580,30 @@
                     parentctxt.addWarning("Invalid ID [" + id \
                         + "] for dependency on [" + projectname + "]")
   
  -  #
  -  # Deep copy all/hard (or those for runtime)
  -  #
  -  # Append sub-projects outputs
  +  # Append sub-projects outputs, if inherited
     if project.depend:
  -      for subdepend in project.depend:            
  -          if (subdepend.inherit and not subdepend.inherit=='none' ) \
  -                  or (inherit=='runtime' and subdepend.runtime):      
  -              for path in getDependOutputList(project,pctxt,subdepend,context,visited):
  +      for subdepend in project.depend:        
  +          #	If the dependency is set to 'all' (or 'hard') we inherit all dependencies
  +          # If the dependency is set to 'runtime' we inherit all runtime dependencies
  +          if    (inherit=='all' or inherit=='hard') \
  +             or (inherit=='runtime' and subdepend.runtime):      
  +              for path in getDependOutputList(beneficiary,project,pctxt,subdepend,context,visited,depth+1,debug):
                     if not path in classpath:    
                         classpath.append(path)
  +          elif debug:
  +              print str(depth) + ') Skip : ' + str(subdepend) + ' in ' + project.name
   
  -  #
  -  # Deep copy all/hard (or those for runtime)
  -  #
  -  # Append sub-projects outputs
  +  # Append sub-projects outputs, if inherited
     if project.option:
  -      for suboption in project.option:            
  -          if (suboption.inherit and not suboption.inherit=='none' ) \
  -                  or (inherit=='runtime' and suboption.runtime):      
  -              for path in getDependOutputList(project,pctxt,suboption,context,visited):
  +      for suboption in project.option:   
  +          # See similar loop above here for logic...
  +          if    (inherit=='all' or inherit=='hard') \
  +             or (inherit=='runtime' and suboption.runtime):      
  +              for path in getDependOutputList(beneficiary,project,pctxt,suboption,context,visited,depth+1,debug):
                     if not path in classpath:    
                         classpath.append(path)
  +          elif debug:
  +              print str(depth) + ') Skip optional : ' + str(suboption) + ' in ' + project.name
   
     return classpath
       
  @@ -766,7 +796,7 @@
     # documentText(workspace, context, ps)
     
     for project in projects:
  -      cp=getClasspathList(project,workspace,context)
  +      cp=getClasspathList(project,workspace,context,1)
         print "Project : " + project.name 
         for p in cp:
             if isinstance(p,AnnotatedPath):
  
  
  
  1.8       +5 -1      jakarta-gump/python/gump/utils.py
  
  Index: utils.py
  ===================================================================
  RCS file: /home/cvs/jakarta-gump/python/gump/utils.py,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- utils.py	17 Oct 2003 19:04:12 -0000	1.7
  +++ utils.py	23 Oct 2003 19:38:16 -0000	1.8
  @@ -65,9 +65,10 @@
   import logging
   import sys
   import types, StringIO
  +import time
   
   from gump  import log
  -from gump.conf import default
  +from gump.conf import default, setting
   
   ###############################################################################
   # Base classes for the Displayable Objects
  @@ -195,6 +196,9 @@
       #:TODO: Don't show hours if 0, show mins/secs words
       return ('%02d:%02d:%02d' % elapsed)        
       
  +def secsToDate(secs):
  +    return time.strftime(setting.datetimeformat, \
  +                    time.localtime(secs))
       
   #
   # Get into ASCII, but make an attempt at coping with
  
  
  
  1.91      +42 -40    jakarta-gump/python/gump/document.py
  
  Index: document.py
  ===================================================================
  RCS file: /home/cvs/jakarta-gump/python/gump/document.py,v
  retrieving revision 1.90
  retrieving revision 1.91
  diff -u -r1.90 -r1.91
  --- document.py	21 Oct 2003 19:03:08 -0000	1.90
  +++ document.py	23 Oct 2003 19:38:16 -0000	1.91
  @@ -80,7 +80,7 @@
   from gump.statistics import StatisticsDB,ProjectStatistics,StatisticsGuru
   from gump.logic import getPackagedProjectContexts, getBuildSequenceForProjects,\
        getProjectsForProjectExpression, getModuleNamesForProjectList, \
  -     isFullGumpSet, getClasspathList, AnnotatedPath
  +     isFullGumpSet, getClasspathList, AnnotatedPath, hasBuildCommand
   
   def documentText(workspace,context,moduleFilterList=None,projectFilterList=None):    
       documentTextToFile(sys.stdout,workspace,context,moduleFilterList,projectFilterList)
  @@ -666,9 +666,9 @@
       addItemXDoc(x,"Previous Status: ", stateName(stats.previousState))
       
       if stats.first:
  -        addItemXDoc(x,"First Success: ", str(stats.first))
  +        addItemXDoc(x,"First Success: ", secsToDate(stats.first))
       if stats.last:
  -        addItemXDoc(x,"Last Success: ", str(stats.last))
  +        addItemXDoc(x,"Last Success: ", secsToDate(stats.last))
           
       # Display nag information
       for nagEntry in project.nag:
  @@ -686,41 +686,44 @@
       documentProjectContextList(x,"Project Dependees",projectcontext.dependees)            
       documentProjectContextList(x,"Optional Project Dependees",projectcontext.optionees)                  
   
  -    startSectionXDoc(x,'Classpath')
  -    startTableXDoc(x)
  -    x.write('      <tr><th>Path Entry</th><th>Contributor</th><th>Instigator</th><th>Annotation</th></tr>')       
  -    classpath=getClasspathList(project,workspace,context)
  -    paths=0
  -    for path in classpath: 
  -        if isinstance(path,AnnotatedPath):
  -            pcontext=path.context
  -            ppcontext=path.pcontext
  -            note=path.note
  -        else:
  -            pcontext=context
  -            ppcontext=None
  -            note=''
  -        startTableRowXDoc(x)
  -        insertTableDataXDoc(x, path)
  -        
  -        # Contributor
  -        insertTableDataXDoc(x, getContextLink(pcontext))
  -        
  -        # Instigator (if not Gump)
  -        link=''
  -        if ppcontext: link=getContextLink(ppcontext)
  -        insertTableDataXDoc(x, link)
  -        
  -        # Additional Notes...
  -        insertTableDataXDoc(x, note)
  -        endTableRowXDoc(x)
  -        paths+=1
  -    if not paths:        
  -        startTableRowXDoc(x)    
  -        insertTableDataXDoc(x,"None")
  -        endTableRowXDoc(x)
  -    endTableXDoc(x)
  -    endSectionXDoc(x)
  +    if hasBuildCommand(project):
  +        startSectionXDoc(x,'Classpath')
  +        startTableXDoc(x)
  +        x.write('      <tr><th>Path Entry</th><th>Contributor</th><th>Instigator</th><th>Annotation</th></tr>')       
  +        classpath=getClasspathList(project,workspace,context)
  +        paths=0
  +        for path in classpath: 
  +            if isinstance(path,AnnotatedPath):
  +                pcontext=path.context
  +                ppcontext=path.pcontext
  +                note=path.note
  +            else:
  +                pcontext=context
  +                ppcontext=None
  +                note=''
  +            startTableRowXDoc(x)
  +            insertTableDataXDoc(x, path)
  +        
  +            # Contributor
  +            insertTableDataXDoc(x, getContextLink(pcontext))
  +        
  +            # Instigator (if not Gump)
  +            link=''
  +            if ppcontext: link=getContextLink(ppcontext)
  +            insertTableDataXDoc(x, link)
  +        
  +            # Additional Notes...
  +            insertTableDataXDoc(x, note)
  +            endTableRowXDoc(x)
  +            paths+=1
  +            
  +        if not paths:        
  +            startTableRowXDoc(x)    
  +            insertTableDataXDoc(x,"None")
  +            endTableRowXDoc(x)
  +            
  +        endTableXDoc(x)
  +        endSectionXDoc(x)
          
   #    x.write('<p><strong>Project Config :</strong> <link href=\'%s\'>XML</link></p>' \
   #                % (getModuleProjectRelativeUrl(modulename,projectcontext.name)) )
  @@ -776,8 +779,7 @@
           x.write('      <td>%s</td>' % (workTypeName(work.type))) 
           x.write('      <td>%s</td><td>%s</td><td>%s</td>' \
               % ( stateName(work.status), \
  -                time.strftime(setting.datetimeformat, \
  -                    time.localtime(work.result.start_time)), \
  +                secsToDate(work.result.start_time), \
                   secsToString(work.secs)))    
           x.write('     </tr>')
       x.write('    </table>\n')
  
  
  
  1.34      +5 -5      jakarta-gump/python/gump/conf.py
  
  Index: conf.py
  ===================================================================
  RCS file: /home/cvs/jakarta-gump/python/gump/conf.py,v
  retrieving revision 1.33
  retrieving revision 1.34
  diff -u -r1.33 -r1.34
  --- conf.py	22 Oct 2003 13:54:33 -0000	1.33
  +++ conf.py	23 Oct 2003 19:38:16 -0000	1.34
  @@ -111,14 +111,14 @@
   class setting:    
       """Configuration of hardcoded settings"""
       
  -    version="2.0.1-alpha-0006"
  +    version="2.0.1-alpha-0007"
       
       # :TODO: Add "minimum checks later..."
       ws_version="0.4"
       
       datetimeformat="%a, %d %b %Y %H:%M:%S (%Z)"
       
  -    timeout=60*30 # 30 minutes (in seconds)
  +    timeout=60*40 # 40 minutes (in seconds)
       
   class switch:
       """Configuration of switches """