git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@807513 13f79535-47bb-0310-9956-ffa450edef68master
@@ -361,6 +361,8 @@ public class Tar extends MatchingTask { | |||||
return; | return; | ||||
} | } | ||||
boolean preserveLeadingSlashes = false; | |||||
if (tarFileSet != null) { | if (tarFileSet != null) { | ||||
String fullpath = tarFileSet.getFullpath(this.getProject()); | String fullpath = tarFileSet.getFullpath(this.getProject()); | ||||
if (fullpath.length() > 0) { | if (fullpath.length() > 0) { | ||||
@@ -379,8 +381,9 @@ public class Tar extends MatchingTask { | |||||
vPath = prefix + vPath; | vPath = prefix + vPath; | ||||
} | } | ||||
if (vPath.startsWith("/") | |||||
&& !tarFileSet.getPreserveLeadingSlashes()) { | |||||
preserveLeadingSlashes = tarFileSet.getPreserveLeadingSlashes(); | |||||
if (vPath.startsWith("/") && !preserveLeadingSlashes) { | |||||
int l = vPath.length(); | int l = vPath.length(); | ||||
if (l <= 1) { | if (l <= 1) { | ||||
// we would end up adding "" to the archive | // we would end up adding "" to the archive | ||||
@@ -415,7 +418,7 @@ public class Tar extends MatchingTask { | |||||
} | } | ||||
} | } | ||||
TarEntry te = new TarEntry(vPath); | |||||
TarEntry te = new TarEntry(vPath, preserveLeadingSlashes); | |||||
te.setModTime(r.getLastModified()); | te.setModTime(r.getLastModified()); | ||||
// preserve permissions | // preserve permissions | ||||
if (r instanceof ArchiveResource) { | if (r instanceof ArchiveResource) { | ||||
@@ -159,9 +159,21 @@ public class TarEntry implements TarConstants { | |||||
* @param name the entry name | * @param name the entry name | ||||
*/ | */ | ||||
public TarEntry(String name) { | public TarEntry(String name) { | ||||
this(name, false); | |||||
} | |||||
/** | |||||
* Construct an entry with only a name. This allows the programmer | |||||
* to construct the entry's header "by hand". File is set to null. | |||||
* | |||||
* @param name the entry name | |||||
* @param preserveLeadingSlashes whether to allow leading slashes | |||||
* in the name. | |||||
*/ | |||||
public TarEntry(String name, boolean preserveLeadingSlashes) { | |||||
this(); | this(); | ||||
name = normalizeFileName(name); | |||||
name = normalizeFileName(name, preserveLeadingSlashes); | |||||
boolean isDir = name.endsWith("/"); | boolean isDir = name.endsWith("/"); | ||||
this.devMajor = 0; | this.devMajor = 0; | ||||
@@ -203,7 +215,7 @@ public class TarEntry implements TarConstants { | |||||
this.file = file; | this.file = file; | ||||
String fileName = normalizeFileName(file.getPath()); | |||||
String fileName = normalizeFileName(file.getPath(), false); | |||||
this.linkName = new StringBuffer(""); | this.linkName = new StringBuffer(""); | ||||
this.name = new StringBuffer(fileName); | this.name = new StringBuffer(fileName); | ||||
@@ -299,7 +311,7 @@ public class TarEntry implements TarConstants { | |||||
* @param name This entry's new name. | * @param name This entry's new name. | ||||
*/ | */ | ||||
public void setName(String name) { | public void setName(String name) { | ||||
this.name = new StringBuffer(normalizeFileName(name)); | |||||
this.name = new StringBuffer(normalizeFileName(name, false)); | |||||
} | } | ||||
/** | /** | ||||
@@ -608,7 +620,8 @@ public class TarEntry implements TarConstants { | |||||
* Strips Windows' drive letter as well as any leading slashes, | * Strips Windows' drive letter as well as any leading slashes, | ||||
* turns path separators into forward slahes. | * turns path separators into forward slahes. | ||||
*/ | */ | ||||
private static String normalizeFileName(String fileName) { | |||||
private static String normalizeFileName(String fileName, | |||||
boolean preserveLeadingSlashes) { | |||||
String osname = System.getProperty("os.name").toLowerCase(Locale.US); | String osname = System.getProperty("os.name").toLowerCase(Locale.US); | ||||
if (osname != null) { | if (osname != null) { | ||||
@@ -640,7 +653,7 @@ public class TarEntry implements TarConstants { | |||||
// No absolute pathnames | // No absolute pathnames | ||||
// Windows (and Posix?) paths can start with "\\NetworkDrive\", | // Windows (and Posix?) paths can start with "\\NetworkDrive\", | ||||
// so we loop on starting /'s. | // so we loop on starting /'s. | ||||
while (fileName.startsWith("/")) { | |||||
while (!preserveLeadingSlashes && fileName.startsWith("/")) { | |||||
fileName = fileName.substring(1); | fileName = fileName.substring(1); | ||||
} | } | ||||
return fileName; | return fileName; | ||||
@@ -17,6 +17,7 @@ | |||||
--> | --> | ||||
<project name="tar-test" default="antunit" | <project name="tar-test" default="antunit" | ||||
xmlns:cond="antlib:org.apache.tools.ant.types.conditions" | |||||
xmlns:au="antlib:org.apache.ant.antunit"> | xmlns:au="antlib:org.apache.ant.antunit"> | ||||
<import file="../antunit-base.xml" /> | <import file="../antunit-base.xml" /> | ||||
@@ -30,4 +31,45 @@ | |||||
<tarfileset prefix="pre" refid="xml.fileset" /> | <tarfileset prefix="pre" refid="xml.fileset" /> | ||||
</tar> | </tar> | ||||
</target> | </target> | ||||
<target name="testRemoveLeadingSlashes" depends="setUp"> | |||||
<tar destfile="${output}/testtar.tar"> | |||||
<tarfileset file="${ant.file}" fullpath="/foo.xml"/> | |||||
</tar> | |||||
<au:assertTrue> | |||||
<cond:resourceexists> | |||||
<tarentry name="foo.xml"> | |||||
<file file="${output}/testtar.tar"/> | |||||
</tarentry> | |||||
</cond:resourceexists> | |||||
</au:assertTrue> | |||||
<au:assertFalse> | |||||
<cond:resourceexists> | |||||
<tarentry name="/foo.xml"> | |||||
<file file="${output}/testtar.tar"/> | |||||
</tarentry> | |||||
</cond:resourceexists> | |||||
</au:assertFalse> | |||||
</target> | |||||
<target name="testPreserveLeadingSlashes" depends="setUp"> | |||||
<tar destfile="${output}/testtar.tar"> | |||||
<tarfileset file="${ant.file}" fullpath="/foo.xml" | |||||
preserveleadingslashes="true"/> | |||||
</tar> | |||||
<au:assertTrue> | |||||
<cond:resourceexists> | |||||
<tarentry name="/foo.xml"> | |||||
<file file="${output}/testtar.tar"/> | |||||
</tarentry> | |||||
</cond:resourceexists> | |||||
</au:assertTrue> | |||||
<au:assertFalse> | |||||
<cond:resourceexists> | |||||
<tarentry name="foo.xml"> | |||||
<file file="${output}/testtar.tar"/> | |||||
</tarentry> | |||||
</cond:resourceexists> | |||||
</au:assertFalse> | |||||
</target> | |||||
</project> | </project> |