##// END OF EJS Templates
rebase: move actual rebase into a single transaction...
rebase: move actual rebase into a single transaction Previously, rebasing would open several transaction over the course of rebasing several commits. Opening a transaction can have notable overhead (like copying the dirstate) which can add up when rebasing many commits. This patch adds a single large transaction around the actual commit rebase operation, with a catch for intervention which serializes the current state if we need to drop back to the terminal for user intervention. Amazingly, almost all the tests seem to pass. On large repos with large working copies, this can speed up rebasing 7 commits by 25%. I'd expect the percentage to be a bit larger for rebasing even more commits. There are minor test changes because we're rolling back the entire transaction during unexpected exceptions instead of just stopping mid-rebase, so there's no more backup bundle. It also leave an unknown file in the working copy, since our clean up 'hg update' doesn't delete unknown files.

File last commit:

r16556:f9262456 stable
r31226:cf8ad0e6 default
Show More
9diff
42 lines | 1.0 KiB | text/plain | TextLexer
Steven Stallion
plan9: initial support for plan 9 from bell labs...
r16383 #!/bin/rc
# 9diff - Mercurial extdiff wrapper for diff(1)
rfork e
Steven Stallion
plan9: mkfile and 9diff fixes...
r16556 fn getfiles {
cd $1 &&
Steven Stallion
plan9: initial support for plan 9 from bell labs...
r16383 for(f in `{du -as | awk '{print $2}'})
test -f $f && echo `{cleanname $f}
}
Steven Stallion
plan9: mkfile and 9diff fixes...
r16556 fn usage {
Steven Stallion
plan9: initial support for plan 9 from bell labs...
r16383 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 ''