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