KaleidoscopeMod / hg

#!/usr/bin/env bash

# Try to match the temp dir to a revision, so we can use that as a label

REVISION_REGEX="^[^/]+\.([a-f0-9]{12,12})(/|$)"

if [[ "$1" =~ $REVISION_REGEX ]]; then
	LABEL1_SUFFIX=" (${BASH_REMATCH[1]})"
fi

if [[ "$2" =~ $REVISION_REGEX ]]; then
	LABEL2_SUFFIX=" (${BASH_REMATCH[1]})"
fi

# If it's not a directory, just forward it to ksdiff
if [ ! -d "$1" ]; then
	ksdiff "$1" --label "$1$LABEL1_SUFFIX" "$2" --label "$2$LABEL2_SUFFIX"
	exit
fi

OLD_DIR="$1"
NEW_DIR="$2"

(cd "$OLD_DIR" && find . -print0) | while read -d $'\0' file; do
	# Don't do anything with directories
	if [ -d "$OLD_DIR/$file" ]; then
		continue
	fi

	# Make sure we have to do with files here
	if [ ! -f "$OLD_DIR/$file" ]; then
		echo "I'm not sure what this is, skipping it: $OLD_DIR/$file"
		continue
	fi

	if [ -e "$NEW_DIR/$file" ]; then
		# Diff the old file with the new file
		ksdiff "$OLD_DIR/$file" --label "$file$LABEL1_SUFFIX" --snapshot "$NEW_DIR/$file" --label "$file$LABEL2_SUFFIX" --snapshot $LABEL2
	else # File does not exist
		tempname=`basename $file`
        TMPFILE=`mktemp -t ${tempname}`
		EXT=${file##*.}
		TMPFILEEXT="$TMPFILE.$EXT"
		mv $TMPFILE $TMPFILEEXT
		ksdiff "$OLD_DIR/$file" --label "$file (remove)" "$TMPFILEEXT" --label "$file"
	fi
done

# We have diffed all existing files in A with the existing files in B.
# We still have to describe the files that were added in B
(cd "$NEW_DIR" && find . -print0) | while read -d $'\0' file; do
	if [ -f "$NEW_DIR/$file" ] && [ ! -e "$OLD_DIR/$file" ]; then
		tempname=`basename $file`
        TMPFILE=`mktemp -t ${tempname}`
		EXT=${file##*.}
		TMPFILEEXT="$TMPFILE.$EXT" 
		mv $TMPFILE $TMPFILEEXT
		ksdiff "$TMPFILEEXT" --label "$file (add)" "$NEW_DIR/$file" --label "$file$LABEL2_SUFFIX"
	fi
done
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.