--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/preparation/bom/bom.ant.xml Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,224 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+============================================================================
+Name : bom.ant.xml
+Part of : Helium
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="preparation.bom" xmlns:hlm="http://www.nokia.com/helium">
+ <description>
+ Creates a Bill-Of-Materials record based on the Synergy inputs.
+ </description>
+
+ <property name="create.bom.workarea.root" value="."/>
+
+ <!-- The target create-bom creates a Bill-Of-Material based on the Synergy project
+ The target can be run in the project's root directory or the directory can be given by
+ setting the property create.bom.workarea.root. The IDO builds are expected to set it to their
+ projects work area directory. -->
+ <target name="create-bom" depends="get-ccm-password,old-bom-log,ccm-prepare-input,prep-prepare-input" if="prep.delivery.file">
+ <if>
+ <isset property="run.ccm"/>
+ <then>
+ <hlm:startSpecificLogMacro name="${build.log.dir}/${build.id}_bom.log" regexp="${ccm.user.password}"/>
+ <hlm:python>
+import os
+import build.model
+import configuration
+import nokia.nokiaccm
+import ccm.extra
+import ant
+import sys
+import traceback
+
+session = None
+try:
+ 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}')
+ waroot = ant.get_property(r'${create.bom.workarea.root}')
+ buildid = ant.get_property(r'${build.id}')
+ buildlogdir = ant.get_property(r'${build.log.dir}')
+ cache = None
+ if ant.get_property(r'${ccm.cache.xml}') is not None:
+ cache = str(ant.get_property(r'${ccm.cache.xml}'))
+ provider = ccm.extra.CachedSessionProvider(opener=nokia.nokiaccm.open_session, cache=cache)
+
+ configBuilder = configuration.NestedConfigurationBuilder(open(ant.get_property(r'${prep.delivery.conf.parsed}'), 'r'))
+ configSet = configBuilder.getConfiguration()
+ for config in configSet.getConfigurations():
+ waroot = config['dir']
+ print "Found wa for project %s" % waroot
+
+ if database != None:
+ session = provider.get(username, password, database=database)
+ else:
+ session = provider.get(username, password, engine, dbpath)
+
+ ccmproject = ccm.extra.get_toplevel_project(session, waroot)
+
+ config_data = {'delivery': ant.get_property(r'${prep.delivery.conf.parsed}'), 'prep.xml': ant.get_property(r'${prep.config.file.parsed}'), 'build.id': buildid, 'ccm.database': database, 'symbian_rel_week': ant.get_property(r'${symbian.version.week}'), 'symbian_rel_ver': ant.get_property(r'${symbian.version}'), 'symbian_rel_year': ant.get_property(r'${symbian.version.year}'), 's60_version': ant.get_property(r'${s60.version}'), 's60_release': ant.get_property(r'${s60.release}'), 'currentRelease.xml': ant.get_property(r'${build.drive}') + "/currentRelease.xml"}
+ config = configuration.Configuration(config_data)
+
+ bom = None
+ # let's only support the new spec model!
+ bom = build.model.BOM(config, ccmproject, username=username, password=password, provider=provider)
+
+ xml_writer = build.model.BOMXMLWriter(bom)
+ xml_writer.write(r"%s/%s_bom.xml" % (buildlogdir, buildid))
+
+ if os.path.exists(ant.get_property(r'${old.bom.log}')):
+ xml_delta_writer = build.model.BOMDeltaXMLWriter(bom, ant.get_property(r'${old.bom.log}'))
+ xml_delta_writer.write(buildlogdir + "/" + buildid + "_bom_delta.xml")
+ delta_bom_content_validity = xml_delta_writer.validate_delta_bom_contents(buildlogdir + "/" + buildid + "_bom_delta.xml", "%s/%s_bom.xml" % (buildlogdir, buildid), ant.get_property(r'${old.bom.log}'))
+ if((delta_bom_content_validity == False) and (ant.get_property(r'${hlm.enable.asserts}') is not None)):
+ print 'Bom delta contents are not matching'
+ raise Exception
+ elif((delta_bom_content_validity == True) or (delta_bom_content_validity == None)):
+ print 'Bom delta contents are matching.'
+ elif(delta_bom_content_validity == False):
+ print 'Bom delta contents are not matching.'
+ else:
+ print 'Old BOM log cannot be found, skipping BOM delta creation.'
+ bom.close()
+ session.close()
+except Exception, ex:
+ print 'Caught exception in BOM: ' + str(ex)
+ traceback.print_exc()
+ </hlm:python>
+
+ <if>
+ <available file="${build.log.dir}/${build.id}_bom.xml"/>
+ <then>
+ <echo>${build.log.dir}</echo>
+ <fmpp sourceRoot="${helium.dir}/tools/preparation/bom"
+ outputRoot="${build.log.dir}" includes="bom.html.*,bom.txt.*" removeExtensions="ftl">
+ <freemarkerLinks expandProperties="yes">
+ macro: ${helium.dir}/tools/common/templates/macro
+ </freemarkerLinks>
+ <data expandProperties="yes">
+ doc: xml(${build.log.dir}/${build.id}_bom.xml)
+ </data>
+ </fmpp>
+
+ <move file="${build.log.dir}/bom.html" tofile="${build.log.dir}/${build.id}_bom.html"/>
+ <move file="${build.log.dir}/bom.txt" tofile="${build.log.dir}/${build.id}_bom.txt"/>
+
+ <!-- Transform bom data into the diamonds xml format:
+ * BOM folders are flattened into tasks.
+ * Schema version is extracted from the appropriate FMPP template. -->
+ <fmpp sourcefile="${helium.dir}/tools/common/templates/diamonds/diamonds_header.ftl"
+ outputfile="${build.temp.dir}/diamonds_header.xml" quiet="true"/>
+ <loadfile srcfile="${build.temp.dir}/diamonds_header.xml" property="diamonds.schema.xml">
+ <filterchain>
+ <linecontains>
+ <contains value="schema"/>
+ </linecontains>
+ </filterchain>
+ </loadfile>
+ <xmltask source="${build.log.dir}/${build.id}_bom.xml" dest="${build.log.dir}/create-bom.xml">
+ <insert path="bom/content" xml="${diamonds.schema.xml}" position="before"/>
+ <remove path="bom/content/project/folder/name"/>
+ <remove path="bom/build"/>
+ <rename path="bom" to="diamonds-build"/>
+ </xmltask>
+ <delete file="${build.temp.dir}/diamonds_header.xml"/>
+ <replace file="${build.log.dir}/create-bom.xml" token="<folder>" value="<!-- <folder> -->"/>
+ <replace file="${build.log.dir}/create-bom.xml" token="</folder>" value="<!-- </folder> -->"/>
+ <xmltask source="${build.log.dir}/create-bom.xml" dest="${build.log.dir}/create-bom.xml"
+ outputter="simple">
+ <remove path="//comment()"/>
+ </xmltask>
+
+ <hlm:assertFileExists file="${build.log.dir}/create-bom.xml"/>
+ <hlm:assertFileExists file="${build.log.dir}/${build.id}_bom.html"/>
+ <hlm:assertFileExists file="${build.log.dir}/${build.id}_bom.txt"/>
+ </then>
+ <else>
+ <echo>WARNING: ${build.log.dir}/${build.id}_bom.xml file not found.</echo>
+ </else>
+ </if>
+
+ <if>
+ <isset property="old.bom.log.present"/>
+ <then>
+ <hlm:assertFileExists file="${build.log.dir}/${build.id}_bom_delta.xml"/>
+ <fmpp sourceRoot="${helium.dir}/tools/preparation/bom"
+ outputRoot="${build.log.dir}" includes="bom_delta.*" removeExtensions="ftl">
+ <freemarkerLinks expandProperties="yes">
+ macro: ${helium.dir}/tools/common/templates/macro
+ </freemarkerLinks>
+ <data expandProperties="yes">
+ doc: xml(${build.log.dir}/${build.id}_bom_delta.xml)
+ </data>
+ </fmpp>
+
+ <move file="${build.log.dir}/bom_delta.html" tofile="${build.log.dir}/${build.id}_bom_delta.html"/>
+ <move file="${build.log.dir}/bom_delta.txt" tofile="${build.log.dir}/${build.id}_bom_delta.txt"/>
+
+ <hlm:assertFileExists file="${build.log.dir}/${build.id}_bom_delta.html"/>
+ </then>
+ </if>
+ <hlm:stopSpecificLogMacro name="${build.log.dir}/${build.id}_bom.log"/>
+ </then>
+ </if>
+ </target>
+
+ <!-- Calculates the previous build number based on the current one. -->
+ <target name="previous-build-number" unless="previous.build.number">
+ <script language="jython" setbeans="false">
+import ant
+from com.nokia.ant.util import Helper
+buildnum = Helper.getProperty(project, "build.number")
+pbuildnum = ant.get_previous_build_number(buildnum)
+if pbuildnum != None:
+ project.setProperty("previous.build.number", pbuildnum)
+ </script>
+ <echo>Previous build number = ${previous.build.number}</echo>
+ </target>
+
+
+ <!-- Finds the path to the last usable XML BOM log for creating a BOM delta. -->
+ <target name="old-bom-log" unless="old.bom.log" depends="previous-build-number">
+ <property name="bom.log" value="${publish.dir}/logs/${build.id}_bom.xml"/>
+ <script language="jython" setbeans="false">
+import re
+try:
+ buildnumber = project.getProperty("build.number")
+ pbuildnumber = project.getProperty("previous.build.number")
+ bomlog = project.getProperty("bom.log")
+ old_bom_log = re.sub(r'\.(%s)([\/_])' % buildnumber, r'.' + pbuildnumber + r'\2', bomlog)
+ project.setProperty("old.bom.log", old_bom_log)
+except ValueError:
+ # Do nothing - old BOM cannot be calulated
+ self.log("Old BOM cannot be found")
+ </script>
+ <echo>Previous BOM log: ${old.bom.log}</echo>
+ <available file="${old.bom.log}" property="old.bom.log.present"/>
+ <if>
+ <isset property="old.bom.log.present"/>
+ <then>
+ <hlm:assertFileExists file="${old.bom.log}"/>
+ </then>
+ </if>
+ <echo>Previous BOM log present: ${old.bom.log.present}</echo>
+ </target>
+
+</project>