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

Commit dd81bc9

Browse files
authored
Merge pull request #651 from erizocosmico/fix/remove-ref-cache
dotgit: remove ref cache for packed refs
2 parents 1e48a86 + 6870db9 commit dd81bc9

File tree

1 file changed

+29
-48
lines changed

1 file changed

+29
-48
lines changed

storage/filesystem/internal/dotgit/dotgit.go

Lines changed: 29 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
stdioutil "io/ioutil"
99
"os"
1010
"strings"
11-
"time"
1211

1312
"gopkg.in/src-d/go-git.v4/plumbing"
1413
"gopkg.in/src-d/go-git.v4/utils/ioutil"
@@ -57,16 +56,14 @@ var (
5756
// The DotGit type represents a local git repository on disk. This
5857
// type is not zero-value-safe, use the New function to initialize it.
5958
type DotGit struct {
60-
fs billy.Filesystem
61-
cachedPackedRefs refCache
62-
packedRefsLastMod time.Time
59+
fs billy.Filesystem
6360
}
6461

6562
// New returns a DotGit value ready to be used. The path argument must
6663
// be the absolute path of a git repository directory (e.g.
6764
// "/foo/bar/.git").
6865
func New(fs billy.Filesystem) *DotGit {
69-
return &DotGit{fs: fs, cachedPackedRefs: make(refCache)}
66+
return &DotGit{fs: fs}
7067
}
7168

7269
// Initialize creates all the folder scaffolding.
@@ -271,7 +268,7 @@ func (d *DotGit) Refs() ([]*plumbing.Reference, error) {
271268
return nil, err
272269
}
273270

274-
if err := d.addRefsFromPackedRefs(&refs, seen); err != nil {
271+
if err := d.addRefsFromPackedRefs(&refs); err != nil {
275272
return nil, err
276273
}
277274

@@ -292,54 +289,43 @@ func (d *DotGit) Ref(name plumbing.ReferenceName) (*plumbing.Reference, error) {
292289
return d.packedRef(name)
293290
}
294291

295-
func (d *DotGit) syncPackedRefs() error {
296-
fi, err := d.fs.Stat(packedRefsPath)
297-
if os.IsNotExist(err) {
298-
return nil
299-
}
300-
292+
func (d *DotGit) findPackedRefs() ([]*plumbing.Reference, error) {
293+
f, err := d.fs.Open(packedRefsPath)
301294
if err != nil {
302-
return err
295+
if os.IsNotExist(err) {
296+
return nil, nil
297+
}
298+
return nil, err
303299
}
304300

305-
if d.packedRefsLastMod.Before(fi.ModTime()) {
306-
d.cachedPackedRefs = make(refCache)
307-
f, err := d.fs.Open(packedRefsPath)
301+
defer ioutil.CheckClose(f, &err)
302+
303+
s := bufio.NewScanner(f)
304+
var refs []*plumbing.Reference
305+
for s.Scan() {
306+
ref, err := d.processLine(s.Text())
308307
if err != nil {
309-
if os.IsNotExist(err) {
310-
return nil
311-
}
312-
return err
308+
return nil, err
313309
}
314-
defer ioutil.CheckClose(f, &err)
315310

316-
s := bufio.NewScanner(f)
317-
for s.Scan() {
318-
ref, err := d.processLine(s.Text())
319-
if err != nil {
320-
return err
321-
}
322-
323-
if ref != nil {
324-
d.cachedPackedRefs[ref.Name()] = ref
325-
}
311+
if ref != nil {
312+
refs = append(refs, ref)
326313
}
327-
328-
d.packedRefsLastMod = fi.ModTime()
329-
330-
return s.Err()
331314
}
332315

333-
return nil
316+
return refs, s.Err()
334317
}
335318

336319
func (d *DotGit) packedRef(name plumbing.ReferenceName) (*plumbing.Reference, error) {
337-
if err := d.syncPackedRefs(); err != nil {
320+
refs, err := d.findPackedRefs()
321+
if err != nil {
338322
return nil, err
339323
}
340324

341-
if ref, ok := d.cachedPackedRefs[name]; ok {
342-
return ref, nil
325+
for _, ref := range refs {
326+
if ref.Name() == name {
327+
return ref, nil
328+
}
343329
}
344330

345331
return nil, plumbing.ErrReferenceNotFound
@@ -360,18 +346,13 @@ func (d *DotGit) RemoveRef(name plumbing.ReferenceName) error {
360346
return d.rewritePackedRefsWithoutRef(name)
361347
}
362348

363-
func (d *DotGit) addRefsFromPackedRefs(refs *[]*plumbing.Reference, seen map[plumbing.ReferenceName]bool) (err error) {
364-
if err := d.syncPackedRefs(); err != nil {
349+
func (d *DotGit) addRefsFromPackedRefs(refs *[]*plumbing.Reference) (err error) {
350+
packedRefs, err := d.findPackedRefs()
351+
if err != nil {
365352
return err
366353
}
367354

368-
for name, ref := range d.cachedPackedRefs {
369-
if !seen[name] {
370-
*refs = append(*refs, ref)
371-
seen[name] = true
372-
}
373-
}
374-
355+
*refs = append(*refs, packedRefs...)
375356
return nil
376357
}
377358

0 commit comments

Comments
 (0)