git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@812881 13f79535-47bb-0310-9956-ffa450edef68master
@@ -33,7 +33,7 @@ resource) in the project. Properties are case sensitive.</p> | |||
rest of the build; they are most definitely not variables. | |||
<p>There are seven ways to set properties:</p> | |||
<ul> | |||
<li>By supplying both the <i>name</i> and <i>value</i> attribute.</li> | |||
<li>By supplying both the <i>name</i> and one of <i>value</i> or <i>location</i> attribute.</li> | |||
<li>By supplying the <i>name</i> and nested text.</li> | |||
<li>By supplying both the <i>name</i> and <i>refid</i> attribute.</li> | |||
<li>By setting the <i>file</i> attribute with the filename of the property | |||
@@ -154,6 +154,16 @@ SYSTEM). | |||
A "." is appended to the prefix if not specified.</td> | |||
<td align="center" valign="top">No</td> | |||
</tr> | |||
<tr> | |||
<td valign="top">relative</td> | |||
<td valign="top">If set to <tt>true</tt> the relative path to <tt>basedir</tt> is set.</td> | |||
<td align="center" valign="top">No (default=<tt>false</tt>)</td> | |||
</tr> | |||
<tr> | |||
<td valign="top">basedir</td> | |||
<td valign="top">The basedir to calculate the relative path from.</td> | |||
<td align="center" valign="top">No (default=<tt>${basedir}</tt>)</td> | |||
</tr> | |||
</table> | |||
<h3>Parameters specified as nested elements</h3> | |||
@@ -211,6 +221,17 @@ environment variable <tt>STAGE</tt> some or all values could be overwritten, e.g | |||
name for the test server). Finally all these values could be overwritten by personal settings with | |||
a file per user.</p> | |||
<pre> | |||
<property name="foo" location="my/file.txt" relative="true" basedir=".."/> | |||
</pre> | |||
<p>Stores the relative path in <tt>foo</tt>: projectbasedir/my/file.txt</p> | |||
<pre> | |||
<property name="foo" location="my/file.txt" relative="true" basedir="cvs"/> | |||
</pre> | |||
<p>Stores the relative path in <tt>foo</tt>: ../my/file.txt</p> | |||
<h3>Property Files</h3> | |||
As stated, this task will load in a properties file stored in the file | |||
@@ -92,6 +92,8 @@ public class Property extends Task { | |||
private Project fallback; | |||
private Object untypedValue; | |||
private boolean valueAttributeUsed = false; | |||
private boolean relative = false; | |||
private File basedir; | |||
protected boolean userProperty; // set read-only properties | |||
// CheckStyle:VisibilityModifier ON | |||
@@ -124,6 +126,24 @@ public class Property extends Task { | |||
this.fallback = fallback; | |||
} | |||
/** | |||
* Sets 'relative' attribute. | |||
* @param relative new value | |||
* @since Ant 1.8.0 | |||
*/ | |||
public void setRelative(boolean relative) { | |||
this.relative = relative; | |||
} | |||
/** | |||
* Sets 'basedir' attribute. | |||
* @param basedir new value | |||
* @since Ant 1.8.0 | |||
*/ | |||
public void setBasedir(File basedir) { | |||
this.basedir = basedir; | |||
} | |||
/** | |||
* The name of the property to set. | |||
* @param name property name | |||
@@ -151,7 +171,11 @@ public class Property extends Task { | |||
* @ant.attribute group="name" | |||
*/ | |||
public void setLocation(File location) { | |||
setValue(location.getAbsolutePath()); | |||
if (relative) { | |||
internalSetValue(location); | |||
} else { | |||
setValue(location.getAbsolutePath()); | |||
} | |||
} | |||
/* the following method is first in source so IH will pick it up first: | |||
@@ -433,7 +457,19 @@ public class Property extends Task { | |||
} | |||
if (name != null && untypedValue != null) { | |||
addProperty(name, untypedValue); | |||
if (relative) { | |||
try { | |||
File from = untypedValue instanceof File ? (File)untypedValue : new File(untypedValue.toString()); | |||
File to = basedir != null ? basedir : getProject().getBaseDir(); | |||
String relPath = FileUtils.getFileUtils().getRelativePath(to, from); | |||
relPath = relPath.replace('/', File.separatorChar); | |||
addProperty(name, relPath); | |||
} catch (Exception e) { | |||
throw new BuildException(e, getLocation()); | |||
} | |||
} else { | |||
addProperty(name, untypedValue); | |||
} | |||
} | |||
if (file != null) { | |||
@@ -466,7 +502,7 @@ public class Property extends Task { | |||
} | |||
} | |||
} | |||
/** | |||
* load properties from a url | |||
* @param url url to load from | |||
@@ -47,4 +47,34 @@ | |||
<property name="foo" location="${testfile}"/> | |||
<au:assertPropertyEquals name="foo" value="${base}${file.separator}${testfile}"/> | |||
</target> | |||
<target name="testLocationWithRecursive"> | |||
<property name="foo" location="${testfile}" relative="false"/> | |||
<au:assertPropertyEquals name="foo" value="${base}${file.separator}${testfile}"/> | |||
</target> | |||
<target name="testRelative"> | |||
<property name="foo" location="${testfile}" relative="true"/> | |||
<au:assertPropertyEquals name="foo" value="${testfile}"/> | |||
</target> | |||
<target name="testRelativeBase"> | |||
<property name="foo" location="${testfile}" relative="true" basedir="${base}"/> | |||
<au:assertPropertyEquals name="foo" value="${testfile}"/> | |||
</target> | |||
<target name="testRelativeUnderBase"> | |||
<property name="foo" location="${testfile}" relative="true" basedir="condition"/> | |||
<au:assertPropertyEquals name="foo" value="antversion-test.xml"/> | |||
</target> | |||
<target name="testRelativeUnderBase2"> | |||
<property name="foo" location="${testfile}" relative="true" basedir="cvs"/> | |||
<au:assertPropertyEquals name="foo" value="..${file.separator}condition${file.separator}antversion-test.xml"/> | |||
</target> | |||
<target name="testRelativeOverBase"> | |||
<property name="foo" location="${testfile}" relative="true" basedir=".."/> | |||
<au:assertPropertyEquals name="foo" value="taskdefs${file.separator}${testfile}"/> | |||
</target> | |||
</project> |