Files
git-diff-image/git_diff_image

87 lines
1.3 KiB
Bash
Executable File

#!/bin/bash
set -euo pipefail
name="$1"
f1="$2"
f2="$5"
name1="a/$name"
name2="b/$name"
ext="${name##*.}"
if [ "$f1" = /dev/null ]
then
name1=/dev/null
fi
if [ "$f2" = /dev/null ]
then
name2=/dev/null
fi
if diff "$f1" "$f2" >/dev/null
then
exit 0
fi
exif() {
if [ "$1" = /dev/null ]
then
echo /dev/null
return
fi
local b=$(basename "$1")
local d=$(mktemp -t "$b")
exiftool "$1" | grep -v "File Name" | \
grep -v "Directory" | \
grep -v "File Inode Change" | \
grep -v "File Modification Date/Time" | \
grep -v "File Permissions" \
>"$d"
echo "$d"
}
diff_clean_names() {
diff -u "$1" --label "$name1" "$2" --label "$name2" || true
}
if which -s exiftool
then
d1=$(exif "$f1")
d2=$(exif "$f2")
diff_clean_names "$d1" "$d2"
else
diff_clean_names "$f1" "$f2"
fi
if [ -z "${GIT_DIFF_IMAGE_ENABLED-}" ] || \
! which -s compare || \
! which -s montage
then
exit 0
fi
if compare "$f1" "$f2" /dev/null
then
exit 0
fi
bn=$(basename "$f1")
destfile=$(mktemp -t "$bn").png
fuzz=
if [ "$ext" = "jpeg" ] || [ "$ext" = "jpg" ]
then
fuzz='-fuzz 5%'
fi
compare $fuzz "$f1" "$f2" png:- | \
montage -geometry +4+4 "$f1" - "$f2" png:- >"$destfile" 2>/dev/null || true
open "$destfile"