--- 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>
<!--