diff options
Diffstat (limited to 'src/marlin.core/functional')
| -rw-r--r-- | src/marlin.core/functional/IGitClient.cs | 67 |
1 files changed, 66 insertions, 1 deletions
diff --git a/src/marlin.core/functional/IGitClient.cs b/src/marlin.core/functional/IGitClient.cs index ad8d26e..04dc12a 100644 --- a/src/marlin.core/functional/IGitClient.cs +++ b/src/marlin.core/functional/IGitClient.cs @@ -1,6 +1,71 @@ -namespace marlin.web.Services; +namespace marlin.core.functional; + +using System.Diagnostics; public interface IGitClient { Task<Dictionary<string, string>> GetRemoteRefs(string remote); +} + +public class GitBinaryClient : IGitClient +{ + public virtual async Task<Dictionary<string, string>> GetRemoteRefs(string remote) + { + var psi = this.CreateProcess(remote); + var proc = Process.Start(psi)!; + + string stdout = await proc.StandardOutput.ReadToEndAsync(); + await proc.WaitForExitAsync(); + + return ParseOutput(stdout); + } + + private Dictionary<string, string> ParseOutput(string stdout) + { + return stdout + .Split("\n", StringSplitOptions.RemoveEmptyEntries) + .Select(x => x.Split('\t')) + .ToDictionary(k => k[1], k => k[0]); + } + + protected virtual ProcessStartInfo CreateProcess(string remote) + { + var psi = new ProcessStartInfo("git", $"ls-remote --heads --tags {remote}") + { + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false, + CreateNoWindow = true, + Environment = { ["GIT_TERMINAL_PROMPT"] = "0" } + }; + + return psi; + } + + /*private async Task SshAuth(string privateKeyPem) + { + string keyPath = Path.Combine(Path.GetTempPath(), $"key_{Guid.NewGuid():N}"); + await File.WriteAllTextAsync(keyPath, privateKeyPem); + File.SetUnixFileMode(keyPath, UnixFileMode.UserRead | UnixFileMode.UserWrite); + + try + { + psi.Environment["GIT_SSH_COMMAND"] = + $"ssh -i {keyPath} -o IdentitiesOnly=yes -o StrictHostKeyChecking=accept-new"; + // run ls-remote against the ssh:// or git@ URL + } + finally + { + File.Delete(keyPath); + } + } + + private async Task BasicAuth(string accessToken) + { + psi.Environment["GIT_CONFIG_COUNT"] = "1"; + psi.Environment["GIT_CONFIG_KEY_0"] = "http.extraheader"; + psi.Environment["GIT_CONFIG_VALUE_0"] = + $"AUTHORIZATION: basic {Convert.ToBase64String(Encoding.UTF8.GetBytes($"x-access-token:{accessToken}"))}"; + + }*/ }
\ No newline at end of file |
