You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by bo...@apache.org on 2009/03/17 13:59:48 UTC

svn commit: r755231 - /ant/core/trunk/src/main/org/apache/tools/tar/TarEntry.java

Author: bodewig
Date: Tue Mar 17 12:59:48 2009
New Revision: 755231

URL: http://svn.apache.org/viewvc?rev=755231&view=rev
Log:
deal with file system roots being added - was leading to IndexOutOfBoundsExceptions in File-arg constructor

Modified:
    ant/core/trunk/src/main/org/apache/tools/tar/TarEntry.java   (contents, props changed)

Modified: ant/core/trunk/src/main/org/apache/tools/tar/TarEntry.java
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/tar/TarEntry.java?rev=755231&r1=755230&r2=755231&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/tar/TarEntry.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/tar/TarEntry.java Tue Mar 17 12:59:48 2009
@@ -161,6 +161,7 @@
     public TarEntry(String name) {
         this();
 
+        name = normalizeFileName(name);
         boolean isDir = name.endsWith("/");
 
         this.devMajor = 0;
@@ -202,42 +203,7 @@
 
         this.file = file;
 
-        String fileName = file.getPath();
-        String osname = System.getProperty("os.name").toLowerCase(Locale.US);
-
-        if (osname != null) {
-
-            // Strip off drive letters!
-            // REVIEW Would a better check be "(File.separator == '\')"?
-
-            if (osname.startsWith("windows")) {
-                if (fileName.length() > 2) {
-                    char ch1 = fileName.charAt(0);
-                    char ch2 = fileName.charAt(1);
-
-                    if (ch2 == ':'
-                            && ((ch1 >= 'a' && ch1 <= 'z')
-                                || (ch1 >= 'A' && ch1 <= 'Z'))) {
-                        fileName = fileName.substring(2);
-                    }
-                }
-            } else if (osname.indexOf("netware") > -1) {
-                int colon = fileName.indexOf(':');
-                if (colon != -1) {
-                    fileName = fileName.substring(colon + 1);
-                }
-            }
-        }
-
-        fileName = fileName.replace(File.separatorChar, '/');
-
-        // No absolute pathnames
-        // Windows (and Posix?) paths can start with "\\NetworkDrive\",
-        // so we loop on starting /'s.
-        while (fileName.startsWith("/")) {
-            fileName = fileName.substring(1);
-        }
-
+        String fileName = normalizeFileName(file.getPath());
         this.linkName = new StringBuffer("");
         this.name = new StringBuffer(fileName);
 
@@ -245,7 +211,8 @@
             this.mode = DEFAULT_DIR_MODE;
             this.linkFlag = LF_DIR;
 
-            if (this.name.charAt(this.name.length() - 1) != '/') {
+            int nameLength = name.length();
+            if (nameLength == 0 || name.charAt(nameLength - 1) != '/') {
                 this.name.append("/");
             }
         } else {
@@ -331,7 +298,7 @@
      * @param name This entry's new name.
      */
     public void setName(String name) {
-        this.name = new StringBuffer(name);
+        this.name = new StringBuffer(normalizeFileName(name));
     }
 
     /**
@@ -635,4 +602,46 @@
         offset += DEVLEN;
         devMinor = (int) TarUtils.parseOctal(header, offset, DEVLEN);
     }
+
+    /**
+     * Strips Windows' drive letter as well as any leading slashes,
+     * turns path separators into forward slahes.
+     */
+    private static String normalizeFileName(String fileName) {
+        String osname = System.getProperty("os.name").toLowerCase(Locale.US);
+
+        if (osname != null) {
+
+            // Strip off drive letters!
+            // REVIEW Would a better check be "(File.separator == '\')"?
+
+            if (osname.startsWith("windows")) {
+                if (fileName.length() > 2) {
+                    char ch1 = fileName.charAt(0);
+                    char ch2 = fileName.charAt(1);
+
+                    if (ch2 == ':'
+                        && ((ch1 >= 'a' && ch1 <= 'z')
+                            || (ch1 >= 'A' && ch1 <= 'Z'))) {
+                        fileName = fileName.substring(2);
+                    }
+                }
+            } else if (osname.indexOf("netware") > -1) {
+                int colon = fileName.indexOf(':');
+                if (colon != -1) {
+                    fileName = fileName.substring(colon + 1);
+                }
+            }
+        }
+
+        fileName = fileName.replace(File.separatorChar, '/');
+
+        // No absolute pathnames
+        // Windows (and Posix?) paths can start with "\\NetworkDrive\",
+        // so we loop on starting /'s.
+        while (fileName.startsWith("/")) {
+            fileName = fileName.substring(1);
+        }
+        return fileName;
+    }
 }

Propchange: ant/core/trunk/src/main/org/apache/tools/tar/TarEntry.java
------------------------------------------------------------------------------
--- svn:mergeinfo (added)
+++ svn:mergeinfo Tue Mar 17 12:59:48 2009
@@ -0,0 +1 @@
+/commons/sandbox/compress/trunk/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveEntry.java:755227