From 06f0dbefaabb9805029c18d07ea58d9c991d6105 Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Mon, 3 Dec 2018 12:07:02 -0500 Subject: [PATCH] Confiugring UnityYamlMerge --- .../Application/ApplicationManagerBase.cs | 51 +++++++++++++++---- src/GitHub.Api/Git/GitClient.cs | 16 ++++++ src/GitHub.Api/Git/Tasks/GitConfigSetTask.cs | 2 +- .../Git/Tasks/GitConfigUnSetTask.cs | 28 ++++++++++ src/GitHub.Api/GitHub.Api.45.csproj | 1 + src/GitHub.Api/GitHub.Api.csproj | 1 + 6 files changed, 89 insertions(+), 10 deletions(-) create mode 100644 src/GitHub.Api/Git/Tasks/GitConfigUnSetTask.cs 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 @@ +