mirror of
https://fastgit.cc/github.com/sourcegit-scm/sourcegit
synced 2026-04-21 13:20:30 +08:00
refactor: file-system watcher
- Use `System.Threading.Interlocked` to read/write data - Use `SourceGit.Models.Watcher.LockContext` to release watcher's lock - New way to detect file changes in submodules - Manually update stashes after `git stash` command complete (#1760) Signed-off-by: leo <longshuang@msn.cn>
This commit is contained in:
@@ -7,9 +7,26 @@ namespace SourceGit.Models
|
||||
{
|
||||
public class Watcher : IDisposable
|
||||
{
|
||||
public class LockContext : IDisposable
|
||||
{
|
||||
public LockContext(Watcher target)
|
||||
{
|
||||
_target = target;
|
||||
Interlocked.Increment(ref _target._lockCount);
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Interlocked.Decrement(ref _target._lockCount);
|
||||
}
|
||||
|
||||
private Watcher _target;
|
||||
}
|
||||
|
||||
public Watcher(IRepository repo, string fullpath, string gitDir)
|
||||
{
|
||||
_repo = repo;
|
||||
_root = new DirectoryInfo(fullpath).FullName;
|
||||
|
||||
var testGitDir = new DirectoryInfo(Path.Combine(fullpath, ".git")).FullName;
|
||||
var desiredDir = new DirectoryInfo(gitDir).FullName;
|
||||
@@ -59,42 +76,29 @@ namespace SourceGit.Models
|
||||
_timer = new Timer(Tick, null, 100, 100);
|
||||
}
|
||||
|
||||
public void SetEnabled(bool enabled)
|
||||
public IDisposable Lock()
|
||||
{
|
||||
if (enabled)
|
||||
{
|
||||
if (_lockCount > 0)
|
||||
_lockCount--;
|
||||
}
|
||||
else
|
||||
{
|
||||
_lockCount++;
|
||||
}
|
||||
}
|
||||
|
||||
public void SetSubmodules(List<Submodule> submodules)
|
||||
{
|
||||
lock (_lockSubmodule)
|
||||
{
|
||||
_submodules.Clear();
|
||||
foreach (var submodule in submodules)
|
||||
_submodules.Add(submodule.Path);
|
||||
}
|
||||
return new LockContext(this);
|
||||
}
|
||||
|
||||
public void MarkBranchUpdated()
|
||||
{
|
||||
_updateBranch = 0;
|
||||
Interlocked.Exchange(ref _updateBranch, 0);
|
||||
}
|
||||
|
||||
public void MarkTagUpdated()
|
||||
{
|
||||
_updateTags = 0;
|
||||
Interlocked.Exchange(ref _updateTags, 0);
|
||||
}
|
||||
|
||||
public void MarkWorkingCopyUpdated()
|
||||
{
|
||||
_updateWC = 0;
|
||||
Interlocked.Exchange(ref _updateWC, 0);
|
||||
}
|
||||
|
||||
public void MarkStashUpdated()
|
||||
{
|
||||
Interlocked.Exchange(ref _updateStashes, 0);
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
@@ -112,57 +116,81 @@ namespace SourceGit.Models
|
||||
|
||||
private void Tick(object sender)
|
||||
{
|
||||
if (_lockCount > 0)
|
||||
if (Interlocked.Read(ref _lockCount) > 0)
|
||||
return;
|
||||
|
||||
var now = DateTime.Now.ToFileTime();
|
||||
if (_updateBranch > 0 && now > _updateBranch)
|
||||
var refreshCommits = false;
|
||||
var refreshSubmodules = false;
|
||||
|
||||
var oldUpdateBranch = Interlocked.Exchange(ref _updateBranch, -1);
|
||||
if (oldUpdateBranch > 0)
|
||||
{
|
||||
_updateBranch = 0;
|
||||
_updateWC = 0;
|
||||
|
||||
if (_updateTags > 0)
|
||||
if (now > oldUpdateBranch)
|
||||
{
|
||||
_updateTags = 0;
|
||||
_repo.RefreshTags();
|
||||
}
|
||||
refreshCommits = true;
|
||||
refreshSubmodules = _repo.MayHaveSubmodules();
|
||||
|
||||
if (_updateSubmodules > 0 || _repo.MayHaveSubmodules())
|
||||
_repo.RefreshBranches();
|
||||
_repo.RefreshWorktrees();
|
||||
}
|
||||
else
|
||||
{
|
||||
_updateSubmodules = 0;
|
||||
_repo.RefreshSubmodules();
|
||||
Interlocked.CompareExchange(ref _updateBranch, oldUpdateBranch, -1);
|
||||
}
|
||||
|
||||
_repo.RefreshBranches();
|
||||
_repo.RefreshCommits();
|
||||
_repo.RefreshWorkingCopyChanges();
|
||||
_repo.RefreshWorktrees();
|
||||
}
|
||||
|
||||
if (_updateWC > 0 && now > _updateWC)
|
||||
var oldUpdateWC = Interlocked.Exchange(ref _updateWC, -1);
|
||||
if (oldUpdateWC > 0)
|
||||
{
|
||||
_updateWC = 0;
|
||||
_repo.RefreshWorkingCopyChanges();
|
||||
if (now > oldUpdateWC)
|
||||
_repo.RefreshWorkingCopyChanges();
|
||||
else
|
||||
Interlocked.CompareExchange(ref _updateWC, oldUpdateWC, -1);
|
||||
}
|
||||
|
||||
if (_updateSubmodules > 0 && now > _updateSubmodules)
|
||||
if (refreshSubmodules)
|
||||
{
|
||||
_updateSubmodules = 0;
|
||||
Interlocked.Exchange(ref _updateSubmodules, -1);
|
||||
_repo.RefreshSubmodules();
|
||||
}
|
||||
|
||||
if (_updateStashes > 0 && now > _updateStashes)
|
||||
else
|
||||
{
|
||||
_updateStashes = 0;
|
||||
_repo.RefreshStashes();
|
||||
var oldUpdateSubmodule = Interlocked.Exchange(ref _updateSubmodules, -1);
|
||||
if (oldUpdateSubmodule > 0)
|
||||
{
|
||||
if (now > oldUpdateSubmodule)
|
||||
_repo.RefreshSubmodules();
|
||||
else
|
||||
Interlocked.CompareExchange(ref _updateSubmodules, oldUpdateSubmodule, -1);
|
||||
}
|
||||
}
|
||||
|
||||
if (_updateTags > 0 && now > _updateTags)
|
||||
var oldUpdateStashes = Interlocked.Exchange(ref _updateStashes, -1);
|
||||
if (oldUpdateStashes > 0)
|
||||
{
|
||||
_updateTags = 0;
|
||||
_repo.RefreshTags();
|
||||
if (now > oldUpdateStashes)
|
||||
_repo.RefreshStashes();
|
||||
else
|
||||
Interlocked.CompareExchange(ref _updateStashes, oldUpdateStashes, -1);
|
||||
}
|
||||
|
||||
var oldUpdateTags = Interlocked.Exchange(ref _updateTags, -1);
|
||||
if (oldUpdateTags > 0)
|
||||
{
|
||||
if (now > oldUpdateTags)
|
||||
{
|
||||
refreshCommits = true;
|
||||
_repo.RefreshTags();
|
||||
}
|
||||
else
|
||||
{
|
||||
Interlocked.CompareExchange(ref _updateTags, oldUpdateTags, -1);
|
||||
}
|
||||
}
|
||||
|
||||
if (refreshCommits)
|
||||
_repo.RefreshCommits();
|
||||
}
|
||||
}
|
||||
|
||||
private void OnRepositoryChanged(object o, FileSystemEventArgs e)
|
||||
@@ -177,7 +205,7 @@ namespace SourceGit.Models
|
||||
if (name.StartsWith(".git/", StringComparison.Ordinal))
|
||||
HandleGitDirFileChanged(name.Substring(5));
|
||||
else
|
||||
HandleWorkingCopyFileChanged(name);
|
||||
HandleWorkingCopyFileChanged(name, e.FullPath);
|
||||
}
|
||||
|
||||
private void OnGitDirChanged(object o, FileSystemEventArgs e)
|
||||
@@ -200,7 +228,7 @@ namespace SourceGit.Models
|
||||
name.EndsWith("/.git", StringComparison.Ordinal))
|
||||
return;
|
||||
|
||||
HandleWorkingCopyFileChanged(name);
|
||||
HandleWorkingCopyFileChanged(name, e.FullPath);
|
||||
}
|
||||
|
||||
private void HandleGitDirFileChanged(string name)
|
||||
@@ -215,23 +243,24 @@ namespace SourceGit.Models
|
||||
if (name.EndsWith("/HEAD", StringComparison.Ordinal) ||
|
||||
name.EndsWith("/ORIG_HEAD", StringComparison.Ordinal))
|
||||
{
|
||||
_updateSubmodules = DateTime.Now.AddSeconds(1).ToFileTime();
|
||||
_updateWC = DateTime.Now.AddSeconds(1).ToFileTime();
|
||||
var desired = DateTime.Now.AddSeconds(1).ToFileTime();
|
||||
Interlocked.Exchange(ref _updateSubmodules, desired);
|
||||
Interlocked.Exchange(ref _updateWC, desired);
|
||||
}
|
||||
}
|
||||
else if (name.Equals("MERGE_HEAD", StringComparison.Ordinal) ||
|
||||
name.Equals("AUTO_MERGE", StringComparison.Ordinal))
|
||||
{
|
||||
if (_repo.MayHaveSubmodules())
|
||||
_updateSubmodules = DateTime.Now.AddSeconds(1).ToFileTime();
|
||||
Interlocked.Exchange(ref _updateSubmodules, DateTime.Now.AddSeconds(1).ToFileTime());
|
||||
}
|
||||
else if (name.StartsWith("refs/tags", StringComparison.Ordinal))
|
||||
{
|
||||
_updateTags = DateTime.Now.AddSeconds(.5).ToFileTime();
|
||||
Interlocked.Exchange(ref _updateTags, DateTime.Now.AddSeconds(.5).ToFileTime());
|
||||
}
|
||||
else if (name.StartsWith("refs/stash", StringComparison.Ordinal))
|
||||
{
|
||||
_updateStashes = DateTime.Now.AddSeconds(.5).ToFileTime();
|
||||
Interlocked.Exchange(ref _updateStashes, DateTime.Now.AddSeconds(.5).ToFileTime());
|
||||
}
|
||||
else if (name.Equals("HEAD", StringComparison.Ordinal) ||
|
||||
name.Equals("BISECT_START", StringComparison.Ordinal) ||
|
||||
@@ -239,52 +268,59 @@ namespace SourceGit.Models
|
||||
name.StartsWith("refs/remotes/", StringComparison.Ordinal) ||
|
||||
(name.StartsWith("worktrees/", StringComparison.Ordinal) && name.EndsWith("/HEAD", StringComparison.Ordinal)))
|
||||
{
|
||||
_updateBranch = DateTime.Now.AddSeconds(.5).ToFileTime();
|
||||
Interlocked.Exchange(ref _updateBranch, DateTime.Now.AddSeconds(.5).ToFileTime());
|
||||
}
|
||||
else if (name.StartsWith("objects/", StringComparison.Ordinal) || name.Equals("index", StringComparison.Ordinal))
|
||||
{
|
||||
_updateWC = DateTime.Now.AddSeconds(1).ToFileTime();
|
||||
Interlocked.Exchange(ref _updateWC, DateTime.Now.AddSeconds(1).ToFileTime());
|
||||
}
|
||||
}
|
||||
|
||||
private void HandleWorkingCopyFileChanged(string name)
|
||||
private void HandleWorkingCopyFileChanged(string name, string fullpath)
|
||||
{
|
||||
if (name.StartsWith(".vs/", StringComparison.Ordinal))
|
||||
return;
|
||||
|
||||
if (name.Equals(".gitmodules", StringComparison.Ordinal))
|
||||
{
|
||||
_updateSubmodules = DateTime.Now.AddSeconds(1).ToFileTime();
|
||||
_updateWC = DateTime.Now.AddSeconds(1).ToFileTime();
|
||||
var desired = DateTime.Now.AddSeconds(1).ToFileTime();
|
||||
Interlocked.Exchange(ref _updateSubmodules, desired);
|
||||
Interlocked.Exchange(ref _updateWC, desired);
|
||||
return;
|
||||
}
|
||||
|
||||
lock (_lockSubmodule)
|
||||
var dir = Directory.Exists(fullpath) ? fullpath : Path.GetDirectoryName(fullpath);
|
||||
if (IsInSubmodule(dir))
|
||||
{
|
||||
foreach (var submodule in _submodules)
|
||||
{
|
||||
if (name.StartsWith(submodule, StringComparison.Ordinal))
|
||||
{
|
||||
_updateSubmodules = DateTime.Now.AddSeconds(1).ToFileTime();
|
||||
return;
|
||||
}
|
||||
}
|
||||
Interlocked.Exchange(ref _updateSubmodules, DateTime.Now.AddSeconds(1).ToFileTime());
|
||||
return;
|
||||
}
|
||||
|
||||
_updateWC = DateTime.Now.AddSeconds(1).ToFileTime();
|
||||
Interlocked.Exchange(ref _updateWC, DateTime.Now.AddSeconds(1).ToFileTime());
|
||||
}
|
||||
|
||||
private bool IsInSubmodule(string folder)
|
||||
{
|
||||
if (File.Exists($"{folder}/.git"))
|
||||
return true;
|
||||
|
||||
var parent = Path.GetDirectoryName(folder);
|
||||
if (parent == null || parent.Equals(_root, StringComparison.Ordinal))
|
||||
return false;
|
||||
|
||||
return IsInSubmodule(parent);
|
||||
}
|
||||
|
||||
private readonly IRepository _repo = null;
|
||||
private readonly string _root = null;
|
||||
private List<FileSystemWatcher> _watchers = [];
|
||||
private Timer _timer = null;
|
||||
private int _lockCount = 0;
|
||||
|
||||
private long _lockCount = 0;
|
||||
private long _updateWC = 0;
|
||||
private long _updateBranch = 0;
|
||||
private long _updateSubmodules = 0;
|
||||
private long _updateStashes = 0;
|
||||
private long _updateTags = 0;
|
||||
|
||||
private readonly Lock _lockSubmodule = new();
|
||||
private List<string> _submodules = new List<string>();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -89,7 +89,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = "Adding remote ...";
|
||||
|
||||
var log = _repo.CreateLog("Add Remote");
|
||||
@@ -114,7 +114,6 @@ namespace SourceGit.ViewModels
|
||||
|
||||
_repo.MarkFetched();
|
||||
_repo.MarkBranchesDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return succ;
|
||||
}
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = "Adding submodule...";
|
||||
|
||||
var log = _repo.CreateLog("Add Submodule");
|
||||
@@ -64,7 +64,6 @@ namespace SourceGit.ViewModels
|
||||
.AddAsync(_url, relativePath, Recursive);
|
||||
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return succ;
|
||||
}
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = "Adding Ignored File(s) ...";
|
||||
|
||||
var file = StorageFile.GetFullPath(_repo.FullPath, _repo.GitDir);
|
||||
@@ -47,7 +47,6 @@ namespace SourceGit.ViewModels
|
||||
}
|
||||
|
||||
_repo.MarkWorkingCopyDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -106,7 +106,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = "Adding worktree ...";
|
||||
|
||||
var branchName = _selectedBranch;
|
||||
@@ -120,7 +120,6 @@ namespace SourceGit.ViewModels
|
||||
.AddAsync(_path, branchName, _createNewBranch, tracking);
|
||||
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return succ;
|
||||
}
|
||||
|
||||
|
||||
@@ -43,7 +43,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = "Apply patch...";
|
||||
|
||||
var log = _repo.CreateLog("Apply Patch");
|
||||
@@ -54,7 +54,6 @@ namespace SourceGit.ViewModels
|
||||
.ExecAsync();
|
||||
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return succ;
|
||||
}
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = $"Applying stash: {Stash.Name}";
|
||||
|
||||
var log = _repo.CreateLog("Apply Stash");
|
||||
@@ -40,13 +40,21 @@ namespace SourceGit.ViewModels
|
||||
.Use(log)
|
||||
.ApplyAsync(Stash.Name, RestoreIndex);
|
||||
|
||||
if (succ && DropAfterApply)
|
||||
await new Commands.Stash(_repo.FullPath)
|
||||
.Use(log)
|
||||
.DropAsync(Stash.Name);
|
||||
if (succ)
|
||||
{
|
||||
_repo.MarkWorkingCopyDirtyManually();
|
||||
|
||||
if (DropAfterApply)
|
||||
{
|
||||
await new Commands.Stash(_repo.FullPath)
|
||||
.Use(log)
|
||||
.DropAsync(Stash.Name);
|
||||
|
||||
_repo.MarkStashesDirtyManually();
|
||||
}
|
||||
}
|
||||
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -46,7 +46,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = "Archiving ...";
|
||||
|
||||
var log = _repo.CreateLog("Archive");
|
||||
@@ -57,7 +57,6 @@ namespace SourceGit.ViewModels
|
||||
.ExecAsync();
|
||||
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
|
||||
if (succ)
|
||||
App.SendNotification(_repo.FullPath, $"Save archive to : {_saveFile}");
|
||||
|
||||
@@ -39,7 +39,7 @@ namespace SourceGit.ViewModels
|
||||
if (_url.Equals(Submodule.URL, StringComparison.Ordinal))
|
||||
return true;
|
||||
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = "Change submodule's url...";
|
||||
|
||||
var log = _repo.CreateLog("Change Submodule's URL");
|
||||
@@ -50,7 +50,6 @@ namespace SourceGit.ViewModels
|
||||
.SetURLAsync(Submodule.Path, _url);
|
||||
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return succ;
|
||||
}
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = $"Checkout '{Branch}' ...";
|
||||
|
||||
var log = _repo.CreateLog($"Checkout '{Branch}'");
|
||||
@@ -49,10 +49,7 @@ namespace SourceGit.ViewModels
|
||||
var msg = App.Text("Checkout.WarnLostCommits");
|
||||
var shouldContinue = await App.AskConfirmAsync(msg);
|
||||
if (!shouldContinue)
|
||||
{
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -70,7 +67,6 @@ namespace SourceGit.ViewModels
|
||||
if (!succ)
|
||||
{
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -106,7 +102,6 @@ namespace SourceGit.ViewModels
|
||||
_repo.SetBranchFilterMode(b, Models.FilterMode.Included, false, false);
|
||||
|
||||
_repo.MarkBranchesDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
|
||||
ProgressDescription = "Waiting for branch updated...";
|
||||
await Task.Delay(400);
|
||||
|
||||
@@ -40,7 +40,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = $"Checkout and Fast-Forward '{LocalBranch.Name}' ...";
|
||||
|
||||
var log = _repo.CreateLog($"Checkout and Fast-Forward '{LocalBranch.Name}' ...");
|
||||
@@ -54,10 +54,7 @@ namespace SourceGit.ViewModels
|
||||
var msg = App.Text("Checkout.WarnLostCommits");
|
||||
var shouldContinue = await App.AskConfirmAsync(msg);
|
||||
if (!shouldContinue)
|
||||
{
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,7 +72,6 @@ namespace SourceGit.ViewModels
|
||||
if (!succ)
|
||||
{
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -110,7 +106,6 @@ namespace SourceGit.ViewModels
|
||||
_repo.SetBranchFilterMode(LocalBranch, Models.FilterMode.Included, false, false);
|
||||
|
||||
_repo.MarkBranchesDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
|
||||
ProgressDescription = "Waiting for branch updated...";
|
||||
await Task.Delay(400);
|
||||
|
||||
@@ -35,7 +35,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = $"Checkout Commit '{Commit.SHA}' ...";
|
||||
|
||||
var log = _repo.CreateLog("Checkout Commit");
|
||||
@@ -49,10 +49,7 @@ namespace SourceGit.ViewModels
|
||||
var msg = App.Text("Checkout.WarnLostCommits");
|
||||
var shouldContinue = await App.AskConfirmAsync(msg);
|
||||
if (!shouldContinue)
|
||||
{
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -70,7 +67,6 @@ namespace SourceGit.ViewModels
|
||||
if (!succ)
|
||||
{
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -100,7 +96,6 @@ namespace SourceGit.ViewModels
|
||||
}
|
||||
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return succ;
|
||||
}
|
||||
|
||||
|
||||
@@ -65,7 +65,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
_repo.ClearCommitMessage();
|
||||
ProgressDescription = "Cherry-Pick commit(s) ...";
|
||||
|
||||
@@ -96,7 +96,6 @@ namespace SourceGit.ViewModels
|
||||
}
|
||||
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = "Cleanup (GC & prune) ...";
|
||||
|
||||
var log = _repo.CreateLog("Cleanup (GC & prune)");
|
||||
@@ -22,7 +22,6 @@ namespace SourceGit.ViewModels
|
||||
.ExecAsync();
|
||||
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = "Clear all stashes...";
|
||||
|
||||
var log = _repo.CreateLog("Clear Stashes");
|
||||
@@ -22,7 +22,7 @@ namespace SourceGit.ViewModels
|
||||
.ClearAsync();
|
||||
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
_repo.MarkStashesDirtyManually();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -116,7 +116,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
|
||||
var log = _repo.CreateLog($"Create Branch '{_name}'");
|
||||
Use(log);
|
||||
@@ -131,10 +131,7 @@ namespace SourceGit.ViewModels
|
||||
var msg = App.Text("Checkout.WarnLostCommits");
|
||||
var shouldContinue = await App.AskConfirmAsync(msg);
|
||||
if (!shouldContinue)
|
||||
{
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -154,7 +151,6 @@ namespace SourceGit.ViewModels
|
||||
if (!succ)
|
||||
{
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -225,7 +221,6 @@ namespace SourceGit.ViewModels
|
||||
}
|
||||
|
||||
_repo.MarkBranchesDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
|
||||
if (CheckoutAfterCreated)
|
||||
{
|
||||
|
||||
@@ -76,7 +76,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = "Create tag...";
|
||||
|
||||
var remotes = PushToRemotes ? _repo.Remotes : null;
|
||||
@@ -99,7 +99,6 @@ namespace SourceGit.ViewModels
|
||||
}
|
||||
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return succ;
|
||||
}
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = "De-initialize Submodule";
|
||||
|
||||
var log = _repo.CreateLog("De-initialize Submodule");
|
||||
@@ -36,7 +36,6 @@ namespace SourceGit.ViewModels
|
||||
.DeinitAsync(Submodule, false);
|
||||
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return succ;
|
||||
}
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = "Deleting branch...";
|
||||
|
||||
var log = _repo.CreateLog("Delete Branch");
|
||||
@@ -63,7 +63,6 @@ namespace SourceGit.ViewModels
|
||||
|
||||
log.Complete();
|
||||
_repo.MarkBranchesDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = "Deleting multiple branches...";
|
||||
|
||||
var log = _repo.CreateLog("Delete Multiple Branches");
|
||||
@@ -50,7 +50,6 @@ namespace SourceGit.ViewModels
|
||||
|
||||
log.Complete();
|
||||
_repo.MarkBranchesDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = "Deleting multiple tags...";
|
||||
|
||||
var log = _repo.CreateLog("Delete Multiple Tags");
|
||||
@@ -47,7 +47,6 @@ namespace SourceGit.ViewModels
|
||||
|
||||
log.Complete();
|
||||
_repo.MarkTagsDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = "Deleting remote ...";
|
||||
|
||||
var log = _repo.CreateLog("Delete Remote");
|
||||
@@ -30,7 +30,6 @@ namespace SourceGit.ViewModels
|
||||
|
||||
log.Complete();
|
||||
_repo.MarkBranchesDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return succ;
|
||||
}
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = "Deleting submodule ...";
|
||||
|
||||
var log = _repo.CreateLog("Delete Submodule");
|
||||
@@ -29,7 +29,6 @@ namespace SourceGit.ViewModels
|
||||
.DeleteAsync(Submodule);
|
||||
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return succ;
|
||||
}
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = $"Deleting tag '{Target.Name}' ...";
|
||||
|
||||
var remotes = PushToRemotes ? _repo.Remotes : [];
|
||||
@@ -45,7 +45,6 @@ namespace SourceGit.ViewModels
|
||||
|
||||
log.Complete();
|
||||
_repo.MarkTagsDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return succ;
|
||||
}
|
||||
|
||||
|
||||
@@ -64,7 +64,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = _changes == null ? "Discard all local changes ..." : $"Discard total {_changes.Count} changes ...";
|
||||
|
||||
var log = _repo.CreateLog("Discard all");
|
||||
@@ -77,7 +77,6 @@ namespace SourceGit.ViewModels
|
||||
|
||||
log.Complete();
|
||||
_repo.MarkWorkingCopyDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = $"Dropping stash: {Stash.Name}";
|
||||
|
||||
var log = _repo.CreateLog("Drop Stash");
|
||||
@@ -24,6 +25,7 @@ namespace SourceGit.ViewModels
|
||||
.DropAsync(Stash.Name);
|
||||
|
||||
log.Complete();
|
||||
_repo.MarkStashesDirtyManually();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -100,7 +100,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = $"Editing remote '{_remote.Name}' ...";
|
||||
|
||||
if (_remote.Name != _name)
|
||||
@@ -122,8 +122,6 @@ namespace SourceGit.ViewModels
|
||||
await new Commands.Remote(_repo.FullPath).SetURLAsync(_name, _url, true);
|
||||
|
||||
await new Commands.Config(_repo.FullPath).SetAsync($"remote.{_name}.sshkey", _useSSH ? SSHKey : null);
|
||||
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -129,7 +129,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = "Run custom action ...";
|
||||
|
||||
var cmdline = PrepareStringByTarget(CustomAction.Arguments);
|
||||
@@ -150,7 +150,6 @@ namespace SourceGit.ViewModels
|
||||
_ = Task.Run(() => Run(cmdline));
|
||||
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -66,7 +66,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
|
||||
var notags = _repo.Settings.FetchWithoutTags;
|
||||
var force = _repo.Settings.EnableForceOnFetch;
|
||||
@@ -97,7 +97,6 @@ namespace SourceGit.ViewModels
|
||||
}
|
||||
|
||||
_repo.MarkFetched();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = "Fast-Forward ...";
|
||||
|
||||
var log = _repo.CreateLog($"Fetch Into '{Local.FriendlyName}'");
|
||||
@@ -37,7 +37,6 @@ namespace SourceGit.ViewModels
|
||||
|
||||
var newHead = await new Commands.QueryRevisionByRefName(_repo.FullPath, Local.Name).GetResultAsync();
|
||||
_repo.NavigateToCommit(newHead, true);
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = $"Git Flow - Finish {Branch.Name} ...";
|
||||
|
||||
var log = _repo.CreateLog("GitFlow - Finish");
|
||||
@@ -53,7 +53,6 @@ namespace SourceGit.ViewModels
|
||||
var succ = await Commands.GitFlow.FinishAsync(_repo.FullPath, Type, name, Squash, AutoPush, KeepBranch, log);
|
||||
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return succ;
|
||||
}
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = $"Git Flow - Start {Prefix}{_name} ...";
|
||||
|
||||
var log = _repo.CreateLog("GitFlow - Start");
|
||||
@@ -59,7 +59,6 @@ namespace SourceGit.ViewModels
|
||||
|
||||
var succ = await Commands.GitFlow.StartAsync(_repo.FullPath, Type, _name, log);
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return succ;
|
||||
}
|
||||
|
||||
|
||||
@@ -102,7 +102,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = "Init git-flow ...";
|
||||
|
||||
var log = _repo.CreateLog("Gitflow - Init");
|
||||
@@ -120,7 +120,6 @@ namespace SourceGit.ViewModels
|
||||
if (!succ)
|
||||
{
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -134,7 +133,6 @@ namespace SourceGit.ViewModels
|
||||
if (!succ)
|
||||
{
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -162,7 +160,6 @@ namespace SourceGit.ViewModels
|
||||
_repo.GitFlow = gitflow;
|
||||
}
|
||||
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return succ;
|
||||
}
|
||||
|
||||
|
||||
@@ -222,7 +222,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public async Task<bool> Start()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
|
||||
var saveFile = Path.Combine(_repo.GitDir, "sourcegit.interactive_rebase");
|
||||
var collection = new Models.InteractiveRebaseJobCollection();
|
||||
@@ -249,7 +249,6 @@ namespace SourceGit.ViewModels
|
||||
.ExecAsync();
|
||||
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return succ;
|
||||
}
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = "Fetching LFS objects from remote ...";
|
||||
|
||||
var log = _repo.CreateLog("LFS Fetch");
|
||||
@@ -32,7 +32,6 @@ namespace SourceGit.ViewModels
|
||||
.FetchAsync(SelectedRemote.Name);
|
||||
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = "LFS prune ...";
|
||||
|
||||
var log = _repo.CreateLog("LFS Prune");
|
||||
@@ -22,7 +22,6 @@ namespace SourceGit.ViewModels
|
||||
.PruneAsync();
|
||||
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = "Pull LFS objects from remote ...";
|
||||
|
||||
var log = _repo.CreateLog("LFS Pull");
|
||||
@@ -32,7 +32,6 @@ namespace SourceGit.ViewModels
|
||||
.PullAsync(SelectedRemote.Name);
|
||||
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = "Push LFS objects to remote ...";
|
||||
|
||||
var log = _repo.CreateLog("LFS Push");
|
||||
@@ -32,7 +32,6 @@ namespace SourceGit.ViewModels
|
||||
.PushAsync(SelectedRemote.Name);
|
||||
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = "Adding custom LFS tracking pattern ...";
|
||||
|
||||
var log = _repo.CreateLog("LFS Add Custom Pattern");
|
||||
@@ -36,7 +36,6 @@ namespace SourceGit.ViewModels
|
||||
.TrackAsync(_pattern, IsFilename);
|
||||
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return succ;
|
||||
}
|
||||
|
||||
|
||||
@@ -58,7 +58,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
_repo.ClearCommitMessage();
|
||||
ProgressDescription = $"Merging '{_sourceName}' into '{Into}' ...";
|
||||
|
||||
@@ -73,7 +73,6 @@ namespace SourceGit.ViewModels
|
||||
|
||||
var head = await new Commands.QueryRevisionByRefName(_repo.FullPath, "HEAD").GetResultAsync();
|
||||
_repo.NavigateToCommit(head, true);
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
_repo.ClearCommitMessage();
|
||||
ProgressDescription = "Merge head(s) ...";
|
||||
|
||||
@@ -56,7 +56,6 @@ namespace SourceGit.ViewModels
|
||||
.ExecAsync();
|
||||
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -34,8 +34,8 @@ namespace SourceGit.ViewModels
|
||||
if (oldPath.Equals(newPath, StringComparison.Ordinal))
|
||||
return true;
|
||||
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
var log = _repo.CreateLog("Move Submodule");
|
||||
_repo.SetWatcherEnabled(false);
|
||||
Use(log);
|
||||
|
||||
var succ = await new Commands.Move(_repo.FullPath, oldPath, newPath, false)
|
||||
@@ -43,7 +43,6 @@ namespace SourceGit.ViewModels
|
||||
.ExecAsync();
|
||||
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return succ;
|
||||
}
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = "Run `prune` on remote ...";
|
||||
|
||||
var log = _repo.CreateLog($"Prune Remote '{Remote.Name}'");
|
||||
@@ -28,7 +28,6 @@ namespace SourceGit.ViewModels
|
||||
.PruneAsync(Remote.Name);
|
||||
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return succ;
|
||||
}
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = "Prune worktrees ...";
|
||||
|
||||
var log = _repo.CreateLog("Prune Worktrees");
|
||||
@@ -22,7 +22,6 @@ namespace SourceGit.ViewModels
|
||||
.PruneAsync();
|
||||
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -113,7 +113,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
|
||||
var log = _repo.CreateLog("Pull");
|
||||
Use(log);
|
||||
@@ -133,7 +133,6 @@ namespace SourceGit.ViewModels
|
||||
if (!succ)
|
||||
{
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -163,7 +162,6 @@ namespace SourceGit.ViewModels
|
||||
|
||||
var head = await new Commands.QueryRevisionByRefName(_repo.FullPath, "HEAD").GetResultAsync();
|
||||
_repo.NavigateToCommit(head, true);
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return rs;
|
||||
}
|
||||
|
||||
|
||||
@@ -160,7 +160,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
|
||||
var remoteBranchName = _selectedRemoteBranch.Name;
|
||||
ProgressDescription = $"Push {_selectedLocalBranch.Name} -> {_selectedRemote.Name}/{remoteBranchName} ...";
|
||||
@@ -179,7 +179,6 @@ namespace SourceGit.ViewModels
|
||||
ForcePush).Use(log).RunAsync();
|
||||
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return succ;
|
||||
}
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = $"Push {Revision.SHA.AsSpan(0, 10)} -> {RemoteBranch.FriendlyName} ...";
|
||||
|
||||
var log = _repo.CreateLog("Push Revision");
|
||||
@@ -48,7 +48,6 @@ namespace SourceGit.ViewModels
|
||||
Force).Use(log).RunAsync();
|
||||
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return succ;
|
||||
}
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = "Pushing tag ...";
|
||||
|
||||
var log = _repo.CreateLog("Push Tag");
|
||||
@@ -63,7 +63,6 @@ namespace SourceGit.ViewModels
|
||||
}
|
||||
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return succ;
|
||||
}
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
_repo.ClearCommitMessage();
|
||||
ProgressDescription = "Rebasing ...";
|
||||
|
||||
@@ -54,7 +54,6 @@ namespace SourceGit.ViewModels
|
||||
.ExecAsync();
|
||||
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = "Remove worktree ...";
|
||||
|
||||
var log = _repo.CreateLog("Remove worktree");
|
||||
@@ -34,7 +34,6 @@ namespace SourceGit.ViewModels
|
||||
.RemoveAsync(Target.FullPath, Force);
|
||||
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return succ;
|
||||
}
|
||||
|
||||
|
||||
@@ -46,7 +46,7 @@ namespace SourceGit.ViewModels
|
||||
if (Target.Name.Equals(_name, StringComparison.Ordinal))
|
||||
return true;
|
||||
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = $"Rename '{Target.Name}'";
|
||||
|
||||
var log = _repo.CreateLog($"Rename Branch '{Target.Name}'");
|
||||
@@ -74,7 +74,6 @@ namespace SourceGit.ViewModels
|
||||
|
||||
log.Complete();
|
||||
_repo.MarkBranchesDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
|
||||
if (isCurrent)
|
||||
{
|
||||
|
||||
@@ -923,9 +923,9 @@ namespace SourceGit.ViewModels
|
||||
});
|
||||
}
|
||||
|
||||
public void SetWatcherEnabled(bool enabled)
|
||||
public IDisposable LockWatcher()
|
||||
{
|
||||
_watcher?.SetEnabled(enabled);
|
||||
return _watcher?.Lock();
|
||||
}
|
||||
|
||||
public void MarkBranchesDirtyManually()
|
||||
@@ -950,6 +950,12 @@ namespace SourceGit.ViewModels
|
||||
RefreshWorkingCopyChanges();
|
||||
}
|
||||
|
||||
public void MarkStashesDirtyManually()
|
||||
{
|
||||
_watcher?.MarkStashUpdated();
|
||||
RefreshStashes();
|
||||
}
|
||||
|
||||
public void MarkFetched()
|
||||
{
|
||||
_lastFetchTime = DateTime.Now;
|
||||
@@ -1119,8 +1125,8 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public async Task ExecBisectCommandAsync(string subcmd)
|
||||
{
|
||||
using var lockWatcher = _watcher?.Lock();
|
||||
IsBisectCommandRunning = true;
|
||||
SetWatcherEnabled(false);
|
||||
|
||||
var log = CreateLog($"Bisect({subcmd})");
|
||||
|
||||
@@ -1135,7 +1141,6 @@ namespace SourceGit.ViewModels
|
||||
|
||||
MarkBranchesDirtyManually();
|
||||
NavigateToCommit(head, true);
|
||||
SetWatcherEnabled(true);
|
||||
IsBisectCommandRunning = false;
|
||||
}
|
||||
|
||||
@@ -1314,7 +1319,6 @@ namespace SourceGit.ViewModels
|
||||
Task.Run(async () =>
|
||||
{
|
||||
var submodules = await new Commands.QuerySubmodules(FullPath).GetResultAsync().ConfigureAwait(false);
|
||||
_watcher?.SetSubmodules(submodules);
|
||||
|
||||
Dispatcher.UIThread.Invoke(() =>
|
||||
{
|
||||
@@ -1608,24 +1612,22 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public async Task LockWorktreeAsync(Models.Worktree worktree)
|
||||
{
|
||||
SetWatcherEnabled(false);
|
||||
using var lockWatcher = _watcher?.Lock();
|
||||
var log = CreateLog("Lock Worktree");
|
||||
var succ = await new Commands.Worktree(FullPath).Use(log).LockAsync(worktree.FullPath);
|
||||
if (succ)
|
||||
worktree.IsLocked = true;
|
||||
log.Complete();
|
||||
SetWatcherEnabled(true);
|
||||
}
|
||||
|
||||
public async Task UnlockWorktreeAsync(Models.Worktree worktree)
|
||||
{
|
||||
SetWatcherEnabled(false);
|
||||
using var lockWatcher = _watcher?.Lock();
|
||||
var log = CreateLog("Unlock Worktree");
|
||||
var succ = await new Commands.Worktree(FullPath).Use(log).UnlockAsync(worktree.FullPath);
|
||||
if (succ)
|
||||
worktree.IsLocked = false;
|
||||
log.Complete();
|
||||
SetWatcherEnabled(true);
|
||||
}
|
||||
|
||||
public List<Models.OpenAIService> GetPreferredOpenAIServices()
|
||||
|
||||
@@ -30,7 +30,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = $"Reset current branch to {To.SHA} ...";
|
||||
|
||||
var log = _repo.CreateLog($"Reset HEAD to '{To.SHA}'");
|
||||
@@ -41,7 +41,6 @@ namespace SourceGit.ViewModels
|
||||
.ExecAsync();
|
||||
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return succ;
|
||||
}
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = $"Reset {Target.Name} to {_revision} ...";
|
||||
|
||||
var log = _repo.CreateLog($"Reset '{Target.Name}' to '{_revision}'");
|
||||
@@ -44,7 +44,6 @@ namespace SourceGit.ViewModels
|
||||
|
||||
log.Complete();
|
||||
_repo.MarkBranchesDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return succ;
|
||||
}
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
_repo.ClearCommitMessage();
|
||||
ProgressDescription = $"Revert commit '{Target.SHA}' ...";
|
||||
|
||||
@@ -36,7 +36,6 @@ namespace SourceGit.ViewModels
|
||||
.ExecAsync();
|
||||
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ namespace SourceGit.ViewModels
|
||||
if (string.Compare(_message, _oldMessage, StringComparison.Ordinal) == 0)
|
||||
return true;
|
||||
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = "Editing HEAD message ...";
|
||||
|
||||
var log = _repo.CreateLog("Reword HEAD");
|
||||
@@ -60,7 +60,6 @@ namespace SourceGit.ViewModels
|
||||
if (!succ)
|
||||
{
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -75,7 +74,6 @@ namespace SourceGit.ViewModels
|
||||
.PopAsync("stash@{0}");
|
||||
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return succ;
|
||||
}
|
||||
|
||||
|
||||
@@ -30,8 +30,8 @@ namespace SourceGit.ViewModels
|
||||
if (_changeTo.Equals(Submodule.Branch, StringComparison.Ordinal))
|
||||
return true;
|
||||
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
var log = _repo.CreateLog("Set Submodule's Branch");
|
||||
_repo.SetWatcherEnabled(false);
|
||||
Use(log);
|
||||
|
||||
var succ = await new Commands.Submodule(_repo.FullPath)
|
||||
@@ -39,7 +39,6 @@ namespace SourceGit.ViewModels
|
||||
.SetBranchAsync(Submodule.Path, _changeTo);
|
||||
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return succ;
|
||||
}
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = "Squashing ...";
|
||||
|
||||
var log = _repo.CreateLog("Squash");
|
||||
@@ -55,7 +55,6 @@ namespace SourceGit.ViewModels
|
||||
if (!succ)
|
||||
{
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -75,7 +74,6 @@ namespace SourceGit.ViewModels
|
||||
.PopAsync("stash@{0}");
|
||||
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return succ;
|
||||
}
|
||||
|
||||
|
||||
@@ -52,7 +52,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public override async Task<bool> Sure()
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
ProgressDescription = "Stash changes ...";
|
||||
|
||||
var log = _repo.CreateLog("Stash Local Changes");
|
||||
@@ -103,7 +103,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
log.Complete();
|
||||
_repo.MarkWorkingCopyDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
_repo.MarkStashesDirtyManually();
|
||||
return succ;
|
||||
}
|
||||
|
||||
|
||||
@@ -88,7 +88,7 @@ namespace SourceGit.ViewModels
|
||||
return true;
|
||||
|
||||
var log = _repo.CreateLog("Update Submodule");
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
Use(log);
|
||||
|
||||
await new Commands.Submodule(_repo.FullPath)
|
||||
@@ -96,7 +96,6 @@ namespace SourceGit.ViewModels
|
||||
.UpdateAsync(targets, EnableInit, EnableRecursive, EnableRemote);
|
||||
|
||||
log.Complete();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -362,7 +362,8 @@ namespace SourceGit.ViewModels
|
||||
|
||||
IsStaging = true;
|
||||
_selectedUnstaged = next != null ? [next] : [];
|
||||
_repo.SetWatcherEnabled(false);
|
||||
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
|
||||
var log = _repo.CreateLog("Stage");
|
||||
if (count == _unstaged.Count)
|
||||
@@ -384,7 +385,6 @@ namespace SourceGit.ViewModels
|
||||
log.Complete();
|
||||
|
||||
_repo.MarkWorkingCopyDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
IsStaging = false;
|
||||
}
|
||||
|
||||
@@ -396,7 +396,8 @@ namespace SourceGit.ViewModels
|
||||
|
||||
IsUnstaging = true;
|
||||
_selectedStaged = next != null ? [next] : [];
|
||||
_repo.SetWatcherEnabled(false);
|
||||
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
|
||||
var log = _repo.CreateLog("Unstage");
|
||||
if (_useAmend)
|
||||
@@ -423,7 +424,6 @@ namespace SourceGit.ViewModels
|
||||
log.Complete();
|
||||
|
||||
_repo.MarkWorkingCopyDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
IsUnstaging = false;
|
||||
}
|
||||
|
||||
@@ -447,7 +447,7 @@ namespace SourceGit.ViewModels
|
||||
|
||||
public async Task UseTheirsAsync(List<Models.Change> changes)
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
|
||||
var files = new List<string>();
|
||||
var needStage = new List<string>();
|
||||
@@ -489,12 +489,11 @@ namespace SourceGit.ViewModels
|
||||
|
||||
log.Complete();
|
||||
_repo.MarkWorkingCopyDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
}
|
||||
|
||||
public async Task UseMineAsync(List<Models.Change> changes)
|
||||
{
|
||||
_repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
|
||||
var files = new List<string>();
|
||||
var needStage = new List<string>();
|
||||
@@ -536,7 +535,6 @@ namespace SourceGit.ViewModels
|
||||
|
||||
log.Complete();
|
||||
_repo.MarkWorkingCopyDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
}
|
||||
|
||||
public async Task<bool> UseExternalMergeToolAsync(Models.Change change)
|
||||
@@ -553,8 +551,8 @@ namespace SourceGit.ViewModels
|
||||
{
|
||||
if (_inProgressContext != null)
|
||||
{
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
IsCommitting = true;
|
||||
_repo.SetWatcherEnabled(false);
|
||||
|
||||
var mergeMsgFile = Path.Combine(_repo.GitDir, "MERGE_MSG");
|
||||
if (File.Exists(mergeMsgFile) && !string.IsNullOrWhiteSpace(_commitMessage))
|
||||
@@ -564,7 +562,6 @@ namespace SourceGit.ViewModels
|
||||
if (succ)
|
||||
CommitMessage = string.Empty;
|
||||
|
||||
_repo.SetWatcherEnabled(true);
|
||||
IsCommitting = false;
|
||||
}
|
||||
else
|
||||
@@ -577,14 +574,13 @@ namespace SourceGit.ViewModels
|
||||
{
|
||||
if (_inProgressContext != null)
|
||||
{
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
IsCommitting = true;
|
||||
_repo.SetWatcherEnabled(false);
|
||||
|
||||
var succ = await _inProgressContext.SkipAsync();
|
||||
if (succ)
|
||||
CommitMessage = string.Empty;
|
||||
|
||||
_repo.SetWatcherEnabled(true);
|
||||
IsCommitting = false;
|
||||
}
|
||||
else
|
||||
@@ -597,14 +593,13 @@ namespace SourceGit.ViewModels
|
||||
{
|
||||
if (_inProgressContext != null)
|
||||
{
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
IsCommitting = true;
|
||||
_repo.SetWatcherEnabled(false);
|
||||
|
||||
var succ = await _inProgressContext.AbortAsync();
|
||||
if (succ)
|
||||
CommitMessage = string.Empty;
|
||||
|
||||
_repo.SetWatcherEnabled(true);
|
||||
IsCommitting = false;
|
||||
}
|
||||
else
|
||||
@@ -671,9 +666,9 @@ namespace SourceGit.ViewModels
|
||||
}
|
||||
}
|
||||
|
||||
using var lockWatcher = _repo.LockWatcher();
|
||||
IsCommitting = true;
|
||||
_repo.Settings.PushCommitMessage(_commitMessage);
|
||||
_repo.SetWatcherEnabled(false);
|
||||
|
||||
var log = _repo.CreateLog("Commit");
|
||||
var succ = true;
|
||||
@@ -710,7 +705,6 @@ namespace SourceGit.ViewModels
|
||||
}
|
||||
|
||||
_repo.MarkBranchesDirtyManually();
|
||||
_repo.SetWatcherEnabled(true);
|
||||
IsCommitting = false;
|
||||
}
|
||||
|
||||
|
||||
@@ -1506,7 +1506,7 @@ namespace SourceGit.Views
|
||||
if (repoView?.DataContext is not ViewModels.Repository repo)
|
||||
return;
|
||||
|
||||
repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = repo.LockWatcher();
|
||||
|
||||
if (!selection.HasLeftChanges)
|
||||
{
|
||||
@@ -1535,7 +1535,6 @@ namespace SourceGit.Views
|
||||
}
|
||||
|
||||
repo.MarkWorkingCopyDirtyManually();
|
||||
repo.SetWatcherEnabled(true);
|
||||
}
|
||||
|
||||
private async void OnUnstageChunk(object _1, RoutedEventArgs _2)
|
||||
@@ -1555,7 +1554,7 @@ namespace SourceGit.Views
|
||||
if (repoView?.DataContext is not ViewModels.Repository repo)
|
||||
return;
|
||||
|
||||
repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = repo.LockWatcher();
|
||||
|
||||
if (!selection.HasLeftChanges)
|
||||
{
|
||||
@@ -1580,7 +1579,6 @@ namespace SourceGit.Views
|
||||
}
|
||||
|
||||
repo.MarkWorkingCopyDirtyManually();
|
||||
repo.SetWatcherEnabled(true);
|
||||
}
|
||||
|
||||
private async void OnDiscardChunk(object _1, RoutedEventArgs _2)
|
||||
@@ -1601,7 +1599,7 @@ namespace SourceGit.Views
|
||||
if (repoView?.DataContext is not ViewModels.Repository repo)
|
||||
return;
|
||||
|
||||
repo.SetWatcherEnabled(false);
|
||||
using var lockWatcher = repo.LockWatcher();
|
||||
|
||||
if (!selection.HasLeftChanges)
|
||||
{
|
||||
@@ -1630,7 +1628,6 @@ namespace SourceGit.Views
|
||||
}
|
||||
|
||||
repo.MarkWorkingCopyDirtyManually();
|
||||
repo.SetWatcherEnabled(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user