fix ext bug

This commit is contained in:
Julian Freeman
2026-04-16 20:56:19 -04:00
parent 40a49da672
commit d2ffdf2954

View File

@@ -205,14 +205,23 @@ fn scan_extensions_for_profile(
}; };
for (extension_id, extension_value) in extension_settings { for (extension_id, extension_value) in extension_settings {
let Some(install_dir) = let Some((install_dir, install_source)) =
resolve_extension_install_dir(profile_path, extension_id, extension_value) resolve_extension_install_dir(profile_path, extension_id, extension_value)
else { else {
continue; continue;
}; };
let manifest = load_extension_manifest(&install_dir, extension_value); let external_manifest = match install_source {
let Some(manifest) = manifest.as_ref() else { ExtensionInstallSource::ExternalAbsolute => {
read_json_file(&install_dir.join("manifest.json"))
}
ExtensionInstallSource::StoreRelative => None,
};
let manifest = match install_source {
ExtensionInstallSource::StoreRelative => extension_value.get("manifest"),
ExtensionInstallSource::ExternalAbsolute => external_manifest.as_ref(),
};
let Some(manifest) = manifest else {
continue; continue;
}; };
@@ -261,16 +270,11 @@ fn scan_extensions_for_profile(
} }
} }
fn load_extension_manifest(install_dir: &Path, extension_value: &Value) -> Option<Value> {
read_json_file(&install_dir.join("manifest.json"))
.or_else(|| extension_value.get("manifest").cloned())
}
fn resolve_extension_install_dir( fn resolve_extension_install_dir(
profile_path: &Path, profile_path: &Path,
extension_id: &str, extension_id: &str,
extension_value: &Value, extension_value: &Value,
) -> Option<PathBuf> { ) -> Option<(PathBuf, ExtensionInstallSource)> {
let raw_path = extension_value let raw_path = extension_value
.get("path") .get("path")
.and_then(Value::as_str) .and_then(Value::as_str)
@@ -279,15 +283,23 @@ fn resolve_extension_install_dir(
let normalized_path = raw_path.trim_start_matches('/'); let normalized_path = raw_path.trim_start_matches('/');
let candidate = PathBuf::from(normalized_path); let candidate = PathBuf::from(normalized_path);
let resolved = if normalized_path.starts_with(extension_id) { let (resolved, source) = if normalized_path.starts_with(extension_id) {
profile_path.join("Extensions").join(candidate) (
profile_path.join("Extensions").join(candidate),
ExtensionInstallSource::StoreRelative,
)
} else if candidate.is_absolute() { } else if candidate.is_absolute() {
candidate (candidate, ExtensionInstallSource::ExternalAbsolute)
} else { } else {
PathBuf::from(raw_path) (PathBuf::from(raw_path), ExtensionInstallSource::ExternalAbsolute)
}; };
resolved.is_dir().then_some(resolved) resolved.is_dir().then_some((resolved, source))
}
enum ExtensionInstallSource {
StoreRelative,
ExternalAbsolute,
} }
fn resolve_extension_name(manifest: &Value, version_path: &Path) -> Option<String> { fn resolve_extension_name(manifest: &Value, version_path: &Path) -> Option<String> {