diff --git a/osxphotos/_version.py b/osxphotos/_version.py index 51f85b43..7c59e29b 100644 --- a/osxphotos/_version.py +++ b/osxphotos/_version.py @@ -1,3 +1,3 @@ """ version info """ -__version__ = "0.42.50" +__version__ = "0.42.51" diff --git a/osxphotos/cli.py b/osxphotos/cli.py index fea94eed..76db124d 100644 --- a/osxphotos/cli.py +++ b/osxphotos/cli.py @@ -1647,6 +1647,9 @@ def export( previous_uuids = {uuid: 1 for uuid in export_db.get_previous_uuids()} photos = [p for p in photos if p.uuid not in previous_uuids] + # store results of export + results = ExportResults() + if photos: num_photos = len(photos) # TODO: photos or photo appears several times, pull into a separate function @@ -1658,8 +1661,6 @@ def export( # because the original code used --original-name as an option original_name = not current_name - results = ExportResults() - # set up for --add-export-to-album if needed album_export = ( PhotosAlbum(add_exported_to_album, verbose=verbose_) @@ -1834,41 +1835,6 @@ def export( if fp is not None: fp.close() - if cleanup: - all_files = ( - results.exported - + results.skipped - + results.exif_updated - + results.touched - + results.converted_to_jpeg - + results.sidecar_json_written - + results.sidecar_json_skipped - + results.sidecar_exiftool_written - + results.sidecar_exiftool_skipped - + results.sidecar_xmp_written - + results.sidecar_xmp_skipped - # include missing so a file that was already in export directory - # but was missing on --update doesn't get deleted - # (better to have old version than none) - + results.missing - # include files that have error in case they exist from previous export - + [r[0] for r in results.error] - + [str(pathlib.Path(export_db_path).resolve())] - ) - click.echo(f"Cleaning up {dest}") - cleaned_files, cleaned_dirs = cleanup_files(dest, all_files, fileutil) - file_str = "files" if len(cleaned_files) != 1 else "file" - dir_str = "directories" if len(cleaned_dirs) != 1 else "directory" - click.echo( - f"Deleted: {len(cleaned_files)} {file_str}, {len(cleaned_dirs)} {dir_str}" - ) - results.deleted_files = cleaned_files - results.deleted_directories = cleaned_dirs - - if report: - verbose_(f"Writing export report to {report}") - write_export_report(report, results) - photo_str_total = "photos" if len(photos) != 1 else "photo" if update: summary = ( @@ -1893,6 +1859,42 @@ def export( else: click.echo("Did not find any photos to export") + # cleanup files and do report if needed + if cleanup: + all_files = ( + results.exported + + results.skipped + + results.exif_updated + + results.touched + + results.converted_to_jpeg + + results.sidecar_json_written + + results.sidecar_json_skipped + + results.sidecar_exiftool_written + + results.sidecar_exiftool_skipped + + results.sidecar_xmp_written + + results.sidecar_xmp_skipped + # include missing so a file that was already in export directory + # but was missing on --update doesn't get deleted + # (better to have old version than none) + + results.missing + # include files that have error in case they exist from previous export + + [r[0] for r in results.error] + + [str(pathlib.Path(export_db_path).resolve())] + ) + click.echo(f"Cleaning up {dest}") + cleaned_files, cleaned_dirs = cleanup_files(dest, all_files, fileutil) + file_str = "files" if len(cleaned_files) != 1 else "file" + dir_str = "directories" if len(cleaned_dirs) != 1 else "directory" + click.echo( + f"Deleted: {len(cleaned_files)} {file_str}, {len(cleaned_dirs)} {dir_str}" + ) + results.deleted_files = cleaned_files + results.deleted_directories = cleaned_dirs + + if report: + verbose_(f"Writing export report to {report}") + write_export_report(report, results) + export_db.close() diff --git a/tests/test_cli.py b/tests/test_cli.py index 0698d6d8..3b125a04 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -5324,6 +5324,50 @@ def test_export_cleanup(): assert not pathlib.Path("./foo/delete_me_too.txt").is_file() +def test_export_cleanup_empty_album(): + """test export with --cleanup flag with an empty album (#481)""" + import pathlib + import tempfile + + from osxphotos.cli import export + + runner = CliRunner() + cwd = os.getcwd() + # pylint: disable=not-context-manager + with runner.isolated_filesystem(): + result = runner.invoke(export, [os.path.join(cwd, CLI_PHOTOS_DB), ".", "-V"]) + assert result.exit_code == 0 + + # run cleanup with dry-run + with tempfile.TemporaryDirectory() as tempdir: + result = runner.invoke( + export, + [ + os.path.join(cwd, CLI_PHOTOS_DB), + tempdir, + "-V", + "--uuid", + UUID_LOCATION, + ], + ) + + # run cleanup with an empty folder + result = runner.invoke( + export, + [ + os.path.join(cwd, CLI_PHOTOS_DB), + tempdir, + "-V", + "--update", + "--cleanup", + "--album", + "EmptyAlbum", + ], + ) + assert "Did not find any photos to export" in result.output + assert "Deleted: 1 file" in result.output + + def test_save_load_config(): """test --save-config, --load-config""" import glob