Skip to content

Commit 626a20a

Browse files
authored
enhance: respect git config merge.ff (#1495)
This adds another configuration possibility for the default merge mode to the already existing per branch git configuration `branch.<name>.mergeoptions` (#540) and the per repo preference "Preferred Merge Mode" (#1156). Defined values: - `false`: do no fast-forward merge - `only`: do only a fast-forward merge This is configurable by for example `git config set --global merge.ff <value>` for a global (meaning the current user) configuration. The priority between these configurations/preferences is: - git configuration `branch.<name>.mergeoptions` (#540) - git configuration `merge.ff` - preference "Preferred Merge Mode" (#1156)
1 parent b7d1f93 commit 626a20a

File tree

2 files changed

+55
-18
lines changed

2 files changed

+55
-18
lines changed

src/Models/MergeMode.cs

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,28 @@
22
{
33
public class MergeMode
44
{
5+
public static readonly MergeMode Default =
6+
new MergeMode("Default", "Fast-forward if possible", "");
7+
8+
public static readonly MergeMode FastForward =
9+
new MergeMode("Fast-forward", "Refuse to merge when fast-forward is not possible", "--ff-only");
10+
11+
public static readonly MergeMode NoFastForward =
12+
new MergeMode("No Fast-forward", "Always create a merge commit", "--no-ff");
13+
14+
public static readonly MergeMode Squash =
15+
new MergeMode("Squash", "Squash merge", "--squash");
16+
17+
public static readonly MergeMode DontCommit
18+
= new MergeMode("Don't commit", "Merge without commit", "--no-ff --no-commit");
19+
520
public static readonly MergeMode[] Supported =
621
[
7-
new MergeMode("Default", "Fast-forward if possible", ""),
8-
new MergeMode("Fast-forward", "Refuse to merge when fast-forward is not possible", "--ff-only"),
9-
new MergeMode("No Fast-forward", "Always create a merge commit", "--no-ff"),
10-
new MergeMode("Squash", "Squash merge", "--squash"),
11-
new MergeMode("Don't commit", "Merge without commit", "--no-ff --no-commit"),
22+
Default,
23+
FastForward,
24+
NoFastForward,
25+
Squash,
26+
DontCommit,
1227
];
1328

1429
public string Name { get; set; }

src/ViewModels/Merge.cs

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public Merge(Repository repo, Models.Branch source, string into, bool forceFastF
3434

3535
Source = source;
3636
Into = into;
37-
Mode = forceFastForward ? Models.MergeMode.Supported[1] : AutoSelectMergeMode();
37+
Mode = forceFastForward ? Models.MergeMode.FastForward : AutoSelectMergeMode();
3838
}
3939

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

8484
private Models.MergeMode AutoSelectMergeMode()
85+
{
86+
return
87+
GetGitConfigBranchMergeOptions()
88+
?? GetGitConfigMergeFF()
89+
?? GetSettingsPreferredMergeMode();
90+
}
91+
92+
private Models.MergeMode GetSettingsPreferredMergeMode()
8593
{
8694
var preferredMergeModeIdx = _repo.Settings.PreferredMergeMode;
8795
if (preferredMergeModeIdx < 0 || preferredMergeModeIdx > Models.MergeMode.Supported.Length)
8896
preferredMergeModeIdx = 0;
8997

9098
var defaultMergeMode = Models.MergeMode.Supported[preferredMergeModeIdx];
91-
var config = new Commands.Config(_repo.FullPath).Get($"branch.{Into}.mergeoptions");
92-
if (string.IsNullOrEmpty(config))
93-
return defaultMergeMode;
94-
if (config.Equals("--ff-only", StringComparison.Ordinal))
95-
return Models.MergeMode.Supported[1];
96-
if (config.Equals("--no-ff", StringComparison.Ordinal))
97-
return Models.MergeMode.Supported[2];
98-
if (config.Equals("--squash", StringComparison.Ordinal))
99-
return Models.MergeMode.Supported[3];
100-
if (config.Equals("--no-commit", StringComparison.Ordinal) || config.Equals("--no-ff --no-commit", StringComparison.Ordinal))
101-
return Models.MergeMode.Supported[4];
102-
10399
return defaultMergeMode;
104100
}
105101

102+
private Models.MergeMode GetGitConfigMergeFF()
103+
{
104+
var config = new Commands.Config(_repo.FullPath).Get("merge.ff");
105+
return config switch
106+
{
107+
null or "" => null,
108+
"false" => Models.MergeMode.NoFastForward,
109+
"only" => Models.MergeMode.FastForward,
110+
_ => null
111+
};
112+
}
113+
114+
private Models.MergeMode GetGitConfigBranchMergeOptions()
115+
{
116+
var config = new Commands.Config(_repo.FullPath).Get($"branch.{Into}.mergeoptions");
117+
return config switch
118+
{
119+
null or "" => null,
120+
"--ff-only" => Models.MergeMode.FastForward,
121+
"--no-ff" => Models.MergeMode.NoFastForward,
122+
"--squash" => Models.MergeMode.Squash,
123+
"--no-commit" or "--no-ff --no-commit" => Models.MergeMode.DontCommit,
124+
_ => null
125+
};
126+
}
127+
106128
private readonly Repository _repo = null;
107129
private readonly string _sourceName;
108130
}

0 commit comments

Comments
 (0)