fix: resolve conflict with deleted files does not work (#1009)

Signed-off-by: leo <longshuang@msn.cn>
This commit is contained in:
leo 2025-02-21 10:26:14 +08:00
parent 9da2c787db
commit 2b4fc64c73
No known key found for this signature in database
3 changed files with 64 additions and 18 deletions

View file

@ -12,7 +12,7 @@ namespace SourceGit.Commands
Args = includeUntracked ? "add ." : "add -u ."; Args = includeUntracked ? "add ." : "add -u .";
} }
public Add(string repo, List<Models.Change> changes) public Add(string repo, List<string> changes)
{ {
WorkingDirectory = repo; WorkingDirectory = repo;
Context = repo; Context = repo;
@ -22,7 +22,7 @@ namespace SourceGit.Commands
foreach (var c in changes) foreach (var c in changes)
{ {
builder.Append(" \""); builder.Append(" \"");
builder.Append(c.Path); builder.Append(c);
builder.Append("\""); builder.Append("\"");
} }
Args = builder.ToString(); Args = builder.ToString();

View file

@ -353,38 +353,80 @@ namespace SourceGit.ViewModels
public async void UseTheirs(List<Models.Change> changes) public async void UseTheirs(List<Models.Change> changes)
{ {
_repo.SetWatcherEnabled(false);
var files = new List<string>(); var files = new List<string>();
var needStage = new List<string>();
foreach (var change in changes) foreach (var change in changes)
{ {
if (change.IsConflit) if (!change.IsConflit)
continue;
if (change.WorkTree == Models.ChangeState.Deleted)
{
var fullpath = Path.Combine(_repo.FullPath, change.Path);
if (File.Exists(fullpath))
File.Delete(fullpath);
needStage.Add(change.Path);
}
else
{
files.Add(change.Path); files.Add(change.Path);
} }
}
_repo.SetWatcherEnabled(false); if (files.Count > 0)
{
var succ = await Task.Run(() => new Commands.Checkout(_repo.FullPath).UseTheirs(files)); var succ = await Task.Run(() => new Commands.Checkout(_repo.FullPath).UseTheirs(files));
if (succ) if (succ)
{ needStage.AddRange(files);
await Task.Run(() => new Commands.Add(_repo.FullPath, changes).Exec());
} }
if (needStage.Count > 0)
await Task.Run(() => new Commands.Add(_repo.FullPath, needStage).Exec());
_repo.MarkWorkingCopyDirtyManually(); _repo.MarkWorkingCopyDirtyManually();
_repo.SetWatcherEnabled(true); _repo.SetWatcherEnabled(true);
} }
public async void UseMine(List<Models.Change> changes) public async void UseMine(List<Models.Change> changes)
{ {
_repo.SetWatcherEnabled(false);
var files = new List<string>(); var files = new List<string>();
var needStage = new List<string>();
foreach (var change in changes) foreach (var change in changes)
{ {
if (change.IsConflit) if (!change.IsConflit)
continue;
if (change.Index == Models.ChangeState.Deleted)
{
var fullpath = Path.Combine(_repo.FullPath, change.Path);
if (File.Exists(fullpath))
File.Delete(fullpath);
needStage.Add(change.Path);
}
else
{
files.Add(change.Path); files.Add(change.Path);
} }
}
_repo.SetWatcherEnabled(false); if (files.Count > 0)
{
var succ = await Task.Run(() => new Commands.Checkout(_repo.FullPath).UseMine(files)); var succ = await Task.Run(() => new Commands.Checkout(_repo.FullPath).UseMine(files));
if (succ) if (succ)
{ needStage.AddRange(files);
await Task.Run(() => new Commands.Add(_repo.FullPath, changes).Exec());
} }
if (needStage.Count > 0)
await Task.Run(() => new Commands.Add(_repo.FullPath, needStage).Exec());
_repo.MarkWorkingCopyDirtyManually(); _repo.MarkWorkingCopyDirtyManually();
_repo.SetWatcherEnabled(true); _repo.SetWatcherEnabled(true);
} }
@ -1502,7 +1544,8 @@ namespace SourceGit.ViewModels
private async void StageChanges(List<Models.Change> changes, Models.Change next) private async void StageChanges(List<Models.Change> changes, Models.Change next)
{ {
if (changes.Count == 0) var count = changes.Count;
if (count == 0)
return; return;
// Use `_selectedUnstaged` instead of `SelectedUnstaged` to avoid UI refresh. // Use `_selectedUnstaged` instead of `SelectedUnstaged` to avoid UI refresh.
@ -1510,7 +1553,7 @@ namespace SourceGit.ViewModels
IsStaging = true; IsStaging = true;
_repo.SetWatcherEnabled(false); _repo.SetWatcherEnabled(false);
if (changes.Count == _unstaged.Count) if (count == _unstaged.Count)
{ {
await Task.Run(() => new Commands.Add(_repo.FullPath, _repo.IncludeUntracked).Exec()); await Task.Run(() => new Commands.Add(_repo.FullPath, _repo.IncludeUntracked).Exec());
} }
@ -1527,10 +1570,13 @@ namespace SourceGit.ViewModels
} }
else else
{ {
for (int i = 0; i < changes.Count; i += 10) var paths = new List<string>();
foreach (var c in changes)
paths.Add(c.Path);
for (int i = 0; i < count; i += 10)
{ {
var count = Math.Min(10, changes.Count - i); var step = paths.GetRange(i, Math.Min(10, count - i));
var step = changes.GetRange(i, count);
await Task.Run(() => new Commands.Add(_repo.FullPath, step).Exec()); await Task.Run(() => new Commands.Add(_repo.FullPath, step).Exec());
} }
} }

View file

@ -1796,7 +1796,7 @@ namespace SourceGit.Views
if (!selection.HasLeftChanges) if (!selection.HasLeftChanges)
{ {
new Commands.Add(repo.FullPath, [change]).Exec(); new Commands.Add(repo.FullPath, [change.Path]).Exec();
} }
else else
{ {