From bc5deac9fe2f45eef7bee5512a1cb814951c8167 Mon Sep 17 00:00:00 2001 From: leo Date: Fri, 30 May 2025 17:12:56 +0800 Subject: [PATCH] fix: `OpenFolderPickerAsync` raise exception when selected a drive root such as `E:\` Signed-off-by: leo --- src/Commands/FormatPatch.cs | 1 + src/ViewModels/CommitDetail.cs | 4 +++- src/ViewModels/Histories.cs | 10 +++++++--- src/Views/AddWorktree.axaml.cs | 6 +++++- src/Views/Clone.axaml.cs | 6 +++++- src/Views/ConfigureWorkspace.axaml.cs | 4 +++- src/Views/Preferences.axaml.cs | 4 +++- src/Views/WelcomeToolbar.axaml.cs | 6 +++++- 8 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src/Commands/FormatPatch.cs b/src/Commands/FormatPatch.cs index b3ec2e4a..bf850d60 100644 --- a/src/Commands/FormatPatch.cs +++ b/src/Commands/FormatPatch.cs @@ -6,6 +6,7 @@ { WorkingDirectory = repo; Context = repo; + Editor = EditorType.None; Args = $"format-patch {commit} -1 --output=\"{saveTo}\""; } } diff --git a/src/ViewModels/CommitDetail.cs b/src/ViewModels/CommitDetail.cs index bd4f2284..959cc3fe 100644 --- a/src/ViewModels/CommitDetail.cs +++ b/src/ViewModels/CommitDetail.cs @@ -452,7 +452,9 @@ namespace SourceGit.ViewModels var selected = await storageProvider.OpenFolderPickerAsync(options); if (selected.Count == 1) { - var saveTo = Path.Combine(selected[0].Path.LocalPath, Path.GetFileName(file.Path)); + var folder = selected[0]; + var folderPath = folder is { Path: { IsAbsoluteUri: true } path } ? path.LocalPath : folder?.Path.ToString(); + var saveTo = Path.Combine(folderPath, Path.GetFileName(file.Path)); Commands.SaveRevisionFile.Run(_repo.FullPath, _commit.SHA, file.Path, saveTo); } } diff --git a/src/ViewModels/Histories.cs b/src/ViewModels/Histories.cs index 2057a13f..5ca1ba5d 100644 --- a/src/ViewModels/Histories.cs +++ b/src/ViewModels/Histories.cs @@ -333,10 +333,12 @@ namespace SourceGit.ViewModels { log = _repo.CreateLog("Save as Patch"); + var folder = picker[0]; + var folderPath = folder is { Path: { IsAbsoluteUri: true } path } ? path.LocalPath : folder?.Path.ToString(); var succ = false; for (var i = 0; i < selected.Count; i++) { - var saveTo = GetPatchFileName(picker[0].Path.LocalPath, selected[i], i); + var saveTo = GetPatchFileName(folderPath, selected[i], i); succ = await Task.Run(() => new Commands.FormatPatch(_repo.FullPath, selected[i].SHA, saveTo).Use(log).Exec()); if (!succ) break; @@ -691,8 +693,10 @@ namespace SourceGit.ViewModels { log = _repo.CreateLog("Save as Patch"); - var saveTo = GetPatchFileName(selected[0].Path.LocalPath, commit); - var succ = new Commands.FormatPatch(_repo.FullPath, commit.SHA, saveTo).Use(log).Exec(); + var folder = selected[0]; + var folderPath = folder is { Path: { IsAbsoluteUri: true } path } ? path.LocalPath : folder?.Path.ToString(); + var saveTo = GetPatchFileName(folderPath, commit); + var succ = await Task.Run(() => new Commands.FormatPatch(_repo.FullPath, commit.SHA, saveTo).Use(log).Exec()); if (succ) App.SendNotification(_repo.FullPath, App.Text("SaveAsPatchSuccess")); } diff --git a/src/Views/AddWorktree.axaml.cs b/src/Views/AddWorktree.axaml.cs index 30369247..dad947de 100644 --- a/src/Views/AddWorktree.axaml.cs +++ b/src/Views/AddWorktree.axaml.cs @@ -23,7 +23,11 @@ namespace SourceGit.Views { var selected = await toplevel.StorageProvider.OpenFolderPickerAsync(options); if (selected.Count == 1) - TxtLocation.Text = selected[0].Path.LocalPath; + { + var folder = selected[0]; + var folderPath = folder is { Path: { IsAbsoluteUri: true } path } ? path.LocalPath : folder?.Path.ToString(); + TxtLocation.Text = folderPath; + } } catch (Exception exception) { diff --git a/src/Views/Clone.axaml.cs b/src/Views/Clone.axaml.cs index 1c299211..9316721a 100644 --- a/src/Views/Clone.axaml.cs +++ b/src/Views/Clone.axaml.cs @@ -23,7 +23,11 @@ namespace SourceGit.Views { var selected = await toplevel.StorageProvider.OpenFolderPickerAsync(options); if (selected.Count == 1) - TxtParentFolder.Text = selected[0].Path.LocalPath; + { + var folder = selected[0]; + var folderPath = folder is { Path: { IsAbsoluteUri: true } path } ? path.LocalPath : folder?.Path.ToString(); + TxtParentFolder.Text = folderPath; + } } catch (Exception exception) { diff --git a/src/Views/ConfigureWorkspace.axaml.cs b/src/Views/ConfigureWorkspace.axaml.cs index 43b28e2f..06294caf 100644 --- a/src/Views/ConfigureWorkspace.axaml.cs +++ b/src/Views/ConfigureWorkspace.axaml.cs @@ -32,7 +32,9 @@ namespace SourceGit.Views var selected = await StorageProvider.OpenFolderPickerAsync(options); if (selected.Count == 1) { - workspace.Selected.DefaultCloneDir = selected[0].Path.LocalPath; + var folder = selected[0]; + var folderPath = folder is { Path: { IsAbsoluteUri: true } path } ? path.LocalPath : folder?.Path.ToString(); + workspace.Selected.DefaultCloneDir = folderPath; } } catch (Exception ex) diff --git a/src/Views/Preferences.axaml.cs b/src/Views/Preferences.axaml.cs index a5bb4ffe..5c8fb7aa 100644 --- a/src/Views/Preferences.axaml.cs +++ b/src/Views/Preferences.axaml.cs @@ -250,7 +250,9 @@ namespace SourceGit.Views var selected = await StorageProvider.OpenFolderPickerAsync(options); if (selected.Count == 1) { - ViewModels.Preferences.Instance.GitDefaultCloneDir = selected[0].Path.LocalPath; + var folder = selected[0]; + var folderPath = folder is { Path: { IsAbsoluteUri: true } path } ? path.LocalPath : folder?.Path.ToString(); + ViewModels.Preferences.Instance.GitDefaultCloneDir = folderPath; } } catch (Exception ex) diff --git a/src/Views/WelcomeToolbar.axaml.cs b/src/Views/WelcomeToolbar.axaml.cs index 9e170c1a..e2a130f8 100644 --- a/src/Views/WelcomeToolbar.axaml.cs +++ b/src/Views/WelcomeToolbar.axaml.cs @@ -35,7 +35,11 @@ namespace SourceGit.Views { var selected = await topLevel.StorageProvider.OpenFolderPickerAsync(options); if (selected.Count == 1) - ViewModels.Welcome.Instance.OpenOrInitRepository(selected[0].Path.LocalPath, null, false); + { + var folder = selected[0]; + var folderPath = folder is { Path: { IsAbsoluteUri: true } path } ? path.LocalPath : folder?.Path.ToString(); + ViewModels.Welcome.Instance.OpenOrInitRepository(folderPath, null, false); + } } catch (Exception exception) {