Skip to content

Commit 062b009

Browse files
committed
Made directory archiver support creating directories containing files even if write permissions are not present on archiver
1 parent 884fb09 commit 062b009

File tree

2 files changed

+42
-14
lines changed

2 files changed

+42
-14
lines changed

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,18 @@
2828

2929
import java.io.File;
3030
import java.io.IOException;
31+
import java.util.ArrayList;
32+
import java.util.List;
3133

3234
/**
3335
* A plexus archiver implementation that stores the files to archive in a directory.
3436
*/
3537
public class DirectoryArchiver
3638
extends AbstractArchiver
3739
{
40+
41+
private final List<Runnable> directoryChmods = new ArrayList<Runnable>();
42+
3843
public void resetArchiver()
3944
throws IOException
4045
{
@@ -93,6 +98,11 @@ public void execute()
9398
copyFile( f, fileName );
9499
}
95100
}
101+
102+
for ( Runnable directoryChmod : directoryChmods )
103+
{
104+
directoryChmod.run();
105+
}
96106
}
97107
catch ( final IOException ioe )
98108
{
@@ -141,6 +151,8 @@ protected void copyFile( final ArchiveEntry entry, final String vPath )
141151
}
142152
}
143153
ResourceUtils.copyFile( entry.getInputStream(), outFile );
154+
155+
setFileModes( entry, outFile, inLastModified );
144156
}
145157
else
146158
{ // file is a directory
@@ -159,8 +171,21 @@ else if ( !outFile.mkdirs() )
159171
// Failure, unable to create specified directory for some unknown reason.
160172
throw new ArchiverException( "Unable to create directory or parent directory of " + outFile );
161173
}
174+
175+
directoryChmods.add( new Runnable()
176+
{
177+
@Override
178+
public void run()
179+
{
180+
setFileModes( entry, outFile, inLastModified );
181+
}
182+
} );
162183
}
163184

185+
}
186+
187+
private void setFileModes( ArchiveEntry entry, File outFile, long inLastModified )
188+
{
164189
if ( !isIgnorePermissions() )
165190
{
166191
ArchiveEntryUtils.chmod( outFile, entry.getMode(), getLogger(), isUseJvmChmod() );

src/test/java/org/codehaus/plexus/archiver/jar/UnpackJarTest.java renamed to src/test/java/org/codehaus/plexus/archiver/jar/DirectoryArchiverUnpackJarTest.java

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,20 @@
11
package org.codehaus.plexus.archiver.jar;
22

3-
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
4-
import org.apache.commons.compress.archivers.zip.ZipFile;
53
import org.codehaus.plexus.PlexusTestCase;
64
import org.codehaus.plexus.archiver.Archiver;
75
import org.codehaus.plexus.archiver.util.DefaultArchivedFileSet;
8-
import org.codehaus.plexus.components.io.filemappers.IdentityMapper;
6+
import org.codehaus.plexus.components.io.attributes.Java7AttributeUtils;
97
import org.codehaus.plexus.components.io.functions.InputStreamTransformer;
108
import org.codehaus.plexus.components.io.resources.PlexusIoResource;
11-
import org.junit.Test;
129

1310
import javax.annotation.Nonnull;
1411
import java.io.File;
1512
import java.io.IOException;
1613
import java.io.InputStream;
1714
import java.nio.charset.Charset;
18-
import java.util.Enumeration;
1915

20-
public class UnpackJarTest extends PlexusTestCase
16+
public class DirectoryArchiverUnpackJarTest
17+
extends PlexusTestCase
2118
{
2219

2320
public static final String[] DEFAULT_INCLUDES_ARRAY = { "**/*" };
@@ -37,24 +34,30 @@ public InputStream transform( @Nonnull PlexusIoResource resource, @Nonnull Input
3734
}
3835
}
3936

40-
4137
public void test_dependency_sets_depSet_unpacked_rdonly()
4238
throws Exception
4339
{
44-
if (true) return;
45-
File src = new File("src/test/resources/unpack_issue.jar");
46-
assertTrue( src.exists());
40+
File src = new File( "src/test/resources/unpack_issue.jar" );
41+
assertTrue( src.exists() );
4742
DefaultArchivedFileSet afs = DefaultArchivedFileSet.archivedFileSet( src );
4843
afs.setIncludes( DEFAULT_INCLUDES_ARRAY );
4944
afs.setExcludes( null );
5045
afs.setPrefix( "child-1/" );
5146
afs.setStreamTransformer( new IdentityTransformer() );
52-
Archiver archiver = (Archiver)lookup( Archiver.ROLE, "dir" );
47+
Archiver archiver = (Archiver) lookup( Archiver.ROLE, "dir" );
5348
archiver.setDefaultDirectoryMode( 0555 );
54-
archiver.setDirectoryMode( 0555 ); // causes permission denied
49+
archiver.setDirectoryMode( 0555 ); // causes permission denied if bug is not fixed.
5550
archiver.setDestFile( new File( "target/depset_unpack" ) );
56-
archiver.addArchivedFileSet( afs, Charset.forName("UTF-8" ));
51+
archiver.addArchivedFileSet( afs, Charset.forName( "UTF-8" ) );
5752
archiver.createArchive();
58-
assertTrue( new File("target/depset_unpack/child-1/META-INF/MANIFEST.MF").exists());
53+
assertTrue( new File( "target/depset_unpack/child-1/META-INF/MANIFEST.MF" ).exists() );
54+
55+
56+
// make them writeable or mvn clean will fail
57+
Java7AttributeUtils.chmod( new File("target/depset_unpack/child-1/META-INF"), 0777);
58+
Java7AttributeUtils.chmod( new File("target/depset_unpack/child-1/META-INF/maven"), 0777);
59+
Java7AttributeUtils.chmod( new File("target/depset_unpack/child-1/META-INF/maven/test"), 0777);
60+
Java7AttributeUtils.chmod( new File("target/depset_unpack/child-1/META-INF/maven/test/child1"), 0777);
61+
Java7AttributeUtils.chmod( new File("target/depset_unpack/child-1/assembly-resources"), 0777);
5962
}
6063
}

0 commit comments

Comments
 (0)