add Gary Bernhardt's run-command-on-git-revisions script
This commit is contained in:
parent
934a8f7465
commit
d41caafce9
1 changed files with 85 additions and 0 deletions
85
run-command-on-git-revisions
Executable file
85
run-command-on-git-revisions
Executable file
|
|
@ -0,0 +1,85 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# This script runs a given command over a range of Git revisions. Note that it
|
||||
# will check past revisions out! Exercise caution if there are important
|
||||
# untracked files in your working tree.
|
||||
#
|
||||
# This came from Gary Bernhardt's dotfiles:
|
||||
# https://github.com/garybernhardt/dotfiles
|
||||
#
|
||||
# Example usage:
|
||||
# $ run-command-on-git-revisions origin/master master 'python runtests.py'
|
||||
|
||||
set -e
|
||||
|
||||
if [[ $1 == -v ]]; then
|
||||
verbose=1
|
||||
shift
|
||||
fi
|
||||
|
||||
start_ref=$1
|
||||
end_ref=$2
|
||||
test_command=$3
|
||||
|
||||
main() {
|
||||
abort_if_dirty_repo
|
||||
enforce_usage
|
||||
run_tests
|
||||
}
|
||||
|
||||
abort_if_dirty_repo() {
|
||||
set +e
|
||||
git diff-index --quiet --cached HEAD
|
||||
if [[ $? -ne 0 ]]; then
|
||||
echo "You have staged but not committed changes that would be lost! Aborting."
|
||||
exit 1
|
||||
fi
|
||||
git diff-files --quiet
|
||||
if [[ $? -ne 0 ]]; then
|
||||
echo "You have unstaged changes that would be lost! Aborting."
|
||||
exit 1
|
||||
fi
|
||||
untracked=$(git ls-files --exclude-standard --others)
|
||||
if [ -n "$untracked" ]; then
|
||||
echo "You have untracked files that could be overwritten! Aborting."
|
||||
exit 1
|
||||
fi
|
||||
set -e
|
||||
}
|
||||
|
||||
enforce_usage() {
|
||||
if [ -z "$test_command" ]; then
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
usage() {
|
||||
echo "usage: `basename $0` start_ref end_ref test_command"
|
||||
}
|
||||
|
||||
run_tests() {
|
||||
revs=`log_command git rev-list --reverse ${start_ref}..${end_ref}`
|
||||
|
||||
for rev in $revs; do
|
||||
debug "Checking out: $(git log --oneline -1 $rev)"
|
||||
log_command git checkout --quiet $rev
|
||||
log_command $test_command
|
||||
log_command git reset --hard --quiet
|
||||
done
|
||||
log_command git checkout --quiet $end_ref
|
||||
debug "OK for all revisions!"
|
||||
}
|
||||
|
||||
log_command() {
|
||||
debug "=> $*"
|
||||
eval "$@"
|
||||
}
|
||||
|
||||
debug() {
|
||||
if [ $verbose ]; then
|
||||
echo $* >&2
|
||||
fi
|
||||
}
|
||||
|
||||
main
|
||||
Loading…
Reference in a new issue