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