Author: ajack
Date: Wed Aug 18 13:20:58 2004
New Revision: 36578

Modified:
   gump/trunk/python/gump/build/builder.py
   gump/trunk/python/gump/document/xdocs/documenter.py
   gump/trunk/python/gump/integration/depot.py
   gump/trunk/python/gump/java/helper.py
   gump/trunk/python/gump/model/depend.py
   gump/trunk/python/gump/model/module.py
   gump/trunk/python/gump/model/project.py
   gump/trunk/python/gump/model/propagation.py
   gump/trunk/python/gump/model/state.py
   gump/trunk/python/gump/repository/artifact.py
   gump/trunk/python/gump/repository/publisher.py
   gump/trunk/python/gump/test/artifacts.py
   gump/trunk/python/gump/update/artifact.py
   gump/trunk/python/gump/utils/work.py
Log:
First changes for 'building from repository' (and Depot download).

Modified: gump/trunk/python/gump/build/builder.py
==============================================================================
--- gump/trunk/python/gump/build/builder.py     (original)
+++ gump/trunk/python/gump/build/builder.py     Wed Aug 18 13:20:58 2004
@@ -58,6 +58,8 @@
 from gump.model.stats import *
 from gump.model.state import *
 
+import gump.integration.depot
+
 import gump.java.helper
 
 
@@ -100,58 +102,52 @@
         # :TODO: Code this nicer, perhaps...    
         if project.isPackaged():             
             self.performProjectPackageProcessing(project, languageHelper, stats)
-            return
-                
-        # Do this even if not ok
-        self.performPreBuild(project, languageHelper, stats)
+        else:
+            # Do this even if not ok
+            self.performPreBuild(project, languageHelper, stats)
 
-        if project.okToPerformWork():        
-            log.debug('Performing Build Upon: [' + `project.getPosition()` + '] ' + 
project.getName())
+            if project.okToPerformWork():        
+                log.debug('Performing Build Upon: [' + `project.getPosition()` + '] ' 
+ project.getName())
 
