negative-refspec: fix segfault on : refspec
[git] / t / t1416-ref-transaction-hooks.sh
1 #!/bin/sh
2
3 test_description='reference transaction hooks'
4
5 . ./test-lib.sh
6
7 test_expect_success setup '
8         mkdir -p .git/hooks &&
9         test_commit PRE &&
10         test_commit POST &&
11         POST_OID=$(git rev-parse POST)
12 '
13
14 test_expect_success 'hook allows updating ref if successful' '
15         test_when_finished "rm .git/hooks/reference-transaction" &&
16         git reset --hard PRE &&
17         write_script .git/hooks/reference-transaction <<-\EOF &&
18                 echo "$*" >>actual
19         EOF
20         cat >expect <<-EOF &&
21                 prepared
22                 committed
23         EOF
24         git update-ref HEAD POST &&
25         test_cmp expect actual
26 '
27
28 test_expect_success 'hook aborts updating ref in prepared state' '
29         test_when_finished "rm .git/hooks/reference-transaction" &&
30         git reset --hard PRE &&
31         write_script .git/hooks/reference-transaction <<-\EOF &&
32                 if test "$1" = prepared
33                 then
34                         exit 1
35                 fi
36         EOF
37         test_must_fail git update-ref HEAD POST 2>err &&
38         test_i18ngrep "ref updates aborted by hook" err
39 '
40
41 test_expect_success 'hook gets all queued updates in prepared state' '
42         test_when_finished "rm .git/hooks/reference-transaction actual" &&
43         git reset --hard PRE &&
44         write_script .git/hooks/reference-transaction <<-\EOF &&
45                 if test "$1" = prepared
46                 then
47                         while read -r line
48                         do
49                                 printf "%s\n" "$line"
50                         done >actual
51                 fi
52         EOF
53         cat >expect <<-EOF &&
54                 $ZERO_OID $POST_OID HEAD
55                 $ZERO_OID $POST_OID refs/heads/master
56         EOF
57         git update-ref HEAD POST <<-EOF &&
58                 update HEAD $ZERO_OID $POST_OID
59                 update refs/heads/master $ZERO_OID $POST_OID
60         EOF
61         test_cmp expect actual
62 '
63
64 test_expect_success 'hook gets all queued updates in committed state' '
65         test_when_finished "rm .git/hooks/reference-transaction actual" &&
66         git reset --hard PRE &&
67         write_script .git/hooks/reference-transaction <<-\EOF &&
68                 if test "$1" = committed
69                 then
70                         while read -r line
71                         do
72                                 printf "%s\n" "$line"
73                         done >actual
74                 fi
75         EOF
76         cat >expect <<-EOF &&
77                 $ZERO_OID $POST_OID HEAD
78                 $ZERO_OID $POST_OID refs/heads/master
79         EOF
80         git update-ref HEAD POST &&
81         test_cmp expect actual
82 '
83
84 test_expect_success 'hook gets all queued updates in aborted state' '
85         test_when_finished "rm .git/hooks/reference-transaction actual" &&
86         git reset --hard PRE &&
87         write_script .git/hooks/reference-transaction <<-\EOF &&
88                 if test "$1" = aborted
89                 then
90                         while read -r line
91                         do
92                                 printf "%s\n" "$line"
93                         done >actual
94                 fi
95         EOF
96         cat >expect <<-EOF &&
97                 $ZERO_OID $POST_OID HEAD
98                 $ZERO_OID $POST_OID refs/heads/master
99         EOF
100         git update-ref --stdin <<-EOF &&
101                 start
102                 update HEAD POST $ZERO_OID
103                 update refs/heads/master POST $ZERO_OID
104                 abort
105         EOF
106         test_cmp expect actual
107 '
108
109 test_done