public void FindSystemDirectory_Windows()
        {
            using var temp = new TempRoot();

            var base1 = temp.CreateDirectory();
            var base2 = temp.CreateDirectory();
            var d3    = temp.CreateDirectory();
            var d1    = base1.CreateDirectory("1");

            d1.CreateFile("git.cmd");
            var d2 = base2.CreateDirectory("2");

            d2.CreateFile("git.exe");

            Assert.Null(GitEnvironment.FindSystemDirectory(null, null));
            Assert.Null(GitEnvironment.FindSystemDirectory("", null));
            Assert.Null(GitEnvironment.FindSystemDirectory(";", null));
            Assert.Equal(GitEnvironment.FindSystemDirectory($"*;<>;  ;;{d3};{d1}", ""), Path.Combine(base1.Path, "etc"));
            Assert.Equal(GitEnvironment.FindSystemDirectory($"*;<>;\t;;{d3};{d2}", ""), Path.Combine(base2.Path, "etc"));
        }
        public void Configure(ProcessStartInfo psi)
        {
            defaultEnvironment.Configure(psi);

            //if (gitInstallPath == SPath.Default || gitInstallPath != Environment.GitInstallPath)
            ResolvePaths();

            var    pathEntries = new List <string>(envPath);
            string separator   = GitEnvironment.IsWindows ? ";" : ":";

            // we can only set this env var if there is a libexec/git-core. git will bypass internally bundled tools if this env var
            // is set, which will break Apple's system git on certain tools (like osx-credentialmanager)
            if (libExecPath.IsInitialized)
            {
                psi.EnvironmentVariables["GIT_EXEC_PATH"] = libExecPath.ToString();
            }

            pathEntries.Add("END");

            var path = string.Join(separator, pathEntries.ToArray()) + separator + GitEnvironment.Path;

            var pathEnvVarKey = GitEnvironment.GetEnvironmentVariableKey("PATH");

            psi.EnvironmentVariables[pathEnvVarKey] = path;

            //if (Environment.IsWindows)
            //{
            //    psi.EnvironmentVariables["PLINK_PROTOCOL"] = "ssh";
            //    psi.EnvironmentVariables["TERM"] = "msys";
            //}

            var httpProxy = GitEnvironment.GetEnvironmentVariable("HTTP_PROXY");

            if (!string.IsNullOrEmpty(httpProxy))
            {
                psi.EnvironmentVariables["HTTP_PROXY"] = httpProxy;
            }

            var httpsProxy = GitEnvironment.GetEnvironmentVariable("HTTPS_PROXY");

            if (!string.IsNullOrEmpty(httpsProxy))
            {
                psi.EnvironmentVariables["HTTPS_PROXY"] = httpsProxy;
            }
            psi.EnvironmentVariables["DISPLAY"] = "0";

            if (!GitEnvironment.IsWindows)
            {
                psi.EnvironmentVariables["GIT_TEMPLATE_DIR"] = GitEnvironment.GitInstallPath.Combine("share/git-core/templates");
            }

            if (GitEnvironment.IsLinux)
            {
                psi.EnvironmentVariables["PREFIX"] = GitEnvironment.GitExecutablePath.Parent;
            }

            var sslCAInfo = GitEnvironment.GetEnvironmentVariable("GIT_SSL_CAINFO");

            if (string.IsNullOrEmpty(sslCAInfo))
            {
                var certFile = basePath.Combine("ssl/cacert.pem");
                if (certFile.FileExists())
                {
                    psi.EnvironmentVariables["GIT_SSL_CAINFO"] = certFile.ToString();
                }
            }

/*
 *          psi.WorkingDirectory = workingDirectory;
 *          psi.EnvironmentVariables["HOME"] = SPath.HomeDirectory;
 *          psi.EnvironmentVariables["TMP"] = psi.EnvironmentVariables["TEMP"] = SPath.SystemTemp;
 *
 *          var path = Environment.Path;
 *          psi.EnvironmentVariables["GHU_WORKINGDIR"] = workingDirectory;
 *          var pathEnvVarKey = Environment.GetEnvironmentVariableKey("PATH");
 *
 *          if (dontSetupGit)
 *          {
 *              psi.EnvironmentVariables["GHU_FULLPATH"] = path;
 *              psi.EnvironmentVariables[pathEnvVarKey] = path;
 *              return;
 *          }
 *
 *          Guard.ArgumentNotNull(psi, "psi");
 *
 *          var pathEntries = new List<string>();
 *          string separator = Environment.IsWindows ? ";" : ":";
 *
 *          SPath libexecPath = SPath.Default;
 *          List<string> gitPathEntries = new List<string>();
 *          if (Environment.GitInstallPath.IsInitialized)
 *          {
 *              var gitPathRoot = Environment.GitExecutablePath.Resolve().Parent.Parent;
 *              var gitExecutableDir = Environment.GitExecutablePath.Parent; // original path to git (might be different from install path if it's a symlink)
 *
 *              var baseExecPath = gitPathRoot;
 *              var binPath = baseExecPath;
 *              if (Environment.IsWindows)
 *              {
 *                  if (baseExecPath.DirectoryExists("mingw32"))
 *                      baseExecPath = baseExecPath.Combine("mingw32");
 *                  else
 *                      baseExecPath = baseExecPath.Combine("mingw64");
 *                  binPath = baseExecPath.Combine("bin");
 *              }
 *
 *              libexecPath = baseExecPath.Combine("libexec", "git-core");
 *              if (!libexecPath.DirectoryExists())
 *                  libexecPath = SPath.Default;
 *
 *              if (Environment.IsWindows)
 *              {
 *                  gitPathEntries.AddRange(new[] { gitPathRoot.Combine("cmd").ToString(), gitPathRoot.Combine("usr", "bin") });
 *              }
 *              else
 *              {
 *                  gitPathEntries.Add(gitExecutableDir.ToString());
 *              }
 *
 *              if (libexecPath.IsInitialized)
 *                  gitPathEntries.Add(libexecPath);
 *              gitPathEntries.Add(binPath);
 *
 *              // we can only set this env var if there is a libexec/git-core. git will bypass internally bundled tools if this env var
 *              // is set, which will break Apple's system git on certain tools (like osx-credentialmanager)
 *              if (libexecPath.IsInitialized)
 *                  psi.EnvironmentVariables["GIT_EXEC_PATH"] = libexecPath.ToString();
 *          }
 *
 *          if (Environment.GitLfsInstallPath.IsInitialized && libexecPath != Environment.GitLfsInstallPath)
 *          {
 *              pathEntries.Add(Environment.GitLfsInstallPath);
 *          }
 *          if (gitPathEntries.Count > 0)
 *              pathEntries.AddRange(gitPathEntries);
 *
 *          pathEntries.Add("END");
 *
 *          path = string.Join(separator, pathEntries.ToArray()) + separator + path;
 *
 *          psi.EnvironmentVariables["GHU_FULLPATH"] = path;
 *          psi.EnvironmentVariables[pathEnvVarKey] = path;
 *
 *          //TODO: Remove with Git LFS Locking becomes standard
 *          psi.EnvironmentVariables["GITLFSLOCKSENABLED"] = "1";
 *
 *          if (Environment.IsWindows)
 *          {
 *              psi.EnvironmentVariables["PLINK_PROTOCOL"] = "ssh";
 *              psi.EnvironmentVariables["TERM"] = "msys";
 *          }
 *
 *          var httpProxy = Environment.GetEnvironmentVariable("HTTP_PROXY");
 *          if (!string.IsNullOrEmpty(httpProxy))
 *              psi.EnvironmentVariables["HTTP_PROXY"] = httpProxy;
 *
 *          var httpsProxy = Environment.GetEnvironmentVariable("HTTPS_PROXY");
 *          if (!string.IsNullOrEmpty(httpsProxy))
 *              psi.EnvironmentVariables["HTTPS_PROXY"] = httpsProxy;
 *          psi.EnvironmentVariables["DISPLAY"] = "0";
 */
        }
 public void FindSystemDirectory_Unix(string etc, string expected)
 {
     Assert.Equal(expected, GitEnvironment.FindSystemDirectory(null, etc));
 }