Fix #577: give user warning/error when it is impossible to update EXIF orientation
authorColin Clark <colin.clark@cclark.uk>
Sun, 21 Jan 2018 17:26:55 +0000 (17:26 +0000)
committerColin Clark <colin.clark@cclark.uk>
Sun, 21 Jan 2018 17:26:55 +0000 (17:26 +0000)
https://github.com/BestImageViewer/geeqie/issues/577

Insert [ $? != 0 ] after all calls to exiv2, exiftran and mogrify

plugins/rotate/geeqie-rotate
src/layout_util.c

index ec82cc0..0bfa425 100755 (executable)
@@ -11,38 +11,57 @@ rotate()
     [ "x$ext" = "x" ] && return 1 #no extension
 
     gq_metadata="$GQ_METADATA_DIR/$1.gq.xmp"
-    if [ -f "$gq_metadata" ]; then
-       gq_orientation=`exiv2 -PXkv "$gq_metadata"|grep Xmp.tiff.Orientation|sed -e "s|Xmp.tiff.Orientation *||"`
+    if [ -f "$gq_metadata" ] ; then
+               gq_orientation=`exiv2 -PXkv "$gq_metadata"|grep Xmp.tiff.Orientation|sed -e "s|Xmp.tiff.Orientation *||"`
+               [ $? != 0 ] && exit 1
     else
-       gq_orientation=
+               gq_orientation=
     fi
 
     case "$ext" in
        jpg|jpeg) 
-               [ -n "$gq_orientation" ] && exiv2 -M "set Exif.Image.Orientation $gq_orientation" "$1"
+               if [ -n "$gq_orientaqtion" ] ; then
+                       exiv2 -M "set Exif.Image.Orientation $gq_orientation" "$1"
+                       [ $? != 0 ] && exit 1
+               fi
                if exiftran -aip "$1" ; then
                    # exiftran ignores xmp, set it manually
                    exiv2 -M "set Xmp.tiff.Orientation 1" "$1"
+                       [ $? != 0 ] && exit 1
                    #http://dev.exiv2.org/issues/show/639
-                   [ -n "$gq_orientation" ] && exiv2 -M "set Xmp.tiff.Orientation 1" \
-                                                     -M "set Exif.Image.Orientation 1" "$gq_metadata"
+                       if [ -n "$gq_orientation" ] ; then
+                               exiv2 -M "set Xmp.tiff.Orientation 1" \
+                                                               -M "set Exif.Image.Orientation 1" "$gq_metadata"
+                               [ $? != 0 ] && exit 1
+                       fi
                    return 0
+               else
+                       exit 1
                fi
                ;;
        
        tif|tiff|png)
-               [ -n "$gq_orientation" ] && exiv2 -M "set Exif.Image.Orientation $gq_orientation" "$1"
+               if [ -n "$gq_orientation" ] ; then
+                       exiv2 -M "set Exif.Image.Orientation $gq_orientation" "$1"
+                       [ $? != 0 ] && exit 1
+               fi
                if mogrify -auto-orient "$1" ; then
                    # mogrify ignores xmp, set it manually
                    exiv2 -M "set Xmp.tiff.Orientation 1" "$1"
+                       [ $? != 0 ] && exit 1
                    #http://dev.exiv2.org/issues/show/639
-                   [ -n "$gq_orientation" ] && exiv2 -M "set Xmp.tiff.Orientation 1" \
-                                                     -M "set Exif.Image.Orientation 1" "$gq_metadata"
+                       if [ -n "$gq_orientation" ] ; then
+                               exiv2 -M "set Xmp.tiff.Orientation 1" \
+                                                               -M "set Exif.Image.Orientation 1" "$gq_metadata"
+                               [ $? != 0 ] && exit 1
+                       fi
                    return 0
+               else
+                       exit 1
                fi
                ;;
        *)      #not supported
-               return 0
+               return 4
                ;;
     esac
 }
@@ -50,17 +69,19 @@ rotate()
 rotate_image_file()
 {
        ext=`echo "${3##*.}" |tr "[:upper:]" "[:lower:]"`
-       [ "x$ext" = "x" ] && return 4 #no extension
+       [ "x$ext" = "x" ] && return 1 #no extension
 
        case "$ext" in
        jpg|jpeg)
                exiftran -i "$1" "$3"
-               return 0
+               [ $? != 0 ]  && return 6
+               return 0;
                ;;
 
        tif|tiff|png)
                mogrify $2 "$3"
-               return 0
+               [ $? != 0 ]  && return 7
+               return 0;
                ;;
 
        *)      #not supported
@@ -131,9 +152,15 @@ for file in "$@" ; do
         # get the sidecars:
         geeqie -r --get-sidecars:"$file" |while read sidecar ; do
             # the main file is included in the sidecar file list, no special handling is required
+                       [ ! -w "$sidecar" ] && exit 5
             rotate "$sidecar"
+                       ret=$?
         done
+               # Bourne shell runs DO loops in a sub-shell
+               ret=$?
+               [ $ret != 0 ] && exit $ret
     else
+               [ ! -w "$file" ] && exit 5
                if [ -n "$rotate_image_file" ] ; then
                        if [ -n "$preserve_mtime" ] ; then
                                mtime=`mktemp /tmp/geeqie-rotate.XXXXXXXXXX` || exit 3
@@ -147,12 +174,13 @@ for file in "$@" ; do
                                touch --reference="$mtime" "$file"
                                rm "$mtime"
                        fi
-                       if [ $ret -eq 4 ] ; then
-                               exit 4
-                       fi
+                       [ $ret != 0 ]  && exit $ret
                else
                        rotate "$file"
+                       ret=$?
+                       [ $ret != 0 ] && exit $ret
                fi
     fi
 done
 
+exit 0
index f91a1f2..d82f782 100644 (file)
@@ -521,13 +521,20 @@ static void layout_menu_write_rotate(GtkToggleAction *action, gpointer data, gbo
                        message = g_string_new("");
                        message = g_string_append(message, _("Operation failed:\n"));
 
-                       if (run_result == 3)
-                               message = g_string_append(message, _("Cannot create tmp file"));
-                       else
-                               {
-                               message = g_string_append(message, _("File: "));
-                               message = g_string_append(message, fd_n->name);
-                               }
+                       if (run_result == 1)
+                               message = g_string_append(message, _("No file extension\n"));
+                       else if (run_result == 3)
+                               message = g_string_append(message, _("Cannot create tmp file\n"));
+                       else if (run_result == 4)
+                               message = g_string_append(message, _("Operation not supported for filetype\n"));
+                       else if (run_result == 5)
+                               message = g_string_append(message, _("File is not writable\n"));
+                       else if (run_result == 6)
+                               message = g_string_append(message, _("Exiftran error\n"));
+                       else if (run_result == 7)
+                               message = g_string_append(message, _("Mogrify error\n"));
+
+                       message = g_string_append(message, fd_n->name);
 
                        gd = generic_dialog_new(_("Image orientation"),
                        "Image orientation", NULL, TRUE, NULL, NULL);