Added.
This commit is contained in:
		
							
								
								
									
										37
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										37
									
								
								README.md
									
									
									
									
									
								
							| @ -3,6 +3,43 @@ git-diff-image | |||||||
|  |  | ||||||
| This is an extension to 'git diff' that provides support for diffing images. | This is an extension to 'git diff' that provides support for diffing images. | ||||||
|  |  | ||||||
|  | Platforms | ||||||
|  | --------- | ||||||
|  |  | ||||||
|  | Only OS X at the moment.  Patches welcome! | ||||||
|  |  | ||||||
|  | Examples | ||||||
|  | -------- | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  | $ git diff | ||||||
|  | --- a/anImageThatHasChanged.jpg | ||||||
|  | +++ b/anImageThatHasChanged.jpg | ||||||
|  | @@ -1,5 +1,5 @@ | ||||||
|  |  ExifTool Version Number         : 9.76 | ||||||
|  | -File Size                       : 133 kB | ||||||
|  | +File Size                       : 54 kB | ||||||
|  |  File Access Date/Time           : 2015:05:02 20:01:21-07:00 | ||||||
|  |  File Type                       : JPEG | ||||||
|  |  MIME Type                       : image/jpeg | ||||||
|  |  | ||||||
|  | $ git diff-image | ||||||
|  | # The same output as above, *and* a montage of the visual differences will be | ||||||
|  | # generated and opened in Preview. | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | Installation | ||||||
|  | ------------ | ||||||
|  |  | ||||||
|  | Install exiftool and ImageMagick.  (The script will cope with these missing, | ||||||
|  | but it's not going to be very exciting without them.) | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  | brew install exiftool imagemagick | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | Run the install script, which will configure your global git config for you. | ||||||
|  |  | ||||||
| Public domain dedication | Public domain dedication | ||||||
| ------------------------ | ------------------------ | ||||||
|  |  | ||||||
|  | |||||||
							
								
								
									
										64
									
								
								git_diff_image
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										64
									
								
								git_diff_image
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,64 @@ | |||||||
|  | #!/bin/bash | ||||||
|  |  | ||||||
|  | set -eu | ||||||
|  | set -o pipefail | ||||||
|  |  | ||||||
|  | name="$1" | ||||||
|  | f1="$2" | ||||||
|  | f2="$5" | ||||||
|  |  | ||||||
|  | name1="a/$name" | ||||||
|  | name2="b/$name" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | if diff "$f1" "$f2" >/dev/null | ||||||
|  | then | ||||||
|  |   exit 0 | ||||||
|  | fi | ||||||
|  |  | ||||||
|  |  | ||||||
|  | exif() { | ||||||
|  |   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 | ||||||
|  |  | ||||||
|  | compare "$f1" "$f2" png:- | \ | ||||||
|  |   montage -geometry +4+4 "$f1" - "$f2" png:- >"$destfile" 2>/dev/null || true | ||||||
|  | open "$destfile" | ||||||
							
								
								
									
										77
									
								
								install.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										77
									
								
								install.sh
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,77 @@ | |||||||
|  | #!/bin/bash | ||||||
|  |  | ||||||
|  | set -eu | ||||||
|  | set -o pipefail | ||||||
|  |  | ||||||
|  | cols=$(tput cols) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | readlink_f() { | ||||||
|  |   if [ $(uname) = 'Darwin' ] | ||||||
|  |   then | ||||||
|  |     local d=$(echo "${1%/*}") | ||||||
|  |     local f=$(basename "$1") | ||||||
|  |     (cd "$d" && echo "$(pwd -P)/$f") | ||||||
|  |   else | ||||||
|  |     readlink -f "$1" | ||||||
|  |   fi | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | addattr() { | ||||||
|  |   ext="$1" | ||||||
|  |  | ||||||
|  |   if ! grep -qE "^\*.$ext diff=image\$" "$attributesfile" | ||||||
|  |   then | ||||||
|  |     if grep -qE "^\*.$ext" "$attributesfile" | ||||||
|  |     then | ||||||
|  |       fold -s -w$cols >&2 <<EOS | ||||||
|  | $attributesfile already has *.$ext configured, but not the way that this script requires. | ||||||
|  |  | ||||||
|  | If you want to use git-image-diff with $ext files, you must add a diff=image attribute yourself. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | EOS | ||||||
|  |     else | ||||||
|  |       echo "+ echo '*.$ext diff=image' >>'$attributesfile'" | ||||||
|  |       echo "*.$ext diff=image" >>"$attributesfile" | ||||||
|  |     fi | ||||||
|  |   fi | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | thisdir=$(dirname $(readlink_f "$0")) | ||||||
|  | thisdir_tilde="${thisdir/#$HOME/~}" | ||||||
|  |  | ||||||
|  | attributesfile_tilde=$(git config --global core.attributesfile || true) | ||||||
|  | attributesfile="${attributesfile_tilde/#\~/$HOME}" | ||||||
|  | if [ -z "$attributesfile" ] | ||||||
|  | then | ||||||
|  |   attributesfile="$HOME/.gitattributes" | ||||||
|  |   attributesfile_tilde="~/.gitattributes" | ||||||
|  |   echo "+ git config --global core.attributesfile '$attributesfile_tilde'" | ||||||
|  |   git config --global core.attributesfile "$attributesfile_tilde" | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | if [ ! -f "$attributesfile" ] | ||||||
|  | then | ||||||
|  |   if [ ! -e "$attributesfile" ] | ||||||
|  |   then | ||||||
|  |     echo "+ touch '$attributesfile'" | ||||||
|  |     touch "$attributesfile" | ||||||
|  |   else | ||||||
|  |     echo "$attributesfile is not a regular file!  I give up." >&2 | ||||||
|  |     exit 1 | ||||||
|  |   fi | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | addattr gif | ||||||
|  | addattr jpeg | ||||||
|  | addattr jpg | ||||||
|  | addattr png | ||||||
|  |  | ||||||
|  | echo '+ git config --global alias.diff-image '"'"'!f() { GIT_DIFF_IMAGE_ENABLED=1 git diff "$@"; }; f'"'" | ||||||
|  | git config --global alias.diff-image '!f() { GIT_DIFF_IMAGE_ENABLED=1 git diff "$@"; }; f' | ||||||
|  |  | ||||||
|  | echo "+ git config --global diff.image.command '$thisdir_tilde/git_diff_image'" | ||||||
|  | git config --global diff.image.command "$thisdir_tilde/git_diff_image" | ||||||
		Reference in New Issue
	
	Block a user