Merge branch 'jc/detached-head-doc' into maint
[git] / t / t5519-push-alternates.sh
1 #!/bin/sh
2
3 test_description='push to a repository that borrows from elsewhere'
4
5 . ./test-lib.sh
6
7 test_expect_success setup '
8         mkdir alice-pub &&
9         (
10                 cd alice-pub &&
11                 GIT_DIR=. git init
12         ) &&
13         mkdir alice-work &&
14         (
15                 cd alice-work &&
16                 git init &&
17                 >file &&
18                 git add . &&
19                 git commit -m initial &&
20                 git push ../alice-pub master
21         ) &&
22
23         # Project Bob is a fork of project Alice
24         mkdir bob-pub &&
25         (
26                 cd bob-pub &&
27                 GIT_DIR=. git init &&
28                 mkdir -p objects/info &&
29                 echo ../../alice-pub/objects >objects/info/alternates
30         ) &&
31         git clone alice-pub bob-work &&
32         (
33                 cd bob-work &&
34                 git push ../bob-pub master
35         )
36 '
37
38 test_expect_success 'alice works and pushes' '
39         (
40                 cd alice-work &&
41                 echo more >file &&
42                 git commit -a -m second &&
43                 git push ../alice-pub
44         )
45 '
46
47 test_expect_success 'bob fetches from alice, works and pushes' '
48         (
49                 # Bob acquires what Alice did in his work tree first.
50                 # Even though these objects are not directly in
51                 # the public repository of Bob, this push does not
52                 # need to send the commit Bob received from Alice
53                 # to his public repository, as all the object Alice
54                 # has at her public repository are available to it
55                 # via its alternates.
56                 cd bob-work &&
57                 git pull ../alice-pub master &&
58                 echo more bob >file &&
59                 git commit -a -m third &&
60                 git push ../bob-pub
61         ) &&
62
63         # Check that the second commit by Alice is not sent
64         # to ../bob-pub
65         (
66                 cd bob-pub &&
67                 second=$(git rev-parse HEAD^) &&
68                 rm -f objects/info/alternates &&
69                 test_must_fail git cat-file -t $second &&
70                 echo ../../alice-pub/objects >objects/info/alternates
71         )
72 '
73
74 test_expect_success 'clean-up in case the previous failed' '
75         (
76                 cd bob-pub &&
77                 echo ../../alice-pub/objects >objects/info/alternates
78         )
79 '
80
81 test_expect_success 'alice works and pushes again' '
82         (
83                 # Alice does not care what Bob does.  She does not
84                 # even have to be aware of his existence.  She just
85                 # keeps working and pushing
86                 cd alice-work &&
87                 echo more alice >file &&
88                 git commit -a -m fourth &&
89                 git push ../alice-pub
90         )
91 '
92
93 test_expect_success 'bob works and pushes' '
94         (
95                 # This time Bob does not pull from Alice, and
96                 # the master branch at her public repository points
97                 # at a commit Bob does not know about.  This should
98                 # not prevent the push by Bob from succeeding.
99                 cd bob-work &&
100                 echo yet more bob >file &&
101                 git commit -a -m fifth &&
102                 git push ../bob-pub
103         )
104 '
105
106 test_expect_success 'alice works and pushes yet again' '
107         (
108                 # Alice does not care what Bob does.  She does not
109                 # even have to be aware of his existence.  She just
110                 # keeps working and pushing
111                 cd alice-work &&
112                 echo more and more alice >file &&
113                 git commit -a -m sixth.1 &&
114                 echo more and more alice >>file &&
115                 git commit -a -m sixth.2 &&
116                 echo more and more alice >>file &&
117                 git commit -a -m sixth.3 &&
118                 git push ../alice-pub
119         )
120 '
121
122 test_expect_success 'bob works and pushes again' '
123         (
124                 cd alice-pub &&
125                 git cat-file commit master >../bob-work/commit
126         ) &&
127         (
128                 # This time Bob does not pull from Alice, and
129                 # the master branch at her public repository points
130                 # at a commit Bob does not fully know about, but
131                 # he happens to have the commit object (but not the
132                 # necessary tree) in his repository from Alice.
133                 # This should not prevent the push by Bob from
134                 # succeeding.
135                 cd bob-work &&
136                 git hash-object -t commit -w commit &&
137                 echo even more bob >file &&
138                 git commit -a -m seventh &&
139                 git push ../bob-pub
140         )
141 '
142
143 test_done