sourcegit/src/ViewModels/MergeMultiple.cs
leo 94daa46db9
code_review: PR #793
* do NOT modify the existing merge, and add a new constructor for `Commands.Merge` instead
* rewrite `ViewModels.MergeMultiple`
  - since `_histories.Commits.Find` may returns null, use `List<object>` instead of `List<Models.Commits>`
  - supports display merge target as both `Models.Commit` and `Models.Branch`
* rename translation key `Text.MergeMultiple.Commit` to `Text.MergeMultiple.Targets`, and add translations for zh_CN and zh_TW
* some UI/UX changes
2024-12-09 21:12:58 +08:00

93 lines
2.6 KiB
C#

using System.Collections.Generic;
using System.Threading.Tasks;
namespace SourceGit.ViewModels
{
public class MergeMultiple : Popup
{
public List<object> Targets
{
get;
private set;
} = [];
public bool AutoCommit
{
get;
set;
}
public Models.MergeStrategy Strategy
{
get;
set;
}
public MergeMultiple(Repository repo, List<Models.Commit> commits)
{
_repo = repo;
Targets.AddRange(commits);
AutoCommit = true;
Strategy = Models.MergeStrategy.ForMultiple[0];
View = new Views.MergeMultiple() { DataContext = this };
}
public MergeMultiple(Repository repo, List<Models.Branch> branches)
{
_repo = repo;
Targets.AddRange(branches);
AutoCommit = true;
Strategy = Models.MergeStrategy.ForMultiple[0];
View = new Views.MergeMultiple() { DataContext = this };
}
public override Task<bool> Sure()
{
_repo.SetWatcherEnabled(false);
ProgressDescription = "Merge head(s) ...";
return Task.Run(() =>
{
var succ = new Commands.Merge(
_repo.FullPath,
ConvertTargetToMergeSources(),
AutoCommit,
Strategy.Arg,
SetProgressDescription).Exec();
CallUIThread(() => _repo.SetWatcherEnabled(true));
return succ;
});
}
private List<string> ConvertTargetToMergeSources()
{
var ret = new List<string>();
foreach (var t in Targets)
{
if (t is Models.Branch branch)
{
ret.Add(branch.FriendlyName);
}
else if (t is Models.Commit commit)
{
var d = commit.Decorators.Find(x =>
{
return x.Type == Models.DecoratorType.LocalBranchHead ||
x.Type == Models.DecoratorType.RemoteBranchHead ||
x.Type == Models.DecoratorType.Tag;
});
if (d != null)
ret.Add(d.Name);
else
ret.Add(commit.SHA);
}
}
return ret;
}
private readonly Repository _repo = null;
}
}