From b3fcdf3b5cf0d6b43109c4bcb3dfcbb6576abce5 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Fri, 8 May 2026 02:41:45 +0900 Subject: fix(browse): mirror Composer's HomeCommand semantics Replace the hand-rolled composer.json -> composer.lock -> Packagist fallback with a BrowseRepos composite that dispatches via a uniform find_packages(name) over the root package, the local installed repository, and the Packagist remote -- matching HomeCommand's initializeRepos() + findPackages() loop. - Extend InstalledPackageEntry with homepage/support so the local repo carries the same fields HomeCommand reads off CompletePackageInterface; propagate them through locked_to_installed_entry. - Collapse three extract_url_from_* helpers into a single handle_package mirror. - Relax is_valid_url to a filter_var(FILTER_VALIDATE_URL) analog (drop the http/https scheme allowlist). - Route warnings and "No package specified" notices to stderr; match HomeCommand's exact wording. - Merge the macOS/Linux open_browser branches; add the literal "web" window-title argument on Windows. --- crates/mozart-registry/src/installed.rs | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'crates/mozart-registry/src/installed.rs') diff --git a/crates/mozart-registry/src/installed.rs b/crates/mozart-registry/src/installed.rs index 6e8e0ac..da02c6a 100644 --- a/crates/mozart-registry/src/installed.rs +++ b/crates/mozart-registry/src/installed.rs @@ -48,6 +48,12 @@ pub struct InstalledPackageEntry { #[serde(default, skip_serializing_if = "Vec::is_empty")] pub aliases: Vec, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub homepage: Option, + + #[serde(default, skip_serializing_if = "Option::is_none")] + pub support: Option, + #[serde(flatten)] pub extra_fields: BTreeMap, } @@ -188,6 +194,8 @@ mod tests { install_path: None, autoload: None, aliases: vec![], + homepage: None, + support: None, extra_fields: BTreeMap::new(), } } @@ -329,4 +337,28 @@ mod tests { assert_eq!(loaded.packages[0].name, "monolog/monolog"); assert_eq!(loaded.packages[0].version, "3.8.0"); } + + #[test] + fn test_homepage_and_support_roundtrip() { + let json = r#"{ + "packages": [ + { + "name": "vendor/pkg", + "version": "1.0.0", + "homepage": "https://vendor.example.com", + "support": {"source": "https://github.com/vendor/pkg"} + } + ] + }"#; + let installed = InstalledPackages::from_json_str(json).unwrap(); + let pkg = &installed.packages[0]; + assert_eq!(pkg.homepage.as_deref(), Some("https://vendor.example.com")); + assert_eq!( + pkg.support + .as_ref() + .and_then(|s| s.get("source")) + .and_then(|s| s.as_str()), + Some("https://github.com/vendor/pkg") + ); + } } -- cgit v1.3.1