1package bug
2
3import (
4 "github.com/MichaelMure/git-bug/repository"
5 "github.com/stretchr/testify/assert"
6
7 "io/ioutil"
8 "log"
9 "os"
10 "testing"
11)
12
13func createRepo(bare bool) *repository.GitRepo {
14 dir, err := ioutil.TempDir("", "")
15 if err != nil {
16 log.Fatal(err)
17 }
18
19 // fmt.Println("Creating repo:", dir)
20
21 var creator func(string) (*repository.GitRepo, error)
22
23 if bare {
24 creator = repository.InitBareGitRepo
25 } else {
26 creator = repository.InitGitRepo
27 }
28
29 repo, err := creator(dir)
30 if err != nil {
31 log.Fatal(err)
32 }
33
34 if err := repo.StoreConfig("user.name", "testuser"); err != nil {
35 log.Fatal("failed to set user.name for test repository: ", err)
36 }
37 if err := repo.StoreConfig("user.email", "testuser@example.com"); err != nil {
38 log.Fatal("failed to set user.email for test repository: ", err)
39 }
40
41 return repo
42}
43
44func cleanupRepo(repo repository.Repo) error {
45 path := repo.GetPath()
46 // fmt.Println("Cleaning repo:", path)
47 return os.RemoveAll(path)
48}
49
50func setupRepos(t testing.TB) (repoA, repoB, remote *repository.GitRepo) {
51 repoA = createRepo(false)
52 repoB = createRepo(false)
53 remote = createRepo(false)
54
55 remoteAddr := "file://" + remote.GetPath()
56
57 err := repoA.AddRemote("origin", remoteAddr)
58 if err != nil {
59 t.Fatal(err)
60 }
61
62 err = repoB.AddRemote("origin", remoteAddr)
63 if err != nil {
64 t.Fatal(err)
65 }
66
67 return repoA, repoB, remote
68}
69
70func cleanupRepos(repoA, repoB, remote *repository.GitRepo) {
71 cleanupRepo(repoA)
72 cleanupRepo(repoB)
73 cleanupRepo(remote)
74}
75
76func TestPushPull(t *testing.T) {
77 repoA, repoB, remote := setupRepos(t)
78 defer cleanupRepos(repoA, repoB, remote)
79
80 err := rene.Commit(repoA)
81 assert.NoError(t, err)
82
83 bug1, _, err := Create(rene, unix, "bug1", "message")
84 assert.NoError(t, err)
85 err = bug1.Commit(repoA)
86 assert.NoError(t, err)
87
88 // A --> remote --> B
89 _, err = Push(repoA, "origin")
90 assert.NoError(t, err)
91
92 err = Pull(repoB, "origin")
93 assert.NoError(t, err)
94
95 bugs := allBugs(t, ReadAllLocalBugs(repoB))
96
97 if len(bugs) != 1 {
98 t.Fatal("Unexpected number of bugs")
99 }
100
101 // B --> remote --> A
102 bug2, _, err := Create(rene, unix, "bug2", "message")
103 assert.NoError(t, err)
104 err = bug2.Commit(repoB)
105 assert.NoError(t, err)
106
107 _, err = Push(repoB, "origin")
108 assert.NoError(t, err)
109
110 err = Pull(repoA, "origin")
111 assert.NoError(t, err)
112
113 bugs = allBugs(t, ReadAllLocalBugs(repoA))
114
115 if len(bugs) != 2 {
116 t.Fatal("Unexpected number of bugs")
117 }
118}
119
120func allBugs(t testing.TB, bugs <-chan StreamedBug) []*Bug {
121 var result []*Bug
122 for streamed := range bugs {
123 if streamed.Err != nil {
124 t.Fatal(streamed.Err)
125 }
126 result = append(result, streamed.Bug)
127 }
128 return result
129}
130
131func TestRebaseTheirs(t *testing.T) {
132 _RebaseTheirs(t)
133}
134
135func BenchmarkRebaseTheirs(b *testing.B) {
136 for n := 0; n < b.N; n++ {
137 _RebaseTheirs(b)
138 }
139}
140
141func _RebaseTheirs(t testing.TB) {
142 repoA, repoB, remote := setupRepos(t)
143 defer cleanupRepos(repoA, repoB, remote)
144
145 bug1, _, err := Create(rene, unix, "bug1", "message")
146 assert.NoError(t, err)
147 err = bug1.Commit(repoA)
148 assert.NoError(t, err)
149
150 // A --> remote
151 _, err = Push(repoA, "origin")
152 assert.NoError(t, err)
153
154 // remote --> B
155 err = Pull(repoB, "origin")
156 assert.NoError(t, err)
157
158 bug2, err := ReadLocalBug(repoB, bug1.Id())
159 assert.NoError(t, err)
160
161 _, err = AddComment(bug2, rene, unix, "message2")
162 assert.NoError(t, err)
163 _, err = AddComment(bug2, rene, unix, "message3")
164 assert.NoError(t, err)
165 _, err = AddComment(bug2, rene, unix, "message4")
166 assert.NoError(t, err)
167 err = bug2.Commit(repoB)
168 assert.NoError(t, err)
169
170 // B --> remote
171 _, err = Push(repoB, "origin")
172 assert.NoError(t, err)
173
174 // remote --> A
175 err = Pull(repoA, "origin")
176 assert.NoError(t, err)
177
178 bugs := allBugs(t, ReadAllLocalBugs(repoB))
179
180 if len(bugs) != 1 {
181 t.Fatal("Unexpected number of bugs")
182 }
183
184 bug3, err := ReadLocalBug(repoA, bug1.Id())
185 assert.NoError(t, err)
186
187 if nbOps(bug3) != 4 {
188 t.Fatal("Unexpected number of operations")
189 }
190}
191
192func TestRebaseOurs(t *testing.T) {
193 _RebaseOurs(t)
194}
195
196func BenchmarkRebaseOurs(b *testing.B) {
197 for n := 0; n < b.N; n++ {
198 _RebaseOurs(b)
199 }
200}
201
202func _RebaseOurs(t testing.TB) {
203 repoA, repoB, remote := setupRepos(t)
204 defer cleanupRepos(repoA, repoB, remote)
205
206 bug1, _, err := Create(rene, unix, "bug1", "message")
207 assert.NoError(t, err)
208 err = bug1.Commit(repoA)
209 assert.NoError(t, err)
210
211 // A --> remote
212 _, err = Push(repoA, "origin")
213 assert.NoError(t, err)
214
215 // remote --> B
216 err = Pull(repoB, "origin")
217 assert.NoError(t, err)
218
219 _, err = AddComment(bug1, rene, unix, "message2")
220 assert.NoError(t, err)
221 _, err = AddComment(bug1, rene, unix, "message3")
222 assert.NoError(t, err)
223 _, err = AddComment(bug1, rene, unix, "message4")
224 assert.NoError(t, err)
225 err = bug1.Commit(repoA)
226 assert.NoError(t, err)
227
228 _, err = AddComment(bug1, rene, unix, "message5")
229 assert.NoError(t, err)
230 _, err = AddComment(bug1, rene, unix, "message6")
231 assert.NoError(t, err)
232 _, err = AddComment(bug1, rene, unix, "message7")
233 assert.NoError(t, err)
234 err = bug1.Commit(repoA)
235 assert.NoError(t, err)
236
237 _, err = AddComment(bug1, rene, unix, "message8")
238 assert.NoError(t, err)
239 _, err = AddComment(bug1, rene, unix, "message9")
240 assert.NoError(t, err)
241 _, err = AddComment(bug1, rene, unix, "message10")
242 assert.NoError(t, err)
243 err = bug1.Commit(repoA)
244 assert.NoError(t, err)
245
246 // remote --> A
247 err = Pull(repoA, "origin")
248 assert.NoError(t, err)
249
250 bugs := allBugs(t, ReadAllLocalBugs(repoA))
251
252 if len(bugs) != 1 {
253 t.Fatal("Unexpected number of bugs")
254 }
255
256 bug2, err := ReadLocalBug(repoA, bug1.Id())
257 assert.NoError(t, err)
258
259 if nbOps(bug2) != 10 {
260 t.Fatal("Unexpected number of operations")
261 }
262}
263
264func nbOps(b *Bug) int {
265 it := NewOperationIterator(b)
266 counter := 0
267 for it.Next() {
268 counter++
269 }
270 return counter
271}
272
273func TestRebaseConflict(t *testing.T) {
274 _RebaseConflict(t)
275}
276
277func BenchmarkRebaseConflict(b *testing.B) {
278 for n := 0; n < b.N; n++ {
279 _RebaseConflict(b)
280 }
281}
282
283func _RebaseConflict(t testing.TB) {
284 repoA, repoB, remote := setupRepos(t)
285 defer cleanupRepos(repoA, repoB, remote)
286
287 bug1, _, err := Create(rene, unix, "bug1", "message")
288 assert.NoError(t, err)
289 err = bug1.Commit(repoA)
290 assert.NoError(t, err)
291
292 // A --> remote
293 _, err = Push(repoA, "origin")
294 assert.NoError(t, err)
295
296 // remote --> B
297 err = Pull(repoB, "origin")
298 assert.NoError(t, err)
299
300 _, err = AddComment(bug1, rene, unix, "message2")
301 assert.NoError(t, err)
302 _, err = AddComment(bug1, rene, unix, "message3")
303 assert.NoError(t, err)
304 _, err = AddComment(bug1, rene, unix, "message4")
305 assert.NoError(t, err)
306 err = bug1.Commit(repoA)
307 assert.NoError(t, err)
308
309 _, err = AddComment(bug1, rene, unix, "message5")
310 assert.NoError(t, err)
311 _, err = AddComment(bug1, rene, unix, "message6")
312 assert.NoError(t, err)
313 _, err = AddComment(bug1, rene, unix, "message7")
314 assert.NoError(t, err)
315 err = bug1.Commit(repoA)
316 assert.NoError(t, err)
317
318 _, err = AddComment(bug1, rene, unix, "message8")
319 assert.NoError(t, err)
320 _, err = AddComment(bug1, rene, unix, "message9")
321 assert.NoError(t, err)
322 _, err = AddComment(bug1, rene, unix, "message10")
323 assert.NoError(t, err)
324 err = bug1.Commit(repoA)
325 assert.NoError(t, err)
326
327 bug2, err := ReadLocalBug(repoB, bug1.Id())
328 assert.NoError(t, err)
329
330 _, err = AddComment(bug2, rene, unix, "message11")
331 assert.NoError(t, err)
332 _, err = AddComment(bug2, rene, unix, "message12")
333 assert.NoError(t, err)
334 _, err = AddComment(bug2, rene, unix, "message13")
335 assert.NoError(t, err)
336 err = bug2.Commit(repoB)
337 assert.NoError(t, err)
338
339 _, err = AddComment(bug2, rene, unix, "message14")
340 assert.NoError(t, err)
341 _, err = AddComment(bug2, rene, unix, "message15")
342 assert.NoError(t, err)
343 _, err = AddComment(bug2, rene, unix, "message16")
344 assert.NoError(t, err)
345 err = bug2.Commit(repoB)
346 assert.NoError(t, err)
347
348 _, err = AddComment(bug2, rene, unix, "message17")
349 assert.NoError(t, err)
350 _, err = AddComment(bug2, rene, unix, "message18")
351 assert.NoError(t, err)
352 _, err = AddComment(bug2, rene, unix, "message19")
353 assert.NoError(t, err)
354 err = bug2.Commit(repoB)
355 assert.NoError(t, err)
356
357 // A --> remote
358 _, err = Push(repoA, "origin")
359 assert.NoError(t, err)
360
361 // remote --> B
362 err = Pull(repoB, "origin")
363 assert.NoError(t, err)
364
365 bugs := allBugs(t, ReadAllLocalBugs(repoB))
366
367 if len(bugs) != 1 {
368 t.Fatal("Unexpected number of bugs")
369 }
370
371 bug3, err := ReadLocalBug(repoB, bug1.Id())
372 assert.NoError(t, err)
373
374 if nbOps(bug3) != 19 {
375 t.Fatal("Unexpected number of operations")
376 }
377
378 // B --> remote
379 _, err = Push(repoB, "origin")
380 assert.NoError(t, err)
381
382 // remote --> A
383 err = Pull(repoA, "origin")
384 assert.NoError(t, err)
385
386 bugs = allBugs(t, ReadAllLocalBugs(repoA))
387
388 if len(bugs) != 1 {
389 t.Fatal("Unexpected number of bugs")
390 }
391
392 bug4, err := ReadLocalBug(repoA, bug1.Id())
393 assert.NoError(t, err)
394
395 if nbOps(bug4) != 19 {
396 t.Fatal("Unexpected number of operations")
397 }
398}