From f9dfd6da7f00a3baa69136f66c2d2cd0420eafd6 Mon Sep 17 00:00:00 2001 From: "John T. Wodder II" Date: Thu, 14 Apr 2022 12:09:03 -0400 Subject: [PATCH] Better detection of empty directories when download-syncing Zarrs --- dandi/download.py | 11 ++++------- dandi/tests/test_download.py | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/dandi/download.py b/dandi/download.py index 64091ca49..f6f4a8b25 100644 --- a/dandi/download.py +++ b/dandi/download.py @@ -872,19 +872,16 @@ def digest_callback(path: str, algoname: str, d: str) -> None: is_empty = False elif p.is_dir(): dirs.append(p) + is_empty = False else: is_empty = False if is_empty and d != zarr_basepath: empty_dirs.append(d) while empty_dirs: d = empty_dirs.popleft() - try: - d.rmdir() - except OSError: - pass - else: - if d.parent != zarr_basepath and not any(d.parent.iterdir()): - empty_dirs.append(d.parent) + d.rmdir() + if d.parent != zarr_basepath and not any(d.parent.iterdir()): + empty_dirs.append(d.parent) if "skipped" not in final_out["message"]: zarr_checksum = asset.get_digest().value diff --git a/dandi/tests/test_download.py b/dandi/tests/test_download.py index b140385f4..707cba7e4 100644 --- a/dandi/tests/test_download.py +++ b/dandi/tests/test_download.py @@ -380,6 +380,23 @@ def test_download_zarr_asset_id_only( assert_dirtrees_eq(zarr_dandiset.dspath / "sample.zarr", tmp_path / "sample.zarr") +def test_download_zarr_subdir_has_only_subdirs( + tmp_path: Path, new_dandiset: SampleDandiset +) -> None: + zf = new_dandiset.dspath / "sample.zarr" + zf.mkdir() + (zf / "dirs").mkdir() + (zf / "dirs" / "apple").mkdir() + (zf / "dirs" / "apple" / "file.txt").write_text("Apple\n") + (zf / "dirs" / "banana").mkdir() + (zf / "dirs" / "banana" / "file.txt").write_text("Banana\n") + (zf / "dirs" / "coconut").mkdir() + (zf / "dirs" / "coconut" / "file.txt").write_text("Coconut\n") + new_dandiset.upload(validation="skip") + download(new_dandiset.dandiset.version_api_url, tmp_path) + assert_dirtrees_eq(zf, tmp_path / new_dandiset.dandiset_id / "sample.zarr") + + @pytest.mark.parametrize( "file_qty,inputs,expected", [