From 16f38e3e46045a593a16f8a96a894e30d4e7d8ce Mon Sep 17 00:00:00 2001 From: "Kacper Kowalik (Xarthisius)" Date: Thu, 12 Dec 2019 14:40:13 -0600 Subject: [PATCH] Apply some heuristics to make certain datasets look more like a binder --- server/tasks/import_binder.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/server/tasks/import_binder.py b/server/tasks/import_binder.py index 35e1172a..028a6298 100644 --- a/server/tasks/import_binder.py +++ b/server/tasks/import_binder.py @@ -17,6 +17,8 @@ from fs.mode import Mode from fs.path import basename from fs.permissions import Permissions +from fs.tarfs import ReadTarFS +from fs.zipfs import ReadZipFS from girderfs.core import WtDmsGirderFS from girder_client import GirderClient from girder.constants import AccessType @@ -34,6 +36,35 @@ from ..utils import getOrCreateRootFolder +def sanitize_binder(root): + root_listdir = root.listdir("/") + + if len(root_listdir) != 1: + return + + single_file_or_dir = root_listdir[0] + + if root.isdir(single_file_or_dir): + with root.opendir(single_file_or_dir) as subdir: + copy_fs(subdir, root) + root.removetree("/" + single_file_or_dir) + sanitize_binder(root) + + if root.isfile(single_file_or_dir): + if single_file_or_dir.endswith(".zip"): + archive_fs = ReadZipFS + elif ".tar" in root.listdir[0]: + archive_fs = ReadTarFS + else: + archive_fs = None + + if archive_fs is not None: + with archive_fs(root.openbin(single_file_or_dir)) as archive: + copy_fs(archive, root) + root.remove("/" + single_file_or_dir) + sanitize_binder(root) + + def run(job): jobModel = Job() jobModel.updateJob(job, status=JobStatus.RUNNING) @@ -120,6 +151,7 @@ def run(job): str(session["_id"]), girder_root + "/api/v1", str(token["_id"]) ) as source_fs: copy_fs(source_fs, destination_fs) + sanitize_binder(destination_fs) Session().deleteSession(user, session)