git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@998962 13f79535-47bb-0310-9956-ffa450edef68master
@@ -203,6 +203,9 @@ Other changes: | |||
and singleline attributes. | |||
Bugzilla Report 49764. | |||
* A new <cutdirsmapper> can be used like wget's --cut-dirs option to | |||
strip leading directories from file names. | |||
Changes from Ant 1.8.0 TO Ant 1.8.1 | |||
=================================== | |||
@@ -919,7 +919,44 @@ list of mapped names reset after every invocation. | |||
<code><mapper <b>type</b>></code> attribute. | |||
</p> | |||
<h4><a name="cutdirs-mapper">cutdirsmapper (since Ant 1.8.2)</a></h4> | |||
<p>This mapper strips a configured number of leading directories from | |||
the source file name.</p> | |||
<b>Examples:</b> | |||
<blockquote><pre> | |||
<cutdirsmapper dirs="1"/> | |||
</pre></blockquote> | |||
<table border="1" cellpadding="2" cellspacing="0"> | |||
<tr> | |||
<td valign="top"><b>Source file name</b></td> | |||
<td valign="top"><b>Target file names</b></td> | |||
</tr> | |||
<tr> | |||
<td valign="center"><code>foo/bar/A.txt</code></td> | |||
<td valign="top"><code>bar/A.txt</code></td> | |||
</tr> | |||
</table> | |||
<p>The cutdirsmapper has no | |||
corresponding <code><mapper <b>type</b>></code> attribute.</p> | |||
<table border="1" cellpadding="2" cellspacing="0"> | |||
<tr> | |||
<td valign="top"><b>Attribute</b></td> | |||
<td valign="top"><b>Description</b></td> | |||
<td align="center" valign="top"><b>Required</b></td> | |||
</tr> | |||
<tr> | |||
<td valign="top">dirs</td> | |||
<td valign="top"> | |||
Number of directories to strip (must be a positive number). | |||
</td> | |||
<td align="center" valign="top">Yes</td> | |||
</tr> | |||
</table> | |||
</body> | |||
</html> |
@@ -46,6 +46,7 @@ compositemapper=org.apache.tools.ant.util.CompositeMapper | |||
chainedmapper=org.apache.tools.ant.util.ChainedMapper | |||
filtermapper=org.apache.tools.ant.types.mappers.FilterMapper | |||
firstmatchmapper=org.apache.tools.ant.util.FirstMatchMapper | |||
cutdirsmapper=org.apache.tools.ant.types.mappers.CutDirsMapper | |||
#this condition is in here because it is the sole | |||
#condition defined in Ant1.6 | |||
@@ -0,0 +1,74 @@ | |||
/* | |||
* Licensed to the Apache Software Foundation (ASF) under one or more | |||
* contributor license agreements. See the NOTICE file distributed with | |||
* this work for additional information regarding copyright ownership. | |||
* The ASF licenses this file to You under the Apache License, Version 2.0 | |||
* (the "License"); you may not use this file except in compliance with | |||
* the License. You may obtain a copy of the License at | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software | |||
* distributed under the License is distributed on an "AS IS" BASIS, | |||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
* See the License for the specific language governing permissions and | |||
* limitations under the License. | |||
* | |||
*/ | |||
package org.apache.tools.ant.types.mappers; | |||
import java.io.File; | |||
import org.apache.tools.ant.BuildException; | |||
import org.apache.tools.ant.util.FileNameMapper; | |||
/** | |||
* A mapper that strips of the a configurable number of leading | |||
* directories from a file name. | |||
* | |||
* <p>This mapper was inspired by a user-list thread that mentioned | |||
* wget's --cut-dirs option.</p> | |||
* | |||
* @see http://mail-archives.apache.org/mod_mbox/ant-user/201009.mbox/%3C51772743BEA5D44A9EA5BF52AADDD6FB010E96F6@hammai008.delphi.local%3E | |||
*/ | |||
public class CutDirsMapper implements FileNameMapper { | |||
private int dirs = 0; | |||
/** | |||
* The number of leading directories to cut. | |||
*/ | |||
public void setDirs(int dirs) { | |||
this.dirs = dirs; | |||
} | |||
/** | |||
* Empty implementation. | |||
* @param ignore ignored. | |||
*/ | |||
public void setFrom(String ignore) { | |||
} | |||
/** | |||
* Empty implementation. | |||
* @param ignore ignored. | |||
*/ | |||
public void setTo(String ignore) { | |||
} | |||
/** {@inheritDoc}. */ | |||
public String[] mapFileName(final String sourceFileName) { | |||
if (dirs <= 0) { | |||
throw new BuildException("dirs must be set to a positive number"); | |||
} | |||
char fileSep = File.separatorChar; | |||
String fileSepCorrected = | |||
sourceFileName.replace('/', fileSep).replace('\\', fileSep); | |||
int nthMatch = fileSepCorrected.indexOf(fileSep); | |||
for (int n = 1; nthMatch > -1 && n < dirs; n++) { | |||
nthMatch = fileSepCorrected.indexOf(fileSep, nthMatch + 1); | |||
} | |||
if (nthMatch == -1) { | |||
return null; | |||
} | |||
return new String[] { sourceFileName.substring(nthMatch + 1) }; | |||
} | |||
} |
@@ -0,0 +1,56 @@ | |||
<?xml version="1.0"?> | |||
<!-- | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
this work for additional information regarding copyright ownership. | |||
The ASF licenses this file to You under the Apache License, Version 2.0 | |||
(the "License"); you may not use this file except in compliance with | |||
the License. You may obtain a copy of the License at | |||
http://www.apache.org/licenses/LICENSE-2.0 | |||
Unless required by applicable law or agreed to in writing, software | |||
distributed under the License is distributed on an "AS IS" BASIS, | |||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
--> | |||
<project xmlns:au="antlib:org.apache.ant.antunit" | |||
name="firstmatch-test" | |||
default="antunit"> | |||
<import file="../antunit-base.xml" /> | |||
<target name="setUp"> | |||
<mkdir dir="${input}"/> | |||
<mkdir dir="${output}"/> | |||
</target> | |||
<target name="testCut" depends="setUp"> | |||
<mkdir dir="${input}/a/b/c"/> | |||
<touch file="${input}/a/b/D"/> | |||
<touch file="${input}/a/b/c/E"/> | |||
<copy todir="${output}"> | |||
<fileset dir="${input}"/> | |||
<cutdirsmapper dirs="2"/> | |||
</copy> | |||
<au:assertFileExists file="${output}/D"/> | |||
<au:assertFileExists file="${output}/c/E"/> | |||
</target> | |||
<target name="testCutTooManyLevels" depends="setUp"> | |||
<mkdir dir="${input}/a/b/c"/> | |||
<touch file="${input}/a/b/D"/> | |||
<touch file="${input}/a/b/c/E"/> | |||
<copy todir="${output}"> | |||
<fileset dir="${input}"/> | |||
<cutdirsmapper dirs="5"/> | |||
</copy> | |||
<au:assertTrue> | |||
<resourcecount count="0"> | |||
<fileset dir="${output}"/> | |||
</resourcecount> | |||
</au:assertTrue> | |||
</target> | |||
</project> |