@@ -266,11 +266,12 @@ func (d *DotGit) SetRef(r *plumbing.Reference) error {
266
266
// Symbolic references are resolved and included in the output.
267
267
func (d * DotGit ) Refs () ([]* plumbing.Reference , error ) {
268
268
var refs []* plumbing.Reference
269
- if err := d .addRefsFromPackedRefs (& refs ); err != nil {
269
+ var seen = make (map [plumbing.ReferenceName ]bool )
270
+ if err := d .addRefsFromRefDir (& refs , seen ); err != nil {
270
271
return nil , err
271
272
}
272
273
273
- if err := d .addRefsFromRefDir (& refs ); err != nil {
274
+ if err := d .addRefsFromPackedRefs (& refs , seen ); err != nil {
274
275
return nil , err
275
276
}
276
277
@@ -359,13 +360,16 @@ func (d *DotGit) RemoveRef(name plumbing.ReferenceName) error {
359
360
return d .rewritePackedRefsWithoutRef (name )
360
361
}
361
362
362
- func (d * DotGit ) addRefsFromPackedRefs (refs * []* plumbing.Reference ) (err error ) {
363
+ func (d * DotGit ) addRefsFromPackedRefs (refs * []* plumbing.Reference , seen map [plumbing. ReferenceName ] bool ) (err error ) {
363
364
if err := d .syncPackedRefs (); err != nil {
364
365
return err
365
366
}
366
367
367
- for _ , ref := range d .cachedPackedRefs {
368
- * refs = append (* refs , ref )
368
+ for name , ref := range d .cachedPackedRefs {
369
+ if ! seen [name ] {
370
+ * refs = append (* refs , ref )
371
+ seen [name ] = true
372
+ }
369
373
}
370
374
371
375
return nil
@@ -448,11 +452,11 @@ func (d *DotGit) processLine(line string) (*plumbing.Reference, error) {
448
452
}
449
453
}
450
454
451
- func (d * DotGit ) addRefsFromRefDir (refs * []* plumbing.Reference ) error {
452
- return d .walkReferencesTree (refs , []string {refsPath })
455
+ func (d * DotGit ) addRefsFromRefDir (refs * []* plumbing.Reference , seen map [plumbing. ReferenceName ] bool ) error {
456
+ return d .walkReferencesTree (refs , []string {refsPath }, seen )
453
457
}
454
458
455
- func (d * DotGit ) walkReferencesTree (refs * []* plumbing.Reference , relPath []string ) error {
459
+ func (d * DotGit ) walkReferencesTree (refs * []* plumbing.Reference , relPath []string , seen map [plumbing. ReferenceName ] bool ) error {
456
460
files , err := d .fs .ReadDir (d .fs .Join (relPath ... ))
457
461
if err != nil {
458
462
if os .IsNotExist (err ) {
@@ -465,7 +469,7 @@ func (d *DotGit) walkReferencesTree(refs *[]*plumbing.Reference, relPath []strin
465
469
for _ , f := range files {
466
470
newRelPath := append (append ([]string (nil ), relPath ... ), f .Name ())
467
471
if f .IsDir () {
468
- if err = d .walkReferencesTree (refs , newRelPath ); err != nil {
472
+ if err = d .walkReferencesTree (refs , newRelPath , seen ); err != nil {
469
473
return err
470
474
}
471
475
@@ -477,8 +481,9 @@ func (d *DotGit) walkReferencesTree(refs *[]*plumbing.Reference, relPath []strin
477
481
return err
478
482
}
479
483
480
- if ref != nil {
484
+ if ref != nil && ! seen [ ref . Name ()] {
481
485
* refs = append (* refs , ref )
486
+ seen [ref .Name ()] = true
482
487
}
483
488
}
484
489
0 commit comments