feature: supports to scan workspace's default clone dir (#1454)

Signed-off-by: leo <longshuang@msn.cn>
This commit is contained in:
leo 2025-06-24 21:19:52 +08:00
parent f657847129
commit dd01c74d11
No known key found for this signature in database
4 changed files with 59 additions and 20 deletions

8
src/Models/ScanDir.cs Normal file
View file

@ -0,0 +1,8 @@
namespace SourceGit.Models
{
public record ScanDir(string path, string desc)
{
public string Path { get; set; } = path;
public string Desc { get; set; } = desc;
}
}

View file

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Diagnostics;
using System.IO;
using System.Threading.Tasks;
@ -10,27 +11,45 @@ namespace SourceGit.ViewModels
{
public class ScanRepositories : Popup
{
public string RootDir
public List<Models.ScanDir> ScanDirs
{
get;
}
public ScanRepositories(string rootDir)
[Required(ErrorMessage = "Scan directory is required!!!")]
public Models.ScanDir Selected
{
get => _selected;
set => SetProperty(ref _selected, value, true);
}
public ScanRepositories()
{
ScanDirs = new List<Models.ScanDir>();
if (!string.IsNullOrEmpty(Preferences.Instance.GitDefaultCloneDir))
ScanDirs.Add(new Models.ScanDir(Preferences.Instance.GitDefaultCloneDir, "Global"));
var workspace = Preferences.Instance.GetActiveWorkspace();
if (!string.IsNullOrEmpty(workspace.DefaultCloneDir))
ScanDirs.Add(new Models.ScanDir(workspace.DefaultCloneDir, "Workspace"));
if (ScanDirs.Count > 0)
_selected = ScanDirs[0];
GetManagedRepositories(Preferences.Instance.RepositoryNodes, _managed);
RootDir = rootDir;
}
public override Task<bool> Sure()
{
ProgressDescription = $"Scan repositories under '{RootDir}' ...";
ProgressDescription = $"Scan repositories under '{_selected.Path}' ...";
return Task.Run(() =>
{
var watch = new Stopwatch();
watch.Start();
var rootDir = new DirectoryInfo(RootDir);
var rootDir = new DirectoryInfo(_selected.Path);
var found = new List<string>();
GetUnmanagedRepositories(rootDir, found, new EnumerationOptions()
{
@ -159,5 +178,6 @@ namespace SourceGit.ViewModels
}
private HashSet<string> _managed = new();
private Models.ScanDir _selected = null;
}
}

View file

@ -150,22 +150,15 @@ namespace SourceGit.ViewModels
public void ScanDefaultCloneDir()
{
var defaultCloneDir = Preferences.Instance.GitDefaultCloneDir;
if (string.IsNullOrEmpty(defaultCloneDir))
if (!Preferences.Instance.IsGitConfigured())
{
App.RaiseException(string.Empty, "The default clone directory hasn't been configured!");
return;
}
if (!Directory.Exists(defaultCloneDir))
{
App.RaiseException(string.Empty, $"The default clone directory '{defaultCloneDir}' does not exist!");
App.RaiseException(string.Empty, App.Text("NotConfigured"));
return;
}
var activePage = App.GetLauncher().ActivePage;
if (activePage != null && activePage.CanCreatePopup())
activePage.StartPopup(new ScanRepositories(defaultCloneDir));
activePage.Popup = new ScanRepositories();
}
public void ClearSearchFilter()

View file

@ -2,6 +2,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:m="using:SourceGit.Models"
xmlns:vm="using:SourceGit.ViewModels"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="SourceGit.Views.ScanRepositories"
@ -10,16 +11,33 @@
<TextBlock FontSize="18"
Classes="bold"
Text="{DynamicResource Text.ScanRepositories}"/>
<Grid Margin="0,16,0,0" RowDefinitions="32" ColumnDefinitions="130,*">
<Grid Margin="0,16,0,0" RowDefinitions="32" ColumnDefinitions="120,*">
<TextBlock Grid.Row="0" Grid.Column="0"
HorizontalAlignment="Right" VerticalAlignment="Center"
Margin="0,0,8,0"
Text="{DynamicResource Text.ScanRepositories.RootDir}"/>
<ComboBox Grid.Row="0" Grid.Column="1"
Height="28" Padding="4,0"
VerticalAlignment="Center" HorizontalAlignment="Stretch"
ItemsSource="{Binding ScanDirs, Mode=OneWay}"
SelectedItem="{Binding Selected, Mode=TwoWay}">
<ComboBox.ItemTemplate>
<DataTemplate DataType="m:ScanDir">
<Grid ColumnDefinitions="20,*,Auto">
<Path Grid.Column="0"
Width="12" Height="12"
Data="{StaticResource Icons.Folder}"
Fill="{DynamicResource Brush.FG1}"/>
<Grid Grid.Row="0" Grid.Column="1" ColumnDefinitions="Auto,*">
<Path Grid.Column="0" Width="14" Height="14" Margin="0,4,0,0" Data="{StaticResource Icons.Folder}"/>
<TextBlock Grid.Column="1" VerticalAlignment="Center" Text="{Binding RootDir}" Margin="4,0,0,0" TextTrimming="CharacterEllipsis"/>
</Grid>
<TextBlock Grid.Column="1" Margin="4,0" Text="{Binding Path}" VerticalAlignment="Center"/>
<Border Grid.Column="2" Height="16" Background="Green" CornerRadius="8" VerticalAlignment="Center">
<TextBlock Classes="primary" Text="{Binding Desc}" Margin="8,0" FontSize="10" Foreground="White"/>
</Border>
</Grid>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</Grid>
</StackPanel>
</UserControl>