buildframework/helium/tools/relnotes/relnotes.ant.xml
changeset 307 22ecbfc20eb4
parent 217 0f5e3a7fb6af
child 587 85df38eb4012
--- a/buildframework/helium/tools/relnotes/relnotes.ant.xml	Wed Feb 17 16:10:19 2010 +0000
+++ b/buildframework/helium/tools/relnotes/relnotes.ant.xml	Fri Mar 05 14:30:49 2010 +0000
@@ -20,6 +20,7 @@
 
 ============================================================================
 -->
+<!--* @package releases -->
 <project name="relnotes" default="release-notes" xmlns:hlm="http://www.nokia.com/helium">
     <description>
     Generates a release note by modifying a template (that you can edit yourself) with
@@ -29,23 +30,83 @@
     * Adds table of errors and warnings
     * Generates list of baselines, projects and tasks used
     </description>
+    
+    <!--* @property product.printname
+    A printable name for a product used in release notes.
+    @type string
+    @editable required
+    @scope public
+    -->
+    
+    <!--* @property product.type
+    Project ID in release notes.
+    @type string
+    @editable required
+    @scope public
+    -->
+    
+    <!--* @property relnotes.config.dir
+    Defines the directory that contains release notes creation configuration files.
+    @type string
+    @editable required
+    @scope public
+    -->
 
+    <!-- Defines the directory that will contain the output of release notes creation.
+    @type string
+    @scope private
+    -->
     <property name="releasenotes.output.dir" value="${build.output.dir}/relnotes"/>
+    <!-- Defines the logo image file which will be used in release notes.
+    @type string
+    @scope private
+    -->
     <property name="releasenotes.logo" value="${relnotes.config.dir}/logo.png"/>
+    <!-- Property file with customer values
+    @type string
+    @scope private
+    -->
     <property name="releasenotes.props" value="${relnotes.config.dir}/relnotes.properties"/>
+    <!-- Temp file
+    @type string
+    @scope private
+    -->
     <property name="releasenotes.temp.props" value="${temp.build.dir}/relnotes.properties"/>
+    <!-- Temp file
+    @type string
+    @scope private
+    -->
     <property name="releasenotes.temp.props2" value="${temp.build.dir}/relnotes2.properties"/>
+    <!-- Defines the name of the release note template used.
+    @type string
+    @scope private
+    -->
     <property name="releasenotes.template" value="${relnotes.config.dir}/template.rtf"/>
+    <!-- Location of output rtf file
+    @type string
+    @scope private
+    -->
     <property name="releasenotes.output" value="${releasenotes.output.dir}/${build.id}_relnotes.rtf"/>
+    <!-- Temp file
+    @type string
+    @scope private
+    -->
     <property name="releasenotes.temp.errors" value="${temp.build.dir}/errors.csv"/>
+    <!-- Temp file
+    @type string
+    @scope private
+    -->
     <property name="releasenotes.temp.output" value="${temp.build.dir}/tempDocument.rtf"/>
+    <!-- Location of scan2log HTML file
+    @type string
+    @scope private
+    -->
     <property name="releasenotes.scan2log" value="${build.log.dir}/${build.id}.${product.family}_scan2.html"/>
     
     <import file="${relnotes.config.dir}/relnotes_properties.ant.xml" optional="true"/>
     
-    <!-- Private: -->
-    <target name="release-notes-variant-configuration" depends="rombuild-prepare-input">
-        
+    <!-- @scope private -->
+    <target name="release-notes-variant-configuration" depends="imaker-merge-rom-xml">
         <script language="jython" setbeans="false">
 tagnames = ""
 for product in project.getProperty("product.list").split(","):
@@ -55,10 +116,9 @@
         <replace file="${releasenotes.output}" token="TypeVariantTableHere" value="${variant.product.tagnames}" summary="true"/>
         <for list="${product.list}" delimiter="," param="product.name" >
             <sequential>            
