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:
leo
2025-09-01 17:01:08 +08:00
parent 2c96a13e25
commit cd80a55629
62 changed files with 213 additions and 250 deletions

View File

@@ -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>();
}
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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}");

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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);

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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)
{

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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)
{

View File

@@ -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()

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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);
}
}
}