You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by jd...@apache.org on 2011/02/23 23:05:06 UTC

svn commit: r1073964 - in /maven/plugins/trunk/maven-assembly-plugin/src: main/java/org/apache/maven/plugin/assembly/archive/task/ main/java/org/apache/maven/plugin/assembly/utils/ test/java/org/apache/maven/plugin/assembly/utils/

Author: jdcasey
Date: Wed Feb 23 22:05:06 2011
New Revision: 1073964

URL: http://svn.apache.org/viewvc?rev=1073964&view=rev
Log:
[MASSEMBLY-510] Fix logic to eliminate relative dir refs like . and ..

Modified:
    maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/archive/task/AddDirectoryTask.java
    maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/utils/AssemblyFormatUtils.java
    maven/plugins/trunk/maven-assembly-plugin/src/test/java/org/apache/maven/plugin/assembly/utils/AssemblyFormatUtilsTest.java

Modified: maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/archive/task/AddDirectoryTask.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/archive/task/AddDirectoryTask.java?rev=1073964&r1=1073963&r2=1073964&view=diff
==============================================================================
--- maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/archive/task/AddDirectoryTask.java (original)
+++ maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/archive/task/AddDirectoryTask.java Wed Feb 23 22:05:06 2011
@@ -21,6 +21,7 @@ package org.apache.maven.plugin.assembly
 
 import org.apache.maven.plugin.assembly.AssemblerConfigurationSource;
 import org.apache.maven.plugin.assembly.archive.ArchiveCreationException;
+import org.apache.maven.plugin.assembly.utils.AssemblyFormatUtils;
 import org.codehaus.plexus.archiver.Archiver;
 import org.codehaus.plexus.archiver.ArchiverException;
 import org.codehaus.plexus.archiver.util.DefaultFileSet;