-                <exec executable="python" dir="${helium.dir}/tools/relnotes" failonerror="${failonerror}">
-                    <arg value="getVariantConfiguration.py"/>
+                <exec executable="python" failonerror="${failonerror}">
+                    <arg line="-m getVariantConfiguration"/>
                     <arg value="@{product.name}"/>
-                    <arg value="${localisation.language.file}"/>
                     <arg value="${rombuild.config.file.parsed}"/>
                     <arg value="${temp.build.dir}/variant_@{product.name}.csv"/>
                 </exec>
@@ -75,13 +135,20 @@
         </for>
     </target>
     
-    <!-- Private: Create error list in release notes -->
+    <!-- Create error list in release notes
+    @scope private    
+    -->
     <target name="release-notes-error-summary">
-        <exec executable="python" dir="${helium.dir}/tools/relnotes" failonerror="${failonerror}">
-            <arg value="readHTML.py"/>
-            <arg value="${releasenotes.scan2log}"/>
-            <arg value="${releasenotes.temp.errors}"/>
-        </exec>
+        <fmpp sourceFile="${helium.dir}/tools/relnotes/templates/errors.csv.ftl"
+                     outputfile="${releasenotes.temp.errors}">
+            <freemarkerLinks expandProperties="yes">
+                macro: ${helium.dir}/tools/common/templates/macro
+            </freemarkerLinks>
+            <data expandProperties="yes">
+                dbPath: ${metadata.dbfile}
+                ant: antProperties()
+            </data>
+        </fmpp>
         <hlm:python>
 import ant
 import rtfutils
@@ -92,7 +159,7 @@
         <move file="${releasenotes.temp.output}" tofile="${releasenotes.output}"/>
     </target>
     
-    <!-- Private: Add logo to release notes -->
+    <!--  Add logo to release notes. @scope private -->
     <target name="release-notes-logo">
         <hlm:python>
 import ant
@@ -103,14 +170,20 @@
         <move file="${releasenotes.temp.output}" tofile="${releasenotes.output}"/>
     </target>
     
-    <!-- Private: Find project and baseline of what is running helium -->
+    <!-- Find project and baseline of what is running helium
+    @scope private    
+    -->
     <target name="release-notes-getcmprojectname">
-        <script language="jython" setbeans="false">
-import nokia.nokiaccm
+        <if>
+            <istrue value="${ccm.enabled}" />
+            <then>
+                <script language="jython" setbeans="false">
 import ccm.extra
 import traceback
 import os
 import logging
+import ccmutil
+
 #logging.basicConfig(level=logging.DEBUG)
 session = None
 try:
@@ -120,12 +193,10 @@
     engine = project.getProperty('ccm.engine.host')
     dbpath = project.getProperty('ccm.database.path')     
     waroot = project.getProperty('create.bom.workarea.root')
-    if database != None:
-        session = nokia.nokiaccm.open_session(username, password, database=database)
-    else:
-        session = nokia.nokiaccm.open_session(username, password, engine, dbpath)
-        
+    
+    session = ccmutil.get_session(database, username, password, engine, dbpath)
     cmproject = ccm.extra.get_toplevel_project(session, waroot)
+    
     if cmproject == None:
         print 'Error: ' + waroot + ' must be a synergy project and still be in database'
     else:
@@ -134,13 +205,14 @@
 except Exception, ex:
     print 'Caught exception: ' + str(ex)
     traceback.print_exc()
-        </script>
-        
-        <hlm:python outputproperty="ccm.toplevel.baseline">
-import nokia.nokiaccm
+    if session:
+        session.close()
+                </script>
+                <hlm:python outputproperty="ccm.toplevel.baseline">
 import traceback
 import ant
 import logging
+import ccmutil
 logging.disable(logging.INFO)
 session = None
 try:
@@ -149,151 +221,110 @@
     password = ant.get_property(r'${ccm.user.password}')
     engine = ant.get_property(r'${ccm.engine.host}')
     dbpath = ant.get_property(r'${ccm.database.path}')
