()
| 613 | } |
| 614 | |
| 615 | fn discover_catalog() -> Result<ExtensionCatalog> { |
| 616 | let repl = parse_repl_exports(Path::new(PGLITE_REPL_EXTENSIONS))?; |
| 617 | let docs = parse_docs_catalog(Path::new(PGLITE_DOCS_EXTENSIONS))?; |
| 618 | let package_exports = parse_package_exports(Path::new(PGLITE_PACKAGE_JSON))?; |
| 619 | let promotion_requests = parse_promotion_config(Path::new(PROMOTION_CONFIG_PATH))?; |
| 620 | let smoke_evidence = parse_smoke_config(Path::new(SMOKE_CONFIG_PATH))?; |
| 621 | let packaged = parse_packaged_manifest(Path::new(ASSET_MANIFEST))?; |
| 622 | let submodules = parse_other_extension_submodules(Path::new(POSTGRES_OTHER_EXTENSIONS))?; |
| 623 | |
| 624 | let mut ids = BTreeSet::new(); |
| 625 | ids.extend(repl.keys().cloned()); |
| 626 | ids.extend(docs.keys().filter(|id| id.as_str() != "live").cloned()); |
| 627 | |
| 628 | let mut entries = Vec::new(); |
| 629 | for id in ids { |
| 630 | let repl_export = repl.get(&id); |
| 631 | let docs_entry = docs.get(&id); |
| 632 | let sql_name = discover_sql_name(&id, repl_export, docs_entry)?; |
| 633 | let control_file = discover_control_file(&id, &sql_name, repl_export); |
| 634 | let control = control_file |
| 635 | .as_ref() |
| 636 | .filter(|path| path.is_file()) |
| 637 | .map(|path| parse_control_file(path)) |
| 638 | .transpose()?; |
| 639 | let tests = discover_test_paths(&id); |
| 640 | let lifecycle = classify_lifecycle(&id, control.as_ref()); |
| 641 | let dependencies = discover_dependencies(&id, control.as_ref()); |
| 642 | let source_kind = classify_source_kind(&id, repl_export, docs_entry); |
| 643 | let native_module_file = |
| 644 | discover_native_module_file(&id, &sql_name, source_kind, control.as_ref())?; |
| 645 | let request = promotion_requests |
| 646 | .get(id.as_str()) |
| 647 | .or_else(|| promotion_requests.get(sql_name.as_str())); |
| 648 | let asset = packaged.get(sql_name.as_str()); |
| 649 | let archive = asset |
| 650 | .and_then(|asset| asset.archive.clone()) |
| 651 | .or_else(|| request.and_then(|request| request.archive.clone())) |
| 652 | .or_else(|| request.map(|_| format!("extensions/{sql_name}.tar.zst"))); |
| 653 | let requested = request.map(|request| request.build).unwrap_or(false); |
| 654 | let stable = request.map(|request| request.stable).unwrap_or(false); |
| 655 | let blocker = request.and_then(|request| request.blocker.clone()); |
| 656 | let packaged = asset.is_some(); |
| 657 | let asset_stable = asset.map(|asset| asset.stable).unwrap_or(false); |
| 658 | let smoke = smoke_evidence |
| 659 | .get(id.as_str()) |
| 660 | .or_else(|| smoke_evidence.get(sql_name.as_str())) |
| 661 | .cloned() |
| 662 | .unwrap_or_default(); |
| 663 | let promotion = PromotionStatus { |
| 664 | configured: request.is_some(), |
| 665 | requested, |
| 666 | packaged, |
| 667 | promoted: requested |
| 668 | && stable |
| 669 | && packaged |
| 670 | && asset_stable |
| 671 | && smoke.direct == "passed" |
| 672 | && smoke.server == "passed" |
no test coverage detected