Skip to content

Commit e5b8ffa

Browse files
committed
[PLXCOMP-262] Directory symlinks in zip are incorrect
1 parent f84f278 commit e5b8ffa

File tree

3 files changed

+56
-10
lines changed

3 files changed

+56
-10
lines changed

src/main/java/org/codehaus/plexus/archiver/zip/AbstractZipArchiver.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import org.codehaus.plexus.components.io.resources.PlexusIoSymlink;
3838
import org.codehaus.plexus.util.FileUtils;
3939
import org.codehaus.plexus.util.IOUtil;
40+
import org.codehaus.plexus.util.StringUtils;
4041

4142
import static org.codehaus.plexus.archiver.util.Streams.bufferedOutputStream;
4243
import static org.codehaus.plexus.archiver.util.Streams.fileOutputStream;
@@ -641,6 +642,13 @@ protected void zipDir( PlexusIoResource dir, ZipArchiveOutputStream zOut, String
641642

642643
if ( !skipWriting )
643644
{
645+
final boolean isSymlink = dir instanceof PlexusIoSymlink;
646+
647+
if (isSymlink && vPath.endsWith(File.separator))
648+
{
649+
vPath= vPath.substring(0, vPath.length() -1);
650+
}
651+
644652
ZipArchiveEntry ze = new ZipArchiveEntry( vPath );
645653

646654
/*
@@ -652,7 +660,6 @@ protected void zipDir( PlexusIoResource dir, ZipArchiveOutputStream zOut, String
652660
*/
653661

654662

655-
final boolean isSymlink = dir instanceof PlexusIoSymlink;
656663
if (isSymlink) mode = UnixStat.LINK_FLAG | mode;
657664

658665

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

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,22 +24,32 @@
2424
* SOFTWARE.
2525
*/
2626

27-
import org.apache.commons.compress.archivers.zip.*;
27+
import org.apache.commons.compress.archivers.zip.ExtraFieldUtils;
28+
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
29+
import org.apache.commons.compress.archivers.zip.ZipExtraField;
2830
import org.codehaus.plexus.archiver.Archiver;
2931
import org.codehaus.plexus.archiver.ArchiverException;
3032
import org.codehaus.plexus.archiver.BasePlexusArchiverTest;
33+
import org.codehaus.plexus.archiver.UnArchiver;
3134
import org.codehaus.plexus.archiver.UnixStat;
3235
import org.codehaus.plexus.archiver.util.ArchiveEntryUtils;
3336
import org.codehaus.plexus.archiver.util.Streams;
37+
import org.codehaus.plexus.components.io.attributes.Java7FileAttributes;
3438
import org.codehaus.plexus.components.io.attributes.PlexusIoResourceAttributeUtils;
3539
import org.codehaus.plexus.components.io.attributes.PlexusIoResourceAttributes;
40+
import org.codehaus.plexus.components.io.resources.PlexusIoFileResourceCollection;
3641
import org.codehaus.plexus.logging.Logger;
3742
import org.codehaus.plexus.logging.console.ConsoleLogger;
3843
import org.codehaus.plexus.util.FileUtils;
3944
import org.codehaus.plexus.util.IOUtil;
4045
import org.codehaus.plexus.util.Os;
4146

42-
import java.io.*;
47+
import java.io.ByteArrayInputStream;
48+
import java.io.ByteArrayOutputStream;
49+
import java.io.File;
50+
import java.io.FileWriter;
51+
import java.io.IOException;
52+
import java.io.InputStream;
4353
import java.util.Arrays;
4454
import java.util.Date;
4555
import java.util.Enumeration;
@@ -222,10 +232,16 @@ private ZipArchiver getZipArchiver()
222232
private ZipArchiver getZipArchiver(File destFile)
223233
{
224234
final ZipArchiver zipArchiver = getZipArchiver();
225-
zipArchiver.setDestFile( destFile );
235+
zipArchiver.setDestFile( destFile );
226236
return zipArchiver;
227237
}
228238

239+
private ZipUnArchiver getZipUnArchiver(File testJar) throws Exception {
240+
ZipUnArchiver zu = (ZipUnArchiver) lookup( UnArchiver.ROLE, "zip" );
241+
zu.setSourceFile( testJar );
242+
return zu;
243+
}
244+
229245
private void writeFile( File dir, String fname, int mode )
230246
throws IOException, ArchiverException
231247
{
@@ -326,6 +342,26 @@ else if ( ze.getName().equals( "two.txt" ) )
326342
}
327343
}
328344

345+
public void testSymlinkZip() throws Exception {
346+
final File zipFile = getTestFile("target/output/pasymlinks.zip");
347+
final ZipArchiver zipArchiver = getZipArchiver(zipFile);
348+
PlexusIoFileResourceCollection files = new PlexusIoFileResourceCollection();
349+
files.setFollowingSymLinks( false );
350+
files.setBaseDir( new File( "src/test/resources/symlinks" ) );
351+
files.setPrefix( "plexus/" );
352+
zipArchiver.addResources( files );
353+
zipArchiver.createArchive();
354+
final File output = getTestFile("target/output/unzipped");
355+
output.mkdirs();
356+
final ZipUnArchiver zipUnArchiver = getZipUnArchiver(zipFile);
357+
zipUnArchiver.setDestFile( output );
358+
zipUnArchiver.extract();
359+
File symDir = new File("target/output/unzipped/plexus/src/symDir");
360+
PlexusIoResourceAttributes fa= Java7FileAttributes.uncached(symDir);
361+
assertTrue( fa.isSymbolicLink() );
362+
}
363+
364+
329365
public void testForced()
330366
throws Exception
331367
{

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

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,7 @@ public void testExtractingZipPreservesExecutableFlag()
2525

2626
FileUtils.deleteDirectory( outputDirectory );
2727

28-
ZipUnArchiver zu = (ZipUnArchiver) lookup( UnArchiver.ROLE, "zip" );
29-
zu.setSourceFile( testZip );
28+
ZipUnArchiver zu = getZipUnArchiver(testZip);
3029
zu.extract( "", outputDirectory );
3130
File testScript = new File( outputDirectory, "test.sh" );
3231

@@ -52,8 +51,7 @@ public void testZeroFileModeInZip()
5251

5352
FileUtils.deleteDirectory( outputDirectory );
5453

55-
ZipUnArchiver zu = (ZipUnArchiver) lookup( UnArchiver.ROLE, "zip" );
56-
zu.setSourceFile( testZip );
54+
ZipUnArchiver zu = getZipUnArchiver(testZip);
5755
zu.setIgnorePermissions( false );
5856
zu.extract( "", outputDirectory );
5957

@@ -80,8 +78,7 @@ private void runUnarchiver( String path, FileSelector[] selectors, boolean[] res
8078

8179
File outputDirectory = new File( getBasedir(), s );
8280

83-
ZipUnArchiver zu = (ZipUnArchiver) lookup( UnArchiver.ROLE, "zip" );
84-
zu.setSourceFile( testJar );
81+
ZipUnArchiver zu = getZipUnArchiver(testJar);
8582
zu.setFileSelectors( selectors );
8683

8784
FileUtils.deleteDirectory( outputDirectory );
@@ -101,6 +98,12 @@ private void runUnarchiver( String path, FileSelector[] selectors, boolean[] res
10198
assertEquals( results[2], f2.exists() );
10299
}
103100

101+
private ZipUnArchiver getZipUnArchiver(File testJar) throws Exception {
102+
ZipUnArchiver zu = (ZipUnArchiver) lookup( UnArchiver.ROLE, "zip" );
103+
zu.setSourceFile( testJar );
104+
return zu;
105+
}
106+
104107
public void testExtractingADirectoryFromAJarFile()
105108
throws Exception
106109
{

0 commit comments

Comments
 (0)