From 679489086fad95e8bd910b89ccd235630bfd956e Mon Sep 17 00:00:00 2001 From: Torsten Dittmann Date: Tue, 14 Jul 2026 17:48:26 +0400 Subject: [PATCH 1/2] Fix migration build specification --- src/Migration/Destinations/Appwrite.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Migration/Destinations/Appwrite.php b/src/Migration/Destinations/Appwrite.php index 07500f60..aa775e70 100644 --- a/src/Migration/Destinations/Appwrite.php +++ b/src/Migration/Destinations/Appwrite.php @@ -2473,7 +2473,7 @@ functionId: $resource->getId(), entrypoint: $resource->getEntrypoint(), commands: $resource->getCommands(), scopes: $resource->getScopes(), - buildSpecification: $resource->getSpecification() ?: null, + buildSpecification: 's-2vcpu-2gb', runtimeSpecification: $resource->getSpecification() ?: null, ); break; @@ -2662,7 +2662,7 @@ public function importSiteResource(Resource $resource): Resource outputDirectory: $resource->getOutputDirectory(), adapter: $adapter, fallbackFile: $resource->getFallbackFile(), - buildSpecification: $resource->getSpecification() ?: null, + buildSpecification: 's-2vcpu-2gb', runtimeSpecification: $resource->getSpecification() ?: null, ); break; From e599e33f35b118fda786aca4132f87b2835f11a0 Mon Sep 17 00:00:00 2001 From: Torsten Dittmann Date: Tue, 14 Jul 2026 17:55:04 +0400 Subject: [PATCH 2/2] Preserve build and runtime specifications --- src/Migration/Destinations/Appwrite.php | 8 +-- src/Migration/Resources/Functions/Func.php | 19 ++++++- src/Migration/Resources/Sites/Site.php | 21 ++++++- src/Migration/Sources/Appwrite.php | 8 ++- .../Unit/Resources/SpecificationTest.php | 56 +++++++++++++++++++ 5 files changed, 100 insertions(+), 12 deletions(-) create mode 100644 tests/Migration/Unit/Resources/SpecificationTest.php diff --git a/src/Migration/Destinations/Appwrite.php b/src/Migration/Destinations/Appwrite.php index aa775e70..b45f3077 100644 --- a/src/Migration/Destinations/Appwrite.php +++ b/src/Migration/Destinations/Appwrite.php @@ -2473,8 +2473,8 @@ functionId: $resource->getId(), entrypoint: $resource->getEntrypoint(), commands: $resource->getCommands(), scopes: $resource->getScopes(), - buildSpecification: 's-2vcpu-2gb', - runtimeSpecification: $resource->getSpecification() ?: null, + buildSpecification: $resource->getBuildSpecification() ?: null, + runtimeSpecification: $resource->getRuntimeSpecification() ?: null, ); break; case Resource::TYPE_ENVIRONMENT_VARIABLE: @@ -2662,8 +2662,8 @@ public function importSiteResource(Resource $resource): Resource outputDirectory: $resource->getOutputDirectory(), adapter: $adapter, fallbackFile: $resource->getFallbackFile(), - buildSpecification: 's-2vcpu-2gb', - runtimeSpecification: $resource->getSpecification() ?: null, + buildSpecification: $resource->getBuildSpecification() ?: null, + runtimeSpecification: $resource->getRuntimeSpecification() ?: null, ); break; case Resource::TYPE_SITE_VARIABLE: diff --git a/src/Migration/Resources/Functions/Func.php b/src/Migration/Resources/Functions/Func.php index ef5e6934..4e0160fb 100644 --- a/src/Migration/Resources/Functions/Func.php +++ b/src/Migration/Resources/Functions/Func.php @@ -22,6 +22,7 @@ class Func extends Resource * @param bool $logging * @param array $scopes * @param string $specification + * @param string $buildSpecification */ public function __construct( string $id, @@ -37,7 +38,8 @@ public function __construct( private readonly string $commands = '', private readonly bool $logging = true, private readonly array $scopes = [], - private readonly string $specification = '' + private readonly string $specification = '', + private readonly string $buildSpecification = '' ) { $this->id = $id; } @@ -62,7 +64,8 @@ public static function fromArray(array $array): self $array['commands'] ?? '', $array['logging'] ?? true, $array['scopes'] ?? [], - $array['specification'] ?? '' + $array['runtimeSpecification'] ?? $array['specification'] ?? '', + $array['buildSpecification'] ?? $array['specification'] ?? '' ); } @@ -86,6 +89,8 @@ public function jsonSerialize(): array 'logging' => $this->logging, 'scopes' => $this->scopes, 'specification' => $this->specification, + 'runtimeSpecification' => $this->specification, + 'buildSpecification' => $this->buildSpecification, ]; } @@ -172,4 +177,14 @@ public function getSpecification(): string { return $this->specification; } + + public function getRuntimeSpecification(): string + { + return $this->specification; + } + + public function getBuildSpecification(): string + { + return $this->buildSpecification ?: $this->specification; + } } diff --git a/src/Migration/Resources/Sites/Site.php b/src/Migration/Resources/Sites/Site.php index b04d06b9..986a91ce 100644 --- a/src/Migration/Resources/Sites/Site.php +++ b/src/Migration/Resources/Sites/Site.php @@ -22,6 +22,7 @@ class Site extends Resource * @param string $fallbackFile * @param string $specification * @param string $activeDeployment + * @param string $buildSpecification */ public function __construct( string $id, @@ -37,7 +38,8 @@ public function __construct( private readonly string $adapter = 'static', private readonly string $fallbackFile = '', private readonly string $specification = '', - private readonly string $activeDeployment = '' + private readonly string $activeDeployment = '', + private readonly string $buildSpecification = '' ) { $this->id = $id; } @@ -61,8 +63,9 @@ public static function fromArray(array $array): self $array['outputDirectory'] ?? '', $array['adapter'] ?? 'static', $array['fallbackFile'] ?? '', - $array['specification'] ?? '', - $array['activeDeployment'] ?? '' + $array['runtimeSpecification'] ?? $array['specification'] ?? '', + $array['activeDeployment'] ?? '', + $array['buildSpecification'] ?? $array['specification'] ?? '' ); } @@ -85,7 +88,9 @@ public function jsonSerialize(): array 'adapter' => $this->adapter, 'fallbackFile' => $this->fallbackFile, 'specification' => $this->specification, + 'runtimeSpecification' => $this->specification, 'activeDeployment' => $this->activeDeployment, + 'buildSpecification' => $this->buildSpecification, ]; } @@ -159,6 +164,16 @@ public function getSpecification(): string return $this->specification; } + public function getRuntimeSpecification(): string + { + return $this->specification; + } + + public function getBuildSpecification(): string + { + return $this->buildSpecification ?: $this->specification; + } + public function getActiveDeployment(): string { return $this->activeDeployment; diff --git a/src/Migration/Sources/Appwrite.php b/src/Migration/Sources/Appwrite.php index cf653838..40ec3dee 100644 --- a/src/Migration/Sources/Appwrite.php +++ b/src/Migration/Sources/Appwrite.php @@ -2149,7 +2149,8 @@ private function exportFunctions(int $batchSize): void $function->commands ?? '', $function->logging ?? true, $function->scopes ?? [], - $function->runtimeSpecification ?: $function->buildSpecification ?: '', + $function->runtimeSpecification ?: '', + $function->buildSpecification ?: '', ); $functions[] = $convertedFunc; @@ -2732,8 +2733,9 @@ private function exportSites(int $batchSize): void $site->outputDirectory ?? '', $site->adapter ?? 'static', $site->fallbackFile ?? '', - $site->runtimeSpecification ?: $site->buildSpecification ?: '', - $site->deploymentId ?? '' + $site->runtimeSpecification ?: '', + $site->deploymentId ?? '', + $site->buildSpecification ?: '' ); $sites[] = $convertedSite; $convertedResources[] = $convertedSite; diff --git a/tests/Migration/Unit/Resources/SpecificationTest.php b/tests/Migration/Unit/Resources/SpecificationTest.php new file mode 100644 index 00000000..70aa9540 --- /dev/null +++ b/tests/Migration/Unit/Resources/SpecificationTest.php @@ -0,0 +1,56 @@ + 'function', + 'name' => 'Function', + 'runtime' => 'php-8.4', + 'runtimeSpecification' => 's-1vcpu-512mb', + 'buildSpecification' => 's-2vcpu-2gb', + ]); + + $this->assertSame('s-1vcpu-512mb', $function->getRuntimeSpecification()); + $this->assertSame('s-2vcpu-2gb', $function->getBuildSpecification()); + $this->assertSame('s-1vcpu-512mb', $function->jsonSerialize()['runtimeSpecification']); + $this->assertSame('s-2vcpu-2gb', $function->jsonSerialize()['buildSpecification']); + } + + public function testSitePreservesBuildAndRuntimeSpecifications(): void + { + $site = Site::fromArray([ + 'id' => 'site', + 'name' => 'Site', + 'framework' => 'other', + 'buildRuntime' => 'node-22', + 'runtimeSpecification' => 's-1vcpu-512mb', + 'buildSpecification' => 's-2vcpu-2gb', + ]); + + $this->assertSame('s-1vcpu-512mb', $site->getRuntimeSpecification()); + $this->assertSame('s-2vcpu-2gb', $site->getBuildSpecification()); + $this->assertSame('s-1vcpu-512mb', $site->jsonSerialize()['runtimeSpecification']); + $this->assertSame('s-2vcpu-2gb', $site->jsonSerialize()['buildSpecification']); + } + + public function testLegacySpecificationIsUsedForBuildAndRuntime(): void + { + $function = Func::fromArray([ + 'id' => 'function', + 'name' => 'Function', + 'runtime' => 'php-8.4', + 'specification' => 's-1vcpu-512mb', + ]); + + $this->assertSame('s-1vcpu-512mb', $function->getRuntimeSpecification()); + $this->assertSame('s-1vcpu-512mb', $function->getBuildSpecification()); + } +}