contrib/plan9/9diff
author FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
Sat, 10 Jan 2015 23:18:11 +0900
changeset 23844 ddf2172e901d
parent 16556 f9262456fb01
permissions -rwxr-xr-x
revset: store full detail into revsetalias.error for error source distinction Before this patch, any errors in the declaration of revset alias aren't detected at all, and there is no information about error source in the error message. As a part of preparation for parsing alias declarations and definitions more strictly, this patch stores full detail into "revsetalias.error" for error source distinction. This makes raising "Abort" and warning potential errors just use "revsetalias.error" without any message composing.

#!/bin/rc
# 9diff - Mercurial extdiff wrapper for diff(1)

rfork e

fn getfiles {
	cd $1 &&
	for(f in `{du -as | awk '{print $2}'})
		test -f $f && echo `{cleanname $f}
}

fn usage {
	echo >[1=2] usage: 9diff [diff options] parent child root
	exit usage
}

opts=()
while(~ $1 -*){
	opts=($opts $1)
	shift
}
if(! ~ $#* 3)
	usage

# extdiff will set the parent and child to a single file if there is
# only one change. If there are multiple changes, directories will be
# set. diff(1) does not cope particularly with directories; instead we
# do the recursion ourselves and diff each file individually.
if(test -f $1)
	diff $opts $1 $2
if not{
	# extdiff will create a snapshot of the working copy to prevent
	# conflicts during the diff. We circumvent this behavior by
	# diffing against the repository root to produce plumbable
	# output. This is antisocial.
	for(f in `{sort -u <{getfiles $1} <{getfiles $2}}){
		file1=$1/$f; test -f $file1 || file1=/dev/null
		file2=$3/$f; test -f $file2 || file2=/dev/null
		diff $opts $file1 $file2
	}
}
exit ''