-    if database != None:
-        session = nokia.nokiaccm.open_session(username, password, database=database)
-    else:
-        session = nokia.nokiaccm.open_session(username, password, engine, dbpath)
-        
+    session = ccmutil.get_session(database, username, password, engine, dbpath)
     cmproject = session.create(ant.get_property(r'${ccm.toplevel.project}'))
     print cmproject.baseline
     session.close()
 except Exception, ex:
     print 'Caught exception: ' + str(ex)
     traceback.print_exc()
-        </hlm:python>
+    if session:
+        session.close()
+                </hlm:python>
+            </then>
+        </if>
     </target>
     
-    <!-- Private: 
-    Look at property 'project.startswith' and find complete CM name
-    Output property: '${project.startswith}.project'
+    <!--
+    Look 'startsWith' and find complete CM name
+    Output property: '{startsWith}.project'.
+        
+    @scope private
     -->
-    <target name="release-notes-getprojectname">
-        <hlm:python outputproperty="release.notes.temp">
+    <macrodef name="releaseNotesGetProjectName" uri="http://www.nokia.com/helium">
+        <attribute name="startsWith" />
+        <sequential>
+            <if>
+                <available file="${build.log.dir}/${build.id}_bom.xml" />
+                <then>
+                    <hlm:python outputproperty="@{startsWith}.project">
 import amara
 import ant
 
-bomfile = open(r"${build.log.dir}/${build.id}_BOM.xml")
+bomfile = open(r"${build.log.dir}/${build.id}_bom.xml")
 bom = amara.parse(bomfile)
 
 for p in bom.bom.content.project:
-    if (str(p.name).startswith(ant.get_property(r'${project.startswith}'))):
+    if (str(p.name).startswith(ant.get_property(r'@{startsWith}'))):
         print str(p.name)
 bomfile.close()
-        </hlm:python>
-        <script language="jython" setbeans="false">
-project.setProperty(project.getProperty('project.startswith') + '.project', project.getProperty('release.notes.temp'))
-        </script>
-        
+                    </hlm:python>
+                </then>
+            </if>
+        </sequential>
+    </macrodef>
+    
+    <!-- Write projects, baselines and task list for MC and IBUSAL
+    @scope private    
+    -->
+    <target name="release-notes-ccm" depends="get-ccm-password,release-notes-getcmprojectname,create-bom">
+        <if>
+            <and>
+                <istrue value="${ccm.enabled}" />
+                <available file="${build.log.dir}/${build.id}_bom.xml" />
+            </and>
+            <then>
+                <hlm:python>
+import amara
+import ant
+import bomtofile
+import ccmutil
+
+bomfile = open(r"${build.log.dir}/${build.id}_bom.xml")
+bom = amara.parse(bomfile)
+password = ant.get_property(r'${ccm.user.password}')
+session = ccmutil.get_session(ant.get_property(r'${ccm.database}'), ant.get_property(r'${ccm.user.login}'), password, ant.get_property(r'${ccm.engine.host}'), ant.get_property(r'${ccm.database.path}'))
+for p in bom.bom.content.project:
+    if p.name == ant.get_property(r'${ccm.toplevel.project}'):
+        bomwriter = bomtofile.BOMWriter(session, 'MC', p, ant.get_property(r'${releasenotes.output.dir}'))
+        bomwriter.writeprojects()
+        bomwriter.writebaselines()
+        bomwriter.writetasks()
+            
+    if (str(p.name).startswith('IBUSAL')):
+        bomwriter = bomtofile.BOMWriter(session, 'IBUSAL', p, ant.get_property(r'${releasenotes.output.dir}'))
+        bomwriter.writeprojects()
+        bomwriter.writetasks()
+session.close()
+bomfile.close()
+                </hlm:python>
+            </then>
+        </if>
     </target>
     
