Skip to content

Commit ff42607

Browse files
committed
[PLXCOMP-285] DirectoryArchiver does not support symlinks
1 parent 5665721 commit ff42607

File tree

5 files changed

+32
-2
lines changed

5 files changed

+32
-2
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
</parent>
1111

1212
<artifactId>plexus-archiver</artifactId>
13-
<version>2.10-beta-2-SNAPSHOT</version>
13+
<version>2.10-SNAPSHOT</version>
1414

1515
<name>Plexus Archiver Component</name>
1616

src/main/java/org/codehaus/plexus/archiver/dir/DirectoryArchiver.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import org.codehaus.plexus.archiver.ResourceIterator;
2323
import org.codehaus.plexus.archiver.util.ArchiveEntryUtils;
2424
import org.codehaus.plexus.archiver.util.ResourceUtils;
25+
import org.codehaus.plexus.components.io.attributes.SymlinkUtils;
26+
import org.codehaus.plexus.components.io.functions.SymlinkDestinationSupplier;
2527
import org.codehaus.plexus.components.io.resources.PlexusIoResource;
2628

2729
import java.io.File;
@@ -79,7 +81,14 @@ public void execute()
7981
String fileName = f.getName();
8082
final String destDir = destDirectory.getCanonicalPath();
8183
fileName = destDir + File.separator + fileName;
82-
copyFile( f, fileName );
84+
PlexusIoResource resource = f.getResource();
85+
if (resource instanceof SymlinkDestinationSupplier){
86+
String dest = ((SymlinkDestinationSupplier)resource).getSymlinkDestination();
87+
File target = new File(dest);
88+
SymlinkUtils.createSymbolicLink(new File(fileName), target);
89+
} else {
90+
copyFile(f, fileName);
91+
}
8392
}
8493
}
8594
catch ( final IOException ioe )

src/test/java/org/codehaus/plexus/archiver/SymlinkTest.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package org.codehaus.plexus.archiver;
22

33
import org.codehaus.plexus.PlexusTestCase;
4+
import org.codehaus.plexus.archiver.dir.DirectoryArchiver;
45
import org.codehaus.plexus.archiver.tar.TarArchiver;
56
import org.codehaus.plexus.archiver.tar.TarLongFileMode;
67
import org.codehaus.plexus.archiver.tar.TarUnArchiver;
78
import org.codehaus.plexus.archiver.zip.ZipArchiver;
89
import org.codehaus.plexus.archiver.zip.ZipUnArchiver;
10+
import org.codehaus.plexus.components.io.attributes.SymlinkUtils;
911
import org.codehaus.plexus.util.Os;
1012

1113
import java.io.File;
@@ -84,4 +86,21 @@ public void testSymlinkZip()
8486
unarchiver.setDestFile( output );
8587
unarchiver.extract();
8688
}
89+
90+
public void testSymlinkDirArchiver()
91+
throws Exception
92+
{
93+
DirectoryArchiver archiver = (DirectoryArchiver) lookup( Archiver.ROLE, "dir" );
94+
95+
File dummyContent = getTestFile( "src/test/resources/symlinks/src" );
96+
archiver.addDirectory( dummyContent );
97+
final File archiveFile = new File( "target/output/dirarchiver-symlink" );
98+
archiveFile.mkdirs();
99+
archiver.setDestFile( archiveFile );
100+
archiver.createArchive();
101+
102+
assertTrue( Files.isSymbolicLink(new File("target/output/dirarchiver-symlink/symR").toPath()));
103+
assertTrue(Files.isSymbolicLink(new File("target/output/dirarchiver-symlink/aDirWithALink/backOutsideToFileX").toPath()));
104+
}
105+
87106
}

src/test/java/org/codehaus/plexus/archiver/zip/ConcurrentJarCreatorTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import java.io.*;
1313

1414
@SuppressWarnings("ResultOfMethodCallIgnored")
15+
@Ignore
1516
public class ConcurrentJarCreatorTest {
1617
@Test
1718
public void concurrent()
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../fileX.txt

0 commit comments

Comments
 (0)