|
2 | 2 | using Gommon; |
3 | 3 | using NGitLab; |
4 | 4 | using NGitLab.Models; |
| 5 | +using NuGet.Packaging; |
5 | 6 | using Ryujinx.Systems.Update.Common; |
6 | 7 |
|
7 | 8 | namespace Ryujinx.Systems.Update.Server.Services.GitLab; |
@@ -132,51 +133,71 @@ public async Task RefreshAsync() |
132 | 133 |
|
133 | 134 | if (releases is null) |
134 | 135 | return; |
135 | | - |
136 | | - await _semaphore.WaitAsync(); |
137 | | - |
138 | | - if (Count > 0) |
139 | | - { |
140 | | - _logger.LogInformation("Clearing {entryCount} version cache entries for {project}", Count, |
141 | | - _cachedProject!.Value.Name); |
142 | | - Clear(); |
143 | | - } |
144 | 136 |
|
145 | | - foreach (var release in releases) |
146 | | - { |
147 | | - _logger.LogTrace("Adding version cache entry {tag} for {project}", release.TagName, _cachedProject!.Value.Name); |
148 | | - this[release.TagName] = new VersionCacheEntry |
| 137 | + var tempCacheEntries = releases.Select(release => |
| 138 | + new VersionCacheEntry |
149 | 139 | { |
150 | 140 | Tag = release.TagName, |
151 | 141 | ReleaseUrl = ReleaseUrlFormat.Format(release.TagName), |
152 | 142 | Downloads = |
153 | 143 | { |
154 | 144 | Windows = |
155 | 145 | { |
156 | | - X64 = release.Assets.Links.FirstOrDefault(x => x.AssetName.ContainsIgnoreCase("win_x64"))?.Url ?? string.Empty, |
157 | | - Arm64 = release.Assets.Links.FirstOrDefault(x => x.AssetName.ContainsIgnoreCase("win_arm64"))?.Url ?? string.Empty |
| 146 | + X64 = release.Assets.Links |
| 147 | + .FirstOrDefault(x => x.AssetName.ContainsIgnoreCase("win_x64")) |
| 148 | + ?.Url ?? string.Empty, |
| 149 | + Arm64 = release.Assets.Links |
| 150 | + .FirstOrDefault(x => x.AssetName.ContainsIgnoreCase("win_arm64")) |
| 151 | + ?.Url ?? string.Empty |
158 | 152 | }, |
159 | 153 | Linux = |
160 | 154 | { |
161 | | - X64 = release.Assets.Links.FirstOrDefault(x => x.AssetName.ContainsIgnoreCase("linux_x64"))?.Url ?? string.Empty, |
162 | | - Arm64 = release.Assets.Links.FirstOrDefault(x => x.AssetName.ContainsIgnoreCase("linux_arm64"))?.Url ?? string.Empty |
| 155 | + X64 = release.Assets.Links |
| 156 | + .FirstOrDefault(x => x.AssetName.ContainsIgnoreCase("linux_x64")) |
| 157 | + ?.Url ?? string.Empty, |
| 158 | + Arm64 = release.Assets.Links |
| 159 | + .FirstOrDefault(x => x.AssetName.ContainsIgnoreCase("linux_arm64")) |
| 160 | + ?.Url ?? string.Empty |
163 | 161 | }, |
164 | 162 | LinuxAppImage = |
165 | 163 | { |
166 | | - X64 = release.Assets.Links.FirstOrDefault(x => x.AssetName.EndsWithIgnoreCase("x64.AppImage"))?.Url ?? string.Empty, |
167 | | - Arm64 = release.Assets.Links.FirstOrDefault(x => x.AssetName.EndsWithIgnoreCase("arm64.AppImage"))?.Url ?? string.Empty |
| 164 | + X64 = release.Assets.Links |
| 165 | + .FirstOrDefault(x => x.AssetName.EndsWithIgnoreCase("x64.AppImage")) |
| 166 | + ?.Url ?? string.Empty, |
| 167 | + Arm64 = release.Assets.Links |
| 168 | + .FirstOrDefault(x => x.AssetName.EndsWithIgnoreCase("arm64.AppImage")) |
| 169 | + ?.Url ?? string.Empty |
168 | 170 | }, |
169 | | - MacOS = release.Assets.Links.FirstOrDefault(x => x.AssetName.ContainsIgnoreCase("macos_universal"))?.Url ?? string.Empty |
| 171 | + MacOS = release.Assets.Links |
| 172 | + .FirstOrDefault(x => x.AssetName.ContainsIgnoreCase("macos_universal")) |
| 173 | + ?.Url ?? string.Empty |
170 | 174 | } |
171 | | - }; |
| 175 | + }).ToDictionary(x => x.Tag, x => x); |
| 176 | + |
| 177 | + await _semaphore.WaitAsync(); |
| 178 | + |
| 179 | + if (Count > 0) |
| 180 | + { |
| 181 | + _logger.LogInformation("Clearing {entryCount} version cache entries for {project}", Count, |
| 182 | + _cachedProject!.Value.Name); |
| 183 | + Clear(); |
172 | 184 | } |
173 | 185 |
|
| 186 | + foreach (var (tag, entry) in tempCacheEntries) |
| 187 | + { |
| 188 | + _logger.LogTrace("Adding version cache entry {tag} for {project}", tag, _cachedProject!.Value.Name); |
| 189 | + |
| 190 | + this[tag] = entry; |
| 191 | + } |
| 192 | + |
| 193 | + tempCacheEntries.Clear(); |
| 194 | + |
174 | 195 | sw.Stop(); |
| 196 | + |
| 197 | + _semaphore.Release(); |
175 | 198 |
|
176 | 199 | _logger.LogInformation("Loaded {entryCount} version cache entries for {project}; took {time}ms.", Count, |
177 | 200 | _cachedProject!.Value.Name, sw.ElapsedMilliseconds); |
178 | | - |
179 | | - _semaphore.Release(); |
180 | 201 | } |
181 | 202 |
|
182 | 203 | public static void InitializeVersionCaches(WebApplication app) |
|
0 commit comments