From 93ee7b72d51c3c481af29a293690339a5481dd89 Mon Sep 17 00:00:00 2001 From: Mika Kuns Date: Wed, 22 Apr 2026 09:22:41 +0200 Subject: [PATCH] feat(git): add GetCurrentBranchAsync --- src/ClaudeDo.Data/Git/GitService.cs | 9 +++++ .../Runner/GitServiceMergeTests.cs | 37 +++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 tests/ClaudeDo.Worker.Tests/Runner/GitServiceMergeTests.cs diff --git a/src/ClaudeDo.Data/Git/GitService.cs b/src/ClaudeDo.Data/Git/GitService.cs index 5d8b791..df0188e 100644 --- a/src/ClaudeDo.Data/Git/GitService.cs +++ b/src/ClaudeDo.Data/Git/GitService.cs @@ -151,6 +151,15 @@ public sealed class GitService throw new InvalidOperationException($"git branch {flag} failed (exit {exitCode}): {stderr}"); } + public async Task GetCurrentBranchAsync(string repoDir, CancellationToken ct = default) + { + var (exitCode, stdout, stderr) = await RunGitAsync(repoDir, + ["symbolic-ref", "--short", "HEAD"], ct); + if (exitCode != 0) + throw new InvalidOperationException($"git symbolic-ref --short HEAD failed (exit {exitCode}): {stderr}"); + return stdout.Trim(); + } + public async Task MergeFfOnlyAsync(string repoDir, string branchName, CancellationToken ct = default) { var (exitCode, _, stderr) = await RunGitAsync(repoDir, ["merge", "--ff-only", branchName], ct); diff --git a/tests/ClaudeDo.Worker.Tests/Runner/GitServiceMergeTests.cs b/tests/ClaudeDo.Worker.Tests/Runner/GitServiceMergeTests.cs new file mode 100644 index 0000000..b091848 --- /dev/null +++ b/tests/ClaudeDo.Worker.Tests/Runner/GitServiceMergeTests.cs @@ -0,0 +1,37 @@ +using ClaudeDo.Data.Git; +using ClaudeDo.Worker.Tests.Infrastructure; + +namespace ClaudeDo.Worker.Tests.Runner; + +public class GitServiceMergeTests : IDisposable +{ + private readonly List _repos = new(); + + private GitRepoFixture NewRepo() + { + var r = new GitRepoFixture(); + _repos.Add(r); + return r; + } + + public void Dispose() + { + foreach (var r in _repos) try { r.Dispose(); } catch { } + } + + [Fact] + public async Task GetCurrentBranchAsync_FreshRepo_ReturnsDefaultBranch() + { + if (!GitRepoFixture.IsGitAvailable()) return; + + var repo = NewRepo(); + var git = new GitService(); + + var branch = await git.GetCurrentBranchAsync(repo.RepoDir); + + Assert.False(string.IsNullOrWhiteSpace(branch)); + // Default branch is either "main" or "master" depending on git config. + Assert.True(branch == "main" || branch == "master", + $"Expected main or master, got '{branch}'"); + } +}