-            # Turn on --verbose or --debug if failing ...
-            if stats:
-                if (not STATE_SUCCESS == stats.currentState) and \
-                        not project.isVerboseOrDebug():
-                    if stats.sequenceInState > SIGNIFICANT_DURATION:
-                        project.addInfo('Enable "debug" output, due to a sequence of 
%s previous errors.' % stats.sequenceInState)
-                        project.setDebug(True)
-                    else:
-                        project.addInfo('Enable "verbose" output, due to %s previous 
error(s).' % stats.sequenceInState)    
-                        project.setVerbose(True)
-
-            # Pick your poison..
-            if project.hasScript():
-                self.script.buildProject(project, languageHelper, stats)
-            elif project.hasAnt():
-                self.ant.buildProject(project, languageHelper, stats)
-            elif project.hasMaven():
-                self.maven.buildProject(project, languageHelper, stats)
-            
-            if not project.okToPerformWork() and not project.isDebug():
-                # Display...
-                project.addInfo('Enable "debug" output, due to build failure.')
-                project.setDebug(1)
-                    
-        # Do this even if not ok
-        self.performPostBuild( project, languageHelper, stats )
+                # Turn on --verbose or --debug if failing ...
+                #if stats:
+                #    if (not STATE_SUCCESS == stats.currentState) and \
+                #            not project.isVerboseOrDebug():
+                #        if stats.sequenceInState > SIGNIFICANT_DURATION:
+                #            project.addInfo('Enable "debug" output, due to a 
sequence of %s previous errors.' % stats.sequenceInState)
+                #            project.setDebug(True)
+                #        else:
+                #            project.addInfo('Enable "verbose" output, due to %s 
previous error(s).' % stats.sequenceInState)    
+                #            project.setVerbose(True)
+
+                # Pick your poison..
+                if project.hasScript():
+                    self.script.buildProject(project, languageHelper, stats)
+                elif project.hasAnt():
+                    self.ant.buildProject(project, languageHelper, stats)
+                elif project.hasMaven():
+                    self.maven.buildProject(project, languageHelper, stats)
+              
+            # Do this even if not ok
+            self.performPostBuild( project, languageHelper, stats )
+        
+            # If not ok, we might have some artifacts in the repository that
+            # are of value...
+            if not project.okToPerformWork() and project.hasOutputs():
+                self.extractFromRepository(project, languageHelper)
     
-        if project.isFailed():
-            log.warn('Failed to build project #[' + `project.getPosition()` + '] : [' 
+ project.getName() + '], state:' \
-                    + project.getStateDescription())                                  
            
+            if project.isFailed():
+                log.warn('Failed to build project #[' + `project.getPosition()` + '] 
: [' + project.getName() + '], state:' \
+                        + project.getStateDescription())                              
                
 
     def performDelete(self,project,delete,index=0):
-        """ Perform the delete command for a <delete entry """
-        
-        return
+        """ 
+        Perform the delete command for a <delete entry 
         
-        # :TODO: Re-instate this some time, when can delete
-        # non-empty directories.
+        no Return
+        """
         
-        basedir=os.path.abspath(project.getModule().getWorkingDirectory() or dir.base)
-    
-        #
         # Delete a directory and/or a file
-        #
         if delete.hasDirectory():
             dir=delete.getDirectory()
             try:
@@ -195,9 +191,12 @@
             project.addError('   <mkdir without \'dir\' attribute.')
             raise RuntimeError('Bad <mkdir, missing \'dir\' attribute')
                
-    def performPreBuild( self, project, language, stats ):
+    def performPreBuild( self, project, languageHelper, stats ):
+        
         """ 
                Perform pre-build Actions 
+               
+               No return.
         """
        
         log.debug(' ------ Performing pre-Build Actions (mkdir/delete) for : '+ 
project.getName())
@@ -235,11 +234,12 @@
         if startedOk and not project.okToPerformWork():
             log.warn('Failed to perform pre-build on project [' + project.getName() + 
']')
 
-    def performPostBuild(self, project, language, stats):
+    def performPostBuild(self, project, languageHelper, stats):
         """
                Perform Post-Build Actions
+               
+               No return.
         """
-     
         log.debug(' ------ Performing post-Build Actions (check jars) for : '+ 
project.getName())
 
         if project.okToPerformWork():
@@ -247,7 +247,7 @@
                 outputs = []
                     
                 # Ensure the jar output were all generated correctly.
-                outputsOk=1
+                outputsOk=True
                 for jar in project.getJars():
                     jarPath=os.path.abspath(jar.getPath())
                     # Add to list of outputs, in case we
@@ -268,7 +268,7 @@
                                           
                         # Add to list of outputs, in case we
                         # fail to find, and need to go list 
-                        # directoiries
+                        # directories
                         outputs.append(licensePath)
                             
                         if not os.path.exists(licensePath):
@@ -319,7 +319,7 @@
                 catDirectoryContentsToFileHolder(project, reportDir, FILE_TYPE_OUTPUT)
     
                         
-    def performProjectPackageProcessing(self, project, language, stats):
+    def performProjectPackageProcessing(self, project, languageHelper, stats):
         """
                Perform Package Processing Actions
         """
@@ -394,7 +394,75 @@
                 # List them, why not...
                 listDirectoryToFileHolder(project,project.getHomeDirectory(),
                     FILE_TYPE_PACKAGE, 'list_package_'+project.getName())             
                                      
+
+    def extractFromRepository(self, project, languageHelper):
+        """
+            If failed to build, see if we have a copy in the repo...
+            
+            No return.
+        """
         
+        if not project.hasOutputs(): return
+     
+        log.info(' ------ Attempt Repository Search for : '+ project.getName())
+
+        # See if we have any...
+        artifacts = self.repository.extractMostRecentGroup(project.getArtifactGroup())
+        if not artifacts:
+            self.checkUpstreamRepositories(project)
+            # Then try again...
+            artifacts = 
self.repository.extractMostRecentGroup(project.getArtifactGroup())
+            
+        
+        # :TODO:
+        # If not artifacts, download using Depot?
+        
+        artifactsOk=True
+            
+        if artifacts:       
+        
+            # See if we can use 'stored' artifacts.
+            for jar in project.getJars():
+                id = jar.getId()
+                
+                # Use the repository one...
+                if artifacts.has_key(id):
+                    (aid,date,extn,path)=artifacts[id]                
+                    
+                    log.info('Utilize %s from Gump artifact repository for id' % 
(path, id))
+                    
+                    # Stash this fallback...
+                    jar.setPath(path)
+                else:
+                    log.info('Failed to find artifact for id %s (Gump Repo has %s)' % 
\
+                            (id, artifact.keys()))
+                            
+                    artifactsOk=False
+                    break
+                    
+            if artifactsOk:
+                log.debug(' ------ Extracted (fallback) artifacts from Repository : 
'+ project.getName())                                        
+       
+    def checkUpstreamRepositories(self,project):
+        """
+        
+        See if we can download something...
+        
+        """
+        if self.run.getEnvironment().noDepot: return
+        
+        log.info(' ------ Check upstream repositories for : '+ project.getName())    
+        
+        cmd=gump.integration.depot.getGroupUpdateCommand(project.getArtifactGroup(),
+                    self.repository.getRepositoryDir())
+        
+        # Execute the command ....
+        cmdResult=execute(cmd,self.run.getWorkspace().tmpdir)
+    
+        # Update context with the fact that this work was done
+        work=CommandWorkItem(WORK_TYPE_UPDATE,cmd,cmdResult)
+        project.performedWork(work)
+         
     def preview(self,project,languageHelper):
         """
         Preview what a build would do.

Modified: gump/trunk/python/gump/document/xdocs/documenter.py
==============================================================================
--- gump/trunk/python/gump/document/xdocs/documenter.py (original)
+++ gump/trunk/python/gump/document/xdocs/documenter.py Wed Aug 18 13:20:58 2004
@@ -360,9 +360,22 @@
         
         optTable=optSection.createTable(['Name','Value'])
         opts=0
+               
+        descs={ 'Build':'Perform Build',
+                'XDocs':'Generate XDOCS',
+                'Statistics':'Update Statistics (to database)',
+                'Verbose':'Verbose Run',
+                'Cache':'Cache metadata (don\'t go to remote source)',
+                'Text':'Text Output',
+                'Official':'Official Run (e.g. nag notifies, etc.)',
+                'Results':'Generate Results' }
+                
         # iterate over this suites properties
         for (name,value) in getBeanAttributes(options).items():
-            optTable.createEntry(name,value)
+            desc=name
+            if descs.has_key(name):
+                desc = descs[name] + ' (' + name + ')'                
+            optTable.createEntry(desc,value)
             opts+=1
             
         if not opts: optTable.createEntry('None')
@@ -375,24 +388,13 @@
         envSection=document.createSection('Gump Environment')
         envSection.createParagraph(
             """The environment that this Gump run was within.""")     
-        
-        descs={ 'Build':'Perform Build',
-                'XDocs':'Generate XDOCS',
-                'Statistics':'Update Statistics (to database)',
-                'Verbose':'Verbose Run',
-                'Cache':'Cache metadata (don\'t go to remote source)',
-                'Text':'Text Output',
-                'Official':'Official Run (e.g. nag notifies, etc.)',
-                'Results':'Generate Results' }
+ 
         propertiesSection=envSection.createSection('Properties')
         envTable=propertiesSection.createTable(['Name/Description','Value'])
         envs=0
         # iterate over this suites properties
         for (name,value) in getBeanAttributes(environment).items():
-            desc=name
-            if descs.has_key(name):
-                desc = descs[name] + ' (' + name + ')'
-            envTable.createEntry(desc,str(value))
+            envTable.createEntry(name,str(value))
             envs+=1            
         if not envs: envTable.createEntry('None')
         
@@ -1758,12 +1760,11 @@
                                                       
         # Display nag information
         if project.hasNotifys():
-            if project.isVerboseOrDebug():
-                for pair in project.getNotifys():
-                    toaddr=pair.getToAddress()
-                    fromaddr=pair.getFromAddress()
-                    detailsList.createEntry('Notify To: 
').createFork('mailto:'+toaddr,toaddr)
-                    detailsList.createEntry('Notify From: 
').createFork('mailto:'+fromaddr,fromaddr)
+            for pair in project.getNotifys():
+                toaddr=pair.getToAddress()
+                fromaddr=pair.getFromAddress()
+                detailsList.createEntry('Notify To: 
').createFork('mailto:'+toaddr,toaddr)
+                detailsList.createEntry('Notify From: 
').createFork('mailto:'+fromaddr,fromaddr)
                     
         elif not project.isPackaged() and project.hasBuilder():            
             document.createWarning('This project does not utilize Gump 
notification.')  

Modified: gump/trunk/python/gump/integration/depot.py
==============================================================================
--- gump/trunk/python/gump/integration/depot.py (original)
+++ gump/trunk/python/gump/integration/depot.py Wed Aug 18 13:20:58 2004
@@ -23,6 +23,8 @@
 from gump import log
 from gump.core.config import *
 
+import gump.process.command
+
 def getDepotHome(visual=True):
     if os.environ.has_key('DEPOT_UPDATE_HOME'):        
         return os.environ['DEPOT_UPDATE_HOME']
@@ -37,6 +39,28 @@
 def getDepotUpdateCmd():
     return sys.executable+' '+getDepotUpdatePath()+' update'
     
+def getGroupUpdateCommand(group,repository):
+    """
+       Create the Depot command line for updating this group
+       from an upstream repository.            
+    """
+        
+    log.debug("Artifact Update Group: " + group)
+
+    # Prepare Artifact checkout/update command...
+    cmd=gump.process.command.Cmd(getDepotUpdateCmd(), 'update_'+group, repository)
+        
+    # Group (mandatory)
+    cmd.addParameter('-g',group)
+    
+    # Group (mandatory, if no URL)
+    cmd.addParameter('-rs','gump')
+        
+    # Target
+    cmd.addParameter('-t')
+    cmd.addParameter(repository)  
+   
+    return cmd    
     
 
 

Modified: gump/trunk/python/gump/java/helper.py
==============================================================================
--- gump/trunk/python/gump/java/helper.py       (original)
+++ gump/trunk/python/gump/java/helper.py       Wed Aug 18 13:20:58 2004
@@ -43,7 +43,7 @@
         
         # Caches for classpaths
         self.classpaths={}
-        self.bootclasspaths={}
+        self.bootclasspaths={}       
         
     def getJVMArgs(self,project):
         
@@ -63,9 +63,7 @@
         # Calculate classpath and bootclasspath
         (classpath, bootclasspath) = self.getClasspathObjects(project,debug)
         
-        #
         # Return them simple/flattened
-        #
         return ( classpath.getFlattened(), bootclasspath.getFlattened() )
 
    
@@ -74,6 +72,8 @@
         
         The basic classpath needs to include a compiler...
         
+        Return a system classpath (to include $JAVA_HOME/lib/tools.jar'
+        for a compiler).
         """
         sysClasspath=gump.java.cp.Classpath('System Classpath')
         javaHome=self.run.getEnvironment().getJavaHome()
@@ -186,7 +186,12 @@
             dependStr += 'Runtime'
   
         # Append JARS for this project
-        #    (respect ids)
+        #    (respect ids --- none means 'all)
+        ####################################################
+        # Note, if they don't come from the project outputs
+        # (e.g. 'cos the project failed) attempt to get them
+        # from the repository. [This has been done already,
+        # so is transparent here.]
         projectIds=[]
         for jar in project.getJars():
             # Store for double checking

Modified: gump/trunk/python/gump/model/depend.py
==============================================================================
--- gump/trunk/python/gump/model/depend.py      (original)
+++ gump/trunk/python/gump/model/depend.py      Wed Aug 18 13:20:58 2004
@@ -441,11 +441,9 @@
         
     def buildDependenciesMap(self,workspace):        
         
-        #
         # Provide backwards links  [Note: ant|maven might have added some
         # dependencies, so this is done here & not just with the direct
         # xml depend/option elements]
-        #
         for dependency in self.getDirectDependencies():
             dependProject=dependency.getProject()
             # Add us as a dependee on them
@@ -457,6 +455,14 @@
             if dependency.getProject().getName()==name \
                 and not dependency.isNoClasspath() :
                 return True            
+        return False
+
+    def uponFuzzy(self):
+        """
+        At least one of these dependencies is Fuzzy...
+        """
+        for dependency in self.getFullDependencies():
+            if dependency.getProject().isFuzzy(): return True
         return False
 
     # determine if this project is a prereq of any project on the todo list

Modified: gump/trunk/python/gump/model/module.py
==============================================================================
--- gump/trunk/python/gump/model/module.py      (original)
+++ gump/trunk/python/gump/model/module.py      Wed Aug 18 13:20:58 2004
@@ -432,6 +432,15 @@
     def getNotifys(self):
         return self.notifys
         
+    def getArtifactGroup(self):
+        """
+        What does this projects artifacts group under?
+        Right now ... the module name
+        
+        Return String
+        """
+        return self.getName()
+        
     def addProject(self,project):
         """
                Associate this module with this project, and vice verse.

Modified: gump/trunk/python/gump/model/project.py
==============================================================================
--- gump/trunk/python/gump/model/project.py     (original)
+++ gump/trunk/python/gump/model/project.py     Wed Aug 18 13:20:58 2004
@@ -120,6 +120,15 @@
                 return self.module.getNotifys()
         return self.notifys
         
+    def getArtifactGroup(self):
+        """
+        What does this projects artifacts group under?
+        Ask the module...
+        
+        Return String
+        """
+        return self.getModule().getArtifactGroup()
+        
     def hasAnt(self):
         if self.ant: return True
         return False

Modified: gump/trunk/python/gump/model/propagation.py
==============================================================================
--- gump/trunk/python/gump/model/propagation.py (original)
+++ gump/trunk/python/gump/model/propagation.py Wed Aug 18 13:20:58 2004
@@ -54,9 +54,7 @@
                 # List of things that caused issues...
                 self.addCause(cause)
                                    
-                #
                 # Describe the problem
-                #
                 if not message:
                     message = lower(stateDescription(state))
                     if not REASON_UNSET == reason:

Modified: gump/trunk/python/gump/model/state.py
==============================================================================
--- gump/trunk/python/gump/model/state.py       (original)
+++ gump/trunk/python/gump/model/state.py       Wed Aug 18 13:20:58 2004
@@ -24,14 +24,16 @@
 STATE_NONE=1
 STATE_SUCCESS=2
 STATE_FAILED=3
-STATE_STALE=4
+STATE_STALE_SUCCESS=4
+STATE_STALE_FAILED=5
+STATE_FUZZY_SUCCESS=5
+STATE_FUZZY_FAILED=4
 STATE_PREREQ_FAILED=5
 STATE_COMPLETE=6
 
 stateNames = { STATE_UNSET : "Unset",
            STATE_NONE : "NoWork",
            STATE_SUCCESS : "Success",
-           STATE_STALE : "Stale",
            STATE_FAILED : "Failed",
            STATE_PREREQ_FAILED : "PrereqFailed",
            STATE_COMPLETE : "Complete" }
@@ -40,7 +42,6 @@
            STATE_NONE : "No Work Performed",
            STATE_SUCCESS : "Success",
            STATE_FAILED : "Failed",
-           STATE_STALE : "Stale",
            STATE_PREREQ_FAILED : "Prerequisite Failed",
            STATE_COMPLETE : "Complete" }
 
@@ -54,7 +55,6 @@
            "NoWork" : STATE_NONE,
             "Success" : STATE_SUCCESS,
             "Failed" : STATE_FAILED,
-            "Stale" : STATE_STALE,
             "PrereqFailed" : STATE_PREREQ_FAILED,
             "Complete"  : STATE_COMPLETE}
             
@@ -62,7 +62,6 @@
            "No Work Performed" : STATE_NONE,
             "Success" : STATE_SUCCESS,
             "Failed" : STATE_FAILED,
-            "Stale" : STATE_STALE,
             "Prerequisite Failed" : STATE_PREREQ_FAILED,
             "Complete"  : STATE_COMPLETE}
            
@@ -185,9 +184,7 @@
         if self.isReasonUnset(): return ''
         return reasonDescription(self.getReason())
         
-    #
-    #
-    #
+    # Simple Tests
     def isSuccess(self):
         return STATE_SUCCESS == self.state
                 
@@ -196,7 +193,7 @@
                 
     def isFailed(self):
         return STATE_FAILED == self.state
-        
+ 
     def isPrereqFailed(self):
         return STATE_PREREQ_FAILED == self.state
                 
@@ -211,11 +208,14 @@
         return self.isUnset() or self.isOk()           
 
     def isOk(self):
-        return self.isSuccess() or self.isComplete()   
+        return self.isSuccess() or self.isComplete()
 
     def isNotOk(self):
-        return self.isFailed() or self.isPrereqFailed()
-               
+        return self.isFailed() 
+
+    def okToPerformWork(self):
+        return self.isUnsetOrOk() or self.isPrereqFailed()
+        
 class Stateful:
     def __init__(self):  
         """
@@ -241,8 +241,7 @@
         return self.statePair.getStateDescription()
         
     def hasReason(self):
-        if self.statePair.isReasonUnset(): return 0
-        return 1
+        return self.statePair.isReasonUnset()
         
     def getReason(self):
         return self.statePair.reason
@@ -276,4 +275,8 @@
 
     def isNotOk(self):
         return self.statePair.isNotOk() 
+        
+    def okToPerformWork(self):
+        return self.statePair.okToPerformWork() 
+        
                

Modified: gump/trunk/python/gump/repository/artifact.py
==============================================================================
--- gump/trunk/python/gump/repository/artifact.py       (original)
+++ gump/trunk/python/gump/repository/artifact.py       Wed Aug 18 13:20:58 2004
@@ -27,8 +27,13 @@
 
 from shutil import copyfile
 
+import re
 
 class ArtifactRepository:
+    
+    # Match {id}-gump-{date}.{extn} id=1, date=2, extn=3
+    
ARTIFACT_RE=re.compile(r'^(.*)-gump-([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]).(.*)$')
+    
     """
        Represents a local (Gump produced) Artifacts Repository
     """
@@ -57,12 +62,13 @@
         if not os.path.exists(rdir): os.makedirs(rdir)
         return rdir  
     
-    #
-    # Repository format is:
-    #
-    #  ../{group}/jars/{output files}
-    #    
-    def getGroupDir(self,group,rdir=None):
+    def _getGroupDir(self,group,rdir=None):
+        """    
+               Repository format is:
+    
+               .../{group}/jars/{output files}
+        
+        """
         if not rdir: rdir=self.getRepositoryDir()
         gdir=os.path.abspath(os.path.join(rdir,group))
         if not os.path.exists(gdir): os.makedirs(gdir)
@@ -70,10 +76,38 @@
         if not os.path.exists(jdir): os.makedirs(jdir)
         return jdir  
         
+    def getGroups(self):
+        """
+        Get all groups in the repository
+        """
+        return os.path.listdir(getRepositoryDir())
+        
+    def cleanRepository(self):
+        for group in self.getGroups():
+            try:
+                self.cleanRepositoryGroup(group)
+            except:
+                pass
+                
+    def cleanRepositoryGroup(self,group):
+        recent=self.extractMostRecentGroup(group)
+        if recent:
+            
+            # Locate (and make if needed) group.
+            gdir=self._getGroupDir(group)   
+        
+            for file in os.listdir(gdir):
+                match=ArtifactRepository.ARTIFACT_RE.match(file)
+                if match and not match.group(1) in recent.keys():
+                    print 'remove : ' + file
+                    
     def publish(self,group,artifact,id=None):
+        """
+        Publish an artifact ot the artifact repository.
+        """
         
         # Locate (and make if needed) group.
-        cdir=self.getGroupDir(group)
+        gdir=self.getGroupDir(group)
         
         # Extract name, to make relative to group
         artifactName=os.path.basename(artifact)
@@ -86,10 +120,57 @@
             (artifactRoot, artifactExtn) = os.path.splitext(artifactName)
             artifactName=id + '-gump-' + default.date_s + artifactExtn
         
-        newArtifact=os.path.join(cdir,artifactName)
+        newArtifact=os.path.join(gdir,artifactName)
         
         # Do the file transfer..
         copyfile(artifact,newArtifact)
         
         log.info('Published %s to repository as %s at %s' % (artifact,artifactName, 
newArtifact))
+        
+        
+    def extractGroup(self,group):
+        """
+        Get all the sets of identifiers in this group
+        
+        Returns a tuple:
+        
+        1) map of list of tuples (id,date,extn,full name), keyed by date (string).
+        2) the latest date (most recent)
+        
+        """
+        
+        # Locate (and make if needed) group.
+        gdir=self._getGroupDir(group)   
+        
+        # See what we have
+        dates={}
+        mostRecent=''
+        for file in os.listdir(gdir):    
+            match=ArtifactRepository.ARTIFACT_RE.match(file) 
+            if match:
+                # Extract the pieces....
+                id=match.group(1)
+                date=match.group(2)
+                extn=match.group(3)
+                
+                # Group by date 
+                if not dates.has_key(date):
+                    dates[date]={}
+                dates[date][id]=(id,date,extn,match.group(0))
+                
+                # Keep track of latest...
+                if date > mostRecent:
+                    mostRecent=date
+                 
+        return (dates, mostRecent)
+        
+    def extractMostRecentGroup(self,group):
+         """
+         Get the newest set
+         
+         Returns a list of tuples (id,date,extn,full name)
+         """
+         (dates,mostRecent)=self.extractGroup(group)
+         if dates: return dates[mostRecent]
+         
         

Modified: gump/trunk/python/gump/repository/publisher.py
==============================================================================
--- gump/trunk/python/gump/repository/publisher.py      (original)
+++ gump/trunk/python/gump/repository/publisher.py      Wed Aug 18 13:20:58 2004
@@ -47,7 +47,7 @@
         """
         
         if project.okToPerformWork() and project.hasOutputs() and 
project.isRedistributable():      
-            groupName = project.getModule().getName()
+            groupName = project.getArtifactGroup() 
             
             # If we have a <license name='...
             if project.hasLicense():
@@ -80,5 +80,13 @@
                                    self.repository.getGroupDir(groupName),
                                    gump.utils.file.FILE_TYPE_REPO, 
                                    'list_repo_'+project.getName())
+                                   
+        else:
+            ok = project.okToPerformWork()
+            has = project.hasOutputs()
+            redist = project.isRedistributable()
+        
+            log.debug('Not publishing because [ok=%s,has 
outputs=%s,redistributable=%s]' \
+                        % (ok,has,redist))
         
   

Modified: gump/trunk/python/gump/test/artifacts.py
==============================================================================
--- gump/trunk/python/gump/test/artifacts.py    (original)
+++ gump/trunk/python/gump/test/artifacts.py    Wed Aug 18 13:20:58 2004
@@ -62,4 +62,40 @@
     def testPublisher(self):
         p=gump.repository.publisher.RepositoryPublisher(self.run)
         p.processProject(self.workspace.getProject('project1'))
-            
\ No newline at end of file
+            
+    def testRepositoryExtract(self):
+        # Create a repository & populate it
+        self.repo=gump.repository.artifact.ArtifactRepository(self.testRepo)   
+        self.testPublishJar()
+         
+        (dated, latest)=self.repo.extractGroup('testGroup')
+        
+        self.assertNotNone('Extracted something', dated)
+        self.assertNotEmpty('Extracted something', dated)
+        
+    def testRepositoryExtract2(self):
+        # Create a repository & populate it
+        self.repo=gump.repository.artifact.ArtifactRepository(self.testRepo)   
+        
+        gdir=self.repo._getGroupDir('test')
+        
+        file(os.path.join(gdir,'id1-gump-20030221.jar'),'w').close()
+        file(os.path.join(gdir,'id1-gump-20040221.jar'),'w').close()
+        file(os.path.join(gdir,'id1-gump-20050221.jar'),'w').close()
+        file(os.path.join(gdir,'id2-gump-20030221.jar'),'w').close()
+        file(os.path.join(gdir,'id2-gump-20040221.jar'),'w').close()
+        file(os.path.join(gdir,'id2-gump-20050221.jar'),'w').close()
+        file(os.path.join(gdir,'id3-gump-20030221.jar'),'w').close()
+        file(os.path.join(gdir,'id3-gump-20040221.jar'),'w').close()
+        file(os.path.join(gdir,'id3-gump-20050221.jar'),'w').close()
+        file(os.path.join(gdir,'id4-gump-20050221.jar'),'w').close()
+        
+        (dated, latest)=self.repo.extractGroup('test')
+        
+        import pprint
+        pprint.pprint(dated)
+        
+        self.assertNotNone('Extracted something', dated)
+        self.assertEqual('Extracted correct groups', len(dated.keys()), 3)
+        self.assertEqual('Detected correct latest', latest, '20050221')
+        
\ No newline at end of file

Modified: gump/trunk/python/gump/update/artifact.py
==============================================================================
--- gump/trunk/python/gump/update/artifact.py   (original)
+++ gump/trunk/python/gump/update/artifact.py   Wed Aug 18 13:20:58 2004
@@ -111,8 +111,8 @@
         #
         # Prepare Artifact checkout/update command...
         # 
-        cmd=Cmd(getDepotUpdateCmd(),   \
-                'update_'+module.getName(),    \
+        cmd=Cmd(getDepotUpdateCmd(),
+                'update_'+module.getName(),
                 module.getWorkspace().cvsdir)
         
         # Be 'quiet' (but not silent) unless requested otherwise.

Modified: gump/trunk/python/gump/utils/work.py
==============================================================================
--- gump/trunk/python/gump/utils/work.py        (original)
+++ gump/trunk/python/gump/utils/work.py        Wed Aug 18 13:20:58 2004
@@ -277,10 +277,7 @@
         return self.worklist
         
     def performedWork(self,item):
-       self.worklist.add(item)   
-               
-    def okToPerformWork(self):
-        return self.isUnset() or self.isSuccess()        
+       self.worklist.add(item)                 
     
     def hasStart(self):
         return self.worklist.hasStart()

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

Reply via email to