diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/marlin.core/functional/IGitClient.cs | 67 | ||||
| -rw-r--r-- | src/marlin.core/models/Agent.cs | 2 | ||||
| -rw-r--r-- | src/marlin.core/models/CapabilitySet.cs | 7 | ||||
| -rw-r--r-- | src/marlin.core/models/Job.cs | 38 | ||||
| -rw-r--r-- | src/marlin.core/models/VersionControlSource.cs | 18 |
5 files changed, 126 insertions, 6 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 diff --git a/src/marlin.core/models/Agent.cs b/src/marlin.core/models/Agent.cs index 783f6d6..2903131 100644 --- a/src/marlin.core/models/Agent.cs +++ b/src/marlin.core/models/Agent.cs @@ -1,4 +1,4 @@ -namespace marlin.core; +namespace marlin.core.models; public class Agent { diff --git a/src/marlin.core/models/CapabilitySet.cs b/src/marlin.core/models/CapabilitySet.cs index f569ee5..ac7da46 100644 --- a/src/marlin.core/models/CapabilitySet.cs +++ b/src/marlin.core/models/CapabilitySet.cs @@ -1,3 +1,6 @@ -namespace marlin.core; +namespace marlin.core.models; -public class CapabilitySet : Dictionary<string, string>;
\ No newline at end of file +public class CapabilitySet +{ + public Dictionary<string, string> Items { get; set; } = new(); +}
\ No newline at end of file diff --git a/src/marlin.core/models/Job.cs b/src/marlin.core/models/Job.cs index 269677d..6b09597 100644 --- a/src/marlin.core/models/Job.cs +++ b/src/marlin.core/models/Job.cs @@ -1,6 +1,42 @@ -namespace marlin.core; +namespace marlin.core.models; public class Job { + public Guid Id { get; set; } + public Guid SourceId { get; set; } + public VersionControlSource Source { get; set; } + public string Ref { get; set; } + public string Commit { get; set; } + + public string CreatedReason { get; set; } + public DateTime CreatedAt { get; set; } + public JobStatus Status { get; set; } + public ICollection<JobStatusUpdate> StatusUpdates { get; set; } + + public Guid AgentId { get; set; } + public Agent? Agent { get; set; } + + public string Recipe { get; set; } + // plan +} + +public class JobStatusUpdate +{ + public Guid Id { get; set; } + + public Guid JobId { get; set; } + public Job Job { get; set; } + + public DateTime At { get; set; } + public JobStatus Status { get; set; } +} + +public enum JobStatus +{ + Pending, + Active, + Cancelled, + Success, + Failed }
\ No newline at end of file diff --git a/src/marlin.core/models/VersionControlSource.cs b/src/marlin.core/models/VersionControlSource.cs index f3880de..1d50ef3 100644 --- a/src/marlin.core/models/VersionControlSource.cs +++ b/src/marlin.core/models/VersionControlSource.cs @@ -1,8 +1,24 @@ -namespace marlin.core; +namespace marlin.core.models; public class VersionControlSource { public Guid Id { get; set; } + public string UpstreamUrl { get; set; } + public string MainBranch { get; set; } public string BranchFilter { get; set; } + public int MinPollingInterval { get; set; } + + public ICollection<VersionControlledBranch> Branches { get; set; } +} + +public class VersionControlledBranch +{ + public Guid Id { get; set; } + + public Guid SourceId { get; set; } + public VersionControlSource Source { get; set; } + + public string Name { get; set; } + public string HeadCommit { get; set; } }
\ No newline at end of file |
