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

Commit 4c15695

Browse files
committed
storer: separate loose and packed object mgmt into optional ifaces
Suggested by mcuadros.
1 parent b18457d commit 4c15695

File tree

4 files changed

+58
-49
lines changed

4 files changed

+58
-49
lines changed

plumbing/storer/object.go

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,26 @@ type EncodedObjectStorer interface {
4040
// HasEncodedObject returns ErrObjNotFound if the object doesn't
4141
// exist. If the object does exist, it returns nil.
4242
HasEncodedObject(plumbing.Hash) error
43+
}
44+
45+
// DeltaObjectStorer is an EncodedObjectStorer that can return delta
46+
// objects.
47+
type DeltaObjectStorer interface {
48+
// DeltaObject is the same as EncodedObject but without resolving deltas.
49+
// Deltas will be returned as plumbing.DeltaObject instances.
50+
DeltaObject(plumbing.ObjectType, plumbing.Hash) (plumbing.EncodedObject, error)
51+
}
52+
53+
// Transactioner is a optional method for ObjectStorer, it enable transaction
54+
// base write and read operations in the storage
55+
type Transactioner interface {
56+
// Begin starts a transaction.
57+
Begin() Transaction
58+
}
59+
60+
// LooseObjectStorer is an optional interface for managing "loose"
61+
// objects, i.e. those not in packfiles.
62+
type LooseObjectStorer interface {
4363
// ForEachObjectHash iterates over all the (loose) object hashes
4464
// in the repository without necessarily having to read those objects.
4565
// Objects only inside pack files may be omitted.
@@ -52,6 +72,11 @@ type EncodedObjectStorer interface {
5272
LooseObjectTime(plumbing.Hash) (time.Time, error)
5373
// DeleteLooseObject deletes a loose object if it exists.
5474
DeleteLooseObject(plumbing.Hash) error
75+
}
76+
77+
// PackedObjectStorer is an optional interface for managing objects in
78+
// packfiles.
79+
type PackedObjectStorer interface {
5580
// ObjectPacks returns hashes of object packs if the underlying
5681
// implementation has pack files.
5782
ObjectPacks() ([]plumbing.Hash, error)
@@ -60,21 +85,6 @@ type EncodedObjectStorer interface {
6085
DeleteOldObjectPackAndIndex(plumbing.Hash, time.Time) error
6186
}
6287

63-
// DeltaObjectStorer is an EncodedObjectStorer that can return delta
64-
// objects.
65-
type DeltaObjectStorer interface {
66-
// DeltaObject is the same as EncodedObject but without resolving deltas.
67-
// Deltas will be returned as plumbing.DeltaObject instances.
68-
DeltaObject(plumbing.ObjectType, plumbing.Hash) (plumbing.EncodedObject, error)
69-
}
70-
71-
// Transactioner is a optional method for ObjectStorer, it enable transaction
72-
// base write and read operations in the storage
73-
type Transactioner interface {
74-
// Begin starts a transaction.
75-
Begin() Transaction
76-
}
77-
7888
// PackfileWriter is a optional method for ObjectStorer, it enable direct write
7989
// of packfile to the storage
8090
type PackfileWriter interface {

plumbing/storer/object_test.go

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package storer
33
import (
44
"fmt"
55
"testing"
6-
"time"
76

87
. "gopkg.in/check.v1"
98
"gopkg.in/src-d/go-git.v4/plumbing"
@@ -158,23 +157,3 @@ func (o *MockObjectStorage) IterEncodedObjects(t plumbing.ObjectType) (EncodedOb
158157
func (o *MockObjectStorage) Begin() Transaction {
159158
return nil
160159
}
161-
162-
func (o *MockObjectStorage) ForEachObjectHash(fun func(plumbing.Hash) error) error {
163-
return nil
164-
}
165-
166-
func (o *MockObjectStorage) LooseObjectTime(plumbing.Hash) (time.Time, error) {
167-
return time.Time{}, plumbing.ErrObjectNotFound
168-
}
169-
170-
func (o *MockObjectStorage) DeleteLooseObject(plumbing.Hash) error {
171-
return plumbing.ErrObjectNotFound
172-
}
173-
174-
func (o *MockObjectStorage) ObjectPacks() ([]plumbing.Hash, error) {
175-
return nil, nil
176-
}
177-
178-
func (o *MockObjectStorage) DeleteOldObjectPackAndIndex(plumbing.Hash, time.Time) error {
179-
return plumbing.ErrObjectNotFound
180-
}

prune.go

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package git
22

33
import (
4+
"errors"
45
"time"
56

67
"gopkg.in/src-d/go-git.v4/plumbing"
8+
"gopkg.in/src-d/go-git.v4/plumbing/storer"
79
)
810

911
type PruneHandler func(unreferencedObjectHash plumbing.Hash) error
@@ -15,20 +17,32 @@ type PruneOptions struct {
1517
Handler PruneHandler
1618
}
1719

20+
var ErrLooseObjectsNotSupported = errors.New("Loose objects not supported")
21+
1822
// DeleteObject deletes an object from a repository.
1923
// The type conveniently matches PruneHandler.
2024
func (r *Repository) DeleteObject(hash plumbing.Hash) error {
21-
return r.Storer.DeleteLooseObject(hash)
25+
los, ok := r.Storer.(storer.LooseObjectStorer)
26+
if !ok {
27+
return ErrLooseObjectsNotSupported
28+
}
29+
30+
return los.DeleteLooseObject(hash)
2231
}
2332

2433
func (r *Repository) Prune(opt PruneOptions) error {
34+
los, ok := r.Storer.(storer.LooseObjectStorer)
35+
if !ok {
36+
return ErrLooseObjectsNotSupported
37+
}
38+
2539
pw := newObjectWalker(r.Storer)
2640
err := pw.walkAllRefs()
2741
if err != nil {
2842
return err
2943
}
3044
// Now walk all (loose) objects in storage.
31-
return r.Storer.ForEachObjectHash(func(hash plumbing.Hash) error {
45+
return los.ForEachObjectHash(func(hash plumbing.Hash) error {
3246
// Get out if we have seen this object.
3347
if pw.isSeen(hash) {
3448
return nil
@@ -38,7 +52,7 @@ func (r *Repository) Prune(opt PruneOptions) error {
3852
if opt.OnlyObjectsOlderThan != (time.Time{}) {
3953
// Errors here are non-fatal. The object may be e.g. packed.
4054
// Or concurrently deleted. Skip such objects.
41-
t, err := r.Storer.LooseObjectTime(hash)
55+
t, err := los.LooseObjectTime(hash)
4256
if err != nil {
4357
return nil
4458
}

repository.go

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,15 @@ import (
2525
)
2626

2727
var (
28-
ErrInvalidReference = errors.New("invalid reference, should be a tag or a branch")
29-
ErrRepositoryNotExists = errors.New("repository does not exist")
30-
ErrRepositoryAlreadyExists = errors.New("repository already exists")
31-
ErrRemoteNotFound = errors.New("remote not found")
32-
ErrRemoteExists = errors.New("remote already exists ")
33-
ErrWorktreeNotProvided = errors.New("worktree should be provided")
34-
ErrIsBareRepository = errors.New("worktree not available in a bare repository")
35-
ErrUnableToResolveCommit = errors.New("unable to resolve commit")
28+
ErrInvalidReference = errors.New("invalid reference, should be a tag or a branch")
29+
ErrRepositoryNotExists = errors.New("repository does not exist")
30+
ErrRepositoryAlreadyExists = errors.New("repository already exists")
31+
ErrRemoteNotFound = errors.New("remote not found")
32+
ErrRemoteExists = errors.New("remote already exists ")
33+
ErrWorktreeNotProvided = errors.New("worktree should be provided")
34+
ErrIsBareRepository = errors.New("worktree not available in a bare repository")
35+
ErrUnableToResolveCommit = errors.New("unable to resolve commit")
36+
ErrPackedObjectsNotSupported = errors.New("Packed objects not supported")
3637
)
3738

3839
// Repository represents a git repository
@@ -1024,8 +1025,13 @@ type RepackConfig struct {
10241025
}
10251026

10261027
func (r *Repository) RepackObjects(cfg *RepackConfig) (err error) {
1028+
pos, ok := r.Storer.(storer.PackedObjectStorer)
1029+
if !ok {
1030+
return ErrPackedObjectsNotSupported
1031+
}
1032+
10271033
// Get the existing object packs.
1028-
hs, err := r.Storer.ObjectPacks()
1034+
hs, err := pos.ObjectPacks()
10291035
if err != nil {
10301036
return err
10311037
}
@@ -1042,7 +1048,7 @@ func (r *Repository) RepackObjects(cfg *RepackConfig) (err error) {
10421048
if h == nh {
10431049
continue
10441050
}
1045-
err = r.Storer.DeleteOldObjectPackAndIndex(h, cfg.OnlyDeletePacksOlderThan)
1051+
err = pos.DeleteOldObjectPackAndIndex(h, cfg.OnlyDeletePacksOlderThan)
10461052
if err != nil {
10471053
return err
10481054
}

0 commit comments

Comments
 (0)