diff --git a/bun.lock b/bun.lock index 2d0120fad..cfcf28654 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 601b5bc4d..e7a228a5b 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" } } 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..df2c80050 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'; @@ -274,9 +275,20 @@ variant="secondary" style="flex-shrink: 0;" disabled={!!connectingRepositoryId} - on:click={() => { + on:click={async () => { connectingRepositoryId = repo.id; - connect(repo); + try { + await Promise.resolve(connect(repo)); + } catch (error) { + addNotification({ + type: 'error', + message: + error?.message ?? + 'Failed to connect repository' + }); + } finally { + connectingRepositoryId = null; + } }}> Connect 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. - + 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..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 @@ -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'; @@ -40,28 +41,45 @@ }); async function connect(selectedInstallationId: string, selectedRepository: string) { + let nextBranch = data.site?.providerBranch ?? 'main'; try { - 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: 'main' - }); - invalidate(Dependencies.SITE); + 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 { - return; + // 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 56c871ac4..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,30 +116,46 @@ } async function connect(selectedInstallationId: string, selectedRepository: string) { + let nextBranch = site?.providerBranch ?? 'main'; try { - 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: 'main', - specification: site?.specification || undefined - }); - - invalidate(Dependencies.SITE); + 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 { - return; + // 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) {