1: included from 6002 and others
2
3>sed.script
4
5# Answer the sha1 has associated with the tag. The tag must exist under refs/tags
6tag () {
7	_tag=$1
8	git rev-parse --verify "refs/tags/$_tag" ||
9	error "tag: \"$_tag\" does not exist"
10}
11
12# Generate a commit using the text specified to make it unique and the tree
13# named by the tag specified.
14unique_commit () {
15	_text=$1
16	_tree=$2
17	shift 2
18	echo "$_text" | git commit-tree $(tag "$_tree") "$@"
19}
20
21# Save the output of a command into the tag specified. Prepend
22# a substitution script for the tag onto the front of sed.script
23save_tag () {
24	_tag=$1
25	test -n "$_tag" || error "usage: save_tag tag commit-args ..."
26	shift 1
27
28	git update-ref "refs/tags/$_tag" $("$@")
29
30	echo "s/$(tag $_tag)/$_tag/g" >sed.script.tmp
31	cat sed.script >>sed.script.tmp
32	rm sed.script
33	mv sed.script.tmp sed.script
34}
35
36# Replace unhelpful sha1 hashes with their symbolic equivalents
37entag () {
38	sed -f sed.script
39}
40
41# Execute a command after first saving, then setting the GIT_AUTHOR_EMAIL
42# tag to a specified value. Restore the original value on return.
43as_author () {
44	_author=$1
45	shift 1
46	_save=$GIT_AUTHOR_EMAIL
47
48	GIT_AUTHOR_EMAIL="$_author"
49	export GIT_AUTHOR_EMAIL
50	"$@"
51	if test -z "$_save"
52	then
53		unset GIT_AUTHOR_EMAIL
54	else
55		GIT_AUTHOR_EMAIL="$_save"
56		export GIT_AUTHOR_EMAIL
57	fi
58}
59
60commit_date () {
61	_commit=$1
62	git cat-file commit $_commit |
63	sed -n "s/^committer .*> \([0-9]*\) .*/\1/p"
64}
65
66# Assign the value of fake date to a variable, but
67# allow fairly common "1971-08-16 00:00" to be omittd
68assign_fake_date () {
69	case "$2" in
70	??:??:??)	eval "$1='1971-08-16 $2'" ;;
71	??:??)		eval "$1='1971-08-16 00:$2'" ;;
72	??)		eval "$1='1971-08-16 00:00:$2'" ;;
73	*)		eval "$1='$2'" ;;
74	esac
75}
76
77on_committer_date () {
78	assign_fake_date GIT_COMMITTER_DATE "$1"
79	export GIT_COMMITTER_DATE
80	shift 1
81	"$@"
82}
83
84on_dates () {
85	assign_fake_date GIT_COMMITTER_DATE "$1"
86	assign_fake_date GIT_AUTHOR_DATE "$2"
87	export GIT_COMMITTER_DATE GIT_AUTHOR_DATE
88	shift 2
89	"$@"
90}
91
92# Execute a command and suppress any error output.
93hide_error () {
94	"$@" 2>/dev/null
95}
96
97check_output () {
98	_name=$1
99	shift 1
100	if eval "$*" | entag >"$_name.actual"
101	then
102		test_cmp "$_name.expected" "$_name.actual"
103	else
104		return 1
105	fi
106}
107
108# Turn a reasonable test description into a reasonable test name.
109# All alphanums translated into -'s which are then compressed and stripped
110# from front and back.
111name_from_description () {
112	perl -pe '
113		s/[^A-Za-z0-9.]/-/g;
114		s/-+/-/g;
115		s/-$//;
116		s/^-//;
117		y/A-Z/a-z/;
118	'
119}
120
121
122# Execute the test described by the first argument, by eval'ing
123# command line specified in the 2nd argument. Check the status code
124# is zero and that the output matches the stream read from
125# stdin.
126test_output_expect_success()
127{
128	_description=$1
129	_test=$2
130	test $# -eq 2 ||
131	error "usage: test_output_expect_success description test <<EOF ... EOF"
132
133	_name=$(echo $_description | name_from_description)
134	cat >"$_name.expected"
135	test_expect_success "$_description" "check_output $_name \"$_test\""
136}
137