-    <!-- Private: Write projects, baselines and task list for MC and IBUSAL -->
-    <target name="release-notes-ccm" depends="get-ccm-password,release-notes-getcmprojectname,create-bom">
-        
-        <hlm:python>
-import amara
-import nokia.nokiaccm
-import ant
-
-class BOMToFile(object):
-    """
-    Read BOM and output in text
-    """
-    def __init__(self, session, project_name, project, output_dir):
-        self.project_name = project_name
-        self.project = project
-        self.output_dir = output_dir
-        self.session = session
-      
-    def writeprojects(self):
-        fileout = file(self.output_dir + '/' + self.project_name + '_projects.txt', 'w')
-        
-        i = 1
-        for project in self.project.baseline:
-            fileout.write(str(i) + ") " + str(project) + "\n")
-            
-            i += 1
-        fileout.close()
-        
-    def writebaselines(self):
-        fileout = file(self.output_dir + '/' + self.project_name + '_baselines.txt', 'w')    
-        
-        i = 1
-        for project in self.project.baseline:
-            fileout.write(str(i) + ") " + str(project) + "\n")
-            
-            cmproject = self.session.create(str(project))
-            
-            try:
-                baseline = str(cmproject.baseline).strip()
-                if baseline == "None":
-                    fileout.write(str(i) + ") " + str(project) + "\n")
-                else:
-                    fileout.write(str(i) + ") " + baseline + "\n")
-                i += 1
-            except Exception, ex:
-                print ex
-        fileout.close()
-            
-    def writetasks(self):
-        if self.project.xml_properties.has_key("task"):
-            fileout = file(self.output_dir + '/' + self.project_name + '_tasks.txt', 'w')
-            
-            i = 1
-            for task in self.project.task:
-                fileout.write(str(i) + ") Task " + str(task) + "\n")
-                i += 1
-            fileout.close()
-
-bomfile = open(r"${build.log.dir}/${build.id}_BOM.xml")
-bom = amara.parse(bomfile)
-database = ant.get_property(r'${ccm.database}')
-username = ant.get_property(r'${ccm.user.login}')
-password = ant.get_property(r'${ccm.user.password}')
-engine = ant.get_property(r'${ccm.engine.host}')
-dbpath = ant.get_property(r'${ccm.database.path}')
-if database != None:
-    session = nokia.nokiaccm.open_session(username, password, database=database)
-else:
-    session = nokia.nokiaccm.open_session(username, password, engine, dbpath)
-
-for p in bom.bom.content.project:
-    if p.name == ant.get_property(r'${ccm.toplevel.project}'):
-        btof = BOMToFile(session, 'MC', p, ant.get_property(r'${releasenotes.output.dir}'))
-        
-        btof.writeprojects()
-        btof.writebaselines()
-            
-        btof.writetasks()
-            
-    if (str(p.name).startswith('IBUSAL')):
-        btof = BOMToFile(session, 'IBUSAL', p, ant.get_property(r'${releasenotes.output.dir}'))
-        
-        btof.writeprojects()
-            
-        btof.writetasks()
-            
-session.close()
-bomfile.close()
-
-        </hlm:python>
-    </target>
-    
-    <!-- Private: Read BOM and write ICF list -->
+    <!-- Read BOM and write ICF list
+    @scope private
+    -->
     <target name="release-notes-icfs" depends="create-bom">
-        <exec executable="python" dir="${helium.dir}/tools/relnotes" failonerror="${failonerror}">
-            <arg value="icf2txt.py"/>
-            <arg value="${build.log.dir}/${build.id}_BOM.xml"/>            
+        <exec executable="python" failonerror="${failonerror}">
+            <arg line="-m icf2txt"/>
+            <arg value="${temp.build.dir}/${build.id}_BOM.xml"/>            
             <arg value="${releasenotes.output.dir}/icdicf.txt"/>
         </exec>
     </target>
     
-    <!-- Private: -->
+    <!-- @scope private -->
     <target name="release-notes-test" if="hlm.enable.asserts">
-        <hlm:python>
+        <if>
+            <istrue value="${ccm.enabled}" />
+            <then>
+                <hlm:python>
 import ccm
 #check for ccm session leaks
 assert (len(ccm.running_sessions()) == 0)
-        </hlm:python>
+                </hlm:python>
+            </then>
+        </if>
     </target>
         
     <!--