summaryrefslogtreecommitdiff
path: root/src/marlin.core
diff options
context:
space:
mode:
Diffstat (limited to 'src/marlin.core')
-rw-r--r--src/marlin.core/functional/IGitClient.cs67
-rw-r--r--src/marlin.core/models/Agent.cs2
-rw-r--r--src/marlin.core/models/CapabilitySet.cs7
-rw-r--r--src/marlin.core/models/Job.cs38
-rw-r--r--src/marlin.core/models/VersionControlSource.cs18
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