@@ -111,11 +112,13 @@ public class AddDirectoryTask
                         int i = 0;
                         for ( final Iterator<String> it = includes.iterator(); it.hasNext(); )
                         {
-                            String value = it.next();
-                            if ( value.startsWith( "./" ) || value.startsWith( ".\\" ) )
-                            {
-                                value = value.substring( 2 );
-                            }
+//                          String value = it.next();
+                            String value = AssemblyFormatUtils.fixRelativeRefs( it.next() );
+                            
+//                            if ( value.startsWith( "./" ) || value.startsWith( ".\\" ) )
+//                            {
+//                                value = value.substring( 2 );
+//                            }
 
                             if ( value.startsWith( "/" ) || value.startsWith( "\\" ) )
                             {
@@ -134,11 +137,13 @@ public class AddDirectoryTask
                     int i = 0;
                     for ( final Iterator<String> it = directoryExcludes.iterator(); it.hasNext(); )
                     {
-                        String value = it.next();
-                        if ( value.startsWith( "./" ) || value.startsWith( ".\\" ) )
-                        {
-                            value = value.substring( 2 );
-                        }
+//                        String value = it.next();
+                        String value = AssemblyFormatUtils.fixRelativeRefs( it.next() );
+                        
+//                        if ( value.startsWith( "./" ) || value.startsWith( ".\\" ) )
+//                        {
+//                            value = value.substring( 2 );
+//                        }
 
                         if ( value.startsWith( "/" ) || value.startsWith( "\\" ) )
                         {

Modified: maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/utils/AssemblyFormatUtils.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/utils/AssemblyFormatUtils.java?rev=1073964&r1=1073963&r2=1073964&view=diff
==============================================================================
--- maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/utils/AssemblyFormatUtils.java (original)
+++ maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/utils/AssemblyFormatUtils.java Wed Feb 23 22:05:06 2011
@@ -33,7 +33,11 @@ import org.codehaus.plexus.interpolation
 import org.codehaus.plexus.util.StringUtils;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
+import java.util.List;
+import java.util.ListIterator;
 import java.util.Properties;
 
 /**
@@ -260,8 +264,7 @@ public final class AssemblyFormatUtils
 
         value = StringUtils.replace( value, "//", "/" );
         value = StringUtils.replace( value, "\\\\", "\\" );
-        value = StringUtils.replace( value, "./", "" );
-        value = StringUtils.replace( value, ".\\", "" );
+        value = fixRelativeRefs( value );
 
         return value;
     }
@@ -478,10 +481,59 @@ public final class AssemblyFormatUtils
 
         value = StringUtils.replace( value, "//", "/" );
         value = StringUtils.replace( value, "\\\\", "\\" );
-        value = StringUtils.replace( value, "./", "" );
-        value = StringUtils.replace( value, ".\\", "" );
+        value = fixRelativeRefs( value );
 
         return value;
     }
 
+    public static String fixRelativeRefs( String src )
+    {
+        String value = src;
+        
+        String[] separators = {
+            "/", "\\"
+        };
+        
+        String finalSep = null;
+        for ( String sep : separators )
+        {
+            if ( value.endsWith( sep ) )
+            {
+                finalSep = sep;
+            }
+            
+            if ( value.indexOf( "." + sep ) > -1 )
+            {
+                List<String> parts = new ArrayList<String>();
+                parts.addAll( Arrays.asList( value.split( sep ) ) );
+                
+                for ( ListIterator<String> it = parts.listIterator(); it.hasNext(); )
+                {
+                    String part = it.next();
+                    if ( ".".equals( part ) )
+                    {
+                        it.remove();
+                    }
+                    else if ( "..".equals( part ) )
+                    {
+                        it.remove();
+                        if ( it.hasPrevious() )
+                        {
+                            it.previous();
+                            it.remove();
+                        }
+                    }
+                }
+                
+                value = StringUtils.join( parts.iterator(), sep );
+            }
+        }
+        
+        if ( finalSep != null && value.length() > 0 && !value.endsWith( finalSep ) )
+        {
+            value += finalSep;
+        }
+        
+        return value;
+    }
 }

Modified: maven/plugins/trunk/maven-assembly-plugin/src/test/java/org/apache/maven/plugin/assembly/utils/AssemblyFormatUtilsTest.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-assembly-plugin/src/test/java/org/apache/maven/plugin/assembly/utils/AssemblyFormatUtilsTest.java?rev=1073964&r1=1073963&r2=1073964&view=diff
==============================================================================
--- maven/plugins/trunk/maven-assembly-plugin/src/test/java/org/apache/maven/plugin/assembly/utils/AssemblyFormatUtilsTest.java (original)
+++ maven/plugins/trunk/maven-assembly-plugin/src/test/java/org/apache/maven/plugin/assembly/utils/AssemblyFormatUtilsTest.java Wed Feb 23 22:05:06 2011
@@ -41,6 +41,30 @@ public class AssemblyFormatUtilsTest
 
     private final MockManager mockManager = new MockManager();
 
+    public void testFixRelativePathRefs_ShouldRemoveRelativeRefToCurrentDir()
+        throws AssemblyFormattingException
+    {
+        assertEquals( "path/", AssemblyFormatUtils.fixRelativeRefs( "./path/" ) );
+    }
+
+    public void testFixRelativePathRefs_ShouldRemoveEmbeddedSameDirRef()
+        throws AssemblyFormattingException
+    {
+        assertEquals( "some/path/", AssemblyFormatUtils.fixRelativeRefs( "some/./path/" ) );
+    }
+
+    public void testFixRelativePathRefs_ShouldRemoveEmbeddedParentDirRef()
+        throws AssemblyFormattingException
+    {
+        assertEquals( "path/", AssemblyFormatUtils.fixRelativeRefs( "some/../path/" ) );
+    }
+
+    public void testFixRelativePathRefs_ShouldTruncateRelativeRefToParentDir()
+        throws AssemblyFormattingException
+    {
+        assertEquals( "path/", AssemblyFormatUtils.fixRelativeRefs( "../path/" ) );
+    }
+
     public void testGetDistroName_ShouldUseJustFinalNameWithNoAppendAssemblyIdOrClassifier()
     {
         verifyDistroName( "assembly", null, "finalName", false, "finalName" );
@@ -212,6 +236,30 @@ public class AssemblyFormatUtilsTest
     {
         verifyOutputDir( null, null, null, "" );
     }
+    
+    public void testGetOutputDir_ShouldRemoveRelativeRefToCurrentDir()
+        throws AssemblyFormattingException
+    {
+        verifyOutputDir( "./path/", null, null, "path/" );
+    }
+
+    public void testGetOutputDir_ShouldRemoveEmbeddedSameDirRef()
+        throws AssemblyFormattingException
+    {
+        verifyOutputDir( "some/./path/", null, null, "some/path/" );
+    }
+
+    public void testGetOutputDir_ShouldRemoveEmbeddedParentDirRef()
+        throws AssemblyFormattingException
+    {
+        verifyOutputDir( "some/../path/", null, null, "path/" );
+    }
+
+    public void testGetOutputDir_ShouldTruncateRelativeRefToParentDir()
+        throws AssemblyFormattingException
+    {
+        verifyOutputDir( "../path/", null, null, "path/" );
+    }
 
     public void testGetOutputDir_ShouldResolveProjectProperty()
         throws AssemblyFormattingException
@@ -357,6 +405,34 @@ public class AssemblyFormatUtilsTest
                                                    null );
     }
 
+    public void testEvalFileNameMapping_ShouldRemoveRelativeRefToCurrentDir()
+        throws AssemblyFormattingException
+    {
+        verifyEvalFileNameMappingUsingMainProject( "./path/", null, null, null, null, null, "path/",
+                                                   null );
+    }
+
+    public void testEvalFileNameMapping_ShouldRemoveEmbeddedSameDirRef()
+        throws AssemblyFormattingException
+    {
+        verifyEvalFileNameMappingUsingMainProject( "some/./path/", null, null, null, null, null, "some/path/",
+                                                   null );
+    }
+
+    public void testEvalFileNameMapping_ShouldRemoveEmbeddedParentDirRef()
+        throws AssemblyFormattingException
+    {
+        verifyEvalFileNameMappingUsingMainProject( "some/../path/", null, null, null, null, null, "path/",
+                                                   null );
+    }
+
+    public void testEvalFileNameMapping_ShouldTruncateRelativeRefToParentDir()
+        throws AssemblyFormattingException
+    {
+        verifyEvalFileNameMappingUsingMainProject( "../path/", null, null, null, null, null, "path/",
+                                                   null );
+    }
+
     public void testEvalFileNameMapping_ShouldPassExpressionThroughUnchanged()
         throws AssemblyFormattingException
     {