: included from 6002 and others >sed.script # Answer the sha1 has associated with the tag. The tag must exist under refs/tags tag () { _tag=$1 git rev-parse --verify "refs/tags/$_tag" || error "tag: \"$_tag\" does not exist" } # Generate a commit using the text specified to make it unique and the tree # named by the tag specified. unique_commit () { _text=$1 _tree=$2 shift 2 echo "$_text" | git commit-tree $(tag "$_tree") "$@" } # Save the output of a command into the tag specified. Prepend # a substitution script for the tag onto the front of sed.script save_tag () { _tag=$1 test -n "$_tag" || error "usage: save_tag tag commit-args ..." shift 1 git update-ref "refs/tags/$_tag" $("$@") echo "s/$(tag $_tag)/$_tag/g" >sed.script.tmp cat sed.script >>sed.script.tmp rm sed.script mv sed.script.tmp sed.script } # Replace unhelpful sha1 hashes with their symbolic equivalents entag () { sed -f sed.script } # Execute a command after first saving, then setting the GIT_AUTHOR_EMAIL # tag to a specified value. Restore the original value on return. as_author () { _author=$1 shift 1 _save=$GIT_AUTHOR_EMAIL GIT_AUTHOR_EMAIL="$_author" export GIT_AUTHOR_EMAIL "$@" if test -z "$_save" then unset GIT_AUTHOR_EMAIL else GIT_AUTHOR_EMAIL="$_save" export GIT_AUTHOR_EMAIL fi } commit_date () { _commit=$1 git cat-file commit $_commit | sed -n "s/^committer .*> \([0-9]*\) .*/\1/p" } # Assign the value of fake date to a variable, but # allow fairly common "1971-08-16 00:00" to be omittd assign_fake_date () { case "$2" in ??:??:??) eval "$1='1971-08-16 $2'" ;; ??:??) eval "$1='1971-08-16 00:$2'" ;; ??) eval "$1='1971-08-16 00:00:$2'" ;; *) eval "$1='$2'" ;; esac } on_committer_date () { assign_fake_date GIT_COMMITTER_DATE "$1" export GIT_COMMITTER_DATE shift 1 "$@" } on_dates () { assign_fake_date GIT_COMMITTER_DATE "$1" assign_fake_date GIT_AUTHOR_DATE "$2" export GIT_COMMITTER_DATE GIT_AUTHOR_DATE shift 2 "$@" } # Execute a command and suppress any error output. hide_error () { "$@" 2>/dev/null } check_output () { _name=$1 shift 1 if eval "$*" | entag >"$_name.actual" then test_cmp "$_name.expected" "$_name.actual" else return 1 fi } # Turn a reasonable test description into a reasonable test name. # All alphanums translated into -'s which are then compressed and stripped # from front and back. name_from_description () { perl -pe ' s/[^A-Za-z0-9.]/-/g; s/-+/-/g; s/-$//; s/^-//; y/A-Z/a-z/; ' } # Execute the test described by the first argument, by eval'ing # command line specified in the 2nd argument. Check the status code # is zero and that the output matches the stream read from # stdin. test_output_expect_success() { _description=$1 _test=$2 test $# -eq 2 || error "usage: test_output_expect_success description test <<EOF ... EOF" _name=$(echo $_description | name_from_description) cat >"$_name.expected" test_expect_success "$_description" "check_output $_name \"$_test\"" }