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