From 0539a94cbef3d6a976f1a9580b2d62e1f38ef3df Mon Sep 17 00:00:00 2001 From: leo Date: Sun, 20 Oct 2024 20:42:14 +0800 Subject: [PATCH] feature: mark deleted repository and auto remove it after scan default clone dir (#576) --- src/ViewModels/Preference.cs | 28 ++++++++++++++++++++++++++++ src/ViewModels/RepositoryNode.cs | 7 +++++++ src/ViewModels/ScanRepositories.cs | 5 +---- src/Views/Welcome.axaml | 13 +++++++++---- 4 files changed, 45 insertions(+), 8 deletions(-) diff --git a/src/ViewModels/Preference.cs b/src/ViewModels/Preference.cs index 7a635498..5cb0ee4b 100644 --- a/src/ViewModels/Preference.cs +++ b/src/ViewModels/Preference.cs @@ -453,6 +453,13 @@ namespace SourceGit.ViewModels Save(); } + public void AutoRemoveInvalidNode() + { + var changed = RemoveInvalidRepositoriesRecursive(RepositoryNodes); + if (changed) + Save(); + } + public void Save() { if (_isLoading) @@ -567,6 +574,27 @@ namespace SourceGit.ViewModels return false; } + private bool RemoveInvalidRepositoriesRecursive(List collection) + { + bool changed = false; + + for (int i = collection.Count - 1; i >= 0; i--) + { + var node = collection[i]; + if (node.IsInvalid) + { + collection.RemoveAt(i); + changed = true; + } + else if (!node.IsRepository) + { + changed |= RemoveInvalidRepositoriesRecursive(node.SubNodes); + } + } + + return changed; + } + private static Preference _instance = null; private static bool _isLoading = false; diff --git a/src/ViewModels/RepositoryNode.cs b/src/ViewModels/RepositoryNode.cs index 3cc98c16..7e121b36 100644 --- a/src/ViewModels/RepositoryNode.cs +++ b/src/ViewModels/RepositoryNode.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.IO; using System.Text.Json.Serialization; using CommunityToolkit.Mvvm.ComponentModel; @@ -48,6 +49,12 @@ namespace SourceGit.ViewModels set => SetProperty(ref _isVisible, value); } + [JsonIgnore] + public bool IsInvalid + { + get => _isRepository && !Directory.Exists(_id); + } + [JsonIgnore] public int Depth { diff --git a/src/ViewModels/ScanRepositories.cs b/src/ViewModels/ScanRepositories.cs index 6130801d..115edf2d 100644 --- a/src/ViewModels/ScanRepositories.cs +++ b/src/ViewModels/ScanRepositories.cs @@ -56,12 +56,9 @@ namespace SourceGit.ViewModels var group = FindOrCreateGroupRecursive(Preference.Instance.RepositoryNodes, relative); Preference.Instance.FindOrAddNodeByRepositoryPath(f, group, false); } - else - { - // Should not happen. - } } + Preference.Instance.AutoRemoveInvalidNode(); Welcome.Instance.Refresh(); }); diff --git a/src/Views/Welcome.axaml b/src/Views/Welcome.axaml index 19703fa9..6f12c119 100644 --- a/src/Views/Welcome.axaml +++ b/src/Views/Welcome.axaml @@ -131,10 +131,15 @@ IsChecked="{Binding IsExpanded}" IsVisible="{Binding !IsRepository}"/> - + + + + +