1package git
2
3import (
4 "testing"
5 "time"
6
7 "github.com/go-git/go-git/v5/plumbing"
8 "github.com/go-git/go-git/v5/plumbing/cache"
9 "github.com/go-git/go-git/v5/plumbing/storer"
10 "github.com/go-git/go-git/v5/storage"
11 "github.com/go-git/go-git/v5/storage/filesystem"
12 "github.com/stretchr/testify/suite"
13
14 fixtures "github.com/go-git/go-git-fixtures/v4"
15)
16
17type PruneSuite struct {
18 suite.Suite
19 BaseSuite
20}
21
22func TestPruneSuite(t *testing.T) {
23 suite.Run(t, new(PruneSuite))
24}
25
26func (s *PruneSuite) testPrune(deleteTime time.Time) {
27 srcFs := fixtures.ByTag("unpacked").One().DotGit()
28 var sto storage.Storer
29 var err error
30 sto = filesystem.NewStorage(srcFs, cache.NewObjectLRUDefault())
31
32 los := sto.(storer.LooseObjectStorer)
33 s.NotNil(los)
34
35 count := 0
36 err = los.ForEachObjectHash(func(_ plumbing.Hash) error {
37 count++
38 return nil
39 })
40 s.NoError(err)
41
42 r, err := Open(sto, srcFs)
43 s.NoError(err)
44 s.NotNil(r)
45
46 // Remove a branch so we can prune some objects.
47 err = sto.RemoveReference(plumbing.ReferenceName("refs/heads/v4"))
48 s.NoError(err)
49 err = sto.RemoveReference(plumbing.ReferenceName("refs/remotes/origin/v4"))
50 s.NoError(err)
51
52 err = r.Prune(PruneOptions{
53 OnlyObjectsOlderThan: deleteTime,
54 Handler: r.DeleteObject,
55 })
56 s.NoError(err)
57
58 newCount := 0
59 err = los.ForEachObjectHash(func(_ plumbing.Hash) error {
60 newCount++
61 return nil
62 })
63 s.NoError(err)
64
65 if deleteTime.IsZero() {
66 s.True(newCount < count)
67 } else {
68 // Assume a delete time older than any of the objects was passed in.
69 s.Equal(count, newCount)
70 }
71}
72
73func (s *PruneSuite) TestPrune() {
74 s.testPrune(time.Time{})
75}
76
77func (s *PruneSuite) TestPruneWithNoDelete() {
78 s.testPrune(time.Unix(0, 1))
79}