8
8
stdioutil "io/ioutil"
9
9
"os"
10
10
"strings"
11
- "time"
12
11
13
12
"gopkg.in/src-d/go-git.v4/plumbing"
14
13
"gopkg.in/src-d/go-git.v4/utils/ioutil"
@@ -57,16 +56,14 @@ var (
57
56
// The DotGit type represents a local git repository on disk. This
58
57
// type is not zero-value-safe, use the New function to initialize it.
59
58
type DotGit struct {
60
- fs billy.Filesystem
61
- cachedPackedRefs refCache
62
- packedRefsLastMod time.Time
59
+ fs billy.Filesystem
63
60
}
64
61
65
62
// New returns a DotGit value ready to be used. The path argument must
66
63
// be the absolute path of a git repository directory (e.g.
67
64
// "/foo/bar/.git").
68
65
func New (fs billy.Filesystem ) * DotGit {
69
- return & DotGit {fs : fs , cachedPackedRefs : make ( refCache ) }
66
+ return & DotGit {fs : fs }
70
67
}
71
68
72
69
// Initialize creates all the folder scaffolding.
@@ -271,7 +268,7 @@ func (d *DotGit) Refs() ([]*plumbing.Reference, error) {
271
268
return nil , err
272
269
}
273
270
274
- if err := d .addRefsFromPackedRefs (& refs , seen ); err != nil {
271
+ if err := d .addRefsFromPackedRefs (& refs ); err != nil {
275
272
return nil , err
276
273
}
277
274
@@ -292,54 +289,43 @@ func (d *DotGit) Ref(name plumbing.ReferenceName) (*plumbing.Reference, error) {
292
289
return d .packedRef (name )
293
290
}
294
291
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 )
301
294
if err != nil {
302
- return err
295
+ if os .IsNotExist (err ) {
296
+ return nil , nil
297
+ }
298
+ return nil , err
303
299
}
304
300
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 ())
308
307
if err != nil {
309
- if os .IsNotExist (err ) {
310
- return nil
311
- }
312
- return err
308
+ return nil , err
313
309
}
314
- defer ioutil .CheckClose (f , & err )
315
310
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 )
326
313
}
327
-
328
- d .packedRefsLastMod = fi .ModTime ()
329
-
330
- return s .Err ()
331
314
}
332
315
333
- return nil
316
+ return refs , s . Err ()
334
317
}
335
318
336
319
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 {
338
322
return nil , err
339
323
}
340
324
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
+ }
343
329
}
344
330
345
331
return nil , plumbing .ErrReferenceNotFound
@@ -360,18 +346,13 @@ func (d *DotGit) RemoveRef(name plumbing.ReferenceName) error {
360
346
return d .rewritePackedRefsWithoutRef (name )
361
347
}
362
348
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 {
365
352
return err
366
353
}
367
354
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 ... )
375
356
return nil
376
357
}
377
358
0 commit comments