@@ -61,13 +61,21 @@ public ReferenceSettings(ReferenceSettings other)
61
61
AddToRecentOnReferenceEvents = other . AddToRecentOnReferenceEvents ;
62
62
ProjectPaths = new List < string > ( other . ProjectPaths ) ;
63
63
other . SerializationPrep ( new StreamingContext ( StreamingContextStates . All ) ) ;
64
- _recent = other . _recent ;
65
- _pinned = other . _pinned ;
64
+ _recent = other . _recent . Select ( use => new HostUsages ( use ) ) . ToList ( ) ;
65
+ RecentLibraryReferences = other . RecentLibraryReferences . ToList ( ) ;
66
+ _pinned = other . _pinned . Select ( pin => new HostPins ( pin ) ) . ToList ( ) ;
67
+ PinnedLibraryReferences = other . PinnedLibraryReferences . ToList ( ) ;
66
68
DeserializationLoad ( new StreamingContext ( StreamingContextStates . All ) ) ;
67
69
}
68
70
71
+ private int _tracked ;
72
+
69
73
[ DataMember ( IsRequired = true ) ]
70
- public int RecentReferencesTracked { get ; set ; }
74
+ public int RecentReferencesTracked
75
+ {
76
+ get => _tracked ;
77
+ set => _tracked = value < 0 ? 0 : Math . Min ( value , RecentTrackingLimit ) ;
78
+ }
71
79
72
80
[ DataMember ( IsRequired = true ) ]
73
81
public bool FixBrokenReferences { get ; set ; }
@@ -128,7 +136,8 @@ public void TrackUsage(ReferenceInfo reference, string host = null)
128
136
{
129
137
var use = new ReferenceUsage ( reference ) ;
130
138
if ( string . IsNullOrEmpty ( host ) )
131
- {
139
+ {
140
+ RecentLibraryReferences . RemoveAll ( usage => usage . Matches ( reference ) ) ;
132
141
RecentLibraryReferences . Add ( use ) ;
133
142
RecentLibraryReferences = RecentLibraryReferences
134
143
. OrderByDescending ( usage => usage . Timestamp )
@@ -154,20 +163,30 @@ public void TrackUsage(ReferenceInfo reference, string host = null)
154
163
. Take ( RecentReferencesTracked ) . ToList ( ) ;
155
164
}
156
165
166
+ // This is so close to damned near impossible that I was tempted to hard code it false, but it's useful for testing.
157
167
public bool Equals ( ReferenceSettings other )
158
168
{
169
+ if ( ReferenceEquals ( this , other ) )
170
+ {
171
+ return true ;
172
+ }
173
+
159
174
if ( other is null ||
160
- RecentReferencesTracked != other . RecentReferencesTracked ||
161
- ! PinnedLibraryReferences . OrderBy ( _ => _ ) . SequenceEqual ( other . PinnedLibraryReferences . OrderBy ( _ => _ ) ) ||
162
- ! RecentLibraryReferences . OrderBy ( _ => _ ) . SequenceEqual ( other . RecentLibraryReferences . OrderBy ( _ => _ ) ) )
175
+ RecentReferencesTracked != other . RecentReferencesTracked ||
176
+ PinnedLibraryReferences . Count != other . PinnedLibraryReferences . Count ||
177
+ RecentLibraryReferences . Count != other . RecentLibraryReferences . Count ||
178
+ PinnedLibraryReferences . Any ( pin => ! other . PinnedLibraryReferences . Any ( lib => lib . Equals ( pin ) ) ) ||
179
+ RecentLibraryReferences . Any ( recent => ! other . RecentLibraryReferences . Any ( lib => lib . Equals ( recent ) ) ) )
163
180
{
164
181
return false ;
165
182
}
166
183
167
184
foreach ( var host in PinnedProjectReferences )
168
185
{
169
186
if ( ! other . PinnedProjectReferences . ContainsKey ( host . Key ) ||
170
- ! host . Value . OrderBy ( _ => _ ) . SequenceEqual ( other . PinnedProjectReferences [ host . Key ] . OrderBy ( _ => _ ) ) )
187
+ ! ( other . PinnedProjectReferences [ host . Key ] is List < ReferenceInfo > otherHost ) ||
188
+ otherHost . Count != host . Value . Count ||
189
+ host . Value . Any ( pin => ! otherHost . Any ( lib => lib . Equals ( pin ) ) ) )
171
190
{
172
191
return false ;
173
192
}
@@ -176,8 +195,9 @@ public bool Equals(ReferenceSettings other)
176
195
foreach ( var host in RecentProjectReferences )
177
196
{
178
197
if ( ! other . RecentProjectReferences . ContainsKey ( host . Key ) ||
179
- ! host . Value . OrderBy ( usage => usage . Timestamp ) . Select ( usage => usage . Reference )
180
- . SequenceEqual ( other . RecentProjectReferences [ host . Key ] . OrderBy ( usage => usage . Timestamp ) . Select ( usage => usage . Reference ) ) )
198
+ ! ( other . RecentProjectReferences [ host . Key ] is List < ReferenceUsage > otherHost ) ||
199
+ otherHost . Count != host . Value . Count ||
200
+ host . Value . Any ( pin => ! otherHost . Any ( lib => lib . Reference . Equals ( pin . Reference ) && lib . Timestamp . Equals ( pin . Timestamp ) ) ) )
181
201
{
182
202
return false ;
183
203
}
@@ -188,15 +208,15 @@ public bool Equals(ReferenceSettings other)
188
208
189
209
public List < ReferenceInfo > GetPinnedReferencesForHost ( string host )
190
210
{
191
- var key = host . ToUpperInvariant ( ) ;
211
+ var key = host ? . ToUpperInvariant ( ) ?? string . Empty ;
192
212
return PinnedLibraryReferences . Union ( PinnedProjectReferences . ContainsKey ( key )
193
213
? PinnedProjectReferences [ key ] . ToList ( )
194
214
: new List < ReferenceInfo > ( ) ) . ToList ( ) ;
195
215
}
196
216
197
217
public List < ReferenceInfo > GetRecentReferencesForHost ( string host )
198
218
{
199
- var key = host . ToUpperInvariant ( ) ;
219
+ var key = host ? . ToUpperInvariant ( ) ?? string . Empty ;
200
220
return RecentLibraryReferences
201
221
. Concat ( RecentProjectReferences . ContainsKey ( key )
202
222
? RecentProjectReferences [ key ]
@@ -207,6 +227,14 @@ public List<ReferenceInfo> GetRecentReferencesForHost(string host)
207
227
208
228
public void UpdatePinnedReferencesForHost ( string host , List < ReferenceInfo > pinned )
209
229
{
230
+ var key = host ? . ToUpperInvariant ( ) ?? string . Empty ;
231
+
232
+ PinnedLibraryReferences . Clear ( ) ;
233
+ if ( PinnedProjectReferences . ContainsKey ( key ) )
234
+ {
235
+ PinnedProjectReferences . Remove ( key ) ;
236
+ }
237
+
210
238
foreach ( var reference in pinned )
211
239
{
212
240
PinReference ( reference , reference . Guid . Equals ( Guid . Empty ) ? host : string . Empty ) ;
@@ -229,16 +257,19 @@ protected class ReferenceUsage
229
257
public ReferenceInfo Reference { get ; protected set ; }
230
258
231
259
[ DataMember ( IsRequired = true ) ]
232
- public DateTime Timestamp { get ; protected set ; } = DateTime . Now ;
260
+ public DateTime Timestamp { get ; protected set ; }
233
261
234
262
public ReferenceUsage ( ReferenceInfo reference )
235
263
{
236
264
Reference = reference ;
265
+ Timestamp = DateTime . Now ;
237
266
}
238
267
239
268
public bool Matches ( ReferenceInfo other )
240
269
{
241
270
return Reference . FullPath . Equals ( other . FullPath , StringComparison . OrdinalIgnoreCase ) ||
271
+ ! Reference . Guid . Equals ( Guid . Empty ) &&
272
+ ! other . Guid . Equals ( Guid . Empty ) &&
242
273
Reference . Guid . Equals ( other . Guid ) &&
243
274
Reference . Major == other . Major &&
244
275
Reference . Minor == other . Minor ;
@@ -256,6 +287,12 @@ public HostUsages(string host, List<ReferenceUsage> usages)
256
287
Host = host ;
257
288
Usages = usages ;
258
289
}
290
+
291
+ public HostUsages ( HostUsages other )
292
+ {
293
+ Host = other . Host ;
294
+ Usages = other . Usages . ToList ( ) ;
295
+ }
259
296
}
260
297
261
298
[ DataContract ]
@@ -269,6 +306,12 @@ public HostPins(string host, List<ReferenceInfo> usages)
269
306
Host = host ;
270
307
Pins = usages ;
271
308
}
309
+
310
+ public HostPins ( HostPins other )
311
+ {
312
+ Host = other . Host ;
313
+ Pins = other . Pins . ToList ( ) ;
314
+ }
272
315
}
273
316
}
274
317
}
0 commit comments