From a9bc03fb01b5d1ac41bf5592f384d22df5425aa4 Mon Sep 17 00:00:00 2001
From: Melodi <62381002+Melodi17@users.noreply.github.com>
Date: Sun, 6 Sep 2026 09:02:31 +1000
Subject: feat: vcs and secret management support
---
src/marlin.core/functional/TokenGitCredential.cs | 32 ++++++++++++++++++++++++
1 file changed, 32 insertions(+)
create mode 100644 src/marlin.core/functional/TokenGitCredential.cs
(limited to 'src/marlin.core/functional/TokenGitCredential.cs')
diff --git a/src/marlin.core/functional/TokenGitCredential.cs b/src/marlin.core/functional/TokenGitCredential.cs
new file mode 100644
index 0000000..5dfef66
--- /dev/null
+++ b/src/marlin.core/functional/TokenGitCredential.cs
@@ -0,0 +1,32 @@
+namespace marlin.core.functional;
+
+using System.Diagnostics;
+using System.Text;
+
+///
+/// HTTPS auth via a bearer/basic token. Injected as an Authorization header for a
+/// single git invocation through GIT_CONFIG_* env vars, so it never appears in argv
+/// (visible via ps) or in git's own error output (which echoes the URL, not headers).
+///
+public sealed class TokenGitCredential : IGitCredential
+{
+ private readonly string _username;
+ private readonly string _token;
+
+ public TokenGitCredential(string token, string username = "x-access-token")
+ {
+ this._token = token;
+ this._username = username;
+ }
+
+ public Task ApplyAsync(ProcessStartInfo psi)
+ {
+ string header = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{this._username}:{this._token}"));
+
+ psi.Environment["GIT_CONFIG_COUNT"] = "1";
+ psi.Environment["GIT_CONFIG_KEY_0"] = "http.extraheader";
+ psi.Environment["GIT_CONFIG_VALUE_0"] = $"AUTHORIZATION: basic {header}";
+
+ return Task.FromResult(NoopAsyncDisposable.Instance);
+ }
+}
--
cgit v1.3.1