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));
}
}