mirror of https://github.com/micromata/borgbackup-butler.git

Kai Reinhard
23.15.2019 747660aef567bb4216734eaa65be9480babfc8c8
#26: Tree browsing bug for mount points or directories not delivered separately by Borg.
3 files modified
60 ■■■■ changed files
borgbutler-core/src/main/java/de/micromata/borgbutler/data/FileSystemFilter.java 13 ●●●● patch | view | raw | blame | history
borgbutler-core/src/test/java/de/micromata/borgbutler/data/FileSystemFilterTest.java 41 ●●●● patch | view | raw | blame | history
borgbutler-webapp/src/components/views/archives/FileListEntry.jsx 6 ●●●● patch | view | raw | blame | history
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;
    }
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;
    }
}
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}`;