@@ -5,23 +5,17 @@ namespace GitVersion.Git;
55internal sealed class ReferenceCollection : IReferenceCollection
66{
77 private readonly LibGit2Sharp . ReferenceCollection innerCollection ;
8- private IReadOnlyCollection < IReference > ? references ;
8+ private readonly GitRepository repo ;
9+ private Lazy < IReadOnlyCollection < IReference > > references ;
910
10- internal ReferenceCollection ( LibGit2Sharp . ReferenceCollection collection ) => this . innerCollection = collection . NotNull ( ) ;
11-
12- public IEnumerator < IReference > GetEnumerator ( )
11+ internal ReferenceCollection ( LibGit2Sharp . ReferenceCollection collection , GitRepository repo )
1312 {
14- this . references ??= [ .. this . innerCollection . Select ( reference => new Reference ( reference ) ) ] ;
15- return this . references . GetEnumerator ( ) ;
13+ this . innerCollection = collection . NotNull ( ) ;
14+ this . repo = repo . NotNull ( ) ;
15+ this . references = new Lazy < IReadOnlyCollection < IReference > > ( ( ) => [ .. this . innerCollection . Select ( repo . GetOrCreate ) ] ) ;
1616 }
1717
18- public void Add ( string name , string canonicalRefNameOrObject , bool allowOverwrite = false ) => this . innerCollection . Add ( name , canonicalRefNameOrObject , allowOverwrite ) ;
19-
20- public void UpdateTarget ( IReference directRef , IObjectId targetId )
21- {
22- RepositoryExtensions . RunSafe ( ( ) => this . innerCollection . UpdateTarget ( ( Reference ) directRef , ( ObjectId ) targetId ) ) ;
23- this . references = null ;
24- }
18+ public IEnumerator < IReference > GetEnumerator ( ) => this . references . Value . GetEnumerator ( ) ;
2519
2620 IEnumerator IEnumerable . GetEnumerator ( ) => GetEnumerator ( ) ;
2721
@@ -30,13 +24,31 @@ public IReference? this[string name]
3024 get
3125 {
3226 var reference = this . innerCollection [ name ] ;
33- return reference is null ? null : new Reference ( reference ) ;
27+ return reference is null ? null : this . repo . GetOrCreate ( reference ) ;
3428 }
3529 }
3630
3731 public IReference ? this [ ReferenceName referenceName ] => this [ referenceName . Canonical ] ;
3832
3933 public IReference ? Head => this [ "HEAD" ] ;
4034
41- public IEnumerable < IReference > FromGlob ( string prefix ) => this . innerCollection . FromGlob ( prefix ) . Select ( reference => new Reference ( reference ) ) ;
35+ public IEnumerable < IReference > FromGlob ( string prefix )
36+ => this . innerCollection . FromGlob ( prefix ) . Select ( reference => this . repo . GetOrCreate ( reference ) ) ;
37+
38+ public void Add ( string name , string canonicalRefNameOrObject , bool allowOverwrite = false ) =>
39+ RepositoryExtensions . RunSafe ( ( ) =>
40+ {
41+ this . innerCollection . Add ( name , canonicalRefNameOrObject , allowOverwrite ) ;
42+ InitializeReferencesLazy ( ) ;
43+ } ) ;
44+
45+ public void UpdateTarget ( IReference directRef , IObjectId targetId ) =>
46+ RepositoryExtensions . RunSafe ( ( ) =>
47+ {
48+ this . innerCollection . UpdateTarget ( ( Reference ) directRef , ( ObjectId ) targetId ) ;
49+ InitializeReferencesLazy ( ) ;
50+ } ) ;
51+
52+ private void InitializeReferencesLazy ( )
53+ => this . references = new Lazy < IReadOnlyCollection < IReference > > ( ( ) => [ .. this . innerCollection . Select ( repo . GetOrCreate ) ] ) ;
4254}
0 commit comments