Skip to content

Commit 274fc2d

Browse files
committed
o Made ZipArchiver aware of the 'includeEmptyDirs' setting (which kind of overrides
the 'filesOnly' setting; for now both 'work'. o Made order in which the files/dirs are iterated predictable o Reversed order of adding dirs/files in getFiles() so dirs are always specified first. o Re-enable testcase where directory permissions are tested in ZipArchiver: Due to the non deterministic nature of 'addParentDirs' the last specified directoryMask was used for those files. Together with the abovementioned modifications the ZipArchiver now uses the default directory permissions in the correct time (effectively 'addParentDirs' doesn't have any real effect now..) ZipArchiver is due for refactoring! I'm just not sure about the backward compatibility requirements yet. If this isn't an issue it could get a lot cleaner.
1 parent 4a34e40 commit 274fc2d

File tree

3 files changed

+36
-27
lines changed

3 files changed

+36
-27
lines changed

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

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
import org.codehaus.plexus.util.DirectoryScanner;
2424

2525
import java.io.File;
26-
import java.util.HashMap;
26+
import java.util.LinkedHashMap;
2727
import java.util.Map;
2828

2929
/**
@@ -48,9 +48,9 @@ public abstract class AbstractArchiver extends AbstractLogEnabled
4848

4949
private File destFile;
5050

51-
private Map filesMap = new HashMap();
51+
private Map filesMap = new LinkedHashMap();
5252

53-
private Map dirsMap = new HashMap();
53+
private Map dirsMap = new LinkedHashMap();
5454

5555
private int defaultFileMode = DEFAULT_FILE_MODE;
5656

@@ -155,18 +155,7 @@ public void addDirectory( File directory, String prefix, String[] includes, Stri
155155
String basedir = directory.getAbsolutePath();
156156
scanner.setBasedir( basedir );
157157
scanner.scan();
158-
String[] files = scanner.getIncludedFiles();
159-
160-
for ( int i = 0; i < files.length; i++ )
161-
{
162-
String sourceFile = files[i].replace( '\\', '/' );
163-
164-
String targetFile = ( prefix == null ? "" : prefix ) + sourceFile;
165158

166-
filesMap.put( targetFile, ArchiveEntry.createEntry( targetFile,
167-
new File( basedir, sourceFile ), getDefaultFileMode(), getDefaultDirectoryMode() ) );
168-
}
169-
170159
if ( includeEmptyDirs )
171160
{
172161
String [] dirs = scanner.getIncludedDirectories();
@@ -176,11 +165,24 @@ public void addDirectory( File directory, String prefix, String[] includes, Stri
176165
String sourceDir = dirs[i].replace( '\\', '/' );
177166

178167
String targetDir = ( prefix == null ? "" : prefix ) + sourceDir;
179-
168+
180169
getDirs().put( targetDir, ArchiveEntry.createEntry( targetDir,
181170
new File( basedir, sourceDir ), getDefaultFileMode(), getDefaultDirectoryMode() ) );
182171
}
183172
}
173+
174+
String[] files = scanner.getIncludedFiles();
175+
176+
for ( int i = 0; i < files.length; i++ )
177+
{
178+
String sourceFile = files[i].replace( '\\', '/' );
179+
180+
String targetFile = ( prefix == null ? "" : prefix ) + sourceFile;
181+
182+
filesMap.put( targetFile, ArchiveEntry.createEntry( targetFile,
183+
new File( basedir, sourceFile ), getDefaultFileMode(), getDefaultDirectoryMode() ) );
184+
}
185+
184186
}
185187

186188
public void addFile( File inputFile, String destFileName )
@@ -208,14 +210,17 @@ public void addFile( File inputFile, String destFileName, int permissions )
208210
// the Name of the ArchiveEntry..?
209211
protected Map getFiles()
210212
{
211-
if ( !includeEmptyDirs ) return filesMap;
213+
if ( !includeEmptyDirs )
214+
{
215+
return filesMap;
216+
}
212217

213-
Map resources = new HashMap();
214-
215-
resources.putAll( filesMap );
218+
Map resources = new LinkedHashMap();
216219

217220
resources.putAll( getDirs() );
218221

222+
resources.putAll( filesMap );
223+
219224
return resources;
220225
}
221226

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -501,7 +501,7 @@ protected final void addParentDirs(File baseDir, String entry,
501501
ZipOutputStream zOut, String prefix)
502502
throws IOException
503503
{
504-
if ( !doFilesonly )
504+
if ( !doFilesonly && getIncludeEmptyDirs() )
505505
{
506506
Stack directories = new Stack();
507507

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

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
* SOFTWARE.
2525
*/
2626

27-
import java.util.Date;
2827
import java.util.Enumeration;
2928

3029
import org.codehaus.plexus.PlexusTestCase;
@@ -42,41 +41,46 @@ public void testCreateArchive()
4241
throws Exception
4342
{
4443
ZipArchiver archiver = (ZipArchiver) lookup( Archiver.ROLE, "zip" );
44+
4545
archiver.setDefaultDirectoryMode( 0500 );
4646
archiver.setDefaultFileMode( 0400 );
4747
archiver.addDirectory( getTestFile( "src" ) );
48+
4849
archiver.setDefaultFileMode( 0640 );
4950
archiver.addFile( getTestFile( "src/test/resources/manifests/manifest1.mf" ), "one.txt" );
5051
archiver.addFile( getTestFile( "src/test/resources/manifests/manifest2.mf" ), "two.txt", 0664 );
51-
archiver.setDefaultDirectoryMode( 0777 );
5252

5353
// reset default file mode for files included from now on
5454
archiver.setDefaultFileMode( 0400 );
55-
archiver.addDirectory( getTestFile( "src/test/resources/manifests/" ), "worldwritable" );
55+
archiver.setDefaultDirectoryMode( 0777 );
56+
archiver.addDirectory( getTestFile( "src/test/resources/ww/" ), "worldwritable/" );
57+
5658
archiver.setDefaultDirectoryMode( 0070 );
57-
archiver.addDirectory( getTestFile( "src/test/resources/manifests/" ), "groupwritable" );
59+
archiver.addDirectory( getTestFile( "src/test/resources/gw/" ), "groupwritable/" );
60+
5861
archiver.setDestFile( getTestFile( "target/output/archive.zip" ) );
5962
archiver.createArchive();
6063

6164
ZipFile zf = new ZipFile( archiver.getDestFile() );
6265

6366
Enumeration e = zf.getEntries();
67+
6468
while ( e.hasMoreElements() )
6569
{
6670
ZipEntry ze = (ZipEntry) e.nextElement();
6771
if ( ze.isDirectory() )
6872
{
69-
if ( ze.getName().equals( "worldwritable") )
73+
if ( ze.getName().startsWith( "worldwritable") )
7074
{
7175
assertEquals( 0777, UnixStat.PERM_MASK & ze.getUnixMode() );
7276
}
73-
if ( ze.getName().equals( "groupwritable") )
77+
else if ( ze.getName().startsWith( "groupwritable") )
7478
{
7579
assertEquals( 0070, UnixStat.PERM_MASK & ze.getUnixMode() );
7680
}
7781
else
7882
{
79-
//assertEquals( 0500, UnixStat.PERM_MASK & ze.getUnixMode() );
83+
assertEquals( 0500, UnixStat.PERM_MASK & ze.getUnixMode() );
8084
}
8185
}
8286
else

0 commit comments

Comments
 (0)