]>
Commit | Line | Data |
---|---|---|
ec55559f AS |
1 | #!/bin/sh |
2 | ||
3 | test_description='check pre-push hooks' | |
4 | . ./test-lib.sh | |
5 | ||
6 | # Setup hook that always succeeds | |
7 | HOOKDIR="$(git rev-parse --git-dir)/hooks" | |
8 | HOOK="$HOOKDIR/pre-push" | |
9 | mkdir -p "$HOOKDIR" | |
10 | write_script "$HOOK" <<EOF | |
11 | cat >/dev/null | |
12 | exit 0 | |
13 | EOF | |
14 | ||
15 | test_expect_success 'setup' ' | |
16 | git config push.default upstream && | |
17 | git init --bare repo1 && | |
18 | git remote add parent1 repo1 && | |
19 | test_commit one && | |
20 | git push parent1 HEAD:foreign | |
21 | ' | |
22 | write_script "$HOOK" <<EOF | |
23 | cat >/dev/null | |
24 | exit 1 | |
25 | EOF | |
26 | ||
27 | COMMIT1="$(git rev-parse HEAD)" | |
28 | export COMMIT1 | |
29 | ||
30 | test_expect_success 'push with failing hook' ' | |
31 | test_commit two && | |
32 | test_must_fail git push parent1 HEAD | |
33 | ' | |
34 | ||
35 | test_expect_success '--no-verify bypasses hook' ' | |
36 | git push --no-verify parent1 HEAD | |
37 | ' | |
38 | ||
39 | COMMIT2="$(git rev-parse HEAD)" | |
40 | export COMMIT2 | |
41 | ||
42 | write_script "$HOOK" <<'EOF' | |
43 | echo "$1" >actual | |
44 | echo "$2" >>actual | |
45 | cat >>actual | |
46 | EOF | |
47 | ||
48 | cat >expected <<EOF | |
49 | parent1 | |
50 | repo1 | |
51 | refs/heads/master $COMMIT2 refs/heads/foreign $COMMIT1 | |
52 | EOF | |
53 | ||
54 | test_expect_success 'push with hook' ' | |
55 | git push parent1 master:foreign && | |
56 | diff expected actual | |
57 | ' | |
58 | ||
59 | test_expect_success 'add a branch' ' | |
60 | git checkout -b other parent1/foreign && | |
61 | test_commit three | |
62 | ' | |
63 | ||
64 | COMMIT3="$(git rev-parse HEAD)" | |
65 | export COMMIT3 | |
66 | ||
67 | cat >expected <<EOF | |
68 | parent1 | |
69 | repo1 | |
70 | refs/heads/other $COMMIT3 refs/heads/foreign $COMMIT2 | |
71 | EOF | |
72 | ||
73 | test_expect_success 'push to default' ' | |
74 | git push && | |
75 | diff expected actual | |
76 | ' | |
77 | ||
78 | cat >expected <<EOF | |
79 | parent1 | |
80 | repo1 | |
8125a58b | 81 | refs/tags/one $COMMIT1 refs/tags/tag1 $ZERO_OID |
82 | HEAD~ $COMMIT2 refs/heads/prev $ZERO_OID | |
ec55559f AS |
83 | EOF |
84 | ||
85 | test_expect_success 'push non-branches' ' | |
86 | git push parent1 one:tag1 HEAD~:refs/heads/prev && | |
87 | diff expected actual | |
88 | ' | |
89 | ||
90 | cat >expected <<EOF | |
91 | parent1 | |
92 | repo1 | |
8125a58b | 93 | (delete) $ZERO_OID refs/heads/prev $COMMIT2 |
ec55559f AS |
94 | EOF |
95 | ||
96 | test_expect_success 'push delete' ' | |
97 | git push parent1 :prev && | |
98 | diff expected actual | |
99 | ' | |
100 | ||
101 | cat >expected <<EOF | |
102 | repo1 | |
103 | repo1 | |
8125a58b | 104 | HEAD $COMMIT3 refs/heads/other $ZERO_OID |
ec55559f AS |
105 | EOF |
106 | ||
107 | test_expect_success 'push to URL' ' | |
108 | git push repo1 HEAD && | |
109 | diff expected actual | |
110 | ' | |
111 | ||
af65f68c CB |
112 | test_expect_success 'set up many-ref tests' ' |
113 | { | |
114 | nr=1000 | |
115 | while test $nr -lt 2000 | |
116 | do | |
117 | nr=$(( $nr + 1 )) | |
118 | echo "create refs/heads/b/$nr $COMMIT3" | |
119 | done | |
120 | } | git update-ref --stdin | |
121 | ' | |
122 | ||
123 | test_expect_success 'sigpipe does not cause pre-push hook failure' ' | |
124 | echo "exit 0" | write_script "$HOOK" && | |
125 | git push parent1 "refs/heads/b/*:refs/heads/b/*" | |
126 | ' | |
ec55559f AS |
127 | |
128 | test_done |