Skip to content

Commit d389ab9

Browse files
committed
fix ci
1 parent 42bff2d commit d389ab9

4 files changed

Lines changed: 148 additions & 18 deletions

File tree

crates/vite_global_cli/src/commands/release/mod.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -550,7 +550,11 @@ fn resolved_publish_tag<'a>(
550550
plan: &'a PackageReleasePlan,
551551
options: &'a ReleaseOptions,
552552
) -> Option<&'a str> {
553-
options.preid.as_deref().or(plan.publish_tag.as_deref())
553+
options
554+
.preid
555+
.as_deref()
556+
.or_else(|| prerelease_channel(&plan.next_version))
557+
.or(plan.publish_tag.as_deref())
554558
}
555559

556560
/// Resolves the effective provenance preference for a package release.

crates/vite_global_cli/src/commands/release/planning.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -610,10 +610,11 @@ fn prerelease_with_number(prerelease_tag: &PrereleaseTag, number: u64) -> Result
610610

611611
fn parse_repository_release_version(tag_name: &str) -> Option<Version> {
612612
let version = Version::parse(tag_name.strip_prefix(REPOSITORY_RELEASE_TAG_PREFIX)?).ok()?;
613-
match prerelease_channel(&version) {
614-
None | Some("alpha" | "beta" | "rc") => Some(version),
615-
Some(_) => None,
613+
if version.has_prerelease() && prerelease_number(&version).is_none() {
614+
return None;
616615
}
616+
617+
Some(version)
617618
}
618619

619620
fn release_queue_entry(package: &WorkspacePackage) -> ReleaseQueueEntry {

crates/vite_global_cli/src/commands/release/storage.rs

Lines changed: 38 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -250,8 +250,6 @@ pub(super) async fn run_release_checks(
250250
output::raw("");
251251
output::info("Running release checks:");
252252

253-
let workspace_script_names: HashSet<&str> =
254-
readiness_report.workspace_scripts.iter().map(String::as_str).collect();
255253
for script in &readiness_report.workspace_scripts {
256254
raw_progress_line!("workspace script `", script, '`');
257255
let status = package_manager
@@ -278,11 +276,7 @@ pub(super) async fn run_release_checks(
278276
continue;
279277
};
280278

281-
for script in readiness
282-
.scripts
283-
.iter()
284-
.filter(|script| !workspace_script_names.contains(script.as_str()))
285-
{
279+
for script in &readiness.scripts {
286280
raw_progress_line!(&plan.name, " script `", script, '`');
287281
let status = package_manager
288282
.run_script_command(
@@ -569,20 +563,33 @@ async fn publish_packages_inner(
569563
Ok((published_count, ExitStatus::default()))
570564
}
571565

572-
fn apply_manifest_edits(
566+
pub(super) fn apply_manifest_edits(
573567
manifest_edits: &[ManifestEdit],
574568
restore_original: bool,
575569
) -> Result<(), Error> {
570+
let mut applied_edits = 0usize;
576571
for edit in manifest_edits {
577572
let contents =
578573
if restore_original { &edit.original_contents } else { &edit.updated_contents };
579-
fs::write(&edit.path, contents).map_err(|error| {
574+
if let Err(error) = fs::write(&edit.path, contents) {
575+
let rollback_result =
576+
rollback_manifest_edits(&manifest_edits[..applied_edits], !restore_original);
580577
let mut message = String::from("write release manifest for ");
581578
message.push_str(&edit.package);
582579
message.push_str(": ");
583580
push_display(&mut message, error);
584-
Error::UserMessage(message.into())
585-
})?;
581+
match rollback_result {
582+
Ok(()) => {
583+
message.push_str(". Previously written release manifests were rolled back.");
584+
}
585+
Err(rollback_error) => {
586+
message.push_str(" | rollback error: ");
587+
push_display(&mut message, rollback_error);
588+
}
589+
}
590+
return Err(Error::UserMessage(message.into()));
591+
}
592+
applied_edits += 1;
586593
}
587594

588595
Ok(())
@@ -598,6 +605,25 @@ fn write_release_artifact_edit(edit: &ReleaseArtifactEdit) -> Result<(), Error>
598605
})
599606
}
600607

608+
fn rollback_manifest_edits(
609+
manifest_edits: &[ManifestEdit],
610+
restore_original: bool,
611+
) -> Result<(), Error> {
612+
for edit in manifest_edits.iter().rev() {
613+
let contents =
614+
if restore_original { &edit.original_contents } else { &edit.updated_contents };
615+
fs::write(&edit.path, contents).map_err(|error| {
616+
let mut message = String::from("restore release manifest for ");
617+
message.push_str(&edit.package);
618+
message.push_str(": ");
619+
push_display(&mut message, error);
620+
Error::UserMessage(message.into())
621+
})?;
622+
}
623+
624+
Ok(())
625+
}
626+
601627
fn rollback_applied_release_artifact_edits(edits: &[ReleaseArtifactEdit]) -> Result<(), Error> {
602628
for edit in edits.iter().rev() {
603629
restore_release_artifact_edit(edit)?;
@@ -653,12 +679,11 @@ fn build_updated_manifest_contents(
653679
plan: &PackageReleasePlan,
654680
release_versions: &HashMap<&str, &Version>,
655681
) -> Result<String, Error> {
656-
let current_version = plan.current_version.to_string();
657682
let next_version = plan.next_version.to_string();
658683
let mut updated = replace_top_level_string_property(
659684
&plan.manifest_contents,
660685
"version",
661-
&current_version,
686+
&plan.manifest.version,
662687
&next_version,
663688
)?;
664689

crates/vite_global_cli/src/commands/release/tests.rs

Lines changed: 101 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,23 @@ fn resolved_publish_tag_falls_back_to_manifest_tag() {
394394
assert_eq!(resolved_publish_tag(&plan, &make_release_options()), Some("next"));
395395
}
396396

397+
#[test]
398+
fn resolved_publish_tag_uses_prerelease_channel_from_target_version() {
399+
let mut plan = make_release_plan("pkg-a", &[], &[]);
400+
plan.next_version = Version::parse("1.0.1-beta.2").unwrap();
401+
plan.publish_tag = Some("next".into());
402+
403+
assert_eq!(resolved_publish_tag(&plan, &make_release_options()), Some("beta"));
404+
}
405+
406+
#[test]
407+
fn resolved_publish_tag_supports_custom_prerelease_channels() {
408+
let mut plan = make_release_plan("pkg-a", &[], &[]);
409+
plan.next_version = Version::parse("1.0.1-canary.0").unwrap();
410+
411+
assert_eq!(resolved_publish_tag(&plan, &make_release_options()), Some("canary"));
412+
}
413+
397414
#[test]
398415
fn build_manifest_edits_updates_simple_internal_dependency_ranges() {
399416
let mut pkg_a = make_release_plan("pkg-a", &[], &[]);
@@ -445,6 +462,24 @@ fn build_manifest_edits_rejects_complex_internal_dependency_ranges() {
445462
assert!(error.to_string().contains("Use `workspace:` or a simple exact/^/~ version"));
446463
}
447464

465+
#[test]
466+
fn build_manifest_edits_supports_tag_sourced_zero_versions() {
467+
let mut plan = make_release_plan("pkg-a", &[], &[]);
468+
plan.current_version = Version::parse("0.0.0-16aec32").unwrap();
469+
plan.next_version = Version::parse("1.2.3").unwrap();
470+
plan.manifest.version = "0.0.0".into();
471+
plan.manifest_contents = r#"{
472+
"name": "pkg-a",
473+
"version": "0.0.0"
474+
}
475+
"#
476+
.into();
477+
478+
let edits = build_manifest_edits(&[plan]).unwrap();
479+
assert_eq!(edits.len(), 1);
480+
assert!(edits[0].updated_contents.contains(r#""version": "1.2.3""#));
481+
}
482+
448483
#[test]
449484
fn readiness_report_collects_workspace_and_package_scripts() {
450485
let workspace_manifest: PackageManifest = serde_json::from_str(
@@ -705,6 +740,64 @@ fn summarize_release_artifacts_counts_manifests_and_changelogs() {
705740
assert_eq!(summary.total_file_count(), 5);
706741
}
707742

743+
#[test]
744+
fn apply_manifest_edits_rolls_back_partial_updates() {
745+
let temp_dir = tempfile::tempdir().unwrap();
746+
let workspace_root = AbsolutePathBuf::new(temp_dir.path().to_path_buf()).unwrap();
747+
let good_path = workspace_root.join("packages/pkg-a/package.json");
748+
std::fs::create_dir_all(good_path.as_path().parent().unwrap()).unwrap();
749+
std::fs::write(&good_path, "{\"version\":\"1.0.0\"}").unwrap();
750+
751+
let bad_path = workspace_root.join("missing/pkg-b/package.json");
752+
let edits = vec![
753+
ManifestEdit {
754+
package: "pkg-a".into(),
755+
path: good_path.clone(),
756+
original_contents: "{\"version\":\"1.0.0\"}".into(),
757+
updated_contents: "{\"version\":\"1.0.1\"}".into(),
758+
},
759+
ManifestEdit {
760+
package: "pkg-b".into(),
761+
path: bad_path,
762+
original_contents: "{\"version\":\"1.0.0\"}".into(),
763+
updated_contents: "{\"version\":\"1.0.1\"}".into(),
764+
},
765+
];
766+
767+
let error = apply_manifest_edits(&edits, false).unwrap_err();
768+
assert!(error.to_string().contains("rolled back"));
769+
assert_eq!(std::fs::read_to_string(&good_path).unwrap(), "{\"version\":\"1.0.0\"}");
770+
}
771+
772+
#[test]
773+
fn apply_manifest_edits_rolls_back_partial_restore_to_updated_state() {
774+
let temp_dir = tempfile::tempdir().unwrap();
775+
let workspace_root = AbsolutePathBuf::new(temp_dir.path().to_path_buf()).unwrap();
776+
let good_path = workspace_root.join("packages/pkg-a/package.json");
777+
std::fs::create_dir_all(good_path.as_path().parent().unwrap()).unwrap();
778+
std::fs::write(&good_path, "{\"version\":\"1.0.1\"}").unwrap();
779+
780+
let bad_path = workspace_root.join("missing/pkg-b/package.json");
781+
let edits = vec![
782+
ManifestEdit {
783+
package: "pkg-a".into(),
784+
path: good_path.clone(),
785+
original_contents: "{\"version\":\"1.0.0\"}".into(),
786+
updated_contents: "{\"version\":\"1.0.1\"}".into(),
787+
},
788+
ManifestEdit {
789+
package: "pkg-b".into(),
790+
path: bad_path,
791+
original_contents: "{\"version\":\"1.0.0\"}".into(),
792+
updated_contents: "{\"version\":\"1.0.1\"}".into(),
793+
},
794+
];
795+
796+
let error = apply_manifest_edits(&edits, true).unwrap_err();
797+
assert!(error.to_string().contains("rolled back"));
798+
assert_eq!(std::fs::read_to_string(&good_path).unwrap(), "{\"version\":\"1.0.1\"}");
799+
}
800+
708801
#[test]
709802
fn rollback_release_artifact_edits_restores_and_removes_files() {
710803
let temp_dir = tempfile::tempdir().unwrap();
@@ -923,7 +1016,7 @@ fn invalid_release_tags_are_ignored() {
9231016
}
9241017

9251018
#[test]
926-
fn repository_release_tags_accept_stable_and_standard_prereleases_only() {
1019+
fn repository_release_tags_accept_stable_and_numbered_prereleases() {
9271020
assert_eq!(
9281021
parse_repository_release_tag_version_for_tests("v1.2.3").unwrap().to_string(),
9291022
"1.2.3"
@@ -932,7 +1025,14 @@ fn repository_release_tags_accept_stable_and_standard_prereleases_only() {
9321025
parse_repository_release_tag_version_for_tests("v1.2.4-alpha.1").unwrap().to_string(),
9331026
"1.2.4-alpha.1"
9341027
);
1028+
assert_eq!(
1029+
parse_repository_release_tag_version_for_tests("v1.2.5-canary.0").unwrap().to_string(),
1030+
"1.2.5-canary.0"
1031+
);
9351032
assert!(parse_repository_release_tag_version_for_tests("v0.0.0-16aec32").is_none());
1033+
assert!(
1034+
parse_repository_release_tag_version_for_tests("v0.0.0-0bfcc90f.20260209-0731").is_none()
1035+
);
9361036
assert!(parse_repository_release_tag_version_for_tests("release/pkg-a/v1.0.0").is_none());
9371037
}
9381038

0 commit comments

Comments
 (0)