summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMelodi <62381002+Melodi17@users.noreply.github.com>2026-09-03 23:07:57 +1000
committerMelodi <62381002+Melodi17@users.noreply.github.com>2026-09-03 23:07:57 +1000
commitc00992ffad24212c4398736efd6d707d4cb0cc0d (patch)
treedb954f836b6b8375f6fedcff0377910b9e281091
parent7c33b3f334cf91918add7af08866f2ea37ed9c3f (diff)
chore: fix initial commit
-rw-r--r--marlin.slnx6
-rw-r--r--readme.md3
-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
7 files changed, 134 insertions, 7 deletions
diff --git a/marlin.slnx b/marlin.slnx
index 4e2253d..eb82120 100644
--- a/marlin.slnx
+++ b/marlin.slnx
@@ -1 +1,5 @@
-<Solution />
+<Solution>
+ <Project Path="src/marlin.agents.shell/marlin.agents.shell.csproj" />
+ <Project Path="src/marlin.core/marlin.core.csproj" />
+ <Project Path="src/marlin.web/marlin.web.csproj" />
+</Solution>
diff --git a/readme.md b/readme.md
index e69de29..62482d0 100644
--- a/readme.md
+++ b/readme.md
@@ -0,0 +1,3 @@
+Marlin (like the fish) is a declarative vcs-agnostic build platform, featuring a:
+ - web frontend
+ - agents for (docker, ssh, and shell) \ No newline at end of file
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