Skip to content
This repository was archived by the owner on Sep 11, 2020. It is now read-only.

Commit 88acc31

Browse files
committed
repository: add tests for pruning and object re-packing
Also, object re-packing should clean up any loose objects that were packed.
1 parent 4c15695 commit 88acc31

File tree

3 files changed

+150
-0
lines changed

3 files changed

+150
-0
lines changed

prune_test.go

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package git
2+
3+
import (
4+
"time"
5+
6+
"gopkg.in/src-d/go-git.v4/plumbing"
7+
"gopkg.in/src-d/go-git.v4/plumbing/storer"
8+
"gopkg.in/src-d/go-git.v4/storage"
9+
"gopkg.in/src-d/go-git.v4/storage/filesystem"
10+
11+
. "gopkg.in/check.v1"
12+
"gopkg.in/src-d/go-git-fixtures.v3"
13+
)
14+
15+
type PruneSuite struct {
16+
BaseSuite
17+
}
18+
19+
var _ = Suite(&PruneSuite{})
20+
21+
func (s *PruneSuite) TestPrune(c *C, deleteTime time.Time) {
22+
srcFs := fixtures.ByTag("unpacked").One().DotGit()
23+
var sto storage.Storer
24+
var err error
25+
sto, err = filesystem.NewStorage(srcFs)
26+
c.Assert(err, IsNil)
27+
28+
los := sto.(storer.LooseObjectStorer)
29+
c.Assert(los, NotNil)
30+
31+
count := 0
32+
err = los.ForEachObjectHash(func(_ plumbing.Hash) error {
33+
count++
34+
return nil
35+
})
36+
c.Assert(err, IsNil)
37+
38+
r, err := Open(sto, srcFs)
39+
c.Assert(err, IsNil)
40+
c.Assert(r, NotNil)
41+
42+
// Remove a branch so we can prune some objects.
43+
err = sto.RemoveReference(plumbing.ReferenceName("refs/heads/v4"))
44+
c.Assert(err, IsNil)
45+
err = sto.RemoveReference(plumbing.ReferenceName("refs/remotes/origin/v4"))
46+
c.Assert(err, IsNil)
47+
48+
err = r.Prune(PruneOptions{
49+
Handler: r.DeleteObject,
50+
})
51+
c.Assert(err, IsNil)
52+
53+
newCount := 0
54+
err = los.ForEachObjectHash(func(_ plumbing.Hash) error {
55+
newCount++
56+
return nil
57+
})
58+
if deleteTime.IsZero() {
59+
c.Assert(newCount < count, Equals, true)
60+
} else {
61+
// Assume a delete time older than any of the objects was passed in.
62+
c.Assert(newCount, Equals, count)
63+
}
64+
}
65+
66+
func (s *PruneSuite) TestPrune(c *C) {
67+
s.testPrune(c, time.Time{})
68+
}
69+
70+
func (s *PruneSuite) TestPruneWithNoDelete(c *C) {
71+
s.testPrune(c, time.Unix(0, 1))
72+
}

repository.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1088,5 +1088,22 @@ func (r *Repository) createNewObjectPack(cfg *RepackConfig) (h plumbing.Hash, er
10881088
if err != nil {
10891089
return h, err
10901090
}
1091+
1092+
// Delete the packed, loose objects.
1093+
if los, ok := r.Storer.(storer.LooseObjectStorer); ok {
1094+
err = los.ForEachObjectHash(func(hash plumbing.Hash) error {
1095+
if ow.isSeen(hash) {
1096+
err := los.DeleteLooseObject(hash)
1097+
if err != nil {
1098+
return err
1099+
}
1100+
}
1101+
return nil
1102+
})
1103+
if err != nil {
1104+
return h, err
1105+
}
1106+
}
1107+
10911108
return h, err
10921109
}

repository_test.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,13 @@ import (
1010
"os/exec"
1111
"path/filepath"
1212
"strings"
13+
"time"
1314

1415
"gopkg.in/src-d/go-git.v4/config"
1516
"gopkg.in/src-d/go-git.v4/plumbing"
1617
"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"
1720
"gopkg.in/src-d/go-git.v4/storage/filesystem"
1821
"gopkg.in/src-d/go-git.v4/storage/memory"
1922

@@ -1313,6 +1316,64 @@ func (s *RepositorySuite) TestResolveRevisionWithErrors(c *C) {
13131316
}
13141317
}
13151318

1319+
func (s *RepositorySuite) testRepackObjects(
1320+
c *C, deleteTime time.Time, expectedPacks int) {
1321+
srcFs := fixtures.ByTag("unpacked").One().DotGit()
1322+
var sto storage.Storer
1323+
var err error
1324+
sto, err = filesystem.NewStorage(srcFs)
1325+
c.Assert(err, IsNil)
1326+
1327+
los := sto.(storer.LooseObjectStorer)
1328+
c.Assert(los, NotNil)
1329+
1330+
numLooseStart := 0
1331+
err = los.ForEachObjectHash(func(_ plumbing.Hash) error {
1332+
numLooseStart++
1333+
return nil
1334+
})
1335+
c.Assert(err, IsNil)
1336+
c.Assert(numLooseStart > 0, Equals, true)
1337+
1338+
pos := sto.(storer.PackedObjectStorer)
1339+
c.Assert(los, NotNil)
1340+
1341+
packs, err := pos.ObjectPacks()
1342+
c.Assert(err, IsNil)
1343+
numPacksStart := len(packs)
1344+
c.Assert(numPacksStart > 1, Equals, true)
1345+
1346+
r, err := Open(sto, srcFs)
1347+
c.Assert(err, IsNil)
1348+
c.Assert(r, NotNil)
1349+
1350+
err = r.RepackObjects(&RepackConfig{
1351+
OnlyDeletePacksOlderThan: deleteTime,
1352+
})
1353+
c.Assert(err, IsNil)
1354+
1355+
numLooseEnd := 0
1356+
err = los.ForEachObjectHash(func(_ plumbing.Hash) error {
1357+
numLooseEnd++
1358+
return nil
1359+
})
1360+
c.Assert(err, IsNil)
1361+
c.Assert(numLooseEnd, Equals, 0)
1362+
1363+
packs, err = pos.ObjectPacks()
1364+
c.Assert(err, IsNil)
1365+
numPacksEnd := len(packs)
1366+
c.Assert(numPacksEnd, Equals, expectedPacks)
1367+
}
1368+
1369+
func (s *RepositorySuite) TestRepackObjects(c *C) {
1370+
s.testRepackObjects(c, time.Time{}, 1)
1371+
}
1372+
1373+
func (s *RepositorySuite) TestRepackObjectsWithNoDelete(c *C) {
1374+
s.testRepackObjects(c, time.Unix(0, 1), 3)
1375+
}
1376+
13161377
func ExecuteOnPath(c *C, path string, cmds ...string) error {
13171378
for _, cmd := range cmds {
13181379
err := executeOnPath(path, cmd)

0 commit comments

Comments
 (0)