Fix: zip exports not respecting the --delete option (#5245)

This commit is contained in:
Trenton H
2024-01-04 11:58:58 -08:00
committed by GitHub
parent 5963dfe41b
commit 8da2535a65
2 changed files with 71 additions and 15 deletions

View File

@@ -5,6 +5,7 @@ import shutil
import tempfile
import time
from pathlib import Path
from typing import Optional
import tqdm
from django.conf import settings
@@ -172,14 +173,14 @@ class Command(BaseCommand):
self.delete: bool = options["delete"]
self.no_archive: bool = options["no_archive"]
self.no_thumbnail: bool = options["no_thumbnail"]
zip_export: bool = options["zip"]
self.zip_export: bool = options["zip"]
# If zipping, save the original target for later and
# get a temporary directory for the target instead
temp_dir = None
original_target = None
if zip_export:
original_target = self.target
self.original_target: Optional[Path] = None
if self.zip_export:
self.original_target = self.target
os.makedirs(settings.SCRATCH_DIR, exist_ok=True)
temp_dir = tempfile.TemporaryDirectory(
@@ -203,10 +204,10 @@ class Command(BaseCommand):
# We've written everything to the temporary directory in this case,
# now make an archive in the original target, with all files stored
if zip_export:
if self.zip_export:
shutil.make_archive(
os.path.join(
original_target,
self.original_target,
options["zip_name"],
),
format="zip",
@@ -215,7 +216,7 @@ class Command(BaseCommand):
finally:
# Always cleanup the temporary directory, if one was created
if zip_export and temp_dir is not None:
if self.zip_export and temp_dir is not None:
temp_dir.cleanup()
def dump(self, progress_bar_disable=False):
@@ -466,14 +467,21 @@ class Command(BaseCommand):
if self.delete:
# 5. Remove files which we did not explicitly export in this run
if not self.zip_export:
for f in self.files_in_export_dir:
f.unlink()
for f in self.files_in_export_dir:
f.unlink()
delete_empty_directories(
f.parent,
self.target,
)
delete_empty_directories(
f.parent,
self.target,
)
else:
# 5. Remove anything in the original location (before moving the zip)
for item in self.original_target.glob("*"):
if item.is_dir():
shutil.rmtree(item)
else:
item.unlink()
def check_and_copy(self, source, source_checksum, target: Path):
if target in self.files_in_export_dir: