Made --exiftool and --export-as-hardlink incompatible in CLI to fix #132
This commit is contained in:
@@ -21,7 +21,10 @@ import osxphotos
|
|||||||
from ._constants import _EXIF_TOOL_URL, _PHOTOS_4_VERSION, _UNKNOWN_PLACE
|
from ._constants import _EXIF_TOOL_URL, _PHOTOS_4_VERSION, _UNKNOWN_PLACE
|
||||||
from ._version import __version__
|
from ._version import __version__
|
||||||
from .exiftool import get_exiftool_path
|
from .exiftool import get_exiftool_path
|
||||||
from .photoinfo.template import TEMPLATE_SUBSTITUTIONS, TEMPLATE_SUBSTITUTIONS_MULTI_VALUED
|
from .photoinfo.template import (
|
||||||
|
TEMPLATE_SUBSTITUTIONS,
|
||||||
|
TEMPLATE_SUBSTITUTIONS_MULTI_VALUED,
|
||||||
|
)
|
||||||
from .utils import _copy_file, create_path_by_date
|
from .utils import _copy_file, create_path_by_date
|
||||||
|
|
||||||
|
|
||||||
@@ -89,7 +92,7 @@ class ExportCommand(click.Command):
|
|||||||
)
|
)
|
||||||
formatter.write("\n")
|
formatter.write("\n")
|
||||||
formatter.write_text(
|
formatter.write_text(
|
||||||
"The templating system may also be used with the --keyword-template option "
|
"The templating system may also be used with the --keyword-template option "
|
||||||
+ "to set keywords on export (with --exiftool or --sidecar), "
|
+ "to set keywords on export (with --exiftool or --sidecar), "
|
||||||
+ "for example, to set a new keyword in format 'folder/subfolder/album' to "
|
+ "for example, to set a new keyword in format 'folder/subfolder/album' to "
|
||||||
+ 'preserve the folder/album structure, you can use --keyword-template "{folder_album}"'
|
+ 'preserve the folder/album structure, you can use --keyword-template "{folder_album}"'
|
||||||
@@ -778,6 +781,7 @@ def query(
|
|||||||
]
|
]
|
||||||
# print help if no non-exclusive term or a double exclusive term is given
|
# print help if no non-exclusive term or a double exclusive term is given
|
||||||
if not any(nonexclusive + [b ^ n for b, n in exclusive]):
|
if not any(nonexclusive + [b ^ n for b, n in exclusive]):
|
||||||
|
click.echo("Incompatible query options", err=True)
|
||||||
click.echo(cli.commands["query"].get_help(ctx), err=True)
|
click.echo(cli.commands["query"].get_help(ctx), err=True)
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -863,7 +867,8 @@ def query(
|
|||||||
@click.option(
|
@click.option(
|
||||||
"--export-as-hardlink",
|
"--export-as-hardlink",
|
||||||
is_flag=True,
|
is_flag=True,
|
||||||
help="Hardlink files instead of copying them. ",
|
help="Hardlink files instead of copying them. "
|
||||||
|
"Cannot be used with --exiftool which creates copies of the files with embedded EXIF data.",
|
||||||
)
|
)
|
||||||
@click.option(
|
@click.option(
|
||||||
"--overwrite",
|
"--overwrite",
|
||||||
@@ -961,7 +966,8 @@ def query(
|
|||||||
is_flag=True,
|
is_flag=True,
|
||||||
help="Use exiftool to write metadata directly to exported photos. "
|
help="Use exiftool to write metadata directly to exported photos. "
|
||||||
"To use this option, exiftool must be installed and in the path. "
|
"To use this option, exiftool must be installed and in the path. "
|
||||||
"exiftool may be installed from https://exiftool.org/",
|
"exiftool may be installed from https://exiftool.org/. "
|
||||||
|
"Cannot be used with --export-as-hardlink.",
|
||||||
)
|
)
|
||||||
@click.option(
|
@click.option(
|
||||||
"--directory",
|
"--directory",
|
||||||
@@ -1082,9 +1088,11 @@ def export(
|
|||||||
(selfie, not_selfie),
|
(selfie, not_selfie),
|
||||||
(panorama, not_panorama),
|
(panorama, not_panorama),
|
||||||
(export_by_date, directory),
|
(export_by_date, directory),
|
||||||
|
(export_as_hardlink, exiftool),
|
||||||
(any(place), no_place),
|
(any(place), no_place),
|
||||||
]
|
]
|
||||||
if any([all(bb) for bb in exclusive]):
|
if any([all(bb) for bb in exclusive]):
|
||||||
|
click.echo("Incompatible export options",err=True)
|
||||||
click.echo(cli.commands["export"].get_help(ctx), err=True)
|
click.echo(cli.commands["export"].get_help(ctx), err=True)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
@@ -243,7 +243,7 @@ def test_export():
|
|||||||
assert sorted(files) == sorted(CLI_EXPORT_FILENAMES)
|
assert sorted(files) == sorted(CLI_EXPORT_FILENAMES)
|
||||||
|
|
||||||
|
|
||||||
def test_export_using_hardlinks():
|
def test_export_as_hardlink():
|
||||||
import glob
|
import glob
|
||||||
import os
|
import os
|
||||||
import os.path
|
import os.path
|
||||||
@@ -263,7 +263,7 @@ def test_export_using_hardlinks():
|
|||||||
assert sorted(files) == sorted(CLI_EXPORT_FILENAMES)
|
assert sorted(files) == sorted(CLI_EXPORT_FILENAMES)
|
||||||
|
|
||||||
|
|
||||||
def test_export_using_hardlinks_samefile():
|
def test_export_as_hardlink_samefile():
|
||||||
# test that --export-as-hardlink actually creates a hardlink
|
# test that --export-as-hardlink actually creates a hardlink
|
||||||
# src and dest should be same file
|
# src and dest should be same file
|
||||||
import os
|
import os
|
||||||
@@ -291,6 +291,32 @@ def test_export_using_hardlinks_samefile():
|
|||||||
assert os.path.exists(CLI_EXPORT_UUID_FILENAME)
|
assert os.path.exists(CLI_EXPORT_UUID_FILENAME)
|
||||||
assert os.path.samefile(CLI_EXPORT_UUID_FILENAME, photo.path)
|
assert os.path.samefile(CLI_EXPORT_UUID_FILENAME, photo.path)
|
||||||
|
|
||||||
|
def test_export_using_hardlinks_incompat_options():
|
||||||
|
# test that error shown if --export-as-hardlink used with --exiftool
|
||||||
|
import os
|
||||||
|
import osxphotos
|
||||||
|
from osxphotos.__main__ import export
|
||||||
|
|
||||||
|
runner = CliRunner()
|
||||||
|
cwd = os.getcwd()
|
||||||
|
photosdb = osxphotos.PhotosDB(dbfile=CLI_PHOTOS_DB)
|
||||||
|
photo = photosdb.photos(uuid=[CLI_EXPORT_UUID])[0]
|
||||||
|
|
||||||
|
# pylint: disable=not-context-manager
|
||||||
|
with runner.isolated_filesystem():
|
||||||
|
result = runner.invoke(
|
||||||
|
export,
|
||||||
|
[
|
||||||
|
os.path.join(cwd, CLI_PHOTOS_DB),
|
||||||
|
".",
|
||||||
|
f"--uuid={CLI_EXPORT_UUID}",
|
||||||
|
"--export-as-hardlink",
|
||||||
|
"--exiftool",
|
||||||
|
"-V",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
assert result.exit_code == 0
|
||||||
|
assert "Incompatible export options" in result.output
|
||||||
|
|
||||||
def test_export_current_name():
|
def test_export_current_name():
|
||||||
import glob
|
import glob
|
||||||
|
|||||||
Reference in New Issue
Block a user