image-dired: Signal an error before calling a missing executable

Reverts commit ca473907
Add a defun to check if an executable exists, and call it
on each function using an external program: when the executable
is not available signal an error.
See discussion on:
https://lists.gnu.org/archive/html/emacs-devel/2016-09/msg00135.html
* lisp/image-dired.el (image-dired--check-executable-exists): New defun.
Throw and error when the executable arg is missing.
(image-dired-display-image, image-dired-rotate-thumbnail)
(image-dired-rotate-original, image-dired-set-exif-data)
(image-dired-get-exif-data):
Use it.
This commit is contained in:
Tino Calancha 2016-09-13 04:28:42 +09:00
parent 2675c79db5
commit 5d7433aba3

View file

@ -224,7 +224,7 @@ expects to find pictures in this directory."
:group 'image-dired) :group 'image-dired)
(defcustom image-dired-cmd-create-thumbnail-program (defcustom image-dired-cmd-create-thumbnail-program
(executable-find "convert") "convert"
"Executable used to create thumbnail. "Executable used to create thumbnail.
Used together with `image-dired-cmd-create-thumbnail-options'." Used together with `image-dired-cmd-create-thumbnail-options'."
:type 'string :type 'string
@ -242,7 +242,7 @@ which is replaced by the file name of the thumbnail file."
:group 'image-dired) :group 'image-dired)
(defcustom image-dired-cmd-create-temp-image-program (defcustom image-dired-cmd-create-temp-image-program
(executable-find "convert") "convert"
"Executable used to create temporary image. "Executable used to create temporary image.
Used together with `image-dired-cmd-create-temp-image-options'." Used together with `image-dired-cmd-create-temp-image-options'."
:type 'string :type 'string
@ -308,7 +308,7 @@ with the information required by the Thumbnail Managing Standard."
:group 'image-dired) :group 'image-dired)
(defcustom image-dired-cmd-rotate-thumbnail-program (defcustom image-dired-cmd-rotate-thumbnail-program
(executable-find "mogrify") "mogrify"
"Executable used to rotate thumbnail. "Executable used to rotate thumbnail.
Used together with `image-dired-cmd-rotate-thumbnail-options'." Used together with `image-dired-cmd-rotate-thumbnail-options'."
:type 'string :type 'string
@ -326,20 +326,14 @@ of the thumbnail file."
:group 'image-dired) :group 'image-dired)
(defcustom image-dired-cmd-rotate-original-program (defcustom image-dired-cmd-rotate-original-program
(cond ((executable-find "jpegtran")) "jpegtran"
((executable-find "convert")))
"Executable used to rotate original image. "Executable used to rotate original image.
Used together with `image-dired-cmd-rotate-original-options'." Used together with `image-dired-cmd-rotate-original-options'."
:type 'string :type 'string
:group 'image-dired) :group 'image-dired)
(defcustom image-dired-cmd-rotate-original-options (defcustom image-dired-cmd-rotate-original-options
(when image-dired-cmd-rotate-original-program "%p -rotate %d -copy all -outfile %t \"%o\""
(pcase image-dired-cmd-rotate-original-program
((pred (lambda (x) (string-match-p "jpegtran" x)))
"%p -rotate %d -copy all -outfile %t \"%o\"")
((pred (lambda (x) (string-match-p "convert" x)))
"%p -rotate %d \"%o\" %t")))
"Format of command used to rotate original image. "Format of command used to rotate original image.
Available options are %p which is replaced by Available options are %p which is replaced by
`image-dired-cmd-rotate-original-program', %d which is replaced by the `image-dired-cmd-rotate-original-program', %d which is replaced by the
@ -364,7 +358,7 @@ original file with `image-dired-temp-rotate-image-file'."
:group 'image-dired) :group 'image-dired)
(defcustom image-dired-cmd-write-exif-data-program (defcustom image-dired-cmd-write-exif-data-program
(executable-find "exiftool") "exiftool"
"Program used to write EXIF data to image. "Program used to write EXIF data to image.
Used together with `image-dired-cmd-write-exif-data-options'." Used together with `image-dired-cmd-write-exif-data-options'."
:type 'string :type 'string
@ -381,7 +375,7 @@ which is replaced by the tag value."
:group 'image-dired) :group 'image-dired)
(defcustom image-dired-cmd-read-exif-data-program (defcustom image-dired-cmd-read-exif-data-program
(executable-find "exiftool") "exiftool"
"Program used to read EXIF data to image. "Program used to read EXIF data to image.
Used together with `image-dired-cmd-read-exif-data-program-options'." Used together with `image-dired-cmd-read-exif-data-program-options'."
:type 'string :type 'string
@ -619,10 +613,14 @@ according to the Thumbnail Managing Standard."
(file-name-base f) (file-name-base f)
(file-name-extension f)))))) (file-name-extension f))))))
(defun image-dired--check-executable-exists (executable)
(unless (executable-find (symbol-value executable))
(error "Executable %S not found" executable)))
(defun image-dired-create-thumb (original-file thumbnail-file) (defun image-dired-create-thumb (original-file thumbnail-file)
"For ORIGINAL-FILE, create thumbnail image named THUMBNAIL-FILE." "For ORIGINAL-FILE, create thumbnail image named THUMBNAIL-FILE."
(unless image-dired-cmd-create-thumbnail-program (image-dired--check-executable-exists
(error "image-dired-cmd-create-thumbnail-program is nil")) 'image-dired-cmd-create-thumbnail-program)
(let* ((width (int-to-string image-dired-thumb-width)) (let* ((width (int-to-string image-dired-thumb-width))
(height (int-to-string image-dired-thumb-height)) (height (int-to-string image-dired-thumb-height))
(modif-time (format "%.0f" (float-time (nth 5 (file-attributes (modif-time (format "%.0f" (float-time (nth 5 (file-attributes
@ -1812,6 +1810,8 @@ should feel snappy enough.
If optional argument ORIGINAL-SIZE is non-nil, display image in its If optional argument ORIGINAL-SIZE is non-nil, display image in its
original size." original size."
(image-dired--check-executable-exists
'image-dired-cmd-create-temp-image-program)
(let ((new-file (expand-file-name image-dired-temp-image-file)) (let ((new-file (expand-file-name image-dired-temp-image-file))
width height command ret width height command ret
(image-type 'jpeg)) (image-type 'jpeg))
@ -1820,8 +1820,6 @@ original size."
(progn (progn
(setq width (image-dired-display-window-width)) (setq width (image-dired-display-window-width))
(setq height (image-dired-display-window-height)) (setq height (image-dired-display-window-height))
(unless image-dired-cmd-create-temp-image-program
(error "image-dired-cmd-create-temp-image-program is nil"))
(setq command (setq command
(format-spec (format-spec
image-dired-cmd-create-temp-image-options image-dired-cmd-create-temp-image-options
@ -1878,8 +1876,8 @@ With prefix argument ARG, display image in its original size."
(defun image-dired-rotate-thumbnail (degrees) (defun image-dired-rotate-thumbnail (degrees)
"Rotate thumbnail DEGREES degrees." "Rotate thumbnail DEGREES degrees."
(unless image-dired-cmd-rotate-thumbnail-program (image-dired--check-executable-exists
(error "image-dired-cmd-rotate-thumbnail-program is nil")) 'image-dired-cmd-rotate-thumbnail-program)
(if (not (image-dired-image-at-point-p)) (if (not (image-dired-image-at-point-p))
(message "No thumbnail at point") (message "No thumbnail at point")
(let ((file (image-dired-thumb-name (image-dired-original-file-name))) (let ((file (image-dired-thumb-name (image-dired-original-file-name)))
@ -1922,33 +1920,33 @@ overwritten. This confirmation can be turned off using
(defun image-dired-rotate-original (degrees) (defun image-dired-rotate-original (degrees)
"Rotate original image DEGREES degrees." "Rotate original image DEGREES degrees."
(unless (image-dired-image-at-point-p) (image-dired--check-executable-exists
(message "No image at point")) 'image-dired-cmd-rotate-original-program)
(unless image-dired-cmd-rotate-original-program (if (not (image-dired-image-at-point-p))
(error "image-dired-cmd-rotate-original-program is nil")) (message "No image at point")
(let ((file (image-dired-original-file-name)) (let ((file (image-dired-original-file-name))
command) command)
(unless (eq 'jpeg (image-type file)) (unless (eq 'jpeg (image-type file))
(error "Only JPEG images can be rotated!")) (error "Only JPEG images can be rotated!"))
(setq command (format-spec (setq command (format-spec
image-dired-cmd-rotate-original-options image-dired-cmd-rotate-original-options
(list (list
(cons ?p image-dired-cmd-rotate-original-program) (cons ?p image-dired-cmd-rotate-original-program)
(cons ?d degrees) (cons ?d degrees)
(cons ?o (expand-file-name file)) (cons ?o (expand-file-name file))
(cons ?t image-dired-temp-rotate-image-file)))) (cons ?t image-dired-temp-rotate-image-file))))
(if (not (= 0 (call-process shell-file-name nil nil nil (if (not (= 0 (call-process shell-file-name nil nil nil
shell-command-switch command))) shell-command-switch command)))
(error "Could not rotate image") (error "Could not rotate image")
(image-dired-display-image image-dired-temp-rotate-image-file) (image-dired-display-image image-dired-temp-rotate-image-file)
(if (or (and image-dired-rotate-original-ask-before-overwrite (if (or (and image-dired-rotate-original-ask-before-overwrite
(y-or-n-p (y-or-n-p
"Rotate to temp file OK. Overwrite original image? ")) "Rotate to temp file OK. Overwrite original image? "))
(not image-dired-rotate-original-ask-before-overwrite)) (not image-dired-rotate-original-ask-before-overwrite))
(progn (progn
(copy-file image-dired-temp-rotate-image-file file t) (copy-file image-dired-temp-rotate-image-file file t)
(image-dired-refresh-thumb)) (image-dired-refresh-thumb))
(image-dired-display-image file))))) (image-dired-display-image file))))))
(defun image-dired-rotate-original-left () (defun image-dired-rotate-original-left ()
"Rotate original image left (counter clockwise) 90 degrees." "Rotate original image left (counter clockwise) 90 degrees."
@ -1995,15 +1993,15 @@ default value at the prompt."
(old-value (image-dired-get-exif-data file "ImageDescription"))) (old-value (image-dired-get-exif-data file "ImageDescription")))
(if (eq 0 (if (eq 0
(image-dired-set-exif-data file "ImageDescription" (image-dired-set-exif-data file "ImageDescription"
(read-string "Value of ImageDescription: " (read-string "Value of ImageDescription: "
old-value))) old-value)))
(message "Successfully wrote ImageDescription tag.") (message "Successfully wrote ImageDescription tag.")
(error "Could not write ImageDescription tag"))))) (error "Could not write ImageDescription tag")))))
(defun image-dired-set-exif-data (file tag-name tag-value) (defun image-dired-set-exif-data (file tag-name tag-value)
"In FILE, set EXIF tag TAG-NAME to value TAG-VALUE." "In FILE, set EXIF tag TAG-NAME to value TAG-VALUE."
(unless image-dired-cmd-write-exif-data-program (image-dired--check-executable-exists
(error "image-dired-cmd-write-exif-data-program is nil")) 'image-dired-cmd-write-exif-data-program)
(let (command) (let (command)
(setq command (format-spec (setq command (format-spec
image-dired-cmd-write-exif-data-options image-dired-cmd-write-exif-data-options
@ -2016,8 +2014,8 @@ default value at the prompt."
(defun image-dired-get-exif-data (file tag-name) (defun image-dired-get-exif-data (file tag-name)
"From FILE, return EXIF tag TAG-NAME." "From FILE, return EXIF tag TAG-NAME."
(unless image-dired-cmd-read-exif-data-program (image-dired--check-executable-exists
(error "image-dired-cmd-read-exif-data-program is nil")) 'image-dired-cmd-read-exif-data-program)
(let ((buf (get-buffer-create "*image-dired-get-exif-data*")) (let ((buf (get-buffer-create "*image-dired-get-exif-data*"))
command tag-value) command tag-value)
(setq command (format-spec (setq command (format-spec