Skip to content

Commit bae9e76

Browse files
committed
[PLXCOMP-272] Overriding file/dirmode breaks symlinks
1 parent e1cad36 commit bae9e76

File tree

5 files changed

+60
-7
lines changed

5 files changed

+60
-7
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
<dependency>
5757
<groupId>org.codehaus.plexus</groupId>
5858
<artifactId>plexus-io</artifactId>
59-
<version>2.3.4</version>
59+
<version>2.3.5-SNAPSHOT</version>
6060
</dependency>
6161
<dependency>
6262
<groupId>org.apache.commons</groupId>

src/main/java/org/codehaus/plexus/archiver/ArchiveEntry.java

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -184,9 +184,17 @@ public static ArchiveEntry createFileEntry( String target, File file, int permis
184184
{
185185
throw new ArchiverException( "Failed to read filesystem attributes for: " + file, e );
186186
}
187-
187+
188+
final int type;
189+
if (attrs.isSymbolicLink()){
190+
type = SYMLINK;
191+
permissions = permissions & ~(UnixStat.FILE_FLAG); // remove file flag again .doh.
192+
} else {
193+
type = FILE; // File flag was there already. This is a bit of a mess !
194+
}
195+
188196
final PlexusIoFileResource res = PlexusIoFileResource.justAFile( file, attrs );
189-
return new ArchiveEntry( target, res, FILE, permissions, null, defaultDirectoryPermissions );
197+
return new ArchiveEntry( target, res, type, permissions, null, defaultDirectoryPermissions );
190198
}
191199

192200
public static ArchiveEntry createDirectoryEntry( String target, @Nonnull PlexusIoResource resource, int permissions,
@@ -197,7 +205,14 @@ public static ArchiveEntry createDirectoryEntry( String target, @Nonnull PlexusI
197205
{
198206
throw new ArchiverException( "Not a directory: " + resource.getName() );
199207
}
200-
final int type = resource.isSymbolicLink() ? SYMLINK : DIRECTORY;
208+
final int type;
209+
if (resource.isSymbolicLink()){
210+
type = SYMLINK;
211+
permissions = permissions & ~(UnixStat.DIR_FLAG); // remove dir flag again .doh.
212+
} else {
213+
type = DIRECTORY; // Dir flag was there already. This is a bit of a mess !
214+
215+
}
201216
return new ArchiveEntry( target, resource, type, permissions, null, defaultDirectoryPermissions );
202217
}
203218

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

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@
99
import org.codehaus.plexus.util.Os;
1010

1111
import java.io.File;
12+
import java.io.IOException;
1213
import java.nio.file.Files;
14+
import java.nio.file.attribute.BasicFileAttributes;
15+
import java.nio.file.attribute.PosixFileAttributes;
1316

1417
/**
1518
* @author Kristian Rosenvold
@@ -18,14 +21,25 @@ public class SymlinkTest
1821
extends PlexusTestCase
1922
{
2023

21-
public void testSymlinkDir(){
24+
public void testSymlinkDir()
25+
throws IOException
26+
{
2227
if ( Os.isFamily( Os.FAMILY_WINDOWS )) return;
2328
File dummyContent = getTestFile( "src/test/resources/symlinks/src/symDir" );
2429
assertTrue( dummyContent.isDirectory());
2530
assertTrue( Files.isSymbolicLink( dummyContent.toPath()));
2631

2732
}
2833

34+
public void testSymlinkDirWithSlash()
35+
throws IOException
36+
{
37+
if ( Os.isFamily( Os.FAMILY_WINDOWS )) return;
38+
File dummyContent = getTestFile( "src/test/resources/symlinks/src/symDir/" );
39+
assertTrue( dummyContent.isDirectory());
40+
assertTrue( Files.isSymbolicLink( dummyContent.toPath()));
41+
}
42+
2943
public void testSymlinkFile(){
3044
if ( Os.isFamily( Os.FAMILY_WINDOWS )) return;
3145
File dummyContent = getTestFile( "src/test/resources/symlinks/src/symR" );

src/test/java/org/codehaus/plexus/archiver/tar/TarArchiverTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ public void createArchive(final int directoryMode, final int fileModes[])
289289

290290
archiver.setFileMode( defaultFileMode );
291291

292-
archiver.addDirectory( getTestFile( "src" ) );
292+
archiver.addDirectory( getTestFile( "src/main" ) );
293293
archiver.setFileMode( oneFileMode );
294294

295295
archiver.addFile( getTestFile( "src/test/resources/manifests/manifest1.mf" ), "one.txt" );

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

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,30 @@ public void testImplicitPermissions()
111111
assertEquals( 040530, fazz.getUnixMode() );
112112
ZipArchiveEntry pam = zf.getEntry( "fazz/bazz/pam.xml" );
113113
assertEquals( 0100111, pam.getUnixMode() );
114+
}
115+
114116

117+
public void testOverddidenPermissions()
118+
throws IOException
119+
{
120+
File zipFile = getTestFile( "target/output/zip-with-overriden-modes.zip" );
115121

122+
ZipArchiver archiver = getZipArchiver(zipFile);
123+
archiver.setDefaultDirectoryMode( 0777 );
124+
archiver.setDirectoryMode( 0641 );
125+
archiver.setFileMode( 0777 );
126+
archiver.addDirectory( new File( "src/test/resources/symlinks/src" ) );
127+
archiver.createArchive();
128+
129+
assertTrue( zipFile.exists() );
130+
ZipFile zf = new ZipFile( zipFile );
131+
ZipArchiveEntry fizz = zf.getEntry( "symDir" );
132+
assertTrue( fizz.isUnixSymlink());
133+
ZipArchiveEntry symR = zf.getEntry( "symR" );
134+
assertTrue( symR.isUnixSymlink());
116135
}
136+
137+
117138
public void testCreateArchiveWithDetectedModes()
118139
throws Exception
119140
{
@@ -433,7 +454,10 @@ else if ( ze.getName().equals( "two.txt" ) )
433454
{
434455
assertEquals( 0664, UnixStat.PERM_MASK & ze.getUnixMode() );
435456
}
436-
else
457+
else if ( ze.isUnixSymlink())
458+
{
459+
// assertEquals( ze.getName(), 0500, UnixStat.PERM_MASK & ze.getUnixMode() );
460+
} else
437461
{
438462
assertEquals( 0400, UnixStat.PERM_MASK & ze.getUnixMode() );
439463
}

0 commit comments

Comments
 (0)