@@ -24,8 +24,9 @@ mod smoke_check;
2424
2525use modes:: { extension_skipped_results, run_check_mode, run_dry_run_mode} ;
2626use preflight:: {
27- check_uncommitted_changes, check_unreleased_commits, sync_components, verify_expected_version,
28- warn_non_default_branch,
27+ check_uncommitted_changes, check_unreleased_commits, guard_local_build_downgrades,
28+ guard_local_build_source_freshness, local_build_components, sync_components,
29+ verify_expected_version, warn_non_default_branch,
2930} ;
3031use smoke_check:: run_post_deploy_smoke;
3132
@@ -169,13 +170,18 @@ pub(super) fn deploy_components(
169170 . iter ( )
170171 . filter_map ( |c| version:: get_component_version ( c) . map ( |v| ( c. id . clone ( ) , v) ) )
171172 . collect ( ) ;
172- let remote_versions =
173- if config. outdated || config. behind_upstream || config. dry_run || config. check {
174- fetch_remote_versions_for_project ( & components, Some ( & project) , base_path, & ctx. client )
175- . versions
176- } else {
177- HashMap :: new ( )
178- } ;
173+ let local_build_components = local_build_components ( & components, config) ;
174+ let remote_versions = if config. outdated
175+ || config. behind_upstream
176+ || config. dry_run
177+ || config. check
178+ || !local_build_components. is_empty ( )
179+ {
180+ fetch_remote_versions_for_project ( & components, Some ( & project) , base_path, & ctx. client )
181+ . versions
182+ } else {
183+ HashMap :: new ( )
184+ } ;
179185
180186 // Check and dry-run modes return early without building or deploying
181187 if config. check {
@@ -213,6 +219,8 @@ pub(super) fn deploy_components(
213219 sync_components ( & local_build_components) ?;
214220 }
215221
222+ guard_local_build_source_freshness ( & local_build_components, config) ?;
223+
216224 // Warn when --head deploys from a non-default branch (safety guardrail)
217225 if config. head && !config. skip_build {
218226 warn_non_default_branch ( & local_build_components, config) ?;
@@ -249,6 +257,13 @@ pub(super) fn deploy_components(
249257 . filter_map ( |c| version:: get_component_version ( c) . map ( |v| ( c. id . clone ( ) , v) ) )
250258 . collect ( ) ;
251259
260+ guard_local_build_downgrades (
261+ & local_build_components,
262+ & local_versions,
263+ & remote_versions,
264+ config,
265+ ) ?;
266+
252267 // Build and validate every local artifact before the first remote write.
253268 let prepared_deployments = match prepare_component_deployments (
254269 & components,
@@ -509,6 +524,8 @@ mod tests {
509524 skip_deps_hydration : false ,
510525 expected_version : None ,
511526 no_pull : false ,
527+ allow_stale_source : false ,
528+ allow_downgrade : false ,
512529 head : false ,
513530 requested_ref : None ,
514531 tagged : false ,
0 commit comments