enhance: manually update local branch tree after renaming a local branch (#2169)

Signed-off-by: leo <longshuang@msn.cn>
This commit is contained in:
leo
2026-03-17 11:10:47 +08:00
parent 5fdd4e3189
commit 11158d0985
3 changed files with 61 additions and 41 deletions

View File

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

View File

@@ -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<Models.Branch> 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();

View File

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