Skip to content

Commit 8287d23

Browse files
committed
Mark folder containing only hidden files as duplicate.
1 parent efa509b commit 8287d23

File tree

2 files changed

+17
-4
lines changed

2 files changed

+17
-4
lines changed

backblaze/src/main/java/ch/cyberduck/core/b2/B2ObjectListService.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import ch.cyberduck.core.AttributedList;
1919
import ch.cyberduck.core.DefaultIOExceptionMappingService;
2020
import ch.cyberduck.core.DefaultPathContainerService;
21+
import ch.cyberduck.core.DisabledListProgressListener;
2122
import ch.cyberduck.core.ListProgressListener;
2223
import ch.cyberduck.core.ListService;
2324
import ch.cyberduck.core.Path;
@@ -36,6 +37,7 @@
3637
import java.util.EnumSet;
3738
import java.util.HashMap;
3839
import java.util.Map;
40+
import java.util.stream.Collectors;
3941

4042
import synapticloop.b2.Action;
4143
import synapticloop.b2.exception.B2ApiException;
@@ -114,7 +116,7 @@ private String createPrefix(final Path directory) {
114116
}
115117

116118
private Marker parse(final Path directory, final AttributedList<Path> objects,
117-
final B2ListFilesResponse response, final Map<String, Long> revisions) {
119+
final B2ListFilesResponse response, final Map<String, Long> revisions) throws BackgroundException {
118120
final B2AttributesFinderFeature attr = new B2AttributesFinderFeature(session, fileid);
119121
for(B2FileInfoResponse info : response.getFiles()) {
120122
if(StringUtils.equals(PathNormalizer.name(info.getFileName()), B2PathContainerService.PLACEHOLDER)) {
@@ -131,6 +133,10 @@ private Marker parse(final Path directory, final AttributedList<Path> objects,
131133
final Path placeholder = new Path(directory.isDirectory() ? directory : directory.getParent(),
132134
PathNormalizer.name(StringUtils.chomp(info.getFileName(), String.valueOf(Path.DELIMITER))),
133135
EnumSet.of(Path.Type.directory, Path.Type.placeholder));
136+
// Need to check if only hidden files inside
137+
if(this.list(placeholder, new DisabledListProgressListener()).toStream().filter(f -> !f.attributes().isDuplicate()).collect(Collectors.toList()).isEmpty()) {
138+
placeholder.attributes().setDuplicate(true);
139+
}
134140
objects.add(placeholder);
135141
continue;
136142
}

backblaze/src/test/java/ch/cyberduck/core/cryptomator/B2DirectoryFeatureTest.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
*/
1717

1818
import ch.cyberduck.core.AlphanumericRandomStringService;
19+
import ch.cyberduck.core.DisabledListProgressListener;
1920
import ch.cyberduck.core.DisabledLoginCallback;
2021
import ch.cyberduck.core.DisabledPasswordCallback;
2122
import ch.cyberduck.core.DisabledPasswordStore;
@@ -25,8 +26,10 @@
2526
import ch.cyberduck.core.b2.B2DeleteFeature;
2627
import ch.cyberduck.core.b2.B2DirectoryFeature;
2728
import ch.cyberduck.core.b2.B2FindFeature;
29+
import ch.cyberduck.core.b2.B2ObjectListService;
2830
import ch.cyberduck.core.b2.B2VersionIdProvider;
2931
import ch.cyberduck.core.cryptomator.features.CryptoAttributesFeature;
32+
import ch.cyberduck.core.cryptomator.features.CryptoListService;
3033
import ch.cyberduck.core.features.Delete;
3134
import ch.cyberduck.core.features.Directory;
3235
import ch.cyberduck.core.features.Find;
@@ -43,8 +46,9 @@
4346
import org.junit.runners.Parameterized;
4447

4548
import java.util.Arrays;
49+
import java.util.Collections;
4650
import java.util.EnumSet;
47-
import java.util.UUID;
51+
import java.util.stream.Collectors;
4852

4953
import static org.junit.Assert.*;
5054
import static org.junit.Assume.assumeTrue;
@@ -62,7 +66,7 @@ public void testMakeDirectoryEncrypted() throws Exception {
6266
session.withRegistry(new DefaultVaultRegistry(new DisabledPasswordStore(), new DisabledPasswordCallback(), cryptomator));
6367
final B2VersionIdProvider fileid = new B2VersionIdProvider(session);
6468
final Path test = cryptomator.getFeature(session, Directory.class, new B2DirectoryFeature(session, fileid)).mkdir(
65-
new Path(vault, UUID.randomUUID().toString(), EnumSet.of(Path.Type.directory)), new TransferStatus());
69+
new Path(vault, new AlphanumericRandomStringService().random(), EnumSet.of(Path.Type.directory)), new TransferStatus());
6670
assertTrue(test.getType().contains(Path.Type.placeholder));
6771
final String versionId = test.attributes().getVersionId();
6872
assertNotNull(versionId);
@@ -72,7 +76,10 @@ public void testMakeDirectoryEncrypted() throws Exception {
7276
assertEquals(versionId, new CryptoAttributesFeature(session, new B2AttributesFinderFeature(session, fileid), cryptomator).find(test).getVersionId());
7377
// Placeholder returned in list service with no file info
7478
new CryptoAttributesFeature(session, new DefaultAttributesFinderFeature(session), cryptomator).find(test).getVersionId();
75-
cryptomator.getFeature(session, Delete.class, new B2DeleteFeature(session, fileid)).delete(Arrays.asList(test, vault), new DisabledLoginCallback(), new Delete.DisabledCallback());
79+
cryptomator.getFeature(session, Delete.class, new B2DeleteFeature(session, fileid)).delete(Collections.singletonList(test), new DisabledLoginCallback(), new Delete.DisabledCallback());
80+
assertTrue(new CryptoListService(session, new B2ObjectListService(session, fileid), cryptomator).list(vault, new DisabledListProgressListener())
81+
.toStream().filter(f -> !f.attributes().isDuplicate()).collect(Collectors.toList()).isEmpty());
82+
cryptomator.getFeature(session, Delete.class, new B2DeleteFeature(session, fileid)).delete(Collections.singletonList(vault), new DisabledLoginCallback(), new Delete.DisabledCallback());
7683
}
7784

7885
@Test

0 commit comments

Comments
 (0)