Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 20 additions & 5 deletions src/Models/MergeMode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,28 @@
{
public class MergeMode
{
public static readonly MergeMode Default =
new MergeMode("Default", "Fast-forward if possible", "");

public static readonly MergeMode FastForward =
new MergeMode("Fast-forward", "Refuse to merge when fast-forward is not possible", "--ff-only");

public static readonly MergeMode NoFastForward =
new MergeMode("No Fast-forward", "Always create a merge commit", "--no-ff");

public static readonly MergeMode Squash =
new MergeMode("Squash", "Squash merge", "--squash");

public static readonly MergeMode DontCommit
= new MergeMode("Don't commit", "Merge without commit", "--no-ff --no-commit");

public static readonly MergeMode[] Supported =
[
new MergeMode("Default", "Fast-forward if possible", ""),
new MergeMode("Fast-forward", "Refuse to merge when fast-forward is not possible", "--ff-only"),
new MergeMode("No Fast-forward", "Always create a merge commit", "--no-ff"),
new MergeMode("Squash", "Squash merge", "--squash"),
new MergeMode("Don't commit", "Merge without commit", "--no-ff --no-commit"),
Default,
FastForward,
NoFastForward,
Squash,
DontCommit,
];

public string Name { get; set; }
Expand Down
48 changes: 35 additions & 13 deletions src/ViewModels/Merge.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public Merge(Repository repo, Models.Branch source, string into, bool forceFastF

Source = source;
Into = into;
Mode = forceFastForward ? Models.MergeMode.Supported[1] : AutoSelectMergeMode();
Mode = forceFastForward ? Models.MergeMode.FastForward : AutoSelectMergeMode();
}

public Merge(Repository repo, Models.Commit source, string into)
Expand Down Expand Up @@ -82,27 +82,49 @@ public override Task<bool> Sure()
}

private Models.MergeMode AutoSelectMergeMode()
{
return
GetGitConfigBranchMergeOptions()
?? GetGitConfigMergeFF()
?? GetSettingsPreferredMergeMode();
}

private Models.MergeMode GetSettingsPreferredMergeMode()
{
var preferredMergeModeIdx = _repo.Settings.PreferredMergeMode;
if (preferredMergeModeIdx < 0 || preferredMergeModeIdx > Models.MergeMode.Supported.Length)
preferredMergeModeIdx = 0;

var defaultMergeMode = Models.MergeMode.Supported[preferredMergeModeIdx];
var config = new Commands.Config(_repo.FullPath).Get($"branch.{Into}.mergeoptions");
if (string.IsNullOrEmpty(config))
return defaultMergeMode;
if (config.Equals("--ff-only", StringComparison.Ordinal))
return Models.MergeMode.Supported[1];
if (config.Equals("--no-ff", StringComparison.Ordinal))
return Models.MergeMode.Supported[2];
if (config.Equals("--squash", StringComparison.Ordinal))
return Models.MergeMode.Supported[3];
if (config.Equals("--no-commit", StringComparison.Ordinal) || config.Equals("--no-ff --no-commit", StringComparison.Ordinal))
return Models.MergeMode.Supported[4];

return defaultMergeMode;
}

private Models.MergeMode GetGitConfigMergeFF()
{
var config = new Commands.Config(_repo.FullPath).Get("merge.ff");
return config switch
{
null or "" => null,
"false" => Models.MergeMode.NoFastForward,
"only" => Models.MergeMode.FastForward,
_ => null
};
}

private Models.MergeMode GetGitConfigBranchMergeOptions()
{
var config = new Commands.Config(_repo.FullPath).Get($"branch.{Into}.mergeoptions");
return config switch
{
null or "" => null,
"--ff-only" => Models.MergeMode.FastForward,
"--no-ff" => Models.MergeMode.NoFastForward,
"--squash" => Models.MergeMode.Squash,
"--no-commit" or "--no-ff --no-commit" => Models.MergeMode.DontCommit,
_ => null
};
}

private readonly Repository _repo = null;
private readonly string _sourceName;
}
Expand Down