From 11158d098599048f45646f9731d60cff7c0928c0 Mon Sep 17 00:00:00 2001 From: leo Date: Tue, 17 Mar 2026 11:10:47 +0800 Subject: [PATCH] enhance: manually update local branch tree after renaming a local branch (#2169) Signed-off-by: leo --- src/ViewModels/RenameBranch.cs | 10 +---- src/ViewModels/Repository.cs | 24 ++++++++++++ src/Views/BranchTree.axaml.cs | 68 ++++++++++++++++++---------------- 3 files changed, 61 insertions(+), 41 deletions(-) diff --git a/src/ViewModels/RenameBranch.cs b/src/ViewModels/RenameBranch.cs index e15a96b9..4a9235d4 100644 --- a/src/ViewModels/RenameBranch.cs +++ b/src/ViewModels/RenameBranch.cs @@ -60,17 +60,9 @@ namespace SourceGit.ViewModels .RenameAsync(_name); if (succ) - _repo.UIStates.RenameBranchFilter(Target.FullName, _name); + _repo.FastRefreshBranchesAfterRenaming(Target, _name); log.Complete(); - _repo.MarkBranchesDirtyManually(); - - if (isCurrent) - { - ProgressDescription = "Waiting for branch updated..."; - await Task.Delay(400); - } - return succ; } diff --git a/src/ViewModels/Repository.cs b/src/ViewModels/Repository.cs index 6fa078a9..dacafd55 100644 --- a/src/ViewModels/Repository.cs +++ b/src/ViewModels/Repository.cs @@ -824,6 +824,30 @@ namespace SourceGit.ViewModels RefreshWorktrees(); } + public void FastRefreshBranchesAfterRenaming(Models.Branch b, string newName) + { + _watcher?.MarkBranchUpdated(); + + var newFullName = $"refs/heads/{newName}"; + _uiStates.RenameBranchFilter(b.FullName, newFullName); + + b.Name = newName; + b.FullName = newFullName; + + List locals = []; + foreach (var branch in _branches) + { + if (branch.IsLocal) + locals.Add(branch); + } + + var builder = BuildBranchTree(locals, []); + LocalBranchTrees = builder.Locals; + + RefreshCommits(); + RefreshWorktrees(); + } + public void MarkBranchesDirtyManually() { _watcher?.MarkBranchUpdated(); diff --git a/src/Views/BranchTree.axaml.cs b/src/Views/BranchTree.axaml.cs index 65113340..367e5424 100644 --- a/src/Views/BranchTree.axaml.cs +++ b/src/Views/BranchTree.axaml.cs @@ -887,37 +887,45 @@ namespace SourceGit.Views } } - var rename = new MenuItem(); - rename.Header = App.Text("BranchCM.Rename", branch.Name); - rename.Icon = App.CreateMenuIcon("Icons.Rename"); - rename.Click += (_, e) => + if (!branch.IsDetachedHead) { - if (repo.CanCreatePopup()) - repo.ShowPopup(new ViewModels.RenameBranch(repo, branch)); - e.Handled = true; - }; + var editDescription = new MenuItem(); + editDescription.Header = App.Text("BranchCM.EditDescription", branch.Name); + editDescription.Icon = App.CreateMenuIcon("Icons.Edit"); + editDescription.Click += async (_, e) => + { + var desc = await new Commands.Config(repo.FullPath).GetAsync($"branch.{branch.Name}.description"); + if (repo.CanCreatePopup()) + repo.ShowPopup(new ViewModels.EditBranchDescription(repo, branch, desc)); + e.Handled = true; + }; - var editDescription = new MenuItem(); - editDescription.Header = App.Text("BranchCM.EditDescription", branch.Name); - editDescription.Icon = App.CreateMenuIcon("Icons.Edit"); - editDescription.Click += async (_, e) => - { - var desc = await new Commands.Config(repo.FullPath).GetAsync($"branch.{branch.Name}.description"); - if (repo.CanCreatePopup()) - repo.ShowPopup(new ViewModels.EditBranchDescription(repo, branch, desc)); - e.Handled = true; - }; + var rename = new MenuItem(); + rename.Header = App.Text("BranchCM.Rename", branch.Name); + rename.Icon = App.CreateMenuIcon("Icons.Rename"); + rename.Click += (_, e) => + { + if (repo.CanCreatePopup()) + repo.ShowPopup(new ViewModels.RenameBranch(repo, branch)); + e.Handled = true; + }; - var delete = new MenuItem(); - delete.Header = App.Text("BranchCM.Delete", branch.Name); - delete.Icon = App.CreateMenuIcon("Icons.Clear"); - delete.IsEnabled = !branch.IsCurrent; - delete.Click += (_, e) => - { - if (repo.CanCreatePopup()) - repo.ShowPopup(new ViewModels.DeleteBranch(repo, branch)); - e.Handled = true; - }; + var delete = new MenuItem(); + delete.Header = App.Text("BranchCM.Delete", branch.Name); + delete.Icon = App.CreateMenuIcon("Icons.Clear"); + delete.IsEnabled = !branch.IsCurrent; + delete.Click += (_, e) => + { + if (repo.CanCreatePopup()) + repo.ShowPopup(new ViewModels.DeleteBranch(repo, branch)); + e.Handled = true; + }; + + menu.Items.Add(new MenuItem() { Header = "-" }); + menu.Items.Add(editDescription); + menu.Items.Add(rename); + menu.Items.Add(delete); + } var createBranch = new MenuItem(); createBranch.Icon = App.CreateMenuIcon("Icons.Branch.Add"); @@ -939,10 +947,6 @@ namespace SourceGit.Views e.Handled = true; }; - menu.Items.Add(new MenuItem() { Header = "-" }); - menu.Items.Add(editDescription); - menu.Items.Add(rename); - menu.Items.Add(delete); menu.Items.Add(new MenuItem() { Header = "-" }); menu.Items.Add(createBranch); menu.Items.Add(createTag);