Reputation: 133
I try to parse a ini file into properties which I can use in my ant script. I have the following:
<project name="DeployScript" default="deploy-staging" basedir=".">
<taskdef resource="net/sf/antcontrib/antcontrib.properties" />
<!-- The location of the settings.ini file -->
<property name="ini-file" location="../settings.ini" />
<loadfile property="iniConfig" srcFile="${ini-file}"/>
<target name="deploy-staging"
description="Deploy project to staging environment" >
<echo message="Ini file: ${ini-file}" />
<echo message="${lib}" />
<echo message="${store_dir}" />
<echo message="${ant.home}" />
<!--- walk the ini file's lines -->
<foreach list="${iniConfig}"
target="echoMsg"
param="line"
delimiter="${line.separator}" />
<echo message="HERE: ${prevSection}" />
</target>
<property name="prevSection" value="" />
<!-- this is executed for every line in the ini file. -->
<target name="echoMsg">
<!-- strip out the section name, variable name and value (if exists on the line) -->
<propertyregex property="secm"
input="${line}"
regexp="^\[(.*)\]"
select="\1"
casesensitive="false" />
<propertyregex property="name"
input="${line}"
regexp="^([\S]+)\s*=\s*([^;]+)"
select="\1"
casesensitive="false"
defaultValue="" />
<propertyregex property="value"
input="${line}"
regexp="^([\S]+)\s*=\s*([^;]+)"
select="\2"
casesensitive="false"
defaultValue="" />
<!-- overwrite the previous section if we have found a new one. -->
<if>
<isset property="secm" />
<then>
<echo message="PREVSECTION IS SET" />
<property name="prevSection" value="${secm}" />
</then>
</if>
<!-- display the information about the found data -->
<echo message="line = ${line}" />
<echo message="section = ${secm}" />
<echo message="name = ${name}" />
<echo message="value = ${value}" />
<echo message="new last section: ${prevSection}" />
<echo message="----" />
</target>
</project>
What I try to do is parse all name=value pairs and put them in properties like: section.name=value;
Somehow the section is not remembered within the "echoMsg" target. I would like the section name to be remembered.
So,
[global]
name=var
name2=val
[section2]
name=var
Should become:
global.name=var
global.name2=val
section2.name=var
This is the output of my ant script:
echoMsg:
[echo] PREVSECTION IS SET
[echo] line = [global]
[echo] section = global
[echo] name =
[echo] value =
[echo] new last section: global
[echo] ----
echoMsg:
[echo] line = servername = my-server.local ; Server name
[echo] section = ${secm}
[echo] name = servername
[echo] value = mac-mini-van-Peter.local7
[echo] new last section: ${prevSection}
[echo] ----
As you can see, the last "${prevSection}" is not set. I would expect it to be "global".
I tried to use instead of property, but there's no difference.
Upvotes: 0
Views: 3424
Reputation: 133
This is the code which works for me. Just wanted to share with the WWW:
<project name="DeployScript" default="deploy-staging" basedir=".">
<taskdef resource="net/sf/antcontrib/antlib.xml" />
<!-- The location of the settings.ini file -->
<property name="ini-file" location="../settings.ini" />
<!-- load the ini file -->
<loadfile property="iniConfig" srcFile="${ini-file}"/>
<!-- when no section is given, the vars are stored in the "default" section -->
<var name="theSection" value="default" />
<!-- set global properties for this build -->
<target name="deploy-staging" description="" >
<echo message="Start parsing ini file" level="info" />
<!--
PARSE INI FILE
This section parses the ini file and creates the parameters
which we can use in this script.
-->
<for list="${iniConfig}" param="line" delimiter="${line.separator}" trim="true">
<sequential>
<propertyregex property="newSection" input="@{line}" regexp="^\[(.*)\]" select="\1" casesensitive="false" defaultvalue="" override="true" />
<propertyregex property="name" input="@{line}" regexp="^([^;][\S]+)\s*=\s*([^;]+)" select="\1" casesensitive="false" defaultValue="" override="true" />
<propertyregex property="value" input="@{line}" regexp="^([^;][\S]+)\s*=\s*([^;]+)" select="\2" casesensitive="false" defaultValue="" override="true" />
<if>
<!-- if we recieved a new section -->
<isset property="newSection" />
<then>
<if>
<!-- section is not empty -->
<not><equals arg1="${newSection}" arg2="" /></not>
<then>
<!-- store this as the new section -->
<var name="theSection" value="${newSection}" />
</then>
</if>
</then>
</if>
<!-- only create a new var if we have a var-name -->
<if>
<isset property="name" />
<then>
<if>
<!-- name is not empty -->
<not><equals arg1="${name}" arg2="" /></not>
<then>
<!-- store this as the new section -->
<var name="${theSection}.${name}" value="${value}" />
<echo message="${theSection}.${name} = ${value}" level="info" />
</then>
</if>
</then>
</if>
</sequential>
</for>
</target>
</project>
Upvotes: 1
Reputation: 107040
Here's a hint: Try adding an echo section before the <propertyregex>
statements to see what the values of the various properties.
I added these <echo>
lines...
<target name="echoMsg">
<!-- strip out the section name, variable name and value (if exists on the line) -->
<echo message="prev line = ${line}" />
<echo message="prev section = ${secm}" />
<echo message="prev name = ${name}" />
<echo message="prev value = ${value}" />
<echo message="prev new last section: ${prevSection}" />
<echo message="----" />
Now let's look at the output:
deploy-staging:
[echo] Ini file: /Users/david/property.ini
[echo] ${lib}
[echo] ${store_dir}
[echo] /usr/share/ant
echoMsg:
[echo] prev line = [global]
[echo] prev section = ${secm}
[echo] prev name = ${name}
[echo] prev value = ${value}
[echo] prev new last section:
[echo] ----
[echo] PREVSECTION IS SET
[echo] line = [global]
[echo] section = global
[echo] name =
[echo] value =
[echo] new last section:
[echo] ----
echoMsg:
[echo] prev line = name=foo
[echo] prev section = ${secm}
[echo] prev name = ${name}
[echo] prev value = ${value}
[echo] prev new last section:
[echo] ----
[echo] line = name=foo
[echo] section = ${secm}
[echo] name = name
[echo] value = foo
[echo] new last section:
[echo] ----
echoMsg:
[echo] prev line = name2=bar
[echo] prev section = ${secm}
[echo] prev name = ${name}
[echo] prev value = ${value}
[echo] prev new last section:
[echo] ----
[echo] line = name2=bar
[echo] section = ${secm}
[echo] name = name2
[echo] value = bar
[echo] new last section:
[echo] ----
echoMsg:
[echo] prev line = [section2]
[echo] prev section = ${secm}
[echo] prev name = ${name}
[echo] prev value = ${value}
[echo] prev new last section:
[echo] ----
[echo] PREVSECTION IS SET
[echo] line = [section2]
[echo] section = section2
[echo] name =
[echo] value =
[echo] new last section:
[echo] ----
echoMsg:
[echo] prev line = name=fubar
[echo] prev section = ${secm}
[echo] prev name = ${name}
[echo] prev value = ${value}
[echo] prev new last section:
[echo] ----
[echo] line = name=fubar
[echo] section = ${secm}
[echo] name = name
[echo] value = fubar
[echo] new last section:
[echo] ----
[echo] HERE:
BUILD SUCCESSFUL
Total time: 1 second
Each call to <echomsg>
loses the values previously set in <echomsg>
.
I suggest you try the <for>
task. The <for>
task won't lose the values of your property through each iteration of the loop. However, you'll have to add the override
setting to your <propertyregex>
tasks, and to use the <var>
tasks instead of <property>
tasks to be able to reset your property values through each iteration of the loop.
You'll also have to change your <taskdef>
to this:
<taskdef resource="net/sf/antcontrib/antlib.xml" />
Upvotes: 1