diff --git a/src/GitHub.Api/Application/ApplicationManagerBase.cs b/src/GitHub.Api/Application/ApplicationManagerBase.cs
index dd2b60893..82b0f8225 100644
--- a/src/GitHub.Api/Application/ApplicationManagerBase.cs
+++ b/src/GitHub.Api/Application/ApplicationManagerBase.cs
@@ -190,7 +190,7 @@ public void SetupGit(GitInstaller.GitInstallationState state)
{
if (Environment.RepositoryPath.IsInitialized)
{
- ConfigureMergeSettings();
+ UpdateMergeSettings();
GitClient.LfsInstall()
.Catch(e =>
@@ -280,25 +280,58 @@ public void InitializeRepository()
thread.Start();
}
- private void ConfigureMergeSettings()
+ private void ConfigureMergeSettings(string keyName = null)
{
var unityYamlMergeExec =
Environment.UnityApplicationContents.Combine("Tools", "UnityYAMLMerge" + Environment.ExecutableExtension);
- var yamlMergeCommand = Environment.IsWindows
- ? $@"'{unityYamlMergeExec}' merge -p ""$BASE"" ""$REMOTE"" ""$LOCAL"" ""$MERGED"""
- : $@"'{unityYamlMergeExec}' merge -p '$BASE' '$REMOTE' '$LOCAL' '$MERGED'";
- GitClient.SetConfig("merge.unityyamlmerge.cmd", yamlMergeCommand, GitConfigSource.Local).Catch(e => {
- Logger.Error(e, "Error setting merge.unityyamlmerge.cmd");
+ var yamlMergeCommand = $"'{unityYamlMergeExec}' merge -h -p --force %O %B %A %A";
+
+ keyName = keyName ?? "unityyamlmerge";
+
+ GitClient.SetConfig($"merge.{keyName}.name", "Unity SmartMerge (UnityYamlMerge)", GitConfigSource.Local).Catch(e => {
+ Logger.Error(e, "Error setting merge." + keyName + ".name");
+ return true;
+ }).RunSynchronously();
+
+ GitClient.SetConfig($"merge.{keyName}.driver", yamlMergeCommand, GitConfigSource.Local).Catch(e => {
+ Logger.Error(e, "Error setting merge." + keyName + ".driver");
return true;
}).RunSynchronously();
- GitClient.SetConfig("merge.unityyamlmerge.trustExitCode", "false", GitConfigSource.Local).Catch(e => {
- Logger.Error(e, "Error setting merge.unityyamlmerge.trustExitCode");
+ GitClient.SetConfig($"merge.{keyName}.recursive", "binary", GitConfigSource.Local).Catch(e => {
+ Logger.Error(e, "Error setting merge." + keyName + ".recursive");
return true;
}).RunSynchronously();
}
+ private void UpdateMergeSettings()
+ {
+ var gitAttributesPath = Environment.RepositoryPath.Combine(".gitattributes");
+ if (gitAttributesPath.FileExists())
+ {
+ var readAllText = gitAttributesPath.ReadAllText();
+ var containsLegacyUnityYamlMergeError = readAllText.Contains("unityamlmerge");
+
+ if (containsLegacyUnityYamlMergeError)
+ {
+ ConfigureMergeSettings("unityamlmerge");
+ }
+ }
+
+ GitClient.UnSetConfig("merge.unityyamlmerge.cmd", GitConfigSource.Local).Catch(e => {
+ Logger.Error(e, "Error removing merge.unityyamlmerge.cmd");
+ return true;
+ }).RunSynchronously();
+
+ GitClient.UnSetConfig("merge.unityyamlmerge.trustExitCode", GitConfigSource.Local).Catch(e => {
+ Logger.Error(e, "Error removing merge.unityyamlmerge.trustExitCode");
+ return true;
+ }).RunSynchronously();
+
+ ConfigureMergeSettings();
+ }
+
public void RestartRepository()
{
if (!Environment.RepositoryPath.IsInitialized)
diff --git a/src/GitHub.Api/Git/GitClient.cs b/src/GitHub.Api/Git/GitClient.cs
index 5e454f6fa..a59d4d37b 100644
--- a/src/GitHub.Api/Git/GitClient.cs
+++ b/src/GitHub.Api/Git/GitClient.cs
@@ -60,6 +60,15 @@ public interface IGitClient
/// String output of git command
ITask SetConfig(string key, string value, GitConfigSource configSource, IOutputProcessor processor = null);
+ ///
+ /// Executes `git config --unset` to remove a configuration value.
+ ///
+ /// The configuration key to remove
+ /// The config source (unspecified, local,user,global) to use
+ /// A custom output processor instance
+ /// String output of git command
+ ITask UnSetConfig(string key, GitConfigSource configSource, IOutputProcessor processor = null);
+
///
/// Executes two `git config get` commands to get the git user and email.
///
@@ -367,6 +376,13 @@ public ITask SetConfig(string key, string value, GitConfigSource configS
.Configure(processManager);
}
+ ///
+ public ITask UnSetConfig(string key, GitConfigSource configSource, IOutputProcessor processor = null)
+ {
+ return new GitConfigUnSetTask(key, configSource, cancellationToken, processor)
+ .Configure(processManager);
+ }
+
///
public ITask GetConfigUserAndEmail()
{
diff --git a/src/GitHub.Api/Git/Tasks/GitConfigSetTask.cs b/src/GitHub.Api/Git/Tasks/GitConfigSetTask.cs
index d08ded87d..ac78c6f39 100644
--- a/src/GitHub.Api/Git/Tasks/GitConfigSetTask.cs
+++ b/src/GitHub.Api/Git/Tasks/GitConfigSetTask.cs
@@ -25,4 +25,4 @@ public GitConfigSetTask(string key, string value, GitConfigSource configSource,
public override TaskAffinity Affinity { get { return TaskAffinity.Exclusive; } }
public override string Message { get; set; } = "Writing configuration...";
}
-}
\ No newline at end of file
+}
diff --git a/src/GitHub.Api/Git/Tasks/GitConfigUnSetTask.cs b/src/GitHub.Api/Git/Tasks/GitConfigUnSetTask.cs
new file mode 100644
index 000000000..d6e2e08ff
--- /dev/null
+++ b/src/GitHub.Api/Git/Tasks/GitConfigUnSetTask.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Threading;
+
+namespace GitHub.Unity
+{
+ class GitConfigUnSetTask : ProcessTask
+ {
+ private readonly string arguments;
+
+ public GitConfigUnSetTask(string key, GitConfigSource configSource,
+ CancellationToken token, IOutputProcessor processor = null)
+ : base(token, processor ?? new SimpleOutputProcessor())
+ {
+ var source = "";
+ source +=
+ configSource == GitConfigSource.NonSpecified ? "--unset" :
+ configSource == GitConfigSource.Local ? "--local --unset" :
+ configSource == GitConfigSource.User ? "--global --unset" :
+ "--system --unset";
+ arguments = String.Format("config {0} {1}", source, key);
+ Name = String.Format("config {0} {1}", source, key);
+ }
+
+ public override string ProcessArguments { get { return arguments; } }
+ public override TaskAffinity Affinity { get { return TaskAffinity.Exclusive; } }
+ public override string Message { get; set; } = "Writing configuration...";
+ }
+}
\ No newline at end of file
diff --git a/src/GitHub.Api/GitHub.Api.45.csproj b/src/GitHub.Api/GitHub.Api.45.csproj
index df6496785..6d3d8d514 100644
--- a/src/GitHub.Api/GitHub.Api.45.csproj
+++ b/src/GitHub.Api/GitHub.Api.45.csproj
@@ -82,6 +82,7 @@
+
diff --git a/src/GitHub.Api/GitHub.Api.csproj b/src/GitHub.Api/GitHub.Api.csproj
index af58e5d0d..5b9441180 100644
--- a/src/GitHub.Api/GitHub.Api.csproj
+++ b/src/GitHub.Api/GitHub.Api.csproj
@@ -93,6 +93,7 @@
+