Skip to content

Commit 4c0f3f4

Browse files
committed
fix: satisfy provider lifecycle CI
AI assistance: openai/gpt-5.6-sol via OpenCode was used to diagnose, format, test, and verify these CI repairs. Chris Huber remains responsible for every line.
1 parent 9f6bdce commit 4c0f3f4

7 files changed

Lines changed: 138 additions & 84 deletions

includes/class-static-site-importer-entity-materializer-registry.php

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -318,26 +318,29 @@ public static function dependency_plan( array $lifecycle, string $artifact_sha25
318318
}
319319
$adapter = $prepared['adapter'];
320320
foreach ( self::plugin_dependencies( $adapter ) as $dependency ) {
321-
$slug = (string) ( $dependency['slug'] ?? '' );
321+
$slug = (string) ( $dependency['slug'] ?? '' );
322322
$plugin_file = (string) ( $dependency['plugin_file'] ?? '' );
323323
if ( '' === $slug || '' === $plugin_file ) {
324324
continue;
325325
}
326326
$key = 'wp-org:' . $slug;
327327
if ( ! isset( $entries[ $key ] ) ) {
328328
$entries[ $key ] = array(
329-
'source_kind' => 'wordpress.org-plugin',
330-
'package' => $slug,
331-
'slug' => $slug,
332-
'version_policy' => 'wordpress.org-latest-stable',
333-
'reference_policy' => 'resolver-recorded-immutable-package-digest',
334-
'plugin_entrypoint' => $plugin_file,
335-
'activation' => 'required',
336-
'integrity' => array( 'entrypoint_sha256' => '', 'provenance' => 'registry-declared' ),
337-
'provenance' => array(
338-
'adapter_id' => (string) ( $adapter['id'] ?? '' ),
339-
'provider' => (string) ( $adapter['provider'] ?? '' ),
340-
'entity_type' => (string) ( $adapter['entity_type'] ?? '' ),
329+
'source_kind' => 'wordpress.org-plugin',
330+
'package' => $slug,
331+
'slug' => $slug,
332+
'version_policy' => 'wordpress.org-latest-stable',
333+
'reference_policy' => 'resolver-recorded-immutable-package-digest',
334+
'plugin_entrypoint' => $plugin_file,
335+
'activation' => 'required',
336+
'integrity' => array(
337+
'entrypoint_sha256' => '',
338+
'provenance' => 'registry-declared',
339+
),
340+
'provenance' => array(
341+
'adapter_id' => (string) ( $adapter['id'] ?? '' ),
342+
'provider' => (string) ( $adapter['provider'] ?? '' ),
343+
'entity_type' => (string) ( $adapter['entity_type'] ?? '' ),
341344
'declaration_ids' => array(),
342345
),
343346
'provider_readiness' => array_merge(
@@ -351,9 +354,9 @@ public static function dependency_plan( array $lifecycle, string $artifact_sha25
351354
}
352355
ksort( $entries, SORT_STRING );
353356
return array(
354-
'schema' => 'static-site-importer/runtime-dependency-plan/v1',
357+
'schema' => 'static-site-importer/runtime-dependency-plan/v1',
355358
'artifact_sha256' => $artifact_sha256,
356-
'entries' => array_values( $entries ),
359+
'entries' => array_values( $entries ),
357360
);
358361
}
359362

@@ -579,7 +582,7 @@ private static function adapters(): array {
579582
'plugin_file' => 'jetpack/jetpack.php',
580583
'availability_callback' => array( 'Static_Site_Importer_Form_Seeder', 'jetpack_forms_available' ),
581584
'preparation_callback' => array( 'Static_Site_Importer_Form_Seeder', 'prepare_jetpack_forms_runtime' ),
582-
'provider_readiness' => array(
585+
'provider_readiness' => array(
583586
'required_block_types' => Static_Site_Importer_Form_Seeder::required_block_types(),
584587
'required_classes' => Static_Site_Importer_Form_Seeder::required_runtime_apis(),
585588
),

includes/class-static-site-importer-form-seeder.php

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -168,24 +168,21 @@ public static function prepare_jetpack_forms_runtime() {
168168

169169
$modules = new Automattic\Jetpack\Modules();
170170
if ( ! $modules->is_active( 'contact-form' ) ) {
171-
if ( ! method_exists( 'Jetpack', 'activate_module' ) ) {
172-
return self::jetpack_forms_runtime_error( 'static_site_importer_jetpack_forms_activation_missing', array( 'Jetpack::activate_module' ) );
173-
}
174171
$activated = Jetpack::activate_module( 'contact-form', false, false );
175-
if ( false === $activated || ( function_exists( 'is_wp_error' ) && is_wp_error( $activated ) ) ) {
172+
if ( false === $activated ) {
176173
return self::jetpack_forms_runtime_error( 'static_site_importer_jetpack_forms_activation_failed', array( 'contact-form' ) );
177174
}
178175
}
179176

180177
$loader = 'Automattic\\Jetpack\\Forms\\Jetpack_Forms';
181-
if ( ! class_exists( $loader ) || ! method_exists( $loader, 'load_contact_form' ) ) {
178+
if ( ! class_exists( $loader ) ) {
182179
return self::jetpack_forms_runtime_error( 'static_site_importer_jetpack_forms_loader_missing', array( $loader . '::load_contact_form' ) );
183180
}
184181
$loader::load_contact_form();
185182

186183
$initializer = 'Automattic\\Jetpack\\Forms\\ContactForm\\Contact_Form_Plugin';
187184
if ( function_exists( 'did_action' ) && did_action( 'init' ) && ! self::$jetpack_forms_initialized ) {
188-
if ( ! class_exists( $initializer ) || ! method_exists( $initializer, 'init' ) ) {
185+
if ( ! class_exists( $initializer ) ) {
189186
return self::jetpack_forms_runtime_error( 'static_site_importer_jetpack_forms_init_missing', array( $initializer . '::init' ) );
190187
}
191188
$initializer::init();
@@ -206,10 +203,16 @@ public static function prepare_jetpack_forms_runtime() {
206203

207204
/** Build a bounded provider-readiness error. */
208205
private static function jetpack_forms_runtime_error( string $code, array $missing, array $details = array() ): WP_Error {
209-
return new WP_Error( $code, 'Jetpack Forms provider runtime is not ready.', array_filter( array(
210-
'missing' => array_slice( array_values( $missing ), 0, 20 ),
211-
'details' => $details,
212-
) ) );
206+
return new WP_Error(
207+
$code,
208+
'Jetpack Forms provider runtime is not ready.',
209+
array_filter(
210+
array(
211+
'missing' => array_slice( array_values( $missing ), 0, 20 ),
212+
'details' => $details,
213+
)
214+
)
215+
);
213216
}
214217

215218
/**
@@ -218,7 +221,7 @@ private static function jetpack_forms_runtime_error( string $code, array $missin
218221
* @return array<string,mixed>
219222
*/
220223
public static function jetpack_forms_availability_details(): array {
221-
$required_apis = array();
224+
$required_apis = array();
222225
foreach ( self::required_runtime_apis() as $api ) {
223226
$required_apis[ $api ] = class_exists( $api );
224227
}
@@ -232,8 +235,8 @@ public static function jetpack_forms_availability_details(): array {
232235
$registered_blocks[ $block_name ] = $registry->is_registered( $block_name );
233236
}
234237
}
235-
$contact_form_block = $registered_blocks['jetpack/contact-form'];
236-
$field_text_block = $registered_blocks['jetpack/field-text'];
238+
$contact_form_block = $registered_blocks['jetpack/contact-form'];
239+
$field_text_block = $registered_blocks['jetpack/field-text'];
237240
$required_blocks_available = ! empty( $registered_blocks ) && ! in_array( false, $registered_blocks, true );
238241
$required_apis_available = ! empty( $required_apis ) && ! in_array( false, $required_apis, true );
239242

includes/class-static-site-importer-plugin-materializer.php

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -458,11 +458,12 @@ private static function record_installed_provenance( array &$report ): void {
458458
if ( ! is_readable( $file ) ) {
459459
return;
460460
}
461-
$headers = function_exists( 'get_plugin_data' ) ? get_plugin_data( $file, false, false ) : array();
461+
$headers = function_exists( 'get_plugin_data' ) ? get_plugin_data( $file, false, false ) : array();
462+
$sha256 = hash_file( 'sha256', $file );
462463
$report['provenance'] = array(
463464
'source' => 'wordpress.org',
464-
'version' => is_array( $headers ) ? (string) ( $headers['Version'] ?? '' ) : '',
465-
'sha256' => hash_file( 'sha256', $file ) ?: '',
465+
'version' => (string) ( $headers['Version'] ?? '' ),
466+
'sha256' => false !== $sha256 ? $sha256 : '',
466467
);
467468
}
468469

@@ -681,7 +682,13 @@ private static function load_admin_dependencies() {
681682
private static function install_wp_org_plugin( string $slug ) {
682683
if ( defined( 'WP_CLI' ) && WP_CLI && class_exists( 'WP_CLI' ) ) {
683684
try {
684-
$result = WP_CLI::runcommand( 'plugin install ' . escapeshellarg( $slug ), array( 'return' => true, 'exit_on_error' => false ) );
685+
$result = WP_CLI::runcommand(
686+
'plugin install ' . escapeshellarg( $slug ),
687+
array(
688+
'return' => true,
689+
'exit_on_error' => false,
690+
)
691+
);
685692
if ( 0 === $result || null === $result || true === $result ) {
686693
return true;
687694
}

includes/class-static-site-importer-theme-generator.php

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,10 @@ public static function import_website_artifact( array $artifact, array $args = a
111111
return $lifecycle;
112112
}
113113
if ( 'plan' === ( $args['runtime_lifecycle_phase'] ?? '' ) ) {
114+
$encoded_artifact = wp_json_encode( $artifact );
114115
return Static_Site_Importer_Entity_Materializer_Registry::dependency_plan(
115116
$lifecycle,
116-
hash( 'sha256', wp_json_encode( $artifact ) ?: '' )
117+
hash( 'sha256', false !== $encoded_artifact ? $encoded_artifact : '' )
117118
);
118119
}
119120
if ( 'prepare' === ( $args['runtime_lifecycle_phase'] ?? '' ) ) {
@@ -122,10 +123,10 @@ public static function import_website_artifact( array $artifact, array $args = a
122123
return $dependencies;
123124
}
124125
return array(
125-
'status' => 'dependencies_prepared',
126+
'status' => 'dependencies_prepared',
126127
'runtime_lifecycle' => $lifecycle,
127-
'dependencies' => $dependencies,
128-
'fresh_runtime' => array( 'request_id' => self::runtime_request_id() ),
128+
'dependencies' => $dependencies,
129+
'fresh_runtime' => array( 'request_id' => self::runtime_request_id() ),
129130
);
130131
}
131132
if ( 'resume' === ( $args['runtime_lifecycle_phase'] ?? '' ) && (string) ( $args['runtime_lifecycle_request_id'] ?? '' ) === self::runtime_request_id() ) {
@@ -747,8 +748,15 @@ private static function prepare_wordpress_site_plan_lifecycle( array $plan, arra
747748
)
748749
);
749750
}
750-
if ( $capability !== (string) ( $adapter['capability'] ?? '' ) ) {
751-
return new WP_Error( 'static_site_importer_runtime_adapter_invalid', 'Runtime declaration adapter does not support its declared capability.', array( 'status' => 'rejected', 'declaration_id' => $key ) );
751+
if ( (string) ( $adapter['capability'] ?? '' ) !== $capability ) {
752+
return new WP_Error(
753+
'static_site_importer_runtime_adapter_invalid',
754+
'Runtime declaration adapter does not support its declared capability.',
755+
array(
756+
'status' => 'rejected',
757+
'declaration_id' => $key,
758+
)
759+
);
752760
}
753761
if ( 'dependency' === $kind ) {
754762
$lifecycle['dependencies'][ $key ] = array(
@@ -787,7 +795,11 @@ private static function prepare_wordpress_site_plan_lifecycle( array $plan, arra
787795
'required' => $required,
788796
);
789797
if ( ! isset( $lifecycle['dependencies'][ $key ] ) ) {
790-
$lifecycle['dependencies'][ $key ] = array( 'adapter' => $adapter, 'declaration' => $declaration, 'required' => $required );
798+
$lifecycle['dependencies'][ $key ] = array(
799+
'adapter' => $adapter,
800+
'declaration' => $declaration,
801+
'required' => $required,
802+
);
791803
}
792804
}
793805
}
@@ -906,7 +918,15 @@ private static function materialize_prepared_dependencies( array $lifecycle, arr
906918
$reports[ $id ] = ! empty( $args['materialize_dependencies'] ) ? Static_Site_Importer_Entity_Materializer_Registry::materialize_plugin_dependencies( $adapter ) : array( 'status' => 'available' );
907919
foreach ( $reports[ $id ] as $plugin_report ) {
908920
if ( is_array( $plugin_report ) && 'failed' === ( $plugin_report['status'] ?? '' ) ) {
909-
return new WP_Error( 'static_site_importer_required_runtime_dependency_failed', 'SSI could not install or activate a required runtime dependency.', array( 'status' => 'partial', 'declaration_id' => $id, 'dependency' => $plugin_report ) );
921+
return new WP_Error(
922+
'static_site_importer_required_runtime_dependency_failed',
923+
'SSI could not install or activate a required runtime dependency.',
924+
array(
925+
'status' => 'partial',
926+
'declaration_id' => $id,
927+
'dependency' => $plugin_report,
928+
)
929+
);
910930
}
911931
}
912932
if ( 'prepare' === ( $args['runtime_lifecycle_phase'] ?? '' ) ) {

includes/class-static-site-importer-validation-runtime.php

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -114,28 +114,36 @@ public static function validate_artifact( array $input ) {
114114

115115
/** Prepare plugin dependencies in this request; callers resume validation in another request. */
116116
public static function prepare_artifact_dependencies( array $input ) {
117-
$input['runtime_lifecycle_phase'] = 'prepare';
117+
$input['runtime_lifecycle_phase'] = 'prepare';
118118
$input['materialize_dependencies'] = true;
119-
$artifact = isset( $input['artifact'] ) && is_array( $input['artifact'] ) ? $input['artifact'] : array();
119+
$artifact = isset( $input['artifact'] ) && is_array( $input['artifact'] ) ? $input['artifact'] : array();
120120
if ( empty( $artifact ) ) {
121121
return new WP_Error( 'static_site_importer_validation_artifact_missing', 'Dependency preparation requires an artifact JSON object.' );
122122
}
123-
$slug = isset( $input['slug'] ) ? sanitize_title( (string) $input['slug'] ) : 'static-site-importer-validation';
124-
$input['slug'] = '' === $slug ? 'static-site-importer-validation' : $slug;
125-
$input['name'] = isset( $input['name'] ) ? sanitize_text_field( (string) $input['name'] ) : $input['slug'];
126-
$import_args = Static_Site_Importer_Website_Artifact_Import_Input::normalize( $input, array( 'activate' => true, 'overwrite' => true, 'materialize_dependencies' => true ) );
123+
$slug = isset( $input['slug'] ) ? sanitize_title( (string) $input['slug'] ) : 'static-site-importer-validation';
124+
$input['slug'] = '' === $slug ? 'static-site-importer-validation' : $slug;
125+
$input['name'] = isset( $input['name'] ) ? sanitize_text_field( (string) $input['name'] ) : $input['slug'];
126+
$import_args = Static_Site_Importer_Website_Artifact_Import_Input::normalize(
127+
$input,
128+
array(
129+
'activate' => true,
130+
'overwrite' => true,
131+
'materialize_dependencies' => true,
132+
)
133+
);
127134
$import_args['runtime_lifecycle_phase'] = 'prepare';
128-
$result = Static_Site_Importer_Theme_Generator::import_website_artifact( $artifact, $import_args );
135+
$result = Static_Site_Importer_Theme_Generator::import_website_artifact( $artifact, $import_args );
129136
if ( is_wp_error( $result ) ) {
130137
return $result;
131138
}
139+
$encoded_artifact = wp_json_encode( $artifact );
132140
return array(
133-
'schema' => 'static-site-importer/runtime-lifecycle-receipt/v1',
134-
'status' => (string) ( $result['status'] ?? 'failed' ),
135-
'artifact_sha256' => hash( 'sha256', wp_json_encode( $artifact ) ?: '' ),
136-
'slug' => $input['slug'],
137-
'fresh_runtime' => $result['fresh_runtime'] ?? array(),
138-
'dependencies' => $result['dependencies'] ?? array(),
141+
'schema' => 'static-site-importer/runtime-lifecycle-receipt/v1',
142+
'status' => (string) ( $result['status'] ?? 'failed' ),
143+
'artifact_sha256' => hash( 'sha256', false !== $encoded_artifact ? $encoded_artifact : '' ),
144+
'slug' => $input['slug'],
145+
'fresh_runtime' => $result['fresh_runtime'] ?? array(),
146+
'dependencies' => $result['dependencies'] ?? array(),
139147
'runtime_lifecycle' => $result['runtime_lifecycle'] ?? array(),
140148
);
141149
}
@@ -146,12 +154,20 @@ public static function plan_artifact_dependencies( array $input ) {
146154
if ( empty( $artifact ) ) {
147155
return new WP_Error( 'static_site_importer_validation_artifact_missing', 'Dependency planning requires an artifact JSON object.' );
148156
}
149-
$input['runtime_lifecycle_phase'] = 'plan';
157+
$input['runtime_lifecycle_phase'] = 'plan';
150158
$input['materialize_dependencies'] = false;
151-
$input['slug'] = sanitize_title( (string) ( $input['slug'] ?? 'static-site-importer-validation' ) ) ?: 'static-site-importer-validation';
152-
$input['name'] = isset( $input['name'] ) ? sanitize_text_field( (string) $input['name'] ) : $input['slug'];
153-
$args = Static_Site_Importer_Website_Artifact_Import_Input::normalize( $input, array( 'activate' => true, 'overwrite' => true, 'materialize_dependencies' => false ) );
154-
$args['runtime_lifecycle_phase'] = 'plan';
159+
$slug = sanitize_title( (string) ( $input['slug'] ?? 'static-site-importer-validation' ) );
160+
$input['slug'] = '' !== $slug ? $slug : 'static-site-importer-validation';
161+
$input['name'] = isset( $input['name'] ) ? sanitize_text_field( (string) $input['name'] ) : $input['slug'];
162+
$args = Static_Site_Importer_Website_Artifact_Import_Input::normalize(
163+
$input,
164+
array(
165+
'activate' => true,
166+
'overwrite' => true,
167+
'materialize_dependencies' => false,
168+
)
169+
);
170+
$args['runtime_lifecycle_phase'] = 'plan';
155171
return Static_Site_Importer_Theme_Generator::import_website_artifact( $artifact, $args );
156172
}
157173

0 commit comments

Comments
 (0)