fix: strip f/ prefix from folder paths when deploying from workspace forks (#8662)

* fix: strip f/ prefix from folder paths when deploying from workspace forks

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* refactor: extract folderName helper for f/ prefix stripping

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Ruben Fiszel
2026-04-01 21:06:19 +00:00
committed by GitHub
parent bcce627387
commit 7ab0ea581d
2 changed files with 45 additions and 10 deletions
@@ -144,7 +144,7 @@
const app = await AppService.getAppByPath({ workspace, path })
return app.summary
} else if (kind === 'folder') {
const folder = await FolderService.getFolder({ workspace, name: path.slice(2) })
const folder = await FolderService.getFolder({ workspace, name: path.replace(/^f\//, '') })
return folder.summary
}
} catch (error) {
@@ -361,7 +361,14 @@
const parent = parentWorkspaceId
const current = currentWorkspaceId
for (const itemKey of selectedItems) {
const sortedItems = [...selectedItems].sort((a, b) => {
const aIsFolder = a.startsWith('folder:')
const bIsFolder = b.startsWith('folder:')
if (aIsFolder && !bIsFolder) return -1
if (!aIsFolder && bIsFolder) return 1
return 0
})
for (const itemKey of sortedItems) {
const diff = selectableDiffs.find((d) => itemKey == getItemKey(d))
if (!diff) {
+36 -8
View File
@@ -18,6 +18,11 @@ import {
} from '$lib/utils_deployable'
import type { TriggerKind } from './components/triggers'
/** Folder diff paths carry the `f/` prefix (e.g. `f/test`), but folder API endpoints expect just the name. */
function folderName(path: string): string {
return path.replace(/^f\//, '')
}
export interface DeployItemParams {
kind: Kind
path: string
@@ -254,12 +259,32 @@ export async function deployItem(params: DeployItemParams): Promise<DeployResult
})
}
} else if (kind === 'folder') {
await FolderService.createFolder({
workspace: workspaceTo,
requestBody: {
name: path
}
const name = folderName(path)
const folder = await FolderService.getFolder({
workspace: workspaceFrom,
name
})
if (alreadyExists) {
await FolderService.updateFolder({
workspace: workspaceTo,
name,
requestBody: {
owners: folder.owners,
extra_perms: folder.extra_perms as any,
summary: folder.summary ?? undefined
}
})
} else {
await FolderService.createFolder({
workspace: workspaceTo,
requestBody: {
name,
owners: folder.owners,
extra_perms: folder.extra_perms as any,
summary: folder.summary ?? undefined
}
})
}
} else if (kind === 'trigger') {
if (additionalInformation?.triggers) {
const { data, createFn, updateFn } = await getTriggersDeployData(
@@ -340,7 +365,7 @@ export async function checkItemExists(
} else if (kind === 'folder') {
return await FolderService.existsFolder({
workspace: workspace,
name: path
name: folderName(path)
})
} else if (kind === 'trigger') {
const triggersKind: TriggerKind[] = [
@@ -435,10 +460,13 @@ export async function getItemValue(
} else if (kind === 'folder') {
const folder = await FolderService.getFolder({
workspace: workspace,
name: path
name: folderName(path)
})
return {
name: folder.name
name: folder.name,
owners: folder.owners,
extra_perms: folder.extra_perms,
summary: folder.summary
}
} else if (kind === 'trigger') {
if (additionalInformation?.triggers) {