mirror of
https://fastgit.cc/github.com/sourcegit-scm/sourcegit
synced 2026-05-01 06:15:41 +08:00
feature: async (#1492)
* Async command methods * Async `Task.Run` where possible * Remove redundant `Task.Run` in `Sure` methods * Remove leftover braces and reformat * Async event handlers as needed
This commit is contained in:
@@ -58,14 +58,14 @@ namespace SourceGit.ViewModels
|
||||
IsGenerating = true;
|
||||
|
||||
_cancel = new CancellationTokenSource();
|
||||
Task.Run(() =>
|
||||
Task.Run(async () =>
|
||||
{
|
||||
new Commands.GenerateCommitMessage(_service, _repo.FullPath, _changes, _cancel.Token, message =>
|
||||
await new Commands.GenerateCommitMessage(_service, _repo.FullPath, _changes, _cancel.Token, message =>
|
||||
{
|
||||
Dispatcher.UIThread.Invoke(() => Text = message);
|
||||
}).Exec();
|
||||
}).ExecAsync();
|
||||
|
||||
Dispatcher.UIThread.Invoke(() => IsGenerating = false);
|
||||
await Dispatcher.UIThread.InvokeAsync(() => IsGenerating = false);
|
||||
}, _cancel.Token);
|
||||
}
|
||||
|
||||
|
||||
@@ -87,7 +87,7 @@ namespace SourceGit.ViewModels
|
||||
return ValidationResult.Success;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = "Adding remote ...";
|
||||
@@ -95,24 +95,21 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog("Add Remote");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
var succ = await new Commands.Remote(_repo.FullPath).Use(log).AddAsync(_name, _url);
|
||||
if (succ)
|
||||
{
|
||||
var succ = new Commands.Remote(_repo.FullPath).Use(log).Add(_name, _url);
|
||||
if (succ)
|
||||
{
|
||||
new Commands.Config(_repo.FullPath).Use(log).Set($"remote.{_name}.sshkey", _useSSH ? SSHKey : null);
|
||||
new Commands.Fetch(_repo.FullPath, _name, false, false).Use(log).Exec();
|
||||
}
|
||||
await new Commands.Config(_repo.FullPath).Use(log).SetAsync($"remote.{_name}.sshkey", _useSSH ? SSHKey : null);
|
||||
await new Commands.Fetch(_repo.FullPath, _name, false, false).Use(log).ExecAsync();
|
||||
}
|
||||
|
||||
log.Complete();
|
||||
CallUIThread(() =>
|
||||
{
|
||||
_repo.MarkFetched();
|
||||
_repo.MarkBranchesDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
});
|
||||
return succ;
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() =>
|
||||
{
|
||||
_repo.MarkFetched();
|
||||
_repo.MarkBranchesDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
});
|
||||
return succ;
|
||||
}
|
||||
|
||||
private readonly Repository _repo = null;
|
||||
|
||||
@@ -40,7 +40,7 @@ namespace SourceGit.ViewModels
|
||||
return ValidationResult.Success;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = "Adding submodule...";
|
||||
@@ -59,14 +59,11 @@ namespace SourceGit.ViewModels
|
||||
relativePath = Path.GetFileName(_url);
|
||||
}
|
||||
|
||||
return Task.Run(() =>
|
||||
{
|
||||
var succ = new Commands.Submodule(_repo.FullPath).Use(log).Add(_url, relativePath, Recursive);
|
||||
log.Complete();
|
||||
var succ = await new Commands.Submodule(_repo.FullPath).Use(log).AddAsync(_url, relativePath, Recursive);
|
||||
log.Complete();
|
||||
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
});
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
}
|
||||
|
||||
private readonly Repository _repo = null;
|
||||
|
||||
@@ -27,35 +27,32 @@ namespace SourceGit.ViewModels
|
||||
StorageFile = Models.GitIgnoreFile.Supported[0];
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = "Adding Ignored File(s) ...";
|
||||
|
||||
return Task.Run(() =>
|
||||
var file = StorageFile.GetFullPath(_repo.FullPath, _repo.GitDir);
|
||||
if (!File.Exists(file))
|
||||
{
|
||||
var file = StorageFile.GetFullPath(_repo.FullPath, _repo.GitDir);
|
||||
if (!File.Exists(file))
|
||||
{
|
||||
File.WriteAllLines(file, [_pattern]);
|
||||
}
|
||||
await File.WriteAllLinesAsync(file, [_pattern]);
|
||||
}
|
||||
else
|
||||
{
|
||||
var org = await File.ReadAllTextAsync(file);
|
||||
if (!org.EndsWith('\n'))
|
||||
await File.AppendAllLinesAsync(file, ["", _pattern]);
|
||||
else
|
||||
{
|
||||
var org = File.ReadAllText(file);
|
||||
if (!org.EndsWith('\n'))
|
||||
File.AppendAllLines(file, ["", _pattern]);
|
||||
else
|
||||
File.AppendAllLines(file, [_pattern]);
|
||||
}
|
||||
await File.AppendAllLinesAsync(file, [_pattern]);
|
||||
}
|
||||
|
||||
CallUIThread(() =>
|
||||
{
|
||||
_repo.MarkWorkingCopyDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
});
|
||||
|
||||
return true;
|
||||
await CallUIThreadAsync(() =>
|
||||
{
|
||||
_repo.MarkWorkingCopyDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
});
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private readonly Repository _repo;
|
||||
|
||||
@@ -105,7 +105,7 @@ namespace SourceGit.ViewModels
|
||||
return ValidationResult.Success;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = "Adding worktree ...";
|
||||
@@ -116,14 +116,11 @@ namespace SourceGit.ViewModels
|
||||
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
{
|
||||
var succ = new Commands.Worktree(_repo.FullPath).Use(log).Add(_path, branchName, _createNewBranch, tracking);
|
||||
log.Complete();
|
||||
var succ = await new Commands.Worktree(_repo.FullPath).Use(log).AddAsync(_path, branchName, _createNewBranch, tracking);
|
||||
log.Complete();
|
||||
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
});
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
}
|
||||
|
||||
private Repository _repo = null;
|
||||
|
||||
@@ -41,20 +41,17 @@ namespace SourceGit.ViewModels
|
||||
return new ValidationResult($"File '{file}' can NOT be found!!!");
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = "Apply patch...";
|
||||
|
||||
var log = _repo.CreateLog("Apply Patch");
|
||||
return Task.Run(() =>
|
||||
{
|
||||
var succ = new Commands.Apply(_repo.FullPath, _patchFile, _ignoreWhiteSpace, SelectedWhiteSpaceMode.Arg, null).Use(log).Exec();
|
||||
log.Complete();
|
||||
var succ = await new Commands.Apply(_repo.FullPath, _patchFile, _ignoreWhiteSpace, SelectedWhiteSpaceMode.Arg, null).Use(log).ExecAsync();
|
||||
log.Complete();
|
||||
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
});
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
}
|
||||
|
||||
private readonly Repository _repo = null;
|
||||
|
||||
@@ -28,20 +28,17 @@ namespace SourceGit.ViewModels
|
||||
Stash = stash;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
ProgressDescription = $"Applying stash: {Stash.Name}";
|
||||
|
||||
var log = _repo.CreateLog("Apply Stash");
|
||||
return Task.Run(() =>
|
||||
{
|
||||
var succ = new Commands.Stash(_repo.FullPath).Use(log).Apply(Stash.Name, RestoreIndex);
|
||||
if (succ && DropAfterApply)
|
||||
new Commands.Stash(_repo.FullPath).Use(log).Drop(Stash.Name);
|
||||
var succ = await new Commands.Stash(_repo.FullPath).Use(log).ApplyAsync(Stash.Name, RestoreIndex);
|
||||
if (succ && DropAfterApply)
|
||||
await new Commands.Stash(_repo.FullPath).Use(log).DropAsync(Stash.Name);
|
||||
|
||||
log.Complete();
|
||||
return true;
|
||||
});
|
||||
log.Complete();
|
||||
return true;
|
||||
}
|
||||
|
||||
private readonly Repository _repo;
|
||||
|
||||
@@ -44,7 +44,7 @@ namespace SourceGit.ViewModels
|
||||
BasedOn = tag;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = "Archiving ...";
|
||||
@@ -52,20 +52,17 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog("Archive");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
var succ = await new Commands.Archive(_repo.FullPath, _revision, _saveFile).Use(log).ExecAsync();
|
||||
log.Complete();
|
||||
|
||||
await CallUIThreadAsync(() =>
|
||||
{
|
||||
var succ = new Commands.Archive(_repo.FullPath, _revision, _saveFile).Use(log).Exec();
|
||||
log.Complete();
|
||||
|
||||
CallUIThread(() =>
|
||||
{
|
||||
_repo.SetWatcherEnabled(true);
|
||||
if (succ)
|
||||
App.SendNotification(_repo.FullPath, $"Save archive to : {_saveFile}");
|
||||
});
|
||||
|
||||
return succ;
|
||||
_repo.SetWatcherEnabled(true);
|
||||
if (succ)
|
||||
App.SendNotification(_repo.FullPath, $"Save archive to : {_saveFile}");
|
||||
});
|
||||
|
||||
return succ;
|
||||
}
|
||||
|
||||
private readonly Repository _repo = null;
|
||||
|
||||
@@ -14,19 +14,19 @@ namespace SourceGit.ViewModels
|
||||
_repo = repo;
|
||||
Files = new AvaloniaList<string>();
|
||||
|
||||
Task.Run(() =>
|
||||
Task.Run(async () =>
|
||||
{
|
||||
var collect = new Commands.QueryAssumeUnchangedFiles(_repo.FullPath).Result();
|
||||
Dispatcher.UIThread.Invoke(() => Files.AddRange(collect));
|
||||
var collect = await new Commands.QueryAssumeUnchangedFiles(_repo.FullPath).ResultAsync();
|
||||
await Dispatcher.UIThread.InvokeAsync(() => Files.AddRange(collect));
|
||||
});
|
||||
}
|
||||
|
||||
public void Remove(string file)
|
||||
public async Task RemoveAsync(string file)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(file))
|
||||
{
|
||||
var log = _repo.CreateLog("Remove Assume Unchanged File");
|
||||
new Commands.AssumeUnchanged(_repo.FullPath, file, false).Use(log).Exec();
|
||||
await new Commands.AssumeUnchanged(_repo.FullPath, file, false).Use(log).ExecAsync();
|
||||
log.Complete();
|
||||
Files.Remove(file);
|
||||
}
|
||||
|
||||
@@ -132,11 +132,11 @@ namespace SourceGit.ViewModels
|
||||
}
|
||||
else
|
||||
{
|
||||
Task.Run(() =>
|
||||
Task.Run(async () =>
|
||||
{
|
||||
var result = new Commands.QuerySingleCommit(_repo, commitSHA).Result();
|
||||
var result = await new Commands.QuerySingleCommit(_repo, commitSHA).ResultAsync();
|
||||
|
||||
Dispatcher.UIThread.Invoke(() =>
|
||||
await Dispatcher.UIThread.InvokeAsync(() =>
|
||||
{
|
||||
if (!token.IsCancellationRequested)
|
||||
{
|
||||
@@ -147,11 +147,11 @@ namespace SourceGit.ViewModels
|
||||
}, token);
|
||||
}
|
||||
|
||||
Task.Run(() =>
|
||||
Task.Run(async () =>
|
||||
{
|
||||
var result = new Commands.Blame(_repo, FilePath, commitSHA).Result();
|
||||
var result = await new Commands.Blame(_repo, FilePath, commitSHA).ResultAsync();
|
||||
|
||||
Dispatcher.UIThread.Invoke(() =>
|
||||
await Dispatcher.UIThread.InvokeAsync(() =>
|
||||
{
|
||||
if (!token.IsCancellationRequested)
|
||||
Data = result;
|
||||
|
||||
@@ -133,7 +133,7 @@ namespace SourceGit.ViewModels
|
||||
var toolPath = Preferences.Instance.ExternalMergeToolPath;
|
||||
var opt = new Models.DiffOption(_based.Head, _to.Head, change);
|
||||
|
||||
Task.Run(() => Commands.MergeTool.OpenForDiff(_repo, toolType, toolPath, opt));
|
||||
Task.Run(() => Commands.MergeTool.OpenForDiffAsync(_repo, toolType, toolPath, opt));
|
||||
ev.Handled = true;
|
||||
};
|
||||
menu.Items.Add(diffWithMerger);
|
||||
@@ -178,20 +178,20 @@ namespace SourceGit.ViewModels
|
||||
|
||||
private void Refresh()
|
||||
{
|
||||
Task.Run(() =>
|
||||
Task.Run(async () =>
|
||||
{
|
||||
if (_baseHead == null)
|
||||
{
|
||||
var baseHead = new Commands.QuerySingleCommit(_repo, _based.Head).Result();
|
||||
var toHead = new Commands.QuerySingleCommit(_repo, _to.Head).Result();
|
||||
Dispatcher.UIThread.Invoke(() =>
|
||||
var baseHead = await new Commands.QuerySingleCommit(_repo, _based.Head).ResultAsync();
|
||||
var toHead = await new Commands.QuerySingleCommit(_repo, _to.Head).ResultAsync();
|
||||
await Dispatcher.UIThread.InvokeAsync(() =>
|
||||
{
|
||||
BaseHead = baseHead;
|
||||
ToHead = toHead;
|
||||
});
|
||||
}
|
||||
|
||||
_changes = new Commands.CompareRevisions(_repo, _based.Head, _to.Head).Result();
|
||||
_changes = await new Commands.CompareRevisions(_repo, _based.Head, _to.Head).ResultAsync();
|
||||
|
||||
var visible = _changes;
|
||||
if (!string.IsNullOrWhiteSpace(_searchFilter))
|
||||
@@ -204,7 +204,7 @@ namespace SourceGit.ViewModels
|
||||
}
|
||||
}
|
||||
|
||||
Dispatcher.UIThread.Invoke(() => VisibleChanges = visible);
|
||||
await Dispatcher.UIThread.InvokeAsync(() => VisibleChanges = visible);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ namespace SourceGit.ViewModels
|
||||
DiscardLocalChanges = false;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = $"Checkout '{Branch}' ...";
|
||||
@@ -42,70 +42,67 @@ namespace SourceGit.ViewModels
|
||||
Use(log);
|
||||
|
||||
var updateSubmodules = IsRecurseSubmoduleVisible && RecurseSubmodules;
|
||||
return Task.Run(() =>
|
||||
bool succ;
|
||||
var needPopStash = false;
|
||||
|
||||
if (!_repo.ConfirmCheckoutBranch())
|
||||
{
|
||||
bool succ;
|
||||
var needPopStash = false;
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!_repo.ConfirmCheckoutBranch())
|
||||
if (DiscardLocalChanges)
|
||||
{
|
||||
succ = await new Commands.Checkout(_repo.FullPath).Use(log).BranchAsync(Branch, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
var changes = await new Commands.CountLocalChangesWithoutUntracked(_repo.FullPath).ResultAsync();
|
||||
if (changes > 0)
|
||||
{
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (DiscardLocalChanges)
|
||||
{
|
||||
succ = new Commands.Checkout(_repo.FullPath).Use(log).Branch(Branch, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
var changes = new Commands.CountLocalChangesWithoutUntracked(_repo.FullPath).Result();
|
||||
if (changes > 0)
|
||||
succ = await new Commands.Stash(_repo.FullPath).Use(log).PushAsync("CHECKOUT_AUTO_STASH");
|
||||
if (!succ)
|
||||
{
|
||||
succ = new Commands.Stash(_repo.FullPath).Use(log).Push("CHECKOUT_AUTO_STASH");
|
||||
if (!succ)
|
||||
{
|
||||
log.Complete();
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return false;
|
||||
}
|
||||
|
||||
needPopStash = true;
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return false;
|
||||
}
|
||||
|
||||
succ = new Commands.Checkout(_repo.FullPath).Use(log).Branch(Branch, false);
|
||||
needPopStash = true;
|
||||
}
|
||||
|
||||
if (succ)
|
||||
{
|
||||
if (updateSubmodules)
|
||||
{
|
||||
var submodules = new Commands.QueryUpdatableSubmodules(_repo.FullPath).Result();
|
||||
if (submodules.Count > 0)
|
||||
new Commands.Submodule(_repo.FullPath).Use(log).Update(submodules, true, true);
|
||||
}
|
||||
succ = await new Commands.Checkout(_repo.FullPath).Use(log).BranchAsync(Branch, false);
|
||||
}
|
||||
|
||||
if (needPopStash)
|
||||
new Commands.Stash(_repo.FullPath).Use(log).Pop("stash@{0}");
|
||||
if (succ)
|
||||
{
|
||||
if (updateSubmodules)
|
||||
{
|
||||
var submodules = await new Commands.QueryUpdatableSubmodules(_repo.FullPath).ResultAsync();
|
||||
if (submodules.Count > 0)
|
||||
await new Commands.Submodule(_repo.FullPath).Use(log).UpdateAsync(submodules, true, true);
|
||||
}
|
||||
|
||||
log.Complete();
|
||||
if (needPopStash)
|
||||
await new Commands.Stash(_repo.FullPath).Use(log).PopAsync("stash@{0}");
|
||||
}
|
||||
|
||||
CallUIThread(() =>
|
||||
{
|
||||
ProgressDescription = "Waiting for branch updated...";
|
||||
log.Complete();
|
||||
|
||||
var b = _repo.Branches.Find(x => x.IsLocal && x.Name == Branch);
|
||||
if (b != null && _repo.HistoriesFilterMode == Models.FilterMode.Included)
|
||||
_repo.SetBranchFilterMode(b, Models.FilterMode.Included, true, false);
|
||||
await CallUIThreadAsync(() =>
|
||||
{
|
||||
ProgressDescription = "Waiting for branch updated...";
|
||||
|
||||
_repo.MarkBranchesDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
});
|
||||
var b = _repo.Branches.Find(x => x.IsLocal && x.Name == Branch);
|
||||
if (b != null && _repo.HistoriesFilterMode == Models.FilterMode.Included)
|
||||
_repo.SetBranchFilterMode(b, Models.FilterMode.Included, true, false);
|
||||
|
||||
Task.Delay(400).Wait();
|
||||
return succ;
|
||||
_repo.MarkBranchesDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
});
|
||||
|
||||
Task.Delay(400).Wait();
|
||||
return succ;
|
||||
}
|
||||
|
||||
private readonly Repository _repo = null;
|
||||
|
||||
@@ -38,7 +38,7 @@ namespace SourceGit.ViewModels
|
||||
RemoteBranch = remoteBranch;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = $"Checkout and Fast-Forward '{LocalBranch.Name}' ...";
|
||||
@@ -47,69 +47,66 @@ namespace SourceGit.ViewModels
|
||||
Use(log);
|
||||
|
||||
var updateSubmodules = IsRecurseSubmoduleVisible && RecurseSubmodules;
|
||||
return Task.Run(() =>
|
||||
var succ = false;
|
||||
var needPopStash = false;
|
||||
|
||||
if (!_repo.ConfirmCheckoutBranch())
|
||||
{
|
||||
var succ = false;
|
||||
var needPopStash = false;
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!_repo.ConfirmCheckoutBranch())
|
||||
if (DiscardLocalChanges)
|
||||
{
|
||||
succ = await new Commands.Checkout(_repo.FullPath).Use(log).BranchAsync(LocalBranch.Name, RemoteBranch.Head, true, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
var changes = await new Commands.CountLocalChangesWithoutUntracked(_repo.FullPath).ResultAsync();
|
||||
if (changes > 0)
|
||||
{
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (DiscardLocalChanges)
|
||||
{
|
||||
succ = new Commands.Checkout(_repo.FullPath).Use(log).Branch(LocalBranch.Name, RemoteBranch.Head, true, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
var changes = new Commands.CountLocalChangesWithoutUntracked(_repo.FullPath).Result();
|
||||
if (changes > 0)
|
||||
succ = await new Commands.Stash(_repo.FullPath).Use(log).PushAsync("CHECKOUT_AND_FASTFORWARD_AUTO_STASH");
|
||||
if (!succ)
|
||||
{
|
||||
succ = new Commands.Stash(_repo.FullPath).Use(log).Push("CHECKOUT_AND_FASTFORWARD_AUTO_STASH");
|
||||
if (!succ)
|
||||
{
|
||||
log.Complete();
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return false;
|
||||
}
|
||||
|
||||
needPopStash = true;
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return false;
|
||||
}
|
||||
|
||||
succ = new Commands.Checkout(_repo.FullPath).Use(log).Branch(LocalBranch.Name, RemoteBranch.Head, false, true);
|
||||
needPopStash = true;
|
||||
}
|
||||
|
||||
if (succ)
|
||||
{
|
||||
if (updateSubmodules)
|
||||
{
|
||||
var submodules = new Commands.QueryUpdatableSubmodules(_repo.FullPath).Result();
|
||||
if (submodules.Count > 0)
|
||||
new Commands.Submodule(_repo.FullPath).Use(log).Update(submodules, true, true);
|
||||
}
|
||||
succ = await new Commands.Checkout(_repo.FullPath).Use(log).BranchAsync(LocalBranch.Name, RemoteBranch.Head, false, true);
|
||||
}
|
||||
|
||||
if (needPopStash)
|
||||
new Commands.Stash(_repo.FullPath).Use(log).Pop("stash@{0}");
|
||||
if (succ)
|
||||
{
|
||||
if (updateSubmodules)
|
||||
{
|
||||
var submodules = await new Commands.QueryUpdatableSubmodules(_repo.FullPath).ResultAsync();
|
||||
if (submodules.Count > 0)
|
||||
await new Commands.Submodule(_repo.FullPath).Use(log).UpdateAsync(submodules, true, true);
|
||||
}
|
||||
|
||||
log.Complete();
|
||||
if (needPopStash)
|
||||
await new Commands.Stash(_repo.FullPath).Use(log).PopAsync("stash@{0}");
|
||||
}
|
||||
|
||||
CallUIThread(() =>
|
||||
{
|
||||
ProgressDescription = "Waiting for branch updated...";
|
||||
log.Complete();
|
||||
|
||||
if (_repo.HistoriesFilterMode == Models.FilterMode.Included)
|
||||
_repo.SetBranchFilterMode(LocalBranch, Models.FilterMode.Included, true, false);
|
||||
await CallUIThreadAsync(() =>
|
||||
{
|
||||
ProgressDescription = "Waiting for branch updated...";
|
||||
|
||||
_repo.MarkBranchesDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
});
|
||||
if (_repo.HistoriesFilterMode == Models.FilterMode.Included)
|
||||
_repo.SetBranchFilterMode(LocalBranch, Models.FilterMode.Included, true, false);
|
||||
|
||||
Task.Delay(400).Wait();
|
||||
return succ;
|
||||
_repo.MarkBranchesDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
});
|
||||
|
||||
Task.Delay(400).Wait();
|
||||
return succ;
|
||||
}
|
||||
|
||||
private Repository _repo;
|
||||
|
||||
@@ -33,7 +33,7 @@ namespace SourceGit.ViewModels
|
||||
DiscardLocalChanges = false;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = $"Checkout Commit '{Commit.SHA}' ...";
|
||||
@@ -42,57 +42,54 @@ namespace SourceGit.ViewModels
|
||||
Use(log);
|
||||
|
||||
var updateSubmodules = IsRecurseSubmoduleVisible && RecurseSubmodules;
|
||||
return Task.Run(() =>
|
||||
bool succ;
|
||||
var needPop = false;
|
||||
|
||||
if (!_repo.ConfirmCheckoutBranch())
|
||||
{
|
||||
bool succ;
|
||||
var needPop = false;
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!_repo.ConfirmCheckoutBranch())
|
||||
if (DiscardLocalChanges)
|
||||
{
|
||||
succ = await new Commands.Checkout(_repo.FullPath).Use(log).CommitAsync(Commit.SHA, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
var changes = await new Commands.CountLocalChangesWithoutUntracked(_repo.FullPath).ResultAsync();
|
||||
if (changes > 0)
|
||||
{
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (DiscardLocalChanges)
|
||||
{
|
||||
succ = new Commands.Checkout(_repo.FullPath).Use(log).Commit(Commit.SHA, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
var changes = new Commands.CountLocalChangesWithoutUntracked(_repo.FullPath).Result();
|
||||
if (changes > 0)
|
||||
succ = await new Commands.Stash(_repo.FullPath).Use(log).PushAsync("CHECKOUT_AUTO_STASH");
|
||||
if (!succ)
|
||||
{
|
||||
succ = new Commands.Stash(_repo.FullPath).Use(log).Push("CHECKOUT_AUTO_STASH");
|
||||
if (!succ)
|
||||
{
|
||||
log.Complete();
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return false;
|
||||
}
|
||||
|
||||
needPop = true;
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return false;
|
||||
}
|
||||
|
||||
succ = new Commands.Checkout(_repo.FullPath).Use(log).Commit(Commit.SHA, false);
|
||||
needPop = true;
|
||||
}
|
||||
|
||||
if (succ)
|
||||
succ = await new Commands.Checkout(_repo.FullPath).Use(log).CommitAsync(Commit.SHA, false);
|
||||
}
|
||||
|
||||
if (succ)
|
||||
{
|
||||
if (updateSubmodules)
|
||||
{
|
||||
if (updateSubmodules)
|
||||
{
|
||||
var submodules = new Commands.QueryUpdatableSubmodules(_repo.FullPath).Result();
|
||||
if (submodules.Count > 0)
|
||||
new Commands.Submodule(_repo.FullPath).Use(log).Update(submodules, true, true);
|
||||
}
|
||||
|
||||
if (needPop)
|
||||
new Commands.Stash(_repo.FullPath).Use(log).Pop("stash@{0}");
|
||||
var submodules = await new Commands.QueryUpdatableSubmodules(_repo.FullPath).ResultAsync();
|
||||
if (submodules.Count > 0)
|
||||
await new Commands.Submodule(_repo.FullPath).Use(log).UpdateAsync(submodules, true, true);
|
||||
}
|
||||
|
||||
log.Complete();
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
});
|
||||
if (needPop)
|
||||
await new Commands.Stash(_repo.FullPath).Use(log).PopAsync("stash@{0}");
|
||||
}
|
||||
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
}
|
||||
|
||||
private readonly Repository _repo = null;
|
||||
|
||||
@@ -63,7 +63,7 @@ namespace SourceGit.ViewModels
|
||||
AutoCommit = true;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
_repo.ClearCommitMessage();
|
||||
@@ -72,31 +72,28 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog("Cherry-Pick");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
if (IsMergeCommit)
|
||||
{
|
||||
if (IsMergeCommit)
|
||||
{
|
||||
new Commands.CherryPick(
|
||||
_repo.FullPath,
|
||||
Targets[0].SHA,
|
||||
!AutoCommit,
|
||||
AppendSourceToMessage,
|
||||
$"-m {MainlineForMergeCommit + 1}").Use(log).Exec();
|
||||
}
|
||||
else
|
||||
{
|
||||
new Commands.CherryPick(
|
||||
_repo.FullPath,
|
||||
string.Join(' ', Targets.ConvertAll(c => c.SHA)),
|
||||
!AutoCommit,
|
||||
AppendSourceToMessage,
|
||||
string.Empty).Use(log).Exec();
|
||||
}
|
||||
await new Commands.CherryPick(
|
||||
_repo.FullPath,
|
||||
Targets[0].SHA,
|
||||
!AutoCommit,
|
||||
AppendSourceToMessage,
|
||||
$"-m {MainlineForMergeCommit + 1}").Use(log).ExecAsync();
|
||||
}
|
||||
else
|
||||
{
|
||||
await new Commands.CherryPick(
|
||||
_repo.FullPath,
|
||||
string.Join(' ', Targets.ConvertAll(c => c.SHA)),
|
||||
!AutoCommit,
|
||||
AppendSourceToMessage,
|
||||
string.Empty).Use(log).ExecAsync();
|
||||
}
|
||||
|
||||
log.Complete();
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return true;
|
||||
});
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return true;
|
||||
}
|
||||
|
||||
private readonly Repository _repo = null;
|
||||
|
||||
@@ -9,7 +9,7 @@ namespace SourceGit.ViewModels
|
||||
_repo = repo;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = "Cleanup (GC & prune) ...";
|
||||
@@ -17,13 +17,10 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog("Cleanup (GC & prune)");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
{
|
||||
new Commands.GC(_repo.FullPath).Use(log).Exec();
|
||||
log.Complete();
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return true;
|
||||
});
|
||||
await new Commands.GC(_repo.FullPath).Use(log).ExecAsync();
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return true;
|
||||
}
|
||||
|
||||
private readonly Repository _repo = null;
|
||||
|
||||
@@ -9,7 +9,7 @@ namespace SourceGit.ViewModels
|
||||
_repo = repo;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = "Clear all stashes...";
|
||||
@@ -17,13 +17,10 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog("Clear Stashes");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
{
|
||||
new Commands.Stash(_repo.FullPath).Use(log).Clear();
|
||||
log.Complete();
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return true;
|
||||
});
|
||||
await new Commands.Stash(_repo.FullPath).Use(log).ClearAsync();
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return true;
|
||||
}
|
||||
|
||||
private readonly Repository _repo = null;
|
||||
|
||||
@@ -74,7 +74,7 @@ namespace SourceGit.ViewModels
|
||||
{
|
||||
var text = await App.GetClipboardTextAsync();
|
||||
if (Models.Remote.IsValidURL(text))
|
||||
Dispatcher.UIThread.Invoke(() => Remote = text);
|
||||
await Dispatcher.UIThread.InvokeAsync(() => Remote = text);
|
||||
}
|
||||
catch
|
||||
{
|
||||
@@ -97,76 +97,73 @@ namespace SourceGit.ViewModels
|
||||
return ValidationResult.Success;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
ProgressDescription = "Clone ...";
|
||||
|
||||
var log = new CommandLog("Clone");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
var cmd = new Commands.Clone(_pageId, _parentFolder, _remote, _local, _useSSH ? _sshKey : "", _extraArgs).Use(log);
|
||||
if (!await cmd.ExecAsync())
|
||||
return false;
|
||||
|
||||
var path = _parentFolder;
|
||||
if (!string.IsNullOrEmpty(_local))
|
||||
{
|
||||
var cmd = new Commands.Clone(_pageId, _parentFolder, _remote, _local, _useSSH ? _sshKey : "", _extraArgs).Use(log);
|
||||
if (!cmd.Exec())
|
||||
return false;
|
||||
path = Path.GetFullPath(Path.Combine(path, _local));
|
||||
}
|
||||
else
|
||||
{
|
||||
var name = Path.GetFileName(_remote)!;
|
||||
if (name.EndsWith(".git", StringComparison.Ordinal))
|
||||
name = name.Substring(0, name.Length - 4);
|
||||
else if (name.EndsWith(".bundle", StringComparison.Ordinal))
|
||||
name = name.Substring(0, name.Length - 7);
|
||||
|
||||
var path = _parentFolder;
|
||||
if (!string.IsNullOrEmpty(_local))
|
||||
path = Path.GetFullPath(Path.Combine(path, name));
|
||||
}
|
||||
|
||||
if (!Directory.Exists(path))
|
||||
{
|
||||
App.RaiseException(_pageId, $"Folder '{path}' can NOT be found");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (_useSSH && !string.IsNullOrEmpty(_sshKey))
|
||||
{
|
||||
var config = new Commands.Config(path);
|
||||
await config.SetAsync("remote.origin.sshkey", _sshKey);
|
||||
}
|
||||
|
||||
if (InitAndUpdateSubmodules)
|
||||
{
|
||||
var submodules = await new Commands.QueryUpdatableSubmodules(path).ResultAsync();
|
||||
if (submodules.Count > 0)
|
||||
await new Commands.Submodule(path).Use(log).UpdateAsync(submodules, true, true);
|
||||
}
|
||||
|
||||
log.Complete();
|
||||
|
||||
await CallUIThreadAsync(() =>
|
||||
{
|
||||
var node = Preferences.Instance.FindOrAddNodeByRepositoryPath(path, null, true);
|
||||
var launcher = App.GetLauncher();
|
||||
LauncherPage page = null;
|
||||
foreach (var one in launcher.Pages)
|
||||
{
|
||||
path = Path.GetFullPath(Path.Combine(path, _local));
|
||||
}
|
||||
else
|
||||
{
|
||||
var name = Path.GetFileName(_remote)!;
|
||||
if (name.EndsWith(".git", StringComparison.Ordinal))
|
||||
name = name.Substring(0, name.Length - 4);
|
||||
else if (name.EndsWith(".bundle", StringComparison.Ordinal))
|
||||
name = name.Substring(0, name.Length - 7);
|
||||
|
||||
path = Path.GetFullPath(Path.Combine(path, name));
|
||||
}
|
||||
|
||||
if (!Directory.Exists(path))
|
||||
{
|
||||
App.RaiseException(_pageId, $"Folder '{path}' can NOT be found");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (_useSSH && !string.IsNullOrEmpty(_sshKey))
|
||||
{
|
||||
var config = new Commands.Config(path);
|
||||
config.Set("remote.origin.sshkey", _sshKey);
|
||||
}
|
||||
|
||||
if (InitAndUpdateSubmodules)
|
||||
{
|
||||
var submodules = new Commands.QueryUpdatableSubmodules(path).Result();
|
||||
if (submodules.Count > 0)
|
||||
new Commands.Submodule(path).Use(log).Update(submodules, true, true);
|
||||
}
|
||||
|
||||
log.Complete();
|
||||
|
||||
CallUIThread(() =>
|
||||
{
|
||||
var node = Preferences.Instance.FindOrAddNodeByRepositoryPath(path, null, true);
|
||||
var launcher = App.GetLauncher();
|
||||
LauncherPage page = null;
|
||||
foreach (var one in launcher.Pages)
|
||||
if (one.Node.Id == _pageId)
|
||||
{
|
||||
if (one.Node.Id == _pageId)
|
||||
{
|
||||
page = one;
|
||||
break;
|
||||
}
|
||||
page = one;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Welcome.Instance.Refresh();
|
||||
launcher.OpenRepositoryInTab(node, page);
|
||||
});
|
||||
|
||||
return true;
|
||||
Welcome.Instance.Refresh();
|
||||
launcher.OpenRepositoryInTab(node, page);
|
||||
});
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private string _pageId = string.Empty;
|
||||
|
||||
@@ -215,9 +215,9 @@ namespace SourceGit.ViewModels
|
||||
{
|
||||
case Models.ObjectType.Blob:
|
||||
CanOpenRevisionFileWithDefaultEditor = true;
|
||||
Task.Run(() =>
|
||||
Task.Run(async () =>
|
||||
{
|
||||
var isBinary = new Commands.IsBinary(_repo.FullPath, _commit.SHA, file.Path).Result();
|
||||
var isBinary = await new Commands.IsBinary(_repo.FullPath, _commit.SHA, file.Path).ResultAsync();
|
||||
if (isBinary)
|
||||
{
|
||||
var imgDecoder = ImageSource.GetDecoder(file.Path);
|
||||
@@ -225,20 +225,20 @@ namespace SourceGit.ViewModels
|
||||
{
|
||||
var source = ImageSource.FromRevision(_repo.FullPath, _commit.SHA, file.Path, imgDecoder);
|
||||
var image = new Models.RevisionImageFile(file.Path, source.Bitmap, source.Size);
|
||||
Dispatcher.UIThread.Invoke(() => ViewRevisionFileContent = image);
|
||||
await Dispatcher.UIThread.InvokeAsync(() => ViewRevisionFileContent = image);
|
||||
}
|
||||
else
|
||||
{
|
||||
var size = new Commands.QueryFileSize(_repo.FullPath, file.Path, _commit.SHA).Result();
|
||||
var size = await new Commands.QueryFileSize(_repo.FullPath, file.Path, _commit.SHA).ResultAsync();
|
||||
var binary = new Models.RevisionBinaryFile() { Size = size };
|
||||
Dispatcher.UIThread.Invoke(() => ViewRevisionFileContent = binary);
|
||||
await Dispatcher.UIThread.InvokeAsync(() => ViewRevisionFileContent = binary);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
var contentStream = Commands.QueryFileContent.Run(_repo.FullPath, _commit.SHA, file.Path);
|
||||
var content = new StreamReader(contentStream).ReadToEnd();
|
||||
var contentStream = await Commands.QueryFileContent.RunAsync(_repo.FullPath, _commit.SHA, file.Path);
|
||||
var content = await new StreamReader(contentStream).ReadToEndAsync();
|
||||
var lfs = Models.LFSObject.Parse(content);
|
||||
if (lfs != null)
|
||||
{
|
||||
@@ -246,35 +246,35 @@ namespace SourceGit.ViewModels
|
||||
if (imgDecoder != Models.ImageDecoder.None)
|
||||
{
|
||||
var combined = new RevisionLFSImage(_repo.FullPath, file.Path, lfs, imgDecoder);
|
||||
Dispatcher.UIThread.Invoke(() => ViewRevisionFileContent = combined);
|
||||
await Dispatcher.UIThread.InvokeAsync(() => ViewRevisionFileContent = combined);
|
||||
}
|
||||
else
|
||||
{
|
||||
var rlfs = new Models.RevisionLFSObject() { Object = lfs };
|
||||
Dispatcher.UIThread.Invoke(() => ViewRevisionFileContent = rlfs);
|
||||
await Dispatcher.UIThread.InvokeAsync(() => ViewRevisionFileContent = rlfs);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var txt = new Models.RevisionTextFile() { FileName = file.Path, Content = content };
|
||||
Dispatcher.UIThread.Invoke(() => ViewRevisionFileContent = txt);
|
||||
await Dispatcher.UIThread.InvokeAsync(() => ViewRevisionFileContent = txt);
|
||||
}
|
||||
});
|
||||
break;
|
||||
case Models.ObjectType.Commit:
|
||||
CanOpenRevisionFileWithDefaultEditor = false;
|
||||
Task.Run(() =>
|
||||
Task.Run(async () =>
|
||||
{
|
||||
var submoduleRoot = Path.Combine(_repo.FullPath, file.Path).Replace('\\', '/').Trim('/');
|
||||
var commit = new Commands.QuerySingleCommit(submoduleRoot, file.SHA).Result();
|
||||
var message = commit != null ? new Commands.QueryCommitFullMessage(submoduleRoot, file.SHA).Result() : null;
|
||||
var commit = await new Commands.QuerySingleCommit(submoduleRoot, file.SHA).ResultAsync();
|
||||
var message = commit != null ? await new Commands.QueryCommitFullMessage(submoduleRoot, file.SHA).ResultAsync() : null;
|
||||
var module = new Models.RevisionSubmodule()
|
||||
{
|
||||
Commit = commit ?? new Models.Commit() { SHA = _commit.SHA },
|
||||
FullMessage = new Models.CommitFullMessage { Message = message }
|
||||
};
|
||||
|
||||
Dispatcher.UIThread.Invoke(() => ViewRevisionFileContent = module);
|
||||
await Dispatcher.UIThread.InvokeAsync(() => ViewRevisionFileContent = module);
|
||||
});
|
||||
break;
|
||||
default:
|
||||
@@ -284,18 +284,17 @@ namespace SourceGit.ViewModels
|
||||
}
|
||||
}
|
||||
|
||||
public Task OpenRevisionFileWithDefaultEditor(string file)
|
||||
public async Task OpenRevisionFileWithDefaultEditor(string file)
|
||||
{
|
||||
return Task.Run(() =>
|
||||
{
|
||||
var fullPath = Native.OS.GetAbsPath(_repo.FullPath, file);
|
||||
var fileName = Path.GetFileNameWithoutExtension(fullPath) ?? "";
|
||||
var fileExt = Path.GetExtension(fullPath) ?? "";
|
||||
var tmpFile = Path.Combine(Path.GetTempPath(), $"{fileName}~{_commit.SHA.Substring(0, 10)}{fileExt}");
|
||||
|
||||
Commands.SaveRevisionFile.Run(_repo.FullPath, _commit.SHA, file, tmpFile);
|
||||
await Commands.SaveRevisionFile.RunAsync(_repo.FullPath, _commit.SHA, file, tmpFile);
|
||||
Native.OS.OpenWithDefaultEditor(tmpFile);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
public ContextMenu CreateChangeContextMenuByFolder(ChangeTreeNode node, List<Models.Change> changes)
|
||||
@@ -339,7 +338,7 @@ namespace SourceGit.ViewModels
|
||||
if (storageFile != null)
|
||||
{
|
||||
var saveTo = storageFile.Path.LocalPath;
|
||||
var succ = await Task.Run(() => Commands.SaveChangesAsPatch.ProcessRevisionCompareChanges(_repo.FullPath, changes, baseRevision, _commit.SHA, saveTo));
|
||||
var succ = await Commands.SaveChangesAsPatch.ProcessRevisionCompareChangesAsync(_repo.FullPath, changes, baseRevision, _commit.SHA, saveTo);
|
||||
if (succ)
|
||||
App.SendNotification(_repo.FullPath, App.Text("SaveAsPatchSuccess"));
|
||||
}
|
||||
@@ -388,7 +387,7 @@ namespace SourceGit.ViewModels
|
||||
var toolPath = Preferences.Instance.ExternalMergeToolPath;
|
||||
var opt = new Models.DiffOption(_commit, change);
|
||||
|
||||
Task.Run(() => Commands.MergeTool.OpenForDiff(_repo.FullPath, toolType, toolPath, opt));
|
||||
Task.Run(() => Commands.MergeTool.OpenForDiffAsync(_repo.FullPath, toolType, toolPath, opt));
|
||||
ev.Handled = true;
|
||||
};
|
||||
|
||||
@@ -441,7 +440,7 @@ namespace SourceGit.ViewModels
|
||||
if (storageFile != null)
|
||||
{
|
||||
var saveTo = storageFile.Path.LocalPath;
|
||||
var succ = await Task.Run(() => Commands.SaveChangesAsPatch.ProcessRevisionCompareChanges(_repo.FullPath, [change], baseRevision, _commit.SHA, saveTo));
|
||||
var succ = await Commands.SaveChangesAsPatch.ProcessRevisionCompareChangesAsync(_repo.FullPath, [change], baseRevision, _commit.SHA, saveTo);
|
||||
if (succ)
|
||||
App.SendNotification(_repo.FullPath, App.Text("SaveAsPatchSuccess"));
|
||||
}
|
||||
@@ -605,7 +604,7 @@ namespace SourceGit.ViewModels
|
||||
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)!);
|
||||
await Task.Run(() => Commands.SaveRevisionFile.Run(_repo.FullPath, _commit.SHA, file.Path, saveTo));
|
||||
await Commands.SaveRevisionFile.RunAsync(_repo.FullPath, _commit.SHA, file.Path, saveTo);
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
@@ -719,39 +718,39 @@ namespace SourceGit.ViewModels
|
||||
_cancellationSource = new CancellationTokenSource();
|
||||
var token = _cancellationSource.Token;
|
||||
|
||||
Task.Run(() =>
|
||||
Task.Run(async () =>
|
||||
{
|
||||
var message = new Commands.QueryCommitFullMessage(_repo.FullPath, _commit.SHA).Result();
|
||||
var inlines = ParseInlinesInMessage(message);
|
||||
var message = await new Commands.QueryCommitFullMessage(_repo.FullPath, _commit.SHA).ResultAsync();
|
||||
var inlines = await ParseInlinesInMessageAsync(message);
|
||||
|
||||
if (!token.IsCancellationRequested)
|
||||
Dispatcher.UIThread.Invoke(() => FullMessage = new Models.CommitFullMessage { Message = message, Inlines = inlines });
|
||||
await Dispatcher.UIThread.InvokeAsync(() => FullMessage = new Models.CommitFullMessage { Message = message, Inlines = inlines });
|
||||
}, token);
|
||||
|
||||
Task.Run(() =>
|
||||
Task.Run(async () =>
|
||||
{
|
||||
var signInfo = new Commands.QueryCommitSignInfo(_repo.FullPath, _commit.SHA, !_repo.HasAllowedSignersFile).Result();
|
||||
var signInfo = await new Commands.QueryCommitSignInfo(_repo.FullPath, _commit.SHA, !_repo.HasAllowedSignersFile).ResultAsync();
|
||||
if (!token.IsCancellationRequested)
|
||||
Dispatcher.UIThread.Invoke(() => SignInfo = signInfo);
|
||||
await Dispatcher.UIThread.InvokeAsync(() => SignInfo = signInfo);
|
||||
}, token);
|
||||
|
||||
if (Preferences.Instance.ShowChildren)
|
||||
{
|
||||
Task.Run(() =>
|
||||
Task.Run(async () =>
|
||||
{
|
||||
var max = Preferences.Instance.MaxHistoryCommits;
|
||||
var cmd = new Commands.QueryCommitChildren(_repo.FullPath, _commit.SHA, max) { CancellationToken = token };
|
||||
var children = cmd.Result();
|
||||
var children = await cmd.ResultAsync();
|
||||
if (!token.IsCancellationRequested)
|
||||
Dispatcher.UIThread.Post(() => Children = children);
|
||||
}, token);
|
||||
}
|
||||
|
||||
Task.Run(() =>
|
||||
Task.Run(async () =>
|
||||
{
|
||||
var parent = _commit.Parents.Count == 0 ? Models.Commit.EmptyTreeSHA1 : _commit.Parents[0];
|
||||
var cmd = new Commands.CompareRevisions(_repo.FullPath, parent, _commit.SHA) { CancellationToken = token };
|
||||
var changes = cmd.Result();
|
||||
var changes = await cmd.ResultAsync();
|
||||
var visible = changes;
|
||||
if (!string.IsNullOrWhiteSpace(_searchChangeFilter))
|
||||
{
|
||||
@@ -777,7 +776,7 @@ namespace SourceGit.ViewModels
|
||||
}, token);
|
||||
}
|
||||
|
||||
private Models.InlineElementCollector ParseInlinesInMessage(string message)
|
||||
private async Task<Models.InlineElementCollector> ParseInlinesInMessageAsync(string message)
|
||||
{
|
||||
var inlines = new Models.InlineElementCollector();
|
||||
if (_repo.Settings.IssueTrackerRules is { Count: > 0 } rules)
|
||||
@@ -816,7 +815,7 @@ namespace SourceGit.ViewModels
|
||||
continue;
|
||||
|
||||
var sha = match.Groups[1].Value;
|
||||
var isCommitSHA = new Commands.IsCommitSHA(_repo.FullPath, sha).Result();
|
||||
var isCommitSHA = await new Commands.IsCommitSHA(_repo.FullPath, sha).ResultAsync();
|
||||
if (isCommitSHA)
|
||||
inlines.Add(new Models.InlineElement(Models.InlineElementType.CommitSHA, start, len, sha));
|
||||
}
|
||||
@@ -868,7 +867,7 @@ namespace SourceGit.ViewModels
|
||||
lfsLock.Click += async (_, e) =>
|
||||
{
|
||||
var log = _repo.CreateLog("Lock LFS file");
|
||||
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Lock(_repo.Remotes[0].Name, path, log));
|
||||
var succ = await new Commands.LFS(_repo.FullPath).LockAsync(_repo.Remotes[0].Name, path, log);
|
||||
if (succ)
|
||||
App.SendNotification(_repo.FullPath, $"Lock file \"{path}\" successfully!");
|
||||
|
||||
@@ -886,7 +885,7 @@ namespace SourceGit.ViewModels
|
||||
lockRemote.Click += async (_, e) =>
|
||||
{
|
||||
var log = _repo.CreateLog("Lock LFS file");
|
||||
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Lock(remoteName, path, log));
|
||||
var succ = await new Commands.LFS(_repo.FullPath).LockAsync(remoteName, path, log);
|
||||
if (succ)
|
||||
App.SendNotification(_repo.FullPath, $"Lock file \"{path}\" successfully!");
|
||||
|
||||
@@ -906,7 +905,7 @@ namespace SourceGit.ViewModels
|
||||
lfsUnlock.Click += async (_, e) =>
|
||||
{
|
||||
var log = _repo.CreateLog("Unlock LFS file");
|
||||
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Unlock(_repo.Remotes[0].Name, path, false, log));
|
||||
var succ = await new Commands.LFS(_repo.FullPath).UnlockAsync(_repo.Remotes[0].Name, path, false, log);
|
||||
if (succ)
|
||||
App.SendNotification(_repo.FullPath, $"Unlock file \"{path}\" successfully!");
|
||||
|
||||
@@ -924,7 +923,7 @@ namespace SourceGit.ViewModels
|
||||
unlockRemote.Click += async (_, e) =>
|
||||
{
|
||||
var log = _repo.CreateLog("Unlock LFS file");
|
||||
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Unlock(remoteName, path, false, log));
|
||||
var succ = await new Commands.LFS(_repo.FullPath).UnlockAsync(remoteName, path, false, log);
|
||||
if (succ)
|
||||
App.SendNotification(_repo.FullPath, $"Unlock file \"{path}\" successfully!");
|
||||
|
||||
@@ -952,10 +951,10 @@ namespace SourceGit.ViewModels
|
||||
var sha = Commit.SHA;
|
||||
_requestingRevisionFiles = true;
|
||||
|
||||
Task.Run(() =>
|
||||
Task.Run(async () =>
|
||||
{
|
||||
var files = new Commands.QueryRevisionFileNames(_repo.FullPath, sha).Result();
|
||||
Dispatcher.UIThread.Invoke(() =>
|
||||
var files = await new Commands.QueryRevisionFileNames(_repo.FullPath, sha).ResultAsync();
|
||||
await Dispatcher.UIThread.InvokeAsync(() =>
|
||||
{
|
||||
if (sha == Commit.SHA && _requestingRevisionFiles)
|
||||
{
|
||||
@@ -996,29 +995,23 @@ namespace SourceGit.ViewModels
|
||||
RevisionFileSearchSuggestion = suggestion;
|
||||
}
|
||||
|
||||
private Task ResetToThisRevision(string path)
|
||||
private async Task ResetToThisRevision(string path)
|
||||
{
|
||||
var log = _repo.CreateLog($"Reset File to '{_commit.SHA}'");
|
||||
|
||||
return Task.Run(() =>
|
||||
{
|
||||
new Commands.Checkout(_repo.FullPath).Use(log).FileWithRevision(path, $"{_commit.SHA}");
|
||||
log.Complete();
|
||||
});
|
||||
await new Commands.Checkout(_repo.FullPath).Use(log).FileWithRevisionAsync(path, $"{_commit.SHA}");
|
||||
log.Complete();
|
||||
}
|
||||
|
||||
private Task ResetToParentRevision(Models.Change change)
|
||||
private async Task ResetToParentRevision(Models.Change change)
|
||||
{
|
||||
var log = _repo.CreateLog($"Reset File to '{_commit.SHA}~1'");
|
||||
|
||||
return Task.Run(() =>
|
||||
{
|
||||
if (change.Index == Models.ChangeState.Renamed)
|
||||
new Commands.Checkout(_repo.FullPath).Use(log).FileWithRevision(change.OriginalPath, $"{_commit.SHA}~1");
|
||||
if (change.Index == Models.ChangeState.Renamed)
|
||||
await new Commands.Checkout(_repo.FullPath).Use(log).FileWithRevisionAsync(change.OriginalPath, $"{_commit.SHA}~1");
|
||||
|
||||
new Commands.Checkout(_repo.FullPath).Use(log).FileWithRevision(change.Path, $"{_commit.SHA}~1");
|
||||
log.Complete();
|
||||
});
|
||||
await new Commands.Checkout(_repo.FullPath).Use(log).FileWithRevisionAsync(change.Path, $"{_commit.SHA}~1");
|
||||
log.Complete();
|
||||
}
|
||||
|
||||
[GeneratedRegex(@"\b(https?://|ftp://)[\w\d\._/\-~%@()+:?&=#!]*[\w\d/]")]
|
||||
|
||||
@@ -114,7 +114,7 @@ namespace SourceGit.ViewModels
|
||||
return new ValidationResult("Missing runtime context to create branch!");
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
|
||||
@@ -123,89 +123,86 @@ namespace SourceGit.ViewModels
|
||||
Use(log);
|
||||
|
||||
var updateSubmodules = IsRecurseSubmoduleVisible && RecurseSubmodules;
|
||||
return Task.Run(() =>
|
||||
bool succ;
|
||||
|
||||
if (CheckoutAfterCreated && !_repo.ConfirmCheckoutBranch())
|
||||
{
|
||||
bool succ;
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (CheckoutAfterCreated && !_repo.ConfirmCheckoutBranch())
|
||||
if (CheckoutAfterCreated && !_repo.IsBare)
|
||||
{
|
||||
var needPopStash = false;
|
||||
if (DiscardLocalChanges)
|
||||
{
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (CheckoutAfterCreated && !_repo.IsBare)
|
||||
{
|
||||
var needPopStash = false;
|
||||
if (DiscardLocalChanges)
|
||||
{
|
||||
succ = new Commands.Checkout(_repo.FullPath).Use(log).Branch(fixedName, _baseOnRevision, true, _allowOverwrite);
|
||||
}
|
||||
else
|
||||
{
|
||||
var changes = new Commands.CountLocalChangesWithoutUntracked(_repo.FullPath).Result();
|
||||
if (changes > 0)
|
||||
{
|
||||
succ = new Commands.Stash(_repo.FullPath).Use(log).Push("CREATE_BRANCH_AUTO_STASH");
|
||||
if (!succ)
|
||||
{
|
||||
log.Complete();
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return false;
|
||||
}
|
||||
|
||||
needPopStash = true;
|
||||
}
|
||||
|
||||
succ = new Commands.Checkout(_repo.FullPath).Use(log).Branch(fixedName, _baseOnRevision, false, _allowOverwrite);
|
||||
}
|
||||
|
||||
if (succ)
|
||||
{
|
||||
if (updateSubmodules)
|
||||
{
|
||||
var submodules = new Commands.QueryUpdatableSubmodules(_repo.FullPath).Result();
|
||||
if (submodules.Count > 0)
|
||||
new Commands.Submodule(_repo.FullPath).Use(log).Update(submodules, true, true);
|
||||
}
|
||||
|
||||
if (needPopStash)
|
||||
new Commands.Stash(_repo.FullPath).Use(log).Pop("stash@{0}");
|
||||
}
|
||||
succ = await new Commands.Checkout(_repo.FullPath).Use(log).BranchAsync(fixedName, _baseOnRevision, true, _allowOverwrite);
|
||||
}
|
||||
else
|
||||
{
|
||||
succ = Commands.Branch.Create(_repo.FullPath, fixedName, _baseOnRevision, _allowOverwrite, log);
|
||||
}
|
||||
|
||||
log.Complete();
|
||||
|
||||
CallUIThread(() =>
|
||||
{
|
||||
if (succ && CheckoutAfterCreated)
|
||||
var changes = await new Commands.CountLocalChangesWithoutUntracked(_repo.FullPath).ResultAsync();
|
||||
if (changes > 0)
|
||||
{
|
||||
var fake = new Models.Branch() { IsLocal = true, FullName = $"refs/heads/{fixedName}" };
|
||||
if (BasedOn is Models.Branch { IsLocal: false } based)
|
||||
fake.Upstream = based.FullName;
|
||||
succ = await new Commands.Stash(_repo.FullPath).Use(log).PushAsync("CREATE_BRANCH_AUTO_STASH");
|
||||
if (!succ)
|
||||
{
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return false;
|
||||
}
|
||||
|
||||
var folderEndIdx = fake.FullName.LastIndexOf('/');
|
||||
if (folderEndIdx > 10)
|
||||
_repo.Settings.ExpandedBranchNodesInSideBar.Add(fake.FullName.Substring(0, folderEndIdx));
|
||||
|
||||
if (_repo.HistoriesFilterMode == Models.FilterMode.Included)
|
||||
_repo.SetBranchFilterMode(fake, Models.FilterMode.Included, true, false);
|
||||
|
||||
ProgressDescription = "Waiting for branch updated...";
|
||||
needPopStash = true;
|
||||
}
|
||||
|
||||
_repo.MarkBranchesDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
});
|
||||
succ = await new Commands.Checkout(_repo.FullPath).Use(log).BranchAsync(fixedName, _baseOnRevision, false, _allowOverwrite);
|
||||
}
|
||||
|
||||
if (CheckoutAfterCreated)
|
||||
Task.Delay(400).Wait();
|
||||
if (succ)
|
||||
{
|
||||
if (updateSubmodules)
|
||||
{
|
||||
var submodules = await new Commands.QueryUpdatableSubmodules(_repo.FullPath).ResultAsync();
|
||||
if (submodules.Count > 0)
|
||||
await new Commands.Submodule(_repo.FullPath).Use(log).UpdateAsync(submodules, true, true);
|
||||
}
|
||||
|
||||
return true;
|
||||
if (needPopStash)
|
||||
await new Commands.Stash(_repo.FullPath).Use(log).PopAsync("stash@{0}");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
succ = await Commands.Branch.CreateAsync(_repo.FullPath, fixedName, _baseOnRevision, _allowOverwrite, log);
|
||||
}
|
||||
|
||||
log.Complete();
|
||||
|
||||
await CallUIThreadAsync(() =>
|
||||
{
|
||||
if (succ && CheckoutAfterCreated)
|
||||
{
|
||||
var fake = new Models.Branch() { IsLocal = true, FullName = $"refs/heads/{fixedName}" };
|
||||
if (BasedOn is Models.Branch { IsLocal: false } based)
|
||||
fake.Upstream = based.FullName;
|
||||
|
||||
var folderEndIdx = fake.FullName.LastIndexOf('/');
|
||||
if (folderEndIdx > 10)
|
||||
_repo.Settings.ExpandedBranchNodesInSideBar.Add(fake.FullName.Substring(0, folderEndIdx));
|
||||
|
||||
if (_repo.HistoriesFilterMode == Models.FilterMode.Included)
|
||||
_repo.SetBranchFilterMode(fake, Models.FilterMode.Included, true, false);
|
||||
|
||||
ProgressDescription = "Waiting for branch updated...";
|
||||
}
|
||||
|
||||
_repo.MarkBranchesDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
});
|
||||
|
||||
if (CheckoutAfterCreated)
|
||||
Task.Delay(400).Wait();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private string FixName(string name)
|
||||
|
||||
@@ -74,7 +74,7 @@ namespace SourceGit.ViewModels
|
||||
return ValidationResult.Success;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = "Create tag...";
|
||||
@@ -83,24 +83,21 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog("Create Tag");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
bool succ;
|
||||
if (_annotated)
|
||||
succ = await Commands.Tag.AddAsync(_repo.FullPath, _tagName, _basedOn, Message, SignTag, log);
|
||||
else
|
||||
succ = await Commands.Tag.AddAsync(_repo.FullPath, _tagName, _basedOn, log);
|
||||
|
||||
if (succ && remotes != null)
|
||||
{
|
||||
bool succ;
|
||||
if (_annotated)
|
||||
succ = Commands.Tag.Add(_repo.FullPath, _tagName, _basedOn, Message, SignTag, log);
|
||||
else
|
||||
succ = Commands.Tag.Add(_repo.FullPath, _tagName, _basedOn, log);
|
||||
foreach (var remote in remotes)
|
||||
await new Commands.Push(_repo.FullPath, remote.Name, $"refs/tags/{_tagName}", false).Use(log).ExecAsync();
|
||||
}
|
||||
|
||||
if (succ && remotes != null)
|
||||
{
|
||||
foreach (var remote in remotes)
|
||||
new Commands.Push(_repo.FullPath, remote.Name, $"refs/tags/{_tagName}", false).Use(log).Exec();
|
||||
}
|
||||
|
||||
log.Complete();
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
});
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
}
|
||||
|
||||
private readonly Repository _repo = null;
|
||||
|
||||
@@ -23,7 +23,7 @@ namespace SourceGit.ViewModels
|
||||
Force = false;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = "De-initialize Submodule";
|
||||
@@ -31,13 +31,10 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog("De-initialize Submodule");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
{
|
||||
var succ = new Commands.Submodule(_repo.FullPath).Use(log).Deinit(Submodule, false);
|
||||
log.Complete();
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
});
|
||||
var succ = await new Commands.Submodule(_repo.FullPath).Use(log).DeinitAsync(Submodule, false);
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
}
|
||||
|
||||
private Repository _repo;
|
||||
|
||||
@@ -39,7 +39,7 @@ namespace SourceGit.ViewModels
|
||||
}
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = "Deleting branch...";
|
||||
@@ -47,29 +47,26 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog("Delete Branch");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
if (Target.IsLocal)
|
||||
{
|
||||
if (Target.IsLocal)
|
||||
{
|
||||
Commands.Branch.DeleteLocal(_repo.FullPath, Target.Name, log);
|
||||
await Commands.Branch.DeleteLocalAsync(_repo.FullPath, Target.Name, log);
|
||||
|
||||
if (_alsoDeleteTrackingRemote && TrackingRemoteBranch != null)
|
||||
Commands.Branch.DeleteRemote(_repo.FullPath, TrackingRemoteBranch.Remote, TrackingRemoteBranch.Name, log);
|
||||
}
|
||||
else
|
||||
{
|
||||
Commands.Branch.DeleteRemote(_repo.FullPath, Target.Remote, Target.Name, log);
|
||||
}
|
||||
if (_alsoDeleteTrackingRemote && TrackingRemoteBranch != null)
|
||||
await Commands.Branch.DeleteRemoteAsync(_repo.FullPath, TrackingRemoteBranch.Remote, TrackingRemoteBranch.Name, log);
|
||||
}
|
||||
else
|
||||
{
|
||||
await Commands.Branch.DeleteRemoteAsync(_repo.FullPath, Target.Remote, Target.Name, log);
|
||||
}
|
||||
|
||||
log.Complete();
|
||||
log.Complete();
|
||||
|
||||
CallUIThread(() =>
|
||||
{
|
||||
_repo.MarkBranchesDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
});
|
||||
return true;
|
||||
await CallUIThreadAsync(() =>
|
||||
{
|
||||
_repo.MarkBranchesDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
});
|
||||
return true;
|
||||
}
|
||||
|
||||
private readonly Repository _repo = null;
|
||||
|
||||
@@ -17,7 +17,7 @@ namespace SourceGit.ViewModels
|
||||
Targets = branches;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = "Deleting multiple branches...";
|
||||
@@ -25,29 +25,26 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog("Delete Multiple Branches");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
if (_isLocal)
|
||||
{
|
||||
if (_isLocal)
|
||||
{
|
||||
foreach (var target in Targets)
|
||||
Commands.Branch.DeleteLocal(_repo.FullPath, target.Name, log);
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (var target in Targets)
|
||||
Commands.Branch.DeleteRemote(_repo.FullPath, target.Remote, target.Name, log);
|
||||
}
|
||||
foreach (var target in Targets)
|
||||
await Commands.Branch.DeleteLocalAsync(_repo.FullPath, target.Name, log);
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (var target in Targets)
|
||||
await Commands.Branch.DeleteRemoteAsync(_repo.FullPath, target.Remote, target.Name, log);
|
||||
}
|
||||
|
||||
log.Complete();
|
||||
log.Complete();
|
||||
|
||||
CallUIThread(() =>
|
||||
{
|
||||
_repo.MarkBranchesDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
});
|
||||
|
||||
return true;
|
||||
await CallUIThreadAsync(() =>
|
||||
{
|
||||
_repo.MarkBranchesDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
});
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private Repository _repo = null;
|
||||
|
||||
@@ -16,7 +16,7 @@ namespace SourceGit.ViewModels
|
||||
Remote = remote;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = "Deleting remote ...";
|
||||
@@ -24,18 +24,15 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog("Delete Remote");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
{
|
||||
var succ = new Commands.Remote(_repo.FullPath).Use(log).Delete(Remote.Name);
|
||||
log.Complete();
|
||||
var succ = await new Commands.Remote(_repo.FullPath).Use(log).DeleteAsync(Remote.Name);
|
||||
log.Complete();
|
||||
|
||||
CallUIThread(() =>
|
||||
{
|
||||
_repo.MarkBranchesDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
});
|
||||
return succ;
|
||||
await CallUIThreadAsync(() =>
|
||||
{
|
||||
_repo.MarkBranchesDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
});
|
||||
return succ;
|
||||
}
|
||||
|
||||
private readonly Repository _repo = null;
|
||||
|
||||
@@ -16,7 +16,7 @@ namespace SourceGit.ViewModels
|
||||
Submodule = submodule;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = "Deleting submodule ...";
|
||||
@@ -24,13 +24,10 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog("Delete Submodule");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
{
|
||||
var succ = new Commands.Submodule(_repo.FullPath).Use(log).Delete(Submodule);
|
||||
log.Complete();
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
});
|
||||
var succ = await new Commands.Submodule(_repo.FullPath).Use(log).DeleteAsync(Submodule);
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
}
|
||||
|
||||
private readonly Repository _repo = null;
|
||||
|
||||
@@ -22,7 +22,7 @@ namespace SourceGit.ViewModels
|
||||
Target = tag;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = $"Deleting tag '{Target.Name}' ...";
|
||||
@@ -31,24 +31,21 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog("Delete Tag");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
var succ = await Commands.Tag.DeleteAsync(_repo.FullPath, Target.Name, log);
|
||||
if (succ)
|
||||
{
|
||||
var succ = Commands.Tag.Delete(_repo.FullPath, Target.Name, log);
|
||||
if (succ)
|
||||
{
|
||||
foreach (var r in remotes)
|
||||
new Commands.Push(_repo.FullPath, r.Name, $"refs/tags/{Target.Name}", true).Use(log).Exec();
|
||||
}
|
||||
foreach (var r in remotes)
|
||||
await new Commands.Push(_repo.FullPath, r.Name, $"refs/tags/{Target.Name}", true).Use(log).ExecAsync();
|
||||
}
|
||||
|
||||
log.Complete();
|
||||
log.Complete();
|
||||
|
||||
CallUIThread(() =>
|
||||
{
|
||||
_repo.MarkTagsDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
});
|
||||
return succ;
|
||||
await CallUIThreadAsync(() =>
|
||||
{
|
||||
_repo.MarkTagsDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
});
|
||||
return succ;
|
||||
}
|
||||
|
||||
private readonly Repository _repo = null;
|
||||
|
||||
@@ -97,7 +97,7 @@ namespace SourceGit.ViewModels
|
||||
{
|
||||
var toolType = Preferences.Instance.ExternalMergeToolType;
|
||||
var toolPath = Preferences.Instance.ExternalMergeToolPath;
|
||||
Task.Run(() => Commands.MergeTool.OpenForDiff(_repo, toolType, toolPath, _option));
|
||||
Task.Run(() => Commands.MergeTool.OpenForDiffAsync(_repo, toolType, toolPath, _option));
|
||||
}
|
||||
|
||||
private void LoadDiffContent()
|
||||
@@ -109,11 +109,11 @@ namespace SourceGit.ViewModels
|
||||
return;
|
||||
}
|
||||
|
||||
Task.Run(() =>
|
||||
Task.Run(async () =>
|
||||
{
|
||||
var numLines = Preferences.Instance.UseFullTextDiff ? 999999999 : _unifiedLines;
|
||||
var ignoreWhitespace = Preferences.Instance.IgnoreWhitespaceChangesInDiff;
|
||||
var latest = new Commands.Diff(_repo, _option, numLines, ignoreWhitespace).Result();
|
||||
var latest = await new Commands.Diff(_repo, _option, numLines, ignoreWhitespace).ResultAsync();
|
||||
var info = new Info(_option, numLines, ignoreWhitespace, latest);
|
||||
if (_info != null && info.IsSame(_info))
|
||||
return;
|
||||
@@ -199,13 +199,13 @@ namespace SourceGit.ViewModels
|
||||
var binaryDiff = new Models.BinaryDiff();
|
||||
if (_option.Revisions.Count == 2)
|
||||
{
|
||||
binaryDiff.OldSize = new Commands.QueryFileSize(_repo, oldPath, _option.Revisions[0]).Result();
|
||||
binaryDiff.NewSize = new Commands.QueryFileSize(_repo, _option.Path, _option.Revisions[1]).Result();
|
||||
binaryDiff.OldSize = await new Commands.QueryFileSize(_repo, oldPath, _option.Revisions[0]).ResultAsync();
|
||||
binaryDiff.NewSize = await new Commands.QueryFileSize(_repo, _option.Path, _option.Revisions[1]).ResultAsync();
|
||||
}
|
||||
else
|
||||
{
|
||||
var fullPath = Path.Combine(_repo, _option.Path);
|
||||
binaryDiff.OldSize = new Commands.QueryFileSize(_repo, oldPath, "HEAD").Result();
|
||||
binaryDiff.OldSize = await new Commands.QueryFileSize(_repo, oldPath, "HEAD").ResultAsync();
|
||||
binaryDiff.NewSize = File.Exists(fullPath) ? new FileInfo(fullPath).Length : 0;
|
||||
}
|
||||
rs = binaryDiff;
|
||||
|
||||
@@ -51,10 +51,10 @@ namespace SourceGit.ViewModels
|
||||
_detail = new CommitDetail(repo, false);
|
||||
_detail.SearchChangeFilter = dir;
|
||||
|
||||
Task.Run(() =>
|
||||
Task.Run(async () =>
|
||||
{
|
||||
var commits = new Commands.QueryCommits(_repo.FullPath, $"--date-order -n 10000 {revision ?? string.Empty} -- \"{dir}\"", false).Result();
|
||||
Dispatcher.UIThread.Invoke(() =>
|
||||
var commits = await new Commands.QueryCommits(_repo.FullPath, $"--date-order -n 10000 {revision ?? string.Empty} -- \"{dir}\"", false).ResultAsync();
|
||||
await Dispatcher.UIThread.InvokeAsync(() =>
|
||||
{
|
||||
Commits = commits;
|
||||
IsLoading = false;
|
||||
|
||||
@@ -56,7 +56,7 @@ namespace SourceGit.ViewModels
|
||||
Mode = new DiscardMultipleFiles() { Count = _changes.Count };
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = _changes == null ? "Discard all local changes ..." : $"Discard total {_changes.Count} changes ...";
|
||||
@@ -64,23 +64,20 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog("Discard all");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
if (Mode is DiscardAllMode all)
|
||||
await Commands.Discard.AllAsync(_repo.FullPath, all.IncludeIgnored, log);
|
||||
else
|
||||
await Commands.Discard.ChangesAsync(_repo.FullPath, _changes, log);
|
||||
|
||||
log.Complete();
|
||||
|
||||
await CallUIThreadAsync(() =>
|
||||
{
|
||||
if (Mode is DiscardAllMode all)
|
||||
Commands.Discard.All(_repo.FullPath, all.IncludeIgnored, log);
|
||||
else
|
||||
Commands.Discard.Changes(_repo.FullPath, _changes, log);
|
||||
|
||||
log.Complete();
|
||||
|
||||
CallUIThread(() =>
|
||||
{
|
||||
_repo.MarkWorkingCopyDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
});
|
||||
|
||||
return true;
|
||||
_repo.MarkWorkingCopyDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
});
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private readonly Repository _repo = null;
|
||||
|
||||
@@ -12,19 +12,16 @@ namespace SourceGit.ViewModels
|
||||
Stash = stash;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
ProgressDescription = $"Dropping stash: {Stash.Name}";
|
||||
|
||||
var log = _repo.CreateLog("Drop Stash");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
{
|
||||
new Commands.Stash(_repo.FullPath).Use(log).Drop(Stash.Name);
|
||||
log.Complete();
|
||||
return true;
|
||||
});
|
||||
await new Commands.Stash(_repo.FullPath).Use(log).DropAsync(Stash.Name);
|
||||
log.Complete();
|
||||
return true;
|
||||
}
|
||||
|
||||
private readonly Repository _repo;
|
||||
|
||||
@@ -100,36 +100,33 @@ namespace SourceGit.ViewModels
|
||||
return ValidationResult.Success;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = $"Editing remote '{_remote.Name}' ...";
|
||||
|
||||
return Task.Run(() =>
|
||||
if (_remote.Name != _name)
|
||||
{
|
||||
if (_remote.Name != _name)
|
||||
{
|
||||
var succ = new Commands.Remote(_repo.FullPath).Rename(_remote.Name, _name);
|
||||
if (succ)
|
||||
_remote.Name = _name;
|
||||
}
|
||||
var succ = await new Commands.Remote(_repo.FullPath).RenameAsync(_remote.Name, _name);
|
||||
if (succ)
|
||||
_remote.Name = _name;
|
||||
}
|
||||
|
||||
if (_remote.URL != _url)
|
||||
{
|
||||
var succ = new Commands.Remote(_repo.FullPath).SetURL(_name, _url, false);
|
||||
if (succ)
|
||||
_remote.URL = _url;
|
||||
}
|
||||
if (_remote.URL != _url)
|
||||
{
|
||||
var succ = await new Commands.Remote(_repo.FullPath).SetURLAsync(_name, _url, false);
|
||||
if (succ)
|
||||
_remote.URL = _url;
|
||||
}
|
||||
|
||||
var pushURL = new Commands.Remote(_repo.FullPath).GetURL(_name, true);
|
||||
if (pushURL != _url)
|
||||
new Commands.Remote(_repo.FullPath).SetURL(_name, _url, true);
|
||||
var pushURL = await new Commands.Remote(_repo.FullPath).GetURLAsync(_name, true);
|
||||
if (pushURL != _url)
|
||||
await new Commands.Remote(_repo.FullPath).SetURLAsync(_name, _url, true);
|
||||
|
||||
new Commands.Config(_repo.FullPath).Set($"remote.{_name}.sshkey", _useSSH ? SSHKey : null);
|
||||
await new Commands.Config(_repo.FullPath).SetAsync($"remote.{_name}.sshkey", _useSSH ? SSHKey : null);
|
||||
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return true;
|
||||
});
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return true;
|
||||
}
|
||||
|
||||
private readonly Repository _repo = null;
|
||||
|
||||
@@ -151,7 +151,7 @@ namespace SourceGit.ViewModels
|
||||
PrepareControlParameters();
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = "Run custom action ...";
|
||||
@@ -166,19 +166,16 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog(CustomAction.Name);
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
{
|
||||
log.AppendLine($"$ {CustomAction.Executable} {cmdline}\n");
|
||||
log.AppendLine($"$ {CustomAction.Executable} {cmdline}\n");
|
||||
|
||||
if (CustomAction.WaitForExit)
|
||||
RunAndWait(cmdline, log);
|
||||
else
|
||||
Run(cmdline);
|
||||
if (CustomAction.WaitForExit)
|
||||
RunAndWait(cmdline, log);
|
||||
else
|
||||
Run(cmdline);
|
||||
|
||||
log.Complete();
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return true;
|
||||
});
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return true;
|
||||
}
|
||||
|
||||
private void PrepareControlParameters()
|
||||
|
||||
@@ -54,7 +54,7 @@ namespace SourceGit.ViewModels
|
||||
}
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
|
||||
@@ -63,36 +63,33 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog("Fetch");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
if (FetchAllRemotes)
|
||||
{
|
||||
if (FetchAllRemotes)
|
||||
{
|
||||
foreach (var remote in _repo.Remotes)
|
||||
new Commands.Fetch(_repo.FullPath, remote.Name, notags, force).Use(log).Exec();
|
||||
}
|
||||
else
|
||||
{
|
||||
new Commands.Fetch(_repo.FullPath, SelectedRemote.Name, notags, force).Use(log).Exec();
|
||||
}
|
||||
foreach (var remote in _repo.Remotes)
|
||||
await new Commands.Fetch(_repo.FullPath, remote.Name, notags, force).Use(log).ExecAsync();
|
||||
}
|
||||
else
|
||||
{
|
||||
await new Commands.Fetch(_repo.FullPath, SelectedRemote.Name, notags, force).Use(log).ExecAsync();
|
||||
}
|
||||
|
||||
log.Complete();
|
||||
log.Complete();
|
||||
|
||||
var upstream = _repo.CurrentBranch?.Upstream;
|
||||
var upstreamHead = string.Empty;
|
||||
if (!string.IsNullOrEmpty(upstream))
|
||||
upstreamHead = new Commands.QueryRevisionByRefName(_repo.FullPath, upstream.Substring(13)).Result();
|
||||
var upstream = _repo.CurrentBranch?.Upstream;
|
||||
var upstreamHead = string.Empty;
|
||||
if (!string.IsNullOrEmpty(upstream))
|
||||
upstreamHead = await new Commands.QueryRevisionByRefName(_repo.FullPath, upstream.Substring(13)).ResultAsync();
|
||||
|
||||
CallUIThread(() =>
|
||||
{
|
||||
if (!string.IsNullOrEmpty(upstreamHead))
|
||||
_repo.NavigateToCommit(upstreamHead, true);
|
||||
await CallUIThreadAsync(() =>
|
||||
{
|
||||
if (!string.IsNullOrEmpty(upstreamHead))
|
||||
_repo.NavigateToCommit(upstreamHead, true);
|
||||
|
||||
_repo.MarkFetched();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
});
|
||||
|
||||
return true;
|
||||
_repo.MarkFetched();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
});
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private readonly Repository _repo = null;
|
||||
|
||||
@@ -21,7 +21,7 @@ namespace SourceGit.ViewModels
|
||||
Upstream = upstream;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = "Fast-Forward ...";
|
||||
@@ -29,20 +29,17 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog($"Fetch Into '{Local.FriendlyName}'");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
await new Commands.Fetch(_repo.FullPath, Local, Upstream).Use(log).ExecAsync();
|
||||
log.Complete();
|
||||
|
||||
var changedLocalBranchHead = await new Commands.QueryRevisionByRefName(_repo.FullPath, Local.Name).ResultAsync();
|
||||
await CallUIThreadAsync(() =>
|
||||
{
|
||||
new Commands.Fetch(_repo.FullPath, Local, Upstream).Use(log).Exec();
|
||||
log.Complete();
|
||||
|
||||
var changedLocalBranchHead = new Commands.QueryRevisionByRefName(_repo.FullPath, Local.Name).Result();
|
||||
CallUIThread(() =>
|
||||
{
|
||||
_repo.NavigateToCommit(changedLocalBranchHead, true);
|
||||
_repo.SetWatcherEnabled(true);
|
||||
});
|
||||
|
||||
return true;
|
||||
_repo.NavigateToCommit(changedLocalBranchHead, true);
|
||||
_repo.SetWatcherEnabled(true);
|
||||
});
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private readonly Repository _repo = null;
|
||||
|
||||
@@ -45,26 +45,23 @@ namespace SourceGit.ViewModels
|
||||
RefreshViewContent();
|
||||
}
|
||||
|
||||
public Task<bool> ResetToSelectedRevision()
|
||||
public async Task<bool> ResetToSelectedRevision()
|
||||
{
|
||||
return Task.Run(() => new Commands.Checkout(_repo.FullPath).FileWithRevision(_file, $"{_revision.SHA}"));
|
||||
return await new Commands.Checkout(_repo.FullPath).FileWithRevisionAsync(_file, $"{_revision.SHA}");
|
||||
}
|
||||
|
||||
public Task OpenWithDefaultEditor()
|
||||
public async Task OpenWithDefaultEditor()
|
||||
{
|
||||
if (_viewContent is not FileHistoriesRevisionFile { CanOpenWithDefaultEditor: true })
|
||||
return null;
|
||||
return;
|
||||
|
||||
return Task.Run(() =>
|
||||
{
|
||||
var fullPath = Native.OS.GetAbsPath(_repo.FullPath, _file);
|
||||
var fileName = Path.GetFileNameWithoutExtension(fullPath) ?? "";
|
||||
var fileExt = Path.GetExtension(fullPath) ?? "";
|
||||
var tmpFile = Path.Combine(Path.GetTempPath(), $"{fileName}~{_revision.SHA.Substring(0, 10)}{fileExt}");
|
||||
var fullPath = Native.OS.GetAbsPath(_repo.FullPath, _file);
|
||||
var fileName = Path.GetFileNameWithoutExtension(fullPath) ?? "";
|
||||
var fileExt = Path.GetExtension(fullPath) ?? "";
|
||||
var tmpFile = Path.Combine(Path.GetTempPath(), $"{fileName}~{_revision.SHA.Substring(0, 10)}{fileExt}");
|
||||
|
||||
Commands.SaveRevisionFile.Run(_repo.FullPath, _revision.SHA, _file, tmpFile);
|
||||
Native.OS.OpenWithDefaultEditor(tmpFile);
|
||||
});
|
||||
await Commands.SaveRevisionFile.RunAsync(_repo.FullPath, _revision.SHA, _file, tmpFile);
|
||||
Native.OS.OpenWithDefaultEditor(tmpFile);
|
||||
}
|
||||
|
||||
private void RefreshViewContent()
|
||||
@@ -88,9 +85,9 @@ namespace SourceGit.ViewModels
|
||||
switch (obj.Type)
|
||||
{
|
||||
case Models.ObjectType.Blob:
|
||||
Task.Run(() =>
|
||||
Task.Run(async () =>
|
||||
{
|
||||
var isBinary = new Commands.IsBinary(_repo.FullPath, _revision.SHA, _file).Result();
|
||||
var isBinary = await new Commands.IsBinary(_repo.FullPath, _revision.SHA, _file).ResultAsync();
|
||||
if (isBinary)
|
||||
{
|
||||
var imgDecoder = ImageSource.GetDecoder(_file);
|
||||
@@ -98,20 +95,20 @@ namespace SourceGit.ViewModels
|
||||
{
|
||||
var source = ImageSource.FromRevision(_repo.FullPath, _revision.SHA, _file, imgDecoder);
|
||||
var image = new Models.RevisionImageFile(_file, source.Bitmap, source.Size);
|
||||
Dispatcher.UIThread.Invoke(() => ViewContent = new FileHistoriesRevisionFile(_file, image, true));
|
||||
await Dispatcher.UIThread.InvokeAsync(() => ViewContent = new FileHistoriesRevisionFile(_file, image, true));
|
||||
}
|
||||
else
|
||||
{
|
||||
var size = new Commands.QueryFileSize(_repo.FullPath, _file, _revision.SHA).Result();
|
||||
var size = await new Commands.QueryFileSize(_repo.FullPath, _file, _revision.SHA).ResultAsync();
|
||||
var binaryFile = new Models.RevisionBinaryFile() { Size = size };
|
||||
Dispatcher.UIThread.Invoke(() => ViewContent = new FileHistoriesRevisionFile(_file, binaryFile, true));
|
||||
await Dispatcher.UIThread.InvokeAsync(() => ViewContent = new FileHistoriesRevisionFile(_file, binaryFile, true));
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
var contentStream = Commands.QueryFileContent.Run(_repo.FullPath, _revision.SHA, _file);
|
||||
var content = new StreamReader(contentStream).ReadToEnd();
|
||||
var contentStream = await Commands.QueryFileContent.RunAsync(_repo.FullPath, _revision.SHA, _file);
|
||||
var content = await new StreamReader(contentStream).ReadToEndAsync();
|
||||
var lfs = Models.LFSObject.Parse(content);
|
||||
if (lfs != null)
|
||||
{
|
||||
@@ -119,34 +116,34 @@ namespace SourceGit.ViewModels
|
||||
if (imgDecoder != Models.ImageDecoder.None)
|
||||
{
|
||||
var combined = new RevisionLFSImage(_repo.FullPath, _file, lfs, imgDecoder);
|
||||
Dispatcher.UIThread.Invoke(() => ViewContent = new FileHistoriesRevisionFile(_file, combined, true));
|
||||
await Dispatcher.UIThread.InvokeAsync(() => ViewContent = new FileHistoriesRevisionFile(_file, combined, true));
|
||||
}
|
||||
else
|
||||
{
|
||||
var rlfs = new Models.RevisionLFSObject() { Object = lfs };
|
||||
Dispatcher.UIThread.Invoke(() => ViewContent = new FileHistoriesRevisionFile(_file, rlfs, true));
|
||||
await Dispatcher.UIThread.InvokeAsync(() => ViewContent = new FileHistoriesRevisionFile(_file, rlfs, true));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var txt = new Models.RevisionTextFile() { FileName = obj.Path, Content = content };
|
||||
Dispatcher.UIThread.Invoke(() => ViewContent = new FileHistoriesRevisionFile(_file, txt, true));
|
||||
await Dispatcher.UIThread.InvokeAsync(() => ViewContent = new FileHistoriesRevisionFile(_file, txt, true));
|
||||
}
|
||||
});
|
||||
break;
|
||||
case Models.ObjectType.Commit:
|
||||
Task.Run(() =>
|
||||
Task.Run(async () =>
|
||||
{
|
||||
var submoduleRoot = Path.Combine(_repo.FullPath, _file);
|
||||
var commit = new Commands.QuerySingleCommit(submoduleRoot, obj.SHA).Result();
|
||||
var message = commit != null ? new Commands.QueryCommitFullMessage(submoduleRoot, obj.SHA).Result() : null;
|
||||
var commit = await new Commands.QuerySingleCommit(submoduleRoot, obj.SHA).ResultAsync();
|
||||
var message = commit != null ? await new Commands.QueryCommitFullMessage(submoduleRoot, obj.SHA).ResultAsync() : null;
|
||||
var module = new Models.RevisionSubmodule()
|
||||
{
|
||||
Commit = commit ?? new Models.Commit() { SHA = obj.SHA },
|
||||
FullMessage = new Models.CommitFullMessage { Message = message }
|
||||
};
|
||||
|
||||
Dispatcher.UIThread.Invoke(() => ViewContent = new FileHistoriesRevisionFile(_file, module));
|
||||
await Dispatcher.UIThread.InvokeAsync(() => ViewContent = new FileHistoriesRevisionFile(_file, module));
|
||||
});
|
||||
break;
|
||||
default:
|
||||
@@ -203,28 +200,27 @@ namespace SourceGit.ViewModels
|
||||
RefreshViewContent();
|
||||
}
|
||||
|
||||
public Task<bool> SaveAsPatch(string saveTo)
|
||||
public async Task<bool> SaveAsPatch(string saveTo)
|
||||
{
|
||||
return Task.Run(() =>
|
||||
{
|
||||
Commands.SaveChangesAsPatch.ProcessRevisionCompareChanges(_repo.FullPath, _changes, _startPoint.SHA, _endPoint.SHA, saveTo);
|
||||
await Commands.SaveChangesAsPatch.ProcessRevisionCompareChangesAsync(_repo.FullPath, _changes, _startPoint.SHA, _endPoint.SHA, saveTo);
|
||||
return true;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private void RefreshViewContent()
|
||||
{
|
||||
Task.Run(() =>
|
||||
Task.Run(async () =>
|
||||
{
|
||||
_changes = new Commands.CompareRevisions(_repo.FullPath, _startPoint.SHA, _endPoint.SHA, _file).Result();
|
||||
_changes = await new Commands.CompareRevisions(_repo.FullPath, _startPoint.SHA, _endPoint.SHA, _file).ResultAsync();
|
||||
if (_changes.Count == 0)
|
||||
{
|
||||
Dispatcher.UIThread.Invoke(() => ViewContent = null);
|
||||
await Dispatcher.UIThread.InvokeAsync(() => ViewContent = null);
|
||||
return;
|
||||
}
|
||||
|
||||
var option = new Models.DiffOption(_startPoint.SHA, _endPoint.SHA, _changes[0]);
|
||||
Dispatcher.UIThread.Invoke(() => ViewContent = new DiffContext(_repo.FullPath, option, _viewContent));
|
||||
await Dispatcher.UIThread.InvokeAsync(() => ViewContent = new DiffContext(_repo.FullPath, option, _viewContent));
|
||||
});
|
||||
}
|
||||
|
||||
@@ -276,11 +272,11 @@ namespace SourceGit.ViewModels
|
||||
|
||||
_repo = repo;
|
||||
|
||||
Task.Run(() =>
|
||||
Task.Run(async () =>
|
||||
{
|
||||
var based = commit ?? string.Empty;
|
||||
var commits = new Commands.QueryCommits(_repo.FullPath, $"--date-order -n 10000 {based} -- \"{file}\"", false).Result();
|
||||
Dispatcher.UIThread.Invoke(() =>
|
||||
var commits = await new Commands.QueryCommits(_repo.FullPath, $"--date-order -n 10000 {based} -- \"{file}\"", false).ResultAsync();
|
||||
await Dispatcher.UIThread.InvokeAsync(() =>
|
||||
{
|
||||
IsLoading = false;
|
||||
Commits = commits;
|
||||
|
||||
@@ -40,7 +40,7 @@ namespace SourceGit.ViewModels
|
||||
Type = type;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = $"Git Flow - Finish {Branch.Name} ...";
|
||||
@@ -51,13 +51,10 @@ namespace SourceGit.ViewModels
|
||||
var prefix = _repo.GitFlow.GetPrefix(Type);
|
||||
var name = Branch.Name.StartsWith(prefix) ? Branch.Name.Substring(prefix.Length) : Branch.Name;
|
||||
|
||||
return Task.Run(() =>
|
||||
{
|
||||
var succ = Commands.GitFlow.Finish(_repo.FullPath, Type, name, Squash, AutoPush, KeepBranch, log);
|
||||
log.Complete();
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
});
|
||||
var succ = await Commands.GitFlow.FinishAsync(_repo.FullPath, Type, name, Squash, AutoPush, KeepBranch, log);
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
}
|
||||
|
||||
private readonly Repository _repo;
|
||||
|
||||
@@ -49,7 +49,7 @@ namespace SourceGit.ViewModels
|
||||
return ValidationResult.Success;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = $"Git Flow - Start {Prefix}{_name} ...";
|
||||
@@ -57,13 +57,10 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog("GitFlow - Start");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
{
|
||||
var succ = Commands.GitFlow.Start(_repo.FullPath, Type, _name, log);
|
||||
log.Complete();
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
});
|
||||
var succ = await Commands.GitFlow.StartAsync(_repo.FullPath, Type, _name, log);
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
}
|
||||
|
||||
private readonly Repository _repo;
|
||||
|
||||
@@ -3,7 +3,6 @@ using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Platform.Storage;
|
||||
@@ -393,7 +392,7 @@ namespace SourceGit.ViewModels
|
||||
for (var i = 0; i < selected.Count; i++)
|
||||
{
|
||||
var saveTo = GetPatchFileName(folderPath, selected[i], i);
|
||||
succ = await Task.Run(() => new Commands.FormatPatch(_repo.FullPath, selected[i].SHA, saveTo).Use(log).Exec());
|
||||
succ = await new Commands.FormatPatch(_repo.FullPath, selected[i].SHA, saveTo).Use(log).ExecAsync();
|
||||
if (!succ)
|
||||
break;
|
||||
}
|
||||
@@ -588,7 +587,7 @@ namespace SourceGit.ViewModels
|
||||
var cherryPick = new MenuItem();
|
||||
cherryPick.Header = App.Text("CommitCM.CherryPick");
|
||||
cherryPick.Icon = App.CreateMenuIcon("Icons.CherryPick");
|
||||
cherryPick.Click += (_, e) =>
|
||||
cherryPick.Click += async (_, e) =>
|
||||
{
|
||||
if (_repo.CanCreatePopup())
|
||||
{
|
||||
@@ -601,7 +600,7 @@ namespace SourceGit.ViewModels
|
||||
var parents = new List<Models.Commit>();
|
||||
foreach (var sha in commit.Parents)
|
||||
{
|
||||
var parent = _commits.Find(x => x.SHA == sha) ?? new Commands.QuerySingleCommit(_repo.FullPath, sha).Result();
|
||||
var parent = _commits.Find(x => x.SHA == sha) ?? await new Commands.QuerySingleCommit(_repo.FullPath, sha).ResultAsync();
|
||||
|
||||
if (parent != null)
|
||||
parents.Add(parent);
|
||||
@@ -685,13 +684,13 @@ namespace SourceGit.ViewModels
|
||||
var compareWithHead = new MenuItem();
|
||||
compareWithHead.Header = App.Text("CommitCM.CompareWithHead");
|
||||
compareWithHead.Icon = App.CreateMenuIcon("Icons.Compare");
|
||||
compareWithHead.Click += (_, e) =>
|
||||
compareWithHead.Click += async (_, e) =>
|
||||
{
|
||||
var head = _commits.Find(x => x.SHA == current.Head);
|
||||
if (head == null)
|
||||
{
|
||||
_repo.SelectedSearchedCommit = null;
|
||||
head = new Commands.QuerySingleCommit(_repo.FullPath, current.Head).Result();
|
||||
head = await new Commands.QuerySingleCommit(_repo.FullPath, current.Head).ResultAsync();
|
||||
if (head != null)
|
||||
DetailContext = new RevisionCompare(_repo.FullPath, commit, head);
|
||||
}
|
||||
@@ -764,7 +763,7 @@ namespace SourceGit.ViewModels
|
||||
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());
|
||||
var succ = await new Commands.FormatPatch(_repo.FullPath, commit.SHA, saveTo).Use(log).ExecAsync();
|
||||
if (succ)
|
||||
App.SendNotification(_repo.FullPath, App.Text("SaveAsPatchSuccess"));
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace SourceGit.ViewModels
|
||||
{
|
||||
@@ -10,27 +11,27 @@ namespace SourceGit.ViewModels
|
||||
_cmd = cmd;
|
||||
}
|
||||
|
||||
public bool Abort()
|
||||
public Task<bool> AbortAsync()
|
||||
{
|
||||
return new Commands.Command()
|
||||
{
|
||||
WorkingDirectory = _repo,
|
||||
Context = _repo,
|
||||
Args = $"{_cmd} --abort",
|
||||
}.Exec();
|
||||
}.ExecAsync();
|
||||
}
|
||||
|
||||
public virtual bool Skip()
|
||||
public virtual Task<bool> SkipAsync()
|
||||
{
|
||||
return new Commands.Command()
|
||||
{
|
||||
WorkingDirectory = _repo,
|
||||
Context = _repo,
|
||||
Args = $"{_cmd} --skip",
|
||||
}.Exec();
|
||||
}.ExecAsync();
|
||||
}
|
||||
|
||||
public virtual bool Continue()
|
||||
public virtual Task<bool> ContinueAsync()
|
||||
{
|
||||
return new Commands.Command()
|
||||
{
|
||||
@@ -38,7 +39,7 @@ namespace SourceGit.ViewModels
|
||||
Context = _repo,
|
||||
Editor = Commands.Command.EditorType.None,
|
||||
Args = $"{_cmd} --continue",
|
||||
}.Exec();
|
||||
}.ExecAsync();
|
||||
}
|
||||
|
||||
protected string GetFriendlyNameOfCommit(Models.Commit commit)
|
||||
@@ -123,7 +124,7 @@ namespace SourceGit.ViewModels
|
||||
Onto = new Commands.QuerySingleCommit(repo.FullPath, ontoSHA).Result() ?? new Models.Commit() { SHA = ontoSHA };
|
||||
}
|
||||
|
||||
public override bool Continue()
|
||||
public override Task<bool> ContinueAsync()
|
||||
{
|
||||
return new Commands.Command()
|
||||
{
|
||||
@@ -131,7 +132,7 @@ namespace SourceGit.ViewModels
|
||||
Context = _repo,
|
||||
Editor = Commands.Command.EditorType.RebaseEditor,
|
||||
Args = "rebase --continue",
|
||||
}.Exec();
|
||||
}.ExecAsync();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -177,9 +178,9 @@ namespace SourceGit.ViewModels
|
||||
Source = new Commands.QuerySingleCommit(repo.FullPath, sourceSHA).Result() ?? new Models.Commit() { SHA = sourceSHA };
|
||||
}
|
||||
|
||||
public override bool Skip()
|
||||
public override Task<bool> SkipAsync()
|
||||
{
|
||||
return true;
|
||||
return Task.FromResult(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,29 +24,26 @@ namespace SourceGit.ViewModels
|
||||
Reason = string.IsNullOrEmpty(reason) ? "Invalid repository detected!" : reason;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
ProgressDescription = $"Initialize git repository at: '{_targetPath}'";
|
||||
|
||||
var log = new CommandLog("Initialize");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
var succ = await new Commands.Init(_pageId, _targetPath).Use(log).ExecAsync();
|
||||
log.Complete();
|
||||
|
||||
if (succ)
|
||||
{
|
||||
var succ = new Commands.Init(_pageId, _targetPath).Use(log).Exec();
|
||||
log.Complete();
|
||||
|
||||
if (succ)
|
||||
await CallUIThreadAsync(() =>
|
||||
{
|
||||
CallUIThread(() =>
|
||||
{
|
||||
Preferences.Instance.FindOrAddNodeByRepositoryPath(_targetPath, _parentNode, true);
|
||||
Welcome.Instance.Refresh();
|
||||
});
|
||||
}
|
||||
Preferences.Instance.FindOrAddNodeByRepositoryPath(_targetPath, _parentNode, true);
|
||||
Welcome.Instance.Refresh();
|
||||
});
|
||||
}
|
||||
|
||||
return succ;
|
||||
});
|
||||
return succ;
|
||||
}
|
||||
|
||||
private readonly string _pageId = null;
|
||||
|
||||
@@ -100,7 +100,7 @@ namespace SourceGit.ViewModels
|
||||
return ValidationResult.Success;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = "Init git-flow ...";
|
||||
@@ -108,65 +108,62 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog("Gitflow - Init");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
bool succ;
|
||||
var current = _repo.CurrentBranch;
|
||||
|
||||
var masterBranch = _repo.Branches.Find(x => x.IsLocal && x.Name.Equals(_master, StringComparison.Ordinal));
|
||||
if (masterBranch == null)
|
||||
{
|
||||
bool succ;
|
||||
var current = _repo.CurrentBranch;
|
||||
|
||||
var masterBranch = _repo.Branches.Find(x => x.IsLocal && x.Name.Equals(_master, StringComparison.Ordinal));
|
||||
if (masterBranch == null)
|
||||
succ = await Commands.Branch.CreateAsync(_repo.FullPath, _master, current.Head, true, log);
|
||||
if (!succ)
|
||||
{
|
||||
succ = Commands.Branch.Create(_repo.FullPath, _master, current.Head, true, log);
|
||||
if (!succ)
|
||||
{
|
||||
log.Complete();
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return false;
|
||||
}
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
var developBranch = _repo.Branches.Find(x => x.IsLocal && x.Name.Equals(_develop, StringComparison.Ordinal));
|
||||
if (developBranch == null)
|
||||
{
|
||||
succ = await Commands.Branch.CreateAsync(_repo.FullPath, _develop, current.Head, true, log);
|
||||
if (!succ)
|
||||
{
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
succ = await Commands.GitFlow.InitAsync(
|
||||
_repo.FullPath,
|
||||
_master,
|
||||
_develop,
|
||||
_featurePrefix,
|
||||
_releasePrefix,
|
||||
_hotfixPrefix,
|
||||
_tagPrefix,
|
||||
log);
|
||||
|
||||
log.Complete();
|
||||
|
||||
await CallUIThreadAsync(() =>
|
||||
{
|
||||
if (succ)
|
||||
{
|
||||
var gitflow = new Models.GitFlow();
|
||||
gitflow.Master = _master;
|
||||
gitflow.Develop = _develop;
|
||||
gitflow.FeaturePrefix = _featurePrefix;
|
||||
gitflow.ReleasePrefix = _releasePrefix;
|
||||
gitflow.HotfixPrefix = _hotfixPrefix;
|
||||
_repo.GitFlow = gitflow;
|
||||
}
|
||||
|
||||
var developBranch = _repo.Branches.Find(x => x.IsLocal && x.Name.Equals(_develop, StringComparison.Ordinal));
|
||||
if (developBranch == null)
|
||||
{
|
||||
succ = Commands.Branch.Create(_repo.FullPath, _develop, current.Head, true, log);
|
||||
if (!succ)
|
||||
{
|
||||
log.Complete();
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
succ = Commands.GitFlow.Init(
|
||||
_repo.FullPath,
|
||||
_master,
|
||||
_develop,
|
||||
_featurePrefix,
|
||||
_releasePrefix,
|
||||
_hotfixPrefix,
|
||||
_tagPrefix,
|
||||
log);
|
||||
|
||||
log.Complete();
|
||||
|
||||
CallUIThread(() =>
|
||||
{
|
||||
if (succ)
|
||||
{
|
||||
var gitflow = new Models.GitFlow();
|
||||
gitflow.Master = _master;
|
||||
gitflow.Develop = _develop;
|
||||
gitflow.FeaturePrefix = _featurePrefix;
|
||||
gitflow.ReleasePrefix = _releasePrefix;
|
||||
gitflow.HotfixPrefix = _hotfixPrefix;
|
||||
_repo.GitFlow = gitflow;
|
||||
}
|
||||
|
||||
_repo.SetWatcherEnabled(true);
|
||||
});
|
||||
|
||||
return succ;
|
||||
_repo.SetWatcherEnabled(true);
|
||||
});
|
||||
|
||||
return succ;
|
||||
}
|
||||
|
||||
private readonly Repository _repo;
|
||||
|
||||
@@ -131,9 +131,9 @@ namespace SourceGit.ViewModels
|
||||
IsLoading = true;
|
||||
DetailContext = new CommitDetail(repo, false);
|
||||
|
||||
Task.Run(() =>
|
||||
Task.Run(async () =>
|
||||
{
|
||||
var commits = new Commands.QueryCommitsForInteractiveRebase(repoPath, on.SHA).Result();
|
||||
var commits = await new Commands.QueryCommitsForInteractiveRebase(repoPath, on.SHA).ResultAsync();
|
||||
var list = new List<InteractiveRebaseItem>();
|
||||
|
||||
for (var i = 0; i < commits.Count; i++)
|
||||
@@ -142,7 +142,7 @@ namespace SourceGit.ViewModels
|
||||
list.Add(new InteractiveRebaseItem(c.Commit, c.Message, i < commits.Count - 1));
|
||||
}
|
||||
|
||||
Dispatcher.UIThread.Invoke(() =>
|
||||
await Dispatcher.UIThread.InvokeAsync(() =>
|
||||
{
|
||||
Items.AddRange(list);
|
||||
IsLoading = false;
|
||||
@@ -188,7 +188,7 @@ namespace SourceGit.ViewModels
|
||||
UpdateItems();
|
||||
}
|
||||
|
||||
public Task<bool> Start()
|
||||
public async Task<bool> Start()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
|
||||
@@ -206,19 +206,16 @@ namespace SourceGit.ViewModels
|
||||
Message = item.FullMessage,
|
||||
});
|
||||
}
|
||||
using (var stream = File.Create(saveFile))
|
||||
await using (var stream = File.Create(saveFile))
|
||||
{
|
||||
JsonSerializer.Serialize(stream, collection, JsonCodeGen.Default.InteractiveRebaseJobCollection);
|
||||
await JsonSerializer.SerializeAsync(stream, collection, JsonCodeGen.Default.InteractiveRebaseJobCollection);
|
||||
}
|
||||
|
||||
var log = _repo.CreateLog("Interactive Rebase");
|
||||
return Task.Run(() =>
|
||||
{
|
||||
var succ = new Commands.InteractiveRebase(_repo.FullPath, On.SHA).Use(log).Exec();
|
||||
log.Complete();
|
||||
Dispatcher.UIThread.Invoke(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
});
|
||||
var succ = await new Commands.InteractiveRebase(_repo.FullPath, On.SHA).Use(log).ExecAsync();
|
||||
log.Complete();
|
||||
await Dispatcher.UIThread.InvokeAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
}
|
||||
|
||||
private void UpdateItems()
|
||||
|
||||
@@ -19,7 +19,7 @@ namespace SourceGit.ViewModels
|
||||
SelectedRemote = _repo.Remotes[0];
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = "Fetching LFS objects from remote ...";
|
||||
@@ -27,13 +27,10 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog("LFS Fetch");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
{
|
||||
new Commands.LFS(_repo.FullPath).Fetch(SelectedRemote.Name, log);
|
||||
log.Complete();
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return true;
|
||||
});
|
||||
await new Commands.LFS(_repo.FullPath).FetchAsync(SelectedRemote.Name, log);
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return true;
|
||||
}
|
||||
|
||||
private readonly Repository _repo = null;
|
||||
|
||||
@@ -46,10 +46,10 @@ namespace SourceGit.ViewModels
|
||||
|
||||
HasValidUserName = !string.IsNullOrEmpty(_userName);
|
||||
|
||||
Task.Run(() =>
|
||||
Task.Run(async () =>
|
||||
{
|
||||
_cachedLocks = new Commands.LFS(_repo.FullPath).Locks(_remote);
|
||||
Dispatcher.UIThread.Invoke(() =>
|
||||
_cachedLocks = await new Commands.LFS(_repo.FullPath).LocksAsync(_remote);
|
||||
await Dispatcher.UIThread.InvokeAsync(() =>
|
||||
{
|
||||
UpdateVisibleLocks();
|
||||
IsLoading = false;
|
||||
@@ -65,12 +65,12 @@ namespace SourceGit.ViewModels
|
||||
IsLoading = true;
|
||||
|
||||
var log = _repo.CreateLog("Unlock LFS File");
|
||||
Task.Run(() =>
|
||||
Task.Run(async () =>
|
||||
{
|
||||
var succ = new Commands.LFS(_repo.FullPath).Unlock(_remote, lfsLock.ID, force, log);
|
||||
var succ = await new Commands.LFS(_repo.FullPath).UnlockAsync(_remote, lfsLock.ID, force, log);
|
||||
log.Complete();
|
||||
|
||||
Dispatcher.UIThread.Invoke(() =>
|
||||
await Dispatcher.UIThread.InvokeAsync(() =>
|
||||
{
|
||||
if (succ)
|
||||
{
|
||||
|
||||
@@ -9,7 +9,7 @@ namespace SourceGit.ViewModels
|
||||
_repo = repo;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = "LFS prune ...";
|
||||
@@ -17,13 +17,10 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog("LFS Prune");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
{
|
||||
new Commands.LFS(_repo.FullPath).Prune(log);
|
||||
log.Complete();
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return true;
|
||||
});
|
||||
await new Commands.LFS(_repo.FullPath).PruneAsync(log);
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return true;
|
||||
}
|
||||
|
||||
private readonly Repository _repo = null;
|
||||
|
||||
@@ -19,7 +19,7 @@ namespace SourceGit.ViewModels
|
||||
SelectedRemote = _repo.Remotes[0];
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = "Pull LFS objects from remote ...";
|
||||
@@ -27,13 +27,10 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog("LFS Pull");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
{
|
||||
new Commands.LFS(_repo.FullPath).Pull(SelectedRemote.Name, log);
|
||||
log.Complete();
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return true;
|
||||
});
|
||||
await new Commands.LFS(_repo.FullPath).PullAsync(SelectedRemote.Name, log);
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return true;
|
||||
}
|
||||
|
||||
private readonly Repository _repo = null;
|
||||
|
||||
@@ -19,7 +19,7 @@ namespace SourceGit.ViewModels
|
||||
SelectedRemote = _repo.Remotes[0];
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = "Push LFS objects to remote ...";
|
||||
@@ -27,13 +27,10 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog("LFS Push");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
{
|
||||
new Commands.LFS(_repo.FullPath).Push(SelectedRemote.Name, log);
|
||||
log.Complete();
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return true;
|
||||
});
|
||||
await new Commands.LFS(_repo.FullPath).PushAsync(SelectedRemote.Name, log);
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return true;
|
||||
}
|
||||
|
||||
private readonly Repository _repo = null;
|
||||
|
||||
@@ -23,7 +23,7 @@ namespace SourceGit.ViewModels
|
||||
_repo = repo;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = "Adding custom LFS tracking pattern ...";
|
||||
@@ -31,13 +31,10 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog("LFS Add Custom Pattern");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
{
|
||||
var succ = new Commands.LFS(_repo.FullPath).Track(_pattern, IsFilename, log);
|
||||
log.Complete();
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
});
|
||||
var succ = await new Commands.LFS(_repo.FullPath).TrackAsync(_pattern, IsFilename, log);
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
}
|
||||
|
||||
private readonly Repository _repo = null;
|
||||
|
||||
@@ -56,7 +56,7 @@ namespace SourceGit.ViewModels
|
||||
Mode = AutoSelectMergeMode();
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
_repo.ClearCommitMessage();
|
||||
@@ -65,19 +65,16 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog($"Merging '{_sourceName}' into '{Into}'");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
{
|
||||
new Commands.Merge(_repo.FullPath, _sourceName, Mode.Arg, Edit).Use(log).Exec();
|
||||
log.Complete();
|
||||
await new Commands.Merge(_repo.FullPath, _sourceName, Mode.Arg, Edit).Use(log).ExecAsync();
|
||||
log.Complete();
|
||||
|
||||
var head = new Commands.QueryRevisionByRefName(_repo.FullPath, "HEAD").Result();
|
||||
CallUIThread(() =>
|
||||
{
|
||||
_repo.NavigateToCommit(head, true);
|
||||
_repo.SetWatcherEnabled(true);
|
||||
});
|
||||
return true;
|
||||
var head = await new Commands.QueryRevisionByRefName(_repo.FullPath, "HEAD").ResultAsync();
|
||||
await CallUIThreadAsync(() =>
|
||||
{
|
||||
_repo.NavigateToCommit(head, true);
|
||||
_repo.SetWatcherEnabled(true);
|
||||
});
|
||||
return true;
|
||||
}
|
||||
|
||||
private Models.MergeMode AutoSelectMergeMode()
|
||||
|
||||
@@ -38,7 +38,7 @@ namespace SourceGit.ViewModels
|
||||
Strategy = Models.MergeStrategy.ForMultiple[0];
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
_repo.ClearCommitMessage();
|
||||
@@ -47,18 +47,15 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog("Merge Multiple Heads");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
{
|
||||
new Commands.Merge(
|
||||
_repo.FullPath,
|
||||
ConvertTargetToMergeSources(),
|
||||
AutoCommit,
|
||||
Strategy.Arg).Use(log).Exec();
|
||||
await new Commands.Merge(
|
||||
_repo.FullPath,
|
||||
ConvertTargetToMergeSources(),
|
||||
AutoCommit,
|
||||
Strategy.Arg).Use(log).ExecAsync();
|
||||
|
||||
log.Complete();
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return true;
|
||||
});
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return true;
|
||||
}
|
||||
|
||||
private List<string> ConvertTargetToMergeSources()
|
||||
|
||||
@@ -46,6 +46,11 @@ namespace SourceGit.ViewModels
|
||||
Dispatcher.UIThread.Invoke(action);
|
||||
}
|
||||
|
||||
protected async Task CallUIThreadAsync(Action action)
|
||||
{
|
||||
await Dispatcher.UIThread.InvokeAsync(action);
|
||||
}
|
||||
|
||||
protected void Use(CommandLog log)
|
||||
{
|
||||
log.Register(SetDescription);
|
||||
|
||||
@@ -15,7 +15,7 @@ namespace SourceGit.ViewModels
|
||||
Remote = remote;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = "Run `prune` on remote ...";
|
||||
@@ -23,13 +23,10 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog($"Prune Remote '{Remote.Name}'");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
{
|
||||
var succ = new Commands.Remote(_repo.FullPath).Use(log).Prune(Remote.Name);
|
||||
log.Complete();
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
});
|
||||
var succ = await new Commands.Remote(_repo.FullPath).Use(log).PruneAsync(Remote.Name);
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
}
|
||||
|
||||
private readonly Repository _repo = null;
|
||||
|
||||
@@ -9,7 +9,7 @@ namespace SourceGit.ViewModels
|
||||
_repo = repo;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = "Prune worktrees ...";
|
||||
@@ -17,13 +17,10 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog("Prune Worktrees");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
{
|
||||
new Commands.Worktree(_repo.FullPath).Use(log).Prune();
|
||||
log.Complete();
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return true;
|
||||
});
|
||||
await new Commands.Worktree(_repo.FullPath).Use(log).PruneAsync();
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return true;
|
||||
}
|
||||
|
||||
private readonly Repository _repo = null;
|
||||
|
||||
@@ -111,7 +111,7 @@ namespace SourceGit.ViewModels
|
||||
}
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
|
||||
@@ -119,60 +119,57 @@ namespace SourceGit.ViewModels
|
||||
Use(log);
|
||||
|
||||
var updateSubmodules = IsRecurseSubmoduleVisible && RecurseSubmodules;
|
||||
return Task.Run(() =>
|
||||
var changes = await new Commands.CountLocalChangesWithoutUntracked(_repo.FullPath).ResultAsync();
|
||||
var needPopStash = false;
|
||||
if (changes > 0)
|
||||
{
|
||||
var changes = new Commands.CountLocalChangesWithoutUntracked(_repo.FullPath).Result();
|
||||
var needPopStash = false;
|
||||
if (changes > 0)
|
||||
if (DiscardLocalChanges)
|
||||
{
|
||||
if (DiscardLocalChanges)
|
||||
await Commands.Discard.AllAsync(_repo.FullPath, false, log);
|
||||
}
|
||||
else
|
||||
{
|
||||
var succ = await new Commands.Stash(_repo.FullPath).Use(log).PushAsync("PULL_AUTO_STASH");
|
||||
if (!succ)
|
||||
{
|
||||
Commands.Discard.All(_repo.FullPath, false, log);
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
var succ = new Commands.Stash(_repo.FullPath).Use(log).Push("PULL_AUTO_STASH");
|
||||
if (!succ)
|
||||
{
|
||||
log.Complete();
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return false;
|
||||
}
|
||||
|
||||
needPopStash = true;
|
||||
}
|
||||
needPopStash = true;
|
||||
}
|
||||
}
|
||||
|
||||
bool rs = await new Commands.Pull(
|
||||
_repo.FullPath,
|
||||
_selectedRemote.Name,
|
||||
!string.IsNullOrEmpty(Current.Upstream) && Current.Upstream.Equals(_selectedBranch.FullName) ? string.Empty : _selectedBranch.Name,
|
||||
UseRebase).Use(log).ExecAsync();
|
||||
|
||||
if (rs)
|
||||
{
|
||||
if (updateSubmodules)
|
||||
{
|
||||
var submodules = await new Commands.QueryUpdatableSubmodules(_repo.FullPath).ResultAsync();
|
||||
if (submodules.Count > 0)
|
||||
await new Commands.Submodule(_repo.FullPath).Use(log).UpdateAsync(submodules, true, true);
|
||||
}
|
||||
|
||||
bool rs = new Commands.Pull(
|
||||
_repo.FullPath,
|
||||
_selectedRemote.Name,
|
||||
!string.IsNullOrEmpty(Current.Upstream) && Current.Upstream.Equals(_selectedBranch.FullName) ? string.Empty : _selectedBranch.Name,
|
||||
UseRebase).Use(log).Exec();
|
||||
if (needPopStash)
|
||||
await new Commands.Stash(_repo.FullPath).Use(log).PopAsync("stash@{0}");
|
||||
}
|
||||
|
||||
if (rs)
|
||||
{
|
||||
if (updateSubmodules)
|
||||
{
|
||||
var submodules = new Commands.QueryUpdatableSubmodules(_repo.FullPath).Result();
|
||||
if (submodules.Count > 0)
|
||||
new Commands.Submodule(_repo.FullPath).Use(log).Update(submodules, true, true);
|
||||
}
|
||||
log.Complete();
|
||||
|
||||
if (needPopStash)
|
||||
new Commands.Stash(_repo.FullPath).Use(log).Pop("stash@{0}");
|
||||
}
|
||||
|
||||
log.Complete();
|
||||
|
||||
var head = new Commands.QueryRevisionByRefName(_repo.FullPath, "HEAD").Result();
|
||||
CallUIThread(() =>
|
||||
{
|
||||
_repo.NavigateToCommit(head, true);
|
||||
_repo.SetWatcherEnabled(true);
|
||||
});
|
||||
|
||||
return rs;
|
||||
var head = await new Commands.QueryRevisionByRefName(_repo.FullPath, "HEAD").ResultAsync();
|
||||
await CallUIThreadAsync(() =>
|
||||
{
|
||||
_repo.NavigateToCommit(head, true);
|
||||
_repo.SetWatcherEnabled(true);
|
||||
});
|
||||
|
||||
return rs;
|
||||
}
|
||||
|
||||
private void PostRemoteSelected()
|
||||
|
||||
@@ -158,7 +158,7 @@ namespace SourceGit.ViewModels
|
||||
return !string.IsNullOrEmpty(_selectedRemoteBranch?.Head);
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
|
||||
@@ -168,22 +168,19 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog("Push");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
{
|
||||
var succ = new Commands.Push(
|
||||
_repo.FullPath,
|
||||
_selectedLocalBranch.Name,
|
||||
_selectedRemote.Name,
|
||||
remoteBranchName,
|
||||
PushAllTags,
|
||||
_repo.Submodules.Count > 0 && CheckSubmodules,
|
||||
_isSetTrackOptionVisible && Tracking,
|
||||
ForcePush).Use(log).Exec();
|
||||
var succ = await new Commands.Push(
|
||||
_repo.FullPath,
|
||||
_selectedLocalBranch.Name,
|
||||
_selectedRemote.Name,
|
||||
remoteBranchName,
|
||||
PushAllTags,
|
||||
_repo.Submodules.Count > 0 && CheckSubmodules,
|
||||
_isSetTrackOptionVisible && Tracking,
|
||||
ForcePush).Use(log).ExecAsync();
|
||||
|
||||
log.Complete();
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
});
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
}
|
||||
|
||||
private void AutoSelectBranchByRemote()
|
||||
|
||||
@@ -28,7 +28,7 @@ namespace SourceGit.ViewModels
|
||||
Force = false;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = $"Push {Revision.SHA.Substring(0, 10)} -> {RemoteBranch.FriendlyName} ...";
|
||||
@@ -36,22 +36,19 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog("Push Revision");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
{
|
||||
var succ = new Commands.Push(
|
||||
_repo.FullPath,
|
||||
Revision.SHA,
|
||||
RemoteBranch.Remote,
|
||||
RemoteBranch.Name,
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
Force).Use(log).Exec();
|
||||
var succ = await new Commands.Push(
|
||||
_repo.FullPath,
|
||||
Revision.SHA,
|
||||
RemoteBranch.Remote,
|
||||
RemoteBranch.Name,
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
Force).Use(log).ExecAsync();
|
||||
|
||||
log.Complete();
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
});
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
}
|
||||
|
||||
private readonly Repository _repo;
|
||||
|
||||
@@ -34,7 +34,7 @@ namespace SourceGit.ViewModels
|
||||
SelectedRemote = _repo.Remotes[0];
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = "Pushing tag ...";
|
||||
@@ -42,28 +42,25 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog("Push Tag");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
var succ = true;
|
||||
var tag = $"refs/tags/{Target.Name}";
|
||||
if (_pushAllRemotes)
|
||||
{
|
||||
var succ = true;
|
||||
var tag = $"refs/tags/{Target.Name}";
|
||||
if (_pushAllRemotes)
|
||||
foreach (var remote in _repo.Remotes)
|
||||
{
|
||||
foreach (var remote in _repo.Remotes)
|
||||
{
|
||||
succ = new Commands.Push(_repo.FullPath, remote.Name, tag, false).Use(log).Exec();
|
||||
if (!succ)
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
succ = new Commands.Push(_repo.FullPath, SelectedRemote.Name, tag, false).Use(log).Exec();
|
||||
succ = await new Commands.Push(_repo.FullPath, remote.Name, tag, false).Use(log).ExecAsync();
|
||||
if (!succ)
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
succ = await new Commands.Push(_repo.FullPath, SelectedRemote.Name, tag, false).Use(log).ExecAsync();
|
||||
}
|
||||
|
||||
log.Complete();
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
});
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
}
|
||||
|
||||
private readonly Repository _repo = null;
|
||||
|
||||
@@ -40,7 +40,7 @@ namespace SourceGit.ViewModels
|
||||
AutoStash = true;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
_repo.ClearCommitMessage();
|
||||
@@ -49,13 +49,10 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog("Rebase");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
{
|
||||
new Commands.Rebase(_repo.FullPath, _revision, AutoStash).Use(log).Exec();
|
||||
log.Complete();
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return true;
|
||||
});
|
||||
await new Commands.Rebase(_repo.FullPath, _revision, AutoStash).Use(log).ExecAsync();
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return true;
|
||||
}
|
||||
|
||||
private readonly Repository _repo;
|
||||
|
||||
@@ -21,7 +21,7 @@ namespace SourceGit.ViewModels
|
||||
Target = target;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = "Remove worktree ...";
|
||||
@@ -29,13 +29,10 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog("Remove worktree");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
{
|
||||
var succ = new Commands.Worktree(_repo.FullPath).Use(log).Remove(Target.FullPath, Force);
|
||||
log.Complete();
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
});
|
||||
var succ = await new Commands.Worktree(_repo.FullPath).Use(log).RemoveAsync(Target.FullPath, Force);
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
}
|
||||
|
||||
private readonly Repository _repo = null;
|
||||
|
||||
@@ -44,11 +44,11 @@ namespace SourceGit.ViewModels
|
||||
return ValidationResult.Success;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
var fixedName = FixName(_name);
|
||||
if (fixedName == Target.Name)
|
||||
return null;
|
||||
return true;
|
||||
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = $"Rename '{Target.Name}'";
|
||||
@@ -56,39 +56,36 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog($"Rename Branch '{Target.Name}'");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
var isCurrent = Target.IsCurrent;
|
||||
var oldName = Target.FullName;
|
||||
var succ = await Commands.Branch.RenameAsync(_repo.FullPath, Target.Name, fixedName, log);
|
||||
log.Complete();
|
||||
|
||||
await CallUIThreadAsync(() =>
|
||||
{
|
||||
var isCurrent = Target.IsCurrent;
|
||||
var oldName = Target.FullName;
|
||||
var succ = Commands.Branch.Rename(_repo.FullPath, Target.Name, fixedName, log);
|
||||
log.Complete();
|
||||
ProgressDescription = "Waiting for branch updated...";
|
||||
|
||||
CallUIThread(() =>
|
||||
if (succ)
|
||||
{
|
||||
ProgressDescription = "Waiting for branch updated...";
|
||||
|
||||
if (succ)
|
||||
foreach (var filter in _repo.Settings.HistoriesFilters)
|
||||
{
|
||||
foreach (var filter in _repo.Settings.HistoriesFilters)
|
||||
if (filter.Type == Models.FilterType.LocalBranch &&
|
||||
filter.Pattern.Equals(oldName, StringComparison.Ordinal))
|
||||
{
|
||||
if (filter.Type == Models.FilterType.LocalBranch &&
|
||||
filter.Pattern.Equals(oldName, StringComparison.Ordinal))
|
||||
{
|
||||
filter.Pattern = $"refs/heads/{fixedName}";
|
||||
break;
|
||||
}
|
||||
filter.Pattern = $"refs/heads/{fixedName}";
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_repo.MarkBranchesDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
});
|
||||
|
||||
if (isCurrent)
|
||||
Task.Delay(400).Wait();
|
||||
|
||||
return succ;
|
||||
_repo.MarkBranchesDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
});
|
||||
|
||||
if (isCurrent)
|
||||
Task.Delay(400).Wait();
|
||||
|
||||
return succ;
|
||||
}
|
||||
|
||||
private string FixName(string name)
|
||||
|
||||
@@ -649,9 +649,9 @@ namespace SourceGit.ViewModels
|
||||
Task.Run(RefreshWorkingCopyChanges);
|
||||
Task.Run(RefreshStashes);
|
||||
|
||||
Task.Run(() =>
|
||||
Task.Run(async () =>
|
||||
{
|
||||
var config = new Commands.Config(_fullpath).ListAll();
|
||||
var config = await new Commands.Config(_fullpath).ListAllAsync();
|
||||
_hasAllowedSignersFile = config.TryGetValue("gpg.ssh.allowedSignersFile", out var allowedSignersFile) && !string.IsNullOrEmpty(allowedSignersFile);
|
||||
|
||||
if (config.TryGetValue("gitflow.branch.master", out var masterName))
|
||||
@@ -869,26 +869,26 @@ namespace SourceGit.ViewModels
|
||||
SelectedSearchedCommit = null;
|
||||
MatchedFilesForSearching = null;
|
||||
|
||||
Task.Run(() =>
|
||||
Task.Run(async () =>
|
||||
{
|
||||
var visible = new List<Models.Commit>();
|
||||
var method = (Models.CommitSearchMethod)_searchCommitFilterType;
|
||||
|
||||
if (method == Models.CommitSearchMethod.BySHA)
|
||||
{
|
||||
var isCommitSHA = new Commands.IsCommitSHA(_fullpath, _searchCommitFilter).Result();
|
||||
var isCommitSHA = await new Commands.IsCommitSHA(_fullpath, _searchCommitFilter).ResultAsync();
|
||||
if (isCommitSHA)
|
||||
{
|
||||
var commit = new Commands.QuerySingleCommit(_fullpath, _searchCommitFilter).Result();
|
||||
var commit = await new Commands.QuerySingleCommit(_fullpath, _searchCommitFilter).ResultAsync();
|
||||
visible.Add(commit);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
visible = new Commands.QueryCommits(_fullpath, _searchCommitFilter, method, _onlySearchCommitsInCurrentBranch).Result();
|
||||
visible = await new Commands.QueryCommits(_fullpath, _searchCommitFilter, method, _onlySearchCommitsInCurrentBranch).ResultAsync();
|
||||
}
|
||||
|
||||
Dispatcher.UIThread.Invoke(() =>
|
||||
await Dispatcher.UIThread.InvokeAsync(() =>
|
||||
{
|
||||
SearchedCommits = visible;
|
||||
IsSearchLoadingVisible = false;
|
||||
@@ -1102,13 +1102,13 @@ namespace SourceGit.ViewModels
|
||||
SetWatcherEnabled(false);
|
||||
|
||||
var log = CreateLog($"Bisect({subcmd})");
|
||||
Task.Run(() =>
|
||||
Task.Run(async () =>
|
||||
{
|
||||
var succ = new Commands.Bisect(_fullpath, subcmd).Use(log).Exec();
|
||||
var succ = await new Commands.Bisect(_fullpath, subcmd).Use(log).ExecAsync();
|
||||
log.Complete();
|
||||
|
||||
var head = new Commands.QueryRevisionByRefName(_fullpath, "HEAD").Result();
|
||||
Dispatcher.UIThread.Invoke(() =>
|
||||
var head = await new Commands.QueryRevisionByRefName(_fullpath, "HEAD").ResultAsync();
|
||||
await Dispatcher.UIThread.InvokeAsync(() =>
|
||||
{
|
||||
if (!succ)
|
||||
App.RaiseException(_fullpath, log.Content.Substring(log.Content.IndexOf('\n')).Trim());
|
||||
@@ -1722,10 +1722,10 @@ namespace SourceGit.ViewModels
|
||||
var install = new MenuItem();
|
||||
install.Header = App.Text("GitLFS.Install");
|
||||
install.Icon = App.CreateMenuIcon("Icons.Init");
|
||||
install.Click += (_, e) =>
|
||||
install.Click += async (_, e) =>
|
||||
{
|
||||
var log = CreateLog("Install LFS");
|
||||
var succ = new Commands.LFS(_fullpath).Install(log);
|
||||
var succ = await new Commands.LFS(_fullpath).InstallAsync(log);
|
||||
if (succ)
|
||||
App.SendNotification(_fullpath, "LFS enabled successfully!");
|
||||
|
||||
@@ -2020,13 +2020,13 @@ namespace SourceGit.ViewModels
|
||||
var compareWithWorktree = new MenuItem();
|
||||
compareWithWorktree.Header = App.Text("BranchCM.CompareWithWorktree");
|
||||
compareWithWorktree.Icon = App.CreateMenuIcon("Icons.Compare");
|
||||
compareWithWorktree.Click += (_, _) =>
|
||||
compareWithWorktree.Click += async (_, _) =>
|
||||
{
|
||||
SelectedSearchedCommit = null;
|
||||
|
||||
if (_histories != null)
|
||||
{
|
||||
var target = new Commands.QuerySingleCommit(_fullpath, branch.Head).Result();
|
||||
var target = await new Commands.QuerySingleCommit(_fullpath, branch.Head).ResultAsync();
|
||||
_histories.AutoSelectedCommit = null;
|
||||
_histories.DetailContext = new RevisionCompare(_fullpath, target, null);
|
||||
}
|
||||
@@ -2299,13 +2299,13 @@ namespace SourceGit.ViewModels
|
||||
var compareWithWorktree = new MenuItem();
|
||||
compareWithWorktree.Header = App.Text("BranchCM.CompareWithWorktree");
|
||||
compareWithWorktree.Icon = App.CreateMenuIcon("Icons.Compare");
|
||||
compareWithWorktree.Click += (_, _) =>
|
||||
compareWithWorktree.Click += async (_, _) =>
|
||||
{
|
||||
SelectedSearchedCommit = null;
|
||||
|
||||
if (_histories != null)
|
||||
{
|
||||
var target = new Commands.QuerySingleCommit(_fullpath, branch.Head).Result();
|
||||
var target = await new Commands.QuerySingleCommit(_fullpath, branch.Head).ResultAsync();
|
||||
_histories.AutoSelectedCommit = null;
|
||||
_histories.DetailContext = new RevisionCompare(_fullpath, target, null);
|
||||
}
|
||||
@@ -2631,11 +2631,11 @@ namespace SourceGit.ViewModels
|
||||
var unlock = new MenuItem();
|
||||
unlock.Header = App.Text("Worktree.Unlock");
|
||||
unlock.Icon = App.CreateMenuIcon("Icons.Unlock");
|
||||
unlock.Click += (_, ev) =>
|
||||
unlock.Click += async (_, ev) =>
|
||||
{
|
||||
SetWatcherEnabled(false);
|
||||
var log = CreateLog("Unlock Worktree");
|
||||
var succ = new Commands.Worktree(_fullpath).Use(log).Unlock(worktree.FullPath);
|
||||
var succ = await new Commands.Worktree(_fullpath).Use(log).UnlockAsync(worktree.FullPath);
|
||||
if (succ)
|
||||
worktree.IsLocked = false;
|
||||
log.Complete();
|
||||
@@ -2649,11 +2649,11 @@ namespace SourceGit.ViewModels
|
||||
var loc = new MenuItem();
|
||||
loc.Header = App.Text("Worktree.Lock");
|
||||
loc.Icon = App.CreateMenuIcon("Icons.Lock");
|
||||
loc.Click += (_, ev) =>
|
||||
loc.Click += async (_, ev) =>
|
||||
{
|
||||
SetWatcherEnabled(false);
|
||||
var log = CreateLog("Lock Worktree");
|
||||
var succ = new Commands.Worktree(_fullpath).Use(log).Lock(worktree.FullPath);
|
||||
var succ = await new Commands.Worktree(_fullpath).Use(log).LockAsync(worktree.FullPath);
|
||||
if (succ)
|
||||
worktree.IsLocked = true;
|
||||
log.Complete();
|
||||
@@ -2910,10 +2910,10 @@ namespace SourceGit.ViewModels
|
||||
|
||||
_requestingWorktreeFiles = true;
|
||||
|
||||
Task.Run(() =>
|
||||
Task.Run(async () =>
|
||||
{
|
||||
_worktreeFiles = new Commands.QueryRevisionFileNames(_fullpath, "HEAD").Result();
|
||||
Dispatcher.UIThread.Invoke(() =>
|
||||
_worktreeFiles = await new Commands.QueryRevisionFileNames(_fullpath, "HEAD").ResultAsync();
|
||||
await Dispatcher.UIThread.InvokeAsync(() =>
|
||||
{
|
||||
if (IsSearchingCommitsByFilePath() && _requestingWorktreeFiles)
|
||||
CalcMatchedFilesForSearching();
|
||||
@@ -2945,7 +2945,7 @@ namespace SourceGit.ViewModels
|
||||
MatchedFilesForSearching = matched;
|
||||
}
|
||||
|
||||
private void AutoFetchImpl(object sender)
|
||||
private async void AutoFetchImpl(object sender)
|
||||
{
|
||||
try
|
||||
{
|
||||
@@ -2970,7 +2970,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
Dispatcher.UIThread.Invoke(() => IsAutoFetching = true);
|
||||
foreach (var remote in remotes)
|
||||
new Commands.Fetch(_fullpath, remote, false, false) { RaiseError = false }.Exec();
|
||||
await new Commands.Fetch(_fullpath, remote, false, false) { RaiseError = false }.ExecAsync();
|
||||
_lastFetchTime = DateTime.Now;
|
||||
Dispatcher.UIThread.Invoke(() => IsAutoFetching = false);
|
||||
}
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using Avalonia.Collections;
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
|
||||
@@ -316,18 +318,18 @@ namespace SourceGit.ViewModels
|
||||
_repo.Settings.MoveCustomActionDown(_selectedCustomAction);
|
||||
}
|
||||
|
||||
public void Save()
|
||||
public async Task SaveAsync()
|
||||
{
|
||||
SetIfChanged("user.name", UserName, "");
|
||||
SetIfChanged("user.email", UserEmail, "");
|
||||
SetIfChanged("commit.gpgsign", GPGCommitSigningEnabled ? "true" : "false", "false");
|
||||
SetIfChanged("tag.gpgsign", GPGTagSigningEnabled ? "true" : "false", "false");
|
||||
SetIfChanged("user.signingkey", GPGUserSigningKey, "");
|
||||
SetIfChanged("http.proxy", HttpProxy, "");
|
||||
SetIfChanged("fetch.prune", EnablePruneOnFetch ? "true" : "false", "false");
|
||||
await SetIfChangedAsync("user.name", UserName, "");
|
||||
await SetIfChangedAsync("user.email", UserEmail, "");
|
||||
await SetIfChangedAsync("commit.gpgsign", GPGCommitSigningEnabled ? "true" : "false", "false");
|
||||
await SetIfChangedAsync("tag.gpgsign", GPGTagSigningEnabled ? "true" : "false", "false");
|
||||
await SetIfChangedAsync("user.signingkey", GPGUserSigningKey, "");
|
||||
await SetIfChangedAsync("http.proxy", HttpProxy, "");
|
||||
await SetIfChangedAsync("fetch.prune", EnablePruneOnFetch ? "true" : "false", "false");
|
||||
}
|
||||
|
||||
private void SetIfChanged(string key, string value, string defValue)
|
||||
private async Task SetIfChangedAsync(string key, string value, string defValue)
|
||||
{
|
||||
bool changed = false;
|
||||
if (_cached.TryGetValue(key, out var old))
|
||||
@@ -341,7 +343,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
if (changed)
|
||||
{
|
||||
new Commands.Config(_repo.FullPath).Set(key, value);
|
||||
await new Commands.Config(_repo.FullPath).SetAsync(key, value);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ namespace SourceGit.ViewModels
|
||||
SelectedMode = Models.ResetMode.Supported[1];
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = $"Reset current branch to {To.SHA} ...";
|
||||
@@ -36,13 +36,10 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog($"Reset HEAD to '{To.SHA}'");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
{
|
||||
var succ = new Commands.Reset(_repo.FullPath, To.SHA, SelectedMode.Arg).Use(log).Exec();
|
||||
log.Complete();
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
});
|
||||
var succ = await new Commands.Reset(_repo.FullPath, To.SHA, SelectedMode.Arg).Use(log).ExecAsync();
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
}
|
||||
|
||||
private readonly Repository _repo = null;
|
||||
|
||||
@@ -30,7 +30,7 @@ namespace SourceGit.ViewModels
|
||||
To = to;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = $"Reset {Target.Name} to {_revision} ...";
|
||||
@@ -38,13 +38,10 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog($"Reset '{Target.Name}' to '{_revision}'");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
{
|
||||
var succ = Commands.Branch.Create(_repo.FullPath, Target.Name, _revision, true, log);
|
||||
log.Complete();
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
});
|
||||
var succ = await Commands.Branch.CreateAsync(_repo.FullPath, Target.Name, _revision, true, log);
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
}
|
||||
|
||||
private readonly Repository _repo = null;
|
||||
|
||||
@@ -22,7 +22,7 @@ namespace SourceGit.ViewModels
|
||||
AutoCommit = true;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
_repo.ClearCommitMessage();
|
||||
@@ -31,13 +31,10 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog($"Revert '{Target.SHA}'");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
{
|
||||
new Commands.Revert(_repo.FullPath, Target.SHA, AutoCommit).Use(log).Exec();
|
||||
log.Complete();
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return true;
|
||||
});
|
||||
await new Commands.Revert(_repo.FullPath, Target.SHA, AutoCommit).Use(log).ExecAsync();
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return true;
|
||||
}
|
||||
|
||||
private readonly Repository _repo = null;
|
||||
|
||||
@@ -117,9 +117,9 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public void SaveAsPatch(string saveTo)
|
||||
{
|
||||
Task.Run(() =>
|
||||
Task.Run(async () =>
|
||||
{
|
||||
var succ = Commands.SaveChangesAsPatch.ProcessRevisionCompareChanges(_repo, _changes, GetSHA(_startPoint), GetSHA(_endPoint), saveTo);
|
||||
var succ = await Commands.SaveChangesAsPatch.ProcessRevisionCompareChangesAsync(_repo, _changes, GetSHA(_startPoint), GetSHA(_endPoint), saveTo);
|
||||
if (succ)
|
||||
App.SendNotification(_repo, App.Text("SaveAsPatchSuccess"));
|
||||
});
|
||||
@@ -147,7 +147,7 @@ namespace SourceGit.ViewModels
|
||||
var toolType = Preferences.Instance.ExternalMergeToolType;
|
||||
var toolPath = Preferences.Instance.ExternalMergeToolPath;
|
||||
|
||||
Task.Run(() => Commands.MergeTool.OpenForDiff(_repo, toolType, toolPath, opt));
|
||||
Task.Run(() => Commands.MergeTool.OpenForDiffAsync(_repo, toolType, toolPath, opt));
|
||||
ev.Handled = true;
|
||||
};
|
||||
menu.Items.Add(diffWithMerger);
|
||||
|
||||
@@ -26,10 +26,10 @@ namespace SourceGit.ViewModels
|
||||
Head = head;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
if (string.Compare(_message, _oldMessage, StringComparison.Ordinal) == 0)
|
||||
return null;
|
||||
return true;
|
||||
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = "Editing head commit message ...";
|
||||
@@ -38,14 +38,11 @@ namespace SourceGit.ViewModels
|
||||
Use(log);
|
||||
|
||||
var signOff = _repo.Settings.EnableSignOffForCommit;
|
||||
return Task.Run(() =>
|
||||
{
|
||||
// For reword (only changes the commit message), disable `--reset-author`
|
||||
var succ = new Commands.Commit(_repo.FullPath, _message, signOff, true, false).Use(log).Run();
|
||||
log.Complete();
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
});
|
||||
// For reword (only changes the commit message), disable `--reset-author`
|
||||
var succ = await new Commands.Commit(_repo.FullPath, _message, signOff, true, false).Use(log).RunAsync();
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
}
|
||||
|
||||
private readonly Repository _repo;
|
||||
|
||||
@@ -40,56 +40,53 @@ namespace SourceGit.ViewModels
|
||||
GetManagedRepositories(Preferences.Instance.RepositoryNodes, _managed);
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
ProgressDescription = $"Scan repositories under '{_selected.Path}' ...";
|
||||
|
||||
return Task.Run(() =>
|
||||
var watch = new Stopwatch();
|
||||
watch.Start();
|
||||
|
||||
var rootDir = new DirectoryInfo(_selected.Path);
|
||||
var found = new List<string>();
|
||||
GetUnmanagedRepositories(rootDir, found, new EnumerationOptions()
|
||||
{
|
||||
var watch = new Stopwatch();
|
||||
watch.Start();
|
||||
|
||||
var rootDir = new DirectoryInfo(_selected.Path);
|
||||
var found = new List<string>();
|
||||
GetUnmanagedRepositories(rootDir, found, new EnumerationOptions()
|
||||
{
|
||||
AttributesToSkip = FileAttributes.Hidden | FileAttributes.System,
|
||||
IgnoreInaccessible = true,
|
||||
});
|
||||
|
||||
// Make sure this task takes at least 0.5s to avoid that the popup panel do not disappear very quickly.
|
||||
var remain = 500 - (int)watch.Elapsed.TotalMilliseconds;
|
||||
watch.Stop();
|
||||
if (remain > 0)
|
||||
Task.Delay(remain).Wait();
|
||||
|
||||
Dispatcher.UIThread.Invoke(() =>
|
||||
{
|
||||
var normalizedRoot = rootDir.FullName.Replace('\\', '/').TrimEnd('/');
|
||||
|
||||
foreach (var f in found)
|
||||
{
|
||||
var parent = new DirectoryInfo(f).Parent!.FullName.Replace('\\', '/').TrimEnd('/');
|
||||
if (parent.Equals(normalizedRoot, StringComparison.Ordinal))
|
||||
{
|
||||
Preferences.Instance.FindOrAddNodeByRepositoryPath(f, null, false, false);
|
||||
}
|
||||
else if (parent.StartsWith(normalizedRoot, StringComparison.Ordinal))
|
||||
{
|
||||
var relative = parent.Substring(normalizedRoot.Length).TrimStart('/');
|
||||
var group = FindOrCreateGroupRecursive(Preferences.Instance.RepositoryNodes, relative);
|
||||
Preferences.Instance.FindOrAddNodeByRepositoryPath(f, group, false, false);
|
||||
}
|
||||
}
|
||||
|
||||
Preferences.Instance.AutoRemoveInvalidNode();
|
||||
Preferences.Instance.Save();
|
||||
|
||||
Welcome.Instance.Refresh();
|
||||
});
|
||||
|
||||
return true;
|
||||
AttributesToSkip = FileAttributes.Hidden | FileAttributes.System,
|
||||
IgnoreInaccessible = true,
|
||||
});
|
||||
|
||||
// Make sure this task takes at least 0.5s to avoid that the popup panel do not disappear very quickly.
|
||||
var remain = 500 - (int)watch.Elapsed.TotalMilliseconds;
|
||||
watch.Stop();
|
||||
if (remain > 0)
|
||||
Task.Delay(remain).Wait();
|
||||
|
||||
await Dispatcher.UIThread.InvokeAsync(() =>
|
||||
{
|
||||
var normalizedRoot = rootDir.FullName.Replace('\\', '/').TrimEnd('/');
|
||||
|
||||
foreach (var f in found)
|
||||
{
|
||||
var parent = new DirectoryInfo(f).Parent!.FullName.Replace('\\', '/').TrimEnd('/');
|
||||
if (parent.Equals(normalizedRoot, StringComparison.Ordinal))
|
||||
{
|
||||
Preferences.Instance.FindOrAddNodeByRepositoryPath(f, null, false, false);
|
||||
}
|
||||
else if (parent.StartsWith(normalizedRoot, StringComparison.Ordinal))
|
||||
{
|
||||
var relative = parent.Substring(normalizedRoot.Length).TrimStart('/');
|
||||
var group = FindOrCreateGroupRecursive(Preferences.Instance.RepositoryNodes, relative);
|
||||
Preferences.Instance.FindOrAddNodeByRepositoryPath(f, group, false, false);
|
||||
}
|
||||
}
|
||||
|
||||
Preferences.Instance.AutoRemoveInvalidNode();
|
||||
Preferences.Instance.Save();
|
||||
|
||||
Welcome.Instance.Refresh();
|
||||
});
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private void GetManagedRepositories(List<RepositoryNode> group, HashSet<string> repos)
|
||||
|
||||
@@ -50,26 +50,23 @@ namespace SourceGit.ViewModels
|
||||
}
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
ProgressDescription = "Setting upstream...";
|
||||
|
||||
var upstream = (_unset || SelectedRemoteBranch == null) ? string.Empty : SelectedRemoteBranch.FullName;
|
||||
if (upstream == Local.Upstream)
|
||||
return null;
|
||||
return true;
|
||||
|
||||
var log = _repo.CreateLog("Set Upstream");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
{
|
||||
var succ = Commands.Branch.SetUpstream(_repo.FullPath, Local.Name, upstream.Replace("refs/remotes/", ""), log);
|
||||
if (succ)
|
||||
_repo.RefreshBranches();
|
||||
var succ = await Commands.Branch.SetUpstreamAsync(_repo.FullPath, Local.Name, upstream.Replace("refs/remotes/", ""), log);
|
||||
if (succ)
|
||||
_repo.RefreshBranches();
|
||||
|
||||
log.Complete();
|
||||
return true;
|
||||
});
|
||||
log.Complete();
|
||||
return true;
|
||||
}
|
||||
|
||||
private readonly Repository _repo;
|
||||
|
||||
@@ -24,7 +24,7 @@ namespace SourceGit.ViewModels
|
||||
Target = target;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = "Squashing ...";
|
||||
@@ -32,36 +32,33 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog("Squash");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
var signOff = _repo.Settings.EnableSignOffForCommit;
|
||||
var autoStashed = false;
|
||||
bool succ;
|
||||
|
||||
if (_repo.LocalChangesCount > 0)
|
||||
{
|
||||
var signOff = _repo.Settings.EnableSignOffForCommit;
|
||||
var autoStashed = false;
|
||||
bool succ;
|
||||
|
||||
if (_repo.LocalChangesCount > 0)
|
||||
succ = await new Commands.Stash(_repo.FullPath).Use(log).PushAsync("SQUASH_AUTO_STASH");
|
||||
if (!succ)
|
||||
{
|
||||
succ = new Commands.Stash(_repo.FullPath).Use(log).Push("SQUASH_AUTO_STASH");
|
||||
if (!succ)
|
||||
{
|
||||
log.Complete();
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return false;
|
||||
}
|
||||
|
||||
autoStashed = true;
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return false;
|
||||
}
|
||||
|
||||
succ = new Commands.Reset(_repo.FullPath, Target.SHA, "--soft").Use(log).Exec();
|
||||
if (succ)
|
||||
succ = new Commands.Commit(_repo.FullPath, _message, signOff, true, false).Use(log).Run();
|
||||
autoStashed = true;
|
||||
}
|
||||
|
||||
if (succ && autoStashed)
|
||||
new Commands.Stash(_repo.FullPath).Use(log).Pop("stash@{0}");
|
||||
succ = await new Commands.Reset(_repo.FullPath, Target.SHA, "--soft").Use(log).ExecAsync();
|
||||
if (succ)
|
||||
succ = await new Commands.Commit(_repo.FullPath, _message, signOff, true, false).Use(log).RunAsync();
|
||||
|
||||
log.Complete();
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
});
|
||||
if (succ && autoStashed)
|
||||
await new Commands.Stash(_repo.FullPath).Use(log).PopAsync("stash@{0}");
|
||||
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return succ;
|
||||
}
|
||||
|
||||
private readonly Repository _repo;
|
||||
|
||||
@@ -50,7 +50,7 @@ namespace SourceGit.ViewModels
|
||||
HasSelectedFiles = hasSelectedFiles;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
ProgressDescription = "Stash changes ...";
|
||||
@@ -58,57 +58,54 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog("Stash Local Changes");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
var mode = (DealWithChangesAfterStashing)ChangesAfterStashing;
|
||||
var keepIndex = mode == DealWithChangesAfterStashing.KeepIndex;
|
||||
bool succ;
|
||||
|
||||
if (!HasSelectedFiles)
|
||||
{
|
||||
var mode = (DealWithChangesAfterStashing)ChangesAfterStashing;
|
||||
var keepIndex = mode == DealWithChangesAfterStashing.KeepIndex;
|
||||
bool succ;
|
||||
|
||||
if (!HasSelectedFiles)
|
||||
if (OnlyStaged)
|
||||
{
|
||||
if (OnlyStaged)
|
||||
if (Native.OS.GitVersion >= Models.GitVersions.STASH_PUSH_ONLY_STAGED)
|
||||
{
|
||||
if (Native.OS.GitVersion >= Models.GitVersions.STASH_PUSH_ONLY_STAGED)
|
||||
{
|
||||
succ = new Commands.Stash(_repo.FullPath).Use(log).PushOnlyStaged(Message, keepIndex);
|
||||
}
|
||||
else
|
||||
{
|
||||
var staged = new List<Models.Change>();
|
||||
foreach (var c in _changes)
|
||||
{
|
||||
if (c.Index != Models.ChangeState.None && c.Index != Models.ChangeState.Untracked)
|
||||
staged.Add(c);
|
||||
}
|
||||
|
||||
succ = StashWithChanges(staged, keepIndex, log);
|
||||
}
|
||||
succ = await new Commands.Stash(_repo.FullPath).Use(log).PushOnlyStagedAsync(Message, keepIndex);
|
||||
}
|
||||
else
|
||||
{
|
||||
succ = new Commands.Stash(_repo.FullPath).Use(log).Push(Message, IncludeUntracked, keepIndex);
|
||||
var staged = new List<Models.Change>();
|
||||
foreach (var c in _changes)
|
||||
{
|
||||
if (c.Index != Models.ChangeState.None && c.Index != Models.ChangeState.Untracked)
|
||||
staged.Add(c);
|
||||
}
|
||||
|
||||
succ = await StashWithChangesAsync(staged, keepIndex, log);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
succ = StashWithChanges(_changes, keepIndex, log);
|
||||
succ = await new Commands.Stash(_repo.FullPath).Use(log).PushAsync(Message, IncludeUntracked, keepIndex);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
succ = await StashWithChangesAsync(_changes, keepIndex, log);
|
||||
}
|
||||
|
||||
if (mode == DealWithChangesAfterStashing.KeepAll && succ)
|
||||
succ = new Commands.Stash(_repo.FullPath).Use(log).Apply("stash@{0}", true);
|
||||
if (mode == DealWithChangesAfterStashing.KeepAll && succ)
|
||||
succ = await new Commands.Stash(_repo.FullPath).Use(log).ApplyAsync("stash@{0}", true);
|
||||
|
||||
log.Complete();
|
||||
CallUIThread(() =>
|
||||
{
|
||||
_repo.MarkWorkingCopyDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
});
|
||||
|
||||
return succ;
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() =>
|
||||
{
|
||||
_repo.MarkWorkingCopyDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
});
|
||||
|
||||
return succ;
|
||||
}
|
||||
|
||||
private bool StashWithChanges(List<Models.Change> changes, bool keepIndex, CommandLog log)
|
||||
private async Task<bool> StashWithChangesAsync(List<Models.Change> changes, bool keepIndex, CommandLog log)
|
||||
{
|
||||
if (changes.Count == 0)
|
||||
return true;
|
||||
@@ -121,8 +118,8 @@ namespace SourceGit.ViewModels
|
||||
paths.Add(c.Path);
|
||||
|
||||
var pathSpecFile = Path.GetTempFileName();
|
||||
File.WriteAllLines(pathSpecFile, paths);
|
||||
succ = new Commands.Stash(_repo.FullPath).Use(log).Push(Message, pathSpecFile, keepIndex);
|
||||
await File.WriteAllLinesAsync(pathSpecFile, paths);
|
||||
succ = await new Commands.Stash(_repo.FullPath).Use(log).PushAsync(Message, pathSpecFile, keepIndex);
|
||||
File.Delete(pathSpecFile);
|
||||
}
|
||||
else
|
||||
@@ -131,7 +128,7 @@ namespace SourceGit.ViewModels
|
||||
{
|
||||
var count = Math.Min(32, changes.Count - i);
|
||||
var step = changes.GetRange(i, count);
|
||||
succ = new Commands.Stash(_repo.FullPath).Use(log).Push(Message, step, keepIndex);
|
||||
succ = await new Commands.Stash(_repo.FullPath).Use(log).PushAsync(Message, step, keepIndex);
|
||||
if (!succ)
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -57,14 +57,14 @@ namespace SourceGit.ViewModels
|
||||
}
|
||||
else
|
||||
{
|
||||
Task.Run(() =>
|
||||
Task.Run(async () =>
|
||||
{
|
||||
var changes = new Commands.CompareRevisions(_repo.FullPath, $"{value.SHA}^", value.SHA).Result();
|
||||
var changes = await new Commands.CompareRevisions(_repo.FullPath, $"{value.SHA}^", value.SHA).ResultAsync();
|
||||
var untracked = new List<Models.Change>();
|
||||
|
||||
if (value.Parents.Count == 3)
|
||||
{
|
||||
untracked = new Commands.CompareRevisions(_repo.FullPath, Models.Commit.EmptyTreeSHA1, value.Parents[2]).Result();
|
||||
untracked = await new Commands.CompareRevisions(_repo.FullPath, Models.Commit.EmptyTreeSHA1, value.Parents[2]).ResultAsync();
|
||||
var needSort = changes.Count > 0 && untracked.Count > 0;
|
||||
|
||||
changes.AddRange(untracked);
|
||||
@@ -73,7 +73,7 @@ namespace SourceGit.ViewModels
|
||||
changes.Sort((l, r) => Models.NumericSort.Compare(l.Path, r.Path));
|
||||
}
|
||||
|
||||
Dispatcher.UIThread.Invoke(() =>
|
||||
await Dispatcher.UIThread.InvokeAsync(() =>
|
||||
{
|
||||
_untracked = untracked;
|
||||
Changes = changes;
|
||||
@@ -187,7 +187,7 @@ namespace SourceGit.ViewModels
|
||||
opts.Add(new Models.DiffOption(_selectedStash.Parents[0], _selectedStash.SHA, c));
|
||||
}
|
||||
|
||||
var succ = await Task.Run(() => Commands.SaveChangesAsPatch.ProcessStashChanges(_repo.FullPath, opts, storageFile.Path.LocalPath));
|
||||
var succ = await Commands.SaveChangesAsPatch.ProcessStashChangesAsync(_repo.FullPath, opts, storageFile.Path.LocalPath);
|
||||
if (succ)
|
||||
App.SendNotification(_repo.FullPath, App.Text("SaveAsPatchSuccess"));
|
||||
}
|
||||
@@ -228,7 +228,7 @@ namespace SourceGit.ViewModels
|
||||
var toolPath = Preferences.Instance.ExternalMergeToolPath;
|
||||
var opt = new Models.DiffOption($"{_selectedStash.SHA}^", _selectedStash.SHA, change);
|
||||
|
||||
Task.Run(() => Commands.MergeTool.OpenForDiff(_repo.FullPath, toolType, toolPath, opt));
|
||||
Task.Run(() => Commands.MergeTool.OpenForDiffAsync(_repo.FullPath, toolType, toolPath, opt));
|
||||
ev.Handled = true;
|
||||
};
|
||||
|
||||
@@ -250,23 +250,20 @@ namespace SourceGit.ViewModels
|
||||
{
|
||||
var log = _repo.CreateLog($"Reset File to '{_selectedStash.SHA}'");
|
||||
|
||||
await Task.Run(() =>
|
||||
if (_untracked.Contains(change))
|
||||
{
|
||||
if (_untracked.Contains(change))
|
||||
{
|
||||
Commands.SaveRevisionFile.Run(_repo.FullPath, _selectedStash.Parents[2], change.Path, fullPath);
|
||||
}
|
||||
else if (change.Index == Models.ChangeState.Added)
|
||||
{
|
||||
Commands.SaveRevisionFile.Run(_repo.FullPath, _selectedStash.SHA, change.Path, fullPath);
|
||||
}
|
||||
else
|
||||
{
|
||||
new Commands.Checkout(_repo.FullPath)
|
||||
.Use(log)
|
||||
.FileWithRevision(change.Path, $"{_selectedStash.SHA}");
|
||||
}
|
||||
});
|
||||
await Commands.SaveRevisionFile.RunAsync(_repo.FullPath, _selectedStash.Parents[2], change.Path, fullPath);
|
||||
}
|
||||
else if (change.Index == Models.ChangeState.Added)
|
||||
{
|
||||
await Commands.SaveRevisionFile.RunAsync(_repo.FullPath, _selectedStash.SHA, change.Path, fullPath);
|
||||
}
|
||||
else
|
||||
{
|
||||
await new Commands.Checkout(_repo.FullPath)
|
||||
.Use(log)
|
||||
.FileWithRevisionAsync(change.Path, $"{_selectedStash.SHA}");
|
||||
}
|
||||
|
||||
log.Complete();
|
||||
ev.Handled = true;
|
||||
|
||||
@@ -56,10 +56,10 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public Statistics(string repo)
|
||||
{
|
||||
Task.Run(() =>
|
||||
Task.Run(async () =>
|
||||
{
|
||||
var result = new Commands.Statistics(repo, Preferences.Instance.MaxHistoryCommits).Result();
|
||||
Dispatcher.UIThread.Invoke(() =>
|
||||
var result = await new Commands.Statistics(repo, Preferences.Instance.MaxHistoryCommits).ResultAsync();
|
||||
await Dispatcher.UIThread.InvokeAsync(() =>
|
||||
{
|
||||
_data = result;
|
||||
RefreshReport();
|
||||
|
||||
@@ -50,7 +50,7 @@ namespace SourceGit.ViewModels
|
||||
SelectedSubmodule = Submodules.Count > 0 ? Submodules[0] : string.Empty;
|
||||
}
|
||||
|
||||
public override Task<bool> Sure()
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
|
||||
@@ -63,16 +63,13 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog("Update Submodule");
|
||||
Use(log);
|
||||
|
||||
return Task.Run(() =>
|
||||
{
|
||||
new Commands.Submodule(_repo.FullPath)
|
||||
.Use(log)
|
||||
.Update(targets, EnableInit, EnableRecursive, EnableRemote);
|
||||
await new Commands.Submodule(_repo.FullPath)
|
||||
.Use(log)
|
||||
.UpdateAsync(targets, EnableInit, EnableRecursive, EnableRemote);
|
||||
|
||||
log.Complete();
|
||||
CallUIThread(() => _repo.SetWatcherEnabled(true));
|
||||
return true;
|
||||
});
|
||||
log.Complete();
|
||||
await CallUIThreadAsync(() => _repo.SetWatcherEnabled(true));
|
||||
return true;
|
||||
}
|
||||
|
||||
private readonly Repository _repo = null;
|
||||
|
||||
@@ -410,7 +410,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
if (files.Count > 0)
|
||||
{
|
||||
var succ = await Task.Run(() => new Commands.Checkout(_repo.FullPath).Use(log).UseTheirs(files));
|
||||
var succ = await new Commands.Checkout(_repo.FullPath).Use(log).UseTheirsAsync(files);
|
||||
if (succ)
|
||||
needStage.AddRange(files);
|
||||
}
|
||||
@@ -419,7 +419,7 @@ namespace SourceGit.ViewModels
|
||||
{
|
||||
var pathSpecFile = Path.GetTempFileName();
|
||||
await File.WriteAllLinesAsync(pathSpecFile, needStage);
|
||||
await Task.Run(() => new Commands.Add(_repo.FullPath, pathSpecFile).Use(log).Exec());
|
||||
await new Commands.Add(_repo.FullPath, pathSpecFile).Use(log).ExecAsync();
|
||||
File.Delete(pathSpecFile);
|
||||
}
|
||||
|
||||
@@ -459,7 +459,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
if (files.Count > 0)
|
||||
{
|
||||
var succ = await Task.Run(() => new Commands.Checkout(_repo.FullPath).Use(log).UseMine(files));
|
||||
var succ = await new Commands.Checkout(_repo.FullPath).Use(log).UseMineAsync(files);
|
||||
if (succ)
|
||||
needStage.AddRange(files);
|
||||
}
|
||||
@@ -468,7 +468,7 @@ namespace SourceGit.ViewModels
|
||||
{
|
||||
var pathSpecFile = Path.GetTempFileName();
|
||||
await File.WriteAllLinesAsync(pathSpecFile, needStage);
|
||||
await Task.Run(() => new Commands.Add(_repo.FullPath, pathSpecFile).Use(log).Exec());
|
||||
await new Commands.Add(_repo.FullPath, pathSpecFile).Use(log).ExecAsync();
|
||||
File.Delete(pathSpecFile);
|
||||
}
|
||||
|
||||
@@ -482,7 +482,7 @@ namespace SourceGit.ViewModels
|
||||
var toolType = Preferences.Instance.ExternalMergeToolType;
|
||||
var toolPath = Preferences.Instance.ExternalMergeToolPath;
|
||||
var file = change?.Path; // NOTE: With no <file> arg, mergetool runs on every file with merge conflicts!
|
||||
await Task.Run(() => Commands.MergeTool.OpenForMerge(_repo.FullPath, toolType, toolPath, file));
|
||||
await Commands.MergeTool.OpenForMergeAsync(_repo.FullPath, toolType, toolPath, file);
|
||||
}
|
||||
|
||||
public void ContinueMerge()
|
||||
@@ -492,14 +492,14 @@ namespace SourceGit.ViewModels
|
||||
if (_inProgressContext != null)
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
Task.Run(() =>
|
||||
Task.Run(async () =>
|
||||
{
|
||||
var mergeMsgFile = Path.Combine(_repo.GitDir, "MERGE_MSG");
|
||||
if (File.Exists(mergeMsgFile) && !string.IsNullOrWhiteSpace(_commitMessage))
|
||||
File.WriteAllText(mergeMsgFile, _commitMessage);
|
||||
await File.WriteAllTextAsync(mergeMsgFile, _commitMessage);
|
||||
|
||||
var succ = _inProgressContext.Continue();
|
||||
Dispatcher.UIThread.Invoke(() =>
|
||||
var succ = await _inProgressContext.ContinueAsync();
|
||||
await Dispatcher.UIThread.InvokeAsync(() =>
|
||||
{
|
||||
if (succ)
|
||||
CommitMessage = string.Empty;
|
||||
@@ -523,10 +523,10 @@ namespace SourceGit.ViewModels
|
||||
if (_inProgressContext != null)
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
Task.Run(() =>
|
||||
Task.Run(async () =>
|
||||
{
|
||||
var succ = _inProgressContext.Skip();
|
||||
Dispatcher.UIThread.Invoke(() =>
|
||||
var succ = await _inProgressContext.SkipAsync();
|
||||
await Dispatcher.UIThread.InvokeAsync(() =>
|
||||
{
|
||||
if (succ)
|
||||
CommitMessage = string.Empty;
|
||||
@@ -550,10 +550,10 @@ namespace SourceGit.ViewModels
|
||||
if (_inProgressContext != null)
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
Task.Run(() =>
|
||||
Task.Run(async () =>
|
||||
{
|
||||
var succ = _inProgressContext.Abort();
|
||||
Dispatcher.UIThread.Invoke(() =>
|
||||
var succ = await _inProgressContext.AbortAsync();
|
||||
await Dispatcher.UIThread.InvokeAsync(() =>
|
||||
{
|
||||
if (succ)
|
||||
CommitMessage = string.Empty;
|
||||
@@ -725,7 +725,7 @@ namespace SourceGit.ViewModels
|
||||
var storageFile = await storageProvider.SaveFilePickerAsync(options);
|
||||
if (storageFile != null)
|
||||
{
|
||||
var succ = await Task.Run(() => Commands.SaveChangesAsPatch.ProcessLocalChanges(_repo.FullPath, _selectedUnstaged, true, storageFile.Path.LocalPath));
|
||||
var succ = await Commands.SaveChangesAsPatch.ProcessLocalChangesAsync(_repo.FullPath, _selectedUnstaged, true, storageFile.Path.LocalPath);
|
||||
if (succ)
|
||||
App.SendNotification(_repo.FullPath, App.Text("SaveAsPatchSuccess"));
|
||||
}
|
||||
@@ -737,10 +737,10 @@ namespace SourceGit.ViewModels
|
||||
assumeUnchanged.Header = App.Text("FileCM.AssumeUnchanged");
|
||||
assumeUnchanged.Icon = App.CreateMenuIcon("Icons.File.Ignore");
|
||||
assumeUnchanged.IsVisible = change.WorkTree != Models.ChangeState.Untracked;
|
||||
assumeUnchanged.Click += (_, e) =>
|
||||
assumeUnchanged.Click += async (_, e) =>
|
||||
{
|
||||
var log = _repo.CreateLog("Assume File Unchanged");
|
||||
new Commands.AssumeUnchanged(_repo.FullPath, change.Path, true).Use(log).Exec();
|
||||
await new Commands.AssumeUnchanged(_repo.FullPath, change.Path, true).Use(log).ExecAsync();
|
||||
log.Complete();
|
||||
e.Handled = true;
|
||||
};
|
||||
@@ -850,7 +850,7 @@ namespace SourceGit.ViewModels
|
||||
lfsTrackThisFile.Click += async (_, e) =>
|
||||
{
|
||||
var log = _repo.CreateLog("Track LFS");
|
||||
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Track(filename, true, log));
|
||||
var succ = await new Commands.LFS(_repo.FullPath).TrackAsync(filename, true, log);
|
||||
if (succ)
|
||||
App.SendNotification(_repo.FullPath, $"Tracking file named {filename} successfully!");
|
||||
|
||||
@@ -866,7 +866,7 @@ namespace SourceGit.ViewModels
|
||||
lfsTrackByExtension.Click += async (_, e) =>
|
||||
{
|
||||
var log = _repo.CreateLog("Track LFS");
|
||||
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Track($"*{extension}", false, log));
|
||||
var succ = await new Commands.LFS(_repo.FullPath).TrackAsync($"*{extension}", false, log);
|
||||
if (succ)
|
||||
App.SendNotification(_repo.FullPath, $"Tracking all *{extension} files successfully!");
|
||||
|
||||
@@ -888,7 +888,7 @@ namespace SourceGit.ViewModels
|
||||
lfsLock.Click += async (_, e) =>
|
||||
{
|
||||
var log = _repo.CreateLog("Lock LFS File");
|
||||
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Lock(_repo.Remotes[0].Name, change.Path, log));
|
||||
var succ = await new Commands.LFS(_repo.FullPath).LockAsync(_repo.Remotes[0].Name, change.Path, log);
|
||||
if (succ)
|
||||
App.SendNotification(_repo.FullPath, $"Lock file \"{change.Path}\" successfully!");
|
||||
|
||||
@@ -906,7 +906,7 @@ namespace SourceGit.ViewModels
|
||||
lockRemote.Click += async (_, e) =>
|
||||
{
|
||||
var log = _repo.CreateLog("Lock LFS File");
|
||||
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Lock(remoteName, change.Path, log));
|
||||
var succ = await new Commands.LFS(_repo.FullPath).LockAsync(remoteName, change.Path, log);
|
||||
if (succ)
|
||||
App.SendNotification(_repo.FullPath, $"Lock file \"{change.Path}\" successfully!");
|
||||
|
||||
@@ -927,7 +927,7 @@ namespace SourceGit.ViewModels
|
||||
lfsUnlock.Click += async (_, e) =>
|
||||
{
|
||||
var log = _repo.CreateLog("Unlock LFS File");
|
||||
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Unlock(_repo.Remotes[0].Name, change.Path, false, log));
|
||||
var succ = await new Commands.LFS(_repo.FullPath).UnlockAsync(_repo.Remotes[0].Name, change.Path, false, log);
|
||||
if (succ)
|
||||
App.SendNotification(_repo.FullPath, $"Unlock file \"{change.Path}\" successfully!");
|
||||
|
||||
@@ -945,7 +945,7 @@ namespace SourceGit.ViewModels
|
||||
unlockRemote.Click += async (_, e) =>
|
||||
{
|
||||
var log = _repo.CreateLog("Unlock LFS File");
|
||||
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Unlock(remoteName, change.Path, false, log));
|
||||
var succ = await new Commands.LFS(_repo.FullPath).UnlockAsync(remoteName, change.Path, false, log);
|
||||
if (succ)
|
||||
App.SendNotification(_repo.FullPath, $"Unlock file \"{change.Path}\" successfully!");
|
||||
|
||||
@@ -1127,7 +1127,7 @@ namespace SourceGit.ViewModels
|
||||
var storageFile = await storageProvider.SaveFilePickerAsync(options);
|
||||
if (storageFile != null)
|
||||
{
|
||||
var succ = await Task.Run(() => Commands.SaveChangesAsPatch.ProcessLocalChanges(_repo.FullPath, _selectedUnstaged, true, storageFile.Path.LocalPath));
|
||||
var succ = await Commands.SaveChangesAsPatch.ProcessLocalChangesAsync(_repo.FullPath, _selectedUnstaged, true, storageFile.Path.LocalPath);
|
||||
if (succ)
|
||||
App.SendNotification(_repo.FullPath, App.Text("SaveAsPatchSuccess"));
|
||||
}
|
||||
@@ -1302,7 +1302,7 @@ namespace SourceGit.ViewModels
|
||||
var storageFile = await storageProvider.SaveFilePickerAsync(options);
|
||||
if (storageFile != null)
|
||||
{
|
||||
var succ = await Task.Run(() => Commands.SaveChangesAsPatch.ProcessLocalChanges(_repo.FullPath, _selectedStaged, false, storageFile.Path.LocalPath));
|
||||
var succ = await Commands.SaveChangesAsPatch.ProcessLocalChangesAsync(_repo.FullPath, _selectedStaged, false, storageFile.Path.LocalPath);
|
||||
if (succ)
|
||||
App.SendNotification(_repo.FullPath, App.Text("SaveAsPatchSuccess"));
|
||||
}
|
||||
@@ -1334,7 +1334,7 @@ namespace SourceGit.ViewModels
|
||||
lfsLock.Click += async (_, e) =>
|
||||
{
|
||||
var log = _repo.CreateLog("Lock LFS File");
|
||||
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Lock(_repo.Remotes[0].Name, change.Path, log));
|
||||
var succ = await new Commands.LFS(_repo.FullPath).LockAsync(_repo.Remotes[0].Name, change.Path, log);
|
||||
if (succ)
|
||||
App.SendNotification(_repo.FullPath, $"Lock file \"{change.Path}\" successfully!");
|
||||
|
||||
@@ -1352,7 +1352,7 @@ namespace SourceGit.ViewModels
|
||||
lockRemote.Click += async (_, e) =>
|
||||
{
|
||||
var log = _repo.CreateLog("Lock LFS File");
|
||||
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Lock(remoteName, change.Path, log));
|
||||
var succ = await new Commands.LFS(_repo.FullPath).LockAsync(remoteName, change.Path, log);
|
||||
if (succ)
|
||||
App.SendNotification(_repo.FullPath, $"Lock file \"{change.Path}\" successfully!");
|
||||
|
||||
@@ -1373,7 +1373,7 @@ namespace SourceGit.ViewModels
|
||||
lfsUnlock.Click += async (_, e) =>
|
||||
{
|
||||
var log = _repo.CreateLog("Unlock LFS File");
|
||||
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Unlock(_repo.Remotes[0].Name, change.Path, false, log));
|
||||
var succ = await new Commands.LFS(_repo.FullPath).UnlockAsync(_repo.Remotes[0].Name, change.Path, false, log);
|
||||
if (succ)
|
||||
App.SendNotification(_repo.FullPath, $"Unlock file \"{change.Path}\" successfully!");
|
||||
|
||||
@@ -1391,7 +1391,7 @@ namespace SourceGit.ViewModels
|
||||
unlockRemote.Click += async (_, e) =>
|
||||
{
|
||||
var log = _repo.CreateLog("Unlock LFS File");
|
||||
var succ = await Task.Run(() => new Commands.LFS(_repo.FullPath).Unlock(remoteName, change.Path, false, log));
|
||||
var succ = await new Commands.LFS(_repo.FullPath).UnlockAsync(remoteName, change.Path, false, log);
|
||||
if (succ)
|
||||
App.SendNotification(_repo.FullPath, $"Unlock file \"{change.Path}\" successfully!");
|
||||
|
||||
@@ -1505,7 +1505,7 @@ namespace SourceGit.ViewModels
|
||||
var storageFile = await storageProvider.SaveFilePickerAsync(options);
|
||||
if (storageFile != null)
|
||||
{
|
||||
var succ = await Task.Run(() => Commands.SaveChangesAsPatch.ProcessLocalChanges(_repo.FullPath, _selectedStaged, false, storageFile.Path.LocalPath));
|
||||
var succ = await Commands.SaveChangesAsPatch.ProcessLocalChangesAsync(_repo.FullPath, _selectedStaged, false, storageFile.Path.LocalPath);
|
||||
if (succ)
|
||||
App.SendNotification(_repo.FullPath, App.Text("SaveAsPatchSuccess"));
|
||||
}
|
||||
@@ -1791,7 +1791,7 @@ namespace SourceGit.ViewModels
|
||||
var log = _repo.CreateLog("Stage");
|
||||
if (count == _unstaged.Count)
|
||||
{
|
||||
await Task.Run(() => new Commands.Add(_repo.FullPath, _repo.IncludeUntracked).Use(log).Exec());
|
||||
await new Commands.Add(_repo.FullPath, _repo.IncludeUntracked).Use(log).ExecAsync();
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1802,7 +1802,7 @@ namespace SourceGit.ViewModels
|
||||
await writer.WriteLineAsync(c.Path);
|
||||
}
|
||||
|
||||
await Task.Run(() => new Commands.Add(_repo.FullPath, pathSpecFile).Use(log).Exec());
|
||||
await new Commands.Add(_repo.FullPath, pathSpecFile).Use(log).ExecAsync();
|
||||
File.Delete(pathSpecFile);
|
||||
}
|
||||
log.Complete();
|
||||
@@ -1828,7 +1828,7 @@ namespace SourceGit.ViewModels
|
||||
if (_useAmend)
|
||||
{
|
||||
log.AppendLine("$ git update-index --index-info ");
|
||||
await Task.Run(() => new Commands.UnstageChangesForAmend(_repo.FullPath, changes).Exec());
|
||||
await new Commands.UnstageChangesForAmend(_repo.FullPath, changes).ExecAsync();
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1843,7 +1843,7 @@ namespace SourceGit.ViewModels
|
||||
}
|
||||
}
|
||||
|
||||
await Task.Run(() => new Commands.Restore(_repo.FullPath, pathSpecFile, true).Use(log).Exec());
|
||||
await new Commands.Restore(_repo.FullPath, pathSpecFile, true).Use(log).ExecAsync();
|
||||
File.Delete(pathSpecFile);
|
||||
}
|
||||
log.Complete();
|
||||
@@ -1906,14 +1906,14 @@ namespace SourceGit.ViewModels
|
||||
|
||||
var signOff = _repo.Settings.EnableSignOffForCommit;
|
||||
var log = _repo.CreateLog("Commit");
|
||||
Task.Run(() =>
|
||||
Task.Run(async () =>
|
||||
{
|
||||
var succ = true;
|
||||
if (autoStage && _unstaged.Count > 0)
|
||||
succ = new Commands.Add(_repo.FullPath, _repo.IncludeUntracked).Use(log).Exec();
|
||||
succ = await new Commands.Add(_repo.FullPath, _repo.IncludeUntracked).Use(log).ExecAsync();
|
||||
|
||||
if (succ)
|
||||
succ = new Commands.Commit(_repo.FullPath, _commitMessage, signOff, _useAmend, _resetAuthor).Use(log).Run();
|
||||
succ = await new Commands.Commit(_repo.FullPath, _commitMessage, signOff, _useAmend, _resetAuthor).Use(log).RunAsync();
|
||||
|
||||
log.Complete();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user