From d12ea701784ed11b37bbc81ff5e694685910b438 Mon Sep 17 00:00:00 2001 From: javery556 <128285906+javery556@users.noreply.github.com> Date: Wed, 18 Mar 2026 22:32:55 +1100 Subject: [PATCH 1/3] feat: add Gitea account auth in integrations settings --- Cargo.lock | 16 ++ Cargo.toml | 3 + .../src/components/GiteaAccountBadge.svelte | 27 +++ .../src/components/GiteaIntegration.svelte | 173 ++++++++++++++++ .../src/components/GiteaUserLoginState.svelte | 70 +++++++ .../IntegrationsSettings.svelte | 2 + apps/desktop/src/lib/bootstrap/deps.ts | 3 + .../forge/gitea/giteaUserService.svelte.ts | 121 +++++++++++ .../lib/forge/gitea/giteaUserService.test.ts | 38 ++++ apps/desktop/src/lib/state/tags.ts | 1 + crates/but-api/Cargo.toml | 1 + crates/but-api/src/gitea.rs | 54 +++++ crates/but-api/src/lib.rs | 3 + crates/but-forge-storage/src/controller.rs | 49 +++++ crates/but-forge-storage/src/settings.rs | 28 +++ crates/but-gitea/Cargo.toml | 32 +++ crates/but-gitea/src/client.rs | 105 ++++++++++ crates/but-gitea/src/lib.rs | 191 +++++++++++++++++ crates/but-gitea/src/token.rs | 193 ++++++++++++++++++ crates/but-server/src/lib.rs | 14 +- crates/gitbutler-tauri/src/main.rs | 7 +- packages/core/src/generated/gitea/index.ts | 5 + packages/core/src/generated/gitea/token.ts | 3 + packages/core/src/generated/index.ts | 2 + 24 files changed, 1139 insertions(+), 2 deletions(-) create mode 100644 apps/desktop/src/components/GiteaAccountBadge.svelte create mode 100644 apps/desktop/src/components/GiteaIntegration.svelte create mode 100644 apps/desktop/src/components/GiteaUserLoginState.svelte create mode 100644 apps/desktop/src/lib/forge/gitea/giteaUserService.svelte.ts create mode 100644 apps/desktop/src/lib/forge/gitea/giteaUserService.test.ts create mode 100644 crates/but-api/src/gitea.rs create mode 100644 crates/but-gitea/Cargo.toml create mode 100644 crates/but-gitea/src/client.rs create mode 100644 crates/but-gitea/src/lib.rs create mode 100644 crates/but-gitea/src/token.rs create mode 100644 packages/core/src/generated/gitea/index.ts create mode 100644 packages/core/src/generated/gitea/token.ts diff --git a/Cargo.lock b/Cargo.lock index 4e2f1538958..f6670681541 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -881,6 +881,7 @@ dependencies = [ "but-forge", "but-forge-storage", "but-gerrit", + "but-gitea", "but-github", "but-gitlab", "but-graph", @@ -1207,6 +1208,21 @@ dependencies = [ "snapbox", ] +[[package]] +name = "but-gitea" +version = "0.0.0" +dependencies = [ + "anyhow", + "but-error", + "but-forge-storage", + "but-schemars", + "but-secret", + "reqwest 0.12.28", + "schemars 1.2.1", + "serde", + "ts-rs", +] + [[package]] name = "but-github" version = "0.0.0" diff --git a/Cargo.toml b/Cargo.toml index e263193e138..50f70af5250 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -67,6 +67,8 @@ members = [ # 👉lacks top-level docs and docs. "crates/but-gitlab", # 📄A thin wrapper of the GitLab API, for authentication and resource access. # 👉No tests, lacks top-level docs, purpose somewhat unclear. + "crates/but-gitea", # 📄A thin wrapper of the Gitea API, for authentication and resource access. + # 👉No tests, lacks top-level docs, purpose somewhat unclear. "crates/but-cursor", # 📄Integration with Cursor # 👉Kind of no docs, no tests, and unclear purpose. "crates/but-forge", # 📄A generalised interface to communicate with forges. @@ -174,6 +176,7 @@ but-cherry-apply = { path = "crates/but-cherry-apply" } but-irc = { path = "crates/but-irc" } but-github = { path = "crates/but-github" } but-gitlab = { path = "crates/but-gitlab" } +but-gitea = { path = "crates/but-gitea" } but-error = { path = "crates/but-error" } but-serde = { path = "crates/but-serde" } but-schemars = { path = "crates/but-schemars" } diff --git a/apps/desktop/src/components/GiteaAccountBadge.svelte b/apps/desktop/src/components/GiteaAccountBadge.svelte new file mode 100644 index 00000000000..49bce4a609b --- /dev/null +++ b/apps/desktop/src/components/GiteaAccountBadge.svelte @@ -0,0 +1,27 @@ + + + + {badgeText(account)} + diff --git a/apps/desktop/src/components/GiteaIntegration.svelte b/apps/desktop/src/components/GiteaIntegration.svelte new file mode 100644 index 00000000000..62a567cdbc8 --- /dev/null +++ b/apps/desktop/src/components/GiteaIntegration.svelte @@ -0,0 +1,173 @@ + + +
+ + + {#snippet error()} + + {#snippet title()} + Failed to load Gitea accounts + {/snippet} + + + {/snippet} + + {#snippet children(accounts)} + {@const noAccounts = accounts.length === 0} + {#each accounts as account} + + {/each} + + 0 ? "var(--clr-bg-2)" : undefined}> + {#snippet iconSide()} + + {/snippet} + + {#snippet title()} + Gitea + {/snippet} + + {#snippet caption()} + Store a personal access token for Codeberg or any Gitea-compatible instance. + {/snippet} + + {#snippet actions()} + + {/snippet} + + {/snippet} + + + + {#if showingFlow} +
+ + + {#snippet title()} + Add Gitea Account + {/snippet} + + {#snippet caption()} + Use the web base URL for your instance, such as `https://codeberg.org` or your + self-hosted Gitea host. + {/snippet} + + (hostInput = value)} + placeholder="https://codeberg.org" + error={hostError} + /> + (patInput = value)} + error={patError} + /> + + +
+ + +
+
+
+
+ {/if} +
+ +

+ 🔒 Credentials are persisted locally in your OS Keychain / Credential Manager. +

+ + diff --git a/apps/desktop/src/components/GiteaUserLoginState.svelte b/apps/desktop/src/components/GiteaUserLoginState.svelte new file mode 100644 index 00000000000..7306e74ae82 --- /dev/null +++ b/apps/desktop/src/components/GiteaUserLoginState.svelte @@ -0,0 +1,70 @@ + + + + {#snippet loading()} + forget(account)} + isForgetLoading={forgetting.current.isLoading} + > + {#snippet badge()} + + {/snippet} + + {/snippet} + {#snippet error()} + forget(account)} + isForgetLoading={forgetting.current.isLoading} + > + {#snippet badge()} + + {/snippet} + + {/snippet} + {#snippet children(user)} + forget(account)} + isForgetLoading={forgetting.current.isLoading} + > + {#snippet badge()} + + {/snippet} + + {/snippet} + diff --git a/apps/desktop/src/components/profileSettings/IntegrationsSettings.svelte b/apps/desktop/src/components/profileSettings/IntegrationsSettings.svelte index 5460515859e..9e5923a91e9 100644 --- a/apps/desktop/src/components/profileSettings/IntegrationsSettings.svelte +++ b/apps/desktop/src/components/profileSettings/IntegrationsSettings.svelte @@ -1,4 +1,5 @@