This is an automated email from the ASF dual-hosted git repository. bodewig pushed a commit to branch 1.9.x in repository https://gitbox.apache.org/repos/asf/ant.git
The following commit(s) were added to refs/heads/1.9.x by this push: new 0f110ea Merge branch 'feature/tarfileset-preserve-symlinks' of https://github.com/mstrap/ant into mstrap-feature/tarfileset-preserve-symlinks 0f110ea is described below commit 0f110eac27c17cf3bdbcfee77bc5b9b4aead9f4e Author: Stefan Bodewig <bode...@apache.org> AuthorDate: Sat Sep 25 12:45:23 2021 +0200 Merge branch 'feature/tarfileset-preserve-symlinks' of https://github.com/mstrap/ant into mstrap-feature/tarfileset-preserve-symlinks --- WHATSNEW | 6 +++++ src/etc/testcases/taskdefs/tar.xml | 8 +++++++ src/etc/testcases/testtarwithsymlinks.tar.gz | Bin 0 -> 199 bytes src/main/org/apache/tools/ant/taskdefs/Tar.java | 24 +++++++++++++++----- .../tools/ant/types/resources/TarResource.java | 21 +++++++++++++++++ src/main/org/apache/tools/tar/TarEntry.java | 20 +++++++++++++++++ .../org/apache/tools/ant/taskdefs/TarTest.java | 25 +++++++++++++++++++++ 7 files changed, 98 insertions(+), 6 deletions(-) diff --git a/WHATSNEW b/WHATSNEW index f3f9ddf..7ad9c45 100644 --- a/WHATSNEW +++ b/WHATSNEW @@ -9,6 +9,12 @@ Fixed bugs: the shorter alias names. Bugzilla Report 65539 +Other changes: +-------------- + + * The tar task now preserves symlinks of nested tarfilesets. + Github Pull Request #142 + Changes from Ant 1.9.15 TO Ant 1.9.16 ===================================== diff --git a/src/etc/testcases/taskdefs/tar.xml b/src/etc/testcases/taskdefs/tar.xml index 2eda0b5..e76b7ad 100644 --- a/src/etc/testcases/taskdefs/tar.xml +++ b/src/etc/testcases/taskdefs/tar.xml @@ -197,4 +197,12 @@ <untar src="${output}/testout/test.tar" dest="${output}/untar"/> </target> + <target name="testTarFilesetWithSymlinks"> + <gunzip src="../testtarwithsymlinks.tar.gz" dest="${output}/source.tar"/> + <tar destfile="${output}/result.tar"> + <tarfileset prefix="pre" src="${output}/source.tar"/> + </tar> + <echo message="asd ${output}"/> + </target> + </project> diff --git a/src/etc/testcases/testtarwithsymlinks.tar.gz b/src/etc/testcases/testtarwithsymlinks.tar.gz new file mode 100644 index 0000000..782a237 Binary files /dev/null and b/src/etc/testcases/testtarwithsymlinks.tar.gz differ diff --git a/src/main/org/apache/tools/ant/taskdefs/Tar.java b/src/main/org/apache/tools/ant/taskdefs/Tar.java index 0d319d1..1ab2d33 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Tar.java +++ b/src/main/org/apache/tools/ant/taskdefs/Tar.java @@ -412,12 +412,7 @@ public class Tar extends MatchingTask { return; } - String prefix = tarFileSet.getPrefix(this.getProject()); - // '/' is appended for compatibility with the zip task. - if (prefix.length() > 0 && !prefix.endsWith("/")) { - prefix = prefix + "/"; - } - vPath = prefix + vPath; + vPath = getCanonicalPrefix(tarFileSet, this.getProject()) + vPath; } preserveLeadingSlashes = tarFileSet.getPreserveLeadingSlashes(); @@ -469,6 +464,14 @@ public class Tar extends MatchingTask { te.setUserId(tr.getUid()); te.setGroupName(tr.getGroup()); te.setGroupId(tr.getGid()); + String linkName = tr.getLinkName(); + byte linkFlag = tr.getLinkFlag(); + if (linkFlag == TarConstants.LF_LINK && + linkName != null && linkName.length() > 0 && !linkName.startsWith("/")) { + linkName = getCanonicalPrefix(tarFileSet, this.getProject()) + linkName; + } + te.setLinkName(linkName); + te.setLinkFlag(linkFlag); } } @@ -799,6 +802,15 @@ public class Tar extends MatchingTask { return tfs; } + private static String getCanonicalPrefix(TarFileSet tarFileSet, Project project) { + String prefix = tarFileSet.getPrefix(project); + // '/' is appended for compatibility with the zip task. + if (prefix.isEmpty() || prefix.endsWith("/")) { + return prefix; + } + return prefix += "/"; + } + /** * This is a FileSet with the option to specify permissions * and other attributes. diff --git a/src/main/org/apache/tools/ant/types/resources/TarResource.java b/src/main/org/apache/tools/ant/types/resources/TarResource.java index b906a65..3011406 100644 --- a/src/main/org/apache/tools/ant/types/resources/TarResource.java +++ b/src/main/org/apache/tools/ant/types/resources/TarResource.java @@ -26,6 +26,7 @@ import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; import org.apache.tools.ant.types.Resource; import org.apache.tools.ant.util.FileUtils; +import org.apache.tools.tar.TarConstants; import org.apache.tools.tar.TarEntry; import org.apache.tools.tar.TarInputStream; @@ -39,6 +40,8 @@ public class TarResource extends ArchiveResource { private String groupName = ""; private int uid; private int gid; + private byte linkFlag = TarConstants.LF_NORMAL; + private String linkName = ""; /** * Default constructor. @@ -153,6 +156,22 @@ public class TarResource extends ArchiveResource { } /** + * @return the link "name" (=path) of this entry; an empty string if this is no link + * @since 1.9.17 + */ + public String getLinkName() { + return linkName; + } + + /** + * @return the link "flag" (=type) of this entry + * @since 1.9.17 + */ + public byte getLinkFlag() { + return linkFlag; + } + + /** * fetches information from the named entry inside the archive. */ protected void fetchEntry() { @@ -191,6 +210,8 @@ public class TarResource extends ArchiveResource { groupName = e.getGroupName(); uid = e.getUserId(); gid = e.getGroupId(); + linkName = e.getLinkName(); + linkFlag = e.getLinkFlag(); } } diff --git a/src/main/org/apache/tools/tar/TarEntry.java b/src/main/org/apache/tools/tar/TarEntry.java index afdd951..af0db02 100644 --- a/src/main/org/apache/tools/tar/TarEntry.java +++ b/src/main/org/apache/tools/tar/TarEntry.java @@ -399,6 +399,26 @@ public class TarEntry implements TarConstants { } /** + * Get this entry's link flag. + * + * @return This entry's link flag. + * @since 1.9.17 + */ + public byte getLinkFlag() { + return linkFlag; + } + + /** + * Set this entry's link flag. + * + * @param link the link flag to use. + * @since 1.9.17 + */ + public void setLinkFlag(byte linkFlag) { + this.linkFlag = linkFlag; + } + + /** * Get this entry's link name. * * @return This entry's link name. diff --git a/src/tests/junit/org/apache/tools/ant/taskdefs/TarTest.java b/src/tests/junit/org/apache/tools/ant/taskdefs/TarTest.java index 9650dfc..f747c42 100644 --- a/src/tests/junit/org/apache/tools/ant/taskdefs/TarTest.java +++ b/src/tests/junit/org/apache/tools/ant/taskdefs/TarTest.java @@ -20,16 +20,20 @@ package org.apache.tools.ant.taskdefs; import java.io.IOException; import java.io.File; +import java.io.FileInputStream; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.BuildFileRule; import org.apache.tools.ant.FileUtilities; +import org.apache.tools.tar.TarEntry; +import org.apache.tools.tar.TarInputStream; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; +import static org.junit.Assert.assertNull; public class TarTest { @@ -206,5 +210,26 @@ public class TarTest { FileUtilities.getFileContents(new File(buildRule.getProject().getProperty("output"), "untar/asf-logo.gif.gz"))); } + @Test + public void testTarFilesetWithSymlinks() throws IOException { + buildRule.executeTarget("testTarFilesetWithSymlinks"); + final File f = new File(buildRule.getProject().getProperty("output"), "result.tar"); + final TarInputStream tis = new TarInputStream(new FileInputStream(f)); + try { + final TarEntry e1 = tis.getNextEntry(); + assertEquals("pre/dir/file", e1.getName()); + assertEquals("", e1.getLinkName()); + assertEquals(48, e1.getLinkFlag()); + + final TarEntry e2 = tis.getNextEntry(); + assertEquals("pre/sub/file", e2.getName()); + assertEquals("../dir/file", e2.getLinkName()); + assertEquals(50, e2.getLinkFlag()); + assertNull(tis.getNextEntry()); + } + finally { + tis.close(); + } + } }