view contrib/plan9/9diff @ 42423:0ae593e791fb

profiling: show actual time spent in hotpath display To get, for instance: ... \ 6.6% 4.08s lock.py: __exit__ line 1566: ... | 6.5% 4.01s exchange.py: close line 1191: ... | 6.5% 4.01s transaction.py: _active line 1443: ... | 6.5% 4.01s transaction.py: close line 47: ... | 6.2% 3.84s scmutil.py: wrapped line 529: ... | 6.2% 3.81s localrepo.py: wrapper line 2114: ... | 6.2% 3.81s localrepo.py: updatecaches line 177: ... ... instead of: ... \ 6.6% lock.py: __exit__ line 1566: ... | 6.5% exchange.py: close line 1191: ... | 6.5% transaction.py: _active line 1443: ... | 6.5% transaction.py: close line 47: ... | 6.2% scmutil.py: wrapped line 529: ... | 6.2% localrepo.py: wrapper line 2114: ... | 6.2% localrepo.py: updatecaches line 177: ... ... I find that if it's not displayed, I frequently end up estimating the numbers by hand. Differential Revision: https://phab.mercurial-scm.org/D6477
author Valentin Gatien-Baron <vgatien-baron@janestreet.com>
date Wed, 05 Jun 2019 12:51:21 -0400
parents f9262456fb01
children
line wrap: on
line source

#!/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 ''