make preserveleadingslashes work for tar

git-svn-id: https://svn.apache.org/repos/asf/ant/antlibs/compress/trunk@1195847 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/changes.xml b/changes.xml
index 530aae8..10e6b63 100644
--- a/changes.xml
+++ b/changes.xml
@@ -79,5 +79,9 @@
         (like encrypted ZIP entries or sparse files in GNU tar
         archives).
       </action>
+      <action type="update">
+        The preserveLeadingSlashes attribute of the &lt;tar&gt; task
+        now works as expected.
+      </action>
     </release>
   </document>
diff --git a/src/main/org/apache/ant/compress/taskdefs/ArchiveBase.java b/src/main/org/apache/ant/compress/taskdefs/ArchiveBase.java
index ac821ab..f520295 100644
--- a/src/main/org/apache/ant/compress/taskdefs/ArchiveBase.java
+++ b/src/main/org/apache/ant/compress/taskdefs/ArchiveBase.java
@@ -238,6 +238,15 @@
     }
 
     /**
+     * Flag to indicates whether leading `/'s should
+     * be preserved in the file names.
+     * @since Apache Compress Antlib 1.1
+     */
+    public boolean getPreserveLeadingSlashes() {
+        return preserveLeadingSlashes;
+    }
+
+    /**
      * Sets behavior for when a duplicate file is about to be added -
      * one of <code>add</code>, <code>preserve</code> or <code>fail</code>.
      * Possible values are: <code>add</code> (keep both
diff --git a/src/main/org/apache/ant/compress/taskdefs/Tar.java b/src/main/org/apache/ant/compress/taskdefs/Tar.java
index 4230a91..f8d9584 100644
--- a/src/main/org/apache/ant/compress/taskdefs/Tar.java
+++ b/src/main/org/apache/ant/compress/taskdefs/Tar.java
@@ -55,10 +55,14 @@
               new ArchiveBase.EntryBuilder() {
                 public ArchiveEntry buildEntry(ArchiveBase.ResourceWithFlags r) {
                     boolean isDir = r.getResource().isDirectory();
+                    String name = r.getName();
+                    if (isDir && !name.endsWith("/")) {
+                        name += "/";
+                    } else if (!isDir && name.endsWith("/")) {
+                        name = name.substring(0, name.length() - 1);
+                    }
                     TarArchiveEntry ent =
-                        new TarArchiveEntry(r.getName(),
-                                            isDir ? TarConstants.LF_DIR
-                                            : TarConstants.LF_NORMAL);
+                        new TarArchiveEntry(name, getPreserveLeadingSlashes());
                     ent.setModTime(round(r.getResource().getLastModified(),
                                          1000));
                     ent.setSize(isDir ? 0 : r.getResource().getSize());
diff --git a/src/tests/antunit/tar-test.xml b/src/tests/antunit/tar-test.xml
index bb0f938..bbe1904 100644
--- a/src/tests/antunit/tar-test.xml
+++ b/src/tests/antunit/tar-test.xml
@@ -356,9 +356,7 @@
     </assertResourceDoesntExist>
   </target>
 
-  <!-- doesn't work because TarEntry strips leading slashes, will be
-       fixed for Apache Commons Compress 1.1 -->
-  <target name="fail-testPreserveLeadingSlashes" depends="setUp">
+  <target name="testPreserveLeadingSlashes" depends="setUp">
     <cmp:tar destfile="${dest}" preserveleadingslashes="true">
       <cmp:arfileset src="../resources/asf-logo.gif.ar"
                      fullpath="/logo.gif"