From d6b8906358376c335d4cf3507988beecb972f69b Mon Sep 17 00:00:00 2001 From: Lamparter <71598437+Lamparter@users.noreply.github.com> Date: Wed, 29 Apr 2026 18:29:19 +0100 Subject: [PATCH 1/2] Initial move --- src/Files.App/Utils/Git/GitHelpers.cs | 35 ++-------------------- src/Files.App/Utils/Git/IVersionControl.cs | 2 +- src/Files.App/Utils/Git/LibGit2.cs | 34 ++++++++++++++++++++- 3 files changed, 37 insertions(+), 34 deletions(-) diff --git a/src/Files.App/Utils/Git/GitHelpers.cs b/src/Files.App/Utils/Git/GitHelpers.cs index 8bdbf204fcb3..4f44bc8427a9 100644 --- a/src/Files.App/Utils/Git/GitHelpers.cs +++ b/src/Files.App/Utils/Git/GitHelpers.cs @@ -22,6 +22,9 @@ internal static partial class GitHelpers /// public static string GetOriginRepositoryName(string? path) => _implementation.GetOriginRepositoryName(path); + /// + public static Task GetBranchNames(string? path) => _implementation.GetBranchNames(path); + #region Legacy implementation // Property already moved into abstraction @@ -88,38 +91,6 @@ private set // Event handler already moved into abstraction public static event EventHandler? GitFetchCompleted; - public static async Task GetBranchesNames(string? path) - { - if (string.IsNullOrWhiteSpace(path) || !IsRepoValid(path)) - return []; - - var (result, returnValue) = await DoGitOperationAsync<(GitOperationResult, BranchItem[])>(() => - { - var branches = Array.Empty(); - var result = GitOperationResult.Success; - try - { - using var repository = new Repository(path); - - branches = GetValidBranches(repository.Branches) - .OrderByDescending(b => b.Tip?.Committer.When) - .GroupBy(b => b.IsRemote) - .SelectMany(g => g.Take(MAX_NUMBER_OF_BRANCHES)) - .OrderByDescending(b => b.IsCurrentRepositoryHead) - .Select(b => new BranchItem(b.FriendlyName, b.IsCurrentRepositoryHead, b.IsRemote, TryGetTrackingDetails(b)?.AheadBy ?? 0, TryGetTrackingDetails(b)?.BehindBy ?? 0)) - .ToArray(); - } - catch (Exception) - { - result = GitOperationResult.GenericError; - } - - return (result, branches); - }); - - return returnValue; - } - public static async Task GetRepositoryHead(string? path) { if (string.IsNullOrWhiteSpace(path) || !IsRepoValid(path)) diff --git a/src/Files.App/Utils/Git/IVersionControl.cs b/src/Files.App/Utils/Git/IVersionControl.cs index 8da482213c86..b50be4dd4bb1 100644 --- a/src/Files.App/Utils/Git/IVersionControl.cs +++ b/src/Files.App/Utils/Git/IVersionControl.cs @@ -44,7 +44,7 @@ internal interface IVersionControl /// /// A task producing an array of branches; returns an empty array when the repository is invalid or unavailable. /// - Task GetBranchesNames(string? path); + Task GetBranchNames(string? path); /// /// Gets the current repository HEAD reference. diff --git a/src/Files.App/Utils/Git/LibGit2.cs b/src/Files.App/Utils/Git/LibGit2.cs index db9e56afe485..d6e47000b457 100644 --- a/src/Files.App/Utils/Git/LibGit2.cs +++ b/src/Files.App/Utils/Git/LibGit2.cs @@ -1,4 +1,4 @@ -using LibGit2Sharp; +using LibGit2Sharp; using Microsoft.Extensions.Logging; using System.Text; using System.Text.RegularExpressions; @@ -95,6 +95,38 @@ public string GetOriginRepositoryName(string? path) return repositoryName[..repositoryName.LastIndexOf(".git")]; } + public async Task GetBranchNames(string? path) + { + if (string.IsNullOrWhiteSpace(path) || !IsRepoValid(path)) + return []; + + var (result, returnValue) = await DoGitOperationAsync<(GitOperationResult, BranchItem[])>(() => + { + var branches = Array.Empty(); + var result = GitOperationResult.Success; + try + { + using var repository = new Repository(path); + + branches = GetValidBranches(repository.Branches) + .OrderByDescending(b => b.Tip?.Committer.When) + .GroupBy(b => b.IsRemote) + .SelectMany(g => g.Take(MAX_NUMBER_OF_BRANCHES)) + .OrderByDescending(b => b.IsCurrentRepositoryHead) + .Select(b => new BranchItem(b.FriendlyName, b.IsCurrentRepositoryHead, b.IsRemote, TryGetTrackingDetails(b)?.AheadBy ?? 0, TryGetTrackingDetails(b)?.BehindBy ?? 0)) + .ToArray(); + } + catch (Exception) + { + result = GitOperationResult.GenericError; + } + + return (result, branches); + }); + + return returnValue; + } + private static bool IsRepoValid(string path) { return SafetyExtensions.IgnoreExceptions(() => Repository.IsValid(path)); From 5da4f3470b01846a8057fa5e30b296df8c3dd9c2 Mon Sep 17 00:00:00 2001 From: Lamparter <71598437+Lamparter@users.noreply.github.com> Date: Mon, 18 May 2026 22:02:23 +0100 Subject: [PATCH 2/2] Rename to `GetBranchNames` throughout codebase --- src/Files.App/Data/Models/DirectoryPropertiesViewModel.cs | 2 +- src/Files.App/ViewModels/Dialogs/AddBranchDialogViewModel.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Files.App/Data/Models/DirectoryPropertiesViewModel.cs b/src/Files.App/Data/Models/DirectoryPropertiesViewModel.cs index d6fd99840b3e..1109998f2b6a 100644 --- a/src/Files.App/Data/Models/DirectoryPropertiesViewModel.cs +++ b/src/Files.App/Data/Models/DirectoryPropertiesViewModel.cs @@ -144,7 +144,7 @@ public async Task LoadBranches() if (string.IsNullOrEmpty(_gitRepositoryPath)) return; - var branches = await GitHelpers.GetBranchesNames(_gitRepositoryPath); + var branches = await GitHelpers.GetBranchNames(_gitRepositoryPath); _localBranches.Clear(); _remoteBranches.Clear(); diff --git a/src/Files.App/ViewModels/Dialogs/AddBranchDialogViewModel.cs b/src/Files.App/ViewModels/Dialogs/AddBranchDialogViewModel.cs index d869959bf843..66704fe84b99 100644 --- a/src/Files.App/ViewModels/Dialogs/AddBranchDialogViewModel.cs +++ b/src/Files.App/ViewModels/Dialogs/AddBranchDialogViewModel.cs @@ -56,7 +56,7 @@ public AddBranchDialogViewModel(string repositoryPath, string activeBranch) public async Task LoadBranches() { - Branches = (await GitHelpers.GetBranchesNames(_repositoryPath)).Select(b => b.Name).ToArray(); + Branches = (await GitHelpers.GetBranchNames(_repositoryPath)).Select(b => b.Name).ToArray(); OnPropertyChanged(nameof(Branches)); } }