Skip to content

Commit 543c2e3

Browse files
committed
Merge remote-tracking branch 'sonatype/272'
Conflicts: src/test/java/org/codehaus/plexus/archiver/zip/ZipArchiverTest.java
2 parents 5219d50 + e5b8ffa commit 543c2e3

File tree

3 files changed

+55
-9
lines changed

3 files changed

+55
-9
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: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,19 @@
2727
import org.apache.commons.compress.archivers.zip.*;
2828
import org.apache.commons.compress.utils.BoundedInputStream;
2929
import org.codehaus.plexus.archiver.ArchivedFileSet;
30+
import org.apache.commons.compress.archivers.zip.ExtraFieldUtils;
31+
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
32+
import org.apache.commons.compress.archivers.zip.ZipExtraField;
3033
import org.codehaus.plexus.archiver.Archiver;
3134
import org.codehaus.plexus.archiver.ArchiverException;
3235
import org.codehaus.plexus.archiver.BasePlexusArchiverTest;
36+
import org.codehaus.plexus.archiver.UnArchiver;
3337
import org.codehaus.plexus.archiver.UnixStat;
3438
import org.codehaus.plexus.archiver.util.ArchiveEntryUtils;
3539
import org.codehaus.plexus.archiver.util.DefaultArchivedFileSet;
3640
import org.codehaus.plexus.archiver.util.DefaultFileSet;
3741
import org.codehaus.plexus.archiver.util.Streams;
42+
import org.codehaus.plexus.components.io.attributes.Java7FileAttributes;
3843
import org.codehaus.plexus.components.io.attributes.PlexusIoResourceAttributeUtils;
3944
import org.codehaus.plexus.components.io.attributes.PlexusIoResourceAttributes;
4045
import org.codehaus.plexus.components.io.functions.InputStreamTransformer;
@@ -46,7 +51,12 @@
4651
import org.codehaus.plexus.util.IOUtil;
4752
import org.codehaus.plexus.util.Os;
4853

49-
import java.io.*;
54+
import java.io.ByteArrayInputStream;
55+
import java.io.ByteArrayOutputStream;
56+
import java.io.File;
57+
import java.io.FileWriter;
58+
import java.io.IOException;
59+
import java.io.InputStream;
5060
import java.util.Arrays;
5161
import java.util.Date;
5262
import java.util.Enumeration;
@@ -229,10 +239,16 @@ private ZipArchiver getZipArchiver()
229239
private ZipArchiver getZipArchiver(File destFile)
230240
{
231241
final ZipArchiver zipArchiver = getZipArchiver();
232-
zipArchiver.setDestFile( destFile );
242+
zipArchiver.setDestFile( destFile );
233243
return zipArchiver;
234244
}
235245

246+
private ZipUnArchiver getZipUnArchiver(File testJar) throws Exception {
247+
ZipUnArchiver zu = (ZipUnArchiver) lookup( UnArchiver.ROLE, "zip" );
248+
zu.setSourceFile( testJar );
249+
return zu;
250+
}
251+
236252
private void writeFile( File dir, String fname, int mode )
237253
throws IOException, ArchiverException
238254
{
@@ -367,6 +383,26 @@ else if ( ze.getName().equals( "two.txt" ) )
367383
}
368384
}
369385

386+
public void testSymlinkZip() throws Exception {
387+
final File zipFile = getTestFile("target/output/pasymlinks.zip");
388+
final ZipArchiver zipArchiver = getZipArchiver(zipFile);
389+
PlexusIoFileResourceCollection files = new PlexusIoFileResourceCollection();
390+
files.setFollowingSymLinks( false );
391+
files.setBaseDir( new File( "src/test/resources/symlinks" ) );
392+
files.setPrefix( "plexus/" );
393+
zipArchiver.addResources( files );
394+
zipArchiver.createArchive();
395+
final File output = getTestFile("target/output/unzipped");
396+
output.mkdirs();
397+
final ZipUnArchiver zipUnArchiver = getZipUnArchiver(zipFile);
398+
zipUnArchiver.setDestFile( output );
399+
zipUnArchiver.extract();
400+
File symDir = new File("target/output/unzipped/plexus/src/symDir");
401+
PlexusIoResourceAttributes fa= Java7FileAttributes.uncached(symDir);
402+
assertTrue( fa.isSymbolicLink() );
403+
}
404+
405+
370406
public void testForced()
371407
throws Exception
372408
{

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)