Skip to content
This repository was archived by the owner on Dec 5, 2024. It is now read-only.

Commit 63bc2d9

Browse files
Merge branch 'fixes/mac-path-variable' into stanley/0.31-rc
# Conflicts: # src/UnityExtension/Assets/Editor/GitHub.Unity/UI/GitPathView.cs
2 parents 987ea40 + 3dd3616 commit 63bc2d9

File tree

9 files changed

+250
-116
lines changed

9 files changed

+250
-116
lines changed

src/GitHub.Api/Application/ApplicationManagerBase.cs

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using System;
2-
using System.Linq;
32
using System.Threading;
43
using System.Threading.Tasks;
54
using System.Collections.Generic;
@@ -54,14 +53,34 @@ public void Run(bool firstRun)
5453
{
5554
Logger.Trace("Run - CurrentDirectory {0}", NPath.CurrentDirectory);
5655

56+
ITask<string> getMacEnvironmentPathTask;
57+
if (Environment.IsMac)
58+
{
59+
getMacEnvironmentPathTask = new SimpleProcessTask(CancellationToken, "bash".ToNPath(), "-c \"/usr/libexec/path_helper\"")
60+
.Configure(ProcessManager)
61+
.Then((success, path) => success ? path.Split(new[] { "\"" }, StringSplitOptions.None)[1] : null);
62+
}
63+
else
64+
{
65+
getMacEnvironmentPathTask = new FuncTask<string>(CancellationToken, () => null);
66+
}
67+
68+
var setMacEnvironmentPathTask = getMacEnvironmentPathTask.Then((_, path) => {
69+
if (path != null)
70+
{
71+
Logger.Trace("Mac Environment Path Original:{0} Updated:{1}", Environment.Path, path);
72+
Environment.Path = path;
73+
}
74+
});
75+
5776
var initEnvironmentTask = new ActionTask<NPath>(CancellationToken,
5877
(_, path) => InitializeEnvironment(path))
5978
{ Affinity = TaskAffinity.UI };
6079

6180
isBusy = true;
6281

6382
var octorunInstaller = new OctorunInstaller(Environment, TaskManager);
64-
var setupTask = octorunInstaller.SetupOctorunIfNeeded();
83+
var setupTask = setMacEnvironmentPathTask.Then(octorunInstaller.SetupOctorunIfNeeded());
6584

6685
var initializeGitTask = new FuncTask<NPath>(CancellationToken, () =>
6786
{
@@ -87,7 +106,8 @@ public void Run(bool firstRun)
87106
{
88107
if (path.IsInitialized)
89108
{
90-
t.GetEndOfChain().Then(initEnvironmentTask, taskIsTopOfChain: true);
109+
t.GetEndOfChain()
110+
.Then(initEnvironmentTask, taskIsTopOfChain: true);
91111
return;
92112
}
93113
Logger.Trace("Using portable git");
@@ -98,7 +118,8 @@ public void Run(bool firstRun)
98118
task.Progress(progressReporter.UpdateProgress);
99119
task.OnEnd += (thisTask, result, success, exception) =>
100120
{
101-
thisTask.GetEndOfChain().Then(initEnvironmentTask, taskIsTopOfChain: true);
121+
thisTask.GetEndOfChain()
122+
.Then(initEnvironmentTask, taskIsTopOfChain: true);
102123
};
103124

104125
// append installer task to top chain
@@ -214,8 +235,12 @@ private void InitializeEnvironment(NPath gitExecutablePath)
214235
{
215236
return;
216237
}
238+
239+
var gitInstallDetails = new GitInstaller.GitInstallDetails(Environment.UserCachePath, Environment.IsWindows);
240+
var isCustomGitExec = gitExecutablePath != gitInstallDetails.GitExecutablePath;
217241

218242
Environment.GitExecutablePath = gitExecutablePath;
243+
Environment.IsCustomGitExecutable = isCustomGitExec;
219244
Environment.User.Initialize(GitClient);
220245

221246
var afterGitSetup = new ActionTask(CancellationToken, RestartRepository)
@@ -226,7 +251,7 @@ private void InitializeEnvironment(NPath gitExecutablePath)
226251
{
227252
var credHelperTask = GitClient.GetConfig("credential.helper", GitConfigSource.Global);
228253
credHelperTask.OnEnd += (thisTask, credentialHelper, success, exception) =>
229-
{
254+
{
230255
if (!success || string.IsNullOrEmpty(credentialHelper))
231256
{
232257
Logger.Warning("No Windows CredentialHelper found: Setting to wincred");

src/GitHub.Api/Git/GitClient.cs

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ namespace GitHub.Unity
99
{
1010
public interface IGitClient
1111
{
12-
ITask<ValidateGitInstallResult> ValidateGitInstall(NPath path);
12+
ITask<ValidateGitInstallResult> ValidateGitInstall(NPath path, bool isCustomGit);
1313

1414
ITask Init(IOutputProcessor<string> processor = null);
1515

@@ -110,7 +110,7 @@ public GitClient(IEnvironment environment, IProcessManager processManager, Cance
110110
this.cancellationToken = cancellationToken;
111111
}
112112

113-
public ITask<ValidateGitInstallResult> ValidateGitInstall(NPath path)
113+
public ITask<ValidateGitInstallResult> ValidateGitInstall(NPath path, bool isCustomGit)
114114
{
115115
if (!path.FileExists())
116116
{
@@ -120,18 +120,31 @@ public ITask<ValidateGitInstallResult> ValidateGitInstall(NPath path)
120120
Version gitVersion = null;
121121
Version gitLfsVersion = null;
122122

123-
var gitVersionTask = new GitVersionTask(cancellationToken).Configure(processManager, path);
124-
var gitLfsVersionTask = new GitLfsVersionTask(cancellationToken).Configure(processManager, path);
125-
126-
return gitVersionTask
127-
.Then((result, version) => gitVersion = version)
128-
.Then(gitLfsVersionTask)
129-
.Then((result, version) => gitLfsVersion = version)
130-
.Then(success => new ValidateGitInstallResult(success &&
123+
var endTask = new FuncTask<ValidateGitInstallResult>(cancellationToken,
124+
() => new ValidateGitInstallResult(
131125
gitVersion?.CompareTo(Constants.MinimumGitVersion) >= 0 &&
132126
gitLfsVersion?.CompareTo(Constants.MinimumGitLfsVersion) >= 0,
133-
gitVersion, gitLfsVersion)
134-
);
127+
gitVersion, gitLfsVersion));
128+
129+
var gitLfsVersionTask = new GitLfsVersionTask(cancellationToken)
130+
.Configure(processManager, path, dontSetupGit: isCustomGit);
131+
132+
gitLfsVersionTask
133+
.Then((result, version) => {return gitLfsVersion = version;})
134+
.Then(endTask, taskIsTopOfChain: true);
135+
136+
gitLfsVersionTask.Then(endTask, TaskRunOptions.OnFailure, taskIsTopOfChain:true);
137+
138+
var gitVersionTask = new GitVersionTask(cancellationToken)
139+
.Configure(processManager, path, dontSetupGit: isCustomGit);
140+
141+
gitVersionTask
142+
.Then((result, version) => { return gitVersion = version; })
143+
.Then(gitLfsVersionTask, taskIsTopOfChain: true);
144+
145+
gitVersionTask.Then(endTask, TaskRunOptions.OnFailure, taskIsTopOfChain:true);
146+
147+
return endTask;
135148
}
136149

137150
public ITask Init(IOutputProcessor<string> processor = null)

src/GitHub.Api/OutputProcessors/ProcessManager.cs

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using GitHub.Logging;
22
using System;
3+
using System.Collections.Generic;
34
using System.Diagnostics;
45
using System.IO;
56
using System.Linq;
@@ -29,7 +30,20 @@ public T Configure<T>(T processTask, NPath? executable = null, string arguments
2930
bool dontSetupGit = false)
3031
where T : IProcess
3132
{
32-
executable = executable ?? processTask.ProcessName?.ToNPath() ?? environment.GitExecutablePath;
33+
logger.Trace("Configure executable:{0}", executable);
34+
35+
if (executable == null)
36+
{
37+
if (processTask.ProcessName?.ToNPath() != null)
38+
{
39+
executable = processTask.ProcessName.ToNPath();
40+
}
41+
else
42+
{
43+
executable = environment.GitExecutablePath;
44+
dontSetupGit = environment.IsCustomGitExecutable;
45+
}
46+
}
3347

3448
//If this null check fails, be sure you called Configure() on your task
3549
Guard.ArgumentNotNull(executable, nameof(executable));
@@ -45,6 +59,7 @@ public T Configure<T>(T processTask, NPath? executable = null, string arguments
4559
StandardErrorEncoding = Encoding.UTF8
4660
};
4761

62+
logger.Trace("gitEnvironment.Configure dontSetupGit:{0}", dontSetupGit);
4863
gitEnvironment.Configure(startInfo, workingDirectory ?? environment.RepositoryPath, dontSetupGit);
4964

5065
if (executable.Value.IsRelative)
@@ -72,7 +87,7 @@ public void RunCommandLineWindow(NPath workingDirectory)
7287
if (environment.IsWindows)
7388
{
7489
startInfo.FileName = "cmd";
75-
gitEnvironment.Configure(startInfo, workingDirectory);
90+
gitEnvironment.Configure(startInfo, workingDirectory, environment.IsCustomGitExecutable);
7691
}
7792
else if (environment.IsMac)
7893
{
@@ -82,20 +97,20 @@ public void RunCommandLineWindow(NPath workingDirectory)
8297
var envVarFile = NPath.GetTempFilename();
8398
startInfo.FileName = "open";
8499
startInfo.Arguments = $"-a Terminal {envVarFile}";
85-
gitEnvironment.Configure(startInfo, workingDirectory);
100+
gitEnvironment.Configure(startInfo, workingDirectory, environment.IsCustomGitExecutable);
86101

87102
var envVars = startInfo.EnvironmentVariables;
88103
var scriptContents = new[] {
89104
$"cd \"{envVars["GHU_WORKINGDIR"]}\"",
90-
$"PATH=\"{envVars["GHU_FULLPATH"]}\":$PATH /bin/bash"
105+
environment.IsCustomGitExecutable? "/bin/bash" : $"PATH=\"{envVars["GHU_FULLPATH"]}\":$PATH /bin/bash"
91106
};
92107
environment.FileSystem.WriteAllLines(envVarFile, scriptContents);
93108
Mono.Unix.Native.Syscall.chmod(envVarFile, (Mono.Unix.Native.FilePermissions)493); // -rwxr-xr-x mode (0755)
94109
}
95110
else
96111
{
97112
startInfo.FileName = "sh";
98-
gitEnvironment.Configure(startInfo, workingDirectory);
113+
gitEnvironment.Configure(startInfo, workingDirectory, environment.IsCustomGitExecutable);
99114
}
100115

101116
Process.Start(startInfo);

src/GitHub.Api/Platform/DefaultEnvironment.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,8 @@ public string GetEnvironmentVariable(string variable)
132132
public NPath ExtensionInstallPath { get; set; }
133133
public NPath UserCachePath { get; set; }
134134
public NPath SystemCachePath { get; set; }
135-
public NPath Path => Environment.GetEnvironmentVariable("PATH").ToNPath();
135+
public string Path { get; set; } = Environment.GetEnvironmentVariable("PATH");
136+
136137
public string NewLine => Environment.NewLine;
137138
public NPath OctorunScriptPath
138139
{
@@ -147,6 +148,9 @@ public NPath OctorunScriptPath
147148
octorunScriptPath = value;
148149
}
149150
}
151+
152+
public bool IsCustomGitExecutable { get; set; }
153+
150154
public NPath GitExecutablePath
151155
{
152156
get { return gitExecutablePath; }

src/GitHub.Api/Platform/IEnvironment.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@ public interface IEnvironment
1010
string GetEnvironmentVariable(string v);
1111
string GetSpecialFolder(Environment.SpecialFolder folder);
1212

13-
NPath Path { get; }
13+
string Path { get; set; }
1414
string NewLine { get; }
15+
bool IsCustomGitExecutable { get; set; }
1516
NPath GitExecutablePath { get; set; }
1617
NPath NodeJsExecutablePath { get; }
1718
NPath OctorunScriptPath { get; set; }

src/GitHub.Api/Platform/ProcessEnvironment.cs

Lines changed: 35 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -17,73 +17,60 @@ public ProcessEnvironment(IEnvironment environment)
1717

1818
public void Configure(ProcessStartInfo psi, NPath workingDirectory, bool dontSetupGit = false)
1919
{
20+
Guard.ArgumentNotNull(psi, "psi");
21+
2022
psi.WorkingDirectory = workingDirectory;
2123
psi.EnvironmentVariables["HOME"] = NPath.HomeDirectory;
2224
psi.EnvironmentVariables["TMP"] = psi.EnvironmentVariables["TEMP"] = NPath.SystemTemp;
25+
psi.EnvironmentVariables["GHU_WORKINGDIR"] = workingDirectory;
26+
psi.EnvironmentVariables["PATH"] = Environment.Path;
27+
psi.EnvironmentVariables["GHU_FULLPATH"] = Environment.Path;
2328

2429
// if we don't know where git is, then there's nothing else to configure
2530
if (!Environment.GitInstallPath.IsInitialized || dontSetupGit)
2631
return;
27-
28-
29-
Guard.ArgumentNotNull(psi, "psi");
30-
31-
// We need to essentially fake up what git-cmd.bat does
32-
33-
var gitPathRoot = Environment.GitInstallPath;
34-
var gitLfsPath = Environment.GitInstallPath;
35-
var gitExecutableDir = Environment.GitExecutablePath.Parent; // original path to git (might be different from install path if it's a symlink)
36-
37-
// Paths to developer tools such as msbuild.exe
38-
//var developerPaths = StringExtensions.JoinForAppending(";", developerEnvironment.GetPaths());
39-
var developerPaths = "";
40-
32+
33+
var httpProxy = Environment.GetEnvironmentVariable("HTTP_PROXY");
34+
if (!String.IsNullOrEmpty(httpProxy))
35+
psi.EnvironmentVariables["HTTP_PROXY"] = httpProxy;
36+
37+
var httpsProxy = Environment.GetEnvironmentVariable("HTTPS_PROXY");
38+
if (!String.IsNullOrEmpty(httpsProxy))
39+
psi.EnvironmentVariables["HTTPS_PROXY"] = httpsProxy;
40+
4141
//TODO: Remove with Git LFS Locking becomes standard
4242
psi.EnvironmentVariables["GITLFSLOCKSENABLED"] = "1";
4343

44-
string path;
45-
var baseExecPath = gitPathRoot;
46-
var binPath = baseExecPath;
4744
if (Environment.IsWindows)
4845
{
46+
// We need to essentially fake up what git-cmd.bat does
47+
var gitPathRoot = Environment.GitInstallPath;
48+
49+
var baseExecPath = gitPathRoot;
4950
if (baseExecPath.DirectoryExists("mingw32"))
5051
baseExecPath = baseExecPath.Combine("mingw32");
5152
else
5253
baseExecPath = baseExecPath.Combine("mingw64");
53-
binPath = baseExecPath.Combine("bin");
54-
}
55-
56-
var execPath = baseExecPath.Combine("libexec", "git-core");
57-
if (!execPath.DirectoryExists())
58-
execPath = NPath.Default;
54+
var binPath = baseExecPath.Combine("bin");
55+
56+
var execPath = baseExecPath.Combine("libexec", "git-core");
57+
if (!execPath.DirectoryExists())
58+
execPath = NPath.Default;
5959

60-
if (Environment.IsWindows)
61-
{
6260
var userPath = @"C:\windows\system32;C:\windows";
63-
path = $"{gitPathRoot}\\cmd;{gitPathRoot}\\usr\\bin;{execPath};{binPath};{gitLfsPath};{userPath}{developerPaths}";
64-
}
65-
else
66-
{
67-
path = $"{gitExecutableDir}:{binPath}:{execPath}:{gitLfsPath}:{Environment.Path}:{developerPaths}";
61+
var path = $"{gitPathRoot}\\cmd;{gitPathRoot}\\usr\\bin;{execPath};{binPath}";
62+
63+
Logger.Trace("Calculated Path: {0}", path);
64+
65+
if (execPath.IsInitialized)
66+
psi.EnvironmentVariables["GIT_EXEC_PATH"] = execPath.ToString();
67+
68+
psi.EnvironmentVariables["PATH"] = path;
69+
psi.EnvironmentVariables["GHU_FULLPATH"] = path;
70+
71+
psi.EnvironmentVariables["PLINK_PROTOCOL"] = "ssh";
72+
psi.EnvironmentVariables["TERM"] = "msys";
6873
}
69-
70-
if (execPath.IsInitialized)
71-
psi.EnvironmentVariables["GIT_EXEC_PATH"] = execPath.ToString();
72-
73-
psi.EnvironmentVariables["PATH"] = path;
74-
psi.EnvironmentVariables["GHU_FULLPATH"] = path;
75-
psi.EnvironmentVariables["GHU_WORKINGDIR"] = workingDirectory;
76-
77-
psi.EnvironmentVariables["PLINK_PROTOCOL"] = "ssh";
78-
psi.EnvironmentVariables["TERM"] = "msys";
79-
80-
var httpProxy = Environment.GetEnvironmentVariable("HTTP_PROXY");
81-
if (!String.IsNullOrEmpty(httpProxy))
82-
psi.EnvironmentVariables["HTTP_PROXY"] = httpProxy;
83-
84-
var httpsProxy = Environment.GetEnvironmentVariable("HTTPS_PROXY");
85-
if (!String.IsNullOrEmpty(httpsProxy))
86-
psi.EnvironmentVariables["HTTPS_PROXY"] = httpsProxy;
8774
}
8875
}
8976
}

0 commit comments

Comments
 (0)