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

Commit 79f2494

Browse files
committed
plumbing, storage: integrate new index
Now dotgit.PackWriter uses the new packfile.Parser and index. Signed-off-by: Javi Fontan <[email protected]>
1 parent 74f56f3 commit 79f2494

File tree

5 files changed

+57
-45
lines changed

5 files changed

+57
-45
lines changed

plumbing/format/packfile/decoder.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -447,11 +447,12 @@ func (d *Decoder) recallByOffset(o int64) (plumbing.EncodedObject, error) {
447447
return d.DecodeObjectAt(o)
448448
}
449449

450-
// if e, ok := d.idx.LookupOffset(uint64(o)); ok {
451-
// return d.recallByHashNonSeekable(e.Hash)
452-
// }
450+
hash, err := d.idx.FindHash(o)
451+
if err != nil {
452+
return nil, err
453+
}
453454

454-
return nil, plumbing.ErrObjectNotFound
455+
return d.recallByHashNonSeekable(hash)
455456
}
456457

457458
func (d *Decoder) recallByHash(h plumbing.Hash) (plumbing.EncodedObject, error) {

plumbing/format/packfile/parser.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -311,11 +311,12 @@ func applyPatchBase(ota *objectInfo, data, base []byte) ([]byte, error) {
311311
type objectInfo struct {
312312
plumbing.Hasher
313313

314-
Offset int64
315-
Length int64
316-
PackSize int64
317-
Type plumbing.ObjectType
318-
DiskType plumbing.ObjectType
314+
Offset int64
315+
Length int64
316+
HeaderLength int64
317+
PackSize int64
318+
Type plumbing.ObjectType
319+
DiskType plumbing.ObjectType
319320

320321
Crc32 uint32
321322

storage/filesystem/dotgit/writers.go

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,14 @@ import (
2020
// is renamed/moved (depends on the Filesystem implementation) to the final
2121
// location, if the PackWriter is not used, nothing is written
2222
type PackWriter struct {
23-
Notify func(plumbing.Hash, *packfile.Index)
23+
Notify func(plumbing.Hash, *idxfile.Writer)
2424

2525
fs billy.Filesystem
2626
fr, fw billy.File
2727
synced *syncedReader
2828
checksum plumbing.Hash
29-
index *packfile.Index
29+
parser *packfile.Parser
30+
writer *idxfile.Writer
3031
result chan error
3132
}
3233

@@ -55,20 +56,16 @@ func newPackWrite(fs billy.Filesystem) (*PackWriter, error) {
5556

5657
func (w *PackWriter) buildIndex() {
5758
s := packfile.NewScanner(w.synced)
58-
d, err := packfile.NewDecoder(s, nil)
59-
if err != nil {
60-
w.result <- err
61-
return
62-
}
59+
w.writer = new(idxfile.Writer)
60+
w.parser = packfile.NewParser(s, w.writer)
6361

64-
checksum, err := d.Decode()
62+
checksum, err := w.parser.Parse()
6563
if err != nil {
6664
w.result <- err
6765
return
6866
}
6967

7068
w.checksum = checksum
71-
w.index = d.Index()
7269
w.result <- err
7370
}
7471

@@ -92,8 +89,8 @@ func (w *PackWriter) Write(p []byte) (int, error) {
9289
// was written, the tempfiles are deleted without writing a packfile.
9390
func (w *PackWriter) Close() error {
9491
defer func() {
95-
if w.Notify != nil && w.index != nil && w.index.Size() > 0 {
96-
w.Notify(w.checksum, w.index)
92+
if w.Notify != nil && w.writer != nil && w.writer.Finished() {
93+
w.Notify(w.checksum, w.writer)
9794
}
9895

9996
close(w.result)
@@ -115,7 +112,7 @@ func (w *PackWriter) Close() error {
115112
return err
116113
}
117114

118-
if w.index == nil || w.index.Size() == 0 {
115+
if w.writer == nil || !w.writer.Finished() {
119116
return w.clean()
120117
}
121118

@@ -145,11 +142,13 @@ func (w *PackWriter) save() error {
145142
}
146143

147144
func (w *PackWriter) encodeIdx(writer io.Writer) error {
148-
idx := w.index.ToIdxFile()
149-
idx.PackfileChecksum = w.checksum
150-
idx.Version = idxfile.VersionSupported
145+
idx, err := w.writer.Index()
146+
if err != nil {
147+
return err
148+
}
149+
151150
e := idxfile.NewEncoder(writer)
152-
_, err := e.Encode(idx)
151+
_, err = e.Encode(idx)
153152
return err
154153
}
155154

@@ -209,7 +208,6 @@ func (s *syncedReader) isBlocked() bool {
209208

210209
func (s *syncedReader) wake() {
211210
if s.isBlocked() {
212-
// fmt.Println("wake")
213211
atomic.StoreUint32(&s.blocked, 0)
214212
s.news <- true
215213
}
@@ -220,7 +218,6 @@ func (s *syncedReader) sleep() {
220218
written := atomic.LoadUint64(&s.written)
221219
if read >= written {
222220
atomic.StoreUint32(&s.blocked, 1)
223-
// fmt.Println("sleep", read, written)
224221
<-s.news
225222
}
226223

storage/filesystem/dotgit/writers_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"strconv"
1010

1111
"gopkg.in/src-d/go-git.v4/plumbing"
12+
"gopkg.in/src-d/go-git.v4/plumbing/format/idxfile"
1213
"gopkg.in/src-d/go-git.v4/plumbing/format/packfile"
1314

1415
. "gopkg.in/check.v1"
@@ -148,7 +149,7 @@ func (s *SuiteDotGit) TestPackWriterUnusedNotify(c *C) {
148149
w, err := newPackWrite(fs)
149150
c.Assert(err, IsNil)
150151

151-
w.Notify = func(h plumbing.Hash, idx *packfile.Index) {
152+
w.Notify = func(h plumbing.Hash, idx *idxfile.Writer) {
152153
c.Fatal("unexpected call to PackWriter.Notify")
153154
}
154155

storage/filesystem/object.go

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ type ObjectStorage struct {
2323
deltaBaseCache cache.Object
2424

2525
dir *dotgit.DotGit
26-
index map[plumbing.Hash]*packfile.Index
26+
index map[plumbing.Hash]idxfile.Index
2727
}
2828

2929
// NewObjectStorage creates a new ObjectStorage with the given .git directory.
@@ -41,7 +41,7 @@ func (s *ObjectStorage) requireIndex() error {
4141
return nil
4242
}
4343

44-
s.index = make(map[plumbing.Hash]*packfile.Index)
44+
s.index = make(map[plumbing.Hash]idxfile.Index)
4545
packs, err := s.dir.ObjectPacks()
4646
if err != nil {
4747
return err
@@ -69,7 +69,7 @@ func (s *ObjectStorage) loadIdxFile(h plumbing.Hash) (err error) {
6969
return err
7070
}
7171

72-
s.index[h] = packfile.NewIndexFromIdxFile(idxf)
72+
s.index[h] = idxf
7373
return err
7474
}
7575

@@ -87,8 +87,11 @@ func (s *ObjectStorage) PackfileWriter() (io.WriteCloser, error) {
8787
return nil, err
8888
}
8989

90-
w.Notify = func(h plumbing.Hash, idx *packfile.Index) {
91-
s.index[h] = idx
90+
w.Notify = func(h plumbing.Hash, writer *idxfile.Writer) {
91+
index, err := writer.Index()
92+
if err == nil {
93+
s.index[h] = index
94+
}
9295
}
9396

9497
return w, nil
@@ -278,7 +281,7 @@ func (s *ObjectStorage) getFromPackfile(h plumbing.Hash, canBeDelta bool) (
278281

279282
func (s *ObjectStorage) decodeObjectAt(
280283
f billy.File,
281-
idx *packfile.Index,
284+
idx idxfile.Index,
282285
offset int64) (plumbing.EncodedObject, error) {
283286
if _, err := f.Seek(0, io.SeekStart); err != nil {
284287
return nil, err
@@ -299,7 +302,7 @@ func (s *ObjectStorage) decodeObjectAt(
299302

300303
func (s *ObjectStorage) decodeDeltaObjectAt(
301304
f billy.File,
302-
idx *packfile.Index,
305+
idx idxfile.Index,
303306
offset int64,
304307
hash plumbing.Hash) (plumbing.EncodedObject, error) {
305308
if _, err := f.Seek(0, io.SeekStart); err != nil {
@@ -324,12 +327,10 @@ func (s *ObjectStorage) decodeDeltaObjectAt(
324327
case plumbing.REFDeltaObject:
325328
base = header.Reference
326329
case plumbing.OFSDeltaObject:
327-
e, ok := idx.LookupOffset(uint64(header.OffsetReference))
328-
if !ok {
329-
return nil, plumbing.ErrObjectNotFound
330+
base, err = idx.FindHash(header.OffsetReference)
331+
if err != nil {
332+
return nil, err
330333
}
331-
332-
base = e.Hash
333334
default:
334335
return s.decodeObjectAt(f, idx, offset)
335336
}
@@ -350,8 +351,9 @@ func (s *ObjectStorage) decodeDeltaObjectAt(
350351

351352
func (s *ObjectStorage) findObjectInPackfile(h plumbing.Hash) (plumbing.Hash, plumbing.Hash, int64) {
352353
for packfile, index := range s.index {
353-
if e, ok := index.LookupHash(h); ok {
354-
return packfile, e.Hash, int64(e.Offset)
354+
offset, err := index.FindOffset(h)
355+
if err == nil {
356+
return packfile, h, offset
355357
}
356358
}
357359

@@ -460,12 +462,22 @@ type packfileIter struct {
460462
total uint32
461463
}
462464

463-
func NewPackfileIter(f billy.File, t plumbing.ObjectType) (storer.EncodedObjectIter, error) {
465+
// NewPackfileIter returns a new EncodedObjectIter for the provided packfile
466+
// and object type.
467+
func NewPackfileIter(
468+
f billy.File,
469+
t plumbing.ObjectType,
470+
) (storer.EncodedObjectIter, error) {
464471
return newPackfileIter(f, t, make(map[plumbing.Hash]struct{}), nil, nil)
465472
}
466473

467-
func newPackfileIter(f billy.File, t plumbing.ObjectType, seen map[plumbing.Hash]struct{},
468-
index *packfile.Index, cache cache.Object) (storer.EncodedObjectIter, error) {
474+
func newPackfileIter(
475+
f billy.File,
476+
t plumbing.ObjectType,
477+
seen map[plumbing.Hash]struct{},
478+
index idxfile.Index,
479+
cache cache.Object,
480+
) (storer.EncodedObjectIter, error) {
469481
s := packfile.NewScanner(f)
470482
_, total, err := s.Header()
471483
if err != nil {

0 commit comments

Comments
 (0)