fork of go-git with some jj specific features
1package git
2
3import (
4 "bytes"
5 "context"
6 "fmt"
7 "io"
8 "io/ioutil"
9 "os"
10 "os/exec"
11 "path/filepath"
12 "strings"
13 "time"
14
15 "gopkg.in/src-d/go-git.v4/config"
16 "gopkg.in/src-d/go-git.v4/plumbing"
17 "gopkg.in/src-d/go-git.v4/plumbing/object"
18 "gopkg.in/src-d/go-git.v4/plumbing/storer"
19 "gopkg.in/src-d/go-git.v4/storage"
20 "gopkg.in/src-d/go-git.v4/storage/filesystem"
21 "gopkg.in/src-d/go-git.v4/storage/memory"
22
23 . "gopkg.in/check.v1"
24 "gopkg.in/src-d/go-billy.v4/memfs"
25 "gopkg.in/src-d/go-billy.v4/osfs"
26 "gopkg.in/src-d/go-billy.v4/util"
27 "gopkg.in/src-d/go-git-fixtures.v3"
28)
29
30type RepositorySuite struct {
31 BaseSuite
32}
33
34var _ = Suite(&RepositorySuite{})
35
36func (s *RepositorySuite) TestInit(c *C) {
37 r, err := Init(memory.NewStorage(), memfs.New())
38 c.Assert(err, IsNil)
39 c.Assert(r, NotNil)
40
41 cfg, err := r.Config()
42 c.Assert(err, IsNil)
43 c.Assert(cfg.Core.IsBare, Equals, false)
44}
45
46func (s *RepositorySuite) TestInitNonStandardDotGit(c *C) {
47 dir, err := ioutil.TempDir("", "init-non-standard")
48 c.Assert(err, IsNil)
49 c.Assert(os.RemoveAll(dir), IsNil)
50
51 fs := osfs.New(dir)
52 dot, _ := fs.Chroot("storage")
53 storage, err := filesystem.NewStorage(dot)
54 c.Assert(err, IsNil)
55
56 wt, _ := fs.Chroot("worktree")
57 r, err := Init(storage, wt)
58 c.Assert(err, IsNil)
59 c.Assert(r, NotNil)
60
61 f, err := fs.Open(fs.Join("worktree", ".git"))
62 c.Assert(err, IsNil)
63
64 all, err := ioutil.ReadAll(f)
65 c.Assert(err, IsNil)
66 c.Assert(string(all), Equals, fmt.Sprintf("gitdir: %s\n", filepath.Join("..", "storage")))
67
68 cfg, err := r.Config()
69 c.Assert(err, IsNil)
70 c.Assert(cfg.Core.Worktree, Equals, filepath.Join("..", "worktree"))
71}
72
73func (s *RepositorySuite) TestInitStandardDotGit(c *C) {
74 dir, err := ioutil.TempDir("", "init-standard")
75 c.Assert(err, IsNil)
76 c.Assert(os.RemoveAll(dir), IsNil)
77
78 fs := osfs.New(dir)
79 dot, _ := fs.Chroot(".git")
80 storage, err := filesystem.NewStorage(dot)
81 c.Assert(err, IsNil)
82
83 r, err := Init(storage, fs)
84 c.Assert(err, IsNil)
85 c.Assert(r, NotNil)
86
87 l, err := fs.ReadDir(".git")
88 c.Assert(err, IsNil)
89 c.Assert(len(l) > 0, Equals, true)
90
91 cfg, err := r.Config()
92 c.Assert(err, IsNil)
93 c.Assert(cfg.Core.Worktree, Equals, "")
94}
95
96func (s *RepositorySuite) TestInitBare(c *C) {
97 r, err := Init(memory.NewStorage(), nil)
98 c.Assert(err, IsNil)
99 c.Assert(r, NotNil)
100
101 cfg, err := r.Config()
102 c.Assert(err, IsNil)
103 c.Assert(cfg.Core.IsBare, Equals, true)
104
105}
106
107func (s *RepositorySuite) TestInitAlreadyExists(c *C) {
108 st := memory.NewStorage()
109
110 r, err := Init(st, nil)
111 c.Assert(err, IsNil)
112 c.Assert(r, NotNil)
113
114 r, err = Init(st, nil)
115 c.Assert(err, Equals, ErrRepositoryAlreadyExists)
116 c.Assert(r, IsNil)
117}
118
119func (s *RepositorySuite) TestOpen(c *C) {
120 st := memory.NewStorage()
121
122 r, err := Init(st, memfs.New())
123 c.Assert(err, IsNil)
124 c.Assert(r, NotNil)
125
126 r, err = Open(st, memfs.New())
127 c.Assert(err, IsNil)
128 c.Assert(r, NotNil)
129}
130
131func (s *RepositorySuite) TestOpenBare(c *C) {
132 st := memory.NewStorage()
133
134 r, err := Init(st, nil)
135 c.Assert(err, IsNil)
136 c.Assert(r, NotNil)
137
138 r, err = Open(st, nil)
139 c.Assert(err, IsNil)
140 c.Assert(r, NotNil)
141}
142
143func (s *RepositorySuite) TestOpenMissingWorktree(c *C) {
144 st := memory.NewStorage()
145
146 r, err := Init(st, memfs.New())
147 c.Assert(err, IsNil)
148 c.Assert(r, NotNil)
149
150 r, err = Open(st, nil)
151 c.Assert(err, Equals, ErrWorktreeNotProvided)
152 c.Assert(r, IsNil)
153}
154
155func (s *RepositorySuite) TestOpenNotExists(c *C) {
156 r, err := Open(memory.NewStorage(), nil)
157 c.Assert(err, Equals, ErrRepositoryNotExists)
158 c.Assert(r, IsNil)
159}
160
161func (s *RepositorySuite) TestClone(c *C) {
162 r, err := Clone(memory.NewStorage(), nil, &CloneOptions{
163 URL: s.GetBasicLocalRepositoryURL(),
164 })
165
166 c.Assert(err, IsNil)
167
168 remotes, err := r.Remotes()
169 c.Assert(err, IsNil)
170 c.Assert(remotes, HasLen, 1)
171}
172
173func (s *RepositorySuite) TestCloneContext(c *C) {
174 ctx, cancel := context.WithCancel(context.Background())
175 cancel()
176
177 _, err := CloneContext(ctx, memory.NewStorage(), nil, &CloneOptions{
178 URL: s.GetBasicLocalRepositoryURL(),
179 })
180
181 c.Assert(err, NotNil)
182}
183
184func (s *RepositorySuite) TestCloneWithTags(c *C) {
185 url := s.GetLocalRepositoryURL(
186 fixtures.ByURL("https://github.com/git-fixtures/tags.git").One(),
187 )
188
189 r, err := Clone(memory.NewStorage(), nil, &CloneOptions{URL: url, Tags: NoTags})
190 c.Assert(err, IsNil)
191
192 remotes, err := r.Remotes()
193 c.Assert(err, IsNil)
194 c.Assert(remotes, HasLen, 1)
195
196 i, err := r.References()
197 c.Assert(err, IsNil)
198
199 var count int
200 i.ForEach(func(r *plumbing.Reference) error { count++; return nil })
201
202 c.Assert(count, Equals, 3)
203}
204
205func (s *RepositorySuite) TestCreateRemoteAndRemote(c *C) {
206 r, _ := Init(memory.NewStorage(), nil)
207 remote, err := r.CreateRemote(&config.RemoteConfig{
208 Name: "foo",
209 URLs: []string{"http://foo/foo.git"},
210 })
211
212 c.Assert(err, IsNil)
213 c.Assert(remote.Config().Name, Equals, "foo")
214
215 alt, err := r.Remote("foo")
216 c.Assert(err, IsNil)
217 c.Assert(alt, Not(Equals), remote)
218 c.Assert(alt.Config().Name, Equals, "foo")
219}
220
221func (s *RepositorySuite) TestCreateRemoteInvalid(c *C) {
222 r, _ := Init(memory.NewStorage(), nil)
223 remote, err := r.CreateRemote(&config.RemoteConfig{})
224
225 c.Assert(err, Equals, config.ErrRemoteConfigEmptyName)
226 c.Assert(remote, IsNil)
227}
228
229func (s *RepositorySuite) TestDeleteRemote(c *C) {
230 r, _ := Init(memory.NewStorage(), nil)
231 _, err := r.CreateRemote(&config.RemoteConfig{
232 Name: "foo",
233 URLs: []string{"http://foo/foo.git"},
234 })
235
236 c.Assert(err, IsNil)
237
238 err = r.DeleteRemote("foo")
239 c.Assert(err, IsNil)
240
241 alt, err := r.Remote("foo")
242 c.Assert(err, Equals, ErrRemoteNotFound)
243 c.Assert(alt, IsNil)
244}
245
246func (s *RepositorySuite) TestPlainInit(c *C) {
247 dir, err := ioutil.TempDir("", "plain-init")
248 c.Assert(err, IsNil)
249 defer os.RemoveAll(dir)
250
251 r, err := PlainInit(dir, true)
252 c.Assert(err, IsNil)
253 c.Assert(r, NotNil)
254
255 cfg, err := r.Config()
256 c.Assert(err, IsNil)
257 c.Assert(cfg.Core.IsBare, Equals, true)
258}
259
260func (s *RepositorySuite) TestPlainInitAlreadyExists(c *C) {
261 dir, err := ioutil.TempDir("", "plain-init")
262 c.Assert(err, IsNil)
263 defer os.RemoveAll(dir)
264
265 r, err := PlainInit(dir, true)
266 c.Assert(err, IsNil)
267 c.Assert(r, NotNil)
268
269 r, err = PlainInit(dir, true)
270 c.Assert(err, Equals, ErrRepositoryAlreadyExists)
271 c.Assert(r, IsNil)
272}
273
274func (s *RepositorySuite) TestPlainOpen(c *C) {
275 dir, err := ioutil.TempDir("", "plain-open")
276 c.Assert(err, IsNil)
277 defer os.RemoveAll(dir)
278
279 r, err := PlainInit(dir, false)
280 c.Assert(err, IsNil)
281 c.Assert(r, NotNil)
282
283 r, err = PlainOpen(dir)
284 c.Assert(err, IsNil)
285 c.Assert(r, NotNil)
286}
287
288func (s *RepositorySuite) TestPlainOpenBare(c *C) {
289 dir, err := ioutil.TempDir("", "plain-open")
290 c.Assert(err, IsNil)
291 defer os.RemoveAll(dir)
292
293 r, err := PlainInit(dir, true)
294 c.Assert(err, IsNil)
295 c.Assert(r, NotNil)
296
297 r, err = PlainOpen(dir)
298 c.Assert(err, IsNil)
299 c.Assert(r, NotNil)
300}
301
302func (s *RepositorySuite) TestPlainOpenNotBare(c *C) {
303 dir, err := ioutil.TempDir("", "plain-open")
304 c.Assert(err, IsNil)
305 defer os.RemoveAll(dir)
306
307 r, err := PlainInit(dir, false)
308 c.Assert(err, IsNil)
309 c.Assert(r, NotNil)
310
311 r, err = PlainOpen(filepath.Join(dir, ".git"))
312 c.Assert(err, Equals, ErrWorktreeNotProvided)
313 c.Assert(r, IsNil)
314}
315
316func (s *RepositorySuite) testPlainOpenGitFile(c *C, f func(string, string) string) {
317 dir, err := ioutil.TempDir("", "plain-open")
318 c.Assert(err, IsNil)
319 defer os.RemoveAll(dir)
320
321 r, err := PlainInit(dir, true)
322 c.Assert(err, IsNil)
323 c.Assert(r, NotNil)
324
325 altDir, err := ioutil.TempDir("", "plain-open")
326 c.Assert(err, IsNil)
327 defer os.RemoveAll(altDir)
328
329 err = ioutil.WriteFile(filepath.Join(altDir, ".git"), []byte(f(dir, altDir)), 0644)
330 c.Assert(err, IsNil)
331
332 r, err = PlainOpen(altDir)
333 c.Assert(err, IsNil)
334 c.Assert(r, NotNil)
335}
336
337func (s *RepositorySuite) TestPlainOpenBareAbsoluteGitDirFile(c *C) {
338 s.testPlainOpenGitFile(c, func(dir, altDir string) string {
339 return fmt.Sprintf("gitdir: %s\n", dir)
340 })
341}
342
343func (s *RepositorySuite) TestPlainOpenBareAbsoluteGitDirFileNoEOL(c *C) {
344 s.testPlainOpenGitFile(c, func(dir, altDir string) string {
345 return fmt.Sprintf("gitdir: %s", dir)
346 })
347}
348
349func (s *RepositorySuite) TestPlainOpenBareRelativeGitDirFile(c *C) {
350 s.testPlainOpenGitFile(c, func(dir, altDir string) string {
351 dir, err := filepath.Rel(altDir, dir)
352 c.Assert(err, IsNil)
353 return fmt.Sprintf("gitdir: %s\n", dir)
354 })
355}
356
357func (s *RepositorySuite) TestPlainOpenBareRelativeGitDirFileNoEOL(c *C) {
358 s.testPlainOpenGitFile(c, func(dir, altDir string) string {
359 dir, err := filepath.Rel(altDir, dir)
360 c.Assert(err, IsNil)
361 return fmt.Sprintf("gitdir: %s\n", dir)
362 })
363}
364
365func (s *RepositorySuite) TestPlainOpenBareRelativeGitDirFileTrailingGarbage(c *C) {
366 dir, err := ioutil.TempDir("", "plain-open")
367 c.Assert(err, IsNil)
368 defer os.RemoveAll(dir)
369
370 r, err := PlainInit(dir, true)
371 c.Assert(err, IsNil)
372 c.Assert(r, NotNil)
373
374 altDir, err := ioutil.TempDir("", "plain-open")
375 c.Assert(err, IsNil)
376 err = ioutil.WriteFile(filepath.Join(altDir, ".git"), []byte(fmt.Sprintf("gitdir: %s\nTRAILING", altDir)), 0644)
377 c.Assert(err, IsNil)
378
379 r, err = PlainOpen(altDir)
380 c.Assert(err, Equals, ErrRepositoryNotExists)
381 c.Assert(r, IsNil)
382}
383
384func (s *RepositorySuite) TestPlainOpenBareRelativeGitDirFileBadPrefix(c *C) {
385 dir, err := ioutil.TempDir("", "plain-open")
386 c.Assert(err, IsNil)
387 defer os.RemoveAll(dir)
388
389 r, err := PlainInit(dir, true)
390 c.Assert(err, IsNil)
391 c.Assert(r, NotNil)
392
393 altDir, err := ioutil.TempDir("", "plain-open")
394 c.Assert(err, IsNil)
395 err = ioutil.WriteFile(filepath.Join(altDir, ".git"), []byte(fmt.Sprintf("xgitdir: %s\n", dir)), 0644)
396 c.Assert(err, IsNil)
397
398 r, err = PlainOpen(altDir)
399 c.Assert(err, ErrorMatches, ".*gitdir.*")
400 c.Assert(r, IsNil)
401}
402
403func (s *RepositorySuite) TestPlainOpenNotExists(c *C) {
404 r, err := PlainOpen("/not-exists/")
405 c.Assert(err, Equals, ErrRepositoryNotExists)
406 c.Assert(r, IsNil)
407}
408
409func (s *RepositorySuite) TestPlainClone(c *C) {
410 r, err := PlainClone(c.MkDir(), false, &CloneOptions{
411 URL: s.GetBasicLocalRepositoryURL(),
412 })
413
414 c.Assert(err, IsNil)
415
416 remotes, err := r.Remotes()
417 c.Assert(err, IsNil)
418 c.Assert(remotes, HasLen, 1)
419}
420
421func (s *RepositorySuite) TestPlainCloneContext(c *C) {
422 ctx, cancel := context.WithCancel(context.Background())
423 cancel()
424
425 _, err := PlainCloneContext(ctx, c.MkDir(), false, &CloneOptions{
426 URL: s.GetBasicLocalRepositoryURL(),
427 })
428
429 c.Assert(err, NotNil)
430}
431
432func (s *RepositorySuite) TestPlainCloneWithRecurseSubmodules(c *C) {
433 dir, err := ioutil.TempDir("", "plain-clone-submodule")
434 c.Assert(err, IsNil)
435 defer os.RemoveAll(dir)
436
437 path := fixtures.ByTag("submodule").One().Worktree().Root()
438 r, err := PlainClone(dir, false, &CloneOptions{
439 URL: path,
440 RecurseSubmodules: DefaultSubmoduleRecursionDepth,
441 })
442
443 c.Assert(err, IsNil)
444
445 cfg, err := r.Config()
446 c.Assert(err, IsNil)
447 c.Assert(cfg.Remotes, HasLen, 1)
448 c.Assert(cfg.Submodules, HasLen, 2)
449}
450
451func (s *RepositorySuite) TestPlainCloneNoCheckout(c *C) {
452 dir, err := ioutil.TempDir("", "plain-clone-no-checkout")
453 c.Assert(err, IsNil)
454 defer os.RemoveAll(dir)
455
456 path := fixtures.ByTag("submodule").One().Worktree().Root()
457 r, err := PlainClone(dir, false, &CloneOptions{
458 URL: path,
459 NoCheckout: true,
460 RecurseSubmodules: DefaultSubmoduleRecursionDepth,
461 })
462 c.Assert(err, IsNil)
463
464 h, err := r.Head()
465 c.Assert(err, IsNil)
466 c.Assert(h.Hash().String(), Equals, "b685400c1f9316f350965a5993d350bc746b0bf4")
467
468 fi, err := osfs.New(dir).ReadDir("")
469 c.Assert(err, IsNil)
470 c.Assert(fi, HasLen, 1) // .git
471}
472
473func (s *RepositorySuite) TestFetch(c *C) {
474 r, _ := Init(memory.NewStorage(), nil)
475 _, err := r.CreateRemote(&config.RemoteConfig{
476 Name: DefaultRemoteName,
477 URLs: []string{s.GetBasicLocalRepositoryURL()},
478 })
479 c.Assert(err, IsNil)
480 c.Assert(r.Fetch(&FetchOptions{}), IsNil)
481
482 remotes, err := r.Remotes()
483 c.Assert(err, IsNil)
484 c.Assert(remotes, HasLen, 1)
485
486 _, err = r.Head()
487 c.Assert(err, Equals, plumbing.ErrReferenceNotFound)
488
489 branch, err := r.Reference("refs/remotes/origin/master", false)
490 c.Assert(err, IsNil)
491 c.Assert(branch, NotNil)
492 c.Assert(branch.Type(), Equals, plumbing.HashReference)
493 c.Assert(branch.Hash().String(), Equals, "6ecf0ef2c2dffb796033e5a02219af86ec6584e5")
494}
495
496func (s *RepositorySuite) TestFetchContext(c *C) {
497 r, _ := Init(memory.NewStorage(), nil)
498 _, err := r.CreateRemote(&config.RemoteConfig{
499 Name: DefaultRemoteName,
500 URLs: []string{s.GetBasicLocalRepositoryURL()},
501 })
502 c.Assert(err, IsNil)
503
504 ctx, cancel := context.WithCancel(context.Background())
505 cancel()
506
507 c.Assert(r.FetchContext(ctx, &FetchOptions{}), NotNil)
508}
509
510func (s *RepositorySuite) TestCloneWithProgress(c *C) {
511 fs := memfs.New()
512
513 buf := bytes.NewBuffer(nil)
514 _, err := Clone(memory.NewStorage(), fs, &CloneOptions{
515 URL: s.GetBasicLocalRepositoryURL(),
516 Progress: buf,
517 })
518
519 c.Assert(err, IsNil)
520 c.Assert(buf.Len(), Not(Equals), 0)
521}
522
523func (s *RepositorySuite) TestCloneDeep(c *C) {
524 fs := memfs.New()
525 r, _ := Init(memory.NewStorage(), fs)
526
527 head, err := r.Head()
528 c.Assert(err, Equals, plumbing.ErrReferenceNotFound)
529 c.Assert(head, IsNil)
530
531 err = r.clone(context.Background(), &CloneOptions{
532 URL: s.GetBasicLocalRepositoryURL(),
533 })
534
535 c.Assert(err, IsNil)
536
537 remotes, err := r.Remotes()
538 c.Assert(err, IsNil)
539 c.Assert(remotes, HasLen, 1)
540
541 head, err = r.Reference(plumbing.HEAD, false)
542 c.Assert(err, IsNil)
543 c.Assert(head, NotNil)
544 c.Assert(head.Type(), Equals, plumbing.SymbolicReference)
545 c.Assert(head.Target().String(), Equals, "refs/heads/master")
546
547 branch, err := r.Reference(head.Target(), false)
548 c.Assert(err, IsNil)
549 c.Assert(branch, NotNil)
550 c.Assert(branch.Hash().String(), Equals, "6ecf0ef2c2dffb796033e5a02219af86ec6584e5")
551
552 branch, err = r.Reference("refs/remotes/origin/master", false)
553 c.Assert(err, IsNil)
554 c.Assert(branch, NotNil)
555 c.Assert(branch.Type(), Equals, plumbing.HashReference)
556 c.Assert(branch.Hash().String(), Equals, "6ecf0ef2c2dffb796033e5a02219af86ec6584e5")
557
558 fi, err := fs.ReadDir("")
559 c.Assert(err, IsNil)
560 c.Assert(fi, HasLen, 8)
561}
562
563func (s *RepositorySuite) TestCloneConfig(c *C) {
564 r, _ := Init(memory.NewStorage(), nil)
565
566 head, err := r.Head()
567 c.Assert(err, Equals, plumbing.ErrReferenceNotFound)
568 c.Assert(head, IsNil)
569
570 err = r.clone(context.Background(), &CloneOptions{
571 URL: s.GetBasicLocalRepositoryURL(),
572 })
573
574 c.Assert(err, IsNil)
575
576 cfg, err := r.Config()
577 c.Assert(err, IsNil)
578
579 c.Assert(cfg.Core.IsBare, Equals, true)
580 c.Assert(cfg.Remotes, HasLen, 1)
581 c.Assert(cfg.Remotes["origin"].Name, Equals, "origin")
582 c.Assert(cfg.Remotes["origin"].URLs, HasLen, 1)
583}
584
585func (s *RepositorySuite) TestCloneSingleBranchAndNonHEAD(c *C) {
586 r, _ := Init(memory.NewStorage(), nil)
587
588 head, err := r.Head()
589 c.Assert(err, Equals, plumbing.ErrReferenceNotFound)
590 c.Assert(head, IsNil)
591
592 err = r.clone(context.Background(), &CloneOptions{
593 URL: s.GetBasicLocalRepositoryURL(),
594 ReferenceName: plumbing.ReferenceName("refs/heads/branch"),
595 SingleBranch: true,
596 })
597
598 c.Assert(err, IsNil)
599
600 remotes, err := r.Remotes()
601 c.Assert(err, IsNil)
602 c.Assert(remotes, HasLen, 1)
603
604 head, err = r.Reference(plumbing.HEAD, false)
605 c.Assert(err, IsNil)
606 c.Assert(head, NotNil)
607 c.Assert(head.Type(), Equals, plumbing.SymbolicReference)
608 c.Assert(head.Target().String(), Equals, "refs/heads/branch")
609
610 branch, err := r.Reference(head.Target(), false)
611 c.Assert(err, IsNil)
612 c.Assert(branch, NotNil)
613 c.Assert(branch.Hash().String(), Equals, "e8d3ffab552895c19b9fcf7aa264d277cde33881")
614
615 branch, err = r.Reference("refs/remotes/origin/branch", false)
616 c.Assert(err, IsNil)
617 c.Assert(branch, NotNil)
618 c.Assert(branch.Type(), Equals, plumbing.HashReference)
619 c.Assert(branch.Hash().String(), Equals, "e8d3ffab552895c19b9fcf7aa264d277cde33881")
620}
621
622func (s *RepositorySuite) TestCloneSingleBranch(c *C) {
623 r, _ := Init(memory.NewStorage(), nil)
624
625 head, err := r.Head()
626 c.Assert(err, Equals, plumbing.ErrReferenceNotFound)
627 c.Assert(head, IsNil)
628
629 err = r.clone(context.Background(), &CloneOptions{
630 URL: s.GetBasicLocalRepositoryURL(),
631 SingleBranch: true,
632 })
633
634 c.Assert(err, IsNil)
635
636 remotes, err := r.Remotes()
637 c.Assert(err, IsNil)
638 c.Assert(remotes, HasLen, 1)
639
640 head, err = r.Reference(plumbing.HEAD, false)
641 c.Assert(err, IsNil)
642 c.Assert(head, NotNil)
643 c.Assert(head.Type(), Equals, plumbing.SymbolicReference)
644 c.Assert(head.Target().String(), Equals, "refs/heads/master")
645
646 branch, err := r.Reference(head.Target(), false)
647 c.Assert(err, IsNil)
648 c.Assert(branch, NotNil)
649 c.Assert(branch.Hash().String(), Equals, "6ecf0ef2c2dffb796033e5a02219af86ec6584e5")
650
651 branch, err = r.Reference("refs/remotes/origin/master", false)
652 c.Assert(err, IsNil)
653 c.Assert(branch, NotNil)
654 c.Assert(branch.Type(), Equals, plumbing.HashReference)
655 c.Assert(branch.Hash().String(), Equals, "6ecf0ef2c2dffb796033e5a02219af86ec6584e5")
656}
657
658func (s *RepositorySuite) TestCloneDetachedHEAD(c *C) {
659 r, _ := Init(memory.NewStorage(), nil)
660 err := r.clone(context.Background(), &CloneOptions{
661 URL: s.GetBasicLocalRepositoryURL(),
662 ReferenceName: plumbing.ReferenceName("refs/tags/v1.0.0"),
663 })
664 c.Assert(err, IsNil)
665
666 head, err := r.Reference(plumbing.HEAD, false)
667 c.Assert(err, IsNil)
668 c.Assert(head, NotNil)
669 c.Assert(head.Type(), Equals, plumbing.HashReference)
670 c.Assert(head.Hash().String(), Equals, "6ecf0ef2c2dffb796033e5a02219af86ec6584e5")
671
672 count := 0
673 objects, err := r.Objects()
674 c.Assert(err, IsNil)
675 objects.ForEach(func(object.Object) error { count++; return nil })
676 c.Assert(count, Equals, 31)
677}
678
679func (s *RepositorySuite) TestCloneDetachedHEADAndShallow(c *C) {
680 r, _ := Init(memory.NewStorage(), memfs.New())
681 err := r.clone(context.Background(), &CloneOptions{
682 URL: s.GetBasicLocalRepositoryURL(),
683 ReferenceName: plumbing.ReferenceName("refs/tags/v1.0.0"),
684 Depth: 1,
685 })
686
687 c.Assert(err, IsNil)
688
689 head, err := r.Reference(plumbing.HEAD, false)
690 c.Assert(err, IsNil)
691 c.Assert(head, NotNil)
692 c.Assert(head.Type(), Equals, plumbing.HashReference)
693 c.Assert(head.Hash().String(), Equals, "6ecf0ef2c2dffb796033e5a02219af86ec6584e5")
694
695 count := 0
696 objects, err := r.Objects()
697 c.Assert(err, IsNil)
698 objects.ForEach(func(object.Object) error { count++; return nil })
699 c.Assert(count, Equals, 15)
700}
701
702func (s *RepositorySuite) TestCloneDetachedHEADAnnotatedTag(c *C) {
703 r, _ := Init(memory.NewStorage(), nil)
704 err := r.clone(context.Background(), &CloneOptions{
705 URL: s.GetLocalRepositoryURL(fixtures.ByTag("tags").One()),
706 ReferenceName: plumbing.ReferenceName("refs/tags/annotated-tag"),
707 })
708 c.Assert(err, IsNil)
709
710 head, err := r.Reference(plumbing.HEAD, false)
711 c.Assert(err, IsNil)
712 c.Assert(head, NotNil)
713 c.Assert(head.Type(), Equals, plumbing.HashReference)
714 c.Assert(head.Hash().String(), Equals, "f7b877701fbf855b44c0a9e86f3fdce2c298b07f")
715
716 count := 0
717 objects, err := r.Objects()
718 c.Assert(err, IsNil)
719 objects.ForEach(func(object.Object) error { count++; return nil })
720 c.Assert(count, Equals, 7)
721}
722
723func (s *RepositorySuite) TestPush(c *C) {
724 url := c.MkDir()
725 server, err := PlainInit(url, true)
726 c.Assert(err, IsNil)
727
728 _, err = s.Repository.CreateRemote(&config.RemoteConfig{
729 Name: "test",
730 URLs: []string{url},
731 })
732 c.Assert(err, IsNil)
733
734 err = s.Repository.Push(&PushOptions{
735 RemoteName: "test",
736 })
737 c.Assert(err, IsNil)
738
739 AssertReferences(c, server, map[string]string{
740 "refs/heads/master": "6ecf0ef2c2dffb796033e5a02219af86ec6584e5",
741 "refs/heads/branch": "e8d3ffab552895c19b9fcf7aa264d277cde33881",
742 })
743
744 AssertReferences(c, s.Repository, map[string]string{
745 "refs/remotes/test/master": "6ecf0ef2c2dffb796033e5a02219af86ec6584e5",
746 "refs/remotes/test/branch": "e8d3ffab552895c19b9fcf7aa264d277cde33881",
747 })
748}
749
750func (s *RepositorySuite) TestPushContext(c *C) {
751 url := c.MkDir()
752 _, err := PlainInit(url, true)
753 c.Assert(err, IsNil)
754
755 _, err = s.Repository.CreateRemote(&config.RemoteConfig{
756 Name: "foo",
757 URLs: []string{url},
758 })
759 c.Assert(err, IsNil)
760
761 ctx, cancel := context.WithCancel(context.Background())
762 cancel()
763
764 err = s.Repository.PushContext(ctx, &PushOptions{
765 RemoteName: "foo",
766 })
767 c.Assert(err, NotNil)
768}
769
770// installPreReceiveHook installs a pre-receive hook in the .git
771// directory at path which prints message m before exiting
772// successfully.
773func installPreReceiveHook(c *C, path, m string) {
774 hooks := filepath.Join(path, "hooks")
775 err := os.MkdirAll(hooks, 0777)
776 c.Assert(err, IsNil)
777
778 err = ioutil.WriteFile(filepath.Join(hooks, "pre-receive"), preReceiveHook(m), 0777)
779 c.Assert(err, IsNil)
780}
781
782func (s *RepositorySuite) TestPushWithProgress(c *C) {
783 url := c.MkDir()
784 server, err := PlainInit(url, true)
785 c.Assert(err, IsNil)
786
787 m := "Receiving..."
788 installPreReceiveHook(c, url, m)
789
790 _, err = s.Repository.CreateRemote(&config.RemoteConfig{
791 Name: "bar",
792 URLs: []string{url},
793 })
794 c.Assert(err, IsNil)
795
796 var p bytes.Buffer
797 err = s.Repository.Push(&PushOptions{
798 RemoteName: "bar",
799 Progress: &p,
800 })
801 c.Assert(err, IsNil)
802
803 AssertReferences(c, server, map[string]string{
804 "refs/heads/master": "6ecf0ef2c2dffb796033e5a02219af86ec6584e5",
805 "refs/heads/branch": "e8d3ffab552895c19b9fcf7aa264d277cde33881",
806 })
807
808 c.Assert((&p).Bytes(), DeepEquals, []byte(m))
809}
810
811func (s *RepositorySuite) TestPushDepth(c *C) {
812 url := c.MkDir()
813 server, err := PlainClone(url, true, &CloneOptions{
814 URL: fixtures.Basic().One().DotGit().Root(),
815 })
816
817 c.Assert(err, IsNil)
818
819 r, err := Clone(memory.NewStorage(), memfs.New(), &CloneOptions{
820 URL: url,
821 Depth: 1,
822 })
823 c.Assert(err, IsNil)
824
825 err = util.WriteFile(r.wt, "foo", nil, 0755)
826 c.Assert(err, IsNil)
827
828 w, err := r.Worktree()
829 c.Assert(err, IsNil)
830
831 _, err = w.Add("foo")
832 c.Assert(err, IsNil)
833
834 hash, err := w.Commit("foo", &CommitOptions{
835 Author: defaultSignature(),
836 Committer: defaultSignature(),
837 })
838 c.Assert(err, IsNil)
839
840 err = r.Push(&PushOptions{})
841 c.Assert(err, IsNil)
842
843 AssertReferences(c, server, map[string]string{
844 "refs/heads/master": hash.String(),
845 })
846
847 AssertReferences(c, r, map[string]string{
848 "refs/remotes/origin/master": hash.String(),
849 })
850}
851
852func (s *RepositorySuite) TestPushNonExistentRemote(c *C) {
853 srcFs := fixtures.Basic().One().DotGit()
854 sto, err := filesystem.NewStorage(srcFs)
855 c.Assert(err, IsNil)
856
857 r, err := Open(sto, srcFs)
858 c.Assert(err, IsNil)
859
860 err = r.Push(&PushOptions{RemoteName: "myremote"})
861 c.Assert(err, ErrorMatches, ".*remote not found.*")
862}
863
864func (s *RepositorySuite) TestLog(c *C) {
865 r, _ := Init(memory.NewStorage(), nil)
866 err := r.clone(context.Background(), &CloneOptions{
867 URL: s.GetBasicLocalRepositoryURL(),
868 })
869
870 c.Assert(err, IsNil)
871
872 cIter, err := r.Log(&LogOptions{
873 plumbing.NewHash("b8e471f58bcbca63b07bda20e428190409c2db47"),
874 })
875
876 c.Assert(err, IsNil)
877
878 commitOrder := []plumbing.Hash{
879 plumbing.NewHash("b8e471f58bcbca63b07bda20e428190409c2db47"),
880 plumbing.NewHash("b029517f6300c2da0f4b651b8642506cd6aaf45d"),
881 }
882
883 for _, o := range commitOrder {
884 commit, err := cIter.Next()
885 c.Assert(err, IsNil)
886 c.Assert(commit.Hash, Equals, o)
887 }
888 _, err = cIter.Next()
889 c.Assert(err, Equals, io.EOF)
890}
891
892func (s *RepositorySuite) TestLogHead(c *C) {
893 r, _ := Init(memory.NewStorage(), nil)
894 err := r.clone(context.Background(), &CloneOptions{
895 URL: s.GetBasicLocalRepositoryURL(),
896 })
897
898 c.Assert(err, IsNil)
899
900 cIter, err := r.Log(&LogOptions{})
901
902 c.Assert(err, IsNil)
903
904 commitOrder := []plumbing.Hash{
905 plumbing.NewHash("6ecf0ef2c2dffb796033e5a02219af86ec6584e5"),
906 plumbing.NewHash("918c48b83bd081e863dbe1b80f8998f058cd8294"),
907 plumbing.NewHash("af2d6a6954d532f8ffb47615169c8fdf9d383a1a"),
908 plumbing.NewHash("1669dce138d9b841a518c64b10914d88f5e488ea"),
909 plumbing.NewHash("35e85108805c84807bc66a02d91535e1e24b38b9"),
910 plumbing.NewHash("b029517f6300c2da0f4b651b8642506cd6aaf45d"),
911 plumbing.NewHash("a5b8b09e2f8fcb0bb99d3ccb0958157b40890d69"),
912 plumbing.NewHash("b8e471f58bcbca63b07bda20e428190409c2db47"),
913 }
914
915 for _, o := range commitOrder {
916 commit, err := cIter.Next()
917 c.Assert(err, IsNil)
918 c.Assert(commit.Hash, Equals, o)
919 }
920 _, err = cIter.Next()
921 c.Assert(err, Equals, io.EOF)
922}
923
924func (s *RepositorySuite) TestLogError(c *C) {
925 r, _ := Init(memory.NewStorage(), nil)
926 err := r.clone(context.Background(), &CloneOptions{
927 URL: s.GetBasicLocalRepositoryURL(),
928 })
929
930 c.Assert(err, IsNil)
931
932 _, err = r.Log(&LogOptions{
933 plumbing.NewHash("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
934 })
935 c.Assert(err, NotNil)
936}
937
938func (s *RepositorySuite) TestCommit(c *C) {
939 r, _ := Init(memory.NewStorage(), nil)
940 err := r.clone(context.Background(), &CloneOptions{
941 URL: s.GetBasicLocalRepositoryURL(),
942 })
943
944 c.Assert(err, IsNil)
945
946 hash := plumbing.NewHash("b8e471f58bcbca63b07bda20e428190409c2db47")
947 commit, err := r.CommitObject(hash)
948 c.Assert(err, IsNil)
949
950 c.Assert(commit.Hash.IsZero(), Equals, false)
951 c.Assert(commit.Hash, Equals, commit.ID())
952 c.Assert(commit.Hash, Equals, hash)
953 c.Assert(commit.Type(), Equals, plumbing.CommitObject)
954
955 tree, err := commit.Tree()
956 c.Assert(err, IsNil)
957 c.Assert(tree.Hash.IsZero(), Equals, false)
958
959 c.Assert(commit.Author.Email, Equals, "daniel@lordran.local")
960}
961
962func (s *RepositorySuite) TestCommits(c *C) {
963 r, _ := Init(memory.NewStorage(), nil)
964 err := r.clone(context.Background(), &CloneOptions{URL: s.GetBasicLocalRepositoryURL()})
965 c.Assert(err, IsNil)
966
967 count := 0
968 commits, err := r.CommitObjects()
969 c.Assert(err, IsNil)
970 for {
971 commit, err := commits.Next()
972 if err != nil {
973 break
974 }
975
976 count++
977 c.Assert(commit.Hash.IsZero(), Equals, false)
978 c.Assert(commit.Hash, Equals, commit.ID())
979 c.Assert(commit.Type(), Equals, plumbing.CommitObject)
980 }
981
982 c.Assert(count, Equals, 9)
983}
984
985func (s *RepositorySuite) TestBlob(c *C) {
986 r, _ := Init(memory.NewStorage(), nil)
987 err := r.clone(context.Background(), &CloneOptions{
988 URL: s.GetBasicLocalRepositoryURL(),
989 })
990
991 c.Assert(err, IsNil)
992
993 blob, err := r.BlobObject(plumbing.NewHash("b8e471f58bcbca63b07bda20e428190409c2db47"))
994 c.Assert(err, NotNil)
995 c.Assert(blob, IsNil)
996
997 blobHash := plumbing.NewHash("9a48f23120e880dfbe41f7c9b7b708e9ee62a492")
998 blob, err = r.BlobObject(blobHash)
999 c.Assert(err, IsNil)
1000
1001 c.Assert(blob.Hash.IsZero(), Equals, false)
1002 c.Assert(blob.Hash, Equals, blob.ID())
1003 c.Assert(blob.Hash, Equals, blobHash)
1004 c.Assert(blob.Type(), Equals, plumbing.BlobObject)
1005}
1006
1007func (s *RepositorySuite) TestBlobs(c *C) {
1008 r, _ := Init(memory.NewStorage(), nil)
1009 err := r.clone(context.Background(), &CloneOptions{URL: s.GetBasicLocalRepositoryURL()})
1010 c.Assert(err, IsNil)
1011
1012 count := 0
1013 blobs, err := r.BlobObjects()
1014 c.Assert(err, IsNil)
1015 for {
1016 blob, err := blobs.Next()
1017 if err != nil {
1018 break
1019 }
1020
1021 count++
1022 c.Assert(blob.Hash.IsZero(), Equals, false)
1023 c.Assert(blob.Hash, Equals, blob.ID())
1024 c.Assert(blob.Type(), Equals, plumbing.BlobObject)
1025 }
1026
1027 c.Assert(count, Equals, 10)
1028}
1029
1030func (s *RepositorySuite) TestTagObject(c *C) {
1031 url := s.GetLocalRepositoryURL(
1032 fixtures.ByURL("https://github.com/git-fixtures/tags.git").One(),
1033 )
1034
1035 r, _ := Init(memory.NewStorage(), nil)
1036 err := r.clone(context.Background(), &CloneOptions{URL: url})
1037 c.Assert(err, IsNil)
1038
1039 hash := plumbing.NewHash("ad7897c0fb8e7d9a9ba41fa66072cf06095a6cfc")
1040 tag, err := r.TagObject(hash)
1041 c.Assert(err, IsNil)
1042
1043 c.Assert(tag.Hash.IsZero(), Equals, false)
1044 c.Assert(tag.Hash, Equals, hash)
1045 c.Assert(tag.Type(), Equals, plumbing.TagObject)
1046}
1047
1048func (s *RepositorySuite) TestTags(c *C) {
1049 url := s.GetLocalRepositoryURL(
1050 fixtures.ByURL("https://github.com/git-fixtures/tags.git").One(),
1051 )
1052
1053 r, _ := Init(memory.NewStorage(), nil)
1054 err := r.clone(context.Background(), &CloneOptions{URL: url})
1055 c.Assert(err, IsNil)
1056
1057 count := 0
1058 tags, err := r.Tags()
1059 c.Assert(err, IsNil)
1060
1061 tags.ForEach(func(tag *plumbing.Reference) error {
1062 count++
1063 c.Assert(tag.Hash().IsZero(), Equals, false)
1064 c.Assert(tag.Name().IsTag(), Equals, true)
1065 return nil
1066 })
1067
1068 c.Assert(count, Equals, 5)
1069}
1070
1071func (s *RepositorySuite) TestBranches(c *C) {
1072 f := fixtures.ByURL("https://github.com/git-fixtures/root-references.git").One()
1073 sto, err := filesystem.NewStorage(f.DotGit())
1074 c.Assert(err, IsNil)
1075 r, err := Open(sto, f.DotGit())
1076 c.Assert(err, IsNil)
1077
1078 count := 0
1079 branches, err := r.Branches()
1080 c.Assert(err, IsNil)
1081
1082 branches.ForEach(func(branch *plumbing.Reference) error {
1083 count++
1084 c.Assert(branch.Hash().IsZero(), Equals, false)
1085 c.Assert(branch.Name().IsBranch(), Equals, true)
1086 return nil
1087 })
1088
1089 c.Assert(count, Equals, 8)
1090}
1091
1092func (s *RepositorySuite) TestNotes(c *C) {
1093 // TODO add fixture with Notes
1094 url := s.GetLocalRepositoryURL(
1095 fixtures.ByURL("https://github.com/git-fixtures/tags.git").One(),
1096 )
1097
1098 r, _ := Init(memory.NewStorage(), nil)
1099 err := r.clone(context.Background(), &CloneOptions{URL: url})
1100 c.Assert(err, IsNil)
1101
1102 count := 0
1103 notes, err := r.Notes()
1104 c.Assert(err, IsNil)
1105
1106 notes.ForEach(func(note *plumbing.Reference) error {
1107 count++
1108 c.Assert(note.Hash().IsZero(), Equals, false)
1109 c.Assert(note.Name().IsNote(), Equals, true)
1110 return nil
1111 })
1112
1113 c.Assert(count, Equals, 0)
1114}
1115
1116func (s *RepositorySuite) TestTree(c *C) {
1117 r, _ := Init(memory.NewStorage(), nil)
1118 err := r.clone(context.Background(), &CloneOptions{
1119 URL: s.GetBasicLocalRepositoryURL(),
1120 })
1121 c.Assert(err, IsNil)
1122
1123 invalidHash := plumbing.NewHash("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")
1124 tree, err := r.TreeObject(invalidHash)
1125 c.Assert(tree, IsNil)
1126 c.Assert(err, NotNil)
1127
1128 hash := plumbing.NewHash("dbd3641b371024f44d0e469a9c8f5457b0660de1")
1129 tree, err = r.TreeObject(hash)
1130 c.Assert(err, IsNil)
1131
1132 c.Assert(tree.Hash.IsZero(), Equals, false)
1133 c.Assert(tree.Hash, Equals, tree.ID())
1134 c.Assert(tree.Hash, Equals, hash)
1135 c.Assert(tree.Type(), Equals, plumbing.TreeObject)
1136 c.Assert(len(tree.Entries), Not(Equals), 0)
1137}
1138
1139func (s *RepositorySuite) TestTrees(c *C) {
1140 r, _ := Init(memory.NewStorage(), nil)
1141 err := r.clone(context.Background(), &CloneOptions{URL: s.GetBasicLocalRepositoryURL()})
1142 c.Assert(err, IsNil)
1143
1144 count := 0
1145 trees, err := r.TreeObjects()
1146 c.Assert(err, IsNil)
1147 for {
1148 tree, err := trees.Next()
1149 if err != nil {
1150 break
1151 }
1152
1153 count++
1154 c.Assert(tree.Hash.IsZero(), Equals, false)
1155 c.Assert(tree.Hash, Equals, tree.ID())
1156 c.Assert(tree.Type(), Equals, plumbing.TreeObject)
1157 c.Assert(len(tree.Entries), Not(Equals), 0)
1158 }
1159
1160 c.Assert(count, Equals, 12)
1161}
1162
1163func (s *RepositorySuite) TestTagObjects(c *C) {
1164 url := s.GetLocalRepositoryURL(
1165 fixtures.ByURL("https://github.com/git-fixtures/tags.git").One(),
1166 )
1167
1168 r, _ := Init(memory.NewStorage(), nil)
1169 err := r.clone(context.Background(), &CloneOptions{URL: url})
1170 c.Assert(err, IsNil)
1171
1172 count := 0
1173 tags, err := r.TagObjects()
1174 c.Assert(err, IsNil)
1175
1176 tags.ForEach(func(tag *object.Tag) error {
1177 count++
1178
1179 c.Assert(tag.Hash.IsZero(), Equals, false)
1180 c.Assert(tag.Type(), Equals, plumbing.TagObject)
1181 return nil
1182 })
1183
1184 refs, _ := r.References()
1185 refs.ForEach(func(ref *plumbing.Reference) error {
1186 return nil
1187 })
1188
1189 c.Assert(count, Equals, 4)
1190}
1191
1192func (s *RepositorySuite) TestCommitIterClosePanic(c *C) {
1193 r, _ := Init(memory.NewStorage(), nil)
1194 err := r.clone(context.Background(), &CloneOptions{URL: s.GetBasicLocalRepositoryURL()})
1195 c.Assert(err, IsNil)
1196
1197 commits, err := r.CommitObjects()
1198 c.Assert(err, IsNil)
1199 commits.Close()
1200}
1201
1202func (s *RepositorySuite) TestRef(c *C) {
1203 r, _ := Init(memory.NewStorage(), nil)
1204 err := r.clone(context.Background(), &CloneOptions{URL: s.GetBasicLocalRepositoryURL()})
1205 c.Assert(err, IsNil)
1206
1207 ref, err := r.Reference(plumbing.HEAD, false)
1208 c.Assert(err, IsNil)
1209 c.Assert(ref.Name(), Equals, plumbing.HEAD)
1210
1211 ref, err = r.Reference(plumbing.HEAD, true)
1212 c.Assert(err, IsNil)
1213 c.Assert(ref.Name(), Equals, plumbing.ReferenceName("refs/heads/master"))
1214}
1215
1216func (s *RepositorySuite) TestRefs(c *C) {
1217 r, _ := Init(memory.NewStorage(), nil)
1218 err := r.clone(context.Background(), &CloneOptions{URL: s.GetBasicLocalRepositoryURL()})
1219 c.Assert(err, IsNil)
1220
1221 c.Assert(err, IsNil)
1222
1223 iter, err := r.References()
1224 c.Assert(err, IsNil)
1225 c.Assert(iter, NotNil)
1226}
1227
1228func (s *RepositorySuite) TestObject(c *C) {
1229 r, _ := Init(memory.NewStorage(), nil)
1230 err := r.clone(context.Background(), &CloneOptions{URL: s.GetBasicLocalRepositoryURL()})
1231 c.Assert(err, IsNil)
1232
1233 hash := plumbing.NewHash("6ecf0ef2c2dffb796033e5a02219af86ec6584e5")
1234 o, err := r.Object(plumbing.CommitObject, hash)
1235 c.Assert(err, IsNil)
1236
1237 c.Assert(o.ID().IsZero(), Equals, false)
1238 c.Assert(o.Type(), Equals, plumbing.CommitObject)
1239}
1240
1241func (s *RepositorySuite) TestObjects(c *C) {
1242 r, _ := Init(memory.NewStorage(), nil)
1243 err := r.clone(context.Background(), &CloneOptions{URL: s.GetBasicLocalRepositoryURL()})
1244 c.Assert(err, IsNil)
1245
1246 count := 0
1247 objects, err := r.Objects()
1248 c.Assert(err, IsNil)
1249 for {
1250 o, err := objects.Next()
1251 if err != nil {
1252 break
1253 }
1254
1255 count++
1256 c.Assert(o.ID().IsZero(), Equals, false)
1257 c.Assert(o.Type(), Not(Equals), plumbing.AnyObject)
1258 }
1259
1260 c.Assert(count, Equals, 31)
1261}
1262
1263func (s *RepositorySuite) TestObjectNotFound(c *C) {
1264 r, _ := Init(memory.NewStorage(), nil)
1265 err := r.clone(context.Background(), &CloneOptions{URL: s.GetBasicLocalRepositoryURL()})
1266 c.Assert(err, IsNil)
1267
1268 hash := plumbing.NewHash("0a3fb06ff80156fb153bcdcc58b5e16c2d27625c")
1269 tag, err := r.Object(plumbing.TagObject, hash)
1270 c.Assert(err, DeepEquals, plumbing.ErrObjectNotFound)
1271 c.Assert(tag, IsNil)
1272}
1273
1274func (s *RepositorySuite) TestWorktree(c *C) {
1275 def := memfs.New()
1276 r, _ := Init(memory.NewStorage(), def)
1277 w, err := r.Worktree()
1278 c.Assert(err, IsNil)
1279 c.Assert(w.Filesystem, Equals, def)
1280}
1281
1282func (s *RepositorySuite) TestWorktreeBare(c *C) {
1283 r, _ := Init(memory.NewStorage(), nil)
1284 w, err := r.Worktree()
1285 c.Assert(err, Equals, ErrIsBareRepository)
1286 c.Assert(w, IsNil)
1287}
1288
1289func (s *RepositorySuite) TestResolveRevision(c *C) {
1290 f := fixtures.ByURL("https://github.com/git-fixtures/basic.git").One()
1291 sto, err := filesystem.NewStorage(f.DotGit())
1292 c.Assert(err, IsNil)
1293 r, err := Open(sto, f.DotGit())
1294 c.Assert(err, IsNil)
1295
1296 datas := map[string]string{
1297 "HEAD": "6ecf0ef2c2dffb796033e5a02219af86ec6584e5",
1298 "heads/master": "6ecf0ef2c2dffb796033e5a02219af86ec6584e5",
1299 "heads/master~1": "918c48b83bd081e863dbe1b80f8998f058cd8294",
1300 "refs/heads/master": "6ecf0ef2c2dffb796033e5a02219af86ec6584e5",
1301 "refs/heads/master~2^^~": "b029517f6300c2da0f4b651b8642506cd6aaf45d",
1302 "refs/tags/v1.0.0": "6ecf0ef2c2dffb796033e5a02219af86ec6584e5",
1303 "refs/remotes/origin/master": "6ecf0ef2c2dffb796033e5a02219af86ec6584e5",
1304 "refs/remotes/origin/HEAD": "6ecf0ef2c2dffb796033e5a02219af86ec6584e5",
1305 "HEAD~2^^~": "b029517f6300c2da0f4b651b8642506cd6aaf45d",
1306 "HEAD~3^2": "a5b8b09e2f8fcb0bb99d3ccb0958157b40890d69",
1307 "HEAD~3^2^0": "a5b8b09e2f8fcb0bb99d3ccb0958157b40890d69",
1308 "HEAD~2^{/binary file}": "35e85108805c84807bc66a02d91535e1e24b38b9",
1309 "HEAD~^{/!-some}": "1669dce138d9b841a518c64b10914d88f5e488ea",
1310 "master": "6ecf0ef2c2dffb796033e5a02219af86ec6584e5",
1311 "branch": "e8d3ffab552895c19b9fcf7aa264d277cde33881",
1312 "v1.0.0": "6ecf0ef2c2dffb796033e5a02219af86ec6584e5",
1313 "branch~1": "918c48b83bd081e863dbe1b80f8998f058cd8294",
1314 "v1.0.0~1": "918c48b83bd081e863dbe1b80f8998f058cd8294",
1315 "master~1": "918c48b83bd081e863dbe1b80f8998f058cd8294",
1316 }
1317
1318 for rev, hash := range datas {
1319 h, err := r.ResolveRevision(plumbing.Revision(rev))
1320
1321 c.Assert(err, IsNil)
1322 c.Assert(h.String(), Equals, hash)
1323 }
1324}
1325
1326func (s *RepositorySuite) TestResolveRevisionWithErrors(c *C) {
1327 url := s.GetLocalRepositoryURL(
1328 fixtures.ByURL("https://github.com/git-fixtures/basic.git").One(),
1329 )
1330
1331 r, _ := Init(memory.NewStorage(), nil)
1332 err := r.clone(context.Background(), &CloneOptions{URL: url})
1333 c.Assert(err, IsNil)
1334
1335 datas := map[string]string{
1336 "efs/heads/master~": "reference not found",
1337 "HEAD^3": `Revision invalid : "3" found must be 0, 1 or 2 after "^"`,
1338 "HEAD^{/whatever}": `No commit message match regexp : "whatever"`,
1339 }
1340
1341 for rev, rerr := range datas {
1342 _, err := r.ResolveRevision(plumbing.Revision(rev))
1343
1344 c.Assert(err.Error(), Equals, rerr)
1345 }
1346}
1347
1348func (s *RepositorySuite) testRepackObjects(
1349 c *C, deleteTime time.Time, expectedPacks int) {
1350 srcFs := fixtures.ByTag("unpacked").One().DotGit()
1351 var sto storage.Storer
1352 var err error
1353 sto, err = filesystem.NewStorage(srcFs)
1354 c.Assert(err, IsNil)
1355
1356 los := sto.(storer.LooseObjectStorer)
1357 c.Assert(los, NotNil)
1358
1359 numLooseStart := 0
1360 err = los.ForEachObjectHash(func(_ plumbing.Hash) error {
1361 numLooseStart++
1362 return nil
1363 })
1364 c.Assert(err, IsNil)
1365 c.Assert(numLooseStart > 0, Equals, true)
1366
1367 pos := sto.(storer.PackedObjectStorer)
1368 c.Assert(los, NotNil)
1369
1370 packs, err := pos.ObjectPacks()
1371 c.Assert(err, IsNil)
1372 numPacksStart := len(packs)
1373 c.Assert(numPacksStart > 1, Equals, true)
1374
1375 r, err := Open(sto, srcFs)
1376 c.Assert(err, IsNil)
1377 c.Assert(r, NotNil)
1378
1379 err = r.RepackObjects(&RepackConfig{
1380 OnlyDeletePacksOlderThan: deleteTime,
1381 })
1382 c.Assert(err, IsNil)
1383
1384 numLooseEnd := 0
1385 err = los.ForEachObjectHash(func(_ plumbing.Hash) error {
1386 numLooseEnd++
1387 return nil
1388 })
1389 c.Assert(err, IsNil)
1390 c.Assert(numLooseEnd, Equals, 0)
1391
1392 packs, err = pos.ObjectPacks()
1393 c.Assert(err, IsNil)
1394 numPacksEnd := len(packs)
1395 c.Assert(numPacksEnd, Equals, expectedPacks)
1396}
1397
1398func (s *RepositorySuite) TestRepackObjects(c *C) {
1399 s.testRepackObjects(c, time.Time{}, 1)
1400}
1401
1402func (s *RepositorySuite) TestRepackObjectsWithNoDelete(c *C) {
1403 s.testRepackObjects(c, time.Unix(0, 1), 3)
1404}
1405
1406func ExecuteOnPath(c *C, path string, cmds ...string) error {
1407 for _, cmd := range cmds {
1408 err := executeOnPath(path, cmd)
1409 c.Assert(err, IsNil)
1410 }
1411
1412 return nil
1413}
1414
1415func executeOnPath(path, cmd string) error {
1416 args := strings.Split(cmd, " ")
1417 c := exec.Command(args[0], args[1:]...)
1418 c.Dir = path
1419 c.Env = os.Environ()
1420
1421 buf := bytes.NewBuffer(nil)
1422 c.Stderr = buf
1423 c.Stdout = buf
1424
1425 //defer func() { fmt.Println(buf.String()) }()
1426
1427 return c.Run()
1428}