From eeb6abb560b3e81942dd4c029b7daa33e68c004d Mon Sep 17 00:00:00 2001 From: leo Date: Tue, 7 May 2024 15:49:57 +0800 Subject: [PATCH] fix: avoid duplicated nodes being added into the repository tree --- src/ViewModels/Clone.cs | 13 ++----------- src/ViewModels/Init.cs | 10 +--------- src/ViewModels/Preference.cs | 23 +++++++++++++++++++++++ src/Views/Welcome.axaml.cs | 9 +-------- 4 files changed, 27 insertions(+), 28 deletions(-) diff --git a/src/ViewModels/Clone.cs b/src/ViewModels/Clone.cs index d1702860..103f0505 100644 --- a/src/ViewModels/Clone.cs +++ b/src/ViewModels/Clone.cs @@ -1,5 +1,4 @@ -using System; -using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations; using System.IO; using System.Threading.Tasks; @@ -114,15 +113,7 @@ namespace SourceGit.ViewModels CallUIThread(() => { var repo = Preference.AddRepository(path, Path.Combine(path, ".git")); - var node = new RepositoryNode() - { - Id = repo.FullPath, - Name = Path.GetFileName(repo.FullPath), - Bookmark = 0, - IsRepository = true, - }; - Preference.AddNode(node); - + var node = Preference.FindOrAddNodeByRepositoryPath(repo.FullPath, null); _launcher.OpenRepositoryInTab(node, _page); }); diff --git a/src/ViewModels/Init.cs b/src/ViewModels/Init.cs index 5f1e846e..b2c48fc7 100644 --- a/src/ViewModels/Init.cs +++ b/src/ViewModels/Init.cs @@ -28,18 +28,10 @@ namespace SourceGit.ViewModels return false; var gitDir = Path.GetFullPath(Path.Combine(_targetPath, ".git")); - CallUIThread(() => { var repo = Preference.AddRepository(_targetPath, gitDir); - var node = new RepositoryNode() - { - Id = repo.FullPath, - Name = Path.GetFileName(repo.FullPath), - Bookmark = 0, - IsRepository = true, - }; - Preference.AddNode(node); + Preference.FindOrAddNodeByRepositoryPath(repo.FullPath, null); }); return true; diff --git a/src/ViewModels/Preference.cs b/src/ViewModels/Preference.cs index 075ec172..a9360e96 100644 --- a/src/ViewModels/Preference.cs +++ b/src/ViewModels/Preference.cs @@ -346,6 +346,29 @@ namespace SourceGit.ViewModels return FindNodeRecursive(id, _instance.RepositoryNodes); } + public static RepositoryNode FindOrAddNodeByRepositoryPath(string repo, RepositoryNode parent) + { + var node = FindNodeRecursive(repo, _instance.RepositoryNodes); + if (node == null) + { + node = new RepositoryNode() + { + Id = Guid.NewGuid().ToString(), + Name = Path.GetFileName(repo), + Bookmark = 0, + IsRepository = true, + }; + + AddNode(node, parent); + } + else + { + MoveNode(node, parent); + } + + return node; + } + public static void MoveNode(RepositoryNode node, RepositoryNode to = null) { if (to == null && _instance._repositoryNodes.Contains(node)) diff --git a/src/Views/Welcome.axaml.cs b/src/Views/Welcome.axaml.cs index 53ef2b5a..f0e3a1fc 100644 --- a/src/Views/Welcome.axaml.cs +++ b/src/Views/Welcome.axaml.cs @@ -257,14 +257,7 @@ namespace SourceGit.Views Dispatcher.UIThread.Invoke(() => { var repo = ViewModels.Preference.AddRepository(root, gitDir); - var node = new ViewModels.RepositoryNode() - { - Id = repo.FullPath, - Name = Path.GetFileName(repo.FullPath), - Bookmark = 0, - IsRepository = true, - }; - ViewModels.Preference.AddNode(node, parent); + var node = ViewModels.Preference.FindOrAddNodeByRepositoryPath(repo.FullPath, parent); launcher.OpenRepositoryInTab(node, page); }); });