Skip to content

Commit 378c439

Browse files
committed
keep included folder name as top level folder name, delete MAC folder and hidden files
1 parent 1845b2d commit 378c439

File tree

4 files changed

+90
-25
lines changed

4 files changed

+90
-25
lines changed

app/src/processing/app/tools/ZipDeflater.java

+49-23
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,30 @@ public class ZipDeflater {
1414

1515
private final ZipFile zipFile;
1616
private final File destFolder;
17+
private final Random random;
18+
private final File file;
1719

1820
public ZipDeflater(File file, File destFolder) throws ZipException, IOException {
21+
this.file = file;
1922
this.destFolder = destFolder;
2023
this.zipFile = new ZipFile(file);
24+
this.random = new Random();
2125
}
2226

2327
public void deflate() throws IOException {
24-
String folderName = tempFolderNameFromZip();
28+
String tmpFolderName = folderNameFromZip() + random.nextInt(1000000);
2529

26-
File folder = new File(destFolder, folderName);
30+
File tmpFolder = new File(destFolder, tmpFolderName);
2731

28-
if (!folder.mkdir()) {
29-
throw new IOException("Unable to create folder " + folderName);
32+
if (!tmpFolder.mkdir()) {
33+
throw new IOException("Unable to create folder " + tmpFolderName);
3034
}
3135

3236
Enumeration<? extends ZipEntry> entries = zipFile.entries();
3337
while (entries.hasMoreElements()) {
3438
ZipEntry entry = entries.nextElement();
35-
ensureFoldersOfEntryExist(folder, entry);
36-
File entryFile = new File(folder, entry.getName());
39+
ensureFoldersOfEntryExist(tmpFolder, entry);
40+
File entryFile = new File(tmpFolder, entry.getName());
3741
if (entry.isDirectory()) {
3842
entryFile.mkdir();
3943
} else {
@@ -58,8 +62,33 @@ public void deflate() throws IOException {
5862
}
5963
}
6064

61-
// Test.zip may or may not contain Test folder. We use zip name to create libraries folder. Therefore, a contained Test folder is useless and must be removed
62-
ensureOneLevelFolder(folder);
65+
deleteUndesiredFoldersAndFiles(tmpFolder);
66+
67+
// Test.zip may or may not contain Test folder. If it does, we keep it. If not, we use zip name.
68+
ensureOneLevelFolder(tmpFolder);
69+
}
70+
71+
private void deleteUndesiredFoldersAndFiles(File folder) {
72+
for (File file : folder.listFiles()) {
73+
if (file.isDirectory() && "__MACOSX".equals(file.getName())) {
74+
recursiveDelete(file);
75+
} else if (file.getName().startsWith(".")) {
76+
recursiveDelete(file);
77+
}
78+
}
79+
}
80+
81+
private void recursiveDelete(File file) {
82+
if (file.isDirectory()) {
83+
for (File current : file.listFiles()) {
84+
if (current.isDirectory()) {
85+
recursiveDelete(current);
86+
} else {
87+
current.delete();
88+
}
89+
}
90+
}
91+
file.delete();
6392
}
6493

6594
private void ensureFoldersOfEntryExist(File folder, ZipEntry entry) {
@@ -73,25 +102,22 @@ private void ensureFoldersOfEntryExist(File folder, ZipEntry entry) {
73102

74103
private void ensureOneLevelFolder(File folder) {
75104
File[] files = folder.listFiles();
76-
if (files.length == 1 && files[0].isDirectory()) {
77-
File tempFile = new File(files[0].getPath() + new Random().nextInt(1000));
78-
files[0].renameTo(tempFile);
79-
for (File file : tempFile.listFiles()) {
80-
file.renameTo(new File(folder, file.getName()));
81-
}
82-
tempFile.delete();
105+
106+
if (files.length != 1) {
107+
folder.renameTo(new File(folder.getParentFile(), folderNameFromZip()));
108+
return;
83109
}
110+
111+
files[0].renameTo(new File(folder.getParentFile(), files[0].getName()));
112+
recursiveDelete(folder);
84113
}
85114

86-
private String tempFolderNameFromZip() {
87-
String folderName = zipFile.getName();
88-
if (folderName.lastIndexOf(".") != -1) {
89-
folderName = folderName.substring(0, folderName.lastIndexOf("."));
90-
}
91-
if (folderName.lastIndexOf(File.separator) != -1) {
92-
folderName = folderName.substring(folderName.lastIndexOf(File.separator) + 1);
115+
private String folderNameFromZip() {
116+
String filename = file.getName();
117+
if (filename.lastIndexOf(".") != -1) {
118+
filename = filename.substring(0, filename.lastIndexOf("."));
93119
}
94-
return folderName;
120+
return filename;
95121
}
96122

97123
}

app/test/Keypad_mac.zip

16.9 KB
Binary file not shown.

app/test/Keypad_with_hidden_files.zip

11.9 KB
Binary file not shown.

app/test/processing/app/tools/ZipDeflaterTest.java

+41-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@
1010
import org.junit.Before;
1111
import org.junit.Test;
1212

13-
import processing.app.tools.ZipDeflater;
14-
1513
public class ZipDeflaterTest {
1614

1715
private File destFolder;
@@ -62,6 +60,47 @@ public void shouldDeflateZipAndMoveContentsToParentFolder() throws Exception {
6260
assertEquals("readme.txt", files[4]);
6361
}
6462

63+
@Test
64+
public void shouldDeflateMacZip() throws Exception {
65+
File file = new File(ZipDeflater.class.getResource("/Keypad_mac.zip").getFile());
66+
new ZipDeflater(file, destFolder).deflate();
67+
68+
String[] files = destFolder.list();
69+
assertEquals(1, files.length);
70+
assertEquals("Keypad", files[0]);
71+
72+
file = destFolder.listFiles()[0];
73+
files = file.list();
74+
assertEquals(4, files.length);
75+
Arrays.sort(files);
76+
assertEquals("Keypad.cpp", files[0]);
77+
assertEquals("Keypad.h", files[1]);
78+
assertEquals("examples", files[2]);
79+
assertEquals("keywords.txt", files[3]);
80+
81+
files = new File(file, "examples").list();
82+
assertEquals(4, files.length);
83+
Arrays.sort(files);
84+
assertEquals("CustomKeypad", files[0]);
85+
assertEquals("DynamicKeypad", files[1]);
86+
assertEquals("EventKeypad", files[2]);
87+
assertEquals("HelloKeypad", files[3]);
88+
}
89+
90+
@Test
91+
public void shouldDeleteHiddenFiles() throws Exception {
92+
File file = new File(ZipDeflater.class.getResource("/Keypad_with_hidden_files.zip").getFile());
93+
new ZipDeflater(file, destFolder).deflate();
94+
95+
String[] files = destFolder.list();
96+
assertEquals(1, files.length);
97+
assertEquals("Keypad_with_hidden_files", files[0]);
98+
99+
file = destFolder.listFiles()[0];
100+
files = file.list();
101+
assertEquals(4, files.length);
102+
}
103+
65104
@After
66105
public void deleteTempFolder() {
67106
recursiveDelete(destFolder);

0 commit comments

Comments
 (0)