From 747660aef567bb4216734eaa65be9480babfc8c8 Mon Sep 17 00:00:00 2001
From: Kai Reinhard <K.Reinhard@micromata.de>
Date: Wed, 23 Jan 2019 06:15:03 +0000
Subject: [PATCH] #26: Tree browsing bug for mount points or directories not delivered separately by Borg.

---
 borgbutler-webapp/src/components/views/archives/FileListEntry.jsx                    |    6 +++---
 borgbutler-core/src/main/java/de/micromata/borgbutler/data/FileSystemFilter.java     |   13 +++++++++++--
 borgbutler-core/src/test/java/de/micromata/borgbutler/data/FileSystemFilterTest.java |   41 +++++++++++++++++++++++++++++++++++------
 3 files changed, 49 insertions(+), 11 deletions(-)

diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/data/FileSystemFilter.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/data/FileSystemFilter.java
index 6f8e431..b1bd68e 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/data/FileSystemFilter.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/data/FileSystemFilter.java
@@ -104,7 +104,7 @@
             if (topLevel == null) {
                 continue;
             }
-            if (set.contains(topLevel) == false) {
+            if (!set.contains(topLevel)) {
                 set.add(topLevel);
                 BorgFilesystemItem topItem = subDirectories.get(topLevel);
                 if (topItem == null) {
@@ -192,7 +192,16 @@
             return false;
         }
         if (!subDirectories.containsKey(topLevelDir)) {
-            subDirectories.put(topLevelDir, item);
+            if (!item.getPath().endsWith(topLevelDir)) {
+                // Mount point? Top level was not received from Borg as separate item. Create a synthetic one (without file number):
+                BorgFilesystemItem syntheticItem = new BorgFilesystemItem()
+                        .setPath(topLevelDir)
+                        .setDisplayPath(topLevelDir)
+                        .setType("d");
+                subDirectories.put(topLevelDir, syntheticItem);
+            } else {
+                subDirectories.put(topLevelDir, item);
+            }
         }
         return true;
     }
diff --git a/borgbutler-core/src/test/java/de/micromata/borgbutler/data/FileSystemFilterTest.java b/borgbutler-core/src/test/java/de/micromata/borgbutler/data/FileSystemFilterTest.java
index 243b8bb..bb4e295 100644
--- a/borgbutler-core/src/test/java/de/micromata/borgbutler/data/FileSystemFilterTest.java
+++ b/borgbutler-core/src/test/java/de/micromata/borgbutler/data/FileSystemFilterTest.java
@@ -6,8 +6,7 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.*;
 
 public class FileSystemFilterTest {
     @Test
@@ -29,7 +28,15 @@
             }
         }
         list = filter.reduce(list);
-        assertEquals(2, list.size());
+        assertEquals(3, list.size());
+        assertEquals("home", list.get(0).getDisplayPath());
+        assertEquals("etc", list.get(1).getDisplayPath());
+        assertEquals("opt", list.get(2).getDisplayPath());
+        assertEquals("opt", list.get(2).getPath());
+        assertEquals(-1, list.get(2).getFileNumber());
+        assertEquals("d", list.get(2).getType());
+        assertNull(list.get(2).getMode()); // Synthetic file item.
+
         list = createList();
         filter.setCurrentDirectory("home");
         for (BorgFilesystemItem item : list) {
@@ -40,18 +47,34 @@
         list = filter.reduce(list);
         assertEquals(4, list.size());
         assertEquals("admin", list.get(0).getDisplayPath());
+        assertEquals("drwxr-xr-x", list.get(0).getMode());
         assertEquals("kai", list.get(1).getDisplayPath());
+        assertEquals("drwxr-xr-x", list.get(1).getMode());
         assertEquals(".bashrc", list.get(2).getDisplayPath());
+        assertEquals("-rw-r--r--", list.get(2).getMode());
         assertEquals(".borgbutler", list.get(3).getDisplayPath());
 
+        list = createList();
+        filter.setCurrentDirectory("opt");
+        for (BorgFilesystemItem item : list) {
+            if (filter.matches(item)) {
+                // Do nothing.
+            }
+        }
+        list = filter.reduce(list);
+        assertEquals(2, list.size());
+        assertEquals("openhab", list.get(0).getDisplayPath());
+        assertEquals("vbox-backups", list.get(1).getDisplayPath());
     }
 
     private BorgFilesystemItem create(String path, boolean directory) {
         BorgFilesystemItem item = new BorgFilesystemItem().setPath(path);
         if (directory) {
-            item.setType("d");
+            item.setType("d")
+                    .setMode("drwxr-xr-x");
         } else {
-            item.setType("-");
+            item.setType("-")
+                    .setMode("-rw-r--r--");
         }
         return item;
     }
@@ -59,7 +82,7 @@
     private List<BorgFilesystemItem> createList() {
         List<BorgFilesystemItem> list = new ArrayList<>();
         list.add(create("home", true));
-        list.add(create("home/admin", false));
+        list.add(create("home/admin", true));
         list.add(create("home/kai", true));
         list.add(create("home/kai/borg/cache", false));
         list.add(create("home/kai/borg/config", false));
@@ -69,6 +92,12 @@
         list.add(create("home/.borgbutler", true));
         list.add(create("etc/apache", true));
         list.add(create("etc/apache/http.conf", false));
+        // opt is not given by borg, because opt is in this example a mount point.
+        list.add(create("opt/openhab", true));
+        list.add(create("opt/openhab/addons", true));
+        list.add(create("opt/openhab/conf", true));
+        list.add(create("opt/vbox-backups", true));
+        list.add(create("opt/vbox-backups/Oracle_VM_VirtualBox_Extension_Pack-4.3.32-103443.vbox-extpack", false));
         return list;
     }
 }
diff --git a/borgbutler-webapp/src/components/views/archives/FileListEntry.jsx b/borgbutler-webapp/src/components/views/archives/FileListEntry.jsx
index f1a330b..8d92be9 100644
--- a/borgbutler-webapp/src/components/views/archives/FileListEntry.jsx
+++ b/borgbutler-webapp/src/components/views/archives/FileListEntry.jsx
@@ -69,9 +69,9 @@
         let iconBan = <div className={'btn'}><IconBan/></div>;
         let iconCheck = <div className={'btn'}><IconCheck/></div>;
 
-        let icon1 = iconCheck;
+        let icon1 = entry.fileNumber >= 0 ? iconCheck : '';
         let icon1Tooltip = '';
-        if (!this.state.thisDownloaded) {
+        if (!this.state.thisDownloaded && entry.fileNumber >= 0) {
             const icon1Id = `icon1-${entry.fileNumber}`;
             icon1 = <div id={icon1Id} className={'btn'}
                          onClick={() => this.download(this.props.archive.id, entry.fileNumber, true)}>
@@ -82,7 +82,7 @@
         }
         let icon2 = '';
         let icon2Tooltip = '';
-        if (this.props.diffArchiveId) {
+        if (this.props.diffArchiveId && entry.fileNumber >= 0) {
             icon2 = iconCheck;
             if (!this.state.otherDownloaded) {
                 const icon2Id = `icon2-${entry.fileNumber}`;

--
Gitblit v1.10.0