changeset 2705:beda48f55142

Fix #577: give user warning/error when it is impossible to update EXIF orientation https://github.com/BestImageViewer/geeqie/issues/577 Insert [ $? != 0 ] after all calls to exiv2, exiftran and mogrify
author Colin Clark <colin.clark@cclark.uk>
date Sun, 21 Jan 2018 17:26:55 +0000
parents fe3d652a8b5b
children 3040da7c5c35
files plugins/rotate/geeqie-rotate src/layout_util.c
diffstat 2 files changed, 58 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/plugins/rotate/geeqie-rotate	Wed Jan 17 16:42:48 2018 +0000
+++ b/plugins/rotate/geeqie-rotate	Sun Jan 21 17:26:55 2018 +0000
@@ -11,38 +11,57 @@
     [ "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_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 @@
         # 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 @@
 				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
--- a/src/layout_util.c	Wed Jan 17 16:42:48 2018 +0000
+++ b/src/layout_util.c	Sun Jan 21 17:26:55 2018 +0000
@@ -521,13 +521,20 @@
 			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);