From 4edb4d6cd3eef73b57a14277af46eb83455c3d0a Mon Sep 17 00:00:00 2001 From: "gitauto-ai[bot]" <161652217+gitauto-ai[bot]@users.noreply.github.com> Date: Sun, 27 Apr 2025 04:01:43 +0000 Subject: [PATCH 1/6] Update Src/AiCommitMessage/Services/Cache/ICacheProvider.cs --- Src/AiCommitMessage/Services/Cache/ICacheProvider.cs | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 Src/AiCommitMessage/Services/Cache/ICacheProvider.cs diff --git a/Src/AiCommitMessage/Services/Cache/ICacheProvider.cs b/Src/AiCommitMessage/Services/Cache/ICacheProvider.cs new file mode 100644 index 00000000..5190e279 --- /dev/null +++ b/Src/AiCommitMessage/Services/Cache/ICacheProvider.cs @@ -0,0 +1,11 @@ +using System.Threading.Tasks; + +namespace AiCommitMessage.Services.Cache +{ + public interface ICacheProvider + { + string GenerateHash(string model, string branch, string authorMessage, string diff); + Task LoadAsync(string model, string hash, int maxAgeDays = 30); + Task SaveAsync(string model, string hash, string response); + } +} From 33734385b3d60f9668137c52292485756e4477ad Mon Sep 17 00:00:00 2001 From: "gitauto-ai[bot]" <161652217+gitauto-ai[bot]@users.noreply.github.com> Date: Sun, 27 Apr 2025 04:04:18 +0000 Subject: [PATCH 2/6] Replace content of Src/AiCommitMessage/Services/Cache/FileCacheProvider.cs --- .../Services/Cache/FileCacheProvider.cs | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 Src/AiCommitMessage/Services/Cache/FileCacheProvider.cs diff --git a/Src/AiCommitMessage/Services/Cache/FileCacheProvider.cs b/Src/AiCommitMessage/Services/Cache/FileCacheProvider.cs new file mode 100644 index 00000000..8cd8d750 --- /dev/null +++ b/Src/AiCommitMessage/Services/Cache/FileCacheProvider.cs @@ -0,0 +1,82 @@ +using System.Security.Cryptography; +using System.Text; +using System.Text.Json; + +namespace AiCommitMessage.Services.Cache +{ + public class FileCacheProvider : ICacheProvider + { + private record CachedResponse(string Model, string Response, string Checksum, DateTime Timestamp); + + private readonly string _cacheDir; + + public FileCacheProvider(string appName = "CommitMessageTool") + { + string? envPath = Environment.GetEnvironmentVariable("COMMIT_CACHE_PATH"); + if (!string.IsNullOrWhiteSpace(envPath)) + { + _cacheDir = Path.Combine(envPath, appName, "commit-cache"); + } + else + { + string baseDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); + if (string.IsNullOrWhiteSpace(baseDir)) + { + string? home = Environment.GetEnvironmentVariable("HOME") ?? Environment.GetEnvironmentVariable("USERPROFILE"); + if (string.IsNullOrEmpty(home)) + throw new InvalidOperationException("Unable to determine a valid user data directory"); + baseDir = Path.Combine(home, ".config"); + } + _cacheDir = Path.Combine(baseDir, appName, "commit-cache"); + } + Directory.CreateDirectory(_cacheDir); + } + + public string GenerateHash(string model, string branch, string authorMessage, string diff) + { + string combined = $"{model}|{branch}|{authorMessage}|{diff}"; + using var sha = SHA256.Create(); + byte[] hashBytes = sha.ComputeHash(Encoding.UTF8.GetBytes(combined)); + return BitConverter.ToString(hashBytes).Replace("-", "").ToLowerInvariant(); + } + + public async Task LoadAsync(string model, string hash, int maxAgeDays = 30) + { + string path = Path.Combine(_cacheDir, $"{hash}.json"); + if (!File.Exists(path)) + return null; + + var json = await File.ReadAllTextAsync(path); + var cached = JsonSerializer.Deserialize(json); + if (cached is null || cached.Model != model) + return null; + + bool expired = DateTime.UtcNow - cached.Timestamp > TimeSpan.FromDays(maxAgeDays); + bool validChecksum = cached.Checksum == ComputeChecksum(model, cached.Response); + + if (expired || !validChecksum) + { + File.Delete(path); + return null; + } + return cached.Response; + } + + public async Task SaveAsync(string model, string hash, string response) + { + string path = Path.Combine(_cacheDir, $"{hash}.json"); + var checksum = ComputeChecksum(model, response); + var cached = new CachedResponse(model, response, checksum, DateTime.UtcNow); + var json = JsonSerializer.Serialize(cached); + await File.WriteAllTextAsync(path, json); + } + + private string ComputeChecksum(string model, string content) + { + using var sha = SHA256.Create(); + var combined = $"{model}|{content}"; + byte[] hashBytes = sha.ComputeHash(Encoding.UTF8.GetBytes(combined)); + return BitConverter.ToString(hashBytes).Replace("-", "").ToLowerInvariant(); + } + } +} From ea1bf7aa5fc687a9a91a9b224c258154034ae774 Mon Sep 17 00:00:00 2001 From: "gitauto-ai[bot]" <161652217+gitauto-ai[bot]@users.noreply.github.com> Date: Sun, 27 Apr 2025 04:04:43 +0000 Subject: [PATCH 3/6] Replace content of Src/AiCommitMessage/Services/Cache/CommitMessageCacheService.cs --- .../Cache/CommitMessageCacheService.cs | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 Src/AiCommitMessage/Services/Cache/CommitMessageCacheService.cs diff --git a/Src/AiCommitMessage/Services/Cache/CommitMessageCacheService.cs b/Src/AiCommitMessage/Services/Cache/CommitMessageCacheService.cs new file mode 100644 index 00000000..9a70489e --- /dev/null +++ b/Src/AiCommitMessage/Services/Cache/CommitMessageCacheService.cs @@ -0,0 +1,36 @@ +using System; +using System.Threading.Tasks; + +namespace AiCommitMessage.Services.Cache +{ + public class CommitMessageCacheService + { + private readonly ICacheProvider _cacheProvider; + + public CommitMessageCacheService(ICacheProvider cacheProvider) + { + _cacheProvider = cacheProvider; + } + + public async Task GetOrGenerateAsync( + string model, + string branch, + string authorMessage, + string diff, + Func> generateFunc) + { + string hash = _cacheProvider.GenerateHash(model, branch, authorMessage, diff); + string? cached = await _cacheProvider.LoadAsync(model, hash); + if (cached != null) + { + Console.WriteLine("\u2705 Loaded from cache."); + return cached; + } + + string result = await generateFunc(); + await _cacheProvider.SaveAsync(model, hash, result); + Console.WriteLine("\ud83d\udcac Cached new result."); + return result; + } + } +} From db0270b2a1edb7be188161a8a2d88e6d4e16387d Mon Sep 17 00:00:00 2001 From: "gstraccini[bot]" <150967461+gstraccini[bot]@users.noreply.github.com> Date: Wed, 14 May 2025 13:30:51 +0000 Subject: [PATCH 4/6] CSharpier format --- .../Cache/CommitMessageCacheService.cs | 3 ++- .../Services/Cache/FileCacheProvider.cs | 19 +++++++++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/Src/AiCommitMessage/Services/Cache/CommitMessageCacheService.cs b/Src/AiCommitMessage/Services/Cache/CommitMessageCacheService.cs index 9a70489e..c37113c4 100644 --- a/Src/AiCommitMessage/Services/Cache/CommitMessageCacheService.cs +++ b/Src/AiCommitMessage/Services/Cache/CommitMessageCacheService.cs @@ -17,7 +17,8 @@ public async Task GetOrGenerateAsync( string branch, string authorMessage, string diff, - Func> generateFunc) + Func> generateFunc + ) { string hash = _cacheProvider.GenerateHash(model, branch, authorMessage, diff); string? cached = await _cacheProvider.LoadAsync(model, hash); diff --git a/Src/AiCommitMessage/Services/Cache/FileCacheProvider.cs b/Src/AiCommitMessage/Services/Cache/FileCacheProvider.cs index 8cd8d750..90c3cbdc 100644 --- a/Src/AiCommitMessage/Services/Cache/FileCacheProvider.cs +++ b/Src/AiCommitMessage/Services/Cache/FileCacheProvider.cs @@ -6,7 +6,12 @@ namespace AiCommitMessage.Services.Cache { public class FileCacheProvider : ICacheProvider { - private record CachedResponse(string Model, string Response, string Checksum, DateTime Timestamp); + private record CachedResponse( + string Model, + string Response, + string Checksum, + DateTime Timestamp + ); private readonly string _cacheDir; @@ -19,12 +24,18 @@ public FileCacheProvider(string appName = "CommitMessageTool") } else { - string baseDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); + string baseDir = Environment.GetFolderPath( + Environment.SpecialFolder.ApplicationData + ); if (string.IsNullOrWhiteSpace(baseDir)) { - string? home = Environment.GetEnvironmentVariable("HOME") ?? Environment.GetEnvironmentVariable("USERPROFILE"); + string? home = + Environment.GetEnvironmentVariable("HOME") + ?? Environment.GetEnvironmentVariable("USERPROFILE"); if (string.IsNullOrEmpty(home)) - throw new InvalidOperationException("Unable to determine a valid user data directory"); + throw new InvalidOperationException( + "Unable to determine a valid user data directory" + ); baseDir = Path.Combine(home, ".config"); } _cacheDir = Path.Combine(baseDir, appName, "commit-cache"); From 32817b779364af8f588112e5994066846f47d736 Mon Sep 17 00:00:00 2001 From: Guilherme Branco Stracini Date: Tue, 15 Jul 2025 16:46:26 +0100 Subject: [PATCH 5/6] Update FileCacheProvider.cs --- .../Services/Cache/FileCacheProvider.cs | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/Src/AiCommitMessage/Services/Cache/FileCacheProvider.cs b/Src/AiCommitMessage/Services/Cache/FileCacheProvider.cs index 90c3cbdc..c6a72714 100644 --- a/Src/AiCommitMessage/Services/Cache/FileCacheProvider.cs +++ b/Src/AiCommitMessage/Services/Cache/FileCacheProvider.cs @@ -17,65 +17,73 @@ DateTime Timestamp public FileCacheProvider(string appName = "CommitMessageTool") { - string? envPath = Environment.GetEnvironmentVariable("COMMIT_CACHE_PATH"); + var envPath = Environment.GetEnvironmentVariable("COMMIT_CACHE_PATH"); if (!string.IsNullOrWhiteSpace(envPath)) { _cacheDir = Path.Combine(envPath, appName, "commit-cache"); } else { - string baseDir = Environment.GetFolderPath( + var baseDir = Environment.GetFolderPath( Environment.SpecialFolder.ApplicationData ); if (string.IsNullOrWhiteSpace(baseDir)) { - string? home = + var home = Environment.GetEnvironmentVariable("HOME") ?? Environment.GetEnvironmentVariable("USERPROFILE"); if (string.IsNullOrEmpty(home)) + { throw new InvalidOperationException( "Unable to determine a valid user data directory" ); + } + baseDir = Path.Combine(home, ".config"); } + _cacheDir = Path.Combine(baseDir, appName, "commit-cache"); } + Directory.CreateDirectory(_cacheDir); } public string GenerateHash(string model, string branch, string authorMessage, string diff) { - string combined = $"{model}|{branch}|{authorMessage}|{diff}"; + var combined = $"{model}|{branch}|{authorMessage}|{diff}"; using var sha = SHA256.Create(); - byte[] hashBytes = sha.ComputeHash(Encoding.UTF8.GetBytes(combined)); + var hashBytes = sha.ComputeHash(Encoding.UTF8.GetBytes(combined)); return BitConverter.ToString(hashBytes).Replace("-", "").ToLowerInvariant(); } public async Task LoadAsync(string model, string hash, int maxAgeDays = 30) { - string path = Path.Combine(_cacheDir, $"{hash}.json"); + var path = Path.Combine(_cacheDir, $"{hash}.json"); if (!File.Exists(path)) return null; var json = await File.ReadAllTextAsync(path); var cached = JsonSerializer.Deserialize(json); if (cached is null || cached.Model != model) + { return null; - - bool expired = DateTime.UtcNow - cached.Timestamp > TimeSpan.FromDays(maxAgeDays); - bool validChecksum = cached.Checksum == ComputeChecksum(model, cached.Response); + } + + var expired = DateTime.UtcNow - cached.Timestamp > TimeSpan.FromDays(maxAgeDays); + var validChecksum = cached.Checksum == ComputeChecksum(model, cached.Response); if (expired || !validChecksum) { File.Delete(path); return null; } + return cached.Response; } public async Task SaveAsync(string model, string hash, string response) { - string path = Path.Combine(_cacheDir, $"{hash}.json"); + var path = Path.Combine(_cacheDir, $"{hash}.json"); var checksum = ComputeChecksum(model, response); var cached = new CachedResponse(model, response, checksum, DateTime.UtcNow); var json = JsonSerializer.Serialize(cached); @@ -86,7 +94,7 @@ private string ComputeChecksum(string model, string content) { using var sha = SHA256.Create(); var combined = $"{model}|{content}"; - byte[] hashBytes = sha.ComputeHash(Encoding.UTF8.GetBytes(combined)); + var hashBytes = sha.ComputeHash(Encoding.UTF8.GetBytes(combined)); return BitConverter.ToString(hashBytes).Replace("-", "").ToLowerInvariant(); } } From 9e3650c166d0bd3ebbd5d931d28ec5025b886b02 Mon Sep 17 00:00:00 2001 From: "gstraccini[bot]" <150967461+gstraccini[bot]@users.noreply.github.com> Date: Tue, 15 Jul 2025 16:05:17 +0000 Subject: [PATCH 6/6] CSharpier format + Add workflow template --- .../Services/Cache/FileCacheProvider.cs | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/Src/AiCommitMessage/Services/Cache/FileCacheProvider.cs b/Src/AiCommitMessage/Services/Cache/FileCacheProvider.cs index c6a72714..7ec4034a 100644 --- a/Src/AiCommitMessage/Services/Cache/FileCacheProvider.cs +++ b/Src/AiCommitMessage/Services/Cache/FileCacheProvider.cs @@ -24,9 +24,7 @@ public FileCacheProvider(string appName = "CommitMessageTool") } else { - var baseDir = Environment.GetFolderPath( - Environment.SpecialFolder.ApplicationData - ); + var baseDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); if (string.IsNullOrWhiteSpace(baseDir)) { var home = @@ -38,13 +36,13 @@ public FileCacheProvider(string appName = "CommitMessageTool") "Unable to determine a valid user data directory" ); } - + baseDir = Path.Combine(home, ".config"); } - + _cacheDir = Path.Combine(baseDir, appName, "commit-cache"); } - + Directory.CreateDirectory(_cacheDir); } @@ -68,7 +66,7 @@ public string GenerateHash(string model, string branch, string authorMessage, st { return null; } - + var expired = DateTime.UtcNow - cached.Timestamp > TimeSpan.FromDays(maxAgeDays); var validChecksum = cached.Checksum == ComputeChecksum(model, cached.Response); @@ -77,7 +75,7 @@ public string GenerateHash(string model, string branch, string authorMessage, st File.Delete(path); return null; } - + return cached.Response; }