optimize<*>: App.RaiseException should be called in UIThread; add default progress description for popups;

This commit is contained in:
leo 2024-02-26 11:29:57 +08:00
parent dc0b33ba21
commit 9c3294c285
35 changed files with 100 additions and 34 deletions

View file

@ -1,4 +1,5 @@
using System.Collections.Generic;
using Avalonia.Threading;
using System.Collections.Generic;
namespace SourceGit.Commands {
public class GitFlow : Command {
@ -42,7 +43,9 @@ namespace SourceGit.Commands {
Args = $"flow hotfix start {name}";
break;
default:
Dispatcher.UIThread.Invoke(() => {
App.RaiseException(Context, "Bad branch type!!!");
});
return false;
}
@ -62,7 +65,9 @@ namespace SourceGit.Commands {
Args = $"flow hotfix finish {option} {name} -m \"HOTFIX_DONE\"";
break;
default:
Dispatcher.UIThread.Invoke(() => {
App.RaiseException(Context, "Bad branch type!!!");
});
return false;
}

View file

@ -1,15 +1,20 @@
using System.IO;
using Avalonia.Threading;
using System.IO;
namespace SourceGit.Commands {
public static class MergeTool {
public static bool OpenForMerge(string repo, string tool, string mergeCmd, string file) {
if (string.IsNullOrWhiteSpace(tool) || string.IsNullOrWhiteSpace(mergeCmd)) {
Dispatcher.UIThread.Invoke(() => {
App.RaiseException(repo, "Invalid external merge tool settings!");
});
return false;
}
if (!File.Exists(tool)) {
Dispatcher.UIThread.Invoke(() => {
App.RaiseException(repo, $"Can NOT found external merge tool in '{tool}'!");
});
return false;
}
@ -22,12 +27,16 @@ namespace SourceGit.Commands {
public static bool OpenForDiff(string repo, string tool, string diffCmd, Models.DiffOption option) {
if (string.IsNullOrWhiteSpace(tool) || string.IsNullOrWhiteSpace(diffCmd)) {
Dispatcher.UIThread.Invoke(() => {
App.RaiseException(repo, "Invalid external merge tool settings!");
});
return false;
}
if (!File.Exists(tool)) {
Dispatcher.UIThread.Invoke(() => {
App.RaiseException(repo, $"Can NOT found external merge tool in '{tool}'!");
});
return false;
}

View file

@ -1,4 +1,5 @@
using System;
using Avalonia.Threading;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
@ -35,7 +36,9 @@ namespace SourceGit.Commands {
return rs;
} catch (Exception e) {
Dispatcher.UIThread.Invoke(() => {
App.RaiseException(repo, "Save change to patch failed: " + e.Message);
});
return false;
}
}

View file

@ -1,4 +1,5 @@
using System;
using Avalonia.Threading;
using System;
using System.Diagnostics;
using System.IO;
@ -51,7 +52,9 @@ namespace SourceGit.Commands {
return rs;
} catch (Exception e) {
Dispatcher.UIThread.Invoke(() => {
App.RaiseException(repo, "Save file failed: " + e.Message);
});
return false;
}
}

View file

@ -57,8 +57,9 @@ namespace SourceGit.ViewModels {
public override Task<bool> Sure() {
_repo.SetWatcherEnabled(false);
ProgressDescription = "Adding remote ...";
return Task.Run(() => {
SetProgressDescription("Adding remote ...");
var succ = new Commands.Remote(_repo.FullPath).Add(_name, _url);
if (succ) {
SetProgressDescription("Fetching from added remote ...");

View file

@ -47,6 +47,8 @@ namespace SourceGit.ViewModels {
public override Task<bool> Sure() {
_repo.SetWatcherEnabled(false);
ProgressDescription = "Adding submodule...";
return Task.Run(() => {
var succ = new Commands.Submodule(_repo.FullPath).Add(_url, _relativePath, Recursive, SetProgressDescription);
CallUIThread(() => _repo.SetWatcherEnabled(true));

View file

@ -51,6 +51,8 @@ namespace SourceGit.ViewModels {
public override Task<bool> Sure() {
_repo.SetWatcherEnabled(false);
ProgressDescription = "Apply patch...";
return Task.Run(() => {
var succ = new Commands.Apply(_repo.FullPath, _patchFile, _ignoreWhiteSpace, SelectedWhiteSpaceMode.Arg).Exec();
CallUIThread(() => _repo.SetWatcherEnabled(true));

View file

@ -42,9 +42,15 @@ namespace SourceGit.ViewModels {
public override Task<bool> Sure() {
_repo.SetWatcherEnabled(false);
ProgressDescription = "Archiving ...";
return Task.Run(() => {
var succ = new Commands.Archive(_repo.FullPath, _revision, _saveFile, SetProgressDescription).Exec();
CallUIThread(() => _repo.SetWatcherEnabled(true));
CallUIThread(() => {
_repo.SetWatcherEnabled(true);
if (succ) App.SendNotification(_repo.FullPath, $"Save archive to : {_saveFile}");
});
return succ;
});
}

View file

@ -15,8 +15,9 @@ namespace SourceGit.ViewModels {
public override Task<bool> Sure() {
_repo.SetWatcherEnabled(false);
ProgressDescription = $"Checkout '{Branch}' ...";
return Task.Run(() => {
SetProgressDescription($"Checkout '{Branch}' ...");
var succ = new Commands.Checkout(_repo.FullPath).Branch(Branch, SetProgressDescription);
CallUIThread(() => _repo.SetWatcherEnabled(true));
return succ;

View file

@ -21,8 +21,9 @@ namespace SourceGit.ViewModels {
public override Task<bool> Sure() {
_repo.SetWatcherEnabled(false);
ProgressDescription = $"Cherry-Pick commit '{Target.SHA}' ...";
return Task.Run(() => {
SetProgressDescription($"Cherry-Pick commit '{Target.SHA}' ...");
var succ = new Commands.CherryPick(_repo.FullPath, Target.SHA, !AutoCommit).Exec();
CallUIThread(() => _repo.SetWatcherEnabled(true));
return succ;

View file

@ -10,8 +10,8 @@ namespace SourceGit.ViewModels {
public override Task<bool> Sure() {
_repo.SetWatcherEnabled(false);
ProgressDescription = "Cleanup (GC & prune) ...";
return Task.Run(() => {
SetProgressDescription("Run GC ...");
new Commands.GC(_repo.FullPath, SetProgressDescription).Exec();
var lfs = new Commands.LFS(_repo.FullPath);

View file

@ -9,6 +9,8 @@ namespace SourceGit.ViewModels {
public override Task<bool> Sure() {
_repo.SetWatcherEnabled(false);
ProgressDescription = "Clear all stashes...";
return Task.Run(() => {
new Commands.Stash(_repo.FullPath).Clear();
CallUIThread(() => _repo.SetWatcherEnabled(true));

View file

@ -59,6 +59,8 @@ namespace SourceGit.ViewModels {
}
public override Task<bool> Sure() {
ProgressDescription = "Clone ...";
return Task.Run(() => {
var cmd = new Commands.Clone(HostPageId, _parentFolder, _remote, _local, _useSSH ? _sshKey : "", _extraArgs, SetProgressDescription);
if (!cmd.Exec()) return false;

View file

@ -50,6 +50,8 @@ namespace SourceGit.ViewModels {
public override Task<bool> Sure() {
_repo.SetWatcherEnabled(false);
ProgressDescription = "Create tag...";
return Task.Run(() => {
Commands.Tag.Add(_repo.FullPath, TagName, _basedOn, Message);
CallUIThread(() => _repo.SetWatcherEnabled(true));

View file

@ -15,6 +15,8 @@ namespace SourceGit.ViewModels {
public override Task<bool> Sure() {
_repo.SetWatcherEnabled(false);
ProgressDescription = "Deleting branch...";
return Task.Run(() => {
if (Target.IsLocal) {
Commands.Branch.Delete(_repo.FullPath, Target.Name);

View file

@ -15,8 +15,9 @@ namespace SourceGit.ViewModels {
public override Task<bool> Sure() {
_repo.SetWatcherEnabled(false);
ProgressDescription = "Deleting remote ...";
return Task.Run(() => {
SetProgressDescription("Deleting remote ...");
var succ = new Commands.Remote(_repo.FullPath).Delete(Remote.Name);
CallUIThread(() => _repo.SetWatcherEnabled(true));
return succ;

View file

@ -16,6 +16,8 @@ namespace SourceGit.ViewModels {
public override Task<bool> Sure() {
_repo.SetWatcherEnabled(false);
ProgressDescription = "Deleting submodule ...";
return Task.Run(() => {
var succ = new Commands.Submodule(_repo.FullPath).Delete(Submodule);
CallUIThread(() => _repo.SetWatcherEnabled(true));

View file

@ -21,8 +21,9 @@ namespace SourceGit.ViewModels {
public override Task<bool> Sure() {
_repo.SetWatcherEnabled(false);
ProgressDescription = $"Deleting tag '{Target.Name}' ...";
return Task.Run(() => {
SetProgressDescription($"Deleting tag '{Target.Name}' ...");
var remotes = ShouldPushToRemote ? _repo.Remotes : null;
var succ = Commands.Tag.Delete(_repo.FullPath, Target.Name, remotes);
CallUIThread(() => _repo.SetWatcherEnabled(true));

View file

@ -30,12 +30,12 @@ namespace SourceGit.ViewModels {
public override Task<bool> Sure() {
_repo.SetWatcherEnabled(false);
ProgressDescription = _changes == null ? "Discard all local changes ..." : $"Discard total {_changes.Count} changes ...";
return Task.Run(() => {
if (_changes == null) {
SetProgressDescription("Discard all local changes ...");
Commands.Discard.All(_repo.FullPath);
} else {
SetProgressDescription($"Discard total {_changes.Count} changes ...");
Commands.Discard.Changes(_repo.FullPath, _changes);
}

View file

@ -11,6 +11,8 @@ namespace SourceGit.ViewModels {
}
public override Task<bool> Sure() {
ProgressDescription = $"Dropping stash: {Stash.Name}";
return Task.Run(() => {
new Commands.Stash(_repo).Drop(Stash.Name);
return true;

View file

@ -68,9 +68,9 @@ namespace SourceGit.ViewModels {
public override Task<bool> Sure() {
_repo.SetWatcherEnabled(false);
return Task.Run(() => {
SetProgressDescription($"Editing remote '{_remote.Name}' ...");
ProgressDescription = $"Editing remote '{_remote.Name}' ...";
return Task.Run(() => {
if (_remote.Name != _name) {
var succ = new Commands.Remote(_repo.FullPath).Rename(_remote.Name, _name);
if (succ) _remote.Name = _name;

View file

@ -21,8 +21,9 @@ namespace SourceGit.ViewModels {
public override Task<bool> Sure() {
_repo.SetWatcherEnabled(false);
ProgressDescription = "Fast-Forward ...";
return Task.Run(() => {
SetProgressDescription("Fast-Forward ...");
new Commands.Fetch(_repo.FullPath, To.Remote, Local.Name, To.Name, SetProgressDescription).Exec();
CallUIThread(() => _repo.SetWatcherEnabled(true));
return true;

View file

@ -14,8 +14,9 @@ namespace SourceGit.ViewModels {
}
public override Task<bool> Sure() {
ProgressDescription = $"Initialize git repository at: '{_targetPath}'";
return Task.Run(() => {
SetProgressDescription($"Initialize git repository at: '{_targetPath}'");
var succ = new Commands.Init(HostPageId, _targetPath).Exec();
if (!succ) return false;

View file

@ -72,6 +72,8 @@ namespace SourceGit.ViewModels {
public override Task<bool> Sure() {
_repo.SetWatcherEnabled(false);
ProgressDescription = "Init git-flow ...";
return Task.Run(() => {
var succ = new Commands.GitFlow(_repo.FullPath).Init(_repo.Branches, _master, _develop, _featurePrefix, _releasePrefix, _hotfixPrefix, _tagPrefix);
if (succ) {

View file

@ -51,8 +51,9 @@ namespace SourceGit.ViewModels {
public override Task<bool> Sure() {
_repo.SetWatcherEnabled(false);
ProgressDescription = $"Merging '{Source}' into '{Into}' ...";
return Task.Run(() => {
SetProgressDescription($"Merging '{Source}' into '{Into}' ...");
var succ = new Commands.Merge(_repo.FullPath, Source, SelectedMode.Arg, SetProgressDescription).Exec();
CallUIThread(() => _repo.SetWatcherEnabled(true));
return succ;

View file

@ -15,8 +15,9 @@ namespace SourceGit.ViewModels {
public override Task<bool> Sure() {
_repo.SetWatcherEnabled(false);
ProgressDescription = "Run `prune` on remote ...";
return Task.Run(() => {
SetProgressDescription("Run `prune` on remote ...");
var succ = new Commands.Remote(_repo.FullPath).Prune(Remote.Name);
CallUIThread(() => _repo.SetWatcherEnabled(true));
return succ;

View file

@ -111,9 +111,11 @@ namespace SourceGit.ViewModels {
public override Task<bool> Sure() {
_repo.SetWatcherEnabled(false);
return Task.Run(() => {
var remoteBranchName = _selectedRemoteBranch.Name.Replace(" (new)", "");
SetProgressDescription($"Push {_selectedLocalBranch.Name} -> {_selectedRemote.Name}/{remoteBranchName} ...");
ProgressDescription = $"Push {_selectedLocalBranch.Name} -> {_selectedRemote.Name}/{remoteBranchName} ...";
return Task.Run(() => {
var succ = new Commands.Push(
_repo.FullPath,
_selectedLocalBranch.Name,

View file

@ -26,8 +26,9 @@ namespace SourceGit.ViewModels {
public override Task<bool> Sure() {
_repo.SetWatcherEnabled(false);
ProgressDescription = $"Pushing tag '{Target.Name}' to remote '{SelectedRemote.Name}' ...";
return Task.Run(() => {
SetProgressDescription($"Pushing tag '{Target.Name}' to remote '{SelectedRemote.Name}' ...");
var succ = new Commands.Push(_repo.FullPath, SelectedRemote.Name, Target.Name, false).Exec();
CallUIThread(() => _repo.SetWatcherEnabled(true));
return succ;

View file

@ -37,6 +37,8 @@ namespace SourceGit.ViewModels {
public override Task<bool> Sure() {
_repo.SetWatcherEnabled(false);
ProgressDescription = "Rebasing ...";
return Task.Run(() => {
var succ = new Commands.Rebase(_repo.FullPath, _revision, AutoStash).Exec();
CallUIThread(() => _repo.SetWatcherEnabled(true));

View file

@ -39,8 +39,9 @@ namespace SourceGit.ViewModels {
if (_name == Target.Name) return null;
_repo.SetWatcherEnabled(false);
ProgressDescription = $"Rename '{Target.Name}'";
return Task.Run(() => {
SetProgressDescription($"Rename '{Target.Name}'");
var succ = Commands.Branch.Rename(_repo.FullPath, Target.Name, _name);
CallUIThread(() => _repo.SetWatcherEnabled(true));
return succ;

View file

@ -53,8 +53,9 @@ namespace SourceGit.ViewModels {
public override Task<bool> Sure() {
_repo.SetWatcherEnabled(false);
ProgressDescription = $"Reset current branch to {To.SHA} ...";
return Task.Run(() => {
SetProgressDescription($"Reset current branch to {To.SHA} ...");
var succ = new Commands.Reset(_repo.FullPath, To.SHA, SelectedMode.Arg).Exec();
CallUIThread(() => _repo.SetWatcherEnabled(true));
return succ;

View file

@ -21,8 +21,9 @@ namespace SourceGit.ViewModels {
public override Task<bool> Sure() {
_repo.SetWatcherEnabled(false);
ProgressDescription = $"Revert commit '{Target.SHA}' ...";
return Task.Run(() => {
SetProgressDescription($"Revert commit '{Target.SHA}' ...");
var succ = new Commands.Revert(_repo.FullPath, Target.SHA, AutoCommit).Exec();
CallUIThread(() => _repo.SetWatcherEnabled(true));
return succ;

View file

@ -25,8 +25,9 @@ namespace SourceGit.ViewModels {
if (_message == Head.FullMessage) return null;
_repo.SetWatcherEnabled(false);
ProgressDescription = $"Editing head commit message ...";
return Task.Run(() => {
SetProgressDescription($"Editing head commit message ...");
var succ = new Commands.Commit(_repo.FullPath, _message, true, true).Exec();
CallUIThread(() => _repo.SetWatcherEnabled(true));
return succ;

View file

@ -29,6 +29,8 @@ namespace SourceGit.ViewModels {
public override Task<bool> Sure() {
_repo.SetWatcherEnabled(false);
ProgressDescription = "Squashing ...";
return Task.Run(() => {
var succ = new Commands.Reset(_repo.FullPath, Parent.SHA, "--soft").Exec();
if (succ) succ = new Commands.Commit(_repo.FullPath, _message, true).Exec();

View file

@ -42,6 +42,8 @@ namespace SourceGit.ViewModels {
if (jobs.Count == 0) return null;
_repo.SetWatcherEnabled(false);
ProgressDescription = $"Stash changes ...";
return Task.Run(() => {
new Commands.Stash(_repo.FullPath).Push(jobs, Message);
CallUIThread(() => _repo.SetWatcherEnabled(true));