From 85fd6017691bfdc4f96f28f651a38b05836adb66 Mon Sep 17 00:00:00 2001 From: Harsh Mahajan Date: Mon, 2 Mar 2026 13:35:06 +0530 Subject: [PATCH 1/7] fix(sites): reconnect repo flow and branch selection --- .../components/git/connectRepoModal.svelte | 24 +++++++++++++++- src/lib/components/git/repositories.svelte | 28 +++++++++++++++++-- .../site-[site]/deployments/+page.svelte | 22 ++++++++++++++- .../settings/updateRepository.svelte | 20 ++++++++++++- 4 files changed, 89 insertions(+), 5 deletions(-) diff --git a/src/lib/components/git/connectRepoModal.svelte b/src/lib/components/git/connectRepoModal.svelte index 05cfd5863..faca63d91 100644 --- a/src/lib/components/git/connectRepoModal.svelte +++ b/src/lib/components/git/connectRepoModal.svelte @@ -52,6 +52,12 @@ } }); + $effect(() => { + if ($installation?.$id) { + selectedInstallationId = $installation.$id; + } + }); + async function connectRepo() { try { if (repositoryBehaviour === 'new') { @@ -105,13 +111,29 @@ {product} action="button" {callbackState} - connect={(e) => { + connect={async (e) => { trackEvent(Click.ConnectRepositoryClick, { from: product }); repository.set(e); repositoryName = e.name; selectedRepository = e.id; + if (!selectedInstallationId && $installation?.$id) { + selectedInstallationId = $installation.$id; + } + try { + await connect(selectedInstallationId, e.id); + show = false; + addNotification({ + type: 'success', + message: 'Repository connected successfully' + }); + } catch (error) { + addNotification({ + type: 'error', + message: error?.message ?? 'Failed to connect repository' + }); + } }} /> {/if} diff --git a/src/lib/components/git/repositories.svelte b/src/lib/components/git/repositories.svelte index 105ed8fb1..b449bd37b 100644 --- a/src/lib/components/git/repositories.svelte +++ b/src/lib/components/git/repositories.svelte @@ -20,6 +20,7 @@ import { Query, VCSDetectionType, type Models } from '@appwrite.io/console'; import { getFrameworkIcon } from '$lib/stores/sites'; import { connectGitHub } from '$lib/stores/git'; + import { addNotification } from '$lib/stores/notifications'; import { page } from '$app/state'; import Card from '../card.svelte'; import SkeletonRepoList from './skeletonRepoList.svelte'; @@ -52,6 +53,7 @@ let connectingRepositoryId = $state(null); let loadRepositoriesRequestId = 0; const limit = 5; + const connectTimeoutMs = 30000; onMount(() => { isLoadingRepositories = true; @@ -274,9 +276,31 @@ variant="secondary" style="flex-shrink: 0;" disabled={!!connectingRepositoryId} - on:click={() => { + on:click={async () => { connectingRepositoryId = repo.id; - connect(repo); + try { + await Promise.race([ + Promise.resolve(connect(repo)), + new Promise((_, reject) => + setTimeout(() => { + reject( + new Error( + 'Connection timed out. Please try again.' + ) + ); + }, connectTimeoutMs) + ) + ]); + } catch (error) { + addNotification({ + type: 'error', + message: + error?.message ?? + 'Failed to connect repository' + }); + } finally { + connectingRepositoryId = null; + } }}> Connect diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/+page.svelte b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/+page.svelte index 29df3fa63..ea10d444a 100644 --- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/+page.svelte @@ -14,6 +14,7 @@ import { IconPlus } from '@appwrite.io/pink-icons-svelte'; import { onMount } from 'svelte'; import { realtime, sdk } from '$lib/stores/sdk'; + import { sortBranches } from '$lib/stores/vcs'; import { invalidate } from '$app/navigation'; import { Dependencies } from '$lib/constants'; import CreateCliModal from './createCliModal.svelte'; @@ -41,6 +42,22 @@ async function connect(selectedInstallationId: string, selectedRepository: string) { try { + let nextBranch = data.site?.providerBranch ?? 'main'; + try { + const branchList = await sdk + .forProject(page.params.region, page.params.project) + .vcs.listRepositoryBranches({ + installationId: selectedInstallationId, + providerRepositoryId: selectedRepository + }); + const sorted = sortBranches(branchList.branches); + nextBranch = + sorted.find((branch) => branch.name === data.site?.providerBranch)?.name ?? + sorted[0]?.name ?? + nextBranch; + } catch { + // Ignore branch lookup failures; fallback to default. + } await sdk.forProject(page.params.region, page.params.project).sites.update({ siteId: data.site.$id, name: data.site.name, @@ -56,7 +73,10 @@ fallbackFile: data.site.fallbackFile, installationId: selectedInstallationId, providerRepositoryId: selectedRepository, - providerBranch: 'main' + providerBranch: nextBranch, + providerSilentMode: data.site?.providerSilentMode || undefined, + providerRootDirectory: data.site?.providerRootDirectory || undefined, + specification: data.site?.specification || undefined }); invalidate(Dependencies.SITE); } catch { diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/settings/updateRepository.svelte b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/settings/updateRepository.svelte index 56c871ac4..9f493a1a1 100644 --- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/settings/updateRepository.svelte +++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/settings/updateRepository.svelte @@ -117,6 +117,22 @@ async function connect(selectedInstallationId: string, selectedRepository: string) { try { + let nextBranch = site?.providerBranch ?? 'main'; + try { + const branchList = await sdk + .forProject(page.params.region, page.params.project) + .vcs.listRepositoryBranches({ + installationId: selectedInstallationId, + providerRepositoryId: selectedRepository + }); + const sorted = sortBranches(branchList.branches); + nextBranch = + sorted.find((branch) => branch.name === site?.providerBranch)?.name ?? + sorted[0]?.name ?? + nextBranch; + } catch { + // Ignore branch lookup failures; fallback to default. + } await sdk.forProject(page.params.region, page.params.project).sites.update({ siteId: site.$id, name: site.name, @@ -132,7 +148,9 @@ fallbackFile: site?.fallbackFile, installationId: selectedInstallationId, providerRepositoryId: selectedRepository, - providerBranch: 'main', + providerBranch: nextBranch, + providerSilentMode: site?.providerSilentMode || undefined, + providerRootDirectory: site?.providerRootDirectory || undefined, specification: site?.specification || undefined }); From 2dffe54f93a8544dba5e689b9b006e04eb5f267b Mon Sep 17 00:00:00 2001 From: Harsh Mahajan Date: Mon, 2 Mar 2026 13:39:33 +0530 Subject: [PATCH 2/7] upgrade minmatch --- bun.lock | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bun.lock b/bun.lock index 72b338490..12377f914 100644 --- a/bun.lock +++ b/bun.lock @@ -76,7 +76,7 @@ }, }, "overrides": { - "minimatch": "10.2.1", + "minimatch": "10.2.3", "vite": "npm:rolldown-vite@latest", }, "packages": { @@ -1086,7 +1086,7 @@ "min-indent": ["min-indent@1.0.1", "", {}, "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg=="], - "minimatch": ["minimatch@10.2.1", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-MClCe8IL5nRRmawL6ib/eT4oLyeKMGCghibcDWK+J0hh0Q8kqSdia6BvbRMVk6mPa6WqUa5uR2oxt6C5jd533A=="], + "minimatch": ["minimatch@10.2.3", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-Rwi3pnapEqirPSbWbrZaa6N3nmqq4Xer/2XooiOKyV3q12ML06f7MOuc5DVH8ONZIFhwIYQ3yzPH4nt7iWHaTg=="], "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], diff --git a/package.json b/package.json index 57e3e7a94..0ff0eb93c 100644 --- a/package.json +++ b/package.json @@ -89,6 +89,6 @@ }, "overrides": { "vite": "npm:rolldown-vite@latest", - "minimatch": "10.2.1" + "minimatch": "10.2.3" } } From f83c3f5074006ed9db5e6c3b69af6730885efdf6 Mon Sep 17 00:00:00 2001 From: Harsh Mahajan Date: Mon, 2 Mar 2026 13:49:45 +0530 Subject: [PATCH 3/7] fixes code rabbit comments --- src/lib/components/git/repositories.svelte | 14 +------------- .../sites/site-[site]/deployments/+page.svelte | 4 ++-- .../site-[site]/settings/updateRepository.svelte | 4 ++-- 3 files changed, 5 insertions(+), 17 deletions(-) diff --git a/src/lib/components/git/repositories.svelte b/src/lib/components/git/repositories.svelte index b449bd37b..df2c80050 100644 --- a/src/lib/components/git/repositories.svelte +++ b/src/lib/components/git/repositories.svelte @@ -53,7 +53,6 @@ let connectingRepositoryId = $state(null); let loadRepositoriesRequestId = 0; const limit = 5; - const connectTimeoutMs = 30000; onMount(() => { isLoadingRepositories = true; @@ -279,18 +278,7 @@ on:click={async () => { connectingRepositoryId = repo.id; try { - await Promise.race([ - Promise.resolve(connect(repo)), - new Promise((_, reject) => - setTimeout(() => { - reject( - new Error( - 'Connection timed out. Please try again.' - ) - ); - }, connectTimeoutMs) - ) - ]); + await Promise.resolve(connect(repo)); } catch (error) { addNotification({ type: 'error', diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/+page.svelte b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/+page.svelte index ea10d444a..1bea82051 100644 --- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/+page.svelte @@ -74,8 +74,8 @@ installationId: selectedInstallationId, providerRepositoryId: selectedRepository, providerBranch: nextBranch, - providerSilentMode: data.site?.providerSilentMode || undefined, - providerRootDirectory: data.site?.providerRootDirectory || undefined, + providerSilentMode: data.site?.providerSilentMode ?? undefined, + providerRootDirectory: data.site?.providerRootDirectory ?? undefined, specification: data.site?.specification || undefined }); invalidate(Dependencies.SITE); diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/settings/updateRepository.svelte b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/settings/updateRepository.svelte index 9f493a1a1..6ed712d80 100644 --- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/settings/updateRepository.svelte +++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/settings/updateRepository.svelte @@ -149,8 +149,8 @@ installationId: selectedInstallationId, providerRepositoryId: selectedRepository, providerBranch: nextBranch, - providerSilentMode: site?.providerSilentMode || undefined, - providerRootDirectory: site?.providerRootDirectory || undefined, + providerSilentMode: site?.providerSilentMode ?? undefined, + providerRootDirectory: site?.providerRootDirectory ?? undefined, specification: site?.specification || undefined }); From 20cd8f50e54d974fe8451ae173946e1fd0b3f16d Mon Sep 17 00:00:00 2001 From: Harsh Mahajan Date: Mon, 2 Mar 2026 14:24:06 +0530 Subject: [PATCH 4/7] fix greptile comments --- .../sites/site-[site]/deployments/+page.svelte | 2 ++ .../sites/site-[site]/settings/updateRepository.svelte | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/+page.svelte b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/+page.svelte index 1bea82051..23958a186 100644 --- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/+page.svelte @@ -53,6 +53,8 @@ const sorted = sortBranches(branchList.branches); nextBranch = sorted.find((branch) => branch.name === data.site?.providerBranch)?.name ?? + sorted.find((branch) => branch.name === 'main' || branch.name === 'master') + ?.name ?? sorted[0]?.name ?? nextBranch; } catch { diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/settings/updateRepository.svelte b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/settings/updateRepository.svelte index 6ed712d80..ba6d20adf 100644 --- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/settings/updateRepository.svelte +++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/settings/updateRepository.svelte @@ -128,6 +128,8 @@ const sorted = sortBranches(branchList.branches); nextBranch = sorted.find((branch) => branch.name === site?.providerBranch)?.name ?? + sorted.find((branch) => branch.name === 'main' || branch.name === 'master') + ?.name ?? sorted[0]?.name ?? nextBranch; } catch { From 80a8f253344f89e086e44cbeeabb7effd2a4ad1a Mon Sep 17 00:00:00 2001 From: Harsh Mahajan Date: Mon, 2 Mar 2026 14:43:58 +0530 Subject: [PATCH 5/7] catch err --- .../sites/site-[site]/deployments/+page.svelte | 4 ++-- .../sites/site-[site]/settings/updateRepository.svelte | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/+page.svelte b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/+page.svelte index 23958a186..6f32e544d 100644 --- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/+page.svelte @@ -81,8 +81,8 @@ specification: data.site?.specification || undefined }); invalidate(Dependencies.SITE); - } catch { - return; + } catch (error) { + throw error; } } diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/settings/updateRepository.svelte b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/settings/updateRepository.svelte index ba6d20adf..b9f0e8bab 100644 --- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/settings/updateRepository.svelte +++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/settings/updateRepository.svelte @@ -157,8 +157,8 @@ }); invalidate(Dependencies.SITE); - } catch { - return; + } catch (error) { + throw error; } } From 90912c3403d79f253d9335bf8f0bc25303ef0acf Mon Sep 17 00:00:00 2001 From: Harsh Mahajan Date: Mon, 2 Mar 2026 14:54:48 +0530 Subject: [PATCH 6/7] fix --- .../site-[site]/deployments/+page.svelte | 78 +++++++++--------- .../settings/updateRepository.svelte | 80 +++++++++---------- 2 files changed, 75 insertions(+), 83 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/+page.svelte b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/+page.svelte index 6f32e544d..363f84d11 100644 --- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/deployments/+page.svelte @@ -41,49 +41,45 @@ }); async function connect(selectedInstallationId: string, selectedRepository: string) { + let nextBranch = data.site?.providerBranch ?? 'main'; try { - let nextBranch = data.site?.providerBranch ?? 'main'; - try { - const branchList = await sdk - .forProject(page.params.region, page.params.project) - .vcs.listRepositoryBranches({ - installationId: selectedInstallationId, - providerRepositoryId: selectedRepository - }); - const sorted = sortBranches(branchList.branches); - nextBranch = - sorted.find((branch) => branch.name === data.site?.providerBranch)?.name ?? - sorted.find((branch) => branch.name === 'main' || branch.name === 'master') - ?.name ?? - sorted[0]?.name ?? - nextBranch; - } catch { - // Ignore branch lookup failures; fallback to default. - } - await sdk.forProject(page.params.region, page.params.project).sites.update({ - siteId: data.site.$id, - name: data.site.name, - framework: data.site.framework as Framework, - enabled: data.site.enabled, - logging: data.site.logging || undefined, - timeout: data.site.timeout, - installCommand: data.site.installCommand, - buildCommand: data.site.buildCommand, - outputDirectory: data.site.outputDirectory, - buildRuntime: data.site.buildRuntime as BuildRuntime, - adapter: data.site.adapter as Adapter, - fallbackFile: data.site.fallbackFile, - installationId: selectedInstallationId, - providerRepositoryId: selectedRepository, - providerBranch: nextBranch, - providerSilentMode: data.site?.providerSilentMode ?? undefined, - providerRootDirectory: data.site?.providerRootDirectory ?? undefined, - specification: data.site?.specification || undefined - }); - invalidate(Dependencies.SITE); - } catch (error) { - throw error; + const branchList = await sdk + .forProject(page.params.region, page.params.project) + .vcs.listRepositoryBranches({ + installationId: selectedInstallationId, + providerRepositoryId: selectedRepository + }); + const sorted = sortBranches(branchList.branches); + nextBranch = + sorted.find((branch) => branch.name === data.site?.providerBranch)?.name ?? + sorted.find((branch) => branch.name === 'main' || branch.name === 'master')?.name ?? + sorted[0]?.name ?? + nextBranch; + } catch { + // Ignore branch lookup failures; fallback to default. } + + await sdk.forProject(page.params.region, page.params.project).sites.update({ + siteId: data.site.$id, + name: data.site.name, + framework: data.site.framework as Framework, + enabled: data.site.enabled, + logging: data.site.logging || undefined, + timeout: data.site.timeout, + installCommand: data.site.installCommand, + buildCommand: data.site.buildCommand, + outputDirectory: data.site.outputDirectory, + buildRuntime: data.site.buildRuntime as BuildRuntime, + adapter: data.site.adapter as Adapter, + fallbackFile: data.site.fallbackFile, + installationId: selectedInstallationId, + providerRepositoryId: selectedRepository, + providerBranch: nextBranch, + providerSilentMode: data.site?.providerSilentMode ?? undefined, + providerRootDirectory: data.site?.providerRootDirectory ?? undefined, + specification: data.site?.specification || undefined + }); + invalidate(Dependencies.SITE); } diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/settings/updateRepository.svelte b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/settings/updateRepository.svelte index b9f0e8bab..8386f5222 100644 --- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/settings/updateRepository.svelte +++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/settings/updateRepository.svelte @@ -116,50 +116,46 @@ } async function connect(selectedInstallationId: string, selectedRepository: string) { + let nextBranch = site?.providerBranch ?? 'main'; try { - let nextBranch = site?.providerBranch ?? 'main'; - try { - const branchList = await sdk - .forProject(page.params.region, page.params.project) - .vcs.listRepositoryBranches({ - installationId: selectedInstallationId, - providerRepositoryId: selectedRepository - }); - const sorted = sortBranches(branchList.branches); - nextBranch = - sorted.find((branch) => branch.name === site?.providerBranch)?.name ?? - sorted.find((branch) => branch.name === 'main' || branch.name === 'master') - ?.name ?? - sorted[0]?.name ?? - nextBranch; - } catch { - // Ignore branch lookup failures; fallback to default. - } - await sdk.forProject(page.params.region, page.params.project).sites.update({ - siteId: site.$id, - name: site.name, - framework: site.framework as Framework, - enabled: site?.enabled, - logging: site?.logging || undefined, - timeout: site?.timeout, - installCommand: site?.installCommand, - buildCommand: site?.buildCommand, - outputDirectory: site?.outputDirectory, - buildRuntime: site?.buildRuntime as BuildRuntime, - adapter: site.adapter as Adapter, - fallbackFile: site?.fallbackFile, - installationId: selectedInstallationId, - providerRepositoryId: selectedRepository, - providerBranch: nextBranch, - providerSilentMode: site?.providerSilentMode ?? undefined, - providerRootDirectory: site?.providerRootDirectory ?? undefined, - specification: site?.specification || undefined - }); - - invalidate(Dependencies.SITE); - } catch (error) { - throw error; + const branchList = await sdk + .forProject(page.params.region, page.params.project) + .vcs.listRepositoryBranches({ + installationId: selectedInstallationId, + providerRepositoryId: selectedRepository + }); + const sorted = sortBranches(branchList.branches); + nextBranch = + sorted.find((branch) => branch.name === site?.providerBranch)?.name ?? + sorted.find((branch) => branch.name === 'main' || branch.name === 'master')?.name ?? + sorted[0]?.name ?? + nextBranch; + } catch { + // Ignore branch lookup failures; fallback to default. } + + await sdk.forProject(page.params.region, page.params.project).sites.update({ + siteId: site.$id, + name: site.name, + framework: site.framework as Framework, + enabled: site?.enabled, + logging: site?.logging || undefined, + timeout: site?.timeout, + installCommand: site?.installCommand, + buildCommand: site?.buildCommand, + outputDirectory: site?.outputDirectory, + buildRuntime: site?.buildRuntime as BuildRuntime, + adapter: site.adapter as Adapter, + fallbackFile: site?.fallbackFile, + installationId: selectedInstallationId, + providerRepositoryId: selectedRepository, + providerBranch: nextBranch, + providerSilentMode: site?.providerSilentMode ?? undefined, + providerRootDirectory: site?.providerRootDirectory ?? undefined, + specification: site?.specification || undefined + }); + + invalidate(Dependencies.SITE); } $: if (site?.installationId && site?.providerRepositoryId) { From 57921bfd73c67b3799de2504694f22104955c927 Mon Sep 17 00:00:00 2001 From: Hemachandar Date: Mon, 2 Mar 2026 22:30:19 +0530 Subject: [PATCH 7/7] Disable button when request is active --- .../(authenticated)/git/authorize-contributor/+page.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/(authenticated)/git/authorize-contributor/+page.svelte b/src/routes/(authenticated)/git/authorize-contributor/+page.svelte index c8cebcfc4..a23855236 100644 --- a/src/routes/(authenticated)/git/authorize-contributor/+page.svelte +++ b/src/routes/(authenticated)/git/authorize-contributor/+page.svelte @@ -53,5 +53,5 @@ The deployment for pull request #{data.providerPullRequestId} is awaiting approval. When authorized, deployments will be started. - +