1010using Microsoft . EntityFrameworkCore ;
1111using Microsoft . Extensions . Logging ;
1212
13- using PackagesInReleaseFeeds = System . Collections . Generic . Dictionary < string , System . Collections . Generic . Dictionary < string , System . Collections . Generic . HashSet < string > > > ;
14-
1513namespace ProductConstructionService . FeedCleaner ;
1614
1715public class FeedCleaner
@@ -24,15 +22,16 @@ public class FeedCleaner
2422 public FeedCleaner (
2523 IAzureDevOpsClient azureDevOpsClient ,
2624 BuildAssetRegistryContext context ,
25+ IHttpClientFactory httpClientFactory ,
2726 ILogger < FeedCleaner > logger )
2827 {
2928 _azureDevOpsClient = azureDevOpsClient ;
3029 _context = context ;
3130 _logger = logger ;
32- _httpClient = new HttpClient ( new HttpClientHandler ( ) { CheckCertificateRevocationList = true } ) ;
31+ _httpClient = httpClientFactory . CreateClient ( ) ;
3332 }
3433
35- public async Task CleanFeedAsync ( AzureDevOpsFeed feed , PackagesInReleaseFeeds packagesInReleaseFeeds )
34+ public async Task CleanFeedAsync ( AzureDevOpsFeed feed )
3635 {
3736 try
3837 {
@@ -44,10 +43,10 @@ public async Task CleanFeedAsync(AzureDevOpsFeed feed, PackagesInReleaseFeeds pa
4443
4544 foreach ( var package in packages )
4645 {
47- HashSet < string > updatedVersions = await UpdateReleasedVersionsForPackageAsync ( feed , package , packagesInReleaseFeeds ) ;
46+ HashSet < Asset > updatedAssets = await UpdateReleasedVersionsForPackageAsync ( feed , package ) ;
4847
49- await DeletePackageVersionsFromFeedAsync ( feed , package . Name , updatedVersions ) ;
50- updatedCount += updatedVersions . Count ;
48+ await DeletePackageVersionsFromFeedAsync ( feed , updatedAssets ) ;
49+ updatedCount += updatedAssets . Count ;
5150 }
5251
5352 _logger . LogInformation ( "Feed {feed} cleaning finished with {count}/{totalCount} updated packages" , feed . Name , updatedCount , packages . Count ) ;
@@ -74,12 +73,11 @@ public async Task CleanFeedAsync(AzureDevOpsFeed feed, PackagesInReleaseFeeds pa
7473 /// <param name="package">Package to search for</param>
7574 /// <param name="dotnetFeedsPackageMapping">Mapping of packages and their versions in the release feeds</param>
7675 /// <returns>Collection of versions that were updated for the package</returns>
77- private async Task < HashSet < string > > UpdateReleasedVersionsForPackageAsync (
76+ private async Task < HashSet < Asset > > UpdateReleasedVersionsForPackageAsync (
7877 AzureDevOpsFeed feed ,
79- AzureDevOpsPackage package ,
80- PackagesInReleaseFeeds dotnetFeedsPackageMapping )
78+ AzureDevOpsPackage package )
8179 {
82- var releasedVersions = new HashSet < string > ( StringComparer . OrdinalIgnoreCase ) ;
80+ HashSet < Asset > releasedAssets = new ( ) ;
8381
8482 foreach ( var version in package . Versions )
8583 {
@@ -101,119 +99,97 @@ private async Task<HashSet<string>> UpdateReleasedVersionsForPackageAsync(
10199 continue ;
102100 }
103101
104- if ( matchingAsset . Locations . Any ( l => l . Location == FeedConstants . NuGetOrgLocation ||
105- dotnetFeedsPackageMapping . Any ( f => l . Location == f . Key ) ) )
102+ if ( matchingAsset . Locations . Any ( l => l . Location == FeedConstants . NuGetOrgLocation ) )
106103 {
107104 _logger . LogInformation ( "Package {package}.{version} is already present in a public location." ,
108105 package . Name ,
109106 version . Version ) ;
110- releasedVersions . Add ( version . Version ) ;
107+ releasedAssets . Add ( matchingAsset ) ;
111108 continue ;
112109 }
113110
114- List < string > feedsWherePackageIsAvailable = GetReleaseFeedsWherePackageIsAvailable (
115- package . Name ,
116- version . Version ,
117- dotnetFeedsPackageMapping ) ;
118-
119111 try
120112 {
121- if ( await IsPackageAvailableInNugetOrgAsync ( package . Name , version . Version ) )
113+ if ( ! await IsPackageAvailableInNugetOrgAsync ( package . Name , version . Version ) )
122114 {
123- feedsWherePackageIsAvailable . Add ( FeedConstants . NuGetOrgLocation ) ;
115+ _logger . LogInformation ( "Package {package}.{version} not found in any of the release feeds" , package . Name , version ) ;
116+ continue ;
124117 }
125118 }
126119 catch ( HttpRequestException e )
127120 {
128121 _logger . LogWarning ( e , "Failed to determine if package {package}.{version} is present in NuGet.org" ,
129122 package . Name ,
130123 version . Version ) ;
131- }
132-
133- if ( feedsWherePackageIsAvailable . Count <= 0 )
134- {
135- _logger . LogInformation ( "Package {package}.{version} not found in any of the release feeds" , package . Name , version ) ;
136124 continue ;
137125 }
138126
139- releasedVersions . Add ( version . Version ) ;
140- foreach ( string feedToAdd in feedsWherePackageIsAvailable )
141- {
142- _logger . LogInformation ( "Found package {package}.{version} in {feed}, adding location to asset" ,
143- package . Name ,
144- version . Version ,
145- feedToAdd ) ;
127+ releasedAssets . Add ( matchingAsset ) ;
146128
147- matchingAsset . Locations . Add ( new AssetLocation ( )
148- {
149- Location = feedToAdd ,
150- Type = LocationType . NugetFeed
151- } ) ;
129+ _logger . LogInformation ( "Found package {package}.{version} in {feed}, adding location to asset" ,
130+ package . Name ,
131+ version . Version ,
132+ FeedConstants . NuGetOrgLocation ) ;
152133
153- await _context . SaveChangesAsync ( ) ;
154- }
134+ matchingAsset . Locations . Add ( new AssetLocation ( )
135+ {
136+ Location = FeedConstants . NuGetOrgLocation ,
137+ Type = LocationType . NugetFeed
138+ } ) ;
139+
140+ await _context . SaveChangesAsync ( ) ;
155141 }
156142
157- return releasedVersions ;
143+ return releasedAssets ;
158144 }
159145
160146 /// <summary>
161147 /// Deletes a version of a package from an Azure DevOps feed
162148 /// </summary>
163149 /// <param name="feed">Feed to delete the package from</param>
164150 /// <param name="packageName">package to delete</param>
165- /// <param name="versionsToDelete ">Collection of versions to delete</param>
151+ /// <param name="assetsToDelete ">Collection of versions to delete</param>
166152 private async Task DeletePackageVersionsFromFeedAsync (
167153 AzureDevOpsFeed feed ,
168- string packageName ,
169- HashSet < string > versionsToDelete )
154+ HashSet < Asset > assetsToDelete )
170155 {
171- foreach ( string version in versionsToDelete )
156+ foreach ( Asset asset in assetsToDelete )
172157 {
173158 try
174159 {
175160 _logger . LogInformation ( "Deleting package {package}.{version} from feed {feed}" ,
176- packageName , version , feed . Name ) ;
161+ asset . Name , asset . Version , feed . Name ) ;
177162
178163 await _azureDevOpsClient . DeleteNuGetPackageVersionFromFeedAsync (
179164 feed . Account ,
180165 feed . Project ? . Name ,
181166 feed . Name ,
182- packageName ,
183- version ) ;
167+ asset . Name ,
168+ asset . Version ) ;
169+
170+ var assetLocation = asset . Locations . FirstOrDefault ( al => al . Location . Contains ( feed . Name , StringComparison . OrdinalIgnoreCase ) ) ;
171+ if ( assetLocation != null )
172+ {
173+ asset . Locations . Remove ( assetLocation ) ;
174+ }
184175 }
185176 catch ( HttpRequestException e )
186177 {
187178 _logger . LogError ( e , "There was an error attempting to delete package {package}.{version} from the {feed} feed. Skipping..." ,
188- packageName ,
189- version ,
179+ asset . Name ,
180+ asset . Version ,
190181 feed . Name ) ;
191182 }
192183 }
193- }
194184
195- /// <summary>
196- /// Gets a list of feeds where a given package is available
197- /// </summary>
198- /// <param name="name">Package to search for</param>
199- /// <param name="version">Version to search for</param>
200- /// <param name="packageMappings">Feeds to search</param>
201- /// <returns>List of feeds in the package mappings where the provided package and version are available</returns>
202- private static List < string > GetReleaseFeedsWherePackageIsAvailable (
203- string name ,
204- string version ,
205- PackagesInReleaseFeeds packageMappings )
206- {
207- List < string > feeds = [ ] ;
208- foreach ( ( string feedName , Dictionary < string , HashSet < string > > packages ) in packageMappings )
185+ try
209186 {
210- if ( packages . TryGetValue ( name , out HashSet < string > ? versions ) && versions . Contains ( version ) )
211- {
212- feeds . Add ( feedName ) ;
213- }
187+ await _context . SaveChangesAsync ( ) ;
188+ }
189+ catch ( Exception e )
190+ {
191+ _logger . LogError ( e , "Failed to remove location {feed} from Assets in BAR" , feed . Name ) ;
214192 }
215-
216- return feeds ;
217193 }
218194
219195 /// <summary>
0 commit comments