Change Refresh Status to also clear repository cache

This commit is contained in:
Canon
2026-07-19 01:42:21 +08:00
parent 3c1bac3201
commit befaf8e0d1
5 changed files with 41 additions and 3 deletions
@@ -110,6 +110,30 @@ public class GitHubApiServiceTests : IDisposable
Assert.Equal(1, _handler.RequestCount); Assert.Equal(1, _handler.RequestCount);
} }
[Fact]
public async Task ClearCache_NextRequestFetchesFreshRepositories()
{
CancellationToken token = TestContext.Current.CancellationToken;
_handler.ResponseQueue.Enqueue(new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StringContent(JsonSerializer.Serialize(new[] { MakeRepo("FCP-Weapons") }))
});
_handler.ResponseQueue.Enqueue(new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StringContent(JsonSerializer.Serialize(new[] { MakeRepo("FCP-Armor") }))
});
IReadOnlyList<RemoteRepo> cached = await _service.GetOrganizationReposAsync(token);
_service.ClearCache();
IReadOnlyList<RemoteRepo> refreshed = await _service.GetOrganizationReposAsync(token);
Assert.Equal("FCP-Weapons", Assert.Single(cached).Name);
Assert.Equal("FCP-Armor", Assert.Single(refreshed).Name);
Assert.Equal(2, _handler.RequestCount);
}
[Fact] [Fact]
public async Task RateLimitHeaders_Parsed() public async Task RateLimitHeaders_Parsed()
{ {
+6
View File
@@ -141,6 +141,12 @@ The tool opens an interactive menu — use the **arrow keys** to navigate, **Ent
2. Choose the mod you want to manage 2. Choose the mod you want to manage
3. Select **Switch Branch** to pick a branch, or **Checkout Specific Commit** to pin to a specific version 3. Select **Switch Branch** to pick a branch, or **Checkout Specific Commit** to pin to a specific version
### To clear cached data and refresh mod status:
1. Select **Clear Cache & Refresh** from the main menu
2. The manager retrieves the FCP repository list again, rescans the Mods directory, and fetches the latest Git status for every installed Git mod
This does not pull updates, switch versions, or overwrite local changes.
### To Batch Update Mods ### To Batch Update Mods
```bash ```bash
+6
View File
@@ -17,6 +17,12 @@ public class GitHubApiService(HttpClient httpClient) : IGitHubApiService
public int? RemainingRateLimit { get; private set; } public int? RemainingRateLimit { get; private set; }
public DateTimeOffset? RateLimitReset { get; private set; } public DateTimeOffset? RateLimitReset { get; private set; }
public void ClearCache()
{
_cachedRepos = null;
_cacheTime = DateTimeOffset.MinValue;
}
public async Task<IReadOnlyList<RemoteRepo>> GetOrganizationReposAsync(CancellationToken ct = default) public async Task<IReadOnlyList<RemoteRepo>> GetOrganizationReposAsync(CancellationToken ct = default)
{ {
if (_cachedRepos != null && DateTimeOffset.UtcNow - _cacheTime < _cacheExpiry) if (_cachedRepos != null && DateTimeOffset.UtcNow - _cacheTime < _cacheExpiry)
+1
View File
@@ -4,6 +4,7 @@ namespace FCPModUpdater.Services;
public interface IGitHubApiService public interface IGitHubApiService
{ {
void ClearCache();
Task<IReadOnlyList<RemoteRepo>> GetOrganizationReposAsync(CancellationToken ct = default); Task<IReadOnlyList<RemoteRepo>> GetOrganizationReposAsync(CancellationToken ct = default);
Task<RemoteRepo?> GetRepoByNameAsync(string repoName, CancellationToken ct = default); Task<RemoteRepo?> GetRepoByNameAsync(string repoName, CancellationToken ct = default);
int? RemainingRateLimit { get; } int? RemainingRateLimit { get; }
+4 -3
View File
@@ -66,7 +66,7 @@ public class InteractiveMenu
"Uninstall Mods", "Uninstall Mods",
"Convert Local to Git", "Convert Local to Git",
"Mod Version Selector", "Mod Version Selector",
"Refresh Status", "Clear Cache & Refresh",
"Exit" "Exit"
), ct); ), ct);
@@ -79,7 +79,7 @@ public class InteractiveMenu
"Uninstall Mods" => await HandleUninstallAsync(ct), "Uninstall Mods" => await HandleUninstallAsync(ct),
"Convert Local to Git" => await HandleConvertAsync(ct), "Convert Local to Git" => await HandleConvertAsync(ct),
"Mod Version Selector" => await HandleVersionSelectorAsync(ct), "Mod Version Selector" => await HandleVersionSelectorAsync(ct),
"Refresh Status" => await HandleRefreshAsync(ct), "Clear Cache & Refresh" => await HandleClearCacheAndRefreshAsync(ct),
"Exit" => true, "Exit" => true,
_ => false _ => false
}; };
@@ -549,8 +549,9 @@ public class InteractiveMenu
WaitForKey(); WaitForKey();
} }
private async Task<bool> HandleRefreshAsync(CancellationToken ct) private async Task<bool> HandleClearCacheAndRefreshAsync(CancellationToken ct)
{ {
_gitHubApiService.ClearCache();
await RefreshModsAsync(ct); await RefreshModsAsync(ct);
return false; return false;
} }