Skip to content

Commit 146aa5f

Browse files
authored
[package] Use topological sorting from omicron-zone-package (#4816)
This functionality is now provided in `omicron-zone-package`, as of oxidecomputer/omicron-package#57
1 parent df67a57 commit 146aa5f

File tree

4 files changed

+13
-56
lines changed

4 files changed

+13
-56
lines changed

Cargo.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ omicron-package = { path = "package" }
261261
omicron-rpaths = { path = "rpaths" }
262262
omicron-sled-agent = { path = "sled-agent" }
263263
omicron-test-utils = { path = "test-utils" }
264-
omicron-zone-package = "0.9.1"
264+
omicron-zone-package = "0.10.1"
265265
oxide-client = { path = "clients/oxide-client" }
266266
oxide-vpc = { git = "https://github.com/oxidecomputer/opte", rev = "4e6e6ab6379fa4bc40f5d0c7340b9f35c45ad6e4", features = [ "api", "std" ] }
267267
once_cell = "1.19.0"
@@ -380,7 +380,6 @@ tokio-tungstenite = "0.20"
380380
tokio-util = { version = "0.7.10", features = ["io", "io-util"] }
381381
toml = "0.8.8"
382382
toml_edit = "0.21.0"
383-
topological-sort = "0.2.2"
384383
tough = { version = "0.16.0", features = [ "http" ] }
385384
trust-dns-client = "0.22"
386385
trust-dns-proto = "0.22"

package/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ tar.workspace = true
3030
thiserror.workspace = true
3131
tokio = { workspace = true, features = [ "full" ] }
3232
toml.workspace = true
33-
topological-sort.workspace = true
3433
walkdir.workspace = true
3534
omicron-workspace-hack.workspace = true
3635

package/src/bin/omicron-package.rs

Lines changed: 9 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ async fn do_for_all_rust_packages(
145145
let (release_pkgs, debug_pkgs): (Vec<_>, _) = config
146146
.package_config
147147
.packages_to_build(&config.target)
148+
.0
148149
.into_iter()
149150
.filter_map(|(name, pkg)| match &pkg.source {
150151
PackageSource::Local { rust: Some(rust_pkg), .. } => {
@@ -463,63 +464,19 @@ async fn get_package(
463464
}
464465

465466
async fn do_package(config: &Config, output_directory: &Path) -> Result<()> {
466-
use topological_sort::TopologicalSort;
467-
468467
create_dir_all(&output_directory)
469468
.map_err(|err| anyhow!("Cannot create output directory: {}", err))?;
470469

471470
let ui = ProgressUI::new();
472471

473472
do_build(&config).await?;
474473

475-
let mut all_packages = config
476-
.package_config
477-
.packages_to_build(&config.target)
478-
.into_iter()
479-
.map(|(package_name, package)| {
480-
(package.get_output_file(package_name), (package_name, package))
481-
})
482-
.collect::<std::collections::BTreeMap<_, _>>();
483-
484-
let mut outputs = TopologicalSort::<String>::new();
485-
for (package_output, (_, package)) in &all_packages {
486-
match &package.source {
487-
PackageSource::Local { .. }
488-
| PackageSource::Prebuilt { .. }
489-
| PackageSource::Manual => {
490-
// Skip intermediate leaf packages; if necessary they'll be
491-
// added to the dependency graph by whatever composite package
492-
// actually depends on them.
493-
if !matches!(
494-
package.output,
495-
PackageOutput::Zone { intermediate_only: true }
496-
) {
497-
outputs.insert(package_output);
498-
}
499-
}
500-
PackageSource::Composite { packages: deps } => {
501-
for dep in deps {
502-
outputs.add_dependency(dep, package_output);
503-
}
504-
}
505-
}
506-
}
507-
508-
while !outputs.is_empty() {
509-
let batch = outputs.pop_all();
510-
assert!(
511-
!batch.is_empty() || outputs.is_empty(),
512-
"cyclic dependency in package manifest!"
513-
);
514-
515-
let packages = batch.into_iter().map(|output| {
516-
all_packages
517-
.remove(&output)
518-
.expect("package should've already been handled.")
519-
});
474+
let packages = config.package_config.packages_to_build(&config.target);
520475

521-
let ui_refs = vec![ui.clone(); packages.len()];
522-
let pkg_stream = stream::iter(packages)
476+
let package_iter = packages.build_order();
477+
for batch in package_iter {
478+
let ui_refs = vec![ui.clone(); batch.len()];
479+
let pkg_stream = stream::iter(batch)
523480
.zip(stream::iter(ui_refs))
524481
.map(Ok::<_, anyhow::Error>)
525482
.try_for_each_concurrent(
@@ -553,6 +510,7 @@ async fn do_stamp(
553510
let (_name, package) = config
554511
.package_config
555512
.packages_to_deploy(&config.target)
513+
.0
556514
.into_iter()
557515
.find(|(name, _pkg)| name.as_str() == package_name)
558516
.ok_or_else(|| anyhow!("Package {package_name} not found"))?;
@@ -574,7 +532,7 @@ async fn do_unpack(
574532
})?;
575533

576534
// Copy all packages to the install location in parallel.
577-
let packages = config.package_config.packages_to_deploy(&config.target);
535+
let packages = config.package_config.packages_to_deploy(&config.target).0;
578536

579537
packages.par_iter().try_for_each(
580538
|(package_name, package)| -> Result<()> {
@@ -704,6 +662,7 @@ fn uninstall_all_packages(config: &Config) {
704662
for (_, package) in config
705663
.package_config
706664
.packages_to_deploy(&config.target)
665+
.0
707666
.into_iter()
708667
.filter(|(_, package)| matches!(package.output, PackageOutput::Tarball))
709668
{

0 commit comments

Comments
 (0)