From 204b40bb9f53fd654969a26bb83813556844cc42 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Sat, 31 Aug 2024 12:28:58 +0200 Subject: [PATCH 001/132] initialize menuinst crate --- crates/rattler_menuinst/Cargo.toml | 23 + crates/rattler_menuinst/src/lib.rs | 5 + crates/rattler_menuinst/src/linux.rs | 204 ++++++ crates/rattler_menuinst/src/macos.rs | 393 +++++++++++ crates/rattler_menuinst/src/schema.rs | 230 ++++++ ...t__schema__test__deserialize_gnuradio.snap | 55 ++ ...nuinst__schema__test__deserialize_grx.snap | 102 +++ ...nuinst__schema__test__deserialize_mne.snap | 663 ++++++++++++++++++ crates/rattler_menuinst/src/utils/mod.rs | 1 + crates/rattler_menuinst/src/utils/unix_lex.rs | 13 + crates/rattler_menuinst/src/win.rs | 336 +++++++++ test-data/menuinst/gnuradio/gnuradio-grc.json | 21 + test-data/menuinst/gnuradio/grc.ico | Bin 0 -> 111805 bytes test-data/menuinst/gqrx/gqrx-menu.json | 38 + test-data/menuinst/mne/menu.json | 168 +++++ 15 files changed, 2252 insertions(+) create mode 100644 crates/rattler_menuinst/Cargo.toml create mode 100644 crates/rattler_menuinst/src/lib.rs create mode 100644 crates/rattler_menuinst/src/linux.rs create mode 100644 crates/rattler_menuinst/src/macos.rs create mode 100644 crates/rattler_menuinst/src/schema.rs create mode 100644 crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_gnuradio.snap create mode 100644 crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_grx.snap create mode 100644 crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_mne.snap create mode 100644 crates/rattler_menuinst/src/utils/mod.rs create mode 100644 crates/rattler_menuinst/src/utils/unix_lex.rs create mode 100644 crates/rattler_menuinst/src/win.rs create mode 100644 test-data/menuinst/gnuradio/gnuradio-grc.json create mode 100644 test-data/menuinst/gnuradio/grc.ico create mode 100644 test-data/menuinst/gqrx/gqrx-menu.json create mode 100644 test-data/menuinst/mne/menu.json diff --git a/crates/rattler_menuinst/Cargo.toml b/crates/rattler_menuinst/Cargo.toml new file mode 100644 index 000000000..b94ef1081 --- /dev/null +++ b/crates/rattler_menuinst/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "rattler_menuinst" +version = "0.1.0" +edition.workspace = true +authors = ["Wolf Vollprecht "] +description = "Install menu entries for a Conda package" +categories.workspace = true +homepage.workspace = true +repository.workspace = true +license.workspace = true +readme.workspace = true + +[dependencies] +plist = { workspace = true } +dirs = { workspace = true } +serde = { workspace = true, features = ["derive"] } +shlex = { workspace = true } +serde_json = { workspace = true } +sha1 = "0.10.6" +tracing = { workspace = true } + +[dev-dependencies] +insta = { workspace = true } \ No newline at end of file diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs new file mode 100644 index 000000000..07559a463 --- /dev/null +++ b/crates/rattler_menuinst/src/lib.rs @@ -0,0 +1,5 @@ +mod macos; +mod schema; +mod linux; + +pub mod utils; diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs new file mode 100644 index 000000000..c16d8d40c --- /dev/null +++ b/crates/rattler_menuinst/src/linux.rs @@ -0,0 +1,204 @@ +use std::collections::HashMap; +use std::env; +use std::fs::{self, File}; +use std::io::Write; +use std::path::{Path, PathBuf}; +use std::process::Command; + +use chrono::Local; +use log::{debug, warn}; +use regex::Regex; +use serde::{Deserialize, Serialize}; +use tempfile::TempDir; +use xmltree::{Element, XMLNode}; + +// Assuming these are defined elsewhere +use crate::utils::{UnixLex, add_xml_child, indent_xml_tree, logged_run, unlink}; +use crate::base::{Menu, MenuItem, menuitem_defaults}; + +#[derive(Debug)] +pub struct LinuxMenu { + name: String, + mode: String, + config_directory: PathBuf, + data_directory: PathBuf, + system_menu_config_location: PathBuf, + menu_config_location: PathBuf, + directory_entry_location: PathBuf, + desktop_entries_location: PathBuf, +} + +impl LinuxMenu { + pub fn new(name: String, mode: String) -> Self { + let system_config_directory = PathBuf::from("/etc/xdg/"); + let system_data_directory = PathBuf::from("/usr/share"); + + let (config_directory, data_directory) = if mode == "system" { + (system_config_directory.clone(), system_data_directory.clone()) + } else { + ( + PathBuf::from(env::var("XDG_CONFIG_HOME").unwrap_or_else(|_| "~/.config".to_string())), + PathBuf::from(env::var("XDG_DATA_HOME").unwrap_or_else(|_| "~/.local/share".to_string())), + ) + }; + + LinuxMenu { + name, + mode, + config_directory: config_directory.clone(), + data_directory: data_directory.clone(), + system_menu_config_location: system_config_directory.join("menus").join("applications.menu"), + menu_config_location: config_directory.join("menus").join("applications.menu"), + directory_entry_location: data_directory.join("desktop-directories").join(format!("{}.directory", Self::render(&name, true))), + desktop_entries_location: data_directory.join("applications"), + } + } + + pub fn create(&self) -> Vec { + self.ensure_directories_exist(); + let path = self.write_directory_entry(); + if self.is_valid_menu_file() && self.has_this_menu() { + return vec![path]; + } + self.ensure_menu_file(); + self.add_this_menu(); + vec![path] + } + + pub fn remove(&self) -> Vec { + for entry in fs::read_dir(&self.desktop_entries_location).unwrap() { + let entry = entry.unwrap(); + let file_name = entry.file_name(); + if file_name.to_str().unwrap().starts_with(&format!("{}_", Self::render(&self.name, true))) { + // found one shortcut, so don't remove the name from menu + return vec![self.directory_entry_location.clone()]; + } + } + unlink(&self.directory_entry_location, true); + self.remove_this_menu(); + vec![self.directory_entry_location.clone()] + } + + fn ensure_directories_exist(&self) { + let paths = vec![ + self.config_directory.join("menus"), + self.data_directory.join("desktop-directories"), + self.data_directory.join("applications"), + ]; + for path in paths { + debug!("Ensuring path {:?} exists", path); + fs::create_dir_all(path).unwrap(); + } + } + + fn write_directory_entry(&self) -> PathBuf { + let content = format!( + "[Desktop Entry]\nType=Directory\nEncoding=UTF-8\nName={}", + Self::render(&self.name, false) + ); + debug!("Writing directory entry at {:?}", self.directory_entry_location); + fs::write(&self.directory_entry_location, content).unwrap(); + self.directory_entry_location.clone() + } + + fn remove_this_menu(&self) { + debug!("Editing {:?} to remove {} config", self.menu_config_location, Self::render(&self.name, false)); + let mut doc = Element::parse(fs::read_to_string(&self.menu_config_location).unwrap().as_bytes()).unwrap(); + doc.children.retain(|child| { + if let XMLNode::Element(element) = child { + if element.name == "Menu" { + if let Some(name_element) = element.get_child("Name") { + return name_element.get_text() != Some(Self::render(&self.name, false)); + } + } + } + true + }); + self.write_menu_file(&doc); + } + + fn has_this_menu(&self) -> bool { + let doc = Element::parse(fs::read_to_string(&self.menu_config_location).unwrap().as_bytes()).unwrap(); + doc.children.iter().any(|child| { + if let XMLNode::Element(element) = child { + if element.name == "Menu" { + if let Some(name_element) = element.get_child("Name") { + return name_element.get_text() == Some(Self::render(&self.name, false)); + } + } + } + false + }) + } + + fn add_this_menu(&self) { + debug!("Editing {:?} to add {} config", self.menu_config_location, Self::render(&self.name, false)); + let mut doc = Element::parse(fs::read_to_string(&self.menu_config_location).unwrap().as_bytes()).unwrap(); + let mut menu_element = Element::new("Menu"); + add_xml_child(&mut menu_element, "Name", Self::render(&self.name, false)); + add_xml_child(&mut menu_element, "Directory", format!("{}.directory", Self::render(&self.name, true))); + let mut inc_element = Element::new("Include"); + add_xml_child(&mut inc_element, "Category", Self::render(&self.name, false)); + menu_element.children.push(XMLNode::Element(inc_element)); + doc.children.push(XMLNode::Element(menu_element)); + self.write_menu_file(&doc); + } + + fn is_valid_menu_file(&self) -> bool { + if let Ok(content) = fs::read_to_string(&self.menu_config_location) { + if let Ok(doc) = Element::parse(content.as_bytes()) { + return doc.name == "Menu"; + } + } + false + } + + fn write_menu_file(&self, doc: &Element) { + debug!("Writing {:?}", self.menu_config_location); + indent_xml_tree(doc); + let mut file = File::create(&self.menu_config_location).unwrap(); + writeln!(file, r#""#).unwrap(); + doc.write(&mut file).unwrap(); + writeln!(file).unwrap(); + } + + fn ensure_menu_file(&self) { + if self.menu_config_location.exists() && !self.menu_config_location.is_file() { + panic!("Menu config location {:?} is not a file!", self.menu_config_location); + } + + if self.menu_config_location.is_file() { + let cur_time = Local::now().format("%Y-%m-%d_%Hh%Mm%S").to_string(); + let backup_menu_file = format!("{}.{}", self.menu_config_location.display(), cur_time); + fs::copy(&self.menu_config_location, backup_menu_file).unwrap(); + + if !self.is_valid_menu_file() { + fs::remove_file(&self.menu_config_location).unwrap(); + } + } else { + self.new_menu_file(); + } + } + + fn new_menu_file(&self) { + debug!("Creating {:?}", self.menu_config_location); + let mut content = String::from("Applications"); + if self.mode == "user" { + content.push_str(&format!(r#"{}"#, self.system_menu_config_location.display())); + } + content.push_str("\n"); + fs::write(&self.menu_config_location, content).unwrap(); + } + + fn render(name: &str, slug: bool) -> String { + // Implement rendering logic here + if slug { + name.to_lowercase().replace(" ", "-") + } else { + name.to_string() + } + } +} + +// Implement LinuxMenuItem struct and its methods similarly... diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs new file mode 100644 index 000000000..39e94a38f --- /dev/null +++ b/crates/rattler_menuinst/src/macos.rs @@ -0,0 +1,393 @@ +use std::collections::HashMap; +use std::fs::{self, File}; +use std::io::Write; +use std::os::unix::fs::PermissionsExt; +use std::path::{Path, PathBuf}; +use std::process::Command; + +use plist::Value; +use sha1::{Digest, Sha1}; +use tracing; + +use crate::utils::unix_lex::UnixLex; + +// use crate::utils::{UnixLex, logged_run}; +// use crate::base::{Menu, MenuItem, menuitem_defaults}; + +pub struct MacOSMenu { + name: String, + mode: String, + prefix: PathBuf, +} + +impl MacOSMenu { + pub fn new(name: String, mode: String, prefix: PathBuf) -> Self { + MacOSMenu { name, mode, prefix } + } + + pub fn create(&self) -> Vec { + self.paths() + } + + pub fn remove(&self) -> Vec { + self.paths() + } + + pub fn placeholders(&self) -> HashMap { + let mut placeholders = HashMap::new(); + placeholders.insert( + "SP_DIR".to_string(), + self.site_packages().to_str().unwrap().to_string(), + ); + placeholders.insert("ICON_EXT".to_string(), "icns".to_string()); + placeholders.insert( + "PYTHONAPP".to_string(), + self.prefix + .join("python.app/Contents/MacOS/python") + .to_str() + .unwrap() + .to_string(), + ); + placeholders + } + + fn paths(&self) -> Vec { + vec![] + } + + fn site_packages(&self) -> PathBuf { + // Implement site-packages directory detection logic here + self.prefix.join("lib/python3.x/site-packages") + } +} + +pub struct MacOSMenuItem { + menu: MacOSMenu, + metadata: HashMap, +} + +impl MacOSMenuItem { + pub fn new(menu: MacOSMenu, metadata: HashMap) -> Self { + MacOSMenuItem { menu, metadata } + } + + pub fn location(&self) -> PathBuf { + self.base_location() + .join("Applications") + .join(self.bundle_name()) + } + + fn bundle_name(&self) -> String { + return "foo.app".to_string(); + // format!("{}.app", self.render_key("name", &HashMap::new())) + } + + fn nested_location(&self) -> PathBuf { + self.location() + .join("Contents/Resources") + .join(self.bundle_name()) + } + + fn base_location(&self) -> PathBuf { + // if self.menu.mode == "user" { + // // PathBuf::from(shellexpand::tilde("~").to_string()) + // } else { + // PathBuf::from("/") + // } + PathBuf::from("/FOO") + } + + pub fn create(&self) -> Vec { + if self.location().exists() { + panic!("App already exists at {:?}. Please remove the existing shortcut before installing.", self.location()); + } + tracing::debug!("Creating {:?}", self.location()); + self.create_application_tree(); + // self.precreate(); + // self.copy_icon(); + // self.write_pkginfo(); + // self.write_plistinfo(); + // self.write_appkit_launcher(); + // self.write_launcher(); + // self.write_script(); + // self.write_event_handler(); + // self.maybe_register_with_launchservices(); + self.sign_with_entitlements(); + vec![self.location()] + } + + pub fn remove(&self) -> Vec { + tracing::debug!("Removing {:?}", self.location()); + self.maybe_register_with_launchservices(false); + fs::remove_dir_all(&self.location()).unwrap(); + vec![self.location()] + } + + fn create_application_tree(&self) -> Vec { + let mut paths = vec![ + self.location().join("Contents/Resources"), + self.location().join("Contents/MacOS"), + ]; + if self.needs_appkit_launcher() { + paths.push(self.nested_location().join("Contents/Resources")); + paths.push(self.nested_location().join("Contents/MacOS")); + } + for path in &paths { + fs::create_dir_all(path).unwrap(); + } + paths + } + + fn copy_icon(&self) { + if let Some(icon) = self.render_key("icon", &HashMap::new()) { + fs::copy( + &icon, + self.location() + .join("Contents/Resources") + .join(Path::new(&icon).file_name().unwrap()), + ) + .unwrap(); + if self.needs_appkit_launcher() { + fs::copy( + &icon, + self.nested_location() + .join("Contents/Resources") + .join(Path::new(&icon).file_name().unwrap()), + ) + .unwrap(); + } + } + } + + fn write_pkginfo(&self) { + let app_bundles = if self.needs_appkit_launcher() { + vec![self.location(), self.nested_location()] + } else { + vec![self.location()] + }; + for app in app_bundles { + let mut file = File::create(app.join("Contents/PkgInfo")).unwrap(); + write!(file, "APPL{}", &self.menu.name.to_lowercase()[..8]).unwrap(); + } + } + + fn render(self, value: &str) -> String { + // Implement rendering logic here + value.to_string() + + } + + fn write_plistinfo(&self) { + let name = self.menu.name.clone(); + // let slugname = self.render_key("name", &[("slug", &true.into())].iter().cloned().collect()); + let name = "foo".to_string(); + let slugname = "foo".to_string(); + let shortname = if slugname.len() > 16 { + let hashed = format!("{:x}", Sha1::digest(slugname.as_bytes())); + format!("{}{}", &slugname[..10], &hashed[..6]) + } else { + slugname.clone() + }; + + let mut pl = plist::Dictionary::new(); + pl.insert("CFBundleName".into(), Value::String(shortname)); + pl.insert("CFBundleDisplayName".into(), Value::String(name)); + pl.insert("CFBundleExecutable".into(), Value::String(slugname.clone())); + pl.insert("CFBundleGetInfoString".into(), Value::String(format!("{}-1.0.0", slugname))); + pl.insert("CFBundleIdentifier".into(), Value::String(format!("com.{}", slugname))); + pl.insert("CFBundlePackageType".into(), Value::String("APPL".into())); + pl.insert("CFBundleVersion".into(), Value::String("1.0.0".into())); + pl.insert("CFBundleShortVersionString".into(), Value::String("1.0.0".into())); + + let icon = self.render_key("icon", &HashMap::new()); + + // if let Some(icon) = self.render_key("icon", &HashMap::new()) { + // pl.insert("CFBundleIconFile".into(), Value::String(Path::new(&icon).file_name().unwrap().to_str().unwrap().into())); + // } + + if self.needs_appkit_launcher() { + plist::to_file_xml(self.nested_location().join("Contents/Info.plist"), &pl).unwrap(); + pl.insert("LSBackgroundOnly".into(), Value::Boolean(true)); + pl.insert("CFBundleIdentifier".into(), Value::String(format!("com.{}-appkit-launcher", slugname))); + } + + // Override defaults with user provided values + // for key in menuitem_defaults["platforms"]["osx"].keys() { + // if menuitem_defaults.contains_key(key) || key == "entitlements" || key == "link_in_bundle" { + // continue; + // } + // if let Some(value) = self.render_key(key, &HashMap::new()) { + // if key == "CFBundleVersion" { + // pl.insert("CFBundleShortVersionString".into(), Value::String(value.clone())); + // pl.insert("CFBundleGetInfoString".into(), Value::String(format!("{}-{}", slugname, value))); + // } + // pl.insert(key.into(), Value::String(value)); + // } + // } + + plist::to_file_xml(self.location().join("Contents/Info.plist"), &pl).unwrap(); + } + + fn command(&self) -> String { + let mut lines = vec!["#!/bin/sh".to_string()]; + if self.render_key("terminal", &HashMap::new()) == Some("true".to_string()) { + lines.extend_from_slice(&[ + r#"if [ "${__CFBundleIdentifier:-}" != "com.apple.Terminal" ]; then"#.to_string(), + r#" open -b com.apple.terminal "$0""#.to_string(), + r#" exit $?"#.to_string(), + "fi".to_string(), + ]); + } + + // if let Some(working_dir) = self.render_key("working_dir", &HashMap::new()) { + // fs::create_dir_all(shellexpand::full(&working_dir).unwrap().to_string()).unwrap(); + // lines.push(format!(r#"cd "{}""#, working_dir)); + // } + + if let Some(precommand) = self.render_key("precommand", &HashMap::new()) { + lines.push(precommand); + } + + if self.metadata.get("activate") == Some(&Value::Boolean(true)) { + let conda_exe = &self.menu.prefix.join("bin/conda"); + // let activate = if self.menu.is_micromamba(conda_exe) { "shell activate" } else { "shell.bash activate" }; + // lines.push(format!(r#"eval "$("{}" {} "{}")""#, conda_exe.display(), activate, self.menu.prefix.display())); + } + + // lines.push(UnixLex::quote_args(&self.render_key("command", &HashMap::new()).unwrap()).join(" ")); + + lines.join("\n") + } + + fn default_appkit_launcher_path(&self) -> PathBuf { + self.location() + .join("Contents/MacOS") + .join(self.bundle_name()) + } + + fn default_launcher_path(&self, suffix: Option<&str>) -> PathBuf { + let suffix = suffix.unwrap_or(""); + let name = self.render_key("name", &HashMap::new()).unwrap(); + if self.needs_appkit_launcher() { + return self + .nested_location() + .join("Contents/MacOS") + .join(format!("{name}{suffix}")); + } + self.location() + .join("Contents/MacOS") + .join(format!("{name}{suffix}")) + } + + fn write_appkit_launcher(&self, launcher_path: Option<&Path>) -> PathBuf { + let launcher_path = launcher_path + .map(PathBuf::from) + .unwrap_or_else(|| self.default_appkit_launcher_path()); + // fs::copy(self.find_appkit_launcher(), launcher_path).unwrap(); + // fs::set_permissions(launcher_path, fs::Permissions::from_mode(0o755)).unwrap(); + launcher_path.to_path_buf() + } + + fn write_launcher(&self, launcher_path: Option<&Path>) -> PathBuf { + let launcher_path = launcher_path + .map(PathBuf::from) + .unwrap_or_else(|| self.default_launcher_path(None)); + // fs::copy(self.find_launcher(), launcher_path).unwrap(); + // fs::set_permissions(launcher_path, fs::Permissions::from_mode(0o755)).unwrap(); + launcher_path.to_path_buf() + } + + fn write_script(&self, script_path: Option<&Path>) -> PathBuf { + let script_path = script_path + .map(PathBuf::from) + .unwrap_or_else(|| self.default_launcher_path(None).with_extension("script")); + fs::write(&script_path, self.command()).unwrap(); + fs::set_permissions(&script_path, fs::Permissions::from_mode(0o755)).unwrap(); + script_path + } + + fn write_event_handler(&self, script_path: Option<&Path>) -> Option { + if !self.needs_appkit_launcher() { + return None; + } + let event_handler_logic = self.render_key("event_handler", &HashMap::new())?; + let script_path = script_path + .map(PathBuf::from) + .unwrap_or_else(|| self.location().join("Contents/Resources/handle-event")); + fs::write( + &script_path, + format!("#!/bin/bash\n{}\n", event_handler_logic), + ) + .unwrap(); + fs::set_permissions(&script_path, fs::Permissions::from_mode(0o755)).unwrap(); + Some(script_path) + } + + fn maybe_register_with_launchservices(&self, register: bool) { + if !self.needs_appkit_launcher() { + return; + } + if register { + lsregister(&["-R", self.location().to_str().unwrap()]); + } else { + lsregister(&["-R", "-u", "-all", self.location().to_str().unwrap()]); + } + } + + fn sign_with_entitlements(&self) { + let entitlements = Vec::::new(); + if entitlements.is_empty() { + return; + } + + let mut plist = plist::Dictionary::new(); + for key in entitlements { + plist.insert(key, Value::Boolean(true)); + } + + let slugname = self.render_key("name", &[("slug", &true.into())].iter().cloned().collect()); + let entitlements_path = self.location().join("Contents/Entitlements.plist"); + plist::to_file_xml(&entitlements_path, &plist).unwrap(); + + // logged_run( + // &[ + // "/usr/bin/codesign", + // "--verbose", + // "--sign", + // "-", + // "--prefix", + // &format!("com.{}", slugname), + // "--options", + // "runtime", + // "--force", + // "--deep", + // "--entitlements", + // entitlements_path.to_str().unwrap(), + // self.location().to_str().unwrap(), + // ], + // true, + // ).unwrap(); + } + } + + fn needs_appkit_launcher(&self) -> bool { + self.metadata.get("event_handler").is_some() + } + + fn render_key(&self, key: &str, extra: &HashMap<&str, Value>) -> Option { + // Implement rendering logic here + self.metadata + .get(key) + .and_then(|v| v.as_string().map(|s| s.to_string())) + } + + // Implement other helper methods... +} + +fn lsregister(args: &[&str]) { + let exe = "/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister"; + Command::new(exe) + .args(args) + .output() + .expect("Failed to execute lsregister"); +} diff --git a/crates/rattler_menuinst/src/schema.rs b/crates/rattler_menuinst/src/schema.rs new file mode 100644 index 000000000..f2962cac2 --- /dev/null +++ b/crates/rattler_menuinst/src/schema.rs @@ -0,0 +1,230 @@ +use serde; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; + +#[derive(Serialize, Deserialize, Debug)] +#[serde(deny_unknown_fields)] +pub struct MenuItemNameDict { + target_environment_is_base: Option, + target_environment_is_not_base: Option, +} + +#[derive(Serialize, Deserialize, Debug)] +#[serde(deny_unknown_fields)] +pub struct BasePlatformSpecific { + name: Option, + description: Option, + icon: Option, + command: Option>, + working_dir: Option, + precommand: Option, + precreate: Option, + activate: Option, + terminal: Option, +} + +#[derive(Serialize, Deserialize, Debug)] +#[serde(deny_unknown_fields)] +pub struct Windows { + #[serde(flatten)] + base: BasePlatformSpecific, + desktop: Option, + quicklaunch: Option, + terminal_profile: Option, + url_protocols: Option>, + file_extensions: Option>, + app_user_model_id: Option, +} + +#[derive(Serialize, Deserialize, Debug)] +#[serde(deny_unknown_fields)] +pub struct Linux { + #[serde(flatten)] + base: BasePlatformSpecific, + #[serde(rename = "Categories")] + categories: Option>, + #[serde(rename = "DBusActivatable")] + dbus_activatable: Option, + #[serde(rename = "GenericName")] + generic_name: Option, + #[serde(rename = "Hidden")] + hidden: Option, + #[serde(rename = "Implements")] + implements: Option>, + #[serde(rename = "Keywords")] + keywords: Option>, + #[serde(rename = "MimeType")] + mime_type: Option>, + #[serde(rename = "NoDisplay")] + no_display: Option, + #[serde(rename = "NotShowIn")] + not_show_in: Option>, + #[serde(rename = "OnlyShowIn")] + only_show_in: Option>, + #[serde(rename = "PrefersNonDefaultGPU")] + prefers_non_default_gpu: Option, + #[serde(rename = "StartupNotify")] + startup_notify: Option, + #[serde(rename = "StartupWMClass")] + startup_wm_class: Option, + #[serde(rename = "TryExec")] + try_exec: Option, + glob_patterns: Option>, +} + +#[derive(Serialize, Deserialize, Debug)] +#[serde(deny_unknown_fields)] +pub struct CFBundleURLTypesModel { + #[serde(rename = "CFBundleTypeRole")] + cf_bundle_type_role: Option, + #[serde(rename = "CFBundleURLSchemes")] + cf_bundle_url_schemes: Vec, + #[serde(rename = "CFBundleURLName")] + cf_bundle_url_name: Option, + #[serde(rename = "CFBundleURLIconFile")] + cf_bundle_url_icon_file: Option, +} + +#[derive(Serialize, Deserialize, Debug)] +#[serde(deny_unknown_fields)] +pub struct CFBundleDocumentTypesModel { + #[serde(rename = "CFBundleTypeIconFile")] + cf_bundle_type_icon_file: Option, + #[serde(rename = "CFBundleTypeName")] + cf_bundle_type_name: String, + #[serde(rename = "CFBundleTypeRole")] + cf_bundle_type_role: Option, + #[serde(rename = "LSItemContentTypes")] + ls_item_content_types: Vec, + #[serde(rename = "LSHandlerRank")] + ls_handler_rank: String, +} + +#[derive(Serialize, Deserialize, Debug)] +#[serde(deny_unknown_fields)] +pub struct UTTypeDeclarationModel { + #[serde(rename = "UTTypeConformsTo")] + ut_type_conforms_to: Vec, + #[serde(rename = "UTTypeDescription")] + ut_type_description: Option, + #[serde(rename = "UTTypeIconFile")] + ut_type_icon_file: Option, + #[serde(rename = "UTTypeIdentifier")] + ut_type_identifier: String, + #[serde(rename = "UTTypeReferenceURL")] + ut_type_reference_url: Option, + #[serde(rename = "UTTypeTagSpecification")] + ut_type_tag_specification: HashMap>, +} + +#[derive(Serialize, Deserialize, Debug)] +#[serde(deny_unknown_fields)] +pub struct MacOS { + #[serde(flatten)] + base: BasePlatformSpecific, + #[serde(rename = "CFBundleDisplayName")] + cf_bundle_display_name: Option, + #[serde(rename = "CFBundleIdentifier")] + cf_bundle_identifier: Option, + #[serde(rename = "CFBundleName")] + cf_bundle_name: Option, + #[serde(rename = "CFBundleSpokenName")] + cf_bundle_spoken_name: Option, + #[serde(rename = "CFBundleVersion")] + cf_bundle_version: Option, + #[serde(rename = "CFBundleURLTypes")] + cf_bundle_url_types: Option>, + #[serde(rename = "CFBundleDocumentTypes")] + cf_bundle_document_types: Option>, + #[serde(rename = "LSApplicationCategoryType")] + ls_application_category_type: Option, + #[serde(rename = "LSBackgroundOnly")] + ls_background_only: Option, + #[serde(rename = "LSEnvironment")] + ls_environment: Option>, + #[serde(rename = "LSMinimumSystemVersion")] + ls_minimum_system_version: Option, + #[serde(rename = "LSMultipleInstancesProhibited")] + ls_multiple_instances_prohibited: Option, + #[serde(rename = "LSRequiresNativeExecution")] + ls_requires_native_execution: Option, + #[serde(rename = "NSSupportsAutomaticGraphicsSwitching")] + ns_supports_automatic_graphics_switching: Option, + #[serde(rename = "UTExportedTypeDeclarations")] + ut_exported_type_declarations: Option>, + #[serde(rename = "UTImportedTypeDeclarations")] + ut_imported_type_declarations: Option>, + entitlements: Option>, + link_in_bundle: Option>, + event_handler: Option, +} + +#[derive(Serialize, Deserialize, Debug)] +#[serde(deny_unknown_fields)] +pub struct Platforms { + linux: Option, + osx: Option, + win: Option, +} + +#[derive(Serialize, Deserialize, Debug)] +#[serde(deny_unknown_fields)] +pub struct MenuItem { + name: String, + description: String, + command: Vec, + icon: Option, + precommand: Option, + precreate: Option, + working_dir: Option, + activate: Option, + terminal: Option, + platforms: Platforms, +} + +#[derive(Serialize, Deserialize, Debug)] +#[serde(deny_unknown_fields)] +pub struct MenuInstSchema { + #[serde(rename = "$id")] + id: String, + #[serde(rename = "$schema")] + schema: String, + menu_name: String, + menu_items: Vec, +} + +#[cfg(test)] +mod test { + use std::path::{Path, PathBuf}; + + pub(crate) fn test_data() -> PathBuf { + Path::new(env!("CARGO_MANIFEST_DIR")).join("../../test-data/menuinst") + } + + #[test] + fn test_deserialize_gnuradio() { + let test_data = test_data(); + let schema_path = test_data.join("gnuradio/gnuradio-grc.json"); + let schema_str = std::fs::read_to_string(schema_path).unwrap(); + let schema: super::MenuInstSchema = serde_json::from_str(&schema_str).unwrap(); + insta::assert_debug_snapshot!(schema); + } + + #[test] + fn test_deserialize_mne() { + let test_data = test_data(); + let schema_path = test_data.join("mne/menu.json"); + let schema_str = std::fs::read_to_string(schema_path).unwrap(); + let schema: super::MenuInstSchema = serde_json::from_str(&schema_str).unwrap(); + insta::assert_debug_snapshot!(schema); + } + + #[test] + fn test_deserialize_grx() { + let test_data = test_data(); + let schema_path = test_data.join("gqrx/gqrx-menu.json"); + let schema_str = std::fs::read_to_string(schema_path).unwrap(); + let schema: super::MenuInstSchema = serde_json::from_str(&schema_str).unwrap(); + insta::assert_debug_snapshot!(schema); + } +} diff --git a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_gnuradio.snap b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_gnuradio.snap new file mode 100644 index 000000000..60abe1169 --- /dev/null +++ b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_gnuradio.snap @@ -0,0 +1,55 @@ +--- +source: crates/rattler_menuinst/src/schema.rs +expression: schema +--- +MenuInstSchema { + id: "https://schemas.conda.io/menuinst-1.schema.json", + schema: "https://json-schema.org/draft-07/schema", + menu_name: "{{ DISTRIBUTION_NAME }}", + menu_items: [ + MenuItem { + name: "GNU Radio Companion", + description: "Flowgraph builder for GNU Radio", + command: [ + "{{ BIN_DIR }}/gnuradio-companion", + ], + icon: Some( + "{{ MENU_DIR }}/grc.{{ ICON_EXT }}", + ), + precommand: None, + precreate: None, + working_dir: None, + activate: None, + terminal: None, + platforms: Platforms { + linux: None, + osx: None, + win: Some( + Windows { + base: BasePlatformSpecific { + name: None, + description: None, + icon: None, + command: None, + working_dir: None, + precommand: None, + precreate: None, + activate: None, + terminal: None, + }, + desktop: Some( + false, + ), + quicklaunch: Some( + false, + ), + terminal_profile: None, + url_protocols: None, + file_extensions: None, + app_user_model_id: None, + }, + ), + }, + }, + ], +} diff --git a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_grx.snap b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_grx.snap new file mode 100644 index 000000000..316611d5c --- /dev/null +++ b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_grx.snap @@ -0,0 +1,102 @@ +--- +source: crates/rattler_menuinst/src/schema.rs +expression: schema +--- +MenuInstSchema { + id: "https://schemas.conda.io/menuinst-1.schema.json", + schema: "https://json-schema.org/draft-07/schema", + menu_name: "{{ DISTRIBUTION_NAME }}", + menu_items: [ + MenuItem { + name: "gqrx", + description: "Software defined radio", + command: [ + "{{ PREFIX }}/Library/bin/gqrx.exe", + "--edit", + ], + icon: Some( + "{{ MENU_DIR }}/gqrx.{{ ICON_EXT }}", + ), + precommand: None, + precreate: None, + working_dir: None, + activate: None, + terminal: None, + platforms: Platforms { + linux: None, + osx: None, + win: Some( + Windows { + base: BasePlatformSpecific { + name: None, + description: None, + icon: None, + command: None, + working_dir: None, + precommand: None, + precreate: None, + activate: None, + terminal: None, + }, + desktop: Some( + false, + ), + quicklaunch: Some( + false, + ), + terminal_profile: None, + url_protocols: None, + file_extensions: None, + app_user_model_id: None, + }, + ), + }, + }, + MenuItem { + name: "gqrx [reset]", + description: "Software defined radio [reset settings]", + command: [ + "{{ PREFIX }}/Library/bin/gqrx.exe", + "--reset", + "--edit", + ], + icon: Some( + "{{ MENU_DIR }}/gqrx.{{ ICON_EXT }}", + ), + precommand: None, + precreate: None, + working_dir: None, + activate: None, + terminal: None, + platforms: Platforms { + linux: None, + osx: None, + win: Some( + Windows { + base: BasePlatformSpecific { + name: None, + description: None, + icon: None, + command: None, + working_dir: None, + precommand: None, + precreate: None, + activate: None, + terminal: None, + }, + desktop: Some( + false, + ), + quicklaunch: Some( + false, + ), + terminal_profile: None, + url_protocols: None, + file_extensions: None, + app_user_model_id: None, + }, + ), + }, + }, + ], +} diff --git a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_mne.snap b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_mne.snap new file mode 100644 index 000000000..12c60ccf7 --- /dev/null +++ b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_mne.snap @@ -0,0 +1,663 @@ +--- +source: crates/rattler_menuinst/src/schema.rs +expression: schema +--- +MenuInstSchema { + id: "https://schemas.conda.io/menuinst-1.schema.json", + schema: "https://json-schema.org/draft-07/schema", + menu_name: "MNE-Python (__PKG_VERSION__)", + menu_items: [ + MenuItem { + name: "Spyder (MNE)", + description: "The Spyder development environment", + command: [ + "will be overridden in platforms section", + ], + icon: Some( + "{{ MENU_DIR }}/mne_spyder.{{ ICON_EXT }}", + ), + precommand: None, + precreate: None, + working_dir: None, + activate: Some( + true, + ), + terminal: Some( + false, + ), + platforms: Platforms { + linux: Some( + Linux { + base: BasePlatformSpecific { + name: None, + description: None, + icon: None, + command: Some( + [ + "spyder", + ], + ), + working_dir: None, + precommand: None, + precreate: None, + activate: None, + terminal: None, + }, + categories: Some( + [ + "Science", + ], + ), + dbus_activatable: None, + generic_name: None, + hidden: None, + implements: None, + keywords: None, + mime_type: None, + no_display: None, + not_show_in: None, + only_show_in: None, + prefers_non_default_gpu: None, + startup_notify: None, + startup_wm_class: None, + try_exec: None, + glob_patterns: None, + }, + ), + osx: Some( + MacOS { + base: BasePlatformSpecific { + name: None, + description: None, + icon: None, + command: Some( + [ + "spyder", + ], + ), + working_dir: None, + precommand: None, + precreate: None, + activate: None, + terminal: None, + }, + cf_bundle_display_name: Some( + "Spyder (MNE-Python __PKG_VERSION__)", + ), + cf_bundle_identifier: None, + cf_bundle_name: Some( + "Spyder (MNE-Python __PKG_VERSION__)", + ), + cf_bundle_spoken_name: None, + cf_bundle_version: Some( + "__PKG_VERSION__", + ), + cf_bundle_url_types: None, + cf_bundle_document_types: None, + ls_application_category_type: None, + ls_background_only: None, + ls_environment: None, + ls_minimum_system_version: None, + ls_multiple_instances_prohibited: None, + ls_requires_native_execution: None, + ns_supports_automatic_graphics_switching: None, + ut_exported_type_declarations: None, + ut_imported_type_declarations: None, + entitlements: None, + link_in_bundle: None, + event_handler: None, + }, + ), + win: Some( + Windows { + base: BasePlatformSpecific { + name: None, + description: None, + icon: None, + command: Some( + [ + "{{ PYTHONW }}", + "{{ SCRIPTS_DIR }}\\spyder-script.py", + ], + ), + working_dir: None, + precommand: None, + precreate: None, + activate: None, + terminal: None, + }, + desktop: Some( + false, + ), + quicklaunch: None, + terminal_profile: None, + url_protocols: None, + file_extensions: None, + app_user_model_id: None, + }, + ), + }, + }, + MenuItem { + name: "System Info (MNE)", + description: "Information on the MNE-Python runtime environment", + command: [ + "{{ PYTHON }}", + "{{ MENU_DIR }}/mne_sys_info.py", + ], + icon: Some( + "{{ MENU_DIR }}/mne_info.{{ ICON_EXT }}", + ), + precommand: None, + precreate: None, + working_dir: None, + activate: Some( + true, + ), + terminal: Some( + true, + ), + platforms: Platforms { + linux: Some( + Linux { + base: BasePlatformSpecific { + name: None, + description: None, + icon: None, + command: None, + working_dir: None, + precommand: None, + precreate: None, + activate: None, + terminal: None, + }, + categories: Some( + [ + "Science", + ], + ), + dbus_activatable: None, + generic_name: None, + hidden: None, + implements: None, + keywords: None, + mime_type: None, + no_display: None, + not_show_in: None, + only_show_in: None, + prefers_non_default_gpu: None, + startup_notify: None, + startup_wm_class: None, + try_exec: None, + glob_patterns: None, + }, + ), + osx: Some( + MacOS { + base: BasePlatformSpecific { + name: None, + description: None, + icon: None, + command: None, + working_dir: None, + precommand: None, + precreate: None, + activate: None, + terminal: None, + }, + cf_bundle_display_name: Some( + "System Information (MNE-Python __PKG_VERSION__)", + ), + cf_bundle_identifier: None, + cf_bundle_name: Some( + "System Information (MNE-Python __PKG_VERSION__)", + ), + cf_bundle_spoken_name: None, + cf_bundle_version: Some( + "__PKG_VERSION__", + ), + cf_bundle_url_types: None, + cf_bundle_document_types: None, + ls_application_category_type: None, + ls_background_only: None, + ls_environment: None, + ls_minimum_system_version: None, + ls_multiple_instances_prohibited: None, + ls_requires_native_execution: None, + ns_supports_automatic_graphics_switching: None, + ut_exported_type_declarations: None, + ut_imported_type_declarations: None, + entitlements: None, + link_in_bundle: None, + event_handler: None, + }, + ), + win: Some( + Windows { + base: BasePlatformSpecific { + name: None, + description: None, + icon: None, + command: None, + working_dir: None, + precommand: None, + precreate: None, + activate: None, + terminal: None, + }, + desktop: Some( + false, + ), + quicklaunch: None, + terminal_profile: None, + url_protocols: None, + file_extensions: None, + app_user_model_id: None, + }, + ), + }, + }, + MenuItem { + name: "Prompt (MNE)", + description: "MNE-Python console prompt", + command: [ + "will be overridden in platforms section", + ], + icon: Some( + "{{ MENU_DIR }}/mne_console.{{ ICON_EXT }}", + ), + precommand: None, + precreate: None, + working_dir: None, + activate: Some( + true, + ), + terminal: Some( + true, + ), + platforms: Platforms { + linux: Some( + Linux { + base: BasePlatformSpecific { + name: None, + description: None, + icon: None, + command: Some( + [ + "exec", + "bash", + "--init-file", + "{{ MENU_DIR }}/mne_open_prompt.sh", + ], + ), + working_dir: None, + precommand: None, + precreate: None, + activate: None, + terminal: None, + }, + categories: Some( + [ + "Science", + ], + ), + dbus_activatable: None, + generic_name: None, + hidden: None, + implements: None, + keywords: None, + mime_type: None, + no_display: None, + not_show_in: None, + only_show_in: None, + prefers_non_default_gpu: None, + startup_notify: None, + startup_wm_class: None, + try_exec: None, + glob_patterns: None, + }, + ), + osx: Some( + MacOS { + base: BasePlatformSpecific { + name: None, + description: None, + icon: None, + command: Some( + [ + "osascript", + "{{ MENU_DIR }}/mne_open_prompt.applescript", + ], + ), + working_dir: None, + precommand: None, + precreate: None, + activate: None, + terminal: None, + }, + cf_bundle_display_name: Some( + "Prompt (MNE-Python __PKG_VERSION__)", + ), + cf_bundle_identifier: None, + cf_bundle_name: Some( + "Prompt (MNE-Python __PKG_VERSION__)", + ), + cf_bundle_spoken_name: None, + cf_bundle_version: Some( + "__PKG_VERSION__", + ), + cf_bundle_url_types: None, + cf_bundle_document_types: None, + ls_application_category_type: None, + ls_background_only: None, + ls_environment: None, + ls_minimum_system_version: None, + ls_multiple_instances_prohibited: None, + ls_requires_native_execution: None, + ns_supports_automatic_graphics_switching: None, + ut_exported_type_declarations: None, + ut_imported_type_declarations: None, + entitlements: None, + link_in_bundle: None, + event_handler: None, + }, + ), + win: Some( + Windows { + base: BasePlatformSpecific { + name: None, + description: None, + icon: None, + command: Some( + [ + "%SystemRoot%\\system32\\cmd.exe", + "/K", + "{{ MENU_DIR }}\\mne_open_prompt.bat", + ], + ), + working_dir: None, + precommand: None, + precreate: None, + activate: None, + terminal: None, + }, + desktop: Some( + false, + ), + quicklaunch: None, + terminal_profile: None, + url_protocols: None, + file_extensions: None, + app_user_model_id: None, + }, + ), + }, + }, + MenuItem { + name: "Tutorials (MNE)", + description: "MNE-Python online tutorials", + command: [ + "will be overridden in platforms section", + ], + icon: Some( + "{{ MENU_DIR }}/mne_web.{{ ICON_EXT }}", + ), + precommand: None, + precreate: None, + working_dir: None, + activate: Some( + false, + ), + terminal: Some( + false, + ), + platforms: Platforms { + linux: Some( + Linux { + base: BasePlatformSpecific { + name: None, + description: None, + icon: None, + command: Some( + [ + "xdg-open", + "https://mne.tools/stable/auto_tutorials/", + ], + ), + working_dir: None, + precommand: None, + precreate: None, + activate: None, + terminal: None, + }, + categories: Some( + [ + "Science", + ], + ), + dbus_activatable: None, + generic_name: None, + hidden: None, + implements: None, + keywords: None, + mime_type: None, + no_display: None, + not_show_in: None, + only_show_in: None, + prefers_non_default_gpu: None, + startup_notify: None, + startup_wm_class: None, + try_exec: None, + glob_patterns: None, + }, + ), + osx: Some( + MacOS { + base: BasePlatformSpecific { + name: None, + description: None, + icon: None, + command: Some( + [ + "open", + "https://mne.tools/stable/auto_tutorials/", + ], + ), + working_dir: None, + precommand: None, + precreate: None, + activate: None, + terminal: None, + }, + cf_bundle_display_name: Some( + "Tutorials (MNE-Python __PKG_VERSION__)", + ), + cf_bundle_identifier: None, + cf_bundle_name: Some( + "Tutorials (MNE-Python __PKG_VERSION__)", + ), + cf_bundle_spoken_name: None, + cf_bundle_version: Some( + "__PKG_VERSION__", + ), + cf_bundle_url_types: None, + cf_bundle_document_types: None, + ls_application_category_type: None, + ls_background_only: None, + ls_environment: None, + ls_minimum_system_version: None, + ls_multiple_instances_prohibited: None, + ls_requires_native_execution: None, + ns_supports_automatic_graphics_switching: None, + ut_exported_type_declarations: None, + ut_imported_type_declarations: None, + entitlements: None, + link_in_bundle: None, + event_handler: None, + }, + ), + win: Some( + Windows { + base: BasePlatformSpecific { + name: None, + description: None, + icon: None, + command: Some( + [ + "%SystemRoot%\\system32\\WindowsPowerShell\\v1.0\\powershell.exe", + "\"start https://mne.tools/stable/auto_tutorials -WindowStyle hidden\"", + ], + ), + working_dir: None, + precommand: None, + precreate: None, + activate: None, + terminal: None, + }, + desktop: Some( + false, + ), + quicklaunch: None, + terminal_profile: None, + url_protocols: None, + file_extensions: None, + app_user_model_id: None, + }, + ), + }, + }, + MenuItem { + name: "User Forum (MNE)", + description: "MNE-Python forum for discussions, problem solving, and information exchange", + command: [ + "will be overridden in platforms section", + ], + icon: Some( + "{{ MENU_DIR }}/mne_forum.{{ ICON_EXT }}", + ), + precommand: None, + precreate: None, + working_dir: None, + activate: Some( + false, + ), + terminal: Some( + false, + ), + platforms: Platforms { + linux: Some( + Linux { + base: BasePlatformSpecific { + name: None, + description: None, + icon: None, + command: Some( + [ + "xdg-open", + "https://mne.discourse.group", + ], + ), + working_dir: None, + precommand: None, + precreate: None, + activate: None, + terminal: None, + }, + categories: Some( + [ + "Science", + ], + ), + dbus_activatable: None, + generic_name: None, + hidden: None, + implements: None, + keywords: None, + mime_type: None, + no_display: None, + not_show_in: None, + only_show_in: None, + prefers_non_default_gpu: None, + startup_notify: None, + startup_wm_class: None, + try_exec: None, + glob_patterns: None, + }, + ), + osx: Some( + MacOS { + base: BasePlatformSpecific { + name: None, + description: None, + icon: None, + command: Some( + [ + "open", + "https://mne.discourse.group", + ], + ), + working_dir: None, + precommand: None, + precreate: None, + activate: None, + terminal: None, + }, + cf_bundle_display_name: Some( + "Forum (MNE-Python __PKG_VERSION__)", + ), + cf_bundle_identifier: None, + cf_bundle_name: Some( + "Forum (MNE-Python __PKG_VERSION__)", + ), + cf_bundle_spoken_name: None, + cf_bundle_version: Some( + "__PKG_VERSION__", + ), + cf_bundle_url_types: None, + cf_bundle_document_types: None, + ls_application_category_type: None, + ls_background_only: None, + ls_environment: None, + ls_minimum_system_version: None, + ls_multiple_instances_prohibited: None, + ls_requires_native_execution: None, + ns_supports_automatic_graphics_switching: None, + ut_exported_type_declarations: None, + ut_imported_type_declarations: None, + entitlements: None, + link_in_bundle: None, + event_handler: None, + }, + ), + win: Some( + Windows { + base: BasePlatformSpecific { + name: None, + description: None, + icon: None, + command: Some( + [ + "%SystemRoot%\\system32\\WindowsPowerShell\\v1.0\\powershell.exe", + "\"start https://mne.discourse.group -WindowStyle hidden\"", + ], + ), + working_dir: None, + precommand: None, + precreate: None, + activate: None, + terminal: None, + }, + desktop: Some( + false, + ), + quicklaunch: None, + terminal_profile: None, + url_protocols: None, + file_extensions: None, + app_user_model_id: None, + }, + ), + }, + }, + ], +} diff --git a/crates/rattler_menuinst/src/utils/mod.rs b/crates/rattler_menuinst/src/utils/mod.rs new file mode 100644 index 000000000..b29b420c7 --- /dev/null +++ b/crates/rattler_menuinst/src/utils/mod.rs @@ -0,0 +1 @@ +pub mod unix_lex; diff --git a/crates/rattler_menuinst/src/utils/unix_lex.rs b/crates/rattler_menuinst/src/utils/unix_lex.rs new file mode 100644 index 000000000..2bde985f7 --- /dev/null +++ b/crates/rattler_menuinst/src/utils/unix_lex.rs @@ -0,0 +1,13 @@ +pub struct UnixLex; + +impl UnixLex { + pub fn quote_args(args: &[String]) -> Vec { + args.iter().map(|a| Self::quote_string(a)).collect() + } + + pub fn quote_string(s: &str) -> String { + shlex::try_quote(s) + .expect("Failed to quote string") + .to_string() + } +} diff --git a/crates/rattler_menuinst/src/win.rs b/crates/rattler_menuinst/src/win.rs new file mode 100644 index 000000000..003bb11b2 --- /dev/null +++ b/crates/rattler_menuinst/src/win.rs @@ -0,0 +1,336 @@ +use std::collections::HashMap; +use std::fs::{self, File}; +use std::io::Write; +use std::path::{Path, PathBuf}; +use std::process::Command; + +use log::{debug, warn}; +use serde_json::Value; +use tempfile::NamedTempFile; +use winapi::um::winuser::SHChangeNotify; + +use crate::utils::{WinLex, logged_run, unlink}; +use crate::base::{Menu, MenuItem}; +use crate::win_utils::knownfolders::{folder_path, windows_terminal_settings_files}; +use crate::win_utils::registry::{ + notify_shell_changes, register_file_extension, register_url_protocol, + unregister_file_extension, unregister_url_protocol, +}; + +pub struct WindowsMenu { + name: String, + mode: String, + prefix: PathBuf, + base_prefix: PathBuf, +} + +impl WindowsMenu { + pub fn new(name: String, mode: String, prefix: PathBuf, base_prefix: PathBuf) -> Self { + WindowsMenu { name, mode, prefix, base_prefix } + } + + pub fn create(&self) -> Vec { + debug!("Creating {:?}", self.start_menu_location()); + fs::create_dir_all(&self.start_menu_location()).unwrap(); + if let Some(quick_launch) = self.quick_launch_location() { + fs::create_dir_all(quick_launch).unwrap(); + } + if let Some(desktop) = self.desktop_location() { + fs::create_dir_all(desktop).unwrap(); + } + vec![self.start_menu_location()] + } + + pub fn remove(&self) -> Vec { + let menu_location = self.start_menu_location(); + if menu_location.exists() { + if menu_location.read_dir().unwrap().next().is_none() { + debug!("Removing {:?}", menu_location); + fs::remove_dir_all(menu_location).unwrap(); + } + } + vec![menu_location] + } + + pub fn start_menu_location(&self) -> PathBuf { + PathBuf::from(folder_path(&self.mode, false, "start")).join(self.render(&self.name)) + } + + pub fn quick_launch_location(&self) -> Option { + if self.mode == "system" { + warn!("Quick launch menus are not available for system level installs"); + None + } else { + Some(PathBuf::from(folder_path(&self.mode, false, "quicklaunch"))) + } + } + + pub fn desktop_location(&self) -> Option { + Some(PathBuf::from(folder_path(&self.mode, false, "desktop"))) + } + + pub fn terminal_profile_locations(&self) -> Vec { + if self.mode == "system" { + warn!("Terminal profiles are not available for system level installs"); + vec![] + } else { + windows_terminal_settings_files(&self.mode) + } + } + + pub fn placeholders(&self) -> HashMap { + let mut placeholders = HashMap::new(); + placeholders.insert("SCRIPTS_DIR".to_string(), self.prefix.join("Scripts").to_str().unwrap().to_string()); + placeholders.insert("PYTHON".to_string(), self.prefix.join("python.exe").to_str().unwrap().to_string()); + placeholders.insert("PYTHONW".to_string(), self.prefix.join("pythonw.exe").to_str().unwrap().to_string()); + placeholders.insert("BASE_PYTHON".to_string(), self.base_prefix.join("python.exe").to_str().unwrap().to_string()); + placeholders.insert("BASE_PYTHONW".to_string(), self.base_prefix.join("pythonw.exe").to_str().unwrap().to_string()); + placeholders.insert("BIN_DIR".to_string(), self.prefix.join("Library").join("bin").to_str().unwrap().to_string()); + placeholders.insert("SP_DIR".to_string(), self.site_packages().to_str().unwrap().to_string()); + placeholders.insert("ICON_EXT".to_string(), "ico".to_string()); + placeholders + } + + pub fn render(&self, value: &str, slug: bool, extra: Option<&HashMap>) -> String { + // Implement rendering logic here + let rendered = value.to_string(); // Placeholder for actual rendering + if rendered.contains('/') && !rendered.starts_with('/') { + rendered.replace('/', "\\") + } else { + rendered + } + } + + fn site_packages(&self) -> PathBuf { + self.prefix.join("Lib").join("site-packages") + } + + fn paths(&self) -> Vec { + vec![self.start_menu_location()] + } +} + +pub struct WindowsMenuItem { + menu: WindowsMenu, + metadata: HashMap, +} + +impl WindowsMenuItem { + pub fn new(menu: WindowsMenu, metadata: HashMap) -> Self { + WindowsMenuItem { menu, metadata } + } + + pub fn location(&self) -> PathBuf { + self.menu.start_menu_location().join(self.shortcut_filename()) + } + + pub fn create(&self) -> Vec { + self.precreate(); + let paths = self.paths(); + + for path in &paths { + if path.extension().unwrap_or_default() != "lnk" { + continue; + } + + let (target_path, arguments) = self.process_command(); + let working_dir = self.render_key("working_dir"); + let working_dir = if let Some(dir) = working_dir { + fs::create_dir_all(std::path::Path::new(&std::env::var("USERPROFILE").unwrap()).join(dir)).unwrap(); + dir + } else if std::env::var("USERPROFILE").is_ok() { + "%USERPROFILE%".to_string() + } else { + "%HOMEDRIVE%%HOMEPATH%".to_string() + }; + + let icon = self.render_key("icon").unwrap_or_default(); + + if path.exists() { + warn!("Overwriting existing link at {:?}.", path); + } + // Implement create_shortcut function + create_shortcut( + &target_path, + &self.shortcut_filename_without_ext(), + path, + &arguments.join(" "), + &working_dir, + &icon, + 0, + &self.app_user_model_id(), + ); + } + + for location in self.menu.terminal_profile_locations() { + self.add_remove_windows_terminal_profile(&location, false); + } + let changed_extensions = self.register_file_extensions(); + let changed_protocols = self.register_url_protocols(); + if changed_extensions || changed_protocols { + notify_shell_changes(); + } + + paths + } + + pub fn remove(&self) -> Vec { + let changed_extensions = self.unregister_file_extensions(); + let changed_protocols = self.unregister_url_protocols(); + if changed_extensions || changed_protocols { + notify_shell_changes(); + } + + for location in self.menu.terminal_profile_locations() { + self.add_remove_windows_terminal_profile(&location, true); + } + + let paths = self.paths(); + for path in &paths { + debug!("Removing {:?}", path); + unlink(path, true); + } + + paths + } + + fn paths(&self) -> Vec { + let mut paths = vec![self.location()]; + let mut extra_dirs = vec![]; + if self.metadata.get("desktop").and_then(|v| v.as_bool()).unwrap_or(false) { + if let Some(desktop) = self.menu.desktop_location() { + extra_dirs.push(desktop); + } + } + if self.metadata.get("quicklaunch").and_then(|v| v.as_bool()).unwrap_or(false) { + if let Some(quick_launch) = self.menu.quick_launch_location() { + extra_dirs.push(quick_launch); + } + } + + for dir in extra_dirs { + paths.push(dir.join(self.shortcut_filename())); + } + + if self.metadata.get("activate").and_then(|v| v.as_bool()).unwrap_or(false) { + paths.push(self.path_for_script()); + } + + paths + } + + fn shortcut_filename(&self) -> String { + format!("{}.lnk", self.render_key("name").unwrap()) + } + + fn shortcut_filename_without_ext(&self) -> String { + self.render_key("name").unwrap() + } + + fn path_for_script(&self) -> PathBuf { + PathBuf::from(self.menu.placeholders().get("MENU_DIR").unwrap()) + .join(format!("{}.bat", self.render_key("name").unwrap())) + } + + fn precreate(&self) { + if let Some(precreate_code) = self.render_key("precreate") { + let mut tmp = NamedTempFile::new().unwrap(); + writeln!(tmp, "{}", precreate_code).unwrap(); + let system32 = PathBuf::from(std::env::var("SystemRoot").unwrap_or("C:\\Windows".to_string())).join("system32"); + let cmd = [ + system32.join("WindowsPowerShell").join("v1.0").join("powershell.exe").to_str().unwrap(), + &format!("\"start '{}' -WindowStyle hidden\"", tmp.path().to_str().unwrap()), + ]; + logged_run(&cmd, true).unwrap(); + } + } + + fn command(&self) -> String { + let mut lines = vec![ + "@ECHO OFF".to_string(), + ":: Script generated by conda/menuinst".to_string(), + ]; + if let Some(precommand) = self.render_key("precommand") { + lines.push(precommand); + } + if self.metadata.get("activate").and_then(|v| v.as_bool()).unwrap_or(false) { + let conda_exe = &self.menu.prefix.join("Scripts").join("conda.exe"); + let activate = if self.menu.is_micromamba(conda_exe) { "shell activate" } else { "shell.cmd.exe activate" }; + let activator = format!(r#"{} {} "{}""#, conda_exe.to_str().unwrap(), activate, self.menu.prefix.to_str().unwrap()); + lines.extend_from_slice(&[ + "@SETLOCAL ENABLEDELAYEDEXPANSION".to_string(), + format!(r#"@FOR /F "usebackq tokens=*" %%i IN (`{}`) do set "ACTIVATOR=%%i""#, activator), + "@CALL %ACTIVATOR%".to_string(), + ":: This below is the user command".to_string(), + ]); + } + + lines.push(WinLex::quote_args(&self.render_key("command").unwrap())); + + lines.join("\r\n") + } + + fn write_script(&self, script_path: Option<&Path>) -> PathBuf { + let script_path = script_path.unwrap_or_else(|| self.path_for_script().as_path()); + fs::create_dir_all(script_path.parent().unwrap()).unwrap(); + fs::write(script_path, self.command()).unwrap(); + script_path.to_path_buf() + } + + fn process_command(&self, with_arg1: bool) -> (String, Vec) { + if self.metadata.get("activate").and_then(|v| v.as_bool()).unwrap_or(false) { + let script = self.write_script(None); + if self.metadata.get("terminal").and_then(|v| v.as_bool()).unwrap_or(false) { + let mut command = vec!["cmd".to_string(), "/D".to_string(), "/K".to_string(), format!("\"{}\"", script.to_str().unwrap())]; + if with_arg1 { + command.push("%1".to_string()); + } + (command[0].clone(), command[1..].to_vec()) + } else { + let system32 = PathBuf::from(std::env::var("SystemRoot").unwrap_or("C:\\Windows".to_string())).join("system32"); + let arg1 = if with_arg1 { "%1 " } else { "" }; + let command = vec![ + format!("\"{}\"", system32.join("cmd.exe").to_str().unwrap()), + "/D".to_string(), + "/C".to_string(), + "START".to_string(), + "/MIN".to_string(), + "\"\"".to_string(), + format!("\"{}\"", system32.join("WindowsPowerShell").join("v1.0").join("powershell.exe").to_str().unwrap()), + "-WindowStyle".to_string(), + "hidden".to_string(), + format!("\"start '{}' {}-WindowStyle hidden\"", script.to_str().unwrap(), arg1), + ]; + (command[0].clone(), command[1..].to_vec()) + } + } else { + let mut command = self.render_key("command").unwrap(); + if with_arg1 && !command.iter().any(|arg| arg.contains("%1")) { + command.push("%1".to_string()); + } + let quoted = WinLex::quote_args(&command); + (quoted[0].clone(), quoted[1..].to_vec()) + } + } + + // Implement other methods (add_remove_windows_terminal_profile, register_file_extensions, etc.) similarly... + + fn app_user_model_id(&self) -> String { + self.render_key("app_user_model_id") + .unwrap_or_else(|| format!("Menuinst.{}", self.render_key("name").unwrap().to_lowercase().replace('.', ""))) + .chars() + .take(128) + .collect() + } + + fn render_key(&self, key: &str) -> Option { + // Implement rendering logic here + self.metadata.get(key).and_then(|v| v.as_str().map(|s| s.to_string())) + } +} + +// Implement create_shortcut function +fn create_shortcut(target_path: &str, description: &str, shortcut_path: &Path, arguments: &str, working_dir: &str, icon_path: &str, icon_index: i32, app_id: &str) { + // Implement Windows shortcut creation logic here + // This might require using the Windows API or a third-party crate +} diff --git a/test-data/menuinst/gnuradio/gnuradio-grc.json b/test-data/menuinst/gnuradio/gnuradio-grc.json new file mode 100644 index 000000000..a890200db --- /dev/null +++ b/test-data/menuinst/gnuradio/gnuradio-grc.json @@ -0,0 +1,21 @@ +{ + "$id": "https://schemas.conda.io/menuinst-1.schema.json", + "$schema": "https://json-schema.org/draft-07/schema", + "menu_name": "{{ DISTRIBUTION_NAME }}", + "menu_items": [ + { + "name": "GNU Radio Companion", + "description": "Flowgraph builder for GNU Radio", + "command": [ + "{{ BIN_DIR }}/gnuradio-companion" + ], + "icon": "{{ MENU_DIR }}/grc.{{ ICON_EXT }}", + "platforms": { + "win": { + "desktop": false, + "quicklaunch": false + } + } + } + ] +} \ No newline at end of file diff --git a/test-data/menuinst/gnuradio/grc.ico b/test-data/menuinst/gnuradio/grc.ico new file mode 100644 index 0000000000000000000000000000000000000000..20c8b673b92651d68b30dbbc2bc267160cf24b7e GIT binary patch literal 111805 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 QhAeE>jQP4@I;O7w1F}|N+5i9m literal 0 HcmV?d00001 diff --git a/test-data/menuinst/gqrx/gqrx-menu.json b/test-data/menuinst/gqrx/gqrx-menu.json new file mode 100644 index 000000000..c3785329b --- /dev/null +++ b/test-data/menuinst/gqrx/gqrx-menu.json @@ -0,0 +1,38 @@ +{ + "$id": "https://schemas.conda.io/menuinst-1.schema.json", + "$schema": "https://json-schema.org/draft-07/schema", + "menu_name": "{{ DISTRIBUTION_NAME }}", + "menu_items": [ + { + "name": "gqrx", + "description": "Software defined radio", + "command": [ + "{{ PREFIX }}/Library/bin/gqrx.exe", + "--edit" + ], + "icon": "{{ MENU_DIR }}/gqrx.{{ ICON_EXT }}", + "platforms": { + "win": { + "desktop": false, + "quicklaunch": false + } + } + }, + { + "name": "gqrx [reset]", + "description": "Software defined radio [reset settings]", + "command": [ + "{{ PREFIX }}/Library/bin/gqrx.exe", + "--reset", + "--edit" + ], + "icon": "{{ MENU_DIR }}/gqrx.{{ ICON_EXT }}", + "platforms": { + "win": { + "desktop": false, + "quicklaunch": false + } + } + } + ] +} \ No newline at end of file diff --git a/test-data/menuinst/mne/menu.json b/test-data/menuinst/mne/menu.json new file mode 100644 index 000000000..23b374194 --- /dev/null +++ b/test-data/menuinst/mne/menu.json @@ -0,0 +1,168 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "$id": "https://schemas.conda.io/menuinst-1.schema.json", + "menu_name": "MNE-Python (__PKG_VERSION__)", + "menu_items": [{ + "name": "Spyder (MNE)", + "description": "The Spyder development environment", + "icon": "{{ MENU_DIR }}/mne_spyder.{{ ICON_EXT }}", + "command": ["will be overridden in platforms section"], + "activate": true, + "terminal": false, + "platforms": { + "win": { + "command": [ + "{{ PYTHONW }}", + "{{ SCRIPTS_DIR }}\\spyder-script.py" + ], + "desktop": false + }, + "linux": { + "command": ["spyder"], + "Categories": [ + "Science" + ] + }, + "osx": { + "command": ["spyder"], + "CFBundleName": "Spyder (MNE-Python __PKG_VERSION__)", + "CFBundleDisplayName": "Spyder (MNE-Python __PKG_VERSION__)", + "CFBundleVersion": "__PKG_VERSION__" + } + } + }, + { + "name": "System Info (MNE)", + "description": "Information on the MNE-Python runtime environment", + "icon": "{{ MENU_DIR }}/mne_info.{{ ICON_EXT }}", + "command": [ + "{{ PYTHON }}", + "{{ MENU_DIR }}/mne_sys_info.py" + ], + "activate": true, + "terminal": true, + "platforms": { + "win": { + "desktop": false + }, + "linux": { + "Categories": [ + "Science" + ] + }, + "osx": { + "CFBundleName": "System Information (MNE-Python __PKG_VERSION__)", + "CFBundleDisplayName": "System Information (MNE-Python __PKG_VERSION__)", + "CFBundleVersion": "__PKG_VERSION__" + } + } + }, + { + "name": "Prompt (MNE)", + "description": "MNE-Python console prompt", + "icon": "{{ MENU_DIR }}/mne_console.{{ ICON_EXT }}", + "activate": true, + "terminal": true, + "command": ["will be overridden in platforms section"], + "platforms": { + "win": { + "command": [ + "%SystemRoot%\\system32\\cmd.exe", + "/K", + "{{ MENU_DIR }}\\mne_open_prompt.bat" + ], + "desktop": false + }, + "linux": { + "command": [ + "exec", + "bash", + "--init-file", + "{{ MENU_DIR }}/mne_open_prompt.sh" + ], + "Categories": [ + "Science" + ] + }, + "osx": { + "command": [ + "osascript", + "{{ MENU_DIR }}/mne_open_prompt.applescript" + ], + "CFBundleName": "Prompt (MNE-Python __PKG_VERSION__)", + "CFBundleDisplayName": "Prompt (MNE-Python __PKG_VERSION__)", + "CFBundleVersion": "__PKG_VERSION__" + } + } + }, + { + "name": "Tutorials (MNE)", + "description": "MNE-Python online tutorials", + "icon": "{{ MENU_DIR }}/mne_web.{{ ICON_EXT }}", + "activate": false, + "terminal": false, + "command": ["will be overridden in platforms section"], + "platforms": { + "win": { + "command": [ + "%SystemRoot%\\system32\\WindowsPowerShell\\v1.0\\powershell.exe", + "\"start https://mne.tools/stable/auto_tutorials -WindowStyle hidden\"" + ], + "desktop": false + }, + "linux": { + "command": [ + "xdg-open", + "https://mne.tools/stable/auto_tutorials/" + ], + "Categories": [ + "Science" + ] + }, + "osx": { + "command": [ + "open", + "https://mne.tools/stable/auto_tutorials/" + ], + "CFBundleName": "Tutorials (MNE-Python __PKG_VERSION__)", + "CFBundleDisplayName": "Tutorials (MNE-Python __PKG_VERSION__)", + "CFBundleVersion": "__PKG_VERSION__" + } + } + }, + { + "name": "User Forum (MNE)", + "description": "MNE-Python forum for discussions, problem solving, and information exchange", + "icon": "{{ MENU_DIR }}/mne_forum.{{ ICON_EXT }}", + "activate": false, + "terminal": false, + "command": ["will be overridden in platforms section"], + "platforms": { + "win": { + "command": [ + "%SystemRoot%\\system32\\WindowsPowerShell\\v1.0\\powershell.exe", + "\"start https://mne.discourse.group -WindowStyle hidden\"" + ], + "desktop": false + }, + "linux": { + "command": [ + "xdg-open", + "https://mne.discourse.group" + ], + "Categories": [ + "Science" + ] + }, + "osx": { + "command": [ + "open", + "https://mne.discourse.group" + ], + "CFBundleName": "Forum (MNE-Python __PKG_VERSION__)", + "CFBundleDisplayName": "Forum (MNE-Python __PKG_VERSION__)", + "CFBundleVersion": "__PKG_VERSION__" + } + } + }] + } \ No newline at end of file From 48673405380f6ccdaf0fde78d57b17e6c596f13a Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Tue, 17 Sep 2024 17:38:08 +0200 Subject: [PATCH 002/132] implement the rendering --- crates/rattler_menuinst/Cargo.toml | 1 + crates/rattler_menuinst/src/lib.rs | 14 +- crates/rattler_menuinst/src/render.rs | 120 ++++++++++++++++++ ...nuinst__render__test__render_gnuradio.snap | 55 ++++++++ 4 files changed, 188 insertions(+), 2 deletions(-) create mode 100644 crates/rattler_menuinst/src/render.rs create mode 100644 crates/rattler_menuinst/src/snapshots/rattler_menuinst__render__test__render_gnuradio.snap diff --git a/crates/rattler_menuinst/Cargo.toml b/crates/rattler_menuinst/Cargo.toml index b94ef1081..e2e65f957 100644 --- a/crates/rattler_menuinst/Cargo.toml +++ b/crates/rattler_menuinst/Cargo.toml @@ -18,6 +18,7 @@ shlex = { workspace = true } serde_json = { workspace = true } sha1 = "0.10.6" tracing = { workspace = true } +rattler_conda_types = { path="../rattler_conda_types", version = "0.27.2", default-features = false } [dev-dependencies] insta = { workspace = true } \ No newline at end of file diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index 07559a463..96fa6c780 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -1,5 +1,15 @@ -mod macos; +// mod macos; +// mod linux; +mod render; mod schema; -mod linux; pub mod utils; + +#[cfg(test)] +pub mod test { + use std::path::{Path, PathBuf}; + + pub(crate) fn test_data() -> PathBuf { + Path::new(env!("CARGO_MANIFEST_DIR")).join("../../test-data/menuinst") + } +} diff --git a/crates/rattler_menuinst/src/render.rs b/crates/rattler_menuinst/src/render.rs new file mode 100644 index 000000000..f1582ed84 --- /dev/null +++ b/crates/rattler_menuinst/src/render.rs @@ -0,0 +1,120 @@ +//! This should take a serde_json file, render it with all variables and then load it as a MenuInst struct + +use rattler_conda_types::Platform; +use std::{collections::HashMap, path::Path}; + +use crate::schema::MenuInstSchema; + +fn replace_placeholders(mut text: String, replacements: &HashMap) -> String { + for (key, value) in replacements { + let placeholder = format!("{{{{ {} }}}}", key); + text = text.replace(&placeholder, value); + } + text +} + +// +pub fn placeholders( + base_prefix: &Path, + prefix: &Path, + platform: &Platform, + menu_item_location: &Path, +) -> HashMap { + let dist_name = |p: &Path| { + p.parent() + .and_then(|p| p.file_name().map(|s| s.to_string_lossy().to_string())) + .unwrap_or_else(|| "empty".to_string()) + }; + + let (python, base_python) = if platform.is_windows() { + (prefix.join("python.exe"), base_prefix.join("python.exe")) + } else { + (prefix.join("bin/python"), base_prefix.join("bin/python")) + }; + + let mut vars = HashMap::from([ + ("BASE_PREFIX", base_prefix.to_path_buf()), + ("PREFIX", prefix.to_path_buf()), + ("PYTHON", python), + ("BASE_PYTHON", base_python), + ("MENU_DIR", prefix.join("menu")), + ( + "HOME", + dirs::home_dir() + .map(|p| p.to_path_buf()) + .unwrap_or_default(), + ), + ]); + + if platform.is_windows() { + vars.insert("BIN_DIR", prefix.join("Library/bin")); + vars.insert("SCRIPTS_DIR", prefix.join("Scripts")); + vars.insert("BASE_PYTHONW", base_prefix.join("pythonw.exe")); + vars.insert("PYTHONW", prefix.join("pythonw.exe")); + } else { + vars.insert("BIN_DIR", prefix.join("bin")); + } + + if platform.is_osx() { + vars.insert("PYTHONAPP", prefix.join("python.app/Contents/MacOS/python")); + } + + vars.insert("MENU_ITEM_LOCATION", menu_item_location.to_path_buf()); + + let mut vars: HashMap = vars + .into_iter() + .map(|(k, v)| (k.to_string(), v.to_string_lossy().to_string())) + .collect(); + + let icon_ext = if platform.is_windows() { + "ico" + } else if platform.is_osx() { + "icns" + } else { + "png" + }; + vars.insert("ICON_EXT".to_string(), icon_ext.to_string()); + + vars.insert("DISTRIBUTION_NAME".to_string(), dist_name(prefix)); + vars.insert("ENV_NAME".to_string(), dist_name(prefix)); + + // TODO: (missing!) PY_VER, SP_DIR + + vars +} + +// +pub fn render( + file: &Path, + variables: &HashMap, +) -> Result { + let text = std::fs::read_to_string(file)?; + let text = replace_placeholders(text, variables); + + let menu_inst: MenuInstSchema = serde_json::from_str(&text)?; + + Ok(menu_inst) +} + +#[cfg(test)] +mod test { + use std::path::Path; + + use crate::render::render; + + #[test] + fn test_render_gnuradio() { + let test_data = crate::test::test_data(); + let schema_path = test_data.join("gnuradio/gnuradio-grc.json"); + + let placeholders = crate::render::placeholders( + Path::new("/home/base_prefix"), + Path::new("/home/prefix"), + &rattler_conda_types::Platform::Linux64, + Path::new("/menu_item_location"), + ); + + let schema = render(&schema_path, &placeholders).unwrap(); + insta::assert_debug_snapshot!(schema); + } +} diff --git a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__render__test__render_gnuradio.snap b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__render__test__render_gnuradio.snap new file mode 100644 index 000000000..8a1070021 --- /dev/null +++ b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__render__test__render_gnuradio.snap @@ -0,0 +1,55 @@ +--- +source: crates/rattler_menuinst/src/render.rs +expression: schema +--- +MenuInstSchema { + id: "https://schemas.conda.io/menuinst-1.schema.json", + schema: "https://json-schema.org/draft-07/schema", + menu_name: "home", + menu_items: [ + MenuItem { + name: "GNU Radio Companion", + description: "Flowgraph builder for GNU Radio", + command: [ + "/home/prefix/bin/gnuradio-companion", + ], + icon: Some( + "/home/prefix/menu/grc.png", + ), + precommand: None, + precreate: None, + working_dir: None, + activate: None, + terminal: None, + platforms: Platforms { + linux: None, + osx: None, + win: Some( + Windows { + base: BasePlatformSpecific { + name: None, + description: None, + icon: None, + command: None, + working_dir: None, + precommand: None, + precreate: None, + activate: None, + terminal: None, + }, + desktop: Some( + false, + ), + quicklaunch: Some( + false, + ), + terminal_profile: None, + url_protocols: None, + file_extensions: None, + app_user_model_id: None, + }, + ), + }, + }, + ], +} From 1e103d14bfb80c0de620cd548e901b179cd384b0 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Fri, 20 Sep 2024 13:50:59 +0200 Subject: [PATCH 003/132] continue menuinst --- crates/rattler_menuinst/Cargo.toml | 5 +- crates/rattler_menuinst/src/lib.rs | 61 ++- crates/rattler_menuinst/src/linux.rs | 502 ++++++++++++++++------- crates/rattler_menuinst/src/macos.rs | 455 ++++++-------------- crates/rattler_menuinst/src/macos_old.rs | 393 ++++++++++++++++++ crates/rattler_menuinst/src/render.rs | 23 +- crates/rattler_menuinst/src/schema.rs | 179 ++++---- crates/rattler_menuinst/src/slugify.rs | 52 +++ 8 files changed, 1097 insertions(+), 573 deletions(-) create mode 100644 crates/rattler_menuinst/src/macos_old.rs create mode 100644 crates/rattler_menuinst/src/slugify.rs diff --git a/crates/rattler_menuinst/Cargo.toml b/crates/rattler_menuinst/Cargo.toml index e2e65f957..44b17154a 100644 --- a/crates/rattler_menuinst/Cargo.toml +++ b/crates/rattler_menuinst/Cargo.toml @@ -19,6 +19,9 @@ serde_json = { workspace = true } sha1 = "0.10.6" tracing = { workspace = true } rattler_conda_types = { path="../rattler_conda_types", version = "0.27.2", default-features = false } +thiserror = { workspace = true } +unicode-normalization = "0.1.24" +regex.workspace = true [dev-dependencies] -insta = { workspace = true } \ No newline at end of file +insta = { workspace = true } diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index 96fa6c780..9773e2a26 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -1,10 +1,67 @@ -// mod macos; -// mod linux; +use std::path::Path; + +use rattler_conda_types::Platform; + +mod linux; +mod macos; mod render; mod schema; +pub mod slugify; +pub use slugify::slugify; + pub mod utils; +#[derive(Debug, Eq, PartialEq)] +pub enum MenuMode { + System, + User, +} + +#[derive(thiserror::Error, Debug)] +pub enum MenuInstError { + #[error("IO error: {0}")] + IoError(#[from] std::io::Error), + #[error("Deserialization error: {0}")] + SerdeError(#[from] serde_json::Error), + + #[error("Failed to install menu item: {0}")] + InstallError(String), + + #[error("Failed to create plist: {0}")] + PlistError(#[from] plist::Error), +} + +// Install menu items from a given schema file +pub fn install_menuitems( + file: &Path, + prefix: &Path, + base_prefix: &Path, + platform: &Platform, +) -> Result<(), MenuInstError> { + let placeholders = render::placeholders(base_prefix, prefix, platform); + + let schema = render::render(file, &placeholders)?; + + for item in schema.menu_items { + if item.platforms.linux.is_some() && platform.is_linux() { + let mut linux_item = item.platforms.linux.clone().unwrap(); + let base_item = linux_item.base.merge_parent(&item); + linux_item.base = base_item; + linux::install_menu_item(linux_item, MenuMode::System)?; + } else if item.platforms.osx.is_some() && platform.is_osx() { + let mut macos_item = item.platforms.osx.clone().unwrap(); + let base_item = macos_item.base.merge_parent(&item); + macos_item.base = base_item; + macos::install_menu_item(macos_item, MenuMode::System)?; + } else if item.platforms.win.is_some() && platform.is_windows() { + // windows::install_menu_item(&item)?; + } + } + + Ok(()) +} + #[cfg(test)] pub mod test { use std::path::{Path, PathBuf}; diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index c16d8d40c..594118d5b 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -1,204 +1,400 @@ -use std::collections::HashMap; -use std::env; -use std::fs::{self, File}; +// use std::collections::HashMap; +// use std::env; +// use std::fs::{self, File}; use std::io::Write; -use std::path::{Path, PathBuf}; -use std::process::Command; +// use std::path::{Path, PathBuf}; +// use std::process::Command; -use chrono::Local; -use log::{debug, warn}; -use regex::Regex; -use serde::{Deserialize, Serialize}; -use tempfile::TempDir; -use xmltree::{Element, XMLNode}; +// use chrono::Local; +// use log::{debug, warn}; +// use regex::Regex; +// use serde::{Deserialize, Serialize}; +// use tempfile::TempDir; +// use xmltree::{Element, XMLNode}; -// Assuming these are defined elsewhere -use crate::utils::{UnixLex, add_xml_child, indent_xml_tree, logged_run, unlink}; -use crate::base::{Menu, MenuItem, menuitem_defaults}; +// // Assuming these are defined elsewhere +// use crate::utils::{UnixLex, add_xml_child, indent_xml_tree, logged_run, unlink}; +// use crate::base::{Menu, MenuItem, menuitem_defaults}; + +use std::{fs::File, path::PathBuf}; + +use rattler_conda_types::Platform; + +use crate::MenuMode; +use crate::{schema::Linux, MenuInstError}; -#[derive(Debug)] pub struct LinuxMenu { - name: String, - mode: String, + item: Linux, + directories: Directories, +} + +pub struct Directories { config_directory: PathBuf, data_directory: PathBuf, system_menu_config_location: PathBuf, - menu_config_location: PathBuf, - directory_entry_location: PathBuf, desktop_entries_location: PathBuf, } -impl LinuxMenu { - pub fn new(name: String, mode: String) -> Self { +impl Directories { + fn new(mode: MenuMode) -> Self { let system_config_directory = PathBuf::from("/etc/xdg/"); let system_data_directory = PathBuf::from("/usr/share"); - let (config_directory, data_directory) = if mode == "system" { - (system_config_directory.clone(), system_data_directory.clone()) + let (config_directory, data_directory) = if mode == MenuMode::System { + ( + system_config_directory.clone(), + system_data_directory.clone(), + ) } else { ( - PathBuf::from(env::var("XDG_CONFIG_HOME").unwrap_or_else(|_| "~/.config".to_string())), - PathBuf::from(env::var("XDG_DATA_HOME").unwrap_or_else(|_| "~/.local/share".to_string())), + PathBuf::from( + std::env::var("XDG_CONFIG_HOME").unwrap_or_else(|_| "~/.config".to_string()), + ), + PathBuf::from( + std::env::var("XDG_DATA_HOME").unwrap_or_else(|_| "~/.local/share".to_string()), + ), ) }; - LinuxMenu { - name, - mode, + Directories { config_directory: config_directory.clone(), data_directory: data_directory.clone(), - system_menu_config_location: system_config_directory.join("menus").join("applications.menu"), - menu_config_location: config_directory.join("menus").join("applications.menu"), - directory_entry_location: data_directory.join("desktop-directories").join(format!("{}.directory", Self::render(&name, true))), + system_menu_config_location: system_config_directory + .join("menus") + .join("applications.menu"), desktop_entries_location: data_directory.join("applications"), } } +} - pub fn create(&self) -> Vec { - self.ensure_directories_exist(); - let path = self.write_directory_entry(); - if self.is_valid_menu_file() && self.has_this_menu() { - return vec![path]; +impl LinuxMenu { + fn new(item: Linux, mode: MenuMode) -> Self { + LinuxMenu { + item, + directories: Directories::new(mode), } - self.ensure_menu_file(); - self.add_this_menu(); - vec![path] } - pub fn remove(&self) -> Vec { - for entry in fs::read_dir(&self.desktop_entries_location).unwrap() { - let entry = entry.unwrap(); - let file_name = entry.file_name(); - if file_name.to_str().unwrap().starts_with(&format!("{}_", Self::render(&self.name, true))) { - // found one shortcut, so don't remove the name from menu - return vec![self.directory_entry_location.clone()]; - } - } - unlink(&self.directory_entry_location, true); - self.remove_this_menu(); - vec![self.directory_entry_location.clone()] + fn location(&self) -> PathBuf { + // TODO: The Python implementation uses one more variable + let filename = format!("{}.desktop", self.item.base.name); + self.directories.desktop_entries_location.join(filename) } - fn ensure_directories_exist(&self) { - let paths = vec![ - self.config_directory.join("menus"), - self.data_directory.join("desktop-directories"), - self.data_directory.join("applications"), - ]; - for path in paths { - debug!("Ensuring path {:?} exists", path); - fs::create_dir_all(path).unwrap(); + /// Logic to run before the shortcut files are created. + fn pre_create(&self) -> Result<(), MenuInstError> { + if Platform::current().is_windows() { + // TODO: return error + return Ok(()); } - } + Ok(()) - fn write_directory_entry(&self) -> PathBuf { - let content = format!( - "[Desktop Entry]\nType=Directory\nEncoding=UTF-8\nName={}", - Self::render(&self.name, false) - ); - debug!("Writing directory entry at {:?}", self.directory_entry_location); - fs::write(&self.directory_entry_location, content).unwrap(); - self.directory_entry_location.clone() - } + // precreate_code = self.item.precreate.unwrap_or(sel.) + // if not precreate_code: + // return - fn remove_this_menu(&self) { - debug!("Editing {:?} to remove {} config", self.menu_config_location, Self::render(&self.name, false)); - let mut doc = Element::parse(fs::read_to_string(&self.menu_config_location).unwrap().as_bytes()).unwrap(); - doc.children.retain(|child| { - if let XMLNode::Element(element) = child { - if element.name == "Menu" { - if let Some(name_element) = element.get_child("Name") { - return name_element.get_text() != Some(Self::render(&self.name, false)); - } - } - } - true - }); - self.write_menu_file(&doc); + // with NamedTemporaryFile(delete=False, mode="w") as tmp: + // tmp.write(precreate_code) + // if precreate_code.startswith("#!"): + // os.chmod(tmp.name, 0o755) + // cmd = [tmp.name] + // else: + // cmd = ["bash", tmp.name] + // logged_run(cmd, check=True) + // os.unlink(tmp.name) } - fn has_this_menu(&self) -> bool { - let doc = Element::parse(fs::read_to_string(&self.menu_config_location).unwrap().as_bytes()).unwrap(); - doc.children.iter().any(|child| { - if let XMLNode::Element(element) = child { - if element.name == "Menu" { - if let Some(name_element) = element.get_child("Name") { - return name_element.get_text() == Some(Self::render(&self.name, false)); - } - } - } - false - }) - } + // def _write_desktop_file(self): + // lines = [ + // "[Desktop Entry]", + // "Type=Application", + // "Encoding=UTF-8", + // f'Name={self.render_key("name")}', + // f"Exec={self._command()}", + // f'Terminal={str(self.render_key("terminal")).lower()}', + // ] - fn add_this_menu(&self) { - debug!("Editing {:?} to add {} config", self.menu_config_location, Self::render(&self.name, false)); - let mut doc = Element::parse(fs::read_to_string(&self.menu_config_location).unwrap().as_bytes()).unwrap(); - let mut menu_element = Element::new("Menu"); - add_xml_child(&mut menu_element, "Name", Self::render(&self.name, false)); - add_xml_child(&mut menu_element, "Directory", format!("{}.directory", Self::render(&self.name, true))); - let mut inc_element = Element::new("Include"); - add_xml_child(&mut inc_element, "Category", Self::render(&self.name, false)); - menu_element.children.push(XMLNode::Element(inc_element)); - doc.children.push(XMLNode::Element(menu_element)); - self.write_menu_file(&doc); - } + // icon = self.render_key("icon") + // if icon: + // lines.append(f'Icon={self.render_key("icon")}') - fn is_valid_menu_file(&self) -> bool { - if let Ok(content) = fs::read_to_string(&self.menu_config_location) { - if let Ok(doc) = Element::parse(content.as_bytes()) { - return doc.name == "Menu"; - } - } - false - } + // description = self.render_key("description") + // if description: + // lines.append(f'Comment={self.render_key("description")}') - fn write_menu_file(&self, doc: &Element) { - debug!("Writing {:?}", self.menu_config_location); - indent_xml_tree(doc); - let mut file = File::create(&self.menu_config_location).unwrap(); - writeln!(file, r#""#).unwrap(); - doc.write(&mut file).unwrap(); - writeln!(file).unwrap(); - } + // working_dir = self.render_key("working_dir") + // if working_dir: + // Path(working_dir).mkdir(parents=True, exist_ok=True) + // lines.append(f"Path={working_dir}") + + // for key in menuitem_defaults["platforms"]["linux"]: + // if key in (*menuitem_defaults, "glob_patterns"): + // continue + // value = self.render_key(key) + // if value is None: + // continue + // if isinstance(value, bool): + // value = str(value).lower() + // elif isinstance(value, (list, tuple)): + // value = ";".join(value) + ";" + // lines.append(f"{key}={value}") - fn ensure_menu_file(&self) { - if self.menu_config_location.exists() && !self.menu_config_location.is_file() { - panic!("Menu config location {:?} is not a file!", self.menu_config_location); + // with open(self.location, "w") as f: + // f.write("\n".join(lines)) + // f.write("\n") + + fn create_desktop_entry(&self) -> Result<(), MenuInstError> { + let file = self.location(); + let writer = File::create(&file)?; + let mut writer = std::io::BufWriter::new(writer); + + writeln!(writer, "[Desktop Entry]")?; + writeln!(writer, "Type=Application")?; + writeln!(writer, "Encoding=UTF-8")?; + writeln!(writer, "Name={}", self.item.base.name)?; + writeln!(writer, "Exec={}", self.item.base.command.join(" "))?; + writeln!( + writer, + "Terminal={}", + self.item.base.terminal.unwrap_or(false) + )?; + + if let Some(icon) = &self.item.base.icon { + writeln!(writer, "Icon={icon}")?; } - if self.menu_config_location.is_file() { - let cur_time = Local::now().format("%Y-%m-%d_%Hh%Mm%S").to_string(); - let backup_menu_file = format!("{}.{}", self.menu_config_location.display(), cur_time); - fs::copy(&self.menu_config_location, backup_menu_file).unwrap(); + if !self.item.base.description.is_empty() { + writeln!(writer, "Comment={}", self.item.base.description)?; + } - if !self.is_valid_menu_file() { - fs::remove_file(&self.menu_config_location).unwrap(); - } - } else { - self.new_menu_file(); + if let Some(working_dir) = &self.item.base.working_dir { + writeln!(writer, "Path={working_dir}")?; } + + // TODO write the rest of the stuff. + + Ok(()) } - fn new_menu_file(&self) { - debug!("Creating {:?}", self.menu_config_location); - let mut content = String::from("Applications"); - if self.mode == "user" { - content.push_str(&format!(r#"{}"#, self.system_menu_config_location.display())); + fn register_mime_types(&self) -> Result<(), MenuInstError> { + if self.item.mime_type.is_none() { + return Ok(()); } - content.push_str("\n"); - fs::write(&self.menu_config_location, content).unwrap(); + let mime_type = self.item.mime_type.as_ref().unwrap(); + if mime_type.is_empty() { + return Ok(()); + } + + Ok(()) } + // def _maybe_register_mime_types(self, register=True): + // mime_types = self.render_key("MimeType") + // if not mime_types: + // return + // self._register_mime_types(mime_types, register=register) - fn render(name: &str, slug: bool) -> String { - // Implement rendering logic here - if slug { - name.to_lowercase().replace(" ", "-") - } else { - name.to_string() - } + fn install(&self) -> Result<(), MenuInstError> { + self.pre_create()?; + + Ok(()) + } + + fn remove(&self) -> Result<(), MenuInstError> { + Ok(()) } } -// Implement LinuxMenuItem struct and its methods similarly... +pub fn install_menu_item(item: Linux, menu_mode: MenuMode) -> Result<(), MenuInstError> { + let menu = LinuxMenu::new(item.clone(), menu_mode); + menu.install()?; + println!("{:?}", menu.location()); + println!("{:?}", menu.directories.config_directory); + Ok(()) +} + +// #[derive(Debug)] +// pub struct LinuxMenu { +// name: String, +// mode: String, +// config_directory: PathBuf, +// data_directory: PathBuf, +// system_menu_config_location: PathBuf, +// menu_config_location: PathBuf, +// directory_entry_location: PathBuf, +// desktop_entries_location: PathBuf, +// } + +// impl LinuxMenu { +// pub fn new(name: String, mode: String) -> Self { +// let system_config_directory = PathBuf::from("/etc/xdg/"); +// let system_data_directory = PathBuf::from("/usr/share"); + +// let (config_directory, data_directory) = if mode == "system" { +// (system_config_directory.clone(), system_data_directory.clone()) +// } else { +// ( +// PathBuf::from(env::var("XDG_CONFIG_HOME").unwrap_or_else(|_| "~/.config".to_string())), +// PathBuf::from(env::var("XDG_DATA_HOME").unwrap_or_else(|_| "~/.local/share".to_string())), +// ) +// }; + +// LinuxMenu { +// name, +// mode, +// config_directory: config_directory.clone(), +// data_directory: data_directory.clone(), +// system_menu_config_location: system_config_directory.join("menus").join("applications.menu"), +// menu_config_location: config_directory.join("menus").join("applications.menu"), +// directory_entry_location: data_directory.join("desktop-directories").join(format!("{}.directory", Self::render(&name, true))), +// desktop_entries_location: data_directory.join("applications"), +// } +// } + +// pub fn create(&self) -> Vec { +// self.ensure_directories_exist(); +// let path = self.write_directory_entry(); +// if self.is_valid_menu_file() && self.has_this_menu() { +// return vec![path]; +// } +// self.ensure_menu_file(); +// self.add_this_menu(); +// vec![path] +// } + +// pub fn remove(&self) -> Vec { +// for entry in fs::read_dir(&self.desktop_entries_location).unwrap() { +// let entry = entry.unwrap(); +// let file_name = entry.file_name(); +// if file_name.to_str().unwrap().starts_with(&format!("{}_", Self::render(&self.name, true))) { +// // found one shortcut, so don't remove the name from menu +// return vec![self.directory_entry_location.clone()]; +// } +// } +// unlink(&self.directory_entry_location, true); +// self.remove_this_menu(); +// vec![self.directory_entry_location.clone()] +// } + +// fn ensure_directories_exist(&self) { +// let paths = vec![ +// self.config_directory.join("menus"), +// self.data_directory.join("desktop-directories"), +// self.data_directory.join("applications"), +// ]; +// for path in paths { +// debug!("Ensuring path {:?} exists", path); +// fs::create_dir_all(path).unwrap(); +// } +// } + +// fn write_directory_entry(&self) -> PathBuf { +// let content = format!( +// "[Desktop Entry]\nType=Directory\nEncoding=UTF-8\nName={}", +// Self::render(&self.name, false) +// ); +// debug!("Writing directory entry at {:?}", self.directory_entry_location); +// fs::write(&self.directory_entry_location, content).unwrap(); +// self.directory_entry_location.clone() +// } + +// fn remove_this_menu(&self) { +// debug!("Editing {:?} to remove {} config", self.menu_config_location, Self::render(&self.name, false)); +// let mut doc = Element::parse(fs::read_to_string(&self.menu_config_location).unwrap().as_bytes()).unwrap(); +// doc.children.retain(|child| { +// if let XMLNode::Element(element) = child { +// if element.name == "Menu" { +// if let Some(name_element) = element.get_child("Name") { +// return name_element.get_text() != Some(Self::render(&self.name, false)); +// } +// } +// } +// true +// }); +// self.write_menu_file(&doc); +// } + +// fn has_this_menu(&self) -> bool { +// let doc = Element::parse(fs::read_to_string(&self.menu_config_location).unwrap().as_bytes()).unwrap(); +// doc.children.iter().any(|child| { +// if let XMLNode::Element(element) = child { +// if element.name == "Menu" { +// if let Some(name_element) = element.get_child("Name") { +// return name_element.get_text() == Some(Self::render(&self.name, false)); +// } +// } +// } +// false +// }) +// } + +// fn add_this_menu(&self) { +// debug!("Editing {:?} to add {} config", self.menu_config_location, Self::render(&self.name, false)); +// let mut doc = Element::parse(fs::read_to_string(&self.menu_config_location).unwrap().as_bytes()).unwrap(); +// let mut menu_element = Element::new("Menu"); +// add_xml_child(&mut menu_element, "Name", Self::render(&self.name, false)); +// add_xml_child(&mut menu_element, "Directory", format!("{}.directory", Self::render(&self.name, true))); +// let mut inc_element = Element::new("Include"); +// add_xml_child(&mut inc_element, "Category", Self::render(&self.name, false)); +// menu_element.children.push(XMLNode::Element(inc_element)); +// doc.children.push(XMLNode::Element(menu_element)); +// self.write_menu_file(&doc); +// } + +// fn is_valid_menu_file(&self) -> bool { +// if let Ok(content) = fs::read_to_string(&self.menu_config_location) { +// if let Ok(doc) = Element::parse(content.as_bytes()) { +// return doc.name == "Menu"; +// } +// } +// false +// } + +// fn write_menu_file(&self, doc: &Element) { +// debug!("Writing {:?}", self.menu_config_location); +// indent_xml_tree(doc); +// let mut file = File::create(&self.menu_config_location).unwrap(); +// writeln!(file, r#""#).unwrap(); +// doc.write(&mut file).unwrap(); +// writeln!(file).unwrap(); +// } + +// fn ensure_menu_file(&self) { +// if self.menu_config_location.exists() && !self.menu_config_location.is_file() { +// panic!("Menu config location {:?} is not a file!", self.menu_config_location); +// } + +// if self.menu_config_location.is_file() { +// let cur_time = Local::now().format("%Y-%m-%d_%Hh%Mm%S").to_string(); +// let backup_menu_file = format!("{}.{}", self.menu_config_location.display(), cur_time); +// fs::copy(&self.menu_config_location, backup_menu_file).unwrap(); + +// if !self.is_valid_menu_file() { +// fs::remove_file(&self.menu_config_location).unwrap(); +// } +// } else { +// self.new_menu_file(); +// } +// } + +// fn new_menu_file(&self) { +// debug!("Creating {:?}", self.menu_config_location); +// let mut content = String::from("Applications"); +// if self.mode == "user" { +// content.push_str(&format!(r#"{}"#, self.system_menu_config_location.display())); +// } +// content.push_str("\n"); +// fs::write(&self.menu_config_location, content).unwrap(); +// } + +// fn render(name: &str, slug: bool) -> String { +// // Implement rendering logic here +// if slug { +// name.to_lowercase().replace(" ", "-") +// } else { +// name.to_string() +// } +// } +// } + +// // Implement LinuxMenuItem struct and its methods similarly... diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index 39e94a38f..5e94cad65 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -1,187 +1,117 @@ -use std::collections::HashMap; -use std::fs::{self, File}; -use std::io::Write; -use std::os::unix::fs::PermissionsExt; -use std::path::{Path, PathBuf}; -use std::process::Command; +use std::{ + fs, + io::Write, + path::{Path, PathBuf}, +}; +use crate::{schema::MacOS, slugify, MenuInstError, MenuMode}; use plist::Value; use sha1::{Digest, Sha1}; -use tracing; - -use crate::utils::unix_lex::UnixLex; - -// use crate::utils::{UnixLex, logged_run}; -// use crate::base::{Menu, MenuItem, menuitem_defaults}; pub struct MacOSMenu { - name: String, - mode: String, - prefix: PathBuf, + item: MacOS, + directories: Directories, } -impl MacOSMenu { - pub fn new(name: String, mode: String, prefix: PathBuf) -> Self { - MacOSMenu { name, mode, prefix } - } - - pub fn create(&self) -> Vec { - self.paths() - } - - pub fn remove(&self) -> Vec { - self.paths() - } - - pub fn placeholders(&self) -> HashMap { - let mut placeholders = HashMap::new(); - placeholders.insert( - "SP_DIR".to_string(), - self.site_packages().to_str().unwrap().to_string(), - ); - placeholders.insert("ICON_EXT".to_string(), "icns".to_string()); - placeholders.insert( - "PYTHONAPP".to_string(), - self.prefix - .join("python.app/Contents/MacOS/python") - .to_str() - .unwrap() - .to_string(), - ); - placeholders - } - - fn paths(&self) -> Vec { - vec![] - } - - fn site_packages(&self) -> PathBuf { - // Implement site-packages directory detection logic here - self.prefix.join("lib/python3.x/site-packages") - } +pub struct Directories { + /// Path to the .app directory defining the menu item + location: PathBuf, + /// Path to the nested .app directory defining the menu item main application + nested_location: PathBuf, } -pub struct MacOSMenuItem { - menu: MacOSMenu, - metadata: HashMap, -} +impl Directories { + pub fn new(menu_mode: MenuMode, bundle_name: &str) -> Self { + let base_location = match menu_mode { + MenuMode::System => PathBuf::from("/"), + MenuMode::User => dirs::home_dir().expect("Failed to get home directory"), + }; -impl MacOSMenuItem { - pub fn new(menu: MacOSMenu, metadata: HashMap) -> Self { - MacOSMenuItem { menu, metadata } - } + let location = base_location.join("Applications").join(bundle_name); + let nested_location = location.join("Contents/Resources").join(bundle_name); - pub fn location(&self) -> PathBuf { - self.base_location() - .join("Applications") - .join(self.bundle_name()) + Self { + location, + nested_location, + } } - fn bundle_name(&self) -> String { - return "foo.app".to_string(); - // format!("{}.app", self.render_key("name", &HashMap::new())) + fn resources(&self) -> PathBuf { + self.location.join("Contents/Resources") } - fn nested_location(&self) -> PathBuf { - self.location() - .join("Contents/Resources") - .join(self.bundle_name()) + fn nested_resources(&self) -> PathBuf { + self.nested_location.join("Contents/Resources") } - fn base_location(&self) -> PathBuf { - // if self.menu.mode == "user" { - // // PathBuf::from(shellexpand::tilde("~").to_string()) - // } else { - // PathBuf::from("/") - // } - PathBuf::from("/FOO") - } + pub fn create_directories(&self, needs_appkit_launcher: bool) -> Result<(), MenuInstError> { + fs::create_dir_all(self.location.join("Contents/Resources"))?; + fs::create_dir_all(self.location.join("Contents/MacOS"))?; - pub fn create(&self) -> Vec { - if self.location().exists() { - panic!("App already exists at {:?}. Please remove the existing shortcut before installing.", self.location()); + if needs_appkit_launcher { + fs::create_dir_all(self.nested_location.join("Contents/Resources"))?; + fs::create_dir_all(self.nested_location.join("Contents/MacOS"))?; } - tracing::debug!("Creating {:?}", self.location()); - self.create_application_tree(); - // self.precreate(); - // self.copy_icon(); - // self.write_pkginfo(); - // self.write_plistinfo(); - // self.write_appkit_launcher(); - // self.write_launcher(); - // self.write_script(); - // self.write_event_handler(); - // self.maybe_register_with_launchservices(); - self.sign_with_entitlements(); - vec![self.location()] - } - pub fn remove(&self) -> Vec { - tracing::debug!("Removing {:?}", self.location()); - self.maybe_register_with_launchservices(false); - fs::remove_dir_all(&self.location()).unwrap(); - vec![self.location()] + Ok(()) } +} - fn create_application_tree(&self) -> Vec { - let mut paths = vec![ - self.location().join("Contents/Resources"), - self.location().join("Contents/MacOS"), - ]; - if self.needs_appkit_launcher() { - paths.push(self.nested_location().join("Contents/Resources")); - paths.push(self.nested_location().join("Contents/MacOS")); - } - for path in &paths { - fs::create_dir_all(path).unwrap(); - } - paths +impl MacOSMenu { + pub fn new(item: MacOS, directories: Directories) -> Self { + Self { item, directories } + } + + /// In macOS, file type and URL protocol associations are handled by the + /// Apple Events system. When the user opens on a file or URL, the system + /// will send an Apple Event to the application that was registered as a handler. + /// We need a special launcher to handle these events and pass them to the + /// wrapped application in the shortcut. + /// + /// See: + /// - + /// - The source code at /src/appkit-launcher in this repository + /// + fn needs_appkit_launcher(&self) -> bool { + self.item.cf_bundle_identifier.is_some() || self.item.cf_bundle_document_types.is_some() } - fn copy_icon(&self) { - if let Some(icon) = self.render_key("icon", &HashMap::new()) { - fs::copy( - &icon, - self.location() - .join("Contents/Resources") - .join(Path::new(&icon).file_name().unwrap()), - ) - .unwrap(); + pub fn install_icon(&self) -> Result<(), MenuInstError> { + if let Some(icon) = self.item.base.icon.as_ref() { + let icon = PathBuf::from(icon); + let icon_name = icon.file_name().expect("Failed to get icon name"); + let dest = self.directories.resources().join(icon_name); + fs::copy(&icon, dest)?; + if self.needs_appkit_launcher() { - fs::copy( - &icon, - self.nested_location() - .join("Contents/Resources") - .join(Path::new(&icon).file_name().unwrap()), - ) - .unwrap(); + let dest = self.directories.nested_resources().join(icon_name); + fs::copy(&icon, dest)?; } } + + Ok(()) } - fn write_pkginfo(&self) { - let app_bundles = if self.needs_appkit_launcher() { - vec![self.location(), self.nested_location()] - } else { - vec![self.location()] + fn write_pkg_info(&self) -> Result<(), MenuInstError> { + let create_pkg_info = |path: &PathBuf, short_name: &str| -> Result<(), MenuInstError> { + let mut f = fs::File::create(path.join("Contents/PkgInfo"))?; + f.write_all(format!("APPL{short_name}").as_bytes())?; + Ok(()) }; - for app in app_bundles { - let mut file = File::create(app.join("Contents/PkgInfo")).unwrap(); - write!(file, "APPL{}", &self.menu.name.to_lowercase()[..8]).unwrap(); - } - } + let short_name = slugify(&self.item.base.name.chars().take(8).collect::()); - fn render(self, value: &str) -> String { - // Implement rendering logic here - value.to_string() + create_pkg_info(&self.directories.location, &short_name)?; + if self.needs_appkit_launcher() { + create_pkg_info(&self.directories.nested_location, &short_name)?; + } + Ok(()) } - fn write_plistinfo(&self) { - let name = self.menu.name.clone(); - // let slugname = self.render_key("name", &[("slug", &true.into())].iter().cloned().collect()); - let name = "foo".to_string(); - let slugname = "foo".to_string(); + fn write_plist(&self) -> Result<(), MenuInstError> { + let name = self.item.base.name.clone(); + let slugname = slugify(&name); + let shortname = if slugname.len() > 16 { let hashed = format!("{:x}", Sha1::digest(slugname.as_bytes())); format!("{}{}", &slugname[..10], &hashed[..6]) @@ -193,201 +123,60 @@ impl MacOSMenuItem { pl.insert("CFBundleName".into(), Value::String(shortname)); pl.insert("CFBundleDisplayName".into(), Value::String(name)); pl.insert("CFBundleExecutable".into(), Value::String(slugname.clone())); - pl.insert("CFBundleGetInfoString".into(), Value::String(format!("{}-1.0.0", slugname))); - pl.insert("CFBundleIdentifier".into(), Value::String(format!("com.{}", slugname))); + pl.insert( + "CFBundleGetInfoString".into(), + Value::String(format!("{}-1.0.0", slugname)), + ); + pl.insert( + "CFBundleIdentifier".into(), + Value::String(format!("com.{}", slugname)), + ); pl.insert("CFBundlePackageType".into(), Value::String("APPL".into())); pl.insert("CFBundleVersion".into(), Value::String("1.0.0".into())); - pl.insert("CFBundleShortVersionString".into(), Value::String("1.0.0".into())); - - let icon = self.render_key("icon", &HashMap::new()); - - // if let Some(icon) = self.render_key("icon", &HashMap::new()) { - // pl.insert("CFBundleIconFile".into(), Value::String(Path::new(&icon).file_name().unwrap().to_str().unwrap().into())); - // } - - if self.needs_appkit_launcher() { - plist::to_file_xml(self.nested_location().join("Contents/Info.plist"), &pl).unwrap(); - pl.insert("LSBackgroundOnly".into(), Value::Boolean(true)); - pl.insert("CFBundleIdentifier".into(), Value::String(format!("com.{}-appkit-launcher", slugname))); - } - - // Override defaults with user provided values - // for key in menuitem_defaults["platforms"]["osx"].keys() { - // if menuitem_defaults.contains_key(key) || key == "entitlements" || key == "link_in_bundle" { - // continue; - // } - // if let Some(value) = self.render_key(key, &HashMap::new()) { - // if key == "CFBundleVersion" { - // pl.insert("CFBundleShortVersionString".into(), Value::String(value.clone())); - // pl.insert("CFBundleGetInfoString".into(), Value::String(format!("{}-{}", slugname, value))); - // } - // pl.insert(key.into(), Value::String(value)); - // } - // } - - plist::to_file_xml(self.location().join("Contents/Info.plist"), &pl).unwrap(); - } - - fn command(&self) -> String { - let mut lines = vec!["#!/bin/sh".to_string()]; - if self.render_key("terminal", &HashMap::new()) == Some("true".to_string()) { - lines.extend_from_slice(&[ - r#"if [ "${__CFBundleIdentifier:-}" != "com.apple.Terminal" ]; then"#.to_string(), - r#" open -b com.apple.terminal "$0""#.to_string(), - r#" exit $?"#.to_string(), - "fi".to_string(), - ]); - } - - // if let Some(working_dir) = self.render_key("working_dir", &HashMap::new()) { - // fs::create_dir_all(shellexpand::full(&working_dir).unwrap().to_string()).unwrap(); - // lines.push(format!(r#"cd "{}""#, working_dir)); - // } - - if let Some(precommand) = self.render_key("precommand", &HashMap::new()) { - lines.push(precommand); - } + pl.insert( + "CFBundleShortVersionString".into(), + Value::String("1.0.0".into()), + ); - if self.metadata.get("activate") == Some(&Value::Boolean(true)) { - let conda_exe = &self.menu.prefix.join("bin/conda"); - // let activate = if self.menu.is_micromamba(conda_exe) { "shell activate" } else { "shell.bash activate" }; - // lines.push(format!(r#"eval "$("{}" {} "{}")""#, conda_exe.display(), activate, self.menu.prefix.display())); + if let Some(icon) = &self.item.base.icon { + // TODO remove unwrap + let icon_name = Path::new(&icon).file_name().unwrap().to_str().unwrap(); + pl.insert("CFBundleIconFile".into(), Value::String(icon_name.into())); } - // lines.push(UnixLex::quote_args(&self.render_key("command", &HashMap::new()).unwrap()).join(" ")); - - lines.join("\n") - } - - fn default_appkit_launcher_path(&self) -> PathBuf { - self.location() - .join("Contents/MacOS") - .join(self.bundle_name()) - } - - fn default_launcher_path(&self, suffix: Option<&str>) -> PathBuf { - let suffix = suffix.unwrap_or(""); - let name = self.render_key("name", &HashMap::new()).unwrap(); if self.needs_appkit_launcher() { - return self - .nested_location() - .join("Contents/MacOS") - .join(format!("{name}{suffix}")); - } - self.location() - .join("Contents/MacOS") - .join(format!("{name}{suffix}")) - } - - fn write_appkit_launcher(&self, launcher_path: Option<&Path>) -> PathBuf { - let launcher_path = launcher_path - .map(PathBuf::from) - .unwrap_or_else(|| self.default_appkit_launcher_path()); - // fs::copy(self.find_appkit_launcher(), launcher_path).unwrap(); - // fs::set_permissions(launcher_path, fs::Permissions::from_mode(0o755)).unwrap(); - launcher_path.to_path_buf() - } - - fn write_launcher(&self, launcher_path: Option<&Path>) -> PathBuf { - let launcher_path = launcher_path - .map(PathBuf::from) - .unwrap_or_else(|| self.default_launcher_path(None)); - // fs::copy(self.find_launcher(), launcher_path).unwrap(); - // fs::set_permissions(launcher_path, fs::Permissions::from_mode(0o755)).unwrap(); - launcher_path.to_path_buf() - } - - fn write_script(&self, script_path: Option<&Path>) -> PathBuf { - let script_path = script_path - .map(PathBuf::from) - .unwrap_or_else(|| self.default_launcher_path(None).with_extension("script")); - fs::write(&script_path, self.command()).unwrap(); - fs::set_permissions(&script_path, fs::Permissions::from_mode(0o755)).unwrap(); - script_path - } - - fn write_event_handler(&self, script_path: Option<&Path>) -> Option { - if !self.needs_appkit_launcher() { - return None; - } - let event_handler_logic = self.render_key("event_handler", &HashMap::new())?; - let script_path = script_path - .map(PathBuf::from) - .unwrap_or_else(|| self.location().join("Contents/Resources/handle-event")); - fs::write( - &script_path, - format!("#!/bin/bash\n{}\n", event_handler_logic), - ) - .unwrap(); - fs::set_permissions(&script_path, fs::Permissions::from_mode(0o755)).unwrap(); - Some(script_path) - } - - fn maybe_register_with_launchservices(&self, register: bool) { - if !self.needs_appkit_launcher() { - return; - } - if register { - lsregister(&["-R", self.location().to_str().unwrap()]); - } else { - lsregister(&["-R", "-u", "-all", self.location().to_str().unwrap()]); - } - } - - fn sign_with_entitlements(&self) { - let entitlements = Vec::::new(); - if entitlements.is_empty() { - return; - } - - let mut plist = plist::Dictionary::new(); - for key in entitlements { - plist.insert(key, Value::Boolean(true)); + plist::to_file_xml( + self.directories.nested_location.join("Contents/Info.plist"), + &pl, + )?; + pl.insert("LSBackgroundOnly".into(), Value::Boolean(true)); + pl.insert( + "CFBundleIdentifier".into(), + Value::String(format!("com.{}-appkit-launcher", slugname)), + ); } - let slugname = self.render_key("name", &[("slug", &true.into())].iter().cloned().collect()); - let entitlements_path = self.location().join("Contents/Entitlements.plist"); - plist::to_file_xml(&entitlements_path, &plist).unwrap(); - - // logged_run( - // &[ - // "/usr/bin/codesign", - // "--verbose", - // "--sign", - // "-", - // "--prefix", - // &format!("com.{}", slugname), - // "--options", - // "runtime", - // "--force", - // "--deep", - // "--entitlements", - // entitlements_path.to_str().unwrap(), - // self.location().to_str().unwrap(), - // ], - // true, - // ).unwrap(); - } - } + plist::to_file_xml(self.directories.location.join("Contents/Info.plist"), &pl)?; - fn needs_appkit_launcher(&self) -> bool { - self.metadata.get("event_handler").is_some() + Ok(()) } - fn render_key(&self, key: &str, extra: &HashMap<&str, Value>) -> Option { - // Implement rendering logic here - self.metadata - .get(key) - .and_then(|v| v.as_string().map(|s| s.to_string())) + pub fn install(&self) -> Result<(), MenuInstError> { + self.directories + .create_directories(self.needs_appkit_launcher())?; + self.install_icon()?; + self.write_pkg_info()?; + Ok(()) } - - // Implement other helper methods... } -fn lsregister(args: &[&str]) { - let exe = "/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister"; - Command::new(exe) - .args(args) - .output() - .expect("Failed to execute lsregister"); +pub(crate) fn install_menu_item( + macos_item: MacOS, + menu_mode: MenuMode, +) -> Result<(), MenuInstError> { + let bundle_name = macos_item.cf_bundle_name.as_ref().unwrap(); + let directories = Directories::new(menu_mode, bundle_name); + + let menu = MacOSMenu::new(macos_item, directories); + menu.install() } diff --git a/crates/rattler_menuinst/src/macos_old.rs b/crates/rattler_menuinst/src/macos_old.rs new file mode 100644 index 000000000..39e94a38f --- /dev/null +++ b/crates/rattler_menuinst/src/macos_old.rs @@ -0,0 +1,393 @@ +use std::collections::HashMap; +use std::fs::{self, File}; +use std::io::Write; +use std::os::unix::fs::PermissionsExt; +use std::path::{Path, PathBuf}; +use std::process::Command; + +use plist::Value; +use sha1::{Digest, Sha1}; +use tracing; + +use crate::utils::unix_lex::UnixLex; + +// use crate::utils::{UnixLex, logged_run}; +// use crate::base::{Menu, MenuItem, menuitem_defaults}; + +pub struct MacOSMenu { + name: String, + mode: String, + prefix: PathBuf, +} + +impl MacOSMenu { + pub fn new(name: String, mode: String, prefix: PathBuf) -> Self { + MacOSMenu { name, mode, prefix } + } + + pub fn create(&self) -> Vec { + self.paths() + } + + pub fn remove(&self) -> Vec { + self.paths() + } + + pub fn placeholders(&self) -> HashMap { + let mut placeholders = HashMap::new(); + placeholders.insert( + "SP_DIR".to_string(), + self.site_packages().to_str().unwrap().to_string(), + ); + placeholders.insert("ICON_EXT".to_string(), "icns".to_string()); + placeholders.insert( + "PYTHONAPP".to_string(), + self.prefix + .join("python.app/Contents/MacOS/python") + .to_str() + .unwrap() + .to_string(), + ); + placeholders + } + + fn paths(&self) -> Vec { + vec![] + } + + fn site_packages(&self) -> PathBuf { + // Implement site-packages directory detection logic here + self.prefix.join("lib/python3.x/site-packages") + } +} + +pub struct MacOSMenuItem { + menu: MacOSMenu, + metadata: HashMap, +} + +impl MacOSMenuItem { + pub fn new(menu: MacOSMenu, metadata: HashMap) -> Self { + MacOSMenuItem { menu, metadata } + } + + pub fn location(&self) -> PathBuf { + self.base_location() + .join("Applications") + .join(self.bundle_name()) + } + + fn bundle_name(&self) -> String { + return "foo.app".to_string(); + // format!("{}.app", self.render_key("name", &HashMap::new())) + } + + fn nested_location(&self) -> PathBuf { + self.location() + .join("Contents/Resources") + .join(self.bundle_name()) + } + + fn base_location(&self) -> PathBuf { + // if self.menu.mode == "user" { + // // PathBuf::from(shellexpand::tilde("~").to_string()) + // } else { + // PathBuf::from("/") + // } + PathBuf::from("/FOO") + } + + pub fn create(&self) -> Vec { + if self.location().exists() { + panic!("App already exists at {:?}. Please remove the existing shortcut before installing.", self.location()); + } + tracing::debug!("Creating {:?}", self.location()); + self.create_application_tree(); + // self.precreate(); + // self.copy_icon(); + // self.write_pkginfo(); + // self.write_plistinfo(); + // self.write_appkit_launcher(); + // self.write_launcher(); + // self.write_script(); + // self.write_event_handler(); + // self.maybe_register_with_launchservices(); + self.sign_with_entitlements(); + vec![self.location()] + } + + pub fn remove(&self) -> Vec { + tracing::debug!("Removing {:?}", self.location()); + self.maybe_register_with_launchservices(false); + fs::remove_dir_all(&self.location()).unwrap(); + vec![self.location()] + } + + fn create_application_tree(&self) -> Vec { + let mut paths = vec![ + self.location().join("Contents/Resources"), + self.location().join("Contents/MacOS"), + ]; + if self.needs_appkit_launcher() { + paths.push(self.nested_location().join("Contents/Resources")); + paths.push(self.nested_location().join("Contents/MacOS")); + } + for path in &paths { + fs::create_dir_all(path).unwrap(); + } + paths + } + + fn copy_icon(&self) { + if let Some(icon) = self.render_key("icon", &HashMap::new()) { + fs::copy( + &icon, + self.location() + .join("Contents/Resources") + .join(Path::new(&icon).file_name().unwrap()), + ) + .unwrap(); + if self.needs_appkit_launcher() { + fs::copy( + &icon, + self.nested_location() + .join("Contents/Resources") + .join(Path::new(&icon).file_name().unwrap()), + ) + .unwrap(); + } + } + } + + fn write_pkginfo(&self) { + let app_bundles = if self.needs_appkit_launcher() { + vec![self.location(), self.nested_location()] + } else { + vec![self.location()] + }; + for app in app_bundles { + let mut file = File::create(app.join("Contents/PkgInfo")).unwrap(); + write!(file, "APPL{}", &self.menu.name.to_lowercase()[..8]).unwrap(); + } + } + + fn render(self, value: &str) -> String { + // Implement rendering logic here + value.to_string() + + } + + fn write_plistinfo(&self) { + let name = self.menu.name.clone(); + // let slugname = self.render_key("name", &[("slug", &true.into())].iter().cloned().collect()); + let name = "foo".to_string(); + let slugname = "foo".to_string(); + let shortname = if slugname.len() > 16 { + let hashed = format!("{:x}", Sha1::digest(slugname.as_bytes())); + format!("{}{}", &slugname[..10], &hashed[..6]) + } else { + slugname.clone() + }; + + let mut pl = plist::Dictionary::new(); + pl.insert("CFBundleName".into(), Value::String(shortname)); + pl.insert("CFBundleDisplayName".into(), Value::String(name)); + pl.insert("CFBundleExecutable".into(), Value::String(slugname.clone())); + pl.insert("CFBundleGetInfoString".into(), Value::String(format!("{}-1.0.0", slugname))); + pl.insert("CFBundleIdentifier".into(), Value::String(format!("com.{}", slugname))); + pl.insert("CFBundlePackageType".into(), Value::String("APPL".into())); + pl.insert("CFBundleVersion".into(), Value::String("1.0.0".into())); + pl.insert("CFBundleShortVersionString".into(), Value::String("1.0.0".into())); + + let icon = self.render_key("icon", &HashMap::new()); + + // if let Some(icon) = self.render_key("icon", &HashMap::new()) { + // pl.insert("CFBundleIconFile".into(), Value::String(Path::new(&icon).file_name().unwrap().to_str().unwrap().into())); + // } + + if self.needs_appkit_launcher() { + plist::to_file_xml(self.nested_location().join("Contents/Info.plist"), &pl).unwrap(); + pl.insert("LSBackgroundOnly".into(), Value::Boolean(true)); + pl.insert("CFBundleIdentifier".into(), Value::String(format!("com.{}-appkit-launcher", slugname))); + } + + // Override defaults with user provided values + // for key in menuitem_defaults["platforms"]["osx"].keys() { + // if menuitem_defaults.contains_key(key) || key == "entitlements" || key == "link_in_bundle" { + // continue; + // } + // if let Some(value) = self.render_key(key, &HashMap::new()) { + // if key == "CFBundleVersion" { + // pl.insert("CFBundleShortVersionString".into(), Value::String(value.clone())); + // pl.insert("CFBundleGetInfoString".into(), Value::String(format!("{}-{}", slugname, value))); + // } + // pl.insert(key.into(), Value::String(value)); + // } + // } + + plist::to_file_xml(self.location().join("Contents/Info.plist"), &pl).unwrap(); + } + + fn command(&self) -> String { + let mut lines = vec!["#!/bin/sh".to_string()]; + if self.render_key("terminal", &HashMap::new()) == Some("true".to_string()) { + lines.extend_from_slice(&[ + r#"if [ "${__CFBundleIdentifier:-}" != "com.apple.Terminal" ]; then"#.to_string(), + r#" open -b com.apple.terminal "$0""#.to_string(), + r#" exit $?"#.to_string(), + "fi".to_string(), + ]); + } + + // if let Some(working_dir) = self.render_key("working_dir", &HashMap::new()) { + // fs::create_dir_all(shellexpand::full(&working_dir).unwrap().to_string()).unwrap(); + // lines.push(format!(r#"cd "{}""#, working_dir)); + // } + + if let Some(precommand) = self.render_key("precommand", &HashMap::new()) { + lines.push(precommand); + } + + if self.metadata.get("activate") == Some(&Value::Boolean(true)) { + let conda_exe = &self.menu.prefix.join("bin/conda"); + // let activate = if self.menu.is_micromamba(conda_exe) { "shell activate" } else { "shell.bash activate" }; + // lines.push(format!(r#"eval "$("{}" {} "{}")""#, conda_exe.display(), activate, self.menu.prefix.display())); + } + + // lines.push(UnixLex::quote_args(&self.render_key("command", &HashMap::new()).unwrap()).join(" ")); + + lines.join("\n") + } + + fn default_appkit_launcher_path(&self) -> PathBuf { + self.location() + .join("Contents/MacOS") + .join(self.bundle_name()) + } + + fn default_launcher_path(&self, suffix: Option<&str>) -> PathBuf { + let suffix = suffix.unwrap_or(""); + let name = self.render_key("name", &HashMap::new()).unwrap(); + if self.needs_appkit_launcher() { + return self + .nested_location() + .join("Contents/MacOS") + .join(format!("{name}{suffix}")); + } + self.location() + .join("Contents/MacOS") + .join(format!("{name}{suffix}")) + } + + fn write_appkit_launcher(&self, launcher_path: Option<&Path>) -> PathBuf { + let launcher_path = launcher_path + .map(PathBuf::from) + .unwrap_or_else(|| self.default_appkit_launcher_path()); + // fs::copy(self.find_appkit_launcher(), launcher_path).unwrap(); + // fs::set_permissions(launcher_path, fs::Permissions::from_mode(0o755)).unwrap(); + launcher_path.to_path_buf() + } + + fn write_launcher(&self, launcher_path: Option<&Path>) -> PathBuf { + let launcher_path = launcher_path + .map(PathBuf::from) + .unwrap_or_else(|| self.default_launcher_path(None)); + // fs::copy(self.find_launcher(), launcher_path).unwrap(); + // fs::set_permissions(launcher_path, fs::Permissions::from_mode(0o755)).unwrap(); + launcher_path.to_path_buf() + } + + fn write_script(&self, script_path: Option<&Path>) -> PathBuf { + let script_path = script_path + .map(PathBuf::from) + .unwrap_or_else(|| self.default_launcher_path(None).with_extension("script")); + fs::write(&script_path, self.command()).unwrap(); + fs::set_permissions(&script_path, fs::Permissions::from_mode(0o755)).unwrap(); + script_path + } + + fn write_event_handler(&self, script_path: Option<&Path>) -> Option { + if !self.needs_appkit_launcher() { + return None; + } + let event_handler_logic = self.render_key("event_handler", &HashMap::new())?; + let script_path = script_path + .map(PathBuf::from) + .unwrap_or_else(|| self.location().join("Contents/Resources/handle-event")); + fs::write( + &script_path, + format!("#!/bin/bash\n{}\n", event_handler_logic), + ) + .unwrap(); + fs::set_permissions(&script_path, fs::Permissions::from_mode(0o755)).unwrap(); + Some(script_path) + } + + fn maybe_register_with_launchservices(&self, register: bool) { + if !self.needs_appkit_launcher() { + return; + } + if register { + lsregister(&["-R", self.location().to_str().unwrap()]); + } else { + lsregister(&["-R", "-u", "-all", self.location().to_str().unwrap()]); + } + } + + fn sign_with_entitlements(&self) { + let entitlements = Vec::::new(); + if entitlements.is_empty() { + return; + } + + let mut plist = plist::Dictionary::new(); + for key in entitlements { + plist.insert(key, Value::Boolean(true)); + } + + let slugname = self.render_key("name", &[("slug", &true.into())].iter().cloned().collect()); + let entitlements_path = self.location().join("Contents/Entitlements.plist"); + plist::to_file_xml(&entitlements_path, &plist).unwrap(); + + // logged_run( + // &[ + // "/usr/bin/codesign", + // "--verbose", + // "--sign", + // "-", + // "--prefix", + // &format!("com.{}", slugname), + // "--options", + // "runtime", + // "--force", + // "--deep", + // "--entitlements", + // entitlements_path.to_str().unwrap(), + // self.location().to_str().unwrap(), + // ], + // true, + // ).unwrap(); + } + } + + fn needs_appkit_launcher(&self) -> bool { + self.metadata.get("event_handler").is_some() + } + + fn render_key(&self, key: &str, extra: &HashMap<&str, Value>) -> Option { + // Implement rendering logic here + self.metadata + .get(key) + .and_then(|v| v.as_string().map(|s| s.to_string())) + } + + // Implement other helper methods... +} + +fn lsregister(args: &[&str]) { + let exe = "/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister"; + Command::new(exe) + .args(args) + .output() + .expect("Failed to execute lsregister"); +} diff --git a/crates/rattler_menuinst/src/render.rs b/crates/rattler_menuinst/src/render.rs index f1582ed84..b6385ca71 100644 --- a/crates/rattler_menuinst/src/render.rs +++ b/crates/rattler_menuinst/src/render.rs @@ -1,24 +1,26 @@ -//! This should take a serde_json file, render it with all variables and then load it as a MenuInst struct +//! This should take a `serde_json` file, render it with all variables and then load it as a `MenuInst` struct use rattler_conda_types::Platform; use std::{collections::HashMap, path::Path}; use crate::schema::MenuInstSchema; +/// Replace placeholders in a string with values from a hashmap +/// This only replaces placeholders in the form of {{ key }} (note: while this looks like a Jinja template, it is not). fn replace_placeholders(mut text: String, replacements: &HashMap) -> String { for (key, value) in replacements { - let placeholder = format!("{{{{ {} }}}}", key); + let placeholder = format!("{{{{ {key} }}}}"); text = text.replace(&placeholder, value); } text } -// +/// Return all placeholders that can be used in the menuinst schema pub fn placeholders( base_prefix: &Path, prefix: &Path, platform: &Platform, - menu_item_location: &Path, + // menu_item_location: &Path, ) -> HashMap { let dist_name = |p: &Path| { p.parent() @@ -38,12 +40,7 @@ pub fn placeholders( ("PYTHON", python), ("BASE_PYTHON", base_python), ("MENU_DIR", prefix.join("menu")), - ( - "HOME", - dirs::home_dir() - .map(|p| p.to_path_buf()) - .unwrap_or_default(), - ), + ("HOME", dirs::home_dir().unwrap_or_default()), ]); if platform.is_windows() { @@ -59,7 +56,7 @@ pub fn placeholders( vars.insert("PYTHONAPP", prefix.join("python.app/Contents/MacOS/python")); } - vars.insert("MENU_ITEM_LOCATION", menu_item_location.to_path_buf()); + // vars.insert("MENU_ITEM_LOCATION", menu_item_location.to_path_buf()); let mut vars: HashMap = vars .into_iter() @@ -83,7 +80,8 @@ pub fn placeholders( vars } -// +/// Render a given menuinst schema file with the given variables and return the `MenuInstSchema` +/// See also: `placeholders` pub fn render( file: &Path, variables: &HashMap, @@ -111,7 +109,6 @@ mod test { Path::new("/home/base_prefix"), Path::new("/home/prefix"), &rattler_conda_types::Platform::Linux64, - Path::new("/menu_item_location"), ); let schema = render(&schema_path, &placeholders).unwrap(); diff --git a/crates/rattler_menuinst/src/schema.rs b/crates/rattler_menuinst/src/schema.rs index f2962cac2..39d392525 100644 --- a/crates/rattler_menuinst/src/schema.rs +++ b/crates/rattler_menuinst/src/schema.rs @@ -9,21 +9,58 @@ pub struct MenuItemNameDict { target_environment_is_not_base: Option, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, Clone)] #[serde(deny_unknown_fields)] pub struct BasePlatformSpecific { - name: Option, - description: Option, - icon: Option, - command: Option>, - working_dir: Option, - precommand: Option, - precreate: Option, - activate: Option, - terminal: Option, + #[serde(default)] + pub name: String, + #[serde(default)] + pub description: String, + pub icon: Option, + #[serde(default)] + pub command: Vec, + pub working_dir: Option, + pub precommand: Option, + pub precreate: Option, + pub activate: Option, + pub terminal: Option, } -#[derive(Serialize, Deserialize, Debug)] +impl BasePlatformSpecific { + pub fn merge_parent(self, parent: &MenuItem) -> Self { + let name = if self.name.is_empty() { + parent.name.clone() + } else { + self.name + }; + + let description = if self.description.is_empty() { + parent.description.clone() + } else { + self.description + }; + + let command = if self.command.is_empty() { + parent.command.clone() + } else { + self.command + }; + + BasePlatformSpecific { + name, + description, + icon: self.icon.or(parent.icon.clone()), + command, + working_dir: self.working_dir.or(parent.working_dir.clone()), + precommand: self.precommand.or(parent.precommand.clone()), + precreate: self.precreate.or(parent.precreate.clone()), + activate: self.activate.or(parent.activate), + terminal: self.terminal.or(parent.terminal), + } + } +} + +#[derive(Serialize, Deserialize, Debug, Clone)] #[serde(deny_unknown_fields)] pub struct Windows { #[serde(flatten)] @@ -36,43 +73,43 @@ pub struct Windows { app_user_model_id: Option, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, Clone)] #[serde(deny_unknown_fields)] pub struct Linux { #[serde(flatten)] - base: BasePlatformSpecific, + pub base: BasePlatformSpecific, #[serde(rename = "Categories")] - categories: Option>, + pub categories: Option>, #[serde(rename = "DBusActivatable")] - dbus_activatable: Option, + pub dbus_activatable: Option, #[serde(rename = "GenericName")] - generic_name: Option, + pub generic_name: Option, #[serde(rename = "Hidden")] - hidden: Option, + pub hidden: Option, #[serde(rename = "Implements")] - implements: Option>, + pub implements: Option>, #[serde(rename = "Keywords")] - keywords: Option>, + pub keywords: Option>, #[serde(rename = "MimeType")] - mime_type: Option>, + pub mime_type: Option>, #[serde(rename = "NoDisplay")] - no_display: Option, + pub no_display: Option, #[serde(rename = "NotShowIn")] - not_show_in: Option>, + pub not_show_in: Option>, #[serde(rename = "OnlyShowIn")] - only_show_in: Option>, + pub only_show_in: Option>, #[serde(rename = "PrefersNonDefaultGPU")] - prefers_non_default_gpu: Option, + pub prefers_non_default_gpu: Option, #[serde(rename = "StartupNotify")] - startup_notify: Option, + pub startup_notify: Option, #[serde(rename = "StartupWMClass")] - startup_wm_class: Option, + pub startup_wm_class: Option, #[serde(rename = "TryExec")] - try_exec: Option, - glob_patterns: Option>, + pub try_exec: Option, + pub glob_patterns: Option>, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, Clone)] #[serde(deny_unknown_fields)] pub struct CFBundleURLTypesModel { #[serde(rename = "CFBundleTypeRole")] @@ -85,7 +122,7 @@ pub struct CFBundleURLTypesModel { cf_bundle_url_icon_file: Option, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, Clone)] #[serde(deny_unknown_fields)] pub struct CFBundleDocumentTypesModel { #[serde(rename = "CFBundleTypeIconFile")] @@ -100,7 +137,7 @@ pub struct CFBundleDocumentTypesModel { ls_handler_rank: String, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, Clone)] #[serde(deny_unknown_fields)] pub struct UTTypeDeclarationModel { #[serde(rename = "UTTypeConformsTo")] @@ -117,80 +154,80 @@ pub struct UTTypeDeclarationModel { ut_type_tag_specification: HashMap>, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, Clone)] #[serde(deny_unknown_fields)] pub struct MacOS { #[serde(flatten)] - base: BasePlatformSpecific, + pub base: BasePlatformSpecific, #[serde(rename = "CFBundleDisplayName")] - cf_bundle_display_name: Option, + pub cf_bundle_display_name: Option, #[serde(rename = "CFBundleIdentifier")] - cf_bundle_identifier: Option, + pub cf_bundle_identifier: Option, #[serde(rename = "CFBundleName")] - cf_bundle_name: Option, + pub cf_bundle_name: Option, #[serde(rename = "CFBundleSpokenName")] - cf_bundle_spoken_name: Option, + pub cf_bundle_spoken_name: Option, #[serde(rename = "CFBundleVersion")] - cf_bundle_version: Option, + pub cf_bundle_version: Option, #[serde(rename = "CFBundleURLTypes")] - cf_bundle_url_types: Option>, + pub cf_bundle_url_types: Option>, #[serde(rename = "CFBundleDocumentTypes")] - cf_bundle_document_types: Option>, + pub cf_bundle_document_types: Option>, #[serde(rename = "LSApplicationCategoryType")] - ls_application_category_type: Option, + pub ls_application_category_type: Option, #[serde(rename = "LSBackgroundOnly")] - ls_background_only: Option, + pub ls_background_only: Option, #[serde(rename = "LSEnvironment")] - ls_environment: Option>, + pub ls_environment: Option>, #[serde(rename = "LSMinimumSystemVersion")] - ls_minimum_system_version: Option, + pub ls_minimum_system_version: Option, #[serde(rename = "LSMultipleInstancesProhibited")] - ls_multiple_instances_prohibited: Option, + pub ls_multiple_instances_prohibited: Option, #[serde(rename = "LSRequiresNativeExecution")] - ls_requires_native_execution: Option, + pub ls_requires_native_execution: Option, #[serde(rename = "NSSupportsAutomaticGraphicsSwitching")] - ns_supports_automatic_graphics_switching: Option, + pub ns_supports_automatic_graphics_switching: Option, #[serde(rename = "UTExportedTypeDeclarations")] - ut_exported_type_declarations: Option>, + pub ut_exported_type_declarations: Option>, #[serde(rename = "UTImportedTypeDeclarations")] - ut_imported_type_declarations: Option>, - entitlements: Option>, - link_in_bundle: Option>, - event_handler: Option, + pub ut_imported_type_declarations: Option>, + pub entitlements: Option>, + pub link_in_bundle: Option>, + pub event_handler: Option, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, Clone)] #[serde(deny_unknown_fields)] pub struct Platforms { - linux: Option, - osx: Option, - win: Option, + pub linux: Option, + pub osx: Option, + pub win: Option, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, Clone)] #[serde(deny_unknown_fields)] pub struct MenuItem { - name: String, - description: String, - command: Vec, - icon: Option, - precommand: Option, - precreate: Option, - working_dir: Option, - activate: Option, - terminal: Option, - platforms: Platforms, + pub name: String, + pub description: String, + pub command: Vec, + pub icon: Option, + pub precommand: Option, + pub precreate: Option, + pub working_dir: Option, + pub activate: Option, + pub terminal: Option, + pub platforms: Platforms, } #[derive(Serialize, Deserialize, Debug)] #[serde(deny_unknown_fields)] pub struct MenuInstSchema { #[serde(rename = "$id")] - id: String, + pub id: String, #[serde(rename = "$schema")] - schema: String, - menu_name: String, - menu_items: Vec, + pub schema: String, + pub menu_name: String, + pub menu_items: Vec, } #[cfg(test)] diff --git a/crates/rattler_menuinst/src/slugify.rs b/crates/rattler_menuinst/src/slugify.rs new file mode 100644 index 000000000..f5bc40984 --- /dev/null +++ b/crates/rattler_menuinst/src/slugify.rs @@ -0,0 +1,52 @@ +use regex::Regex; +use unicode_normalization::UnicodeNormalization; + +pub fn slugify(text: &str) -> String { + // Normalize the text and remove non-ASCII characters + let normalized = text.nfkd().filter(char::is_ascii).collect::(); + + // Remove special characters, convert to lowercase, and trim + let re_special = Regex::new(r"[^\w\s-]").unwrap(); + let without_special = re_special.replace_all(&normalized, "").to_string(); + let trimmed = without_special.trim().to_lowercase(); + + // Replace whitespace and hyphens with a single hyphen + let re_spaces = Regex::new(r"[_\s-]+").unwrap(); + re_spaces.replace_all(&trimmed, "-").to_string() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_basic_slugify() { + assert_eq!(slugify("Hello World"), "hello-world"); + } + + #[test] + fn test_special_characters() { + assert_eq!( + slugify("Hello, World! How are you?"), + "hello-world-how-are-you" + ); + } + + #[test] + fn test_multiple_spaces() { + assert_eq!( + slugify("This has many spaces"), + "this-has-many-spaces" + ); + } + + #[test] + fn test_non_ascii_characters() { + assert_eq!(slugify("Héllö Wörld"), "hello-world"); + } + + #[test] + fn test_leading_trailing_spaces() { + assert_eq!(slugify(" Trim me "), "trim-me"); + } +} From 5f1a6d8dec8242c0dd09a8586579975888411909 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Fri, 20 Sep 2024 19:43:44 +0200 Subject: [PATCH 004/132] try more implementation --- crates/rattler_menuinst/Cargo.toml | 1 + crates/rattler_menuinst/src/lib.rs | 4 +- crates/rattler_menuinst/src/linux.rs | 2 +- crates/rattler_menuinst/src/macos.rs | 352 ++++++++++++++++++++++- crates/rattler_menuinst/src/schema.rs | 1 - crates/rattler_menuinst/src/utils/mod.rs | 10 + 6 files changed, 354 insertions(+), 16 deletions(-) diff --git a/crates/rattler_menuinst/Cargo.toml b/crates/rattler_menuinst/Cargo.toml index 44b17154a..4687a035f 100644 --- a/crates/rattler_menuinst/Cargo.toml +++ b/crates/rattler_menuinst/Cargo.toml @@ -22,6 +22,7 @@ rattler_conda_types = { path="../rattler_conda_types", version = "0.27.2", defau thiserror = { workspace = true } unicode-normalization = "0.1.24" regex.workspace = true +tempfile.workspace = true [dev-dependencies] insta = { workspace = true } diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index 9773e2a26..3bee2a5d5 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -30,6 +30,8 @@ pub enum MenuInstError { #[error("Failed to create plist: {0}")] PlistError(#[from] plist::Error), + #[error("Failed to sign plist: {0}")] + SigningFailed(String), } // Install menu items from a given schema file @@ -53,7 +55,7 @@ pub fn install_menuitems( let mut macos_item = item.platforms.osx.clone().unwrap(); let base_item = macos_item.base.merge_parent(&item); macos_item.base = base_item; - macos::install_menu_item(macos_item, MenuMode::System)?; + macos::install_menu_item(prefix, macos_item, MenuMode::System)?; } else if item.platforms.win.is_some() && platform.is_windows() { // windows::install_menu_item(&item)?; } diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index 594118d5b..53cdfc390 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -145,7 +145,7 @@ impl LinuxMenu { fn create_desktop_entry(&self) -> Result<(), MenuInstError> { let file = self.location(); - let writer = File::create(&file)?; + let writer = File::create(file)?; let mut writer = std::io::BufWriter::new(writer); writeln!(writer, "[Desktop Entry]")?; diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index 5e94cad65..0d9f1ff52 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -1,14 +1,16 @@ +use crate::{schema::MacOS, slugify, utils, MenuInstError, MenuMode}; +use plist::Value; +use sha1::{Digest, Sha1}; use std::{ - fs, - io::Write, + fs::{self, File}, + io::{BufWriter, Write}, + os::unix::fs::PermissionsExt, path::{Path, PathBuf}, + process::Command, }; -use crate::{schema::MacOS, slugify, MenuInstError, MenuMode}; -use plist::Value; -use sha1::{Digest, Sha1}; - pub struct MacOSMenu { + prefix: PathBuf, item: MacOS, directories: Directories, } @@ -58,8 +60,12 @@ impl Directories { } impl MacOSMenu { - pub fn new(item: MacOS, directories: Directories) -> Self { - Self { item, directories } + pub fn new(prefix: &Path, item: MacOS, directories: Directories) -> Self { + Self { + prefix: prefix.to_path_buf(), + item, + directories, + } } /// In macOS, file type and URL protocol associations are handled by the @@ -108,7 +114,7 @@ impl MacOSMenu { Ok(()) } - fn write_plist(&self) -> Result<(), MenuInstError> { + fn write_plist_info(&self) -> Result<(), MenuInstError> { let name = self.item.base.name.clone(); let slugname = slugify(&name); @@ -125,11 +131,11 @@ impl MacOSMenu { pl.insert("CFBundleExecutable".into(), Value::String(slugname.clone())); pl.insert( "CFBundleGetInfoString".into(), - Value::String(format!("{}-1.0.0", slugname)), + Value::String(format!("{slugname}-1.0.0")), ); pl.insert( "CFBundleIdentifier".into(), - Value::String(format!("com.{}", slugname)), + Value::String(format!("com.{slugname}")), ); pl.insert("CFBundlePackageType".into(), Value::String("APPL".into())); pl.insert("CFBundleVersion".into(), Value::String("1.0.0".into())); @@ -152,31 +158,351 @@ impl MacOSMenu { pl.insert("LSBackgroundOnly".into(), Value::Boolean(true)); pl.insert( "CFBundleIdentifier".into(), - Value::String(format!("com.{}-appkit-launcher", slugname)), + Value::String(format!("com.{slugname}-appkit-launcher")), ); } + if let Some(category) = self.item.ls_application_category_type.as_ref() { + pl.insert( + "LSApplicationCategoryType".into(), + Value::String(category.clone()), + ); + } + + if let Some(background_only) = self.item.ls_background_only { + pl.insert("LSBackgroundOnly".into(), Value::Boolean(background_only)); + } + + self.item.ls_environment.as_ref().map(|env| { + let mut env_dict = plist::Dictionary::new(); + for (k, v) in env { + env_dict.insert(k.into(), Value::String(v.into())); + } + pl.insert("LSEnvironment".into(), Value::Dictionary(env_dict)); + }); + + if let Some(version) = self.item.ls_minimum_system_version.as_ref() { + pl.insert( + "LSMinimumSystemVersion".into(), + Value::String(version.clone()), + ); + } + + if let Some(prohibited) = self.item.ls_multiple_instances_prohibited { + pl.insert( + "LSMultipleInstancesProhibited".into(), + Value::Boolean(prohibited), + ); + } + + if let Some(requires_native) = self.item.ls_requires_native_execution { + pl.insert( + "LSRequiresNativeExecution".into(), + Value::Boolean(requires_native), + ); + } + + if let Some(supports) = self.item.ns_supports_automatic_graphics_switching { + pl.insert( + "NSSupportsAutomaticGraphicsSwitching".into(), + Value::Boolean(supports), + ); + } + + self.item + .ut_exported_type_declarations + .as_ref() + .map(|_types| { + // let mut type_array = Vec::new(); + // for t in types { + // let mut type_dict = plist::Dictionary::new(); + // type_dict.insert("UTTypeConformsTo".into(), Value::Array(t.ut_type_conforms_to.iter().map(|s| Value::String(s.clone())).collect())); + // type_dict.insert("UTTypeDescription".into(), Value::String(t.ut_type_description.clone().unwrap_or_default())); + // type_dict.insert("UTTypeIconFile".into(), Value::String(t.ut_type_icon_file.clone().unwrap_or_default())); + // type_dict.insert("UTTypeIdentifier".into(), Value::String(t.ut_type_identifier.clone())); + // type_dict.insert("UTTypeReferenceURL".into(), Value::String(t.ut_type_reference_url.clone().unwrap_or_default())); + // let mut tag_spec = plist::Dictionary::new(); + // for (k, v) in &t.ut_type_tag_specification { + // tag_spec.insert(k.clone(), Value::Array(v.iter().map(|s| Value::String(s.clone())).collect())); + // } + // type_dict.insert("UTTypeTagSpecification".into(), Value::Dictionary(tag_spec)); + // type_array.push(Value::Dictionary(type_dict)); + // } + // pl.insert("UTExportedTypeDeclarations".into(), Value::Array(type_array)); + }); + + self.item + .ut_imported_type_declarations + .as_ref() + .map(|_types| { + // let mut type_array = Vec::new(); + // for t in types { + // let mut type_dict = plist::Dictionary::new(); + // type_dict.insert("UTTypeConformsTo".into(), Value::Array(t.ut_type_conforms_to.iter().map(|s| Value::String(s.clone())).collect())); + // type_dict.insert("UTTypeDescription".into(), Value::String(t.ut_type_description.clone().unwrap_or_default())); + // type_dict.insert("UTTypeIconFile".into(), Value::String(t.ut_type_icon_file.clone().unwrap_or_default())); + // type_dict.insert("UTTypeIdentifier".into(), Value::String(t.ut_type_identifier.clone())); + // type_dict.insert("UTTypeReferenceURL".into(), Value::String(t.ut_type_reference_url.clone().unwrap_or_default())); + // let mut tag_spec = plist::Dictionary::new(); + // for (k, v) in &t.ut_type_tag_specification { + // tag_spec.insert(k.clone(), Value::Array(v.iter().map(|s| Value::String(s.clone())).collect())); + // } + // type_dict.insert("UTTypeTagSpecification".into(), Value::Dictionary(tag_spec)); + // type_array.push(Value::Dictionary(type_dict)); + // } + // pl.insert("UTImportedTypeDeclarations".into(), Value::Array(type_array)); + }); + plist::to_file_xml(self.directories.location.join("Contents/Info.plist"), &pl)?; Ok(()) } + fn sign_with_entitlements(&self) -> Result<(), MenuInstError> { + // write a plist file with the entitlements to the filesystem + let mut entitlements = plist::Dictionary::new(); + if let Some(entitlements_list) = &self.item.entitlements { + for e in entitlements_list { + let parts: Vec<&str> = e.split('=').collect(); + entitlements.insert(parts[0].to_string(), Value::String(parts[1].to_string())); + } + } else { + return Ok(()); + } + + let entitlements_file = self + .directories + .location + .join("Contents/Entitlements.plist"); + let writer = BufWriter::new(File::create(&entitlements_file)?); + plist::to_writer_xml(writer, &entitlements)?; + + // sign the .app directory with the entitlements + let _codesign = std::process::Command::new("codesign") + .arg("--verbose") + .arg("--sign") + .arg("-") + .arg("--force") + .arg("--deep") + .arg("--options") + .arg("runtime") + .arg("--prefix") + .arg(format!("com.{}", slugify(&self.item.base.name))) + .arg("--entitlements") + .arg(&entitlements_file) + .arg(self.directories.location.to_str().unwrap()) + .output()?; + + Ok(()) + } + + fn command(&self) -> String { + let mut lines = vec!["#!/bin/sh".to_string()]; + + if self.item.base.terminal.unwrap_or(false) { + lines.extend_from_slice(&[ + r#"if [ "${__CFBundleIdentifier:-}" != "com.apple.Terminal" ]; then"#.to_string(), + r#" open -b com.apple.terminal "$0""#.to_string(), + r#" exit $?"#.to_string(), + "fi".to_string(), + ]); + } + + if let Some(working_dir) = &self.item.base.working_dir { + fs::create_dir_all(working_dir).expect("Failed to create working directory"); + lines.push(format!(r#"cd "{working_dir}""#)); + } + + if let Some(precommand) = &self.item.base.precommand { + lines.push(precommand.clone()); + } + + // if self.item.base.activate { + // // Assuming these fields exist in your MacOS struct + // let conda_exe = &self.item.conda_exe; + // let prefix = &self.item.prefix; + // let activate = if self.is_micromamba(conda_exe) { + // "shell activate" + // } else { + // "shell.bash activate" + // }; + // lines.push(format!(r#"eval "$("{}" {} "{}")""#, conda_exe, activate, prefix)); + // } + + lines.push(utils::quote_args(&self.item.base.command).join(" ")); + + lines.join("\n") + } + + fn write_appkit_launcher( + &self, + launcher_path: Option, + ) -> Result { + let launcher_path = launcher_path.unwrap_or_else(|| self.default_appkit_launcher_path()); + fs::copy(self.find_appkit_launcher()?, &launcher_path)?; + fs::set_permissions(&launcher_path, fs::Permissions::from_mode(0o755))?; + Ok(launcher_path) + } + + fn write_launcher(&self, launcher_path: Option) -> Result { + let launcher_path = launcher_path.unwrap_or_else(|| self.default_launcher_path()); + fs::copy(self.find_launcher()?, &launcher_path)?; + fs::set_permissions(&launcher_path, fs::Permissions::from_mode(0o755))?; + Ok(launcher_path) + } + + fn write_script(&self, script_path: Option) -> Result { + let script_path = + script_path.unwrap_or_else(|| self.default_launcher_path().with_extension("script")); + let mut file = File::create(&script_path)?; + file.write_all(self.command().as_bytes())?; + fs::set_permissions(&script_path, fs::Permissions::from_mode(0o755))?; + Ok(script_path) + } + + fn write_event_handler( + &self, + script_path: Option, + ) -> Result, MenuInstError> { + if !self.needs_appkit_launcher() { + return Ok(None); + } + + let event_handler_logic = match self.item.event_handler.as_ref() { + Some(logic) => logic, + None => return Ok(None), + }; + + let script_path = script_path.unwrap_or_else(|| { + self.directories + .location + .join("Contents/Resources/handle-event") + }); + + let mut file = File::create(&script_path)?; + file.write_all(format!("#!/bin/bash\n{event_handler_logic}\n").as_bytes())?; + fs::set_permissions(&script_path, fs::Permissions::from_mode(0o755))?; + Ok(Some(script_path)) + } + + /// Find the launcher in the menuinst data path + fn find_launcher(&self) -> Result { + let launcher_name = format!("osx_launcher_{}", std::env::consts::ARCH); + for datapath in utils::menuinst_data_paths(&self.prefix) { + let launcher_path = datapath.join(&launcher_name); + if launcher_path.is_file() + && launcher_path.metadata()?.permissions().mode() & 0o111 != 0 + { + return Ok(launcher_path); + } + } + Err(MenuInstError::InstallError(format!( + "Could not find executable launcher for {}", + std::env::consts::ARCH + ))) + } + + /// Find the appkit launcher in the menuinst data path + fn find_appkit_launcher(&self) -> Result { + let launcher_name = format!("appkit_launcher_{}", std::env::consts::ARCH); + for datapath in utils::menuinst_data_paths(&self.prefix) { + let launcher_path = datapath.join(&launcher_name); + if launcher_path.is_file() + && launcher_path.metadata()?.permissions().mode() & 0o111 != 0 + { + return Ok(launcher_path); + } + } + Err(MenuInstError::InstallError(format!( + "Could not find executable appkit launcher for {}", + std::env::consts::ARCH + ))) + } + + fn default_appkit_launcher_path(&self) -> PathBuf { + let name = slugify(&self.item.base.name); + self.directories.location.join("Contents/MacOS").join(&name) + } + + fn default_launcher_path(&self) -> PathBuf { + let name = slugify(&self.item.base.name); + if self.needs_appkit_launcher() { + self.directories + .nested_location + .join("Contents/MacOS") + .join(&name) + } else { + self.directories.location.join("Contents/MacOS").join(&name) + } + } + + fn maybe_register_with_launchservices(&self, register: bool) -> Result<(), MenuInstError> { + if !self.needs_appkit_launcher() { + return Ok(()); + } + + if register { + self.lsregister(&["-R", self.directories.location.to_str().unwrap()]) + } else { + self.lsregister(&[ + "-R", + "-u", + "-all", + self.directories.location.to_str().unwrap(), + ]) + } + } + + fn lsregister(&self, args: &[&str]) -> Result<(), MenuInstError> { + let exe = "/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister"; + + let output = Command::new(exe).args(args).output().map_err(|e| { + MenuInstError::InstallError(format!("Failed to execute lsregister: {e}")) + })?; + + if !output.status.success() { + return Err(MenuInstError::InstallError(format!( + "lsregister failed with exit code: {}", + output.status + ))); + } + + Ok(()) + } + pub fn install(&self) -> Result<(), MenuInstError> { self.directories .create_directories(self.needs_appkit_launcher())?; self.install_icon()?; self.write_pkg_info()?; + self.write_plist_info()?; + self.write_appkit_launcher(None)?; + self.write_launcher(None)?; + self.write_script(None)?; + self.write_event_handler(None)?; + self.maybe_register_with_launchservices(true)?; + Ok(()) } + + pub fn remove(&self) -> Result, MenuInstError> { + println!("Removing {}", self.directories.location.display()); + self.maybe_register_with_launchservices(false)?; + fs::remove_dir_all(&self.directories.location).unwrap_or_else(|e| { + println!("Failed to remove directory: {e}. Ignoring error."); + }); + Ok(vec![self.directories.location.clone()]) + } } pub(crate) fn install_menu_item( + prefix: &Path, macos_item: MacOS, menu_mode: MenuMode, ) -> Result<(), MenuInstError> { let bundle_name = macos_item.cf_bundle_name.as_ref().unwrap(); let directories = Directories::new(menu_mode, bundle_name); - let menu = MacOSMenu::new(macos_item, directories); + let menu = MacOSMenu::new(prefix, macos_item, directories); menu.install() } diff --git a/crates/rattler_menuinst/src/schema.rs b/crates/rattler_menuinst/src/schema.rs index 39d392525..ab7fb83e0 100644 --- a/crates/rattler_menuinst/src/schema.rs +++ b/crates/rattler_menuinst/src/schema.rs @@ -1,4 +1,3 @@ -use serde; use serde::{Deserialize, Serialize}; use std::collections::HashMap; diff --git a/crates/rattler_menuinst/src/utils/mod.rs b/crates/rattler_menuinst/src/utils/mod.rs index b29b420c7..5f4c51780 100644 --- a/crates/rattler_menuinst/src/utils/mod.rs +++ b/crates/rattler_menuinst/src/utils/mod.rs @@ -1 +1,11 @@ +use std::path::{Path, PathBuf}; + pub mod unix_lex; + +pub fn menuinst_data_paths(prefix: &Path) -> Vec { + vec![prefix.join("share/menuinst")] +} + +pub fn quote_args(args: &[String]) -> Vec { + args.iter().map(|arg| format!(r#""{arg}""#)).collect() +} From a31d54db4e4eeb625093e3d05e7e9114e224c840 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Fri, 20 Sep 2024 21:03:00 +0200 Subject: [PATCH 005/132] first prototype version --- crates/rattler_menuinst/Cargo.toml | 1 + crates/rattler_menuinst/src/lib.rs | 19 + crates/rattler_menuinst/src/macos.rs | 69 +- ...nuinst__render__test__render_gnuradio.snap | 610 +++++++++++++++++- ...t__schema__test__deserialize_gnuradio.snap | 6 +- ...nuinst__schema__test__deserialize_grx.snap | 12 +- ...nuinst__schema__test__deserialize_mne.snap | 188 +++--- test-data/menuinst/mne/menu.json | 10 +- test-data/menuinst/mne_menu/menu/LICENSE.txt | 6 + test-data/menuinst/mne_menu/menu/console.icns | Bin 0 -> 25290 bytes test-data/menuinst/mne_menu/menu/console.ico | Bin 0 -> 165935 bytes test-data/menuinst/mne_menu/menu/console.png | Bin 0 -> 11397 bytes test-data/menuinst/mne_menu/menu/forum.icns | Bin 0 -> 96520 bytes test-data/menuinst/mne_menu/menu/forum.ico | Bin 0 -> 299932 bytes test-data/menuinst/mne_menu/menu/forum.png | Bin 0 -> 15823 bytes test-data/menuinst/mne_menu/menu/info.icns | Bin 0 -> 49946 bytes test-data/menuinst/mne_menu/menu/info.ico | Bin 0 -> 301278 bytes test-data/menuinst/mne_menu/menu/info.png | Bin 0 -> 16668 bytes test-data/menuinst/mne_menu/menu/menu.json | 168 +++++ test-data/menuinst/mne_menu/menu/mne.png | Bin 0 -> 165760 bytes .../menuinst/mne_menu/menu/mne_sys_info.py | 25 + .../mne_menu/menu/open_prompt.applescript | 4 + .../menuinst/mne_menu/menu/open_prompt.bat | 10 + .../menuinst/mne_menu/menu/open_prompt.sh | 10 + test-data/menuinst/mne_menu/menu/spyder.icns | Bin 0 -> 31281 bytes test-data/menuinst/mne_menu/menu/spyder.ico | Bin 0 -> 311358 bytes test-data/menuinst/mne_menu/menu/spyder.png | Bin 0 -> 19403 bytes test-data/menuinst/mne_menu/menu/web.icns | Bin 0 -> 71075 bytes test-data/menuinst/mne_menu/menu/web.ico | Bin 0 -> 310263 bytes test-data/menuinst/mne_menu/menu/web.png | Bin 0 -> 24622 bytes 30 files changed, 986 insertions(+), 152 deletions(-) create mode 100644 test-data/menuinst/mne_menu/menu/LICENSE.txt create mode 100644 test-data/menuinst/mne_menu/menu/console.icns create mode 100644 test-data/menuinst/mne_menu/menu/console.ico create mode 100644 test-data/menuinst/mne_menu/menu/console.png create mode 100644 test-data/menuinst/mne_menu/menu/forum.icns create mode 100644 test-data/menuinst/mne_menu/menu/forum.ico create mode 100644 test-data/menuinst/mne_menu/menu/forum.png create mode 100644 test-data/menuinst/mne_menu/menu/info.icns create mode 100644 test-data/menuinst/mne_menu/menu/info.ico create mode 100644 test-data/menuinst/mne_menu/menu/info.png create mode 100644 test-data/menuinst/mne_menu/menu/menu.json create mode 100644 test-data/menuinst/mne_menu/menu/mne.png create mode 100644 test-data/menuinst/mne_menu/menu/mne_sys_info.py create mode 100644 test-data/menuinst/mne_menu/menu/open_prompt.applescript create mode 100755 test-data/menuinst/mne_menu/menu/open_prompt.bat create mode 100755 test-data/menuinst/mne_menu/menu/open_prompt.sh create mode 100644 test-data/menuinst/mne_menu/menu/spyder.icns create mode 100644 test-data/menuinst/mne_menu/menu/spyder.ico create mode 100644 test-data/menuinst/mne_menu/menu/spyder.png create mode 100644 test-data/menuinst/mne_menu/menu/web.icns create mode 100644 test-data/menuinst/mne_menu/menu/web.ico create mode 100644 test-data/menuinst/mne_menu/menu/web.png diff --git a/crates/rattler_menuinst/Cargo.toml b/crates/rattler_menuinst/Cargo.toml index 4687a035f..0eba52803 100644 --- a/crates/rattler_menuinst/Cargo.toml +++ b/crates/rattler_menuinst/Cargo.toml @@ -23,6 +23,7 @@ thiserror = { workspace = true } unicode-normalization = "0.1.24" regex.workspace = true tempfile.workspace = true +fs-err = "2.11.0" [dev-dependencies] insta = { workspace = true } diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index 3bee2a5d5..52edcf616 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -68,7 +68,26 @@ pub fn install_menuitems( pub mod test { use std::path::{Path, PathBuf}; + use rattler_conda_types::Platform; + + use crate::install_menuitems; + pub(crate) fn test_data() -> PathBuf { Path::new(env!("CARGO_MANIFEST_DIR")).join("../../test-data/menuinst") } + + #[test] + fn test_install_menu_item() { + println!("Running test_install_menu_item"); + let test_data = crate::test::test_data(); + let schema_path = test_data.join("mne_menu/menu/menu.json"); + + let prefix = schema_path.parent().unwrap().parent().unwrap(); + let prefix = std::fs::canonicalize(prefix).unwrap(); + println!("prefix: {:?}", prefix); + let base_prefix = PathBuf::from("/Users/jaidevd/miniconda3"); + let platform = Platform::OsxArm64; + + install_menuitems(&schema_path, &prefix, &base_prefix, &platform).unwrap(); + } } diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index 0d9f1ff52..c4d0deb9b 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -1,8 +1,9 @@ use crate::{schema::MacOS, slugify, utils, MenuInstError, MenuMode}; +use fs_err as fs; +use fs_err::File; use plist::Value; use sha1::{Digest, Sha1}; use std::{ - fs::{self, File}, io::{BufWriter, Write}, os::unix::fs::PermissionsExt, path::{Path, PathBuf}, @@ -87,12 +88,16 @@ impl MacOSMenu { let icon = PathBuf::from(icon); let icon_name = icon.file_name().expect("Failed to get icon name"); let dest = self.directories.resources().join(icon_name); - fs::copy(&icon, dest)?; + fs::copy(&icon, &dest)?; + + println!("Installed icon to {}", dest.display()); if self.needs_appkit_launcher() { let dest = self.directories.nested_resources().join(icon_name); fs::copy(&icon, dest)?; } + } else { + println!("No icon to install"); } Ok(()) @@ -100,7 +105,9 @@ impl MacOSMenu { fn write_pkg_info(&self) -> Result<(), MenuInstError> { let create_pkg_info = |path: &PathBuf, short_name: &str| -> Result<(), MenuInstError> { - let mut f = fs::File::create(path.join("Contents/PkgInfo"))?; + let path = path.join("Contents/PkgInfo"); + tracing::debug!("Writing pkg info to {}", path.display()); + let mut f = fs::File::create(&path)?; f.write_all(format!("APPL{short_name}").as_bytes())?; Ok(()) }; @@ -151,6 +158,7 @@ impl MacOSMenu { } if self.needs_appkit_launcher() { + println!("Writing plist to {}", self.directories.nested_location.join("Contents/Info.plist").display()); plist::to_file_xml( self.directories.nested_location.join("Contents/Info.plist"), &pl, @@ -253,6 +261,7 @@ impl MacOSMenu { // pl.insert("UTImportedTypeDeclarations".into(), Value::Array(type_array)); }); + println!("Writing plist to {}", self.directories.location.join("Contents/Info.plist").display()); plist::to_file_xml(self.directories.location.join("Contents/Info.plist"), &pl)?; Ok(()) @@ -334,20 +343,32 @@ impl MacOSMenu { lines.join("\n") } - fn write_appkit_launcher( - &self, - launcher_path: Option, - ) -> Result { - let launcher_path = launcher_path.unwrap_or_else(|| self.default_appkit_launcher_path()); - fs::copy(self.find_appkit_launcher()?, &launcher_path)?; - fs::set_permissions(&launcher_path, fs::Permissions::from_mode(0o755))?; + fn write_appkit_launcher(&self) -> Result { + // let launcher_path = launcher_path.unwrap_or_else(|| self.default_appkit_launcher_path()); + #[cfg(target_arch = "aarch64")] + let launcher_bytes = include_bytes!("../data/appkit_launcher_arm64"); + #[cfg(target_arch = "x86_64")] + let launcher_bytes = include_bytes!("../data/appkit_launcher_x86_64"); + + let launcher_path = self.default_appkit_launcher_path(); + let mut file = File::create(&launcher_path)?; + file.write_all(launcher_bytes)?; + fs::set_permissions(&launcher_path, std::fs::Permissions::from_mode(0o755))?; + Ok(launcher_path) } - fn write_launcher(&self, launcher_path: Option) -> Result { - let launcher_path = launcher_path.unwrap_or_else(|| self.default_launcher_path()); - fs::copy(self.find_launcher()?, &launcher_path)?; - fs::set_permissions(&launcher_path, fs::Permissions::from_mode(0o755))?; + fn write_launcher(&self) -> Result { + #[cfg(target_arch = "aarch64")] + let launcher_bytes = include_bytes!("../data/osx_launcher_arm64"); + #[cfg(target_arch = "x86_64")] + let launcher_bytes = include_bytes!("../data/osx_launcher_x86_64"); + + let launcher_path = self.default_launcher_path(); + let mut file = File::create(&launcher_path)?; + file.write_all(launcher_bytes)?; + fs::set_permissions(&launcher_path, std::fs::Permissions::from_mode(0o755))?; + Ok(launcher_path) } @@ -356,7 +377,7 @@ impl MacOSMenu { script_path.unwrap_or_else(|| self.default_launcher_path().with_extension("script")); let mut file = File::create(&script_path)?; file.write_all(self.command().as_bytes())?; - fs::set_permissions(&script_path, fs::Permissions::from_mode(0o755))?; + fs::set_permissions(&script_path, std::fs::Permissions::from_mode(0o755))?; Ok(script_path) } @@ -381,7 +402,7 @@ impl MacOSMenu { let mut file = File::create(&script_path)?; file.write_all(format!("#!/bin/bash\n{event_handler_logic}\n").as_bytes())?; - fs::set_permissions(&script_path, fs::Permissions::from_mode(0o755))?; + fs::set_permissions(&script_path, std::fs::Permissions::from_mode(0o755))?; Ok(Some(script_path)) } @@ -476,8 +497,8 @@ impl MacOSMenu { self.install_icon()?; self.write_pkg_info()?; self.write_plist_info()?; - self.write_appkit_launcher(None)?; - self.write_launcher(None)?; + self.write_appkit_launcher()?; + self.write_launcher()?; self.write_script(None)?; self.write_event_handler(None)?; self.maybe_register_with_launchservices(true)?; @@ -502,7 +523,17 @@ pub(crate) fn install_menu_item( ) -> Result<(), MenuInstError> { let bundle_name = macos_item.cf_bundle_name.as_ref().unwrap(); let directories = Directories::new(menu_mode, bundle_name); - + println!("Installing menu item for {}", bundle_name); let menu = MacOSMenu::new(prefix, macos_item, directories); menu.install() } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_slugify() { + assert_eq!(slugify("Hello, World!"), "hello-world"); + } +} diff --git a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__render__test__render_gnuradio.snap b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__render__test__render_gnuradio.snap index 8a1070021..324929628 100644 --- a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__render__test__render_gnuradio.snap +++ b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__render__test__render_gnuradio.snap @@ -5,32 +5,491 @@ expression: schema MenuInstSchema { id: "https://schemas.conda.io/menuinst-1.schema.json", schema: "https://json-schema.org/draft-07/schema", - menu_name: "home", + menu_name: "MNE-Python (__PKG_VERSION__)", menu_items: [ MenuItem { - name: "GNU Radio Companion", - description: "Flowgraph builder for GNU Radio", + name: "Spyder (MNE)", + description: "The Spyder development environment", command: [ - "/home/prefix/bin/gnuradio-companion", + "will be overridden in platforms section", ], icon: Some( - "/home/prefix/menu/grc.png", + "/home/prefix/menu/mne_spyder.png", ), precommand: None, precreate: None, working_dir: None, - activate: None, - terminal: None, + activate: Some( + true, + ), + terminal: Some( + false, + ), + platforms: Platforms { + linux: Some( + Linux { + base: BasePlatformSpecific { + name: "", + description: "", + icon: None, + command: [ + "spyder", + ], + working_dir: None, + precommand: None, + precreate: None, + activate: None, + terminal: None, + }, + categories: Some( + [ + "Science", + ], + ), + dbus_activatable: None, + generic_name: None, + hidden: None, + implements: None, + keywords: None, + mime_type: None, + no_display: None, + not_show_in: None, + only_show_in: None, + prefers_non_default_gpu: None, + startup_notify: None, + startup_wm_class: None, + try_exec: None, + glob_patterns: None, + }, + ), + osx: Some( + MacOS { + base: BasePlatformSpecific { + name: "", + description: "", + icon: None, + command: [ + "spyder", + ], + working_dir: None, + precommand: None, + precreate: None, + activate: None, + terminal: None, + }, + cf_bundle_display_name: Some( + "Spyder (MNE-Python __PKG_VERSION__)", + ), + cf_bundle_identifier: None, + cf_bundle_name: Some( + "Spyder (MNE-Python __PKG_VERSION__)", + ), + cf_bundle_spoken_name: None, + cf_bundle_version: Some( + "__PKG_VERSION__", + ), + cf_bundle_url_types: None, + cf_bundle_document_types: None, + ls_application_category_type: None, + ls_background_only: None, + ls_environment: None, + ls_minimum_system_version: None, + ls_multiple_instances_prohibited: None, + ls_requires_native_execution: None, + ns_supports_automatic_graphics_switching: None, + ut_exported_type_declarations: None, + ut_imported_type_declarations: None, + entitlements: None, + link_in_bundle: None, + event_handler: None, + }, + ), + win: Some( + Windows { + base: BasePlatformSpecific { + name: "", + description: "", + icon: None, + command: [ + "{{ PYTHONW }}", + "{{ SCRIPTS_DIR }}\\spyder-script.py", + ], + working_dir: None, + precommand: None, + precreate: None, + activate: None, + terminal: None, + }, + desktop: Some( + false, + ), + quicklaunch: None, + terminal_profile: None, + url_protocols: None, + file_extensions: None, + app_user_model_id: None, + }, + ), + }, + }, + MenuItem { + name: "System Info (MNE)", + description: "Information on the MNE-Python runtime environment", + command: [ + "/home/prefix/bin/python", + "/home/prefix/menu/mne_sys_info.py", + ], + icon: Some( + "/home/prefix/menu/mne_info.png", + ), + precommand: None, + precreate: None, + working_dir: None, + activate: Some( + true, + ), + terminal: Some( + true, + ), + platforms: Platforms { + linux: Some( + Linux { + base: BasePlatformSpecific { + name: "", + description: "", + icon: None, + command: [], + working_dir: None, + precommand: None, + precreate: None, + activate: None, + terminal: None, + }, + categories: Some( + [ + "Science", + ], + ), + dbus_activatable: None, + generic_name: None, + hidden: None, + implements: None, + keywords: None, + mime_type: None, + no_display: None, + not_show_in: None, + only_show_in: None, + prefers_non_default_gpu: None, + startup_notify: None, + startup_wm_class: None, + try_exec: None, + glob_patterns: None, + }, + ), + osx: Some( + MacOS { + base: BasePlatformSpecific { + name: "", + description: "", + icon: None, + command: [], + working_dir: None, + precommand: None, + precreate: None, + activate: None, + terminal: None, + }, + cf_bundle_display_name: Some( + "System Information (MNE-Python __PKG_VERSION__)", + ), + cf_bundle_identifier: None, + cf_bundle_name: Some( + "System Information (MNE-Python __PKG_VERSION__)", + ), + cf_bundle_spoken_name: None, + cf_bundle_version: Some( + "__PKG_VERSION__", + ), + cf_bundle_url_types: None, + cf_bundle_document_types: None, + ls_application_category_type: None, + ls_background_only: None, + ls_environment: None, + ls_minimum_system_version: None, + ls_multiple_instances_prohibited: None, + ls_requires_native_execution: None, + ns_supports_automatic_graphics_switching: None, + ut_exported_type_declarations: None, + ut_imported_type_declarations: None, + entitlements: None, + link_in_bundle: None, + event_handler: None, + }, + ), + win: Some( + Windows { + base: BasePlatformSpecific { + name: "", + description: "", + icon: None, + command: [], + working_dir: None, + precommand: None, + precreate: None, + activate: None, + terminal: None, + }, + desktop: Some( + false, + ), + quicklaunch: None, + terminal_profile: None, + url_protocols: None, + file_extensions: None, + app_user_model_id: None, + }, + ), + }, + }, + MenuItem { + name: "Prompt (MNE)", + description: "MNE-Python console prompt", + command: [ + "will be overridden in platforms section", + ], + icon: Some( + "/home/prefix/menu/mne_console.png", + ), + precommand: None, + precreate: None, + working_dir: None, + activate: Some( + true, + ), + terminal: Some( + true, + ), + platforms: Platforms { + linux: Some( + Linux { + base: BasePlatformSpecific { + name: "", + description: "", + icon: None, + command: [ + "exec", + "bash", + "--init-file", + "/home/prefix/menu/mne_open_prompt.sh", + ], + working_dir: None, + precommand: None, + precreate: None, + activate: None, + terminal: None, + }, + categories: Some( + [ + "Science", + ], + ), + dbus_activatable: None, + generic_name: None, + hidden: None, + implements: None, + keywords: None, + mime_type: None, + no_display: None, + not_show_in: None, + only_show_in: None, + prefers_non_default_gpu: None, + startup_notify: None, + startup_wm_class: None, + try_exec: None, + glob_patterns: None, + }, + ), + osx: Some( + MacOS { + base: BasePlatformSpecific { + name: "", + description: "", + icon: None, + command: [ + "osascript", + "/home/prefix/menu/mne_open_prompt.applescript", + ], + working_dir: None, + precommand: None, + precreate: None, + activate: None, + terminal: None, + }, + cf_bundle_display_name: Some( + "Prompt (MNE-Python __PKG_VERSION__)", + ), + cf_bundle_identifier: None, + cf_bundle_name: Some( + "Prompt (MNE-Python __PKG_VERSION__)", + ), + cf_bundle_spoken_name: None, + cf_bundle_version: Some( + "__PKG_VERSION__", + ), + cf_bundle_url_types: None, + cf_bundle_document_types: None, + ls_application_category_type: None, + ls_background_only: None, + ls_environment: None, + ls_minimum_system_version: None, + ls_multiple_instances_prohibited: None, + ls_requires_native_execution: None, + ns_supports_automatic_graphics_switching: None, + ut_exported_type_declarations: None, + ut_imported_type_declarations: None, + entitlements: None, + link_in_bundle: None, + event_handler: None, + }, + ), + win: Some( + Windows { + base: BasePlatformSpecific { + name: "", + description: "", + icon: None, + command: [ + "%SystemRoot%\\system32\\cmd.exe", + "/K", + "/home/prefix/menu\\mne_open_prompt.bat", + ], + working_dir: None, + precommand: None, + precreate: None, + activate: None, + terminal: None, + }, + desktop: Some( + false, + ), + quicklaunch: None, + terminal_profile: None, + url_protocols: None, + file_extensions: None, + app_user_model_id: None, + }, + ), + }, + }, + MenuItem { + name: "Tutorials (MNE)", + description: "MNE-Python online tutorials", + command: [ + "will be overridden in platforms section", + ], + icon: Some( + "/home/prefix/menu/mne_web.png", + ), + precommand: None, + precreate: None, + working_dir: None, + activate: Some( + false, + ), + terminal: Some( + false, + ), platforms: Platforms { - linux: None, - osx: None, + linux: Some( + Linux { + base: BasePlatformSpecific { + name: "", + description: "", + icon: None, + command: [ + "xdg-open", + "https://mne.tools/stable/auto_tutorials/", + ], + working_dir: None, + precommand: None, + precreate: None, + activate: None, + terminal: None, + }, + categories: Some( + [ + "Science", + ], + ), + dbus_activatable: None, + generic_name: None, + hidden: None, + implements: None, + keywords: None, + mime_type: None, + no_display: None, + not_show_in: None, + only_show_in: None, + prefers_non_default_gpu: None, + startup_notify: None, + startup_wm_class: None, + try_exec: None, + glob_patterns: None, + }, + ), + osx: Some( + MacOS { + base: BasePlatformSpecific { + name: "", + description: "", + icon: None, + command: [ + "open", + "https://mne.tools/stable/auto_tutorials/", + ], + working_dir: None, + precommand: None, + precreate: None, + activate: None, + terminal: None, + }, + cf_bundle_display_name: Some( + "Tutorials (MNE-Python __PKG_VERSION__)", + ), + cf_bundle_identifier: None, + cf_bundle_name: Some( + "Tutorials (MNE-Python __PKG_VERSION__)", + ), + cf_bundle_spoken_name: None, + cf_bundle_version: Some( + "__PKG_VERSION__", + ), + cf_bundle_url_types: None, + cf_bundle_document_types: None, + ls_application_category_type: None, + ls_background_only: None, + ls_environment: None, + ls_minimum_system_version: None, + ls_multiple_instances_prohibited: None, + ls_requires_native_execution: None, + ns_supports_automatic_graphics_switching: None, + ut_exported_type_declarations: None, + ut_imported_type_declarations: None, + entitlements: None, + link_in_bundle: None, + event_handler: None, + }, + ), win: Some( Windows { base: BasePlatformSpecific { - name: None, - description: None, + name: "", + description: "", icon: None, - command: None, + command: [ + "%SystemRoot%\\system32\\WindowsPowerShell\\v1.0\\powershell.exe", + "\"start https://mne.tools/stable/auto_tutorials -WindowStyle hidden\"", + ], working_dir: None, precommand: None, precreate: None, @@ -40,9 +499,134 @@ MenuInstSchema { desktop: Some( false, ), - quicklaunch: Some( + quicklaunch: None, + terminal_profile: None, + url_protocols: None, + file_extensions: None, + app_user_model_id: None, + }, + ), + }, + }, + MenuItem { + name: "User Forum (MNE)", + description: "MNE-Python forum for discussions, problem solving, and information exchange", + command: [ + "will be overridden in platforms section", + ], + icon: Some( + "/home/prefix/menu/mne_forum.png", + ), + precommand: None, + precreate: None, + working_dir: None, + activate: Some( + false, + ), + terminal: Some( + false, + ), + platforms: Platforms { + linux: Some( + Linux { + base: BasePlatformSpecific { + name: "", + description: "", + icon: None, + command: [ + "xdg-open", + "https://mne.discourse.group", + ], + working_dir: None, + precommand: None, + precreate: None, + activate: None, + terminal: None, + }, + categories: Some( + [ + "Science", + ], + ), + dbus_activatable: None, + generic_name: None, + hidden: None, + implements: None, + keywords: None, + mime_type: None, + no_display: None, + not_show_in: None, + only_show_in: None, + prefers_non_default_gpu: None, + startup_notify: None, + startup_wm_class: None, + try_exec: None, + glob_patterns: None, + }, + ), + osx: Some( + MacOS { + base: BasePlatformSpecific { + name: "", + description: "", + icon: None, + command: [ + "open", + "https://mne.discourse.group", + ], + working_dir: None, + precommand: None, + precreate: None, + activate: None, + terminal: None, + }, + cf_bundle_display_name: Some( + "Forum (MNE-Python __PKG_VERSION__)", + ), + cf_bundle_identifier: None, + cf_bundle_name: Some( + "Forum (MNE-Python __PKG_VERSION__)", + ), + cf_bundle_spoken_name: None, + cf_bundle_version: Some( + "__PKG_VERSION__", + ), + cf_bundle_url_types: None, + cf_bundle_document_types: None, + ls_application_category_type: None, + ls_background_only: None, + ls_environment: None, + ls_minimum_system_version: None, + ls_multiple_instances_prohibited: None, + ls_requires_native_execution: None, + ns_supports_automatic_graphics_switching: None, + ut_exported_type_declarations: None, + ut_imported_type_declarations: None, + entitlements: None, + link_in_bundle: None, + event_handler: None, + }, + ), + win: Some( + Windows { + base: BasePlatformSpecific { + name: "", + description: "", + icon: None, + command: [ + "%SystemRoot%\\system32\\WindowsPowerShell\\v1.0\\powershell.exe", + "\"start https://mne.discourse.group -WindowStyle hidden\"", + ], + working_dir: None, + precommand: None, + precreate: None, + activate: None, + terminal: None, + }, + desktop: Some( false, ), + quicklaunch: None, terminal_profile: None, url_protocols: None, file_extensions: None, diff --git a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_gnuradio.snap b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_gnuradio.snap index 60abe1169..9f6ef931c 100644 --- a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_gnuradio.snap +++ b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_gnuradio.snap @@ -27,10 +27,10 @@ MenuInstSchema { win: Some( Windows { base: BasePlatformSpecific { - name: None, - description: None, + name: "", + description: "", icon: None, - command: None, + command: [], working_dir: None, precommand: None, precreate: None, diff --git a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_grx.snap b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_grx.snap index 316611d5c..42767d3c6 100644 --- a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_grx.snap +++ b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_grx.snap @@ -28,10 +28,10 @@ MenuInstSchema { win: Some( Windows { base: BasePlatformSpecific { - name: None, - description: None, + name: "", + description: "", icon: None, - command: None, + command: [], working_dir: None, precommand: None, precreate: None, @@ -74,10 +74,10 @@ MenuInstSchema { win: Some( Windows { base: BasePlatformSpecific { - name: None, - description: None, + name: "", + description: "", icon: None, - command: None, + command: [], working_dir: None, precommand: None, precreate: None, diff --git a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_mne.snap b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_mne.snap index 12c60ccf7..ebafa1976 100644 --- a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_mne.snap +++ b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_mne.snap @@ -29,14 +29,12 @@ MenuInstSchema { linux: Some( Linux { base: BasePlatformSpecific { - name: None, - description: None, + name: "", + description: "", icon: None, - command: Some( - [ - "spyder", - ], - ), + command: [ + "spyder", + ], working_dir: None, precommand: None, precreate: None, @@ -67,14 +65,12 @@ MenuInstSchema { osx: Some( MacOS { base: BasePlatformSpecific { - name: None, - description: None, + name: "", + description: "", icon: None, - command: Some( - [ - "spyder", - ], - ), + command: [ + "spyder", + ], working_dir: None, precommand: None, precreate: None, @@ -111,15 +107,13 @@ MenuInstSchema { win: Some( Windows { base: BasePlatformSpecific { - name: None, - description: None, + name: "", + description: "", icon: None, - command: Some( - [ - "{{ PYTHONW }}", - "{{ SCRIPTS_DIR }}\\spyder-script.py", - ], - ), + command: [ + "{{ PYTHONW }}", + "{{ SCRIPTS_DIR }}\\spyder-script.py", + ], working_dir: None, precommand: None, precreate: None, @@ -161,10 +155,10 @@ MenuInstSchema { linux: Some( Linux { base: BasePlatformSpecific { - name: None, - description: None, + name: "", + description: "", icon: None, - command: None, + command: [], working_dir: None, precommand: None, precreate: None, @@ -195,10 +189,10 @@ MenuInstSchema { osx: Some( MacOS { base: BasePlatformSpecific { - name: None, - description: None, + name: "", + description: "", icon: None, - command: None, + command: [], working_dir: None, precommand: None, precreate: None, @@ -235,10 +229,10 @@ MenuInstSchema { win: Some( Windows { base: BasePlatformSpecific { - name: None, - description: None, + name: "", + description: "", icon: None, - command: None, + command: [], working_dir: None, precommand: None, precreate: None, @@ -279,17 +273,15 @@ MenuInstSchema { linux: Some( Linux { base: BasePlatformSpecific { - name: None, - description: None, + name: "", + description: "", icon: None, - command: Some( - [ - "exec", - "bash", - "--init-file", - "{{ MENU_DIR }}/mne_open_prompt.sh", - ], - ), + command: [ + "exec", + "bash", + "--init-file", + "{{ MENU_DIR }}/mne_open_prompt.sh", + ], working_dir: None, precommand: None, precreate: None, @@ -320,15 +312,13 @@ MenuInstSchema { osx: Some( MacOS { base: BasePlatformSpecific { - name: None, - description: None, + name: "", + description: "", icon: None, - command: Some( - [ - "osascript", - "{{ MENU_DIR }}/mne_open_prompt.applescript", - ], - ), + command: [ + "osascript", + "{{ MENU_DIR }}/mne_open_prompt.applescript", + ], working_dir: None, precommand: None, precreate: None, @@ -365,16 +355,14 @@ MenuInstSchema { win: Some( Windows { base: BasePlatformSpecific { - name: None, - description: None, + name: "", + description: "", icon: None, - command: Some( - [ - "%SystemRoot%\\system32\\cmd.exe", - "/K", - "{{ MENU_DIR }}\\mne_open_prompt.bat", - ], - ), + command: [ + "%SystemRoot%\\system32\\cmd.exe", + "/K", + "{{ MENU_DIR }}\\mne_open_prompt.bat", + ], working_dir: None, precommand: None, precreate: None, @@ -415,15 +403,13 @@ MenuInstSchema { linux: Some( Linux { base: BasePlatformSpecific { - name: None, - description: None, + name: "", + description: "", icon: None, - command: Some( - [ - "xdg-open", - "https://mne.tools/stable/auto_tutorials/", - ], - ), + command: [ + "xdg-open", + "https://mne.tools/stable/auto_tutorials/", + ], working_dir: None, precommand: None, precreate: None, @@ -454,15 +440,13 @@ MenuInstSchema { osx: Some( MacOS { base: BasePlatformSpecific { - name: None, - description: None, + name: "", + description: "", icon: None, - command: Some( - [ - "open", - "https://mne.tools/stable/auto_tutorials/", - ], - ), + command: [ + "open", + "https://mne.tools/stable/auto_tutorials/", + ], working_dir: None, precommand: None, precreate: None, @@ -499,15 +483,13 @@ MenuInstSchema { win: Some( Windows { base: BasePlatformSpecific { - name: None, - description: None, + name: "", + description: "", icon: None, - command: Some( - [ - "%SystemRoot%\\system32\\WindowsPowerShell\\v1.0\\powershell.exe", - "\"start https://mne.tools/stable/auto_tutorials -WindowStyle hidden\"", - ], - ), + command: [ + "%SystemRoot%\\system32\\WindowsPowerShell\\v1.0\\powershell.exe", + "\"start https://mne.tools/stable/auto_tutorials -WindowStyle hidden\"", + ], working_dir: None, precommand: None, precreate: None, @@ -548,15 +530,13 @@ MenuInstSchema { linux: Some( Linux { base: BasePlatformSpecific { - name: None, - description: None, + name: "", + description: "", icon: None, - command: Some( - [ - "xdg-open", - "https://mne.discourse.group", - ], - ), + command: [ + "xdg-open", + "https://mne.discourse.group", + ], working_dir: None, precommand: None, precreate: None, @@ -587,15 +567,13 @@ MenuInstSchema { osx: Some( MacOS { base: BasePlatformSpecific { - name: None, - description: None, + name: "", + description: "", icon: None, - command: Some( - [ - "open", - "https://mne.discourse.group", - ], - ), + command: [ + "open", + "https://mne.discourse.group", + ], working_dir: None, precommand: None, precreate: None, @@ -632,15 +610,13 @@ MenuInstSchema { win: Some( Windows { base: BasePlatformSpecific { - name: None, - description: None, + name: "", + description: "", icon: None, - command: Some( - [ - "%SystemRoot%\\system32\\WindowsPowerShell\\v1.0\\powershell.exe", - "\"start https://mne.discourse.group -WindowStyle hidden\"", - ], - ), + command: [ + "%SystemRoot%\\system32\\WindowsPowerShell\\v1.0\\powershell.exe", + "\"start https://mne.discourse.group -WindowStyle hidden\"", + ], working_dir: None, precommand: None, precreate: None, diff --git a/test-data/menuinst/mne/menu.json b/test-data/menuinst/mne/menu.json index 23b374194..4c212c4ce 100644 --- a/test-data/menuinst/mne/menu.json +++ b/test-data/menuinst/mne/menu.json @@ -5,7 +5,7 @@ "menu_items": [{ "name": "Spyder (MNE)", "description": "The Spyder development environment", - "icon": "{{ MENU_DIR }}/mne_spyder.{{ ICON_EXT }}", + "icon": "{{ MENU_DIR }}/spyder.{{ ICON_EXT }}", "command": ["will be overridden in platforms section"], "activate": true, "terminal": false, @@ -34,7 +34,7 @@ { "name": "System Info (MNE)", "description": "Information on the MNE-Python runtime environment", - "icon": "{{ MENU_DIR }}/mne_info.{{ ICON_EXT }}", + "icon": "{{ MENU_DIR }}/info.{{ ICON_EXT }}", "command": [ "{{ PYTHON }}", "{{ MENU_DIR }}/mne_sys_info.py" @@ -60,7 +60,7 @@ { "name": "Prompt (MNE)", "description": "MNE-Python console prompt", - "icon": "{{ MENU_DIR }}/mne_console.{{ ICON_EXT }}", + "icon": "{{ MENU_DIR }}/console.{{ ICON_EXT }}", "activate": true, "terminal": true, "command": ["will be overridden in platforms section"], @@ -98,7 +98,7 @@ { "name": "Tutorials (MNE)", "description": "MNE-Python online tutorials", - "icon": "{{ MENU_DIR }}/mne_web.{{ ICON_EXT }}", + "icon": "{{ MENU_DIR }}/web.{{ ICON_EXT }}", "activate": false, "terminal": false, "command": ["will be overridden in platforms section"], @@ -133,7 +133,7 @@ { "name": "User Forum (MNE)", "description": "MNE-Python forum for discussions, problem solving, and information exchange", - "icon": "{{ MENU_DIR }}/mne_forum.{{ ICON_EXT }}", + "icon": "{{ MENU_DIR }}/forum.{{ ICON_EXT }}", "activate": false, "terminal": false, "command": ["will be overridden in platforms section"], diff --git a/test-data/menuinst/mne_menu/menu/LICENSE.txt b/test-data/menuinst/mne_menu/menu/LICENSE.txt new file mode 100644 index 000000000..f92369c54 --- /dev/null +++ b/test-data/menuinst/mne_menu/menu/LICENSE.txt @@ -0,0 +1,6 @@ +The Spyder icons were taken from the Spyder project +(https://github.com/spyder-ide/spyder) and are therefore placed +under an MIT license. + +The other icons were taken from https://github.com/paomedia/small-n-flat and +are placed in the public domain. diff --git a/test-data/menuinst/mne_menu/menu/console.icns b/test-data/menuinst/mne_menu/menu/console.icns new file mode 100644 index 0000000000000000000000000000000000000000..3c7896f60fee9bfa43f5ddfe8c1b0fd74bc0d30a GIT binary patch literal 25290 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 R<0yV4Z_rGE2C+ZS{~y25Cr$tW literal 0 HcmV?d00001 diff --git a/test-data/menuinst/mne_menu/menu/console.ico b/test-data/menuinst/mne_menu/menu/console.ico new file mode 100644 index 0000000000000000000000000000000000000000..cf824a41ecdabd2adf5c5d0d68ca0e6eca8497d2 GIT binary patch literal 165935 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 Tb3i`0ud>q_Qbn;pxbOb~V=rQ# literal 0 HcmV?d00001 diff --git a/test-data/menuinst/mne_menu/menu/console.png b/test-data/menuinst/mne_menu/menu/console.png new file mode 100644 index 0000000000000000000000000000000000000000..836099c53a785cf922fb8c7d22b32dac825ea26f GIT binary patch literal 11397 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 w9uPUIA=JWu0b>7P?EnA( literal 0 HcmV?d00001 diff --git a/test-data/menuinst/mne_menu/menu/forum.ico b/test-data/menuinst/mne_menu/menu/forum.ico new file mode 100644 index 0000000000000000000000000000000000000000..66f945fb50c9adcbfda911e0115f1d2da9ee9f7f GIT binary patch literal 299932 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 a#rDQatnbP9`0v=vaXZQ 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 literal 0 HcmV?d00001 diff --git a/test-data/menuinst/mne_menu/menu/forum.png b/test-data/menuinst/mne_menu/menu/forum.png new file mode 100644 index 0000000000000000000000000000000000000000..f85b57588c6f6446186ec582e1c8c588df7c4f18 GIT binary patch literal 15823 zcmeHuWmsIx)@FAgKnM^lxNFdE+?`;-A-Fe!iF_uQFpzM1>KmZyF z;+KJQp#=c&RK{CV$5q|bgUZnvW?^jyrE>Lhgi=90tr3Hs)1_(F&SZRVWbS_AyC84N zk)ghzF>?U-W+fLgu#J6?)@P8~*79HzXJ2@bIDU7v@bfk-i$ue%f%{{N)`-e(LvIJ^ z!N^E`z^jq7y%`nHo16Uxp8!%XrRMy##~;h9=0%@Svj6N_G`v`n{A6T27;Aid-7ItA z`u;~ue9W^$i#GOe#)Jw77c|Z6;7sd_>AV~MkdGr<{_hHf@6vAsU>w#X18a9{GRN*q zqD(SM)Lyqe_*p=@D?&q(v!O-GrNwOLg|jO!&zNBNHLLP%m|DZ0#Y%B*?xpYU`62|o zb+x4;_GD$P!-KC|Y*wK3Oeo-7IC@l6Wo>6cKz~-?a?s(Ig4~v^I!vQskKYmZ&{d`Q zn)mkUeBIT|#Z%c6cJ0`!DPHS{1SUx=uy+KWX?*Q*#M?488~* zChqX1PxgIRmK-M7Q1T^N=*8XjyK0$3?~L(S>?5kz@f@SPd$#}rxxRkui)J(r`CR|u zDRo!H;FR%e8tSFy?`jP||Ers8h?kOi#Vq(S9+|&rateL3&A{ffIcY{L)@IQbf@yz4 zIJVPXr->vDQmgv)dz1w;J8EoMYOz<3Po%>=~ z#D&M(*yM&<&}b8zDd;e_~+y$>08&-FqGC&%YVZE zI3}I$N-T1U%%5cBvo+>J`RW~3nJ~YPV>=PoF!vE_)i5vgRDfWm>X5m(thT$fwdb{v zy`$NWx!Ud4FqFJRZriU#O3#~KOMT36J!C4#bpLhCHD5(An=sLK<1c2r#AbV7(T`=f zr~C8U#5_9=hH~Uebo6JkKF=x))zPoctMtFfGV+F6wDJp$5*|AMq^lDR;KS~ zHnnk{QN!5R#QODp2hyv)-4Ld_BsGFK&(4}}=xk>uEiQgJgqC2k6^efKC(GvifI(XW zYikVf?yLiuzh^kb8IqDDTrl zsz(%ez0>--kC`6ln@sb#fQ&?<0cH+v>DL4~`pKpwCgj;Q1Ix375jA@BijlI}%3?;QlHpXw^aL45H3@`Wgdfkt2KIgW>HW#DX>VR^{EWT~?-7 z^bgOfH~Nr0)%aaC+aRGJ42R-0Efra$@4_=NBTTROu2^qvqMcu34=nN8`?|N#z8~!L zqqi(j5srm7?nECR;38pw2pS<4pm-d`BYQUfk|$+nJdk?VcW}JuFC9 zE7hxI$AG5^+Rl~}`2G1Eg$d_BvYP`iqdYux+=~r5wZAyR@K^*%dvzVM-jYn%s+yc?&>Bka7t<2obE14+dW*kgx{ zX$eW0ZlDmd4kovvKC0^IihdU5$-9u|{Qy4bzWQr#fJE2%LKf7v60V#Av(!_1= z=?i3)ZKM~2)=biy?cK#LCwP%i-nd!7Aw@R7V7S$Fad>?c-HmAsrLm(ljX?wBo#wWrOsY*)BX4F=cZP6}#60h;#tQ;X+X5tXieM>5 z9DGe__i-3*kn17~-GI6)<^zjNwc(FA(}9GfKMcoHv{)6@>dm`knb>P;OYxeN?>ZE# zG`g)yhihchzTnA*5X}@mkn*lqF;zjAuT*15PiBu#5n07co8Np!EJ*VGmq!jG9oJ^P zIGlGqe$T~p5wkZdLeJ`lrG!PgTYPHVHJa0`*7t4|HdD5n(Vu>6MuiazB?jY9~(x8ui~JlFRP(uo#dF^$-w24 zFMHz`OMQF2*?PI0)!J(K?7cm*-Al0EAPhCt0#$L^IxTUiwpn}mZTO5#rxZNxDBl7l zqx0JXai(ipUW1>bQsl2In3;B>_j(5WyyQ?`$1QTPS($$gn{9LN;tQU&vW;p%ZPwet zAz;$9oAZALvqGjSe)5EniovDaz=m$hhK)qV?DZ%$=bP1Fxy6q$ZHt2>1}G@Q%EW$X z;Yi`v#8V_~V6cScvih{(>i$QD12o+x(CE5+CHNvlVv^k|(0!(&+Qa0u;c{htm!!=no29Il^*)&oZYdF$}jkl3a!r?qVwi>mI}5d*XBcbyJ+4n+%z!F;+SlRLu(oo z96a~N+sWi}zrjmxH3n!e8YTWg*GixpeMO%@Fjh@7RW&Y+Od3tmq_H|#9XdNCzdA{P zVg;{{6Mln3t+^=OYi}W5iSJGAj!t10C@cByC$G8obaa9V5czR*EB`weRf$J0utZW~ zijc3G@~+pp0fUGp zNtNSAooi-Fv7;);Bt&;n7W(N5dg&9jXQ@go`B58G(I3v1WlQi*>qQl^S&XX9Y3y(^ zR1Pps3(Cdhr3W$(@2W+#uTUqSiQq-?uW~Ligd3Mjf7S+J1ij`C{z`d_C9v`$N8?j! z24w}I-!kbNVd8R5^Ag~%EEB^}yn%ek(a7pim+P#@D&C&!Siu+H^r)+|gbRMcvpvQm zC-&V1mDQgHvu#;}y$$uT2@Q3XrvzJg`lnZuOyQv;Er*-1w2XSsZX=SZm^ln$Mm zihFgG;>BCP#n;a{vrqVvOj8=60irqtgcyDn0WDqs2oN3NIj^n?MqXd>q3XWqfMJ7pTc5&kfY`uGW_6+Qth)q z(%?nO?OcLHi(TE)p54voz2D7b(aWH?w88$EZqy0*sIm0z7g>N6InRiLs>aBm2 z4IcWG!5XvJj&NLNiP1>h({=2+gOfmTyO^E_1o#MSUz8Ckl!>`grLao{WIw+FAFiI7_~BcVPF zJVt6jtjm zw+6J9y`88nT}w70F(i!4nI#xAm;m-(Y8aURYLKA&> z(e*Hif?K?EBGLyx$R({R9ntIKg zC<^hINlOHxr1GOlrVgl+7OnS5lpW52Dmr%$w<$Chzv=!Yqg%=r`cgG%HdnRXHB;e2 zLS8L>u?K$yM=KmK`6OyLg^{{?wn%=68$DaW+;AHCw9v2Vx%VgL4WK@9g

$sGPA{ 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 a0r9ITtS`eFOAv?M0Qu+2(q)n+LH`4B4>vym literal 0 HcmV?d00001 diff --git a/test-data/menuinst/mne_menu/menu/info.icns b/test-data/menuinst/mne_menu/menu/info.icns new file mode 100644 index 0000000000000000000000000000000000000000..635cde1b0684960bd9d1946f959ec32a02cdc24d GIT binary patch literal 49946 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 literal 0 HcmV?d00001 diff --git a/test-data/menuinst/mne_menu/menu/info.ico b/test-data/menuinst/mne_menu/menu/info.ico new file mode 100644 index 0000000000000000000000000000000000000000..24a4118058ba90627b1e8afb8d0a57e512242adf GIT binary patch literal 301278 zcmeEP2YeO9*WDy^siJ~(QFviAD=Eq_7%}%-Z+&irApS{-y_{;MHQufefhhJqSURZC@ouBe^HO%V~t0kD3D`U z5i7)RyZ;4$OW6|I%YNaN^lUa#uP&mUDSu()r{ z=T?4Rd&Pz?>z&#(r2Zv>$Bg4SreRwBAIfK)*DU|6_Q1_U>Yv{;I$qs7COa6%b4_JKKjhxVZPLM(Uogny8z;x>x;k%zXkpW*pBk4bw6Y^Dh6iwzBM# zT2;3WYmmfd`-BL6Ih^)t_< zpYCK{;^S=jA>Y24�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

k6vDH?(6bre8hp>+?KojZ`$q% zgcca<=)27CxE_;c@!8+Scq+jB>A_+&-p$SX%I`5rfDVMfkn~D~iwu0jS`|!0ia3jl z)DLfAA6@xvstNe0%E#|RL`9U+M^JfU*teP-*2yC_AEz zVm9|u?4RP93a$9YX&F4xnQvI>?)BvwKvfonilfiz&Ee;<4EqMlP zys&Sw>ap{0pH}o{PHVOuz{HFXe-X(yhhU$W1zY?$8YoD#F5xUZJ<5t{1hE$VM5(q~ z`u4h#;uH52+%gUo1rilxwwV}v_=qhZzHhhIUFv){0oWa_A~=bgTF#lm6)DDvnhvFZ zNp}ul?YWC7$wNss-p5f=k~RX9>4*(u2sSS$pP3BAZAHqz2 zYRAPl-pu&o6WCy1U;cC5Zq71cf^Fx%H4Tdk&K{QKKj zd&dp7yYpO+236DU&P${WMuKc)rJijV(ZXJpCS z=}q2oA17g}HDo0Yfij^odrCNMHyGCtEhm}9oEI)0C^NR+I!ug1H^kyAa@6d4#dTS~ zKHo4<+J7d=yTbEW+rMB=K`*`prQrNSY0RuxnjvEZWqIQgy~j!7H49Ej+U&c6B zXtrlWN1oz9!6t{Tk?#7`SkMW3FI`p3;hy6L3*Zu+^2|VF34xN2wd$onEPyx7+!t7iGMDakQ~wga`_SyJgyv5YJAb#S+IqB zdCbKwFN4YpCwwYf0ZLvd-{2@5hlEmcAXkq;B-mZrBh$8a~roS>duVd2t!#;NBIwWK%NNRQ|CN)`QmeEmpsV$*oDNt7P3bp-u;-t#`2trOr zhY{pLvL%c_;ric8H>vEVt1oqEqi@MpYaC6Nhh4CDnCpE{!MNw{dnnNd&A!=L0WSZL z*jHo!L{-nV4iI1)OOZuDhOp?d#*cQc|E@_-L|Ua$0M?SiT^>b)r?*#wu&fyt#H)L* z*gu+}2&MuhJC~sQ1JyLeiIydt)nT}=Hp0a4Q);i*9)2h&TIM2uR+;UB5>KkWxN40- zg{K&`Hz#}1nR}&g;g$<+Tq9rFv%DC+I59abG}VCuWXm}+7;zDqa@tvojY}%8w{*#{ zCKn8?VMHW_!`+M8qY#&Woc*dW(N1KV4^UHBw?p44(KzSqm22qLRfNvEo|GL~G+OYJ3|q6qF=R*4}d?*>9z z7AQ_w4E*XZ+^4cZz_EY28Rhc0;_bxkwGoP6|1Bvw%{|a}GJg7iFwGZP)5$|bSNziV zCfxbn1Om3a6GAyV_(M<45FGhKwdp&4W54>1-W=AB-ZLqpuU#gwjW1GPC`QSC>7QTi zpUH>}!j1&-Fe#el_Cft9Qj<=9Xotx0^?b=LD_@_Fiuy1NcMkU=uIPUA=f6fJAq%hY z5)GcAB}w!Au!`B%JrRsuSVZ$h=iD6hwJjE$rdJmF^tx zVhx0kPw&jIkq-llnZh4JWDEXy$WRqr8{PlR7}dVQj*S~NBbI+S0~o5&8dTjpp@G$< z>7x4N{kLRlwYqHGCtv%f1yKNcc_p-|P))f=6!7^IEm1bWH&eQ%e%Jj4Bd} zPW)!m$$QbR&6b1<`A1F)j}Qr`J@dRpm4sLBvssA#W{w{E__O`de2%drenre$1&vm7 zy_Z^%G3t?d?g(CX&BJd)!5SLcNCiB~Lb*IGS)f8Hf1 zZLy=-@?CC%MIfOtsaDY_=z+hC*!qjbIJt9zVA~?QNrT(pQ)^`(R+B!f{&T$+yvu#2zsMb4C`gWcXfS6ul$V2keV!zASue3;=hZu7_X~&~Qcp3fY3~ zK6>>|aank3Q>E12J68)fTO+Gmgt7MLAsA=SEI<(d_?`0Jvbr<5;tP!3BRCD%LdQUG z%I?rH0evP5$G6Y52`mn`ChkwGlD~KiO6PDFxRi*h-Mh4rI-iII0p~1h^MN~4`^6dE zKJdMpJGkl&qCq|VTdKaE#pRR0qnN(9URp=m9VT-nWlx*Z1kcX^@W_-D5^%Zu2J68d zCVW_MBCdryqwLIotG|4zR7DQf@QsDj!|<(7MC0CQmoe^Nhm+vq!Kdz8zbo?Q(yL@@S#m$sX3~%5wfd`xL@cKiqkBfx`u!W`*D@QRF|rXr zDC48)ZU#Z^^46q}6|ds;yss#>bl3}V^N31j@r|XAYhn>Jixu*dTL}X5*8rpp71h;| z`WO=Qh3X2*fXM=9Z(Qy{tyQkF676TPQ6V`wAU`>P`#E;72s&qEKf%-v?ULVN1{lEF zUGU)aC4}qui*GtcsFcRULur^*42d4mID>A*YERBmNi#h#T~8)EiK0Sm+NMU1KZbhM5^Dm! zGlXqddU`P1<^+3T9&hR@!#DRNk+7*!6unoMAe zKz~9L)*wiSw}hIhb`TK3WTvJ2o@r$}oSN3)nUHIY_HUt&4SMl|rrBus5ysgjGSy7* zy#KsbqkTfrpMl8SdrY{ETxi4V6qB90)vr5lLW1TKus1M%YTurXGGby14rC3M5#4DD ze2{e8$=FeXIbT0Tiq+8Pyak3BAegU8P`e!d+jSs*0Ar*67n)gw98;s!&Ox-J`GVSJ zIKiEr@`)eo#W1CO7x%WBNJoA#$*i+cXO5THK@j58>_HTuyL&!e`t|RSq0JJ}*U=HF zn-7U*aHQug9%vS!qE0P|FVT$WTY@9Xp^$SK+#~b&dSjxtvy50_(=Ultn^jco`7%_& zp)uNS*}v0uj!z{c_abC^lMZKp9ysv@JrG8?CQYWok%Bm!5LMbP2c1tw-SJz+OF>UU^hxhwPsYSRMD-%QvV<-9yHihWlBE{@3poOL2}OYE(3Oy0P~3 z5ziidoz21eV&6D)oR_!$z}kdwjSqvdyl?E^fdtKdJtf|RHoEnC(`>%BQO^dbb*@Q& ze+biyZAy+$Fw_DaP}Aj%)umz%!{rBBWH>Yhlth>(Fll8=T+kd|Sl^)$$G{=2 zrw_Z;k~%%3V`e*2hnh+Am*t&Sv=K{8cwZNQ2sLYtMIf#K4E-aQ3tDQRU0pYsUN5|b zMLn}|%{`=dOu3D4wjfXkrKV;$@41I!(qh1<@~Y%vCnt;=U7 zA5%;f1JlsIe-=~9_0Q5sznM51!3MiP9;xHEkxO@Z+5X4+4|?149)JWP_1{nIV=%n5 zj#S;?4k{IPPeRXUNo+r{igyJR)i7*|bdZ6D2$Nge&8_5&5}CXefaQ+3;VJ{y`>{rD zmpvd1Vz*XP=PFx-pi0g0?^gUFecqZn zdn*GSL#a+QXWz!LYedY7eYmDHu0iZ{<*r@8lE;t7Q(q1*4Mr8olN0~7`W>kYCMoE- zP{Y$E_pyd;vjN2Uegz`7iK3LyRCz49YWdQHOi4*x>z|gT+GZ(wvl&5M`_?C7=v(_w z|3$%eEI2bItiZerr*A&>+T8^_nWfJ9lEiB}z`gntPT?|`p0J0`dmF1R0F2|5rFRsb yx%Zl<{vw*XoUN=GgLAL{$n*b=g>3AQAc__n<8&ipwkF5A4H@j^oh)%#Sa!XL!~)BW{w#Kmh)lUH4AOe%cYbl#OwgO%se2TO zPR<<_aWnzMMD}9d$bP#f!jsK9I2l=`SP@{LFByItDaLuC+w$GmKrzxKe=>Uf zY0m0W`g}9)yjv>%!e@)lns2G9gkq$X{98D1iS5z_e#Li=cS z=){*UMNP!$kooJFj#RMLTp=6Js7i-r(CB_xp{L-`b_X9#Z^;+c#u>fv6CqQj;&R%9 zbH#=S&%d}oS%KBwg1HY?IzBIHn{*xfhEGZHZWjNzirPB<`e385ek zL?`Nk1k-2BO6?ok`OW!-S_rNK|7U&^*7^NlUV$fJGf#KemzB|FbH!zQH{XR?K?!^g zhionBkwp!!d8I6R_{IrG??+0KzmQdyQ;*hs%cuGcjFI=ns4>h>$LFj?_F@adpQK!w zuEZcBOx#7(q%X(v!1ejFbo=`p&z`ut)@-GNbtJZ)phosSB+}&U$}-U8>W!mvd(rjO zT-&2fY!w90HTSHVnKeILZuR>*zEFh!L-rbjDOLD8dqt|~Wo5Wyq06S3qe#n#zH2P( zLer3JV-t&rZf%bJ&QIgrd#{!b;tizMhB9?zzfOPBxqFi@q-!1(a(zy3y zeUO9ro;-@XXFV4|o5==eUJm2z0X7Z?b3GAH+F082L~{!m+R9>Fk@rW@1NZv^GZy7! z^ZRAiY`P~s8B)Q6v}JP&C3x8OUT)u0TLdaxgw8d!&;}BuJEVRXf8VC;V>TIVjC}mH z0c$sT?T4( zzEV0yclGf7gtgi6lJ)!A!=aXUT;0N0XY*DDd;wJ>DAH9-U!N5C7%glj)8;99?$T&v zh#1VY1TF%(qg{6uy5wzLG=Ab;%$jDnj)Bh&HkNgs9c`uMlv>~sLVN`#Bq&^*{X{l0zSB7UgO;!C`4N#*A=?P34mHaXOia^G~y+m|W4nCmLbLwWOP1J|x{_;n4} zXqP)pNFvoY`Zw+PPxc?|eYiL2T=!|<@rV}5C8efDURp-0NBcb-jCXPohUPvHUd6H^ zoM4i1OtD3r#Cel#sm}(L?W$i~-5&Fp^Nxtg0$y7r@q#6&&3q?;&fu zcj`Jzci8?}E5y^nv7(dAU_hAq^}8$(@=om7~qLQ$eCffVk7SsI`-U@RVzQ@7)$DSg$Rx7Q)GY?-Xaw!3x2SRelv|8A%ZO;9#rO^ zX7w#y{zsaLsrnsYa1sbU)G=8ANtW!1YRls!u%^Fp5x)8M^u_bq_d=o1WiuyoJIp!s zO5(^Z=ACGNwj)07>3e^@P6ocOV9JV8Te!LE2-hTTmbkz`ajZ6GG|^(%XG@A!CX zlC6$Gh4!Ig(e)Km1znb>AXj0l9mAonAF2)+Xx+Xe}t zuzn3ytq9gf=6J1Ohs3sZE+1Fi6C3lTmzeFl&bhhH5geybcof=Ds8O)PbeNpifMq0- z@F~Y_tYdx4_sW|!WW%gs;MBs9e&Ylu`-Udv=G&vKPO%00xF48S8bR4O=C5aoP2ZQr zQ1IbwgQ(gReyesA@zlh=3)kO)MsgKO(gijP zZ0UGoFH1?bzN2KO4~lvgZwQ8V>31hkJa$;rHYOa-2;W$JuF95kyZoBy9pA~7kFxa# z`n?K=pu-Q0qf`8PO1t(3wPciEu*MtK_@8Rrd@&D7&{LceU>MW$$4q9h?npDd=f4=^ zf*tuzO1V%;TtPwhK%LYg6oSJbSLQ_>X&OdSMUtpj)&|uxck{aMCKQ2;cZSFOLBX)6 zWohfwX1tCKWI0}^2kL?~e;j+8&M!}2}Rud8WvZPLcvu8x7=IUT;b51^k|aLl}vkq1FNUn)tx zl9cx;B~ZX`ykL`QDwOK=)Pn6?=g2aPaK%I~S6OD^hdB}<-#Ugj>#7f{DOkapIdZl&7Am27H^Sb1y&pt*C$2F^!b#&ALdrjr{ul5 zI5j2Q`>RST^VJqeGT98#7FZVtZ=XBfEA_6;el;N6dcHq=MMU+bm01`X{Z+1Xy@l;8 z&<6}`}|g4ZsV$^c(cobPd)q&pW@uIEVVgc2zMLn|TUWwYTbg*Z-0 z(7EK3Qa)UCQ?xpzQ60%j@$`M>1W^z2NzgRzRJF#ldN*$DXUqXgv1&M(*1F%7Dj+M5 z?mJCPk}OeDV}Y)Nevs3|Sa4Ac)l}J$6p!+wagOqPN|%t%eSEvIDE<7~%jK7)t4}Z& z*;SSYF{kM4E9++}$-gKNcjq=@P4Z{}i}f)ynk`8uB=`h&b2Umo1YVFQMsk+G&I#*K z`i+m7Zl~Q;P&Q-r>E&NQLq~pk4M3`|Ix00ugq^lJ?M~!F23}EKBM**#_MxONei#B@ zNwUp(Kvu&mJ+6lW3O!S$-(mw^n?k9SwWwo$m<37=khblYt(WxjDKy-qt|BEfWl9`* zn(m(uT9kHPj2yc4VBWgL-M!-fP(XORN-a@HnVm*Yk4os`B$zh(@U31?(>3i$1Fn7p zfs|Ooeqas$NL3lTe-z$pN)N@K%cQ`jDjG9*diICaI4fO{xyRq9@lda0_aHkBVAHJ#0nZ@RqRnSdZkdeMyTSbbf<8$6*kJU{6OjtSt;I&hNY&RGYY(z6 z?hze6@C12ve&$+Uee&GVuOo@$w6-Pw{pXp5K;T8kYU}3g_wJFc4rW=7>#B$k9k(~s zA-4gaBHx%bQP6=ZXopl-OFG3qGhfzKJ7cC0*gXtTu&%}1Z&=GqxIdO#_xOSQPgcdl zYO<~15^JY(8HI@pdgqT!I3&@P7ro^v1YOACvuTU7YNzg~lt!R~LdUZR(eI6qY9q*5 zCx_pYGes*Fyi&DGzJR5E4znjg4k;#;NUaSFx|vDoe(c{`r!AD8fQ;0NgVUN)uNKM# z?etRsY#1p=z)p7!6LMaDCub42Aq55fhbI$D%i$tLSr7gD2En7BCgp`6L9JC9CB8D{ zpy8{1Rr38LjhQGO_GaQrBq5@|xgXnSQD{TB=Ns1J8*atO369Fivufk-Xae-Dj94uX zZ>Ycn)pi`R@OVNakLMB~^-=6^R=`{v#Ko#&bBEg-r?=gOB6xceZ<~sSY42lP;dawJ zbGANit~xVCU(*Lt4o6qv$12SS+eaWhit>e%X)3Z%z8TqjLTp*!iVZB$en)Ek&vVB? z%VS+R_k3f&qj}HE7ck9d>askQSbqx5H8(NV@x4|kIUjS8r~6p6C4b*810qgpsjF%n@B`eOP7~;@{*O?@>^gsYn>sH1lMx=VQYXjvz63ZQBu) zgp^BXdTyz+YU{lZKM`D>M$Xmf)xQxz;SQFl7?6Q#it96bV}>w>E!&Md>t!`@FDW*q zL{9I{Yj2C_XS;DenGd(}a9Aefd0B*-n6ZQ1G?K71%HtX%0#)3pm-$`++a;a*5i9D^ zS0K81-t97x(5|yM!-)K1?4(w3nmXlU`Dz||Oe(YI1lfpc?li(g6^6=&Okuzz1=v2JsI!b^qKWM!<(t+_T%_+B0 zr);=wPRWC)lv&hz!I_nKS^%OpRDD|Nz{38Rl9A+o{gW=?Nz$OL zQ|ZDdP@R@-!TnbX+cHb~J@=@oiNo7NKa+K+7C1St88$rP!WR!_Z6jsVUHzi`tSmNK zeRKF(nAzzM?#LK1V1uWby*XS&a{yJnU{xCb>uv8{+2^|3HbC3^e#|m^65t8b&Axok z04#XAG%n3Oe`Ksimn$1HtN$=(h^V*U1K%ed|)z9k=xqJuL1Gl{pZozHFIElRH5ir+sJ5uckqq21d2Nb~KA9t9tjwqw$4j6lw`lg@vUzKWUj;ZH~NAH0lH{$?U2c zGSW*We+@IeaidW4>luDk-fqG+vd9GS17t?@KU5zl@7k&%OKnBdvwF4cB{(;rs5 zkIDKRx2e8TnG-2S{1a~X0_$<4%xG@U|DFF<;9y;L4(ns_IfD~cFFG5w6vx7ASY@WKArKppJcHU zCaku5krFq1%5SUXwAiIM9VeHArD}sUnQvUKEVJI%o{Fz?o5-5)qhMpU@sUjN(eab^ z<=5`w1%f&|i+Sub@SnD@ytjDXb8P`1yd`0q83Q->O*yA75_@_qJ{msmZLFBrrP{&) z(1+vH-_MSPdRj}V8y{>nDGFLxP4#)H(CEY76J}d41t@H;lFu0B$SE{Ulpj)*HRy#k zWk0xDBlKW7RjXecX7Grj#_KU$``Be$lja;55vGLV1a1C$OXz=dI-fiQ>WTk`(XSlZx=N!8U)eH}0 zka2~@PCYMMTeSuGni3UntO6EZLXge66RMPY);$K=zdTQ6YPO8Fovz_OGefVK4oK#D zWnU-^?W4d#$In(TDCjW;qMSQk#@v-3EmBVRO5eM+yr;LSOA!3gdANWb=5Xnn)uFEs zdpa3Fay|{xezN}>*I6Z}Nz_~VIpeFiS8Y4}G;q22PaRT268ENeFCP;Pbqc5?u5tUuB4Ck7^bo6C37w1 z$~2Uotgo|olF?k7)=74X@9w}kF=FWGQ+0G6^BSz*JyA@ez)!t8K3Lf}xJN%drX?aZ zf@Iv1>>$lrEmUg{Ck3HRCh^BX9C!SlWI?yiU&W_22I&`njX0S2nE4?O=O}TgMN5o( z9e4ekw&qrkE{(m4gl4#owBsadB3)NQ=k-Vzya^_xq{=CwOT$Qp?NQe%z(vJ*Oya{_ z>zc(^X*KS4k%M^rKpZB?q@vVRC(@+<^yo#6M~F1P}0 zH#2{jYbMbkMJ&OF12hd!p=0-Kk2G>{7c#DeABEEf%T;*218zFx&+?Zn{OF$H%Rhc~ ze;GiJhdD>ToReAkJhQUY@05RY16Zc|7AI_Fumb>osSDy*-Bepk671!{YvtwlwmyV?q{TTagbp&5z*$?_Ev&8yQqiyLJUK7jKHC8 zU@j;i(cB-!BNscS@ll}L`#Oz+27w=l8-MaD2O*mh}X;4iBCX6LV}N9 zkWWyM2Z7-63-R=~3+D0kWBNt$2Zu7m5A5sW?eF5{N&kz}&fY7)UxtwpF;4#{Ibsy7 z5{&5lQ^BwHZ+bs}2R;o%Ll`k11b|PFpI@AZUyw&og72^Lh*53rze{`i{pm%7Kly^~ zy!ixp`T0CN{z<~mUnTG#`uipI3k{7@`sg@$_fiTWByMrSi!l>Vx|0<)Vp{@6KnO|;na`Eu~E%6KeSEK{@?>O%OU-#b_2QVMR9pZs7 z#1FwN@K1Pu7sr1r&_B)R*T{b`1flNl{Qrdho4b;MZgXaiN8>3c>4L#G1LQE9QV-I%V=Mj<+aS(76vlFt1*!_h<*VhG+33l#( zwdxm@1A+=HDl8&mC*a5l*%J#K^@1V(4%8%WDD%CBh;?V&VcK!lFWge@yQ; z;RA@TA0oY|NoxnKLh`r$pBI8{QP}GH2#N4 z{a-lgKjKv#A?xKE@)!Mv5T8F|-2o@0`eo+x&$A4z` z^K$eLvh#%~I3Z#HvCfFx`n}Hd?0z;_2u0-VGTwm;C#0cm3O4|B?s(CGfwa>)-DBmpt$< zf&U#{|KHq&^^eDHh$mw67le4I=BA~AARfrk>^0StfxBP7rM=HG5j~jR>Slh3f0~>7 z^@pU$UJ#7vMEBRwRzcqck>cIss7{Sa007Er4P^zR;Klu-h%8G;#HidvQC@`hOH51+ zZfDY$@_OY@aLJOUiWON&7tKR;(wv8j+vBt?1}>)zY7T}TRFT%r(zZ0K4L@*cGd?;W z8Oh<~G@dtAS;ovmZF~F#A&XtmOQExn;?=W@ zo5-`ED0~cthXjiM;>QD$3Wfx9nVZ28TVk>nsy#=zyDd`_ttqxYQjxsWBpP$H^7(`e z3>6DT!jG8@VuNnL^x?T}(sno-Xd5!~-NUZaEP(wmu1pRvYu`yQ<`;bu?FpBLFHg=F z9o6Qaugzh?ec)^`{v(WZR6mM6!`R->#f};v`WN6mJa4k5d-F(^SkiRCj-9b$@2(dn zlg=fMBH-OHWC}cc3DNnbeK%1Azg?^t%n?2Z<$~sb$U!v;)&`W~IN{jmRNi#CHaMrA z8T9G^iu}Z_CD+q?ur`=6tQ~_ooF(Rn|A+;SJu9#((HW+xP%96bG;&{+TXw0t5rIp> zsbUW3^RH2c`hha?} zSD3i*D7GwCHvwdxtmjYG=4>!l@Oy#~1D$b7AU(}Nua+Zo_ygNa)yg%+*dVjPTf~HF zJJmsY#)CoJJvis+F<*+EEnmWTX1{mEhW)^aL9xyI@nee@@ML43nF&@w#tugc-mvvL zW1_;tgstO7-FZvR_91nmnpP1eGH1d(#5Yq1K3h}^BaFNsbTbwm8H4Vp{38ToUTA(P zqCZX%#6QtcvJ0C+@1Zq598M8DvgXelSm6ozW%p)76vq(*9F;1?^dthFh8EV{Ut5+A zOt#47z`jeui%@R9D_`e9^wNFl8Qv@5guwoSG0D*gBly395*AN|u0SRLlA{-p#c!iUzu#<|_?M`S9fag3{H( zopTiy93(!vz5Vgw8^t14{@XE((5bO=l`2b|a2`u3A}9v+olZ=#Z-1o-57}EjB=pcr zKNC%$+~v9-eOcR^y_!I?47>B$Gr6E56ngWKD47A7TfBO^W-Uo*Hv-z21t<@m+u$x^ zwz}>==KP2iUWtGzE%Uw~dVk)CpJJo?J<(hb?baKy#JrgD;E`*(xp6*Mt&CFtb3-EN zh`?=abQsA=5-Fpu9@`NMruVC7s4I4i@F)3=F(a-oM+T6e1~5(2O}#ynPmHVD*zDNh3$z8?@S*p`NM0n2IAEQp46Gd7 zWdKI2=VG8$RhetD$`8>F*-o=;uUI!+_g%E*s9ozf%@bL^WE!%0hyFlUuhx7 z;X5dHKNH~o@Uy=Vo@LEY{(g6`jT`Ct{Q23|Vszy6ypnPWS*e`mCnD(MrXIri>NY0( z*P`5B>44GZr47b%xd@Z}2#?H77dA6+LV4F$h`fyF@7kM?+lvY$|gp`Xt*!CR$ z42vNvW#rIZwqal~M+0ySxWVs0>L`n$L&TU5w10I)z89J54KjbXek?v=6t8I9+Q&`bQrOh9_yrjK^MGJqlf;RjpKrvOU#9V?u*9`mEa@^p(_hd!-* z(^cb4D1r8fB)6DY8}QI7a(Y!)m@BOPY;F$wc?WuvT6e#*BOh!!1i7vN*qayYVI=_= z^7G{OzfIJ;NFp_jtUv|t6x~7AR*hnfnlqnI@o99ZMx`HOMY+DtcKhz`8BlvERl?4C zahZ!}(?Dp3-Yzq_wBPW9nr*jSGF1ba+-1dWF#4_l#-n8vRMuKw9#D@`s%rUVPzR3P zjE~fgt`_z=!S(i0?m^<&>5na~Jye)&338>#mSUl5z9dbkVHz_W_xVf?fsjiX-dh+c zDfHfz9|s&?cuw*CyV{N@xHo4z$d-o>Y5bEkwgA@_<)|g$76Ck){eo@CGIvsSoee3A!uX!L_YUW%!j3cNc4XC4lR~ zu`TFMPJH>XS5%Daoe2T;a1|pc6@D}p+ufaXd<2AFG1^va1`L0Oaz-YSIxxvft&@Oy zv})B8RBFydnhBuAw}nbarLhF%zJaHE6A~HZfUVGx^oM5zN$W&)3nb`BokZ#`vX4wj zIGRjGRDg#BNn2GJWKjONF2xh}p(nu_xk^dT(QOw1%hC`MdkssBx-?&mCadFqg0Z*A zO}$UO^mdD(IWBm$gGuA}eQy_)Kd;;+YLqn6a=0-*C?11`Rd511uD4Go#y@bJUhkMM z8vd-Ux?JOX9RBmob5`)zni||0Zj|kB6D&}V{Qj>Qk*YT-Hq+T2WjrdH08SxlVeN%Q z^>M%H$m$nq;=xyMFrm1DxtJeTzbE%=kF4%7H(63hAkmBeRI4=^;d{ETHFtngZ;k~$ zxI>h|*d+rVRCxG@f@B-vcAgn!AoTPrj_V!I2Kmf-PcdA*Hz62^L-9`C)E?n`@mj)` z_#+|k-qp7LkG473)GEowvf{pcciv^86a@!Px)z1(ML!t3ZEoLnprrQEeVL}4n-HuWUDgepewLD6BB`u-oaveO}A2b@W%M2X9#`NH%&LEKA z@2?%UPq7(#+QO8D4CnrklWb#@{ZpR^U;!Z4j37~CE~M?L@VDnG8%surP&GVZ*&t8x zGHfG);{C!3_i4}E2h2rm1S9p07t5IejXxNavv7=4i-5CT5`FfEPnwCA_gPIT<+jG^>IsD#NN>H;{tAl4<7=%(QZJun2 ziwt!53%XK*nYNm34CvugkIC-_82YFuqd}UH{?fp1$n2Sjm!i>NaX6jZ4Tdqu+@j&* z7HK&qDh%1}^EL*cWu}{kjG; zEjuPm9~Re;L|`9s(2wiEDG2h$Ibs16xebALDu7&TO#%jV4HNeB{tgc7kna%)i9J?= z=pIrNNpwYYC`SoG37H~T)&MJwI47mz4 zgE!O1=~K`TO|9Pd7}wPkopawq2@l{UL03w5{7}*-1y)0OIkCy?n-8Kcz8FGf(^JX;9Ap)s@j1VI0?VsA)T9vZP>^jd2oD{U zK9`KuOo7C%Q+&N^hhC6Y2sm6#$sWl7jh6EFVje!{zdY;BM3o0tsozz4d_kfAV(YE) zzz#}4dU$JSyZ=p;L?0;_dPD{j&QZk>C;>=x79Qhzu;+tpaq*Ee0Z*U%zp$Nmp5Kh# z$RTa6y}^Pu>)d|hhnXPe7IP4FD}1&}B}Hn6^v1EF9TvfMx5}gC9QPKICic*9N zwHXq|#pS0ED91FfWrDAn9Ypc6Xm8M4Xqoxyb; z*>)I}zChy&Ci5u*6y&NU#E0^*-P_!H?_kn#odICudkkOLG_-?qBCE83BfK2d_u|_X z>ri0pazm}-th1NzP%-vzFMR4`JX$8qujz(#06a+KCuCWHo3O9f+wYUe%R>UAb`8hV z#;;GK9<~$lA&H0hK&8^In3Re4Z^1%?wn3Y$lw3$n>BxNn`Q-c(jC}IKc6*10#nRxj zJ66{1>U)|<;w1i}T_-=HkGxM_G12Eoo}qUNS!~2d?c4)F*FL=$-|3W=D3=12Ck95P z`9?ZycBGksWqYSeAc(mw<aC6+&tuEKiL7QpW?+A0 z6i}KV)n`#`cB<)&eYJZW^5kc*A#yx74lpOZk7oLgc+|zJyT*k~sQ@`DOocqP=HO5! z$m8d;pUW-gog42OcBo<>bwv7QDH4B$Y7&n+g;52Ka)APpU(bSGhKyiCs&#{X{yXHedT< z)2jry$29V5j%`ex`~1WvXdX1zbh)lsh!n=SHQD{ywZjU;ujHRXm-3ED9v(i;A|PoV zETYNd8HGeIwQ!kU%<+Q=SdkALpT^>AW-^_7YSgL@fmV6+^CJwY*IS=C6lei2Bfb$G zHJDwq+z0D&k`VYD-E5hUkp-KGX7Y;E0}riXY|%n^a!2(#TZn z$tzF&EOFY8T(UoOd6>3906KcJ6c~!wo9t5f-=}$}f*@%vRjy>$E`&v0CLDfxDtt5- zFW61BzLw)Kn4H^eGn(HWy(-0&noq; z{A4~$BK7bWXdrgsn`F_wuqDSUv+}Bx_J9chY|jK_szomMNZ^6Dmw)V?V?f(Tbgu0i z>f~T6?yN;Fm1%pz@bX|W@8Ab>FN|_)3k?!3M{hQCKR8{d0f(Ng6U*M9blh>Go;)+6 z7=mRJV>*S8&YgzflbQN+*oOtJ{fWz@K6C;UR%F=d=B1C%wMG#iI~7`^u!@hn^~4V_ zEL!z?50?Y5vuPDWN}C{cBUMX%5uNZH5xLdkzW#mE;~TJomwBy-4Yn$Z;5RUAcM}V> z?ogj5M6nk|<@0k}+)LQ*>$YSR+vW`D8m*&0VR230BVx7b2bOg`#}*~)iA>lbWkFOM z%b(uNeVhal_-izKF^cQj1`@K9llcxjeBS=kkVfLM3Ge%}7c{wIct5Q?Sb#As)W9OZ z8u`7%qP0My6WY)_%DZiW9{b2X6H@4$gOC(;UyHT_Cx5#m+AUG1N8d!DyN&j4K5hml z31=#;$EKpZdAF$Q*!gJjP*MJwXe;V1XMsk)6jlyN-YfHsd8s-tUUX~OIX4|0tt@4F z1GLFyizt>6e1-UuGiCMIiox0U(LZeu(Rp)CW)@98zS`WQ$i_*+*t;e$YU&d&&`_(k zoJpLLM%YmTiln0`It)0NR^B$}VxxaSd}3mIT>(2(dwb5r21H|2_Tyh;3h9tZDxqLy zlBoJ8>2Z&qMqn|id1Dh}_fDhUGFuj?1Fn3aJJcV|@|W+qHaTcbn$t~Vj<0ARZRm1m z?Xy|NMvSZ(>i6idy*BixK3aQZ{WTk#B=yb`GFWaO-a%8BcX4=9@`Xusz(dJPQ%!Is z+5f5g?n?9n?jYp;F8Cu!O!GNU=8sbiq`aFe{Pzt>)KVYph(r>0@)l^2mxuOd=w^C- zmYRG70fIliHgR*d>MeE{rKq@Q#$?u5zbi5yyx~EZ@q*T+`ZS-6C|Q$;&=EI$Og@OEQMa}A<6@hD zqYT<`xyPy>M=EVmW9EdGZ`tvk4NZgG0}D7Jqe5Ug&=byA!E6d{a|_yjG+nubhw&5X z-0Qp_!LS(wZF6U`!d^JMspW_~nkW0Vz-Y_d{6W2;`lJ@`-B99ivEmIyx@To-9}%=m z1-<|Su(NPX1}76U|eUaFuGfx|nLeSXYa#s|J1wzEalqFept5vF#F6@+pL*cO!B zNR}$@sj*YWjwzEDeOz~>gdAC+U|Z+TOqjJ>S zK2EhMtjH$^-b~GBCTaXA`ci;$c9Aw5;BMdl!Q-=36V{ko^e&m0VBFL3HpI>mCjPQq z-Sd(x$oJvYmp2BqINhVBo)n7(sR8(x)kl7O?`WI_=9i-7Z1zN?-jeXt&h6?b3>`fV zxxb;yQ-!h&y2CluUO*G?vjFL_@Q%~)lU;4W_F?4_SITba2=oTC;md}&z_YO|w$u%> zr~YVan87X4XZVmQ?PKncPmouLoCyTop>g+-rU_I^&Zh5JCixJ(Y*+O?i%9$aMP2Vh zN2@HsD3tnT-jCi7!k*fBJ9uuWvPhP%Di!=_4DPvU1lA3Rzr&vv8$a`58)e^8%Q=}p z3mWKSELg~PYd>~d46`D4!mE2Ze+G(bo%Z3^i7|2_e;bIYV1*+mrxW7qAQ9&koklVE zK`G)}q9e^{b>BjSz9THR^y_(8bOQ^1c_#f#GwTlw5~}INnV@GQ9J;Bz9UsRijzW=x zL^XT(kaDG%=kI%iK0?N*v^LTaiT@Iu^5l{6NYGfP;lSHTW9O4o`lEbA@$@+L$p#9s zFwqvdm$9x{G&?o<{Y;7L_Yt#3!Bsah?lh94LlnXgSDME3XISX$S6(QXd{|!2Tf-PlJcDtjFW(`Ijg_IXl(GBFa``pN!E~^QMb{0m{lRhS%^hmBl5_)P8pSIAr;?xOKBUX__V{5M;Y2)e_PDoyr9h zX5SO72|YvRtKTuDRC-xeq-^12m=yg}re~eR+J~qkxA9a0kL(=H+mK`_Kog*15j#2! zBc2s&1g#(yTHH|bGaJ++v}m-pqQ4!S-^AhWv%pJ{r7LW(C>XS$MfYqIr<2R-TAbm0 z3K$Jio1*tn2H$IX;YhsBtlrw5sou8H+8P%`tW}A-!bg65-!QleG+SFEql1XD>j=?I z*)qga)AL6J(&+QpJ)q|y4<^Jh3yruEjkt7Pkg_erXfRXx?$m9qce8|dJT&2i=Ol3j zuxnDDGf(DxsHB_W%m$`Kx#zDS;QAoUbfm~6Qd!6Xg2924B$k9VV@RW#Ux%?yy>6z} zyzUSj!N(uim>e)Rz)PbVbp_@@}u}OaU5{DXsPf)eAWfnW5n%JKNKM-Fn8Yc1^E4^=0Wd?9g=<}k!aLe` zmR8g0i1X@uj1Fjv+Isfk_nL@<$tJn2RJf0XVu%Z6W52pB^t#M^(**K`wSuqYiAp@m z2rNlAaU|`9<;dP3;}aBqK4(Ec>7{cFe4%9mqSqmg?L|*+3(StDg|ontFhj{3($eGM z$V@N=cqE*fLdv<0(rxoViU?>fTviZk;vtFkK-r=#R?-VMY7A*bS-50_av$lP2Ta=g z#pjnc_Mym6j~c$gVTLuJ`pFLXY;O@t*PqwvQH-OFGX`4^JY0!2duVsHRsw;GD=h6X z!E~ePkkjI9(vX-Iv=%?rsRPQ$1fo&_{Gy2>wU|`JfrLivfk1uPmiJ510VeiFp19^q w5`L^?`#tg5PO@ty-_=L|)f*71ggf-^@kf&`4_37iFL3}36&>XUMcbJF12*hB2><{9 literal 0 HcmV?d00001 diff --git a/test-data/menuinst/mne_menu/menu/menu.json b/test-data/menuinst/mne_menu/menu/menu.json new file mode 100644 index 000000000..78d3b8834 --- /dev/null +++ b/test-data/menuinst/mne_menu/menu/menu.json @@ -0,0 +1,168 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "$id": "https://schemas.conda.io/menuinst-1.schema.json", + "menu_name": "MNE-Python (1.2.3)", + "menu_items": [{ + "name": "Spyder (MNE)", + "description": "The Spyder development environment", + "icon": "{{ MENU_DIR }}/spyder.{{ ICON_EXT }}", + "command": ["will be overridden in platforms section"], + "activate": true, + "terminal": false, + "platforms": { + "win": { + "command": [ + "{{ PYTHONW }}", + "{{ SCRIPTS_DIR }}\\spyder-script.py" + ], + "desktop": false + }, + "linux": { + "command": ["spyder"], + "Categories": [ + "Science" + ] + }, + "osx": { + "command": ["spyder"], + "CFBundleName": "Spyder (MNE-Python 1.2.3)", + "CFBundleDisplayName": "Spyder (MNE-Python 1.2.3)", + "CFBundleVersion": "1.2.3" + } + } + }, + { + "name": "System Info (MNE)", + "description": "Information on the MNE-Python runtime environment", + "icon": "{{ MENU_DIR }}/info.{{ ICON_EXT }}", + "command": [ + "{{ PYTHON }}", + "{{ MENU_DIR }}/mne_sys_info.py" + ], + "activate": true, + "terminal": true, + "platforms": { + "win": { + "desktop": false + }, + "linux": { + "Categories": [ + "Science" + ] + }, + "osx": { + "CFBundleName": "System Information (MNE-Python 1.2.3)", + "CFBundleDisplayName": "System Information (MNE-Python 1.2.3)", + "CFBundleVersion": "1.2.3" + } + } + }, + { + "name": "Prompt (MNE)", + "description": "MNE-Python console prompt", + "icon": "{{ MENU_DIR }}/console.{{ ICON_EXT }}", + "activate": true, + "terminal": true, + "command": ["will be overridden in platforms section"], + "platforms": { + "win": { + "command": [ + "%SystemRoot%\\system32\\cmd.exe", + "/K", + "{{ MENU_DIR }}\\open_prompt.bat" + ], + "desktop": false + }, + "linux": { + "command": [ + "exec", + "bash", + "--init-file", + "{{ MENU_DIR }}/open_prompt.sh" + ], + "Categories": [ + "Science" + ] + }, + "osx": { + "command": [ + "osascript", + "{{ MENU_DIR }}/open_prompt.applescript" + ], + "CFBundleName": "Prompt (MNE-Python 1.2.3)", + "CFBundleDisplayName": "Prompt (MNE-Python 1.2.3)", + "CFBundleVersion": "1.2.3" + } + } + }, + { + "name": "Tutorials (MNE)", + "description": "MNE-Python online tutorials", + "icon": "{{ MENU_DIR }}/web.{{ ICON_EXT }}", + "activate": false, + "terminal": false, + "command": ["will be overridden in platforms section"], + "platforms": { + "win": { + "command": [ + "%SystemRoot%\\system32\\WindowsPowerShell\\v1.0\\powershell.exe", + "\"start https://mne.tools/stable/auto_tutorials -WindowStyle hidden\"" + ], + "desktop": false + }, + "linux": { + "command": [ + "xdg-open", + "https://mne.tools/stable/auto_tutorials/" + ], + "Categories": [ + "Science" + ] + }, + "osx": { + "command": [ + "open", + "https://mne.tools/stable/auto_tutorials/" + ], + "CFBundleName": "Tutorials (MNE-Python 1.2.3)", + "CFBundleDisplayName": "Tutorials (MNE-Python 1.2.3)", + "CFBundleVersion": "1.2.3" + } + } + }, + { + "name": "User Forum (MNE)", + "description": "MNE-Python forum for discussions, problem solving, and information exchange", + "icon": "{{ MENU_DIR }}/forum.{{ ICON_EXT }}", + "activate": false, + "terminal": false, + "command": ["will be overridden in platforms section"], + "platforms": { + "win": { + "command": [ + "%SystemRoot%\\system32\\WindowsPowerShell\\v1.0\\powershell.exe", + "\"start https://mne.discourse.group -WindowStyle hidden\"" + ], + "desktop": false + }, + "linux": { + "command": [ + "xdg-open", + "https://mne.discourse.group" + ], + "Categories": [ + "Science" + ] + }, + "osx": { + "command": [ + "open", + "https://mne.discourse.group" + ], + "CFBundleName": "Forum (MNE-Python 1.2.3)", + "CFBundleDisplayName": "Forum (MNE-Python 1.2.3)", + "CFBundleVersion": "1.2.3" + } + } + }] +} diff --git a/test-data/menuinst/mne_menu/menu/mne.png b/test-data/menuinst/mne_menu/menu/mne.png new file mode 100644 index 0000000000000000000000000000000000000000..864f8160be8992ac58a32f3d06c59a9dc1a4fb15 GIT binary patch literal 165760 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%0AtclFf9NiJ*`h0zlA!D8GBx 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 literal 0 HcmV?d00001 diff --git a/test-data/menuinst/mne_menu/menu/mne_sys_info.py b/test-data/menuinst/mne_menu/menu/mne_sys_info.py new file mode 100644 index 000000000..5c0d59a4d --- /dev/null +++ b/test-data/menuinst/mne_menu/menu/mne_sys_info.py @@ -0,0 +1,25 @@ +# This will be invoked by the System Information menu entry + +import tempfile +import mne + + +def main(): + report = mne.Report(title='MNE System Information') + report.add_sys_info(title='System Information') + + report_file = tempfile.NamedTemporaryFile( + prefix='mne_sys_info', + suffix='.html', + delete=False + ) + report_file.close() # close it so we can open it again for writing + report.save( + fname=report_file.name, + open_browser=True, + overwrite=True + ) + + +if __name__ == '__main__': + main() diff --git a/test-data/menuinst/mne_menu/menu/open_prompt.applescript b/test-data/menuinst/mne_menu/menu/open_prompt.applescript new file mode 100644 index 000000000..9944f7b07 --- /dev/null +++ b/test-data/menuinst/mne_menu/menu/open_prompt.applescript @@ -0,0 +1,4 @@ +tell application "Terminal" + do script "source __PREFIX__/Menu/mne_open_prompt.sh" + activate +end tell diff --git a/test-data/menuinst/mne_menu/menu/open_prompt.bat b/test-data/menuinst/mne_menu/menu/open_prompt.bat new file mode 100755 index 000000000..0b087b0a8 --- /dev/null +++ b/test-data/menuinst/mne_menu/menu/open_prompt.bat @@ -0,0 +1,10 @@ +:: This is used to initialize the bash prompt on Windows. +@ECHO OFF + +call %__PREFIX__%\Scripts\Activate.bat +FOR /F "tokens=*" %%g IN ('python --version') do (SET PYVER=%%g) +FOR /F "tokens=*" %%g IN ('where python') do (SET PYPATH=%%g) +FOR /F "tokens=*" %%g IN ('mne --version') do (SET MNEVER=%%g) + +ECHO Using %PYVER% from %PYPATH% +ECHO This is %MNEVER% diff --git a/test-data/menuinst/mne_menu/menu/open_prompt.sh b/test-data/menuinst/mne_menu/menu/open_prompt.sh new file mode 100755 index 000000000..075cce969 --- /dev/null +++ b/test-data/menuinst/mne_menu/menu/open_prompt.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +# This is used to initialize the bash prompt on macOS and Linux. + +if [[ -f ~/.bashrc ]] && [[ ${OSTYPE} != 'darwin'* ]]; then + source ~/.bashrc +fi +source __PREFIX__/bin/activate +echo "Using $(python --version) from $(which python)" +echo "This is $(mne --version)" diff --git a/test-data/menuinst/mne_menu/menu/spyder.icns b/test-data/menuinst/mne_menu/menu/spyder.icns new file mode 100644 index 0000000000000000000000000000000000000000..8bcd28b9403b236868b17acc3383ea54effc6f50 GIT binary patch literal 31281 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 literal 0 HcmV?d00001 diff --git a/test-data/menuinst/mne_menu/menu/spyder.ico b/test-data/menuinst/mne_menu/menu/spyder.ico new file mode 100644 index 0000000000000000000000000000000000000000..4aafb0878d6b45d44652cb88697ce63cf8f4ed01 GIT binary patch literal 311358 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 literal 0 HcmV?d00001 diff --git a/test-data/menuinst/mne_menu/menu/spyder.png b/test-data/menuinst/mne_menu/menu/spyder.png new file mode 100644 index 0000000000000000000000000000000000000000..4d7341d5184a190cb49471812bc7096e8604b181 GIT binary patch literal 19403 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 literal 0 HcmV?d00001 diff --git a/test-data/menuinst/mne_menu/menu/web.icns b/test-data/menuinst/mne_menu/menu/web.icns new file mode 100644 index 0000000000000000000000000000000000000000..7cecbfcd2986d25d883a50d62fc4cf97beef42cc GIT binary patch literal 71075 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

TjptYdZ+(8 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≦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 literal 0 HcmV?d00001 diff --git a/test-data/menuinst/mne_menu/menu/web.ico b/test-data/menuinst/mne_menu/menu/web.ico new file mode 100644 index 0000000000000000000000000000000000000000..6f3ddb57a9d42364dfc72bc09bda69ce313d9b54 GIT binary patch literal 310263 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 z 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 O1)!>=saPRz7V>}j8Q;tR literal 0 HcmV?d00001 diff --git a/test-data/menuinst/mne_menu/menu/web.png b/test-data/menuinst/mne_menu/menu/web.png new file mode 100644 index 0000000000000000000000000000000000000000..bb5e8ba312f3e17d2bad6328ff534363e3bc38e8 GIT binary patch literal 24622 zcmeFZWmsIzwk|pwcXw?xNO1SY-3cB7H14he8VwL21b0awA-G$R29n?!Bm@r{JOmAP zJNedL>s$BiyU*FrbI-rs*ql{kyrafjW0cIA4{o_C&L;&Af8PqGJ2WVOxLC z^Q|ZMpMFYQ-rU?>k}r36cOFSUQ7RxF|9&Q0apWG-LEnYD-naVbieJa<2!HDWKPXhH z{~TI$5tmZUc4FO)zIzm|_cVlH898CD@#(>6mzGt*+|Ro#hu~Y$+je@sy1CEe-3^4D zk43fPf0QIkc0=Q9uvLD=aVKtnTz%%@p|j@uE%5mBvXLAll>EW{X8B_G=ulxw%I;oB zKlMtaiA-VGbtqdmepj&E&E|+>NWs;@wPD0<-dO*5=lizcac4g!BRSKR)L&UcKjV=f zFldj@ap14NJ^ostygf-X^IqlZd{~=~^OQh!7*}kcw-_Jd5&R_|uW>-B%$+}77|o7F`csUq zkWcY@@f>p8^4Xu=lNcG+LZ@{Dk#2rmUTFtv+SE!~xoLP@UQt^50mO92eu7NehI#^GG5{dh*z@zH^SpkFBz4Y?`HE3X8cMkHcH>8+N&(OBmFlNNit zuI|I!f+blT+dEb!At_w1bdd0Fzt`&+B~_M8J*T=UHJ;aRa-82anUY@Os%KOg3pLm+ zDXDX{OgS~on(w)uej#2p4my}MI|{+k5~m0}KIj2KM?^o5G>nM5HqUPxr;QI)RJOYa zwfv%zIBe{Rd)#u+d`vmBa^f|+B81? zEbZ9MnDNEi^fvcEZ?Svjz~}VY-fBx>Ox{}WuI0BvM;F}dn?DK;CKx?;gR35SsVmh1~Sg@q-x_-=<@39x< z=(Ty$A`!gZMbsek_E)1OZ`g};lijWYd90U9P_psZy^^3{x9Q&Oko<P#2`c&;#NDVIMaiDmZnyArOKM@smn4bb-;A_lw(+pG>-7?K zJZt~==It*VRWA;<59^lo4@qkmjg>a4JjnTq+A;j-g`)aw4CiE@^K&%(EEiVsZ}hX4 z32tg+OCkE{JuNAa{<&U}pL{`jVTQV|K25nJqh(1hLBjX3mbPK_6ZC{~fB)6W!d8Rl z`Eny8MQ?by7VDh9x)J8J@2NUeN>=E)X0-w75tqU+tUYU!%XbCEuSN;C&KG$Hf1 z1~_RGW5k({Yc*q7toSF)V1B0K-1c*NtReJLbO>g_YpoSR&$Ka3k^Y!w#R0mkCP0p6 zl@!G=QGLp;gN$;p=te0qNyh0SQ|Y5VxG#4AMiT95vbW!Um5856b(0jykHsWHWSAlo z$juS!bdH8~>W2;i5)!l>ZRY#6E*={x4bYSs=7l>;MczABcg^jy9ko#^dKj?N5e(ma z^Dz%YQ=82K>q$u)zOe&bn2M5b*)^Q?MPZEX&5dTdEe2VN$n#}+%WSD~_a$xNMddQ91)wCrj(j2-E-dgU zh~s1XPN)10EJ9AAdZz8p41Wm!aprbu$S=RVy$lr7{it@f=VGqf1cxATshu>n7b1S` z@zrBW->7O8#0ogecH^YA!8S{qQ&Hai*cu?+mQ;3(_4Aix`n2)6RX)nZwH`tQ7-wB& zw@fa@U)g!c4NmA{*OzD?q#7f8KBuUry+I9rr2MXucEoES`kr@nFS>I0dj9rlHNkO+TGB zn$J!`bG*pwYDE%i3~bAzc1SU|nYi>R66ZgWZLC0 zPQ2G&FTxWwDWI4+MH8)cl!P@c40T(YbXyh63~&+qq>oirfOnA7v7Y4743sq~;5Jf< z6CuB?Rg#SX({bPR?BL`^^6<@(xs%crb1Ut6_>Nj-&~A||5v~i~1&Hf)#j6#*Lk>V#~tI zN5N0XO`9ZwvG^X=QMyfv6h3Q!`h?W~#JoR|pwErhkqxG{kHQZY99JMgzMEElpXXbH zk)c14<_xsn#NfZG`kA~X-S}ZO>n(-**mVQ<%9nlClyCL{p!)vZ==@rZQ<7fHkLMFg z=;eAev{m2Pw+I-x8sQ!y*@cPPuprnLe}($(d0bilEm^IIg-Vi3)Ig2ZF=OfWWYnbg zVsE3Myf1_-l23>1xn#HUrOl1`tHPIpyU zMZ+05Ycwt5t)QD#xPsBId;W@A7XMY40lQ}Hw6pQ~CAsz4xNprpMBIqhNl%J4U=N$| zHTok3A7n`bEI6*TB{lps7meMJQ`MMZ&k_qg$!oIgOnoKT#|d&FTSZ_j?NixZh9MsF z>c!*u_?Vu_h}%f4aF3Pb^H>qSN!M);qZ*EuY4!V zpL7?WKm2MTUVTuD%#HdOnf(3qlYm~};@xCi1Ii~tG-e!ZGz}Xy2S}~eJ9 zw#U+g?ee|$r_;`z@2Ca|eHdRD3X7LR5<$5BFZFd)Aj`bieN_aKD_?bFu7M?jkjygU z-N4yTY!HlaN}RXcMufV^q3r&mx{OK*(Sl_Y^7N5zsHlr?(s%ex-_Duq?)e;M;FmZ~ zbfDKUQuPs~+Hxl3$f$YG$Y53R2>nuzTb?b2NLI}~!nkzbptFrogPE#sN7T2abfKvz z>_8e9Gr)+r&rgRX?vpsh8XWyAhRLcpnr(ZH-^YU5JDPI9>+6 znA?R+o#p8!%wfxa-TyX#Nw69AI;!8m_w1XFNOI$wrNK8km)4_ecsMpJ$vUYoAneuU zU*dSt6S{wp*2>#dKVARoG%r;#pyaq^#v(+71EbOOs4>ctm(=C$_Z3kea)ZO@r3oE4HpyPQ|Rrn#c9WsE4-)VS8$9`u;Gx1)E?)>p6!uJ#)fu3DTY9lt(KLs`*p1|u`_M|$a+tGXS9=O439L{ zYY(L(4}%6p6cYswQre<8@iE|inn+wgNxMNms)=&UgDoa*O3cIlt5b5C+VhbCO3brv zfwbFZf43XiS0RCSW{C+(C}$U5`Xt9i55WrxuN`i6Z0yutcQK7T&z6Ngo@yZrdZz;$ zS7WIxT$U$t*>O2qBDcm1SJ#m>3RPAOuEliX#=nIzn_dzen$Fr`gD~knD2cyvrs%~9 znhCdyCnxc|201J=F1LovLzr}oLln;56ZKr~p3$Nv0kfX?)avUv7JDb!58tQivwEse z)xv*%wg#+9(Tjpxc`-X!jCv$;^s%F9l0L~_5e7%in*4aXa4nLKJJQD`{ZX9GZ3qv- zM30?>q$om$L+>RO>SjC14T^7lkc1{!PsY5GuJQT&tki0;WlT&=*FIMe|CIPG0AhW4 zL_1Q(?np{XEt04oDLw$Gf#S8b6TnFrZcl~=)4sk$5@K1R_8es+4o9|BtK%ogz|c_k~JGqC+g^%Sn(jlkE@=^ z7T8+YP#AVXzyWd!vHPJFMed*8!K>TEFpSNR;@FaF)SCQs6xS_@1S)N;He6BD-vu?S zR8C8__k@t+F>FQEL7v938kmrn%Wn9-DvrjFMI(~v2<}_(<9F{m3MK6yhhcC$eLp+r zeQ5SNm7hQ1MF&H~CrY%5a#j|3457)iO&L~FAM_TuM{v%?h)cXg#eNye_N?JuHZ z7Sh;-q#t-qlG76BQINfqCCogwOj}Lz6A8&|#qQIQ5Tv=~Y<019=)rDLA&z{PUJf_a zorh3KE4Qcg0NP`*>P$EcDPt8}^vt-2g#i=++TnUnOb3(Xwop2}KUO<6Rj7e1HE_{n zHT(jkinZBYs$JY8W*fJsdm@V!V;}K}I6Pt?+ubaoQcND;DZ&fL{mJ+7mra_#GxSL( zye|d=Qc-#G;ym+wSXJZ{V@ zOTNhvVX1aoeAT=v?wVyo#=W}zk$lb1q?n(YV`eAl(N=Om~j&H}7TiUeD5Uo97SvdrxN>$DcS8lVVo|Q)#7w1>*~876vav0lgBX;@7*fZJaNp z8)Ip+#Wo-C46d-i3%;i9$_-LMY=$*H2SG#*6qMs+ED+Z+GI(h6lcgSa*_ymRJ&TFYIaKo)$z^?N_%ZIyDJpYbvY&_}let+A z{ZQiFSQygCs@Jt150_I<5R}*sw8lx6G%FV}`^t5(T2IdDG3!tu7P>7~B}90BK7wJw zfS9_i=`5W)2~R=Z(h-xwv!;r$T8P_K`}Gk%*VD-**FYM~wfxo6KL2WkOkL4>0mpTl zH-6^aj=~0SI&$X@)H-*nvAC^b<H`SH~>?Znt-SV&j)cj&Xk*D zQqxqL&c6G#zu!`!`Nmu9)f)2;#sE33_{aHGJWFelQ#qDT z!dB`_Y`A9G9P79{v%#*vA{B*VxSnAqMPC`c|!(+!k0cQbRwX-Ff)!;0W(F>5KKW_TjEj#~40!yO;L)UCDE#7ZNbb;lToyk$4SRq()Sk7!1Tb>{eTqjKv zixeuK6zhv&oiqJ7)TQx=1m;%`Cs}&1cHJ-#UfuS?L6M@7)AT#@>PKDfpV4y4*PRyJ zQ`I@qV}_-J3<+rOu+P7?D{ zEq}927{)EqsogG+Sta0*7?%oD7EyAFJ8#_{8XR4pQc9%{Li6#7ektQ4bk10kL7n`EvGJl#r13fo(^ysFS>`gus`4q{zOl8E(cBnU zinogH?XGfQM9_niw6x;6^}gMw$UUdPPrCkbxV(Ny3!Wa<5R&)=deo3$Bgy(kpu&2U z6bWtOId6=u-L7{^8f^Qr{n?8ef8B!3ki+rG)X{95TAvgXt9+8W1BmA|xRRK4cIzfWGz94Jk$Kv7CUH7Jtv zyIBo8es3lqBeuqh3WaPxcMVGb!XFpuHXIy57u@oIJNs2N=POQM%dON?Q}yRGppXUl zM_+aQbJ#Gg<*{le?)=Le!RV)S0Wz=Mhk)A_$VJYAnK%7gd`Nt|+9H7d4DJwKKPR=k zG_${3z#Q)6~u18WCH;FB1gn|oUx{cIMm&h+sek>+Lk-O)dO)}2LO^X0UlOR zXImezwXMCQn-t^G`))?Cqm2}!k&q^@riZ+(gQH52m#uz~mH{-#87gMOC?ky}86b`T zaJBWZ0tdLdxOs~QNHPAw6-QkEF6Lnb{}J(VmSQy4)B(%8d)a~oxdpj-xfBB&{rDNB zvA~jEHg@8A3QGTgK-@_&I{5f_i1YCH`}=eI3vj!8+4Jy;iHY&>^7HWXb0H+SyaU~Q ztOB^)yqSJO{Dq-l>kajC^zd%w6b>h^^sy^MAU=-0gkAJDh415|6$x^Zo~m2tIiNtUP%5xOsV8UH?tP z+egvwU-te}4Q~U)u_%w8t+%_c7t~hK&(_U{>F-88TztL%ZqwJ>_IJ^rcDvZv@gN%Y z$MWBGlvOo#{;BhuMtetBk3Sl}rT;Ez1O2C*hp(5*9~m1ckFATXE21IZ2xPv0llO77 z`&S43n?Jv6{+EUz%>5Jp-=zP8uRm@1!>hQ0JJk2LQB?&g#^3D~w{eF$+KB(Tv_b>` z)Y_VlOT-S*GlEtEHeA-$0)kxD!eYFlLe{)|P;0BdL8-cV`&hX_ZGS@{z_}d}I5t*x zcKmk2yj+4p{D@!t{K8yTR!~7MQK*%j2tS`SpN*Z}-ypQT91)pd;J39z|qxK-^c1VYkb0jLV`j9qN2Q_{9?R(LjMvnwDs~vMEP$} zK3;Bq{y#M~P;n&$q!l9C99^yKZFxN0?Eh5!?iX={Hwb2}ekTV4`A<2*8F6_pTPq)T zF9UaX7b(WyO#}ai{F75)$$w;vxQ09QkK!L;Tbthr_m7m5v$E&;b1TX7UkU#&Ncs-$ z{%-$gIR6s;CyK0>kH5Q@v$mJEwUaH>=fB4J&xHSpq=y*nynVa^RsT0m{lDZS|B6=? zgs!_+;NR@)+j{6uPUg6m7BdSVz~WB zuKh>3<9`yzB2X(40Rby3E;}oJMDU3Ti*bn|LYqsJS47AfDk@?tBr5jr=-%#jKK@o- zwzBq!7(nzhBDenZGnnnK@MHgXaeoKf-?7Du7;AqIfqVvhLgE5^;{3dvynN!kyo`T! zIareC_bB@xE=&F%hcq?C|4xeJ?{P|8^>;Mt`+9h|INEysJ6Zn`JpUhZf7Aa*p#JaF z|1S2Iw!FJXAR?0;e6;=D{!8=!iQr!d8jes~H*fdwoC_Z!z%S68@j) z`u~kCtbc90ZQT%yKYzrg+O%T>@iHxdX05KQ0NnrnD(ZZjiYUSKP%-gFylp%8`v)Y) zmK%U5ME6nER7BrGBE_R88JW9v##@HD>TmJCF&)@@=0h;w$=IK*LT9X95rAAJLX>(uFB(rpYAPe8##d#D=7kMWTs+qf)zS zvVSN;+&uZ2f$?p40869JT~HkPaEkOD5i*+SNCGX;-Se@tMuoVh zm#=>N;KgIN@)<*vB9gnqXBgElO--gk@LcZBCVKb4z0V$&|ilisCj=^pV?d}R`2JA=!K@Xin-$cmLqa3pX&LD@>n4KncxPXP` zon;pI+yVb}9SO~S<0jEBZ zN!2~cEMB#n)v7XY!isB~XPdU_Yetw4M;G<#3*=TYI~N(!7a>~Mt=7R_Xq45kFHND} zJ`~^(0jIo-!}O>NO2n494^FGS8Gez`Pzrd92&~{!UVYD?)}qjvdWQjy{&CyDf^$a$ zGXqAnqV)z!sX$$PM$1y)vbB`c7uU^Aa;X><`~ z_+-xn{owdpz~?k&_{oE*w2O{FdHwDb3q|0w$C-#Y@RSIC0BpUrSETS-OCq<+0)T;&zS$UX(l{;wRK2LF1{L-B+mp#i%PymwPcN1`tmd;)>=c0?oOk(Q zq~M=KzzV3A@c`N57nuAWl|WzgSB7xxQYOgCUW)(#DAX-r4;MVAdDM#hYa(|FWo|hM zMxJF|X*r(sxi5Vw(@P=+X*iu_BDbQ$6|?gS-)*5Kzr~#Pw9exh!$Y!sOa9XK1rj3) zUkB3H;#Aom1jg11$7l^5iuH@9vuDEw<#miO=;ZO2ZF~Kd9G=OEeP_$v>X90pNb(Le zZs}xLGInfd<_E2tK|Le@FbTl`zFx@}0jKl^Dnhz`a*c$Xn>s1&J2|UiyO^?!RMJhMp5Za`*=HmO<=c&6_c- z`h<`k)7y$nSql7!jrR3Bit?B*!F0(Rxo!FpydWtY2ecwpNS37)O{S{y9Y5Hh1Ot3m zyLx09xI{fCbf|-(V;t{}JeUg}v4cUKa1yyuY0dMyKO5|zSoZWkJhJ}WdNE3!LB7aZ z%qF@ScDnnK;L{2?;YhpW27s5o?-8Qa8E|fm`*0C$cfFT`?#FFN2Pv@r?(WV!6rSr&#{X8#TggoO^Z3`EvgUlVaN zF38+3%%p?#9Z9=CnbzGVxHDCaKT5D#rR&i447}$1NwUuO^MnsF;#BqXU4BDGi*EWi?&1&Jn)iAzFJU zba7N^h?4x#;pzTYw4LHi$X3iWW-`6kva_LAl3bGNdrat$pUI^XE4S&Dff8LD8Vcko zZ#rAI!t*ubf%?f4ne#T^hjKg-qG#9}`>1p7`dH~ux9&OzVw=GNXrK5s*v4dWraxE3 zfv5Uvu)2X1WRrgKuhdwq_yz~s@7iDOX}`gvVJ(cxM%}zxAe$u%3h#paRaCz(rZNRP zq&CPSBK3~at(!56np8t3_(f|kbK}@=Y%$g!Q0j()bC^&0E%7-xb4TT*dGUKi!Xn6{ z820>Fe$|P`9zJ;d-gWd=LWK|_o_;SPg7u}tUp8xH_)_4@C%E?$^e7J9!X{qVi3P`$uz%iDR_HiuLuk_-@JJG((-2*a&Ie_GfQ(T^+qnPLS8(;zxJKy3yz;ZOkEt@ z@$)s-J)Qhf7197Icbw;_SrnM_JQ7Jjw)oozyHp1*!g;%{qp#b+1)&f^Nd3g=!Z_iA zT#H25nX+}_MHLK;-|9Irs9XaoISyxpn9DNaAjaw93h7T)I-qU{!p62GiQ z=7|A5Qd9wi&0?Ty>ys;5WZuk@GZwYtG)68ET+Hujv(p^x-k*MLQan| z{-ugU;4#{(a^n46s_hGR+1XFk<(0m97$;m=4lE26&2Wb=7=9>3pE+OAR|N+Ad`kk- zP`(PgpKmCN4$H3dzWbgGIa}D>vTU!sPnd&p)au?Fc{nEcT7vk*-Mu0_>7&H<4iuE% z3{UkGR(*YXO&Slpfqhc0aRsuw(O1VF^=!=NK1$IkuL`pj`4Si)XSAGkF9Mo>zwiMpCuX!0-OK;DS^)vyYs#MO` zAsF=?{xqBPQ4g2t=|RjM4+rpM5?IEK9~Z=_7e~`Sxf-H9iwC~Jr&cVSpV0-OFlTN? z!s_26n^$pQzx_09U3>UElEr16?t8Yt$|r?H!z5WzX?)mYC@<9=j^8Qm0q(3k{;k!_ zO80>w3h&F!unks5sguXa9c+agY0k~%zd-ES#u3Y&!f;~RHlow&pRz}7wI9y`o58Mt zY%~((Og8Sl$jM{n+7L?`O#v<2xdClMw{~?lq}cEL*EJEmZbJeBs3$X=wwg2hNwbhW zar!!~*rq;v2#tkLN4=pR63G*Kg7`G8saJUnd*_VxJD9bH`3^GQ)@xDS3{ZFr&caS} z9!)UfgA2<^uJ#zt-GQc>vBVEWG|{u~QGONU!WwC>uX|=D#Ep{ZNl9=&X!Ap#LtEJA za44`v`m%n~fLU2cA~5dzhelg!hUtE$p*lR>$k1yJwm=&sK9OUT7b@!GgcO+C_#WyN z%pk9(fGDsFK?_O@F-Ed0-DImj4loxYlV=WKqt5wXk`wCaArnEFiPT6QlN1T4VaV@^ zTm(m6A;;`ZXEd#dn;)apo{BtStbcKX(|b9WmkC#4FAHOF@bJ^yAaB^xR~AM$fuw(p^G*i!^-g?-z~Ru&md+<)mw~NLtlmovE%kg86e?p7RaP$T zQWSQeHh3pywn=g@ydKjpG2E2_z7}oLhQ05my!ZfPJ@kzyX5$1oXi>iwF?YDTXQAib zYbIBYs5+(!PaJzqtSQ1?M%u1Ff+nj9ljCFw_{ke~V>TyhYOnP_fdM%ECR}gB{MCC1 zA?tlDj{8(ksTk{}FK#q&1*ZV<4ibzuFC#c9=)=}IBFVQqF#JkH^K%ukdp|mxjdgG` zjk5A@)zm{b#A8*G@-K)TTo}syDGAsNO;cV>^zm+WpduE=Pj8XlaOrumxZK$REo2Gk z6PLNUW zw-C=G{Ruhp?I?q&a>z3y+xwRVjIi(QVS|>Z7@o}X$VI}nw;LJy-I=pG;9CZm^CgEv zF|G*@p;Dc1i3sllk)%_SH*`mHjmpGi01@4Te`HFeNJR zxjE9V<3QM^QS7H%==`f2U=?MMz9wj$OzH@u=tuE_k^IGz{B*t5LR@iz(fRRBs8n=R z@tGj(#=9XdWz1$ZHBb@2#b12z<$D`7bHi|@(hwwnTW((hdxOj9t4=aE47TjK#cUM+ znK}z}bC6!MqL(T|2T{F9pFrNW(O$JjKC21;(n%*MC~&UH6CD8rau%KC7mz{;q3W{X z^8%2YGr>B|_{aD3cP)|jU01?BPoRbm&%em&TwozqU(8Qjk?0Pv;Ks-J1La)VW=X3W zU;Hf4cr71>N;9jU=P!DlNL9VN8A}TW%$v3w5dL8p!SD*o)1FwFo0ZX<;$~4UB2V4G zNG9#xY)gEYC_k!1xIScpD@lkB+E!u&fJpcxA#Y8L#gS zy0+Al{can#F(QBi&m3DSS?a8|mql%Wl(iPl`h_oTk|9fAS=8$xyKjrI=*8DOX4sox zIu7Xe@u*1?oY42fTLS9(dSZfNX6HtM;@XIOseV5J#&)|=WLIA?Wx%}i!f9uDU+vf6 zM~Q2!xZ#36bU*wDhH)lYynD+UZUf(Q(HF+>`pkVZbXJM1!vtO-s4BRv=^Z*C*PGW#i`ZNNnpzsY4M@M1eUB6z!gEcIvP5fE3jp=$shK#8DDg-3uZXQFwe`kKM=^Q1^Y=>8tIb|@(VMIy)pO%gKAD{lfDw{(czSbZOF#tj21 z{XQ)8*gCd&e(+jj6vlTiG!S1^_hc%>qH#pbJ^hXO&n?_URZf-ybA0%cKVu%Uy{*gU zZ36@1js1v2rd%oIdo~i355}V?R&bIwem$&(0?yQm8(8{r!#$3}ZQT)LmVj{h5*^He z1(W$qOVbOpsD9nap=ZRr0&5H=+DfKF9fG9?N#NEjI6+6S)~d=Wr~}gevgJBf!LeTyo{T4(kXeG!|X+bU^SdE z=`>;9$Zg3ejugw_5D9qT`1O&ABB1H-%1lCk=cAN#XZ*r&|B;TUDK|>gTdSd?nV_-o z(ACpZKVLf}R6EVpMB^}~iMNI;E%L)uNU)`q57l>{`5UKzI--E+_2^&^EGw7~#JziZ zmnSPG5z4)X{JulE0|q&}9RDV^rc&Yk%2vV0X_f#mqWMMP<8CK>KY;RTkO&K_zkQmt zNarTKiA~S$;1qvEb@rx{;1^P<|k$=Cs zu#@)0HH+{oyWHPPt)qYs!u7xSiZ*12;cbH0J`fxi2d2iiQMg9A&ao5~Nw}`_Z+GB1 zfS%*fguq6f)Z`dM24d}qbGUb|dC(G#-sL#3VtO9>^z$8T1XS;Y%J_uEG`LLD!Q^m; z4|zaW_L0x=K7M&%jC{Mw?&%j+f1YcM4@v?TDYMokA#GGidNCa@$*OwjZu41HKBSAG zD6n!x`L)+mYO!-b4XF#(B~p1x0B@jVf^Cjc3w^%&lul`3ZK;uu#P%TrpKlTPDT+ie z5j1O(8?x>~Qon%gml$yn3YW(6O9*$RtMD(v=wH%^>YbVRr4=FCv4b&K3+uYZ%JQ~A z-wWkzCja#EC9WVOU`rNfG-qRQr(Wp7wZ*l~Dv+581>7`%xxfD;Z*r5?7?rBRz^j^I z;Uj$>vUdiaj=`Yuvt>_0h5HCk6t&*U6|@FFZ#{9ex)4C=)_Wq4&H-IpY)F7TvTLvR zN52G(JuU64?1vw|0~SLAbU@~X1=6)jjJQ3~?>+5%UDeiJX2UP2d}K}fc7&%PMhP`H z%>;;rYhPus*!P3pkzEn+aB%9KgTl8d$Cv8{D_?x(l;kFlODW^JOL3=t$;#~64K#zJ z1B%Y7Yj+QiLS>@fx|wInOkFbDe6J=+gfZ+jm-gaVcul=%)--wXmIjH}Q;3G?!P^iP zrc#1uV<-lkJkbgywvA}b2S!P`i%b=GJz3W@MX37DE%EJ@B~3Q06of*AlQh7A;~6k; zD3O~VlGIrJDvazy7k1hSr^bvEE&b8>JQnm$pWP@_eW6z+yuUK_O=0Fa0c;rWiG!3* z4#nbUo24_O%utdPkeR6MkI-LB)a|@gC==5+2{7pX{%LJ9Kr4+qUB}T$E*N+94+A1OW;F6pc0M4G~+=NNyXUvq|IG6OPM zM6YtTmAa}UfEP3p0P}M8D)wPc>iap0Md#iSj%6d2_+I9Vr(sS|UaPTXJU&744W5q% z+O=PVu)LS;2EK*Nb`SewUG9!)Q-eGl@4vGr-k0KjTWy2YXkb>$5q-NQNI=c4hi}?v z30OpkMM8Qg2?|(r`Pt%L;HdQGH4)n_af+JW8`C4lk2C>v8e$+pA$Mj!7wzv$VJCB( zn?@?89qtdGlI`z|ztIiPm*TZQg;x?6t!iM5TgR@6)eS=M`;1Q+Z3YjGH)`!>=;_GJ zWG*qY^^hzhkelH{X<9GnbiPYrMH3#SqP%anY;U(5O9(>i!zGCPx!jpQphchXaU3zD z*U2bT;MP*I07`mlfWnsEcZwuKm8WkPg=zael-&(!F5VAX($`Z-ls^uOW@jhut8^c9 z>5!ovx3t3_p+wp!#O4zwuP;Y+`KfVZX!TV`un`IVX8I6RYpf_$ftoE&PzTa$30+pL z2Zy$ZP^%!xnGRJ_8?GhQ%Uk;Qe~1Dz8m7~Sy(6-V{s8{HvyjhlA3oRyWBSoYQTq4k zq4_{HsW4!MT3@U(G3%zV2h8wrMnJo}aNinj2oerAUBY1+2iphsoMte>o5&?}th1|3 zmXS>T%Yx0%tSx=dAxxkKcc?6ufJ*OkbJW@_?#g7QG96jaI}!2`#NA zg%Q4g$w=-C$|+_xv+~;HIe0dC9QDYwqUeEKrSaKi%~={DfbkL7P31T4!`l_3o2uuO#+Jh$k=3C%Qz6TOV%^yX~L(O+A;PTi$iV9pXRHA zNxUZSk%!dtPX34yV;(Pj^wBYE32c zafNbAcS#T%pU2}wuxyhb$$BunJiJ|L z?ASDBty+ zSj9pQX)weTx?d~HAd=qg#*^@?+eFin^jj8h2q+!b0Z1qzf=rvKV1hh+AFNU!cgz@a zG7E%TWw)oBd}-n3I>;lP+8p8^5i_g8mMT9pLo%geSF&|KkpeJ88Fce*K)I{!T(B+l zav;O6f)2jpGNFP?5Z7>At9RECQF>ET7N;VL5{p4s!G_G6yhs3fm6n=^jQIaI;tuTh z@1qFN$dAzDFCy)C!7DD7KHLNP&aOBdBq(2`%UP}BS<{V2w8TNYIxz-~YwX#pQ}~pt z-~5VNX(jv6PR5WWe?pjMJpH^M>99#6!9E+M+zvZ{sgrh7z z8u`b-J#7VeX>j;d=c)>2nLDY2N3*FLYV<{p(?wAR7LrGzGH}Gvbxp85U%B>+&SU0b zEV4ZiK3sZn#{U_uE?CME z-`FT@DbjMz3N9`Ag9V?gXl1yb~xiksM3F(_E!S5(=@0PTBD2WGc(uyhd z$5i@pK2R~EP8kM8C3-l>jKW+HtMwVY8U&w5cPRGn&Q!`onv8$fA7XAI6EODE@?GRp z@7K98Lgnx>IfkC>r$}tOp6~+WNmTwteF_N>;j_|4CLyq(adE^FzF#2XSvXYzm}#E2 zQ|=*-$6#oYjZA{vyPbAauKPo+vqS|TP!n{4r*jQb)LB09}) z$y%K_2So5GjB%(c^akaz0x`8L<+%uvRBqby*VIJLK-Li?4k@eOkRd-n9%WR5(*RYT zZMu+=&Hz0*TmuB6$*(3qvQx-ecVmr}+74Gohn0s|`UmfiD)a*ZTR`g@3c+aOSwZi z1*H@%fW!}NUTiXZIRGWuYEIk$W!DMmj2o1B5m9jtj8VL$U_`0@idFpubRrn>iwtCy zNyHkx7`Y^p=Ys?(;!l|3R$9COVURo=OTy&yov`do7dPJr8PV2iVJO&0o}(DKAsaO+ z##!+eY6Igm?Xi`RWlAjSd!DYGeAuLyHPzu+#Egn!DJqrhm()GOA6a2qDREZ` zdTFiGigj!h{)@~;n(x6k;A|BAY!o^E6Pz@EbqX1FAT_7+Q9_{>TX3pKGNLgM*lpe> zVPM~()0755lHfk74m}@)GBx1RNX>}T#%tMS4!GG%mY<5SZjy~BXuEDGYB4>wQnNxf z3ttGwAqsHPg>XyEval{9flZJNr?*5jXkM8G> zrKH^o03_bO-vx+_$&5hTF8c}$A+wQeNoEaH5HkW)RniL3Z5Zc!z+c9a1QfG=DQsbz zZ+P34MF*SXK(}KR)30?PF@L|Hb`mF?vf4fepE0W{DY(1ZeJEqUVLaoW^^FdqJcI$j zLA>E;d*MC5zSLl)nUF?W`+74Fd;9{PnCLA&<)%a_zc5zzUoX9KlJ%HbSRHZ&A3dEo zmb9$oxI!sO){r&y<}D5Uj8~EZoFgZv9@3&bhd`erj+CI260IH7g0x7r=DNwAcKrwLB_|hp_=(7@?9s47bSiVlLnmL~hmd)@3 z!pysyAr(&LUy8oK1t^@syfpKl(qBuFAxH#bKNMx-_*tE5Ia}Iqd2yM(q!*{@CjU@i zO1&9xXnp^Pj1fKFxi-0m+Bw(?u;6hi%vKwiVm=cbFi4PQ3sPSTm;5Yf^^*Rq(%RSf%706gNt0KZLn9l8y8OC?xRhgx56BZN3_ATCe>N>l@(d}4y2O9VMXz=(!M|vg(kHK$dH^8l3IQc$t7rBeS2MA zgs=VGTCtyKAH^GQ zAsAynOPHw?P3NbEIvrcSLiF&+HDXRk*H*syZz-aDaj=A91_RP$e^n@KLT@z277fN0 zW(&<-eHZ96f3;E(I=ji!A}3>WFXAgWBPgSTb2d~XF-gzw`+p?l?oo4e-M>+5O;#(9Z zynPP8AezG96SIt!Iqo+;X`JZ_IN?P>0Udo#{f({wcSrONIav6+ih|W7sPPEmEJEU3L~XTQ8)@$+x{A_piiE1-AqW=8dLXcCeq?tM)jm$# zkrNlnq)3CZWX5E9fm6_`S(u6wec~N2{=glxpObhU3e6*JJ-9QyHfES`DR*POd&U^> z4)(!TZ#_4uiU)MT?LV$y7DLmB0nQl94-Th|MFx?T``xRe#G|vH>Kc)Dt(BEgJ(C5(=Wcto%2lkc0$w#F5YT2sxY{MBM|4-?>)CB z!tzEkhBvUBKY9?%c8vEd5B35o;caXDZN}0YAwuhr=J%n!l-S@ID?$sX`LF4~7aG`^ z$j2|z$$bgUd)I)V#Y>HrDbBUNYtPIyMg&tosYK&oh}}%0#<$GvLp(}_B2bN+paG8D z-YoMA)&Ey*@YG&lJub^KqL&uK{6o6t*5B8)-4gsCw_?0P7%1}MzVX(>VwI;;fkY09 zZUnroPC?JO3v`<};EUZWVY(L`sg%U->q-l1wb9aulC=aogqJnn;VwWuf~F13KiOzX z`ejE8S<&xm;Rs{-Q~~2QFn?NLlw$97KU&B9&^OB_c=rsb&hFFcld8AO)9_*n)DVjz zvkN!n;BbAS>qf^tjmw)AQcDFQv|jLyndxE3+hl!NK3Uu)F=G3C*II9)vYwf2VxH#V zITaRHfALvylg{>g*4m7Z*cS}p#U0q{LQx>`H%uhw#t<)v@I^Yd0_qBZcV1>3lC=nB zrOvCDXIlw6-B{u>tTWR4{R`nc^x^ia^Nr^g_lq7<{ZXfmb@K*`hujHEDa#0Ty*YVS zN=sE)OPBbjHz6YuiD5vGZ=KL!b@E5kOJ>y{QRhJUg`a#R=gw1plmkcVJS#|YjO#no zFs7rg{M5l({q(yH`R%C{OT&zggoU?Nwq=$Ku?xB}# zpI-V&f78jJ65hrHz|5?F2NW6e9Kg?OB^+!gBe4qNsO`SSTe;3GP9e9CHDN~mUzum1 zV8x*IBZ3dIAX&1T|s!h4LZ2k3h# zzq?>zjL?smf`*(LV93g=h3TtGA&}$9U2g5%k+U$({_f3X-y2(^pnH7U{ou*MW|)Kw zjC5v!zt`N|8!8qB@_QaLr>DNChwxORbvB%)(@2S%wts40m-I3KJRiD!2}L#WPRYoY zj#BChvEwtS31niNrcW~WIbxa_ZHfA3o5f~)_%7*K-zxzk3lld3lo-jl@=oyb-+5yP zTN9<2FqEZdMg6)D9FBaBkZl{2!iMqPS=SxO``5ki9{Bt&K)GUD{$oK{fZI}Hx$JGu zV@|1?R8T=Xxzz*O8%jPNy;x&uUn2T17T#?I>xx!Wb|J3A_(k<#sa zX#>k?kV{Hi1<@*vHd&Rye2<+~;iU#^9xc85>Z&_^)RySU)l9p-KTX_6wc#3ax zJk7QHereJ%+9QAxqb}Eaq5D>Q6x%`{ryAm|Tu~%?@n5G9Y z_@f4JrXGB(Ge);IM6XeyEnL38XBemuaG6Leb^E<5tqmyk`)5M@;6Fv#D}F-^ZSd+b zPO`K%I|T~i8;CL4rKS(sH;GQA8KVl6l1f~RFQ{c+tZ3>+qY=hK+7E8Q!S0rObvz!hp$?o+LPhIUttqV`8)p33C z8<~W25>&>b@|avc55d5(X?xs@#lQ+mgoxBQK=p=$Q}E~JH?L6fDkv#g@&%?$)*q|Q z6GzY5o9tQ4A%0$hlQ*zPV35(awXX^lEoae)lBc&|L)kE$CBgeLO}zW@uTH&KkyfNh zL@zHP#mO3Gb3p}(#IBpQ_z3QMHInYu;MkeSlG}G`9s&Vr;S*87+d&1yk5vF?wa4Z}+{phv> zsf`vJ-lxS_S|e>#0PdN_0D|;hyq3n_!AF{03x7_iuNLI{8dSJfr+UiC(agZleol|y z#O9AXsGpA5xiyrQ|0JXd_tWpwg(tn8j~WS8Sy24cFb?(bTy5q+lY{uI*d>1wnFwUG z#isKNwZhlVG+wv*k|&PJF-;}CDn%m&Cqhm{3q6d@foGg|dDK>-<4l;TT>iPJVof<$ zCb%tGk4H!@jTAB}RQzX10H-kg#0~2%uS2~|V!DzeRd%I4yxsL-6Vnzwn($}KFe~K# zQDTzg3TIlsZQT$Ojaj2StXrQt7VejUUuTN9MqC^x1-N`u2sDUqco=tgL<>CZKupZS z{qAZoifq9~!_q^8A+-R5VWmU+E}8vTyeJMUg?E2{@`CO|Cu0-puO0?c3Kr+C;a)7W z|G7cvYz$Qq0qc4TqM=W@P;9rC8T~GRtOWjN)1WE;bo1+{BUe!q&*=%c7q7{LYcgiY zH;u;F)F`nvK>E_&&kuNFcSfaq;a!$~gm`U9Nj&-U;4YW&eZSFBu9S0a)wRRTnW&ul ziHw;XULtlVL$I$|#7)pP2sV^CIftTvG`1rZ2u_kCK-hMONs?G z1A)aZmip$pFAjD7bAh;R@4ut0;#)&U8%FOs-4}5-fZV_iNqi<@bS?6>yKdW=G3=Wu zc5_mfVAE)?;u+qjjC^RB>h)d>>Wz}%iZ%OoA(8_5t->Kwt0+*DuO4Eos@WK_blb-bSgGUO@tIKnClm^_T+Aul16W)>oS!XVlO zH@4?@Ccz4NVKS`@vvb*Yo<@*x|E@zI-T$J>k?hm8w6ff}_|k#Auf$quN10XMj#_kg ziDxkWZXSEXL{$bVF)vQhnyolqQOqZ=PW2$Wmo2sz zIX{2-fN>8+GunFC)v+xjP&^( zpsf`AnaO8{DS!g~%~k$9WO(~RV|ULj7*=FLsZaYtks8;1a1`lRs^(8wWwuYD1D zWZra@z_Ht*6H!7(s?y6P=DaB$LWgyii6p#}db{LL4hviZ?qqibe7FuvCh-IzO@@BM za>>!=iO%wV_Vc?Jm{XZ8g>XGjgN8pCPgSj<-E~L!7*y_GNaz!!jOs znjF0`ik?LC>tE!MXXM|-q4CCV=Z~72L;J}bEB6;4)RH+7Y<9%gi$^$7GVmm4`QyFh zwWF_l_DbTFl{WO~*=N|i;M{lh1npk~Me0&rZS6yr(7zL8gRJvGpEbb_GruI^<>9mk zxahW3|JD5en9q8eLvZ_sm@xurhQCU3jeV%J9q1k5)wed>IQ+i{S=#4G^lP}d#*R{@ zx=KrW#P4M6)b8W5gtsJLc7eCW(@Fn~a-Wt`$4kwlrOzl)3o@s=@Q9`#XUaW$_1ov! zPlds{_U^b}vQ-U9Y9zQ5Ks-HM^*KW_ejB77oM^44Ly5A{pPA=_4{))?ObOigRlD0z zX-1FOQjS%-N~J|_a);hQJ&~NcV=zSPkB#6qeMMSddLM!|PbXfjbxkB8xWq^L`Vf9A zH2g-J2QUL*c%c{B{E6Oa@xq9@%yL;~& z55GqW5P%jrZ>5g^3fPf4s2I9s%7>_8MZQ+dP1u4Ra<`&#w;s95La;zraS7{v*c7(OuC26uwd=FXZ7RzdVAXAe$iq0;Qk$w#hy$1l7)N_+%&%pe)| z&bTo*8OP}W07lYDgMPzO(`KU%1)jv)^nIL;u+<(UOvuFD@4zqFBK4l}qGJDBMnGeP z2jtn%TFsZYWPs*P0Z{XoEIQQYT9pjp_Rs(!N4w0Im`2QtLWy#a!u>@-U^dp@byixQ z1N{t0K{7~H<^n9=)Lnf*U!x_yj=9QrvWn7qrpS7?T zz)jFSz`^*~?I!9LFbC*YK-6{c!v+95KGPwcsEk1*4UPhhA6C$M{Xdit}&}mQhgtfTKl>W}H3Z?-g?L z`sd56h{M&tWNl!?8?7*Q|ChK&U7be+M*zk3;({IjZiN!nNr0Y~@jq`h9Af_mD4n;- literal 0 HcmV?d00001 From 9f598bc2ae94ba2fa9bb3e9905629e80f478cbfa Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Sat, 21 Sep 2024 14:37:41 +0200 Subject: [PATCH 006/132] .. --- .../data/appkit_launcher_arm64 | Bin 0 -> 113152 bytes .../data/appkit_launcher_x86_64 | Bin 0 -> 100192 bytes .../data/menuinst.default.json | 68 ++ .../data/menuinst.schema.json | 731 ++++++++++++++++++ .../rattler_menuinst/data/osx_launcher_arm64 | Bin 0 -> 68112 bytes .../rattler_menuinst/data/osx_launcher_x86_64 | Bin 0 -> 8920 bytes 6 files changed, 799 insertions(+) create mode 100755 crates/rattler_menuinst/data/appkit_launcher_arm64 create mode 100755 crates/rattler_menuinst/data/appkit_launcher_x86_64 create mode 100644 crates/rattler_menuinst/data/menuinst.default.json create mode 100644 crates/rattler_menuinst/data/menuinst.schema.json create mode 100755 crates/rattler_menuinst/data/osx_launcher_arm64 create mode 100755 crates/rattler_menuinst/data/osx_launcher_x86_64 diff --git a/crates/rattler_menuinst/data/appkit_launcher_arm64 b/crates/rattler_menuinst/data/appkit_launcher_arm64 new file mode 100755 index 0000000000000000000000000000000000000000..80afa4b37c528d4a59b2700aff4a4e4674565034 GIT binary patch literal 113152 zcmeFa3t*JRxj#Ic4G6ZT5zp2L16XE$yU$gb zd0~l)Lzwave{wZv<>PRKBVDcGc(9pY)S>u2XjM@N8~NoiKj=_Cil3vy;|qF1@GL^^!laAXv}!8XOOiqj{|qOwo2<#4#dk&xHl&faGEiV#5M z@#G{GfpD&YMUt%W2fu(Ha_Ps+PXrXdUu!~OBR@^2ZHFVCU%#`{Gb+EozC!VPFHcbr zHaooDsiZC=fwiHS@cN`4uof z!Wr?S`hsr8%zsoYUnUuRdneN^!gHkphN!1A#vi+GZuzJ3~v!_gi{ z^eXB3^&+l(qRDbiglD}9k$*?`Q_1r6f}XNC!1*LRRzA6(a`{m2sAD$gx8d`OpDtIz zCVrI7_{02UtxLtPnfYlV!X|!kUgThY-cDz`hpLKMz7CUogmaQOBm*kf4kW1f7{Ufj zHOse$`3bJbgiZXCM07aftfc=aeorUsZx8U;{K5`r zxZCe?bOZvMM%TZd{fb{Nw_C!;;V0(M)BLjxgtC^zt(VK_BdL;{md_F zU}BvAu-I`OQah`GaX8l0)?HFvRjYbW_*i8BBnIG=4^uvpKt^8k(8CsSJgTcN5H-s1 zg*=NO|Gdc-u@95h{WB~wJ!)<=ruELWh(`d9R9QryPlyxY*8oG$C*V(pvT_dWUg?|q zPf>+M>`4(c6@G;9oy*_7^b7z#rcgw_2CG+9eR7RY1o z4o5tliz*gDE^jL$;UT(a7)`ge#sW6AF9LQ7x|IFy`B0;48%UCkb($WemQn0$qMIGH^=GI}y(Oi;VosUmTTR z*SY5|D(1|Z^&`Y#P$%n$X6TE`joOiViQ0_m2%4B1=;Sn$D>c^$-s&DB*`Ib$(VA~(ip2*jHZVe>GM(L3}H5>i4k)& zeg2sA-f++vadpHwjHag+lUDxPda9y{Vi=YFvTe-vDIf9vRW>h5pV4BJKm1m=(=94IAqO>y$o48 zDl9t>L$+5TqqurO&2C}+#TSM6#X?J7Y@ZMh9)$d_SSQ3@Jyu^v>CCc-T?Z%GhW8^q z!Y=_|Gq1XT_Qz~DI;^L^-VYfMT4%)$S!c&Si?H`$_q_YL8#_)A!-LlR*i9pY`{r2k zUvJ43O-rGJw;>1Rt$cW->DMD8vxv49ydScPGLpX%@^^@??;#ImdBa^FO7;mKDA{io zO6G5I9NOKlXm*jYvzT+mU14>78eL z`0|R;btMmVC1-+dxHjq-I;XsRMU5rzhCHX(X|bI1rG=Ai!v~R$uw3-~L8NQuEySGX z=l;|pWyGty#yZITe2xvpI49%0;z)|j>%NI&=XELN6?q)UL0*yPyHE%I5&6nT+2MU- z{_%L_vo0Q+LiHfEF3kF>#S%JU7)g{4VM$=_M~W+W2@>ym4=|=k@{Mk?ocP@3mV{ zUr--5T2X&;Q8&;BR9bdYU6>B}3f$HGL+zr!3_6}w5N#Y5HD#zDJE?3QM!g(Ho4ReJ ze%TP@!nvgfw@wwqCm~M)X(9$ebg~L=5*$Q?&OY?AVpn&`%ZgR0(}mpnaijp`Ro@e^foTA4iX`pO{*YTOgO# zBe_4a9)}}0YCYDz6G_seEl=s;D7w z&w~0VcIy6!`k;lm6Phu0JTRB~8sJvzgyy>~)W_$ezn+f1uN-CbbM?|}aX zt9WqVRL2nN;Z99|0^Mu@6vB_Hn(v_UK3xg$>EEVP?z$*$*O* z$F8h|tQC;C9QE`kyD1MX?;YRBY8 z`+eqWifhn2rD3F@xZ`W!)&Jz8QGmTe;0Wa{Qkm$Bw8FrBTGC zIzaW2+$}T3@SUw<#hsrQE2!UmyS^Oy`mxm26K|-rss7BHtkTa1?Vq4q8b7tngY(7C zJopcO%ho@qSiFJp>b=7L^7jV6b?59_$hq)|6D4mw4x01)HpW}Z_rPCOdUKDB$ht&% z{TD-CcSC-&j9;6n^1k~oD(@DIy_EOC*Hh#jaXmWkaOa_(_aOfr^K2{jfj53{v~$j6 z@y08tPw$@~cD;&xE<_*QF;A?Zwr~h|?w=Am`8>C&rxEuRgqh3zt{W2V>F0=JZcpa; zQtsDOKAhaX=K|j)%P`Tl3(>ZX?b7mULZ-W|s+?j-???)nD2{A*IgpCiP>)UL?rHhMGS9lP=gSx>d!E`whx z-RAuvIp5_k9zWl6f1k*=)~y}sq|#6s;$|jWnqLo&mo*;U@nf^a%?w7gFPz>c1$?A!|YGI~?aA+~_p~CxAow_nt?8-yg<;_hlyJaZ55tJR3=O^L51~$1@!tH=fx~hSERQ5ALzi(bL z{R+gph-uD-yWe`+&_x!-!&oo++_}wnfDe^Xxg)pvCb&s|ee8GW)49!k+h-4bnf-5v zO=AJoi;u%iy7?;X)7bwg>ctBa4fVoGYa-I$8L@?kqssJ**f-&(G@YNN^2?WHLFs;; z`H){X+>cmi57AuxZScrL*-*YQ2JE7A@?mR!H^NQn6u|D=UNA)A#yT?@{_k;}d7_E( zblH%qGqYnG5JqXcU{l^`jd~f}BttW7%mqW*kGPYrxE_oo=N#UU9J;wP&QxV zxu_?)uC(M_^!y{%%Z4Z(t=HQpid_|VsIsSY4x!FP;J0r!@tPGQT3WwS9mD$ViWcla z3|dc%wG4jwnSn2V=gq!fJ@sbP|F<_S;@C59BmNUo9%^@>fv$gOy>w_0{(Wcfc&6nq z{cpCMFz}|O?nX$g@%|lc^#P5C+Ka%k?knbSES0K-%x9L(h zGiAPw`Fy;R+QjI!$I-w~WxFU8h0pzI{==PP?d6PEa}T@)y;I#7sLO4B2l9~n(3;%l z-P^?hVVO4cXZTTh{T(*de;Hnz+kBY)-+-;^#SB?q6ux_UPV-EQnv2-L>m|gIbgOfl zpJ%#PU=u%4kR#_e7AwjE^1sld#@O92E$=5j3s1>`d^3m0UGoLY zr*~Ut9qp)4acXBOe!IW5tiR8dbKo}S*N3v23SLBWmrb>Umr)*8)bYb8&sR|%-(}ez zg-!i5)sY==Q~z|LEQfpSKeGh7>VHKXSO~l2@{Xb12p7eT{)%)GnQ-*Zi7iFRe zZI^DQ#Z#OKH)r8gR{!iIi{+9l=dMB>vP2L zLdw5O$UmgeBTofjV*+?Td6e!P2nz zHMEt(NcSN8YLHiIJG)?0dVR}tn{DiVqBOU88QfHtt6)=|r8rL%=QbC!|EFN9a?g(~ zg`2`F-?zvy?-2TwmtmepT2xL{C(c708)P~JlLKA9i7=Au43tUX1W`ux14wr!^SW!1 za=*`M&mFQfQ=Iv*N$!`Sw+F#P%Qm-&>M5n0AIk#|>LX8v-E*RCxF2P|!qPCbFPGN4 zXT+Ake{hAG-{f5@4p=PZ-z&_G;#Xnsz4&L{9lU9br#@slWTZTjnR|9_^XGHKsg$SZkk7k- zsh>XpHA6t+Qd54b!zwa1{voX z)ZggaDsQ^Kc@}Z0%&EWG{bMCBtxIPhZ#_42zw>+5?{xgtBKsZcZ+hmdu*u9%_cvEF zKk9F&K2W~zDx`eQmgV>g@=klDyAVcoC?f6IvD>7bAG-y12>RO%UCu#0QvI;f;au>! z9^s^`n_wSLS8K-5)xnucSChd<_1~)f8Fh8ARrNdPV_*5M?bZViAuj1k^-cR_-$eQA zIBaR2h5nxAiL*}58ESDVx;da5m?wr`#JZC5IvMk?w^09d``H72&!aynY*F#2BR;ha zsuR~BjLL6=vrt{5l%8fM>~yrPS+lu zJ(|8fL??+Rj6t$3^;cRBoDCWDSfTrK>QiW5MDw8C^DRdUW&d{mzA%RYnR%!oaR zb`<5ly!IKi1(%Bd^SiD6FZdIEIK`p)@SQLRXQ}n9b-(Jv?~3=~(=q1Gj=e^00BNZ) zvSH|bxT*X}KcwTi(8uE_k96-b{xtt*K3WUYe8*_0PS=8mnq%h2o`Cxu@clUW%{^7s z6-wuB>_^W>Uv=Gy(Z-VzMm)ya+oQTyBzd8(V@w@1tp&<3|9=Vn%&m_l(%{ zoaXhgX+EXOc{<{&xhu_Kej($`jBS(lEbNyi?-8P0^3$h_J`=k5>jX8w7)uvg4=*7u z$>BtLR4&cvpGNCpdTay2)9FF)Z&3T*{mI;B(a|x~hcye~yWX%ix1uaB1U+PH)O#YS z^I(N8a$<50ihS&cZ1jGM%IkHwRlS)JD+4d3)BM;HxRoxI9(yqsQXh2={Hd-kls4^6 zCF^k&^f+R*92mV{too_4rN{?l@XN7P$xr}ZB-=hq@>p!kQDgeu_wRV-$@{;ZWTW?y`LV}1j`LOJ_b@Pp z4M;mb_8+iS{ZQ`*^j=!w>sC3>{64~IKU>!yUFV_|V&@cD#`!Tlf1o(OMP5d%IVj%= z*rULE@+&9deSl@>O^AQ!6&io0W3MCn46QYk4AW!yx$3T#$>Kq(TT(wC&uyLoeNlPc zhV<2#JTrC^+?b2X`hDm{%Fm407vM*AgWA#!6h29m9zt0d)A=U+3BLw=U?Q#QRXY3T zs&a`Mcx;2a80J;P8TgBu*KEIA_17fZYxi23=T6Xb?-?F&}IS?}J=z?0(|E ztj(W+o67BS*p%*}`N^_f1Amh3aoAL@#N&zIQQq=Ve$!)XIlM{Q`LRaW$F5ur-LAs^ zPjx?ZE$bci)n^x0^iM9Nu_ur8mM`*c!@CT1i}(v+8;**hAL_bC<$Y*-^p`D97T%!C zr3-1${^8%TPfX=4^EDfF7JZAZ2jpk_x|*|>-)?F4gQn*+HUALD?%ZdL_vEdXX1w3b zUz;oPeK6*Ie%e#S+#UL{#2$mK%kz`q*#$Ywd;64j>&=#C3wS2Cx13lM?|vR)UbJ>n zeOG>LA$XCVjrmTd#rz4h-vlk4olxro+CR#X?dTiur!vv>`DyAorAK^rNf`wCR7-4- z%l!Mq18&;WqdCS`C=T!**h)^kzoIx&&e3IT)*F>&DNHwLNN4oUjb!WsemqCK-jY-P zo(=B{68V{d{7lDwWqu4-o;B`ZIyxtz&TG*AfM7K^_wbfON`QtB7Le$bCc4WLGxpo9?3>!P2(@kQO*6tXOTv_ef`^VEIWHX zZ^Kqw^v0EQ_ualkto%~P2bIs}9lH9)g_}Bt@;?6T?O1o0Q9bLy-ihcA5B(nL(!BUx zS?^}VehWOuDqbHzy*r5gLz0E`M0??+?^mD)s&{{5I+C+O>Sb2U27B)WvFttT%2>xl zv2(g*_UQC;MVU_fQShMohfaGh@CfQWrH#u{WZJa%qSn2Xc7aU$X{MvJ=gYJUVx-T% zTg0+->2@5Qge8y2p9R@*Lqg`kA51Fy3&sJ=0q|~O^n7lt`8f4`RBvxVe@Nv(ZBf@v z8r!HoU~hd_6n#8}8|Pp2ULIp`im`&`sv?G~Zpu3Fo;vSX`LlB@me>CbUF2EvzK!{1 z6XCokuDzY!sSHAfF08BPSZ2IF^NFwBz9C0EIPjX9+pNUC;J&|I^{nMuvGZl*?w`;cK4#%{)s#^_SG2-0ZP54}4zibi$NEo`ut9 z-0)J)^w)Dl&3i7$b2oTz1TVb19Hx3hG_SN+nyJh_Cv`DBcAvD9`y$dQjprlVb8z-( z0{V!F=qo0n&p>~4qky=mbPwa0?)!l53#ld#MXH&8!F^Xney9CM=w&cd049_0V|yT#7%MDd0b z@6fgWp8FTt>!bd#7I~{d9#N(t=OrVRv<5N1+eAC7!1#{MdiPHuecfQ_j^yuI>K9Tyg(F)J-buM^BLxY`AgKuL!Oh%l!u7*{X)qR01wmyB?rzUk{qdI zh|d>)VQm(8w@P}7e!<#&7j*F=%;3)xWnnD8G2dNQ<{Y4XGFlg&4Ib3*7hu03&-C7T zDfSyM?~(5-)w{e*5YjxI zba^_zf14G5{}w$9{TcSQX)j;xx6g|0-abq2-O@WX-1jK^Dw^}{-JU;GAm52oT=2mA zI7+MMLQ8WE-Z7jEd2D#MumR_@D6PGY<^4Kd-(yPVzhm#L&pLg`wnPl$`WNKq)FIn4 zG5qOIh~f9KXGr^opP_tSuhvAbtl&MY9JLnuzI6lk2&c#H-M$|0A!f&(l;^Rg$I$-K zCT7P-S0q!%53J3PS~m_w(TDW$UPZZ2?Nyx0aR$O@SL}BBt<6*5rZv=Qu&I9*=kLHf z$@|`n-v6sN`|kbAn@@aa$1_jh9i=6D?9Ka;F4Yf8tK3WLDAm8wdhuGYnvP1e8#NLJdBb4zEUWxQSdn%O&&1FuD{Sfaiso$hE#)H`J zr2c}=AZS0*M;B-*oo*U`AkXYlOY<<+xqG+I7)7iPrPBORJ2^!@9K{-2}orFQz@ zH?U`pG+WNMG+&Q!>a)~b3}=&pF;{w{=DZ!x^xSvvn+vgTlJ}jzy;)${b$id$=rehR z$KIS}x#f11CepGt%e1H*Nr!0H%W6^Dqzce}H;M^4jN@_ix4=?wW};uj71P z(}okpaLx4THxzs(r~gXp88@t$B;L3dXTm4bn27VG2XDD^Hu0f3BJueP^P%&Ir02a) zclA@9k@<01o4>;OA?!Sh#*o>uPr;AoN#v$F@HoyoQ25+WTbu8JE~tE7M)}Y=iV3I- zTM&op!gb7x@_HrQRKDG?`|yr>8|(6l!+jh! z?H#oERXh1cVPfxK;sQ(awG;K;!SvX$9Al@)=)5TIi_0hZUxFW%70I&^{_h~|AHgOW zw!_xx(K%6yH(AC(KfT=^-#5n@G1*Qi|Ak*u{Y}5sj`t^xLzDZg{nMw3Vd}rVh*!8t z$>};>$vGGAo-0rWhmqc^kb(B3aa|sByW6kkQC3v-9p82j} zPs4U|vK*9dOTOCExNEwlc?D<|erYM8=yH`#S8+C?l)~u;-AxmeO-4bJ^1zL+;g}thb=w zpuUfE@C)#2`GEGJ5_<{D-yfOvNf;{UBUa2$a^}c!a=*d7$KdWYxPu0FgTY;7a8EP1 zkK`Em8{B&g?p}jCXmB?e+(icWG=uwy#lYX--eYk08r(sHyTRZtGPtK1+((3gzrnr7 z;O;fJg9dkl!Choa2FZe(+ut-9~k%>+a2FZe z(+ut-?;H3V+JRRGd5_*P5rx%-EYB-_v+H0&gK3GyZ;LJ^X&dJ+&D8MUwcfZNCJ$Kb|qaisqva1XKjhj7y!-W2~qxam$| zaz6m~EG)Xo{T;ZQ*!^v|ce8sp+!Jt^kmB46_tosa8}3KgeJ9-aVk3j%+yOWC1Eu>m zxaYI`X1JHL`zE;U?Cyoz%kD43{W*4j3GN%&{jYF0b6VHIjd!Gy|Fv+>!Ih$v?&sjf zJ6h?!67D_h-U|10F1s$c%h(-)dpo-Wa93~{`QZLEyS;F4VRswcx3Jp<_XF&1f%{o@ ze+KTqv->i*3ovmZ**3zBv)9ty1b02V*TL;&cOBecVfQ6)Kfvx9xc|WJYPbt<-7@j4 zfV+&{7s1`c?hD|)p4}_pzKz{waDSKGOW^(qyNlp{nce5ZO_z8Q|8wA;&+bpaeKETi z!0l)ET)1y#_nC0d3gEtw-810E`z}fXuhxXvhwrywt|$iZ2pT#O_R%tS8NV+xjJz7s^8;r7ZYzM+?0_{R{;!;>}Q>h6VdQp*WUY)%z5b?HoUGjF>dCNt8(BsEv zX$m1q;m2({x>#FXx4stNkZ_c*SyR8!v3C8MrrL%z)eiD2udA%anYN_Il#|5@pRaSa zNL__XiBaJtr$vk?vr4|kEd-g1(=nu>cKlp&wB$e!fW=Jk8S9Uk|h!i~7s z7kAQbL%|pXj~7q8j*beaqAU-EoZa(KcN0$q3z#y#U4A(!i9jo0RD5Qs z`JquD%4h~!U!&-a@{zmBi+i#Ie%vuXPia*ppj+f9dI&}_h;%J#8iba59u<$})E328 zHGC{Zs2G%j?gK{gl``Y25=q)RPW%L0EzWWHCv>6W^R=ToSTx_+jlj~BO5tMRN!$C&b((kBAl86&-<4ix=Son76g zF0SAncs|?Q{#GImw?8g<;V z{GJQ1W}gmcxI;8uabDedjUwEIj!=FhM>NfsK5mSH)JLHzQ}UvTRKt3b5u|V8kK5DQ z)m~*HN(5`!Z1WoEdrhu@FVXa6ECYL%&p@o46-FNn`|`oGBFV;7P(J9|jUy%d;@fs3 zBO~a5;yotjGf~XjNASLKik>Tf%N7A9zA9R8*3{XtR9VJ|n(4uSR^C;)S1nO{oh zD!56mSK)srXtk}=t8xkPJA|EQput>N%Jy^kPeD35?yZRX82p4G?ip~?9P@toe**l; z-hr|wyO(W^dw?~sUxC+Mi1XkF30e2UO?7T3{O5od*}FhP_H%4cc`?Bw&y8=H2-Hq} zVgE`u&);g~3?YnCT`4fwuL^|p#9-wXZ=|DoEAH~A&yuVZZjaOF3%G>S?XGV{*SFad zLhL$x&}1b(`GM~=th}Pj)8$#&6~?@%0x>tO6naXUl(N@d<)N=8_X zR*JAEQtjXD4F&v|{X|wK%jgxJZjSa!5f8>SYHMUMaj`^c!2djl?T4J;R6Tx;)0- zcV$Rrh59X}P^2H~@+T3xbq;6}ZstJAHsKp^D?Lj1aECMGamO2(nNg$1<-un$Mk`>H z(vGh#e5S$c@-ziDc~Hovf?6NMr(}||niPfRp{u+;l%0`K`%U?g(sYAd&{B--C&B5-*yJk6A3EVpsc9 zR$*g?h-m|A2I?|bNkeFr*Ij{D(CLvgh-3vKtP=C@c2B*_ zH#q6bLTDDr83U)$H9gS_Ah^cs9+fy6rnlXnTCny0juaHCo+RnC3LOAVEt5QHWwjo) zKjQO1FjKvuF&f>7$6bYqVM0Hf(d?;{NMe)}mm0KE=6b&~Wpq30q0e336$x}=5W_;) z*Dcq>-fbTAeAQS+Z+7}nPRZI+RH{KYdZ<>f#Pnr@H|&Kt8?nF&Y)M5hW+oNSCcW-U z%9JUryba~K#u<*Nq$+)Zu*aQD&=sVOhOph^!nVVx{?t%i5-LhjtQ0t^9*}3+ia>#> z^FSdf>WK7~oe464V$cIaD;A?Z4;r^n^FZ{jZGli{xGA7#Y&7tgCV9qLq9-w62syVz z#~wk)jWTums0Y6UIoS<;@NNuwGB|7XdmSfNVXE2FKB{c>iHAX zAl*?b8jrgPdpL6N*^07=P<=j@%pO~4z*FP*SYb)gLILa>glp*= zqv+p)*swr>C6Wl?vrk?>g2=*_f*%`B9$y=c@0Hk!ig?0xo-Kx~)MB5*>35-pBZi(M z1IRJZ5Kmw%r@2Kp#i3rk0iPy{&rpoZ39VdnHgwQJsDC?oOq>U07-n-`?K5MdU2TOs+cz$M1zBxEk}>-(og~7&)`Z z-!l1~kr79CFoFI>u&c@9c(~c8Aolm>D@L* z$hl>M(}#N2s2v7!nukDFFJq2L^UO(DfzZ5|%yYmGVIE8F=i&Y?+)X^krIm`F+pmJ( z*I@|j=Sjpj;_m@tFLnf5>LL%6WCLE4i$CN~amf#R*dyfk7sQ`w@W=l2$RFXiA1_aa zV2Yr!7MLEG{V;dnP(~E~#0TGl5|dz-!_Y%E<-w{xH;tno0;(6eh?9FV%p4f{Hh2R( z$z1EeA3Wp+4RU&cI4W0WV&V~tIQ6+4VZoWPQx02&B{x@0*fmk)ESw~A@!r9jkIbEs zCvvVrW=bauYY_YKH7AIiz7vJzz7vHNYoeT^Q^bTlQ^mwzog${?o-T6x&Vc_JBDeWt z5adi@Ej?4@44o-X&YvT!%OTvJLSflgD5mDl6(?2A75Jft5VyjcJ6Ly>}ro4DIzFByVuymXwa!St?C;HA66B~-f z3AYxD$uAU(yn+&8y$&00xl2Uut|em9{w4Tjy9M&Y)W9r+$%7e$O7_9@!CVD1$AVLX zu(3Y1VmTro%eF>g*?OjB+LSqBA$$s8E}+VT=dg+brA#eqnDVh{|8DuWoSSmLhK7Xt z4pRkll;a{j^_b$ON~aJpDV-O8snVf3AfKwKG7WMQ{|jJxur8*D-14cKT396ovEt_u zs{XiP-@);0G7|nUFXDY2Oz!iF57iU-7{c#?$By5sa9t0L^gls(57vF=CteHF2zd5xm$U_026%ty!DivEStyNc~;-sE_C!^9Re`RfG#FR}B`QBXehcb9v9 zoXC%D5>8=fpR5M58pvuOtAVTrvKq*0Agh6_2C^E+Y9OnDtOl|g$Z8;~fvg6y8pvuO ztAVTrvKq*0Agh6_2C^E+Y9OnDtOl|g$Z8;~fvg6y8pvuOtAVTrvKq*0Agh6_2C^E+ zY9OnDtOl|g$Z8;~fvg6y8pvuOtAVTrvKq*0Agh6_2C^E+Y9OnDlo}Xxso!V6&9-nW zJcaE7wimEn#P$Vj*RZ{}P0=+mZeiQU_Exs9W4o8_d|X6AzZbuQ@ou(%!uwKED(ZTWD93Eu*DzJ=*xt+bPuSkiHeDD@dWo{VgY8?{zK88SY(L8OKDM7@`yktYVS9+}T-N6_ zw$EUDA={;F+t^;ib~D>@bMVK?*8bWa;QItL z)^-a!hSJcH??5L^rQLN??de@yo^yzpddIdpt8-$De?Ju?G*kHlrnuZ3+Z!t!AD zakw*0IHJhsmz~M!7vM5}ohC)-Wj-pl5FP)i!duv54`Us!ZOud9$1uQpKWMV2ZBqQS zzs5H9*LDkI9Ue7>4`@C*o=@?$u^nW)Py2Jc{fxD(`3tQVwry-jO}37&<=n&J|6kj5 zk4P>|Bd)!rve?M>XW7PWTGBtrc9iWt6TXPcYdQPB$obRu#azD*v%j|ghq1N=(`)+_ z#-|;}9^i0oFJP=~o&I9>*I3JIWB-FD`_Yif|KF}q_MaK&v%L*>$dcaP+N|tfu)lMw z!c!RE&G`FlA7cA&Y|raf@!f0(*zRU~2ir5ZsdyLQ_H;_Oj&YD}Kc{y!<8F@kRmOYS z*8PuecVP9A9(*HA_9q2qE?n+|+|L$qzi3O-Ki*fX@}=4AH}xypU)vA-EIB@wav$sazgnJ(&G}&w4ZaKbI!{C$_3`G{?_ndCdO*k%oVL8vaMp z#2-u(|5It?nVm+SlhVZhY8w8V()fQR4gc0O{?xC`hS|&Mo7?Mm*#9{mS9SZopZk41 z9&7(i9N+9;%klL%spCJ%lG2aai+D=Rd;jPtOx{{3keH zdfsq6|NUv=r}Mvp}-qSk_7Ua&BjXD_!`M04|k1ucuqTWps!RlvId|7z@&jphHee-$5sb46oq zaKK`xayrH4sIR!V(owml+-`R)aMar!fw03DXcz0keJA(Y9F97BWx($Wc_JQr#Oc~p z;S0DniBPcD=I-{n9pOku&OdI=y~p#8Vy& z`n)b@#2fI}1tQ)yc8lnK{7OPT7Nlk%UgPZYyE>3|o436yBnhkio4uicztiK72t-a2 zyv}Y&L4=P?9UUPqm*_1w6UW2qgC2iUqLi)aqY|s=^1FSW6jFd*3A?V#)8!G-gU0Nc zByI==T%K^a*54LL!Kuj^-Xx+0z4<7F%iO+(%_6#weo{h@rEf?%;G{yj%)g~m82x69 zlDNM0a*rz_qCIiVtgUV;*X3Sk*Wr6l?j??a*2`TEPiHXF?Ql6=xb`8smwxX;kEL(m z^H@puB>ZhPxi$JWTI%ZSHbQ}lJj!<@D~Ic*W`JIZ8Km|$$L;}q=nn()Sk zIOq&z1#8 zS*91cq|AX{GA;Y=twy%?c3DS{!*YeARW{zH0CI06@219<+@CE7hf9_?&|OB*M+dsX z<)M%>sh;djuGpECC6(3w93^H(h2K!L#1RR!x~hu8MfkJ9-Y#WT9F|pXaE8i5?ZmY& zx!QIIWjk|(sp?i!UuVn!^}Xl_6M=@N;PtorJduE(8l#NhaC_k4aj*46Is)$MP$&=* z;lXLW^nAa!w-6%;y33+f0gM~6!Y*0gxMl;IQb;#$V_+Gl)vUo+fC=G2%33adNQ~d2oX_8LuGGoirP>!Q)SQ1?#wlo}7In)$lBDo-35(pQS zm(ujnvBVt?6jc}aGYiY1tDI*T0@D3L%B9IeHUsuD-U z8LzO8pgSUS)S%M0R~f5$x^{vZX-~9P)@E}`4jF31Ue&$z3dd?x*<{vQJuS@Ko{4zL z%~*sxQWB$YHw{OL))OCl{IMWJ1{ir<<=c(ns)uO6CYQ_?^a&pKj zA8{6y7gaBHds@5N%PTgw%Wkc2?8qJ(HsX3 zP9Ii(ND}E{edon^S)rN*O~qvn2bezfgs=hg?#6BQ8pA@MF}N+{t48!lVAK>ZT+~sk zMsv#4KFzuet4_Di+v@O!>+Ksnp)lsB<&iZWbiv&fUi2ng@V{b<>Noals%4;(LnnG@ zXUMbB8|koj27Hwr9@i#^V})mH5X&RdMQgaY*rEEV)m@SB21j`nEo)X6mr>{L40*!= zf1{ie)~h65;3V{tW2uAICnyqVg$v}MDar~*8&<_W?>3L!OG7#43KsOB4!OF<_!aCX zzas{}5at)oFjkys1vzLcJndjj1k|b%(#v|mN}}l_U%q0}GKOPhaMxZ;N6zPSyuOaIP4W1DvE&~JkpvkYi3kwycEq9|Q z(iQT{WfDa_l50lVdz3_kXsyx9<{3I#;`8G4(+i*OTkD-$m4W7 z+C7mlDiG~!P(r=NuyAtNtyUDDnlwt)sh*dp`V1k|aaDOxWpVQsf_9sNYW>~_>AaGw z%AQ1ctEb)TFL%+-0#WWYgvg1#O0O|dp9aQ^;gCw+moAPjh5d;LZjUKnFC@Zb7iUQO z;HV(Ya4-=9<*q`JdfWZ9$ABre6LV-e|2vWt2|25*#7rz~j53rIg&0(HuXWP=-CgJG z^wiRBPsFoTHjij-yl9YS`na`zodV5jRHIBHMbY@7|0Y_f%KDH9^`hkDPFkYeZ#9I5 z*ZaL!ba{N;jh;47$b%N@cKESp*5&g#u#bj~7Fkmg6x4`i4M}(zs`nnFuU75egeU4| zl`1aq_RC4`Kq9ouuewDKuV_%6_8CJr`2$=0qw3TCG*LEsoSO_)`h_u~QT3)w9ULRh znt;=dZaSc(9!$jC;`RBOIzoXh#NkLT+VJK;7q+lM4yPME41Doe9AYwENGYt2&JKrX ztH*`ezM}(e89SL1Fu&g9jW~RA4-$l()Yp7c{w>cHyLMS{Ng@3eyEh)O9=7E55k zFK1tlyXc^0N?z%Cdo35dU@3CDi;D7c^Yh7m(0a$jy{GQ7Z0)s_UT3+_QnY-B<%|VG zIn(kkuuaL$wN1Ie7VNQ9E%Ze#?zeLeT0VW$vLmPAs%bSU z+YyC0aH}o|nRWA*LeyD!%XKGr$zC?|->uh6>-o_rrV%n8Nja zF_D>y|9u>OC*!w^RC>Q+d_jrAr_ECQ`WW{x-p}}XV3K#w5*2>}F7P4zDC4sk|AcV^ z;~~aZGhR@t= zUC&tG`}Y)MegEI0kE!(TTc!8~7~57W{6k<$Z!hE7XDVD%qrz`sd==xrF&2Cu;%Re~ zJo`@$1Wf52Wc)7U<~1sOa-ja2w+rfl0nKjNjw%9>!JkRs4O7dl@gUQ~dTb9$VGAhw*CbBd=Xv7!6fVRL4qwH17vpOg-@*7%#`iFu zh<=*r?_=D+_(8_EGk%ouON@WQc;RA2|0~8fFn*5lQN}MacAy`p{0uVgU~CJj{Ow}g z!T4^*5ytN_?qhsbvEuh4<4ugG@jZ`UXM6$ULyUVEpMr6Mtf##684@?u=T_$-Vo#D5{9KE}Ui zyqocf7}tn?4`UnSy^Oao9$@@E#`_o_X1t&AtQCsi3yd2WA7p$z<3YxI86RQ%Ka7VM zm#$R&#I-7aLEx$RLKHFnJmY4@H*@?b<0lE97LDJl{tCrEO^6qsRQyi;q{8~1!Bvd) zeZ*TB>wAgs1}1*`e&io89^`wA4>8vFyq|o5im&fIU&L77dtMJb^<$Wi{Y=Tz&3K6M zzf*jK=j~JBPn+;t5=Vu;cmC`PDL&?3PpSBIjP*V2TY#sYiS(XU;n!36nNhKq@xzQC zX8el8iTmQ`e2U^H?uWmevA&P_PKl#pi0PkVEcUDPUSpicIQJrz{xrtx7#A@9EaO7P zUtzqE@c`o@#uIId-*U#MF}5)-Wn9D9!MK6(CdSQ-dl|Pdew1+s2GDc znQ@fyV}$1j(Zl$^2p0-b@Ql*WTfkH23bCK@h6;rbGVW$P$oLk z4?ou-+^qrZXH0kyxD7XF&i?BcWi%pPgg<&d-nmMM1qMvv3t%232OhHOOyNYY=kI%% zUSo<+^k-P{2al#Vh7-M>@Bf|YHP-aYCnwVz!--z651Lmi`8C$`yA*jmePcM$>-EHK zOs}z~-)f>ah7-MBe;i_ZjWvC*iQX7a^m@HgRiotBSksr9=#Ak-uh%yZF}=o`{yG!A zF`Vf2dZ?gQrLVE3zt2Q(3@3WMeyU`8jWvCdiQX7a^m@J3!SotydJL2DAzWvOPnhWQ zFIIKyt4yykg;V|80YeXAqBn*Uyr?4^CNS5 z3@3WMKd^GGl3!y@ZZf(Hp~wUhkirRIlXMSkp&M z^u}@hShvmV7k5F`Vf2{?!Fcud$}T%0zDrCwjf#^%T=;1Y5nOt8%aY@7 zGT~cH_+AqpHsQ1XC7GY!g#X=y51Vj41}>w1i%fX632!msubS{fCj2K8J{#@WnBH0w z{DU2W!MkiVhaC; z2|sPZBPLw!Oy-Z{8A<52=vEC29%@qGXP53p6e_CQcc!oz|y&qi5Snmhp5SEOu_k-^RE)!b@01eO`@wga;{T@!zi+~Y?aArYn(!A)c)tlx=t!nt zV!~@o_;M5ep$Y%Qgx@ydv%Jaa`Aqm46TaPq|I>sInDDzMJn!=4^qNdKX2LI;@cd0E zpShSHKdZ*CZpM0l^xHc8ITik<4rjao3oA*_`=LI@>Gnr+P}NShsM)Xu?wJxN_Jhtd z;SylPn+{7pJMq_uzh}aKHsR@rY>a=A3DdgD82&92e$#~MtdB8%p~91-aQJhv!l!6_ zuPOWoCj1`?$MZLA!u3{}UY!3GCcM*xzh%PTHQ|R%_-PaVt-^76PRdQr?`0;u$Aph6 z9G7?Ygk<>_neb8*wwdrH3diN?Foj=d!rwIE@0jRcG2!Bg$@yESaJ>9BoAB37_}3KL3Pd`b$mt zHWPlxg!h~9OD6o9!e|BRnR%j2FOJJi_%jNl)~Y9>FiKfHH<-d>Cj3(q{=LHS^xl!! z7RQBCq&z5M^(3s^!4$)kz$}GX4zmKL9Hs)M5~d2K8m11W z9%da(Ba9uU31&UaWiU>dRu~UV8%!6>W|*xo-7sH*xdCPe%$H%l0`pavUYMOQH^STm zvkT^HFgL^80&^?OZ7{dPd>!Tvn16%$cbGe2`e5#Yxf|viFf>>CCd{{BcEj|;#9+P+ zb05t8FyDdsF3cX72VlMj^L>~HVIG2^`PC0$_QEWIA$_cZSq)PIQwu|Lv<8?BFfB0c zFdZ;nn9E_dz+4G)70kmh=fGsk;KP+cp>U))7w<@UE?%9EH~qf(AN`}?vDvS63R8rP ze+F!#OaJ@dlo8YX@Hb`LYIur!yh!#@2`!&@lC~Qv|9Dg)+u&omwzDU zKkH|~U~Tv%A+8jGhrC4u_J{qU@MzKu^*QD*go*3ex0uKn>3;i)ix*^g^1UJ2cWqFG z%9}|j-spQtq%X%C|4)>OI+^Mt{5E+svwy^ol2dT~(7#5OywVkgRJHj67fDg4g4B&I z(g#1r#6=9!8UI1M@dvpan7FAWeoc$K%7q9MVX1C$kukVf$NiINB2FgCw5F%}DYWD^ z##Iv(e%zl(r;lX#X|#+qzMn)B$@qQ>4T=x<8|buzxa)($QvWbom0_AdbxBTo;)cww zRlyZGWAXT~zs#0AQ(vj0bCo*uLteNuMtTiJAMLW8v00DNpWvpPlvnMH$uKb;NOjSU zBpvH+9T_3>pTf)N|D@l*6Yq>J>fs8JQQU^qm-3(Q$3^V=0o`Up6IZ6t;{Kt6T zTqc**8RH-4eme67bLENq?}RywFOxHS^AChad8^<02mI=WIdib_QaN*&yi(5W8Nd2& zlw9$U(U;;SGl}0%!7NhVESGeOqa#$}$LNWhoQ@N5HSR*|@Vdgs ziB{W*yVb^sQ{@b8!Ecb$3suFpI*bt|BbjUK$Id+c@*Oknw8~MnmM#PwBhtDqXDG6b z^f*SO=7zCY1QHq@`w|Sk{bJO$7Y?_)?;`1<3r8p4aFOb23+1Qpv`9jHnT7I;-(sO) zyov|twhUaPNxvo6K?KrWSYf=Wg51VyDC8v+W>3DGBITtNaZlrI6e+Hu&|b#-Cyahc z7f*12@x}@5mEx+2^g*~|B4wabmA+ujc&h|QPjTxSha_Dzk?d#Wn&xT=CO{~vv*}KW zL|FO@B6N1fb&EuTankh>>}|d`LVIU$VFX8&H$|{JUMZDwb*)s$d?^Iem~VrKd#AVt zB2}32{)cqo^5Tbdfrc9&I7;HG2h$x7qb{e#2vWCHW^YA#xZCfdp|H4Ui_;rf)rC7^ zJk<^MB1c1=-BDa3!}(T_>W1~jrIO4^R4&xPRh!oruTYATestX&T_9p#;;4p^Jc{ds zPTb-lFP^DJ7pK!+vRo1_EyFE3Av6&W=L0vMZF00pK^!Dg^=K}sWP`Yg+HF z>`0qE`%;H}nS=64Sz5EC*eo`Bw{Tad2ls3^gAq@tfi-SYsX-s5%QDl41J~>XF#fgw z^A)qcc!?@pF4l(4vQ$5Ws+Jp6wM43liZ-5=@hhun3}xYlX52)Bx`-Q^{MDVZwvgsV+q!g91x?yu?!+O;~WOJbu z6ScJ5@77JL6LrmA=CGGL>=lkqV>3xaFJ9i}bGDa<8@v2|6u%?v3v8+0Y^Xtrs3k=z zs=W(0G2udLTuyC{yrftatt<>r7~(-^6}Z*f?Fsq<-Al`4^-8d;CfSQG4zxCeynztz zJCj0Q7H`cTnO$|=B}*1KN?g9`&DC}5amRDDW4XiO^=}Sr@>JVP9fpjqDOoCet3ZhE z9O??I5?wE^qcV%#NOG5z<36*^9;yS1!l>aA)e+I%t*)*R-80nfXv3vSzG}LIuKMzZ zOI+IwiI*62imFp7X(CA_fwi|myDnT;7D^SZxJ=%{Lt<@E*YcR9H>6v<96btM=XIRu zYf6?uYq(=q-l@iX!AIrJOG8hRd`VGwoaQL; znwO4`s!v5)6bxxe6{<+el7>qnDaECDY%aQQU$GV!Cv9y&OTulHoi!dGmZ!Lb8)H~w zaakaF)*8kZRD3KfPDQ!Qt?oQaMSMKkQkoQh7{W3&aXt=dX_=vVgxO#tsH|#~9Dure*a7oEG{-A=qRN` zx>NCUCY7RmmAN{@B+4thU2U$6q-m?lKu2xW8S&y5uwyr)k5;7J<*P4kb+xT`G?fcS zD|Mmr{!v_oM?Jar;%+(atM`Ar{&2*J>))w4V=6(P387UnU7l~aWKq`d5_^0H*4Rup z%Gb8`z!DUHe8Vxt=ISM$ZfClS@a>i1^2&yy#EyEkyt=+x-`9`p;5Vu^_76y9^k)K) zTKqz0+!Py6HvXA_e_Z0}UvLO&ARsW8q1Iq;nn!eJNF^e{kCN4EZ_|r$sW&ox_g1 zY5(y#{AiLS@>{%=rrCy1jch<)tTsOI;hBoAHr$w7T-qw_THY5eUW)Hec{{s0EBVUu z;wA0aO2U1@m}6m^0AKGxu4$@)8`KR2W=csh-+;IGu7IERxM&|kZn+@k@uo?)rms$s zF3v11bH~58v&M@hhSSIAincnga75g)31(RPx`W70Q(I{}E)dSVSNnfs#$iuC)pZ!= zy0|=jeUY4&EC_c8H`dGZ3&yE~oWa@KIV5AXL^jsDR7anZS%*@V;e<&>I{Ao`(6&;y z-_He=YMz?>9hdTQnl_DZ5?0=d+r*vt1Q@y`dx;%~lg2moO8JQ=8Z0)-g2_z%X^yy{ z_s;B4z+bk3V)W5g z=NTpO58ZH)M~#nD^*-WQr%p2mxCLg`Z>WY?hDjTar;Lj-vysJK$)|BM+K8}Yl{B9C zX?pbWF`=d1_!3P$w2hAob=Q=to@|6XZ9e)^PQdTLJ8b&)4h}nXceVzwVOc1@?4(Wr z;p|S_8^jJr;c+UJA-+9en0+Prr`;np#FDAm+ncwHBSlHmE&n=#s|&~YtYKk%7pq}( znuVigl;${`Mt3kWb}E^*3Ilhn6ELe=ZSYaKK}sl=O!mFZq)OCoQb)=UfsUUoCb3ee z)fwo?ZXZ)YW??^sFov&?8MxW)27sCJrNV(P$^=}r#py1@>W^M?Iq}hz3{ye}(dt&r=Tj2eLK)v*gsKUK)2!K70fI!tik zH@%~ekK(210`o8F#)zIcP&qC#bzpQ{Bsg$6uK4=M>9~jzhfv2wmVD-RT%__u>$oV? zEMr_GB%eO&J8nXG_;*}X@)Yj4C=y3*$3-T;c^C1vdVM(lf=#jbX_4_%;Up$Y%TfuT z)`D2}$@jSUdM>XH6F!UNW@=_Fb8QoN`|yxN);P1KLcM^NN)$ z%S7ACv^>X{qIbuq=$Ol|Rj=a>$1`}_SOs9t9FJ|Byl-4XnH(#T%z7dR&Gb1bHA82R z(F}vA#}l7-*OcrjC+#>Gk;&8svwoefVJWs&GR7?4s3~=hf@7x&8ntz;xTr1YBvowe^g;Wj_+D*%xUT2(=J?SJ z2jZkr#M|jH1kjmBKGpZp56Y_JVd`Y-vZfBt8t1ldbWS>fH6=yHW2`tsw~35AdAX)! z2_LTH1Dx_3z4i2+OE6edT*jgC^PS}V;f`w>C5vZ1lf#u65T-s)nUe4$p6*M{^CO+; zOR&s%F_h5@9NJ4-dr9U?EVa=#9*VT{4!|&a%?;!PnXV|X z^~M`i;>xA5kA`M+a^a)Bp~{{g#g;I-=MX-i9q?yxN;P|av|^P`pWOzcNHwVBZZ+<4$}jMKRv zO_Id1&g}Wo?D^4AJ6GBBqxj`)CO_iIo*$)MH5~Vj;0I0{&Zb0ZsqgA;W<- zdCD+*1hg=F1hfM$L6f)V4An#)SGGq&xZ%NgTseCL)KjT8=DqQ(}nlf*s&a4 znX*Sf!$D`n)sgB*U)sY<*(0FI7tYez(d-e>Q3pP=M?lB^#SD(U=u@8m3y*-NSkEUf z-~JCd(Ro}sv!^Vxr!13x@RmJg`G3bL%k0UxkN!KU@f`+~KSjmKI3eEqn@Kz{^Yo9;m~#JB zJMJnJ3j_bpG6TO(Q`LKxu5)0+*%;2pp(cIK<*WRRS1C`J)?;7naemKivDq6kUwd^j z>{ppla7dzFE%N(xn})E^o3>wzblXF+1l8Mp=1(Z8T6Of}CC^1Z2P&Qk28e!~A&~sY zl=Vx+?F&03zcKO(UpTm9`lPG3E*7uYBHMHRycvu70lt_|bHZ2b`*n^b%ImG{$=P); zPo8m|;PGVgv3tegQ?ESRzH5e|`HiPR9d&a)Ox&x`l|~cw43-%JU?yQ-G2-8 zj0#tH|9|#RV(Ooc4P7Fu-p;?l%Ok5MA+XhdtD3#9y~_Co$zQv-812u0U1ZLaHmm6K z`bCGDq??cXl=6nYk&@W!0-t|4yk{12-V!f)$uPdD=EKX7 zTh0}?H8zR%%2_)LF8lUJ{GGY-((78SKf2~6&(d4KD7k;__UV+`-}~63zNnb-jf#|I zV7PAd%gV+bEsBy%+xPur+&wWldc)MMGncLm*!}t&-=6;UDPfJO*+1MT%vD-%c-1Pq zEy?g&l%1Sm4}a?4b93|JJ5wu;K4({Xqw?cl$z1tBi>iW2_Y~#xclQcr-Vw1}pJmIh z5I&Lf$tEj>7e`I+Pk7*Yc60RE8JEtuJUY|3y{J~XsK8FelJB1cckZU|=fxd1^xa>; zko59;&P^59d2fCk+W+NP+rJ4*Zm&;Y_NQdktv`YPm_CSK?=n(IU2~;%lkcS?%okoZ zzm{)4G3z+HTngtQ9_3_yubW5rKY2B=DA8A@XiMEwn@!Jti?VuMI`Tj>1r;v`%##0xZuf*S*7mIpI>Cpu#PtLf1Y6~_gBbztJRH|jUSZu zOtW$*_K;3dINfpC^2&sXi`Hu1-+A?yfOt^(vvdA0)jkGh-+apz$fG%v_0{4~7q9D9 zv%ls!*ckuSeD@^T{)uKnyKU1Wr?3f4L5^P?Re_}isN4XT2EXocgV^xfcX8#}QSs3b K7!84u5CQ=B2z#gi literal 0 HcmV?d00001 diff --git a/crates/rattler_menuinst/data/appkit_launcher_x86_64 b/crates/rattler_menuinst/data/appkit_launcher_x86_64 new file mode 100755 index 0000000000000000000000000000000000000000..90ea56d55d348a90ac47e416f7b4e315dce89537 GIT binary patch literal 100192 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 literal 0 HcmV?d00001 diff --git a/crates/rattler_menuinst/data/menuinst.default.json b/crates/rattler_menuinst/data/menuinst.default.json new file mode 100644 index 000000000..c9acad433 --- /dev/null +++ b/crates/rattler_menuinst/data/menuinst.default.json @@ -0,0 +1,68 @@ +{ + "id_": "https://schemas.conda.io/menuinst-1.schema.json", + "schema_": "https://json-schema.org/draft-07/schema", + "menu_name": "REQUIRED", + "menu_items": [ + { + "name": "REQUIRED", + "description": "REQUIRED", + "command": [ + "REQUIRED" + ], + "icon": null, + "precommand": null, + "precreate": null, + "working_dir": null, + "activate": true, + "terminal": false, + "platforms": { + "linux": { + "Categories": null, + "DBusActivatable": null, + "GenericName": null, + "Hidden": null, + "Implements": null, + "Keywords": null, + "MimeType": null, + "NoDisplay": null, + "NotShowIn": null, + "OnlyShowIn": null, + "PrefersNonDefaultGPU": null, + "StartupNotify": null, + "StartupWMClass": null, + "TryExec": null, + "glob_patterns": null + }, + "osx": { + "CFBundleDisplayName": null, + "CFBundleIdentifier": null, + "CFBundleName": null, + "CFBundleSpokenName": null, + "CFBundleVersion": null, + "CFBundleURLTypes": null, + "CFBundleDocumentTypes": null, + "LSApplicationCategoryType": null, + "LSBackgroundOnly": null, + "LSEnvironment": null, + "LSMinimumSystemVersion": null, + "LSMultipleInstancesProhibited": null, + "LSRequiresNativeExecution": null, + "NSSupportsAutomaticGraphicsSwitching": null, + "UTExportedTypeDeclarations": null, + "UTImportedTypeDeclarations": null, + "entitlements": null, + "link_in_bundle": null, + "event_handler": null + }, + "win": { + "desktop": true, + "quicklaunch": true, + "terminal_profile": null, + "url_protocols": null, + "file_extensions": null, + "app_user_model_id": null + } + } + } + ] +} diff --git a/crates/rattler_menuinst/data/menuinst.schema.json b/crates/rattler_menuinst/data/menuinst.schema.json new file mode 100644 index 000000000..3ce530521 --- /dev/null +++ b/crates/rattler_menuinst/data/menuinst.schema.json @@ -0,0 +1,731 @@ +{ + "title": "MenuInstSchema", + "description": "Metadata required to create menu items across operating systems with ``menuinst``.", + "type": "object", + "properties": { + "$id": { + "title": "$Id", + "description": "Version of the menuinst schema.", + "enum": [ + "https://schemas.conda.io/menuinst-1.schema.json" + ], + "type": "string" + }, + "$schema": { + "title": "$Schema", + "description": "Standard of the JSON schema we adhere to.", + "enum": [ + "https://json-schema.org/draft-07/schema" + ], + "type": "string" + }, + "menu_name": { + "title": "Menu Name", + "minLength": 1, + "type": "string" + }, + "menu_items": { + "title": "Menu Items", + "minItems": 1, + "type": "array", + "items": { + "$ref": "#/definitions/MenuItem" + } + } + }, + "required": [ + "$id", + "$schema", + "menu_name", + "menu_items" + ], + "additionalProperties": false, + "definitions": { + "MenuItemNameDict": { + "title": "MenuItemNameDict", + "description": "Variable menu item name.\nUse this dictionary if the menu item name depends on installation parameters\nsuch as the target environment.", + "type": "object", + "properties": { + "target_environment_is_base": { + "title": "Target Environment Is Base", + "minLength": 1, + "type": "string" + }, + "target_environment_is_not_base": { + "title": "Target Environment Is Not Base", + "minLength": 1, + "type": "string" + } + }, + "additionalProperties": false + }, + "Linux": { + "title": "Linux", + "description": "Linux-specific instructions.\n\nCheck the `Desktop entry specification\n`__\nfor more details.", + "type": "object", + "properties": { + "name": { + "title": "Name", + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "$ref": "#/definitions/MenuItemNameDict" + } + ] + }, + "description": { + "title": "Description", + "type": "string" + }, + "icon": { + "title": "Icon", + "minLength": 1, + "type": "string" + }, + "command": { + "title": "Command", + "minItems": 1, + "type": "array", + "items": { + "type": "string" + } + }, + "working_dir": { + "title": "Working Dir", + "minLength": 1, + "type": "string" + }, + "precommand": { + "title": "Precommand", + "minLength": 1, + "type": "string" + }, + "precreate": { + "title": "Precreate", + "minLength": 1, + "type": "string" + }, + "activate": { + "title": "Activate", + "type": "boolean" + }, + "terminal": { + "title": "Terminal", + "type": "boolean" + }, + "Categories": { + "title": "Categories", + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string", + "pattern": "^.+;$" + } + ] + }, + "DBusActivatable": { + "title": "Dbusactivatable", + "type": "boolean" + }, + "GenericName": { + "title": "Genericname", + "type": "string" + }, + "Hidden": { + "title": "Hidden", + "type": "boolean" + }, + "Implements": { + "title": "Implements", + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string", + "pattern": "^.+;$" + } + ] + }, + "Keywords": { + "title": "Keywords", + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string", + "pattern": "^.+;$" + } + ] + }, + "MimeType": { + "title": "Mimetype", + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string", + "pattern": "^.+;$" + } + ] + }, + "NoDisplay": { + "title": "Nodisplay", + "type": "boolean" + }, + "NotShowIn": { + "title": "Notshowin", + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string", + "pattern": "^.+;$" + } + ] + }, + "OnlyShowIn": { + "title": "Onlyshowin", + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string", + "pattern": "^.+;$" + } + ] + }, + "PrefersNonDefaultGPU": { + "title": "Prefersnondefaultgpu", + "type": "boolean" + }, + "StartupNotify": { + "title": "Startupnotify", + "type": "boolean" + }, + "StartupWMClass": { + "title": "Startupwmclass", + "type": "string" + }, + "TryExec": { + "title": "Tryexec", + "type": "string" + }, + "glob_patterns": { + "title": "Glob Patterns", + "type": "object", + "additionalProperties": { + "type": "string", + "pattern": ".*\\*.*" + } + } + }, + "additionalProperties": false + }, + "CFBundleURLTypesModel": { + "title": "CFBundleURLTypesModel", + "description": "Describes a URL scheme associated with the app.", + "type": "object", + "properties": { + "CFBundleTypeRole": { + "title": "Cfbundletyperole", + "enum": [ + "Editor", + "Viewer", + "Shell", + "None" + ], + "type": "string" + }, + "CFBundleURLSchemes": { + "title": "Cfbundleurlschemes", + "type": "array", + "items": { + "type": "string" + } + }, + "CFBundleURLName": { + "title": "Cfbundleurlname", + "type": "string" + }, + "CFBundleURLIconFile": { + "title": "Cfbundleurliconfile", + "type": "string" + } + }, + "required": [ + "CFBundleURLSchemes" + ], + "additionalProperties": false + }, + "CFBundleDocumentTypesModel": { + "title": "CFBundleDocumentTypesModel", + "description": "Describes a document type associated with the app.", + "type": "object", + "properties": { + "CFBundleTypeIconFile": { + "title": "Cfbundletypeiconfile", + "type": "string" + }, + "CFBundleTypeName": { + "title": "Cfbundletypename", + "type": "string" + }, + "CFBundleTypeRole": { + "title": "Cfbundletyperole", + "enum": [ + "Editor", + "Viewer", + "Shell", + "None" + ], + "type": "string" + }, + "LSItemContentTypes": { + "title": "Lsitemcontenttypes", + "type": "array", + "items": { + "type": "string" + } + }, + "LSHandlerRank": { + "title": "Lshandlerrank", + "enum": [ + "Owner", + "Default", + "Alternate" + ], + "type": "string" + } + }, + "required": [ + "CFBundleTypeName", + "LSItemContentTypes", + "LSHandlerRank" + ], + "additionalProperties": false + }, + "UTTypeDeclarationModel": { + "title": "UTTypeDeclarationModel", + "type": "object", + "properties": { + "UTTypeConformsTo": { + "title": "Uttypeconformsto", + "type": "array", + "items": { + "type": "string" + } + }, + "UTTypeDescription": { + "title": "Uttypedescription", + "type": "string" + }, + "UTTypeIconFile": { + "title": "Uttypeiconfile", + "type": "string" + }, + "UTTypeIdentifier": { + "title": "Uttypeidentifier", + "type": "string" + }, + "UTTypeReferenceURL": { + "title": "Uttypereferenceurl", + "type": "string" + }, + "UTTypeTagSpecification": { + "title": "Uttypetagspecification", + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "required": [ + "UTTypeConformsTo", + "UTTypeIdentifier", + "UTTypeTagSpecification" + ], + "additionalProperties": false + }, + "MacOS": { + "title": "MacOS", + "description": "Mac-specific instructions. Check these URLs for more info:\n\n- ``CF*`` keys: see `Core Foundation Keys `__\n- ``LS*`` keys: see `Launch Services Keys `__\n- ``entitlements``: see `Entitlements documentation `__", + "type": "object", + "properties": { + "name": { + "title": "Name", + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "$ref": "#/definitions/MenuItemNameDict" + } + ] + }, + "description": { + "title": "Description", + "type": "string" + }, + "icon": { + "title": "Icon", + "minLength": 1, + "type": "string" + }, + "command": { + "title": "Command", + "minItems": 1, + "type": "array", + "items": { + "type": "string" + } + }, + "working_dir": { + "title": "Working Dir", + "minLength": 1, + "type": "string" + }, + "precommand": { + "title": "Precommand", + "minLength": 1, + "type": "string" + }, + "precreate": { + "title": "Precreate", + "minLength": 1, + "type": "string" + }, + "activate": { + "title": "Activate", + "type": "boolean" + }, + "terminal": { + "title": "Terminal", + "type": "boolean" + }, + "CFBundleDisplayName": { + "title": "Cfbundledisplayname", + "type": "string" + }, + "CFBundleIdentifier": { + "title": "Cfbundleidentifier", + "pattern": "^[A-z0-9\\-\\.]+$", + "type": "string" + }, + "CFBundleName": { + "title": "Cfbundlename", + "maxLength": 16, + "type": "string" + }, + "CFBundleSpokenName": { + "title": "Cfbundlespokenname", + "type": "string" + }, + "CFBundleVersion": { + "title": "Cfbundleversion", + "pattern": "^\\S+$", + "type": "string" + }, + "CFBundleURLTypes": { + "title": "Cfbundleurltypes", + "type": "array", + "items": { + "$ref": "#/definitions/CFBundleURLTypesModel" + } + }, + "CFBundleDocumentTypes": { + "title": "Cfbundledocumenttypes", + "type": "array", + "items": { + "$ref": "#/definitions/CFBundleDocumentTypesModel" + } + }, + "LSApplicationCategoryType": { + "title": "Lsapplicationcategorytype", + "pattern": "^public\\.app-category\\.\\S+$", + "type": "string" + }, + "LSBackgroundOnly": { + "title": "Lsbackgroundonly", + "type": "boolean" + }, + "LSEnvironment": { + "title": "Lsenvironment", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "LSMinimumSystemVersion": { + "title": "Lsminimumsystemversion", + "pattern": "^\\d+\\.\\d+\\.\\d+$", + "type": "string" + }, + "LSMultipleInstancesProhibited": { + "title": "Lsmultipleinstancesprohibited", + "type": "boolean" + }, + "LSRequiresNativeExecution": { + "title": "Lsrequiresnativeexecution", + "type": "boolean" + }, + "NSSupportsAutomaticGraphicsSwitching": { + "title": "Nssupportsautomaticgraphicsswitching", + "type": "boolean" + }, + "UTExportedTypeDeclarations": { + "title": "Utexportedtypedeclarations", + "type": "array", + "items": { + "$ref": "#/definitions/UTTypeDeclarationModel" + } + }, + "UTImportedTypeDeclarations": { + "title": "Utimportedtypedeclarations", + "type": "array", + "items": { + "$ref": "#/definitions/UTTypeDeclarationModel" + } + }, + "entitlements": { + "title": "Entitlements", + "type": "array", + "items": { + "type": "string", + "pattern": "[a-z0-9\\.\\-]+" + } + }, + "link_in_bundle": { + "title": "Link In Bundle", + "type": "object", + "additionalProperties": { + "type": "string", + "pattern": "^(?!\\/)(?!\\.\\./).*" + } + }, + "event_handler": { + "title": "Event Handler", + "minLength": 1, + "type": "string" + } + }, + "additionalProperties": false + }, + "Windows": { + "title": "Windows", + "description": "Windows-specific instructions. You can override global keys here if needed", + "type": "object", + "properties": { + "name": { + "title": "Name", + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "$ref": "#/definitions/MenuItemNameDict" + } + ] + }, + "description": { + "title": "Description", + "type": "string" + }, + "icon": { + "title": "Icon", + "minLength": 1, + "type": "string" + }, + "command": { + "title": "Command", + "minItems": 1, + "type": "array", + "items": { + "type": "string" + } + }, + "working_dir": { + "title": "Working Dir", + "minLength": 1, + "type": "string" + }, + "precommand": { + "title": "Precommand", + "minLength": 1, + "type": "string" + }, + "precreate": { + "title": "Precreate", + "minLength": 1, + "type": "string" + }, + "activate": { + "title": "Activate", + "type": "boolean" + }, + "terminal": { + "title": "Terminal", + "type": "boolean" + }, + "desktop": { + "title": "Desktop", + "default": true, + "type": "boolean" + }, + "quicklaunch": { + "title": "Quicklaunch", + "default": true, + "type": "boolean" + }, + "terminal_profile": { + "title": "Terminal Profile", + "minLength": 1, + "type": "string" + }, + "url_protocols": { + "title": "Url Protocols", + "type": "array", + "items": { + "type": "string", + "pattern": "\\S+" + } + }, + "file_extensions": { + "title": "File Extensions", + "type": "array", + "items": { + "type": "string", + "pattern": "\\.\\S*" + } + }, + "app_user_model_id": { + "title": "App User Model Id", + "maxLength": 128, + "pattern": "\\S+\\.\\S+", + "type": "string" + } + }, + "additionalProperties": false + }, + "Platforms": { + "title": "Platforms", + "description": "Platform specific options.\n\nNote each of these fields supports the same keys as the top-level :class:`MenuItem`\n(sans ``platforms`` itself), in case overrides are needed.", + "type": "object", + "properties": { + "linux": { + "$ref": "#/definitions/Linux" + }, + "osx": { + "$ref": "#/definitions/MacOS" + }, + "win": { + "$ref": "#/definitions/Windows" + } + }, + "additionalProperties": false + }, + "MenuItem": { + "title": "MenuItem", + "description": "Instructions to create a menu item across operating systems.", + "type": "object", + "properties": { + "name": { + "title": "Name", + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "$ref": "#/definitions/MenuItemNameDict" + } + ] + }, + "description": { + "title": "Description", + "type": "string" + }, + "command": { + "title": "Command", + "minItems": 1, + "type": "array", + "items": { + "type": "string" + } + }, + "icon": { + "title": "Icon", + "minLength": 1, + "type": "string" + }, + "precommand": { + "title": "Precommand", + "minLength": 1, + "type": "string" + }, + "precreate": { + "title": "Precreate", + "minLength": 1, + "type": "string" + }, + "working_dir": { + "title": "Working Dir", + "minLength": 1, + "type": "string" + }, + "activate": { + "title": "Activate", + "default": true, + "type": "boolean" + }, + "terminal": { + "title": "Terminal", + "default": false, + "type": "boolean" + }, + "platforms": { + "$ref": "#/definitions/Platforms" + } + }, + "required": [ + "name", + "description", + "command", + "platforms" + ], + "additionalProperties": false + } + } +} diff --git a/crates/rattler_menuinst/data/osx_launcher_arm64 b/crates/rattler_menuinst/data/osx_launcher_arm64 new file mode 100755 index 0000000000000000000000000000000000000000..5010fced09aa03ffb382d8b912064b2402a10407 GIT binary patch literal 68112 zcmeI*ZE#f883*v^ZW7$Q7&nnYNI_OKF?J+j6bp3nS?GWP3_Cc-Ry>4vh1$A zcO|L8tfjP4vCVd@;}_7GzCh3p=-8<{Q%kI!`k|e%QES0YnNG(}6C)DEwpo;>&vWlx z*eo)B>fm(#XE=M#bMCp%J?D4t%}4Ib=T85pibx|aF0R*dJzPe#m%Q8~TEKN9SEaVB z+0c4-tFJ>wXBX?_*+Z8^lIH|ZRI0PJt8?~Y>-_ZWF>+#F3gxTJP|6JUo6@sOalXz$ zdowF#Gh8Hgy7oY6KC>Mvl{8cSq#f{YalZZc+xfbk84?%fb36Ii&?JM)Y41%~YP`JCet7nWJM`G8WX=&o=ypu*AKm=({y zAI~}Y#Qv50`WRQG)~)GWqgp!Jx7v3%?L1UEAC!`|eu;FuE#XG0+>l){3udCp|XwkYjwu){y`E}*@tW?BM$$_2z zSVYCm#AWk2rxT6NUe{Hew$e^*{VEkOOylA}@%r>pdwu!6NGxl*T)Fsuwry(veCxVR z7v3$+eyR2RnbuoIo(emb$R4rdC47gLSzXO?bn{W&K4krF(e~q;hHavyno3fe=iEl ztsKa>g`rEwF0!7LT;-VTk5|ZlrnHM|3KYy$-Wra*uCu zVsVtR$cd>$BM(133wd3A@dN%9vI$sWi%j=5dZ{ zJ-1P#+)x8$cT{lPpl2nATPyFYa#5$mi#57u{H4e1+#0RmI2Ue6XWawgX=!&<=($Z- zmp|0VIb^Q8jA}xh>z$dI>%PeA>0V3O&{{n^PIQOt+2HwYJU-5QleMqsz8tr%@r%dn z9wb`PNNHbaJ!Nm=eRuOQqgG?rwC`^P^WEg`OY>)p^K<$8&~roU`T7f}_CXijVfA;r zuXQh?TFE8x;`7=)4`|d`=snXyW0rZ_>dZLXgn5nSychmn@gsaJ!{1S!o4ySG`mf9S5x){UR!syo;}X_&)>IZBkHDTMGKi3i_Uc{#3=qbN^7#Kj!qGu5fuI@6?9lBhnsolXWfrUiJJO z-xqnYr2jAO^LLl6{#ouXcluM@-{|yDbD!^{HRmnv%jcct+<$OC>h#~_{%-EK`g|R} zJH0KjR3zYy#!PQ7e}LT^><{*&Ov4`udgX)8O|&%GlL*JnOQ$DNQEx0^pLKJ6@@Dyj zw|p&H)+nX0m2XkYH>_pNQXl4*Ns9F4+t*cmrpG$l%E9a?5P$##AOHafKmY;|fB*y_ z009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz z00bZa0SG_<0uX=z1Rwwb2wZ7_(joi*67V?fLZ@wX+T~8GJ8hfOb~){pUO%o60SG_< z0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb z2tWV=5P$##AOHafKmY;|fB*y_009U<00I#Be-Nm-k-B6bHM&wNX&OC!swdQ^wx^6l zfWDBRVS79fOeEqQ1O_4jo|f_}e>lp6H0&TGtqkp3Hw4Yr{$NkaH2jg^7Q+njjHJ6L zd#@3W$hgNDPxKh3Tvo>B%UG~KY)ateAjs+Nm7tM>-dMt#wM_c)L^x{p%Au7U?lQt= zJRIQADw?7)a;cpmD?!Q(s!-6772mMa2uG>j#j{H3wQ0?sp6?vuu-Z+ekJ|q)f=s(c z^H`H)>O3nZ>KwF>FXWiVoh(GR6~*g{;x84&{-QWu6z?jE?=OnKRTMv56hB%NmvCIl z^(wBsO)BSF!L^cW71uJZbGTm3_2cGxNqvN`vV4{LsApl;GiE&nvqtQv&Kj~GIIDZ% z>2RJ4=ZUbNg$qx?h5LWWBdU}Qn;h8g626_#_Ssz!OIvQ?>4ZsN+f-F3#ktF8}t zj>Nwsm&nO6dXlTWH`1>mt%STTi;u&PE9v|MEtc$85hE4t2?Z0%NbLN~a(ZmQJKX+c zusYShzijgp$9(NO(#Kz_`_airE*J^k61ldflC z^*f$@x9rrWRr@|{UbO7M&xW3QrYrW_iQduDKaGv`xjMSaW(J=f{Knolo_}cLzFQA{ z(vR=m8h>Gb+sPlEo|yXbUH(n=Z%lso->Z&Z|K6VOf9K%nnbN;s>Gh{;kB)uq(btA2 zUXA?b!*}K!d~xFWv6blqQ@wXSaA;`8_s#$H`Z8}0|9*PGUm9=R{?E5>uU1b~EIGRR n@VUfR$omTZtxBG-@&gNB19RTJy?&6~H~eXV-)VBQ~Q z=Kucr=bM>-=9TG8zxw^BKkpYJvRH`Yi-Zu(NUe=R*dh*1h?PhZ$uRo5xAgAoP3)w# zULy5yK}4P@I2uNO@814;7uB8}*NVm%itrPw4Z}(wvF03ud>uKggHTd=AfGh~mI=HtU)1jcJZ$d^<6o_VZWssi zHQQt!UsR9pVNF0B_PveVgzAoK{xRwv!n7~%7%G`Iged~@_dV99|-$XnR zH(<(?UIfNe#Z_5_Sc~trgL>SXe-vdGpf55m#2CO7O8Sw8b8cQE#4?l}AUKP12~rJTEp#aZFB#WXPAW%2qO?iAdEm5 zf&Xs=c1!06`S#rc&eXDO-}_^BR=UeB;-n+pCh5F7GiiSh8|Uv#++wXWK80e^zD6@! zIg_$HPBh(*|ENc2MC`zvoU|M)(Lrn@gwRYK3$j&*-IyqX;W!W-;FV7_Vc04ZqO|<|1aVBdMODt41*04zG(0i(`KP zr|FfzzJHlhnzV1i4y&lVkL>9iu3|&*X`hauW|QhAb|TJ5CRsk^?T5yX!7W`bWCt`XRi(O=QBd)I7BBjDIDfT-NTS`6d(Co11kdxqK#YLeO&YP+d@MvbS*%6V!z zY9CR1liF!$y@|xm#Pji&^QCMmp37VDA^ZXsPajDSmaODJHXY}IvQ79qdY-#k%Ej}h z*J^!BaXkZxaq?`cq_)Htqt3=0E)#!WrBLVZBTLb;S+%BhPElxqYz6iP`&zBbR$Xq? zUv7d~JL$ zyIkI7@aZ}^c*qzWK4cs$CC!w0&5VwDc07BT1u@pe7d-W1ZVccK125cTdc00PjiOAdmnt6`q!vXwO0G|lpasa;@z}_^4;QKh= zp!vqhYck#;>37{O+?A@ovEUo(zxl_7u|P}>71M>+ziwZtm9MjSJ58CqO{Uc9j?jBS R?*ecAt1Dk!^Lg7+`~}9(z25); literal 0 HcmV?d00001 From d8ebe0d8661d1eedf7496a8493e434140a5b6cf7 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Fri, 27 Sep 2024 23:47:08 +0200 Subject: [PATCH 007/132] add windows stuff --- crates/rattler_menuinst/Cargo.toml | 6 +- crates/rattler_menuinst/src/lib.rs | 2 + crates/rattler_menuinst/src/win.rs | 336 ------------------ crates/rattler_menuinst/src/windows.rs | 35 ++ .../src/windows/knownfolders.rs | 113 ++++++ .../rattler_menuinst/src/windows/registry.rs | 142 ++++++++ 6 files changed, 297 insertions(+), 337 deletions(-) delete mode 100644 crates/rattler_menuinst/src/win.rs create mode 100644 crates/rattler_menuinst/src/windows.rs create mode 100644 crates/rattler_menuinst/src/windows/knownfolders.rs create mode 100644 crates/rattler_menuinst/src/windows/registry.rs diff --git a/crates/rattler_menuinst/Cargo.toml b/crates/rattler_menuinst/Cargo.toml index 0eba52803..3629708c7 100644 --- a/crates/rattler_menuinst/Cargo.toml +++ b/crates/rattler_menuinst/Cargo.toml @@ -17,7 +17,7 @@ serde = { workspace = true, features = ["derive"] } shlex = { workspace = true } serde_json = { workspace = true } sha1 = "0.10.6" -tracing = { workspace = true } +tracing.workspace = true rattler_conda_types = { path="../rattler_conda_types", version = "0.27.2", default-features = false } thiserror = { workspace = true } unicode-normalization = "0.1.24" @@ -25,5 +25,9 @@ regex.workspace = true tempfile.workspace = true fs-err = "2.11.0" +[target.'cfg(target_os = "windows")'.dependencies] +winapi = "0.3.9" +winreg = "0.52.0" + [dev-dependencies] insta = { workspace = true } diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index 52edcf616..d334e345c 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -4,6 +4,8 @@ use rattler_conda_types::Platform; mod linux; mod macos; +#[cfg(target_os = "windows")] +mod windows; mod render; mod schema; diff --git a/crates/rattler_menuinst/src/win.rs b/crates/rattler_menuinst/src/win.rs deleted file mode 100644 index 003bb11b2..000000000 --- a/crates/rattler_menuinst/src/win.rs +++ /dev/null @@ -1,336 +0,0 @@ -use std::collections::HashMap; -use std::fs::{self, File}; -use std::io::Write; -use std::path::{Path, PathBuf}; -use std::process::Command; - -use log::{debug, warn}; -use serde_json::Value; -use tempfile::NamedTempFile; -use winapi::um::winuser::SHChangeNotify; - -use crate::utils::{WinLex, logged_run, unlink}; -use crate::base::{Menu, MenuItem}; -use crate::win_utils::knownfolders::{folder_path, windows_terminal_settings_files}; -use crate::win_utils::registry::{ - notify_shell_changes, register_file_extension, register_url_protocol, - unregister_file_extension, unregister_url_protocol, -}; - -pub struct WindowsMenu { - name: String, - mode: String, - prefix: PathBuf, - base_prefix: PathBuf, -} - -impl WindowsMenu { - pub fn new(name: String, mode: String, prefix: PathBuf, base_prefix: PathBuf) -> Self { - WindowsMenu { name, mode, prefix, base_prefix } - } - - pub fn create(&self) -> Vec { - debug!("Creating {:?}", self.start_menu_location()); - fs::create_dir_all(&self.start_menu_location()).unwrap(); - if let Some(quick_launch) = self.quick_launch_location() { - fs::create_dir_all(quick_launch).unwrap(); - } - if let Some(desktop) = self.desktop_location() { - fs::create_dir_all(desktop).unwrap(); - } - vec![self.start_menu_location()] - } - - pub fn remove(&self) -> Vec { - let menu_location = self.start_menu_location(); - if menu_location.exists() { - if menu_location.read_dir().unwrap().next().is_none() { - debug!("Removing {:?}", menu_location); - fs::remove_dir_all(menu_location).unwrap(); - } - } - vec![menu_location] - } - - pub fn start_menu_location(&self) -> PathBuf { - PathBuf::from(folder_path(&self.mode, false, "start")).join(self.render(&self.name)) - } - - pub fn quick_launch_location(&self) -> Option { - if self.mode == "system" { - warn!("Quick launch menus are not available for system level installs"); - None - } else { - Some(PathBuf::from(folder_path(&self.mode, false, "quicklaunch"))) - } - } - - pub fn desktop_location(&self) -> Option { - Some(PathBuf::from(folder_path(&self.mode, false, "desktop"))) - } - - pub fn terminal_profile_locations(&self) -> Vec { - if self.mode == "system" { - warn!("Terminal profiles are not available for system level installs"); - vec![] - } else { - windows_terminal_settings_files(&self.mode) - } - } - - pub fn placeholders(&self) -> HashMap { - let mut placeholders = HashMap::new(); - placeholders.insert("SCRIPTS_DIR".to_string(), self.prefix.join("Scripts").to_str().unwrap().to_string()); - placeholders.insert("PYTHON".to_string(), self.prefix.join("python.exe").to_str().unwrap().to_string()); - placeholders.insert("PYTHONW".to_string(), self.prefix.join("pythonw.exe").to_str().unwrap().to_string()); - placeholders.insert("BASE_PYTHON".to_string(), self.base_prefix.join("python.exe").to_str().unwrap().to_string()); - placeholders.insert("BASE_PYTHONW".to_string(), self.base_prefix.join("pythonw.exe").to_str().unwrap().to_string()); - placeholders.insert("BIN_DIR".to_string(), self.prefix.join("Library").join("bin").to_str().unwrap().to_string()); - placeholders.insert("SP_DIR".to_string(), self.site_packages().to_str().unwrap().to_string()); - placeholders.insert("ICON_EXT".to_string(), "ico".to_string()); - placeholders - } - - pub fn render(&self, value: &str, slug: bool, extra: Option<&HashMap>) -> String { - // Implement rendering logic here - let rendered = value.to_string(); // Placeholder for actual rendering - if rendered.contains('/') && !rendered.starts_with('/') { - rendered.replace('/', "\\") - } else { - rendered - } - } - - fn site_packages(&self) -> PathBuf { - self.prefix.join("Lib").join("site-packages") - } - - fn paths(&self) -> Vec { - vec![self.start_menu_location()] - } -} - -pub struct WindowsMenuItem { - menu: WindowsMenu, - metadata: HashMap, -} - -impl WindowsMenuItem { - pub fn new(menu: WindowsMenu, metadata: HashMap) -> Self { - WindowsMenuItem { menu, metadata } - } - - pub fn location(&self) -> PathBuf { - self.menu.start_menu_location().join(self.shortcut_filename()) - } - - pub fn create(&self) -> Vec { - self.precreate(); - let paths = self.paths(); - - for path in &paths { - if path.extension().unwrap_or_default() != "lnk" { - continue; - } - - let (target_path, arguments) = self.process_command(); - let working_dir = self.render_key("working_dir"); - let working_dir = if let Some(dir) = working_dir { - fs::create_dir_all(std::path::Path::new(&std::env::var("USERPROFILE").unwrap()).join(dir)).unwrap(); - dir - } else if std::env::var("USERPROFILE").is_ok() { - "%USERPROFILE%".to_string() - } else { - "%HOMEDRIVE%%HOMEPATH%".to_string() - }; - - let icon = self.render_key("icon").unwrap_or_default(); - - if path.exists() { - warn!("Overwriting existing link at {:?}.", path); - } - // Implement create_shortcut function - create_shortcut( - &target_path, - &self.shortcut_filename_without_ext(), - path, - &arguments.join(" "), - &working_dir, - &icon, - 0, - &self.app_user_model_id(), - ); - } - - for location in self.menu.terminal_profile_locations() { - self.add_remove_windows_terminal_profile(&location, false); - } - let changed_extensions = self.register_file_extensions(); - let changed_protocols = self.register_url_protocols(); - if changed_extensions || changed_protocols { - notify_shell_changes(); - } - - paths - } - - pub fn remove(&self) -> Vec { - let changed_extensions = self.unregister_file_extensions(); - let changed_protocols = self.unregister_url_protocols(); - if changed_extensions || changed_protocols { - notify_shell_changes(); - } - - for location in self.menu.terminal_profile_locations() { - self.add_remove_windows_terminal_profile(&location, true); - } - - let paths = self.paths(); - for path in &paths { - debug!("Removing {:?}", path); - unlink(path, true); - } - - paths - } - - fn paths(&self) -> Vec { - let mut paths = vec![self.location()]; - let mut extra_dirs = vec![]; - if self.metadata.get("desktop").and_then(|v| v.as_bool()).unwrap_or(false) { - if let Some(desktop) = self.menu.desktop_location() { - extra_dirs.push(desktop); - } - } - if self.metadata.get("quicklaunch").and_then(|v| v.as_bool()).unwrap_or(false) { - if let Some(quick_launch) = self.menu.quick_launch_location() { - extra_dirs.push(quick_launch); - } - } - - for dir in extra_dirs { - paths.push(dir.join(self.shortcut_filename())); - } - - if self.metadata.get("activate").and_then(|v| v.as_bool()).unwrap_or(false) { - paths.push(self.path_for_script()); - } - - paths - } - - fn shortcut_filename(&self) -> String { - format!("{}.lnk", self.render_key("name").unwrap()) - } - - fn shortcut_filename_without_ext(&self) -> String { - self.render_key("name").unwrap() - } - - fn path_for_script(&self) -> PathBuf { - PathBuf::from(self.menu.placeholders().get("MENU_DIR").unwrap()) - .join(format!("{}.bat", self.render_key("name").unwrap())) - } - - fn precreate(&self) { - if let Some(precreate_code) = self.render_key("precreate") { - let mut tmp = NamedTempFile::new().unwrap(); - writeln!(tmp, "{}", precreate_code).unwrap(); - let system32 = PathBuf::from(std::env::var("SystemRoot").unwrap_or("C:\\Windows".to_string())).join("system32"); - let cmd = [ - system32.join("WindowsPowerShell").join("v1.0").join("powershell.exe").to_str().unwrap(), - &format!("\"start '{}' -WindowStyle hidden\"", tmp.path().to_str().unwrap()), - ]; - logged_run(&cmd, true).unwrap(); - } - } - - fn command(&self) -> String { - let mut lines = vec![ - "@ECHO OFF".to_string(), - ":: Script generated by conda/menuinst".to_string(), - ]; - if let Some(precommand) = self.render_key("precommand") { - lines.push(precommand); - } - if self.metadata.get("activate").and_then(|v| v.as_bool()).unwrap_or(false) { - let conda_exe = &self.menu.prefix.join("Scripts").join("conda.exe"); - let activate = if self.menu.is_micromamba(conda_exe) { "shell activate" } else { "shell.cmd.exe activate" }; - let activator = format!(r#"{} {} "{}""#, conda_exe.to_str().unwrap(), activate, self.menu.prefix.to_str().unwrap()); - lines.extend_from_slice(&[ - "@SETLOCAL ENABLEDELAYEDEXPANSION".to_string(), - format!(r#"@FOR /F "usebackq tokens=*" %%i IN (`{}`) do set "ACTIVATOR=%%i""#, activator), - "@CALL %ACTIVATOR%".to_string(), - ":: This below is the user command".to_string(), - ]); - } - - lines.push(WinLex::quote_args(&self.render_key("command").unwrap())); - - lines.join("\r\n") - } - - fn write_script(&self, script_path: Option<&Path>) -> PathBuf { - let script_path = script_path.unwrap_or_else(|| self.path_for_script().as_path()); - fs::create_dir_all(script_path.parent().unwrap()).unwrap(); - fs::write(script_path, self.command()).unwrap(); - script_path.to_path_buf() - } - - fn process_command(&self, with_arg1: bool) -> (String, Vec) { - if self.metadata.get("activate").and_then(|v| v.as_bool()).unwrap_or(false) { - let script = self.write_script(None); - if self.metadata.get("terminal").and_then(|v| v.as_bool()).unwrap_or(false) { - let mut command = vec!["cmd".to_string(), "/D".to_string(), "/K".to_string(), format!("\"{}\"", script.to_str().unwrap())]; - if with_arg1 { - command.push("%1".to_string()); - } - (command[0].clone(), command[1..].to_vec()) - } else { - let system32 = PathBuf::from(std::env::var("SystemRoot").unwrap_or("C:\\Windows".to_string())).join("system32"); - let arg1 = if with_arg1 { "%1 " } else { "" }; - let command = vec![ - format!("\"{}\"", system32.join("cmd.exe").to_str().unwrap()), - "/D".to_string(), - "/C".to_string(), - "START".to_string(), - "/MIN".to_string(), - "\"\"".to_string(), - format!("\"{}\"", system32.join("WindowsPowerShell").join("v1.0").join("powershell.exe").to_str().unwrap()), - "-WindowStyle".to_string(), - "hidden".to_string(), - format!("\"start '{}' {}-WindowStyle hidden\"", script.to_str().unwrap(), arg1), - ]; - (command[0].clone(), command[1..].to_vec()) - } - } else { - let mut command = self.render_key("command").unwrap(); - if with_arg1 && !command.iter().any(|arg| arg.contains("%1")) { - command.push("%1".to_string()); - } - let quoted = WinLex::quote_args(&command); - (quoted[0].clone(), quoted[1..].to_vec()) - } - } - - // Implement other methods (add_remove_windows_terminal_profile, register_file_extensions, etc.) similarly... - - fn app_user_model_id(&self) -> String { - self.render_key("app_user_model_id") - .unwrap_or_else(|| format!("Menuinst.{}", self.render_key("name").unwrap().to_lowercase().replace('.', ""))) - .chars() - .take(128) - .collect() - } - - fn render_key(&self, key: &str) -> Option { - // Implement rendering logic here - self.metadata.get(key).and_then(|v| v.as_str().map(|s| s.to_string())) - } -} - -// Implement create_shortcut function -fn create_shortcut(target_path: &str, description: &str, shortcut_path: &Path, arguments: &str, working_dir: &str, icon_path: &str, icon_index: i32, app_id: &str) { - // Implement Windows shortcut creation logic here - // This might require using the Windows API or a third-party crate -} diff --git a/crates/rattler_menuinst/src/windows.rs b/crates/rattler_menuinst/src/windows.rs new file mode 100644 index 000000000..9f0c893b4 --- /dev/null +++ b/crates/rattler_menuinst/src/windows.rs @@ -0,0 +1,35 @@ +use std::collections::HashMap; +use std::fs::{self, File}; +use std::io::Write; +use std::path::{Path, PathBuf}; +use std::process::Command; + +mod knownfolders; +mod registry; + +struct Directories { + start_menu_location: PathBuf, + quick_launch_location: PathBuf, + desktop_location: PathBuf, +} + +impl Directories { + pub fn create() -> Directories { + let start_menu_location = dirs::start_menu_dir().unwrap(); + let quick_launch_location = dirs::quick_launch_dir().unwrap(); + let desktop_location = dirs::desktop_dir().unwrap(); + + Directories { + start_menu_location, + quick_launch_location, + desktop_location, + } + } +} + +pub struct WindowsMenu { + name: String, + mode: String, + prefix: PathBuf, + base_prefix: PathBuf, +} diff --git a/crates/rattler_menuinst/src/windows/knownfolders.rs b/crates/rattler_menuinst/src/windows/knownfolders.rs new file mode 100644 index 000000000..3801cf30f --- /dev/null +++ b/crates/rattler_menuinst/src/windows/knownfolders.rs @@ -0,0 +1,113 @@ +use known_folders::{get_known_folder_path, KnownFolder}; +use std::collections::HashMap; +use std::path::{Path, PathBuf}; + +#[derive(Debug)] +pub enum FolderError { + PathNotFound, + PathNotVerifiable, +} + +pub struct Folders { + system_folders: HashMap, + user_folders: HashMap, +} + +#[derive(Clone, Copy)] +pub enum UserHandle { + Current, + Common, +} + +impl Folders { + pub fn new() -> Self { + let mut system_folders = HashMap::new(); + system_folders.insert("desktop".to_string(), KnownFolder::PublicDesktop); + system_folders.insert("start".to_string(), KnownFolder::CommonPrograms); + system_folders.insert("documents".to_string(), KnownFolder::PublicDocuments); + system_folders.insert("profile".to_string(), KnownFolder::ProgramData); + + let mut user_folders = HashMap::new(); + user_folders.insert("desktop".to_string(), KnownFolder::Desktop); + user_folders.insert("start".to_string(), KnownFolder::Programs); + user_folders.insert("documents".to_string(), KnownFolder::Documents); + user_folders.insert("profile".to_string(), KnownFolder::Profile); + + Folders { + system_folders, + user_folders, + } + } + + pub fn get_folder_path(&self, key: &str, user_handle: UserHandle) -> Result { + self.folder_path(user_handle, true, key) + } + + fn folder_path(&self, preferred_mode: UserHandle, check_other_mode: bool, key: &str) -> Result { + let (preferred_folders, other_folders) = match preferred_mode { + UserHandle::Current => (&self.user_folders, &self.system_folders), + UserHandle::Common => (&self.system_folders, &self.user_folders), + }; + + if let Some(folder) = preferred_folders.get(key) { + if let Some(path) = get_known_folder_path(folder) { + return Ok(path); + } + } + + // Implement fallback for user documents + if preferred_mode == UserHandle::Current && key == "documents" { + if let Some(profile_folder) = preferred_folders.get("profile") { + if let Some(profile_path) = get_known_folder_path(profile_folder) { + let documents_path = profile_path.join("Documents"); + if documents_path.is_dir() { + return Ok(documents_path); + } + } + } + } + + if check_other_mode { + if let Some(folder) = other_folders.get(key) { + if let Some(path) = get_known_folder_path(folder) { + return Ok(path); + } + } + } + + Err(FolderError::PathNotFound) + } + + pub fn verify_path>(&self, path: P) -> Result { + let path = path.as_ref(); + if path.exists() && path.is_dir() { + Ok(path.to_path_buf()) + } else { + Err(FolderError::PathNotVerifiable) + } + } +} + +fn main() { + let folders = Folders::new(); + + let test_folders = vec![ + ("desktop", UserHandle::Current), + ("documents", UserHandle::Current), + ("start", UserHandle::Common), + ("profile", UserHandle::Common), + ]; + + for (folder, handle) in test_folders { + match folders.get_folder_path(folder, handle) { + Ok(path) => { + tracing::info!("{} path for {:?}: {:?}", folder, handle, path); + match folders.verify_path(&path) { + Ok(_) => println!(" Path verified successfully"), + Err(e) => println!(" Path verification failed: {:?}", e), + } + } + Err(e) => tracing::error!("Error getting {} path for {:?}: {:?}", folder, handle, e), + } + } +} diff --git a/crates/rattler_menuinst/src/windows/registry.rs b/crates/rattler_menuinst/src/windows/registry.rs new file mode 100644 index 000000000..d255f0f95 --- /dev/null +++ b/crates/rattler_menuinst/src/windows/registry.rs @@ -0,0 +1,142 @@ +use anyhow::{Context, Result}; +use winreg::enums::*; +use winreg::RegKey; + +pub fn register_file_extension( + extension: &str, + identifier: &str, + command: &str, + icon: Option<&str>, + mode: &str, +) -> Result<()> { + let hkey = if mode == "system" { + HKEY_LOCAL_MACHINE + } else { + HKEY_CURRENT_USER + }; + + let classes = RegKey::predef(hkey).open_subkey_with_flags("Software\\Classes", KEY_ALL_ACCESS)?; + + // Associate extension with handler + let ext_key = classes.create_subkey(&format!("{}\\OpenWithProgids", extension))?; + ext_key.0.set_value(identifier, &"")?; + tracing::debug!("Created registry entry for extension '{}'", extension); + + // Register the handler + let handler_desc = format!("{} {} handler", extension, identifier); + classes.create_subkey(identifier)?.0.set_value("", &handler_desc)?; + tracing::debug!("Created registry entry for handler '{}'", identifier); + + // Set the 'open' command + let command_key = classes.create_subkey(&format!("{}\\shell\\open\\command", identifier))?; + command_key.0.set_value("", &command)?; + debug!("Created registry entry for command '{}'", command); + + // Set icon if provided + if let Some(icon_path) = icon { + let icon_key = classes.create_subkey(identifier)?; + icon_key.0.set_value("DefaultIcon", &icon_path)?; + tracing::debug!("Created registry entry for icon '{}'", icon_path); + } + + Ok(()) +} + +pub fn unregister_file_extension(extension: &str, identifier: &str, mode: &str) -> Result<()> { + let hkey = if mode == "system" { + HKEY_LOCAL_MACHINE + } else { + HKEY_CURRENT_USER + }; + + let classes = RegKey::predef(hkey).open_subkey_with_flags("Software\\Classes", KEY_ALL_ACCESS)?; + + // Delete the identifier key + classes.delete_subkey_all(identifier)?; + + // Remove the association in OpenWithProgids + let ext_key = classes.open_subkey_with_flags( + &format!("{}\\OpenWithProgids", extension), + KEY_ALL_ACCESS, + ); + + match ext_key { + Ok(key) => { + if key.get_value::(identifier).is_err() { + debug!( + "Handler '{}' is not associated with extension '{}'", + identifier, extension + ); + } else { + key.delete_value(identifier)?; + } + } + Err(e) => { + tracing::error!( + "Could not check key '{}' for deletion: {}", + extension, + e + ); + return Err(e.into()); + } + } + + Ok(()) +} + +pub fn register_url_protocol( + protocol: &str, + command: &str, + identifier: Option<&str>, + icon: Option<&str>, + mode: &str, +) -> Result<()> { + let key = if mode == "system" { + RegKey::predef(HKEY_CLASSES_ROOT).create_subkey(protocol)? + } else { + RegKey::predef(HKEY_CURRENT_USER).create_subkey(&format!("Software\\Classes\\{}", protocol))? + }; + + key.0.set_value("", &format!("URL:{}", protocol.to_uppercase()))?; + key.0.set_value("URL Protocol", &"")?; + + let command_key = key.0.create_subkey(r"shell\open\command")?; + command_key.set_value("", &command)?; + + if let Some(icon_path) = icon { + key.0.set_value("DefaultIcon", &icon_path)?; + } + + if let Some(id) = identifier { + key.0.set_value("_menuinst", &id)?; + } + + Ok(()) +} + +pub fn unregister_url_protocol(protocol: &str, identifier: Option<&str>, mode: &str) -> Result<()> { + let key = if mode == "system" { + RegKey::predef(HKEY_CLASSES_ROOT) + } else { + RegKey::predef(HKEY_CURRENT_USER).open_subkey("Software\\Classes")? + }; + + let delete = match key.open_subkey(protocol) { + Ok(k) => { + match k.get_value::("_menuinst") { + Ok(value) => identifier.is_none() || Some(value.as_str()) == identifier, + Err(_) => identifier.is_none(), + } + } + Err(e) => { + tracing::error!("Could not check key {} for deletion: {}", protocol, e); + return Ok(()); + } + }; + + if delete { + key.delete_subkey_all(protocol)?; + } + + Ok(()) +} From f6b136f440d6c0674fb54ecb596a28ecf7eeff5d Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Sat, 9 Nov 2024 17:06:38 +0100 Subject: [PATCH 008/132] more work on menuinst --- crates/rattler/src/install/driver.rs | 39 ++- crates/rattler_menuinst/Cargo.toml | 13 +- crates/rattler_menuinst/src/lib.rs | 4 +- crates/rattler_menuinst/src/linux.rs | 9 +- crates/rattler_menuinst/src/macos.rs | 91 +++--- crates/rattler_menuinst/src/schema.rs | 63 +++- ...nst__schema__test__deserialize_spyder.snap | 280 ++++++++++++++++++ .../src/windows/knownfolders.rs | 13 +- .../rattler_menuinst/src/windows/registry.rs | 39 ++- test-data/menuinst/spyder/menu.json | 161 ++++++++++ 10 files changed, 636 insertions(+), 76 deletions(-) create mode 100644 crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_spyder.snap create mode 100644 test-data/menuinst/spyder/menu.json diff --git a/crates/rattler/src/install/driver.rs b/crates/rattler/src/install/driver.rs index 73c7454a3..4b3b87a47 100644 --- a/crates/rattler/src/install/driver.rs +++ b/crates/rattler/src/install/driver.rs @@ -7,7 +7,7 @@ use std::{ use indexmap::IndexSet; use itertools::Itertools; -use rattler_conda_types::{prefix_record::PathType, PackageRecord, PrefixRecord}; +use rattler_conda_types::{prefix_record::PathType, PackageRecord, Platform, PrefixRecord}; use simple_spawn_blocking::{tokio::run_blocking_task, Cancelled}; use thiserror::Error; use tokio::sync::{AcquireError, OwnedSemaphorePermit, Semaphore}; @@ -222,6 +222,43 @@ impl InstallDriver { None }; + // find all files in `$PREFIX/menu/*.json` and install them with `menuinst` + if let Ok(read_dir) = target_prefix.join("menu").read_dir() { + for file in read_dir.flatten() { + let file = file.path(); + if file.is_file() && file.extension().map_or(false, |ext| ext == "json") { + tracing::info!("Installing menu item: {:?}", file); + rattler_menuinst::install_menuitems( + &file, + target_prefix, + target_prefix, + &Platform::current(), + ) + .unwrap_or_else(|e| { + tracing::warn!("Failed to install menu item: {} (ignored)", e); + }); + } + } + } + + // find all files in `$PREFIX/menu/*.json` and install them with `menuinst` + if let Ok(read_dir) = target_prefix.join("Menu").read_dir() { + for file in read_dir.flatten() { + let file = file.path(); + if file.is_file() && file.extension().map_or(false, |ext| ext == "json") { + rattler_menuinst::install_menuitems( + &file, + target_prefix, + target_prefix, + &Platform::current(), + ) + .unwrap_or_else(|e| { + tracing::warn!("Failed to install menu item: {} (ignored)", e); + }); + } + } + } + Ok(PostProcessResult { post_link_result, clobbered_paths, diff --git a/crates/rattler_menuinst/Cargo.toml b/crates/rattler_menuinst/Cargo.toml index 3629708c7..d2ce68f16 100644 --- a/crates/rattler_menuinst/Cargo.toml +++ b/crates/rattler_menuinst/Cargo.toml @@ -16,14 +16,13 @@ dirs = { workspace = true } serde = { workspace = true, features = ["derive"] } shlex = { workspace = true } serde_json = { workspace = true } -sha1 = "0.10.6" -tracing.workspace = true -rattler_conda_types = { path="../rattler_conda_types", version = "0.27.2", default-features = false } +tracing = { workspace = true } +rattler_conda_types = { path = "../rattler_conda_types", default-features = false } thiserror = { workspace = true } -unicode-normalization = "0.1.24" -regex.workspace = true -tempfile.workspace = true -fs-err = "2.11.0" +unicode-normalization = { workspace = true } +regex = { workspace = true } +tempfile = { workspace = true } +fs-err = { workspace = true } [target.'cfg(target_os = "windows")'.dependencies] winapi = "0.3.9" diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index d334e345c..bb5f11c5a 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -4,10 +4,10 @@ use rattler_conda_types::Platform; mod linux; mod macos; -#[cfg(target_os = "windows")] -mod windows; mod render; mod schema; +#[cfg(target_os = "windows")] +mod windows; pub mod slugify; pub use slugify::slugify; diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index 53cdfc390..ff4845c05 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -24,6 +24,7 @@ use crate::MenuMode; use crate::{schema::Linux, MenuInstError}; pub struct LinuxMenu { + name: String, item: Linux, directories: Directories, } @@ -70,6 +71,10 @@ impl Directories { impl LinuxMenu { fn new(item: Linux, mode: MenuMode) -> Self { LinuxMenu { + name: item + .base + .get_name(crate::schema::Environment::Base) + .to_string(), item, directories: Directories::new(mode), } @@ -77,7 +82,7 @@ impl LinuxMenu { fn location(&self) -> PathBuf { // TODO: The Python implementation uses one more variable - let filename = format!("{}.desktop", self.item.base.name); + let filename = format!("{}.desktop", self.name); self.directories.desktop_entries_location.join(filename) } @@ -151,7 +156,7 @@ impl LinuxMenu { writeln!(writer, "[Desktop Entry]")?; writeln!(writer, "Type=Application")?; writeln!(writer, "Encoding=UTF-8")?; - writeln!(writer, "Name={}", self.item.base.name)?; + writeln!(writer, "Name={:?}", self.item.base.name)?; writeln!(writer, "Exec={}", self.item.base.command.join(" "))?; writeln!( writer, diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index c4d0deb9b..4db8be2fe 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -2,7 +2,6 @@ use crate::{schema::MacOS, slugify, utils, MenuInstError, MenuMode}; use fs_err as fs; use fs_err::File; use plist::Value; -use sha1::{Digest, Sha1}; use std::{ io::{BufWriter, Write}, os::unix::fs::PermissionsExt, @@ -11,6 +10,7 @@ use std::{ }; pub struct MacOSMenu { + name: String, prefix: PathBuf, item: MacOS, directories: Directories, @@ -63,6 +63,10 @@ impl Directories { impl MacOSMenu { pub fn new(prefix: &Path, item: MacOS, directories: Directories) -> Self { Self { + name: item + .base + .get_name(crate::schema::Environment::Base) + .to_string(), prefix: prefix.to_path_buf(), item, directories, @@ -111,7 +115,7 @@ impl MacOSMenu { f.write_all(format!("APPL{short_name}").as_bytes())?; Ok(()) }; - let short_name = slugify(&self.item.base.name.chars().take(8).collect::()); + let short_name = slugify(&self.name.chars().take(8).collect::()); create_pkg_info(&self.directories.location, &short_name)?; if self.needs_appkit_launcher() { @@ -122,11 +126,12 @@ impl MacOSMenu { } fn write_plist_info(&self) -> Result<(), MenuInstError> { - let name = self.item.base.name.clone(); + let name = self.name.clone(); let slugname = slugify(&name); let shortname = if slugname.len() > 16 { - let hashed = format!("{:x}", Sha1::digest(slugname.as_bytes())); + // let hashed = format!("{:x}", Sha256::digest(slugname.as_bytes())); + let hashed = "123456"; format!("{}{}", &slugname[..10], &hashed[..6]) } else { slugname.clone() @@ -158,7 +163,13 @@ impl MacOSMenu { } if self.needs_appkit_launcher() { - println!("Writing plist to {}", self.directories.nested_location.join("Contents/Info.plist").display()); + println!( + "Writing plist to {}", + self.directories + .nested_location + .join("Contents/Info.plist") + .display() + ); plist::to_file_xml( self.directories.nested_location.join("Contents/Info.plist"), &pl, @@ -181,13 +192,13 @@ impl MacOSMenu { pl.insert("LSBackgroundOnly".into(), Value::Boolean(background_only)); } - self.item.ls_environment.as_ref().map(|env| { + if let Some(env) = self.item.ls_environment.as_ref() { let mut env_dict = plist::Dictionary::new(); for (k, v) in env { env_dict.insert(k.into(), Value::String(v.into())); } pl.insert("LSEnvironment".into(), Value::Dictionary(env_dict)); - }); + } if let Some(version) = self.item.ls_minimum_system_version.as_ref() { pl.insert( @@ -239,29 +250,35 @@ impl MacOSMenu { // pl.insert("UTExportedTypeDeclarations".into(), Value::Array(type_array)); }); - self.item - .ut_imported_type_declarations - .as_ref() - .map(|_types| { - // let mut type_array = Vec::new(); - // for t in types { - // let mut type_dict = plist::Dictionary::new(); - // type_dict.insert("UTTypeConformsTo".into(), Value::Array(t.ut_type_conforms_to.iter().map(|s| Value::String(s.clone())).collect())); - // type_dict.insert("UTTypeDescription".into(), Value::String(t.ut_type_description.clone().unwrap_or_default())); - // type_dict.insert("UTTypeIconFile".into(), Value::String(t.ut_type_icon_file.clone().unwrap_or_default())); - // type_dict.insert("UTTypeIdentifier".into(), Value::String(t.ut_type_identifier.clone())); - // type_dict.insert("UTTypeReferenceURL".into(), Value::String(t.ut_type_reference_url.clone().unwrap_or_default())); - // let mut tag_spec = plist::Dictionary::new(); - // for (k, v) in &t.ut_type_tag_specification { - // tag_spec.insert(k.clone(), Value::Array(v.iter().map(|s| Value::String(s.clone())).collect())); - // } - // type_dict.insert("UTTypeTagSpecification".into(), Value::Dictionary(tag_spec)); - // type_array.push(Value::Dictionary(type_dict)); - // } - // pl.insert("UTImportedTypeDeclarations".into(), Value::Array(type_array)); - }); - - println!("Writing plist to {}", self.directories.location.join("Contents/Info.plist").display()); + // self.item + // .ut_imported_type_declarations + // .as_ref() + // .map(|_types| { + // // let mut type_array = Vec::new(); + // // for t in types { + // // let mut type_dict = plist::Dictionary::new(); + // // type_dict.insert("UTTypeConformsTo".into(), Value::Array(t.ut_type_conforms_to.iter().map(|s| Value::String(s.clone())).collect())); + // // type_dict.insert("UTTypeDescription".into(), Value::String(t.ut_type_description.clone().unwrap_or_default())); + // // type_dict.insert("UTTypeIconFile".into(), Value::String(t.ut_type_icon_file.clone().unwrap_or_default())); + // // type_dict.insert("UTTypeIdentifier".into(), Value::String(t.ut_type_identifier.clone())); + // // type_dict.insert("UTTypeReferenceURL".into(), Value::String(t.ut_type_reference_url.clone().unwrap_or_default())); + // // let mut tag_spec = plist::Dictionary::new(); + // // for (k, v) in &t.ut_type_tag_specification { + // // tag_spec.insert(k.clone(), Value::Array(v.iter().map(|s| Value::String(s.clone())).collect())); + // // } + // // type_dict.insert("UTTypeTagSpecification".into(), Value::Dictionary(tag_spec)); + // // type_array.push(Value::Dictionary(type_dict)); + // // } + // // pl.insert("UTImportedTypeDeclarations".into(), Value::Array(type_array)); + // }); + + println!( + "Writing plist to {}", + self.directories + .location + .join("Contents/Info.plist") + .display() + ); plist::to_file_xml(self.directories.location.join("Contents/Info.plist"), &pl)?; Ok(()) @@ -296,7 +313,7 @@ impl MacOSMenu { .arg("--options") .arg("runtime") .arg("--prefix") - .arg(format!("com.{}", slugify(&self.item.base.name))) + .arg(format!("com.{}", slugify(&self.name))) .arg("--entitlements") .arg(&entitlements_file) .arg(self.directories.location.to_str().unwrap()) @@ -441,12 +458,12 @@ impl MacOSMenu { } fn default_appkit_launcher_path(&self) -> PathBuf { - let name = slugify(&self.item.base.name); + let name = slugify(&self.name); self.directories.location.join("Contents/MacOS").join(&name) } fn default_launcher_path(&self) -> PathBuf { - let name = slugify(&self.item.base.name); + let name = slugify(&self.name); if self.needs_appkit_launcher() { self.directories .nested_location @@ -463,9 +480,9 @@ impl MacOSMenu { } if register { - self.lsregister(&["-R", self.directories.location.to_str().unwrap()]) + Self::lsregister(&["-R", self.directories.location.to_str().unwrap()]) } else { - self.lsregister(&[ + Self::lsregister(&[ "-R", "-u", "-all", @@ -474,7 +491,7 @@ impl MacOSMenu { } } - fn lsregister(&self, args: &[&str]) -> Result<(), MenuInstError> { + fn lsregister(args: &[&str]) -> Result<(), MenuInstError> { let exe = "/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister"; let output = Command::new(exe).args(args).output().map_err(|e| { @@ -523,7 +540,7 @@ pub(crate) fn install_menu_item( ) -> Result<(), MenuInstError> { let bundle_name = macos_item.cf_bundle_name.as_ref().unwrap(); let directories = Directories::new(menu_mode, bundle_name); - println!("Installing menu item for {}", bundle_name); + println!("Installing menu item for {bundle_name}"); let menu = MacOSMenu::new(prefix, macos_item, directories); menu.install() } diff --git a/crates/rattler_menuinst/src/schema.rs b/crates/rattler_menuinst/src/schema.rs index ab7fb83e0..23e9047ff 100644 --- a/crates/rattler_menuinst/src/schema.rs +++ b/crates/rattler_menuinst/src/schema.rs @@ -12,7 +12,7 @@ pub struct MenuItemNameDict { #[serde(deny_unknown_fields)] pub struct BasePlatformSpecific { #[serde(default)] - pub name: String, + pub name: Option, #[serde(default)] pub description: String, pub icon: Option, @@ -25,12 +25,42 @@ pub struct BasePlatformSpecific { pub terminal: Option, } +#[derive(Serialize, Deserialize, Debug, Clone)] +#[serde(untagged)] +pub enum NameField { + Simple(String), + Complex(NameComplex), +} + +impl BasePlatformSpecific { + pub fn get_name(&self, env: Environment) -> &str { + match self.name.as_ref().unwrap() { + NameField::Simple(name) => name, + NameField::Complex(complex_name) => match env { + Environment::Base => &complex_name.target_environment_is_base, + Environment::NotBase => &complex_name.target_environment_is_not_base, + }, + } + } +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct NameComplex { + pub target_environment_is_base: String, + pub target_environment_is_not_base: String, +} + +pub enum Environment { + Base, + NotBase, +} + impl BasePlatformSpecific { pub fn merge_parent(self, parent: &MenuItem) -> Self { - let name = if self.name.is_empty() { + let name = if self.name.is_none() { parent.name.clone() } else { - self.name + self.name.unwrap() }; let description = if self.description.is_empty() { @@ -46,7 +76,7 @@ impl BasePlatformSpecific { }; BasePlatformSpecific { - name, + name: Some(name), description, icon: self.icon.or(parent.icon.clone()), command, @@ -206,7 +236,7 @@ pub struct Platforms { #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(deny_unknown_fields)] pub struct MenuItem { - pub name: String, + pub name: NameField, pub description: String, pub command: Vec, pub icon: Option, @@ -233,6 +263,8 @@ pub struct MenuInstSchema { mod test { use std::path::{Path, PathBuf}; + use crate::macos::Directories; + pub(crate) fn test_data() -> PathBuf { Path::new(env!("CARGO_MANIFEST_DIR")).join("../../test-data/menuinst") } @@ -263,4 +295,25 @@ mod test { let schema: super::MenuInstSchema = serde_json::from_str(&schema_str).unwrap(); insta::assert_debug_snapshot!(schema); } + + #[test] + fn test_deserialize_spyder() { + let test_data = test_data(); + let schema_path = test_data.join("spyder/menu.json"); + let schema_str = std::fs::read_to_string(schema_path).unwrap(); + let schema: super::MenuInstSchema = serde_json::from_str(&schema_str).unwrap(); + + let item = schema.menu_items[0].clone(); + let mut macos_item = item.platforms.osx.clone().unwrap(); + let base_item = macos_item.base.merge_parent(&item); + macos_item.base = base_item; + + assert_eq!( + macos_item.base.get_name(super::Environment::Base), + "superspyder 1.2 (base)" + ); + + // let foo = menu_0.platforms.osx.as_ref().unwrap().base.get_name(super::Environment::Base); + insta::assert_debug_snapshot!(schema); + } } diff --git a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_spyder.snap b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_spyder.snap new file mode 100644 index 000000000..dca295bb3 --- /dev/null +++ b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_spyder.snap @@ -0,0 +1,280 @@ +--- +source: crates/rattler_menuinst/src/schema.rs +expression: schema +--- +MenuInstSchema { + id: "https://schemas.conda.io/menuinst-1.schema.json", + schema: "https://json-schema.org/draft-07/schema", + menu_name: "superspyder", + menu_items: [ + MenuItem { + name: Complex( + NameComplex { + target_environment_is_base: "superspyder 1.2 (base)", + target_environment_is_not_base: "superspyder 1.2 ({{ ENV_NAME }})", + }, + ), + description: "Scientific PYthon Development EnviRonment", + command: [ + "", + ], + icon: Some( + "{{ MENU_DIR }}/superspyder.{{ ICON_EXT }}", + ), + precommand: None, + precreate: None, + working_dir: None, + activate: Some( + false, + ), + terminal: Some( + false, + ), + platforms: Platforms { + linux: Some( + Linux { + base: BasePlatformSpecific { + name: None, + description: "", + icon: None, + command: [ + "{{ PREFIX }}/bin/spyder", + "%F", + ], + working_dir: None, + precommand: None, + precreate: None, + activate: None, + terminal: None, + }, + categories: Some( + [ + "Development", + "Science", + ], + ), + dbus_activatable: None, + generic_name: None, + hidden: None, + implements: None, + keywords: None, + mime_type: Some( + [ + "text/x-python", + ], + ), + no_display: None, + not_show_in: None, + only_show_in: None, + prefers_non_default_gpu: None, + startup_notify: None, + startup_wm_class: Some( + "Spyder-__PKG_MAJOR_VER__.{{ ENV_NAME }}", + ), + try_exec: None, + glob_patterns: None, + }, + ), + osx: Some( + MacOS { + base: BasePlatformSpecific { + name: None, + description: "", + icon: None, + command: [ + "./python", + "{{ PREFIX }}/bin/spyder", + "$@", + ], + working_dir: None, + precommand: Some( + "pushd \"$(dirname \"$0\")\" &>/dev/null", + ), + precreate: None, + activate: None, + terminal: None, + }, + cf_bundle_display_name: None, + cf_bundle_identifier: Some( + "org.superspyder-ide.Superspyder-__PKG_MAJOR_VER__-__CFBID_ENV__", + ), + cf_bundle_name: Some( + "Superspyder __PKG_MAJOR_VER__", + ), + cf_bundle_spoken_name: None, + cf_bundle_version: Some( + "__PKG_VERSION__", + ), + cf_bundle_url_types: None, + cf_bundle_document_types: Some( + [ + CFBundleDocumentTypesModel { + cf_bundle_type_icon_file: Some( + "superspyder.icns", + ), + cf_bundle_type_name: "text document", + cf_bundle_type_role: Some( + "Editor", + ), + ls_item_content_types: [ + "com.apple.applescript.text", + "com.apple.ascii-property-list", + "com.apple.audio-unit-preset", + "com.apple.binary-property-list", + "com.apple.configprofile", + "com.apple.crashreport", + "com.apple.dashcode.css", + "com.apple.dashcode.javascript", + "com.apple.dashcode.json", + "com.apple.dashcode.manifest", + "com.apple.dt.document.ascii-property-list", + "com.apple.dt.document.script-suite-property-list", + "com.apple.dt.document.script-terminology-property-list", + "com.apple.property-list", + "com.apple.rez-source", + "com.apple.scripting-definition", + "com.apple.structured-text", + "com.apple.traditional-mac-plain-text", + "com.apple.xcode.ada-source", + "com.apple.xcode.apinotes", + "com.apple.xcode.bash-script", + "com.apple.xcode.configsettings", + "com.apple.xcode.csh-script", + "com.apple.xcode.entitlements-property-list", + "com.apple.xcode.fortran-source", + "com.apple.xcode.glsl-source", + "com.apple.xcode.ksh-script", + "com.apple.xcode.lex-source", + "com.apple.xcode.make-script", + "com.apple.xcode.mig-source", + "com.apple.xcode.pascal-source", + "com.apple.xcode.strings-text", + "com.apple.xcode.tcsh-script", + "com.apple.xcode.yacc-source", + "com.apple.xcode.zsh-script", + "com.apple.xml-property-list", + "com.netscape.javascript-source", + "com.scenarist.closed-caption", + "com.sun.java-source", + "com.sun.java-web-start", + "net.daringfireball.markdown", + "org.khronos.glsl-source", + "org.oasis-open.xliff", + "public.ada-source", + "public.assembly-source", + "public.bash-script", + "public.c-header", + "public.c-plus-plus-header", + "public.c-plus-plus-source", + "public.c-source", + "public.case-insensitive-text", + "public.comma-separated-values-text", + "public.csh-script", + "public.css", + "public.delimited-values-text", + "public.dylan-source", + "public.filename-extension", + "public.fortran-77-source", + "public.fortran-90-source", + "public.fortran-95-source", + "public.fortran-source", + "public.html", + "public.json", + "public.ksh-script", + "public.lex-source", + "public.log", + "public.m3u-playlist", + "public.make-source", + "public.mig-source", + "public.mime-type", + "public.module-map", + "public.nasm-assembly-source", + "public.objective-c-plus-plus-source", + "public.objective-c-source", + "public.opencl-source", + "public.pascal-source", + "public.patch-file", + "public.perl-script", + "public.php-script", + "public.plain-text", + "public.python-script", + "public.rss", + "public.ruby-script", + "public.script", + "public.shell-script", + "public.source-code", + "public.tcsh-script", + "public.text", + "public.utf16-external-plain-text", + "public.utf16-plain-text", + "public.utf8-plain-text", + "public.utf8-tab-separated-values-text", + "public.xhtml", + "public.xml", + "public.yacc-source", + "public.yaml", + "public.zsh-script", + ], + ls_handler_rank: "Default", + }, + ], + ), + ls_application_category_type: None, + ls_background_only: None, + ls_environment: None, + ls_minimum_system_version: None, + ls_multiple_instances_prohibited: None, + ls_requires_native_execution: None, + ns_supports_automatic_graphics_switching: None, + ut_exported_type_declarations: None, + ut_imported_type_declarations: None, + entitlements: None, + link_in_bundle: Some( + { + "{{ PREFIX }}/bin/python": "{{ MENU_ITEM_LOCATION }}/Contents/MacOS/python", + }, + ), + event_handler: None, + }, + ), + win: Some( + Windows { + base: BasePlatformSpecific { + name: None, + description: "", + icon: None, + command: [ + "{{ PREFIX }}/Scripts/superspyder.exe", + "%*", + ], + working_dir: None, + precommand: None, + precreate: None, + activate: None, + terminal: None, + }, + desktop: Some( + true, + ), + quicklaunch: None, + terminal_profile: None, + url_protocols: None, + file_extensions: Some( + [ + ".enaml", + ".ipy", + ".py", + ".pyi", + ".pyw", + ".pyx", + ], + ), + app_user_model_id: Some( + "superspyder-ide.superspyder-__PKG_MAJOR_VER__.{{ ENV_NAME }}", + ), + }, + ), + }, + }, + ], +} diff --git a/crates/rattler_menuinst/src/windows/knownfolders.rs b/crates/rattler_menuinst/src/windows/knownfolders.rs index 3801cf30f..09f7cc9d2 100644 --- a/crates/rattler_menuinst/src/windows/knownfolders.rs +++ b/crates/rattler_menuinst/src/windows/knownfolders.rs @@ -39,11 +39,20 @@ impl Folders { } } - pub fn get_folder_path(&self, key: &str, user_handle: UserHandle) -> Result { + pub fn get_folder_path( + &self, + key: &str, + user_handle: UserHandle, + ) -> Result { self.folder_path(user_handle, true, key) } - fn folder_path(&self, preferred_mode: UserHandle, check_other_mode: bool, key: &str) -> Result { + fn folder_path( + &self, + preferred_mode: UserHandle, + check_other_mode: bool, + key: &str, + ) -> Result { let (preferred_folders, other_folders) = match preferred_mode { UserHandle::Current => (&self.user_folders, &self.system_folders), UserHandle::Common => (&self.system_folders, &self.user_folders), diff --git a/crates/rattler_menuinst/src/windows/registry.rs b/crates/rattler_menuinst/src/windows/registry.rs index d255f0f95..34d4bfe9e 100644 --- a/crates/rattler_menuinst/src/windows/registry.rs +++ b/crates/rattler_menuinst/src/windows/registry.rs @@ -15,7 +15,8 @@ pub fn register_file_extension( HKEY_CURRENT_USER }; - let classes = RegKey::predef(hkey).open_subkey_with_flags("Software\\Classes", KEY_ALL_ACCESS)?; + let classes = + RegKey::predef(hkey).open_subkey_with_flags("Software\\Classes", KEY_ALL_ACCESS)?; // Associate extension with handler let ext_key = classes.create_subkey(&format!("{}\\OpenWithProgids", extension))?; @@ -24,7 +25,10 @@ pub fn register_file_extension( // Register the handler let handler_desc = format!("{} {} handler", extension, identifier); - classes.create_subkey(identifier)?.0.set_value("", &handler_desc)?; + classes + .create_subkey(identifier)? + .0 + .set_value("", &handler_desc)?; tracing::debug!("Created registry entry for handler '{}'", identifier); // Set the 'open' command @@ -49,16 +53,15 @@ pub fn unregister_file_extension(extension: &str, identifier: &str, mode: &str) HKEY_CURRENT_USER }; - let classes = RegKey::predef(hkey).open_subkey_with_flags("Software\\Classes", KEY_ALL_ACCESS)?; + let classes = + RegKey::predef(hkey).open_subkey_with_flags("Software\\Classes", KEY_ALL_ACCESS)?; // Delete the identifier key classes.delete_subkey_all(identifier)?; // Remove the association in OpenWithProgids - let ext_key = classes.open_subkey_with_flags( - &format!("{}\\OpenWithProgids", extension), - KEY_ALL_ACCESS, - ); + let ext_key = + classes.open_subkey_with_flags(&format!("{}\\OpenWithProgids", extension), KEY_ALL_ACCESS); match ext_key { Ok(key) => { @@ -72,11 +75,7 @@ pub fn unregister_file_extension(extension: &str, identifier: &str, mode: &str) } } Err(e) => { - tracing::error!( - "Could not check key '{}' for deletion: {}", - extension, - e - ); + tracing::error!("Could not check key '{}' for deletion: {}", extension, e); return Err(e.into()); } } @@ -94,10 +93,12 @@ pub fn register_url_protocol( let key = if mode == "system" { RegKey::predef(HKEY_CLASSES_ROOT).create_subkey(protocol)? } else { - RegKey::predef(HKEY_CURRENT_USER).create_subkey(&format!("Software\\Classes\\{}", protocol))? + RegKey::predef(HKEY_CURRENT_USER) + .create_subkey(&format!("Software\\Classes\\{}", protocol))? }; - key.0.set_value("", &format!("URL:{}", protocol.to_uppercase()))?; + key.0 + .set_value("", &format!("URL:{}", protocol.to_uppercase()))?; key.0.set_value("URL Protocol", &"")?; let command_key = key.0.create_subkey(r"shell\open\command")?; @@ -122,12 +123,10 @@ pub fn unregister_url_protocol(protocol: &str, identifier: Option<&str>, mode: & }; let delete = match key.open_subkey(protocol) { - Ok(k) => { - match k.get_value::("_menuinst") { - Ok(value) => identifier.is_none() || Some(value.as_str()) == identifier, - Err(_) => identifier.is_none(), - } - } + Ok(k) => match k.get_value::("_menuinst") { + Ok(value) => identifier.is_none() || Some(value.as_str()) == identifier, + Err(_) => identifier.is_none(), + }, Err(e) => { tracing::error!("Could not check key {} for deletion: {}", protocol, e); return Ok(()); diff --git a/test-data/menuinst/spyder/menu.json b/test-data/menuinst/spyder/menu.json new file mode 100644 index 000000000..1ea556661 --- /dev/null +++ b/test-data/menuinst/spyder/menu.json @@ -0,0 +1,161 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "$id": "https://schemas.conda.io/menuinst-1.schema.json", + "menu_name": "superspyder", + "menu_items": [ + { + "name": { + "target_environment_is_base": "superspyder 1.2 (base)", + "target_environment_is_not_base": "superspyder 1.2 ({{ ENV_NAME }})" + }, + "description": "Scientific PYthon Development EnviRonment", + "icon": "{{ MENU_DIR }}/superspyder.{{ ICON_EXT }}", + "activate": false, + "terminal": false, + "command": [""], + "platforms": { + "win": { + "desktop": true, + "app_user_model_id": "superspyder-ide.superspyder-__PKG_MAJOR_VER__.{{ ENV_NAME }}", + "command": ["{{ PREFIX }}/Scripts/superspyder.exe", "%*"], + "file_extensions": [ + ".enaml", + ".ipy", + ".py", + ".pyi", + ".pyw", + ".pyx" + ] + }, + "linux": { + "Categories": [ + "Development", + "Science" + ], + "command": ["{{ PREFIX }}/bin/spyder", "%F"], + "StartupWMClass": "Spyder-__PKG_MAJOR_VER__.{{ ENV_NAME }}", + "MimeType": [ + "text/x-python" + ] + }, + "osx": { + "precommand": "pushd \"$(dirname \"$0\")\" &>/dev/null", + "command": ["./python", "{{ PREFIX }}/bin/spyder", "$@"], + "link_in_bundle": { + "{{ PREFIX }}/bin/python": "{{ MENU_ITEM_LOCATION }}/Contents/MacOS/python" + }, + "CFBundleName": "Superspyder __PKG_MAJOR_VER__", + "CFBundleIdentifier": "org.superspyder-ide.Superspyder-__PKG_MAJOR_VER__-__CFBID_ENV__", + "CFBundleVersion": "__PKG_VERSION__", + "CFBundleDocumentTypes": [ + { + "CFBundleTypeName": "text document", + "CFBundleTypeRole": "Editor", + "LSHandlerRank": "Default", + "CFBundleTypeIconFile": "superspyder.icns", + "LSItemContentTypes": [ + "com.apple.applescript.text", + "com.apple.ascii-property-list", + "com.apple.audio-unit-preset", + "com.apple.binary-property-list", + "com.apple.configprofile", + "com.apple.crashreport", + "com.apple.dashcode.css", + "com.apple.dashcode.javascript", + "com.apple.dashcode.json", + "com.apple.dashcode.manifest", + "com.apple.dt.document.ascii-property-list", + "com.apple.dt.document.script-suite-property-list", + "com.apple.dt.document.script-terminology-property-list", + "com.apple.property-list", + "com.apple.rez-source", + "com.apple.scripting-definition", + "com.apple.structured-text", + "com.apple.traditional-mac-plain-text", + "com.apple.xcode.ada-source", + "com.apple.xcode.apinotes", + "com.apple.xcode.bash-script", + "com.apple.xcode.configsettings", + "com.apple.xcode.csh-script", + "com.apple.xcode.entitlements-property-list", + "com.apple.xcode.fortran-source", + "com.apple.xcode.glsl-source", + "com.apple.xcode.ksh-script", + "com.apple.xcode.lex-source", + "com.apple.xcode.make-script", + "com.apple.xcode.mig-source", + "com.apple.xcode.pascal-source", + "com.apple.xcode.strings-text", + "com.apple.xcode.tcsh-script", + "com.apple.xcode.yacc-source", + "com.apple.xcode.zsh-script", + "com.apple.xml-property-list", + "com.netscape.javascript-source", + "com.scenarist.closed-caption", + "com.sun.java-source", + "com.sun.java-web-start", + "net.daringfireball.markdown", + "org.khronos.glsl-source", + "org.oasis-open.xliff", + "public.ada-source", + "public.assembly-source", + "public.bash-script", + "public.c-header", + "public.c-plus-plus-header", + "public.c-plus-plus-source", + "public.c-source", + "public.case-insensitive-text", + "public.comma-separated-values-text", + "public.csh-script", + "public.css", + "public.delimited-values-text", + "public.dylan-source", + "public.filename-extension", + "public.fortran-77-source", + "public.fortran-90-source", + "public.fortran-95-source", + "public.fortran-source", + "public.html", + "public.json", + "public.ksh-script", + "public.lex-source", + "public.log", + "public.m3u-playlist", + "public.make-source", + "public.mig-source", + "public.mime-type", + "public.module-map", + "public.nasm-assembly-source", + "public.objective-c-plus-plus-source", + "public.objective-c-source", + "public.opencl-source", + "public.pascal-source", + "public.patch-file", + "public.perl-script", + "public.php-script", + "public.plain-text", + "public.python-script", + "public.rss", + "public.ruby-script", + "public.script", + "public.shell-script", + "public.source-code", + "public.tcsh-script", + "public.text", + "public.utf16-external-plain-text", + "public.utf16-plain-text", + "public.utf8-plain-text", + "public.utf8-tab-separated-values-text", + "public.xhtml", + "public.xml", + "public.yacc-source", + "public.yaml", + "public.zsh-script" + ] + } + ] + } + } + } + ] +} \ No newline at end of file From 82234b6ece584b788e6d0b86a72957ce32479b91 Mon Sep 17 00:00:00 2001 From: Bas Zalmstra Date: Sat, 9 Nov 2024 18:31:54 +0100 Subject: [PATCH 009/132] refactor: split merging\ --- crates/rattler/src/install/driver.rs | 21 +-- .../rattler_conda_types/src/match_spec/mod.rs | 5 + crates/rattler_index/src/lib.rs | 2 +- crates/rattler_menuinst/src/lib.rs | 22 ++- crates/rattler_menuinst/src/linux.rs | 129 ++++++++++-------- crates/rattler_menuinst/src/macos.rs | 129 +++++++++++------- crates/rattler_menuinst/src/schema.rs | 110 +++++++-------- crates/rattler_solve/src/lib.rs | 1 + crates/rattler_solve/src/multi.rs | 0 9 files changed, 221 insertions(+), 198 deletions(-) create mode 100644 crates/rattler_solve/src/multi.rs diff --git a/crates/rattler/src/install/driver.rs b/crates/rattler/src/install/driver.rs index 4b3b87a47..7b6cbea81 100644 --- a/crates/rattler/src/install/driver.rs +++ b/crates/rattler/src/install/driver.rs @@ -222,26 +222,7 @@ impl InstallDriver { None }; - // find all files in `$PREFIX/menu/*.json` and install them with `menuinst` - if let Ok(read_dir) = target_prefix.join("menu").read_dir() { - for file in read_dir.flatten() { - let file = file.path(); - if file.is_file() && file.extension().map_or(false, |ext| ext == "json") { - tracing::info!("Installing menu item: {:?}", file); - rattler_menuinst::install_menuitems( - &file, - target_prefix, - target_prefix, - &Platform::current(), - ) - .unwrap_or_else(|e| { - tracing::warn!("Failed to install menu item: {} (ignored)", e); - }); - } - } - } - - // find all files in `$PREFIX/menu/*.json` and install them with `menuinst` + // find all files in `$PREFIX/Menu/*.json` and install them with `menuinst` if let Ok(read_dir) = target_prefix.join("Menu").read_dir() { for file in read_dir.flatten() { let file = file.path(); diff --git a/crates/rattler_conda_types/src/match_spec/mod.rs b/crates/rattler_conda_types/src/match_spec/mod.rs index 65e5027e1..294c9c999 100644 --- a/crates/rattler_conda_types/src/match_spec/mod.rs +++ b/crates/rattler_conda_types/src/match_spec/mod.rs @@ -821,4 +821,9 @@ mod tests { MatchSpec::from_nameless(NamelessMatchSpec::from_str(">=12", Strict).unwrap(), None); assert!(!spec.is_virtual()); } + + #[test] + fn test_size_stays_the_same() { + assert_eq!(std::mem::size_of::(), 464); + } } diff --git a/crates/rattler_index/src/lib.rs b/crates/rattler_index/src/lib.rs index 37bdac722..714aef6d4 100644 --- a/crates/rattler_index/src/lib.rs +++ b/crates/rattler_index/src/lib.rs @@ -161,7 +161,7 @@ pub fn index(output_folder: &Path, target_platform: Option<&Platform>) -> std::i let mut repodata = RepoData { info: Some(ChannelInfo { - subdir: platform.clone(), + subdir: Some(platform.clone()), base_url: None, }), packages: HashMap::default(), diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index bb5f11c5a..9639b0c5a 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -48,18 +48,16 @@ pub fn install_menuitems( let schema = render::render(file, &placeholders)?; for item in schema.menu_items { - if item.platforms.linux.is_some() && platform.is_linux() { - let mut linux_item = item.platforms.linux.clone().unwrap(); - let base_item = linux_item.base.merge_parent(&item); - linux_item.base = base_item; - linux::install_menu_item(linux_item, MenuMode::System)?; - } else if item.platforms.osx.is_some() && platform.is_osx() { - let mut macos_item = item.platforms.osx.clone().unwrap(); - let base_item = macos_item.base.merge_parent(&item); - macos_item.base = base_item; - macos::install_menu_item(prefix, macos_item, MenuMode::System)?; - } else if item.platforms.win.is_some() && platform.is_windows() { - // windows::install_menu_item(&item)?; + if platform.is_linux() { + if let Some(linux_item) = item.platforms.linux { + let command = item.command.merge(linux_item.base); + linux::install_menu_item(linux_item.specific, command, MenuMode::System)?; + } + } else if platform.is_osx() { + if let Some(macos_item) = item.platforms.osx { + let command = item.command.merge(macos_item.base); + macos::install_menu_item(prefix, macos_item.specific, command, MenuMode::System)?; + } } } diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index ff4845c05..e2d23071e 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -15,17 +15,19 @@ use std::io::Write; // // Assuming these are defined elsewhere // use crate::utils::{UnixLex, add_xml_child, indent_xml_tree, logged_run, unlink}; // use crate::base::{Menu, MenuItem, menuitem_defaults}; - use std::{fs::File, path::PathBuf}; use rattler_conda_types::Platform; -use crate::MenuMode; -use crate::{schema::Linux, MenuInstError}; +use crate::{ + schema::{MenuItemCommand, Linux}, + MenuInstError, MenuMode, +}; pub struct LinuxMenu { name: String, item: Linux, + command: MenuItemCommand, directories: Directories, } @@ -69,13 +71,14 @@ impl Directories { } impl LinuxMenu { - fn new(item: Linux, mode: MenuMode) -> Self { + fn new(item: Linux, command: MenuItemCommand, mode: MenuMode) -> Self { LinuxMenu { - name: item - .base - .get_name(crate::schema::Environment::Base) + name: command + .name + .resolve(crate::schema::Environment::Base) .to_string(), item, + command, directories: Directories::new(mode), } } @@ -156,23 +159,23 @@ impl LinuxMenu { writeln!(writer, "[Desktop Entry]")?; writeln!(writer, "Type=Application")?; writeln!(writer, "Encoding=UTF-8")?; - writeln!(writer, "Name={:?}", self.item.base.name)?; - writeln!(writer, "Exec={}", self.item.base.command.join(" "))?; + writeln!(writer, "Name={:?}", self.command.name)?; + writeln!(writer, "Exec={}", self.command.command.join(" "))?; writeln!( writer, "Terminal={}", - self.item.base.terminal.unwrap_or(false) + self.command.terminal.unwrap_or(false) )?; - if let Some(icon) = &self.item.base.icon { + if let Some(icon) = &self.command.icon { writeln!(writer, "Icon={icon}")?; } - if !self.item.base.description.is_empty() { - writeln!(writer, "Comment={}", self.item.base.description)?; + if !self.command.description.is_empty() { + writeln!(writer, "Comment={}", self.command.description)?; } - if let Some(working_dir) = &self.item.base.working_dir { + if let Some(working_dir) = &self.command.working_dir { writeln!(writer, "Path={working_dir}")?; } @@ -209,8 +212,12 @@ impl LinuxMenu { } } -pub fn install_menu_item(item: Linux, menu_mode: MenuMode) -> Result<(), MenuInstError> { - let menu = LinuxMenu::new(item.clone(), menu_mode); +pub fn install_menu_item( + item: Linux, + command: MenuItemCommand, + menu_mode: MenuMode, +) -> Result<(), MenuInstError> { + let menu = LinuxMenu::new(item, command, menu_mode); menu.install()?; println!("{:?}", menu.location()); println!("{:?}", menu.directories.config_directory); @@ -238,9 +245,10 @@ pub fn install_menu_item(item: Linux, menu_mode: MenuMode) -> Result<(), MenuIns // (system_config_directory.clone(), system_data_directory.clone()) // } else { // ( -// PathBuf::from(env::var("XDG_CONFIG_HOME").unwrap_or_else(|_| "~/.config".to_string())), -// PathBuf::from(env::var("XDG_DATA_HOME").unwrap_or_else(|_| "~/.local/share".to_string())), -// ) +// PathBuf::from(env::var("XDG_CONFIG_HOME").unwrap_or_else(|_| +// "~/.config".to_string())), +// PathBuf::from(env::var("XDG_DATA_HOME").unwrap_or_else(|_| +// "~/.local/share".to_string())), ) // }; // LinuxMenu { @@ -248,11 +256,14 @@ pub fn install_menu_item(item: Linux, menu_mode: MenuMode) -> Result<(), MenuIns // mode, // config_directory: config_directory.clone(), // data_directory: data_directory.clone(), -// system_menu_config_location: system_config_directory.join("menus").join("applications.menu"), -// menu_config_location: config_directory.join("menus").join("applications.menu"), -// directory_entry_location: data_directory.join("desktop-directories").join(format!("{}.directory", Self::render(&name, true))), -// desktop_entries_location: data_directory.join("applications"), -// } +// system_menu_config_location: +// system_config_directory.join("menus").join("applications.menu"), +// menu_config_location: +// config_directory.join("menus").join("applications.menu"), +// directory_entry_location: +// data_directory.join("desktop-directories").join(format!("{}.directory", +// Self::render(&name, true))), desktop_entries_location: +// data_directory.join("applications"), } // } // pub fn create(&self) -> Vec { @@ -270,10 +281,10 @@ pub fn install_menu_item(item: Linux, menu_mode: MenuMode) -> Result<(), MenuIns // for entry in fs::read_dir(&self.desktop_entries_location).unwrap() { // let entry = entry.unwrap(); // let file_name = entry.file_name(); -// if file_name.to_str().unwrap().starts_with(&format!("{}_", Self::render(&self.name, true))) { -// // found one shortcut, so don't remove the name from menu -// return vec![self.directory_entry_location.clone()]; -// } +// if file_name.to_str().unwrap().starts_with(&format!("{}_", +// Self::render(&self.name, true))) { // found one shortcut, so +// don't remove the name from menu return +// vec![self.directory_entry_location.clone()]; } // } // unlink(&self.directory_entry_location, true); // self.remove_this_menu(); @@ -297,20 +308,21 @@ pub fn install_menu_item(item: Linux, menu_mode: MenuMode) -> Result<(), MenuIns // "[Desktop Entry]\nType=Directory\nEncoding=UTF-8\nName={}", // Self::render(&self.name, false) // ); -// debug!("Writing directory entry at {:?}", self.directory_entry_location); -// fs::write(&self.directory_entry_location, content).unwrap(); -// self.directory_entry_location.clone() -// } +// debug!("Writing directory entry at {:?}", +// self.directory_entry_location); fs::write(&self. +// directory_entry_location, content).unwrap(); self. +// directory_entry_location.clone() } // fn remove_this_menu(&self) { -// debug!("Editing {:?} to remove {} config", self.menu_config_location, Self::render(&self.name, false)); -// let mut doc = Element::parse(fs::read_to_string(&self.menu_config_location).unwrap().as_bytes()).unwrap(); -// doc.children.retain(|child| { +// debug!("Editing {:?} to remove {} config", self.menu_config_location, +// Self::render(&self.name, false)); let mut doc = +// Element::parse(fs::read_to_string(&self.menu_config_location).unwrap(). +// as_bytes()).unwrap(); doc.children.retain(|child| { // if let XMLNode::Element(element) = child { // if element.name == "Menu" { // if let Some(name_element) = element.get_child("Name") { -// return name_element.get_text() != Some(Self::render(&self.name, false)); -// } +// return name_element.get_text() != +// Some(Self::render(&self.name, false)); } // } // } // true @@ -319,13 +331,14 @@ pub fn install_menu_item(item: Linux, menu_mode: MenuMode) -> Result<(), MenuIns // } // fn has_this_menu(&self) -> bool { -// let doc = Element::parse(fs::read_to_string(&self.menu_config_location).unwrap().as_bytes()).unwrap(); -// doc.children.iter().any(|child| { +// let doc = +// Element::parse(fs::read_to_string(&self.menu_config_location).unwrap(). +// as_bytes()).unwrap(); doc.children.iter().any(|child| { // if let XMLNode::Element(element) = child { // if element.name == "Menu" { // if let Some(name_element) = element.get_child("Name") { -// return name_element.get_text() == Some(Self::render(&self.name, false)); -// } +// return name_element.get_text() == +// Some(Self::render(&self.name, false)); } // } // } // false @@ -333,13 +346,15 @@ pub fn install_menu_item(item: Linux, menu_mode: MenuMode) -> Result<(), MenuIns // } // fn add_this_menu(&self) { -// debug!("Editing {:?} to add {} config", self.menu_config_location, Self::render(&self.name, false)); -// let mut doc = Element::parse(fs::read_to_string(&self.menu_config_location).unwrap().as_bytes()).unwrap(); -// let mut menu_element = Element::new("Menu"); -// add_xml_child(&mut menu_element, "Name", Self::render(&self.name, false)); -// add_xml_child(&mut menu_element, "Directory", format!("{}.directory", Self::render(&self.name, true))); -// let mut inc_element = Element::new("Include"); -// add_xml_child(&mut inc_element, "Category", Self::render(&self.name, false)); +// debug!("Editing {:?} to add {} config", self.menu_config_location, +// Self::render(&self.name, false)); let mut doc = +// Element::parse(fs::read_to_string(&self.menu_config_location).unwrap(). +// as_bytes()).unwrap(); let mut menu_element = Element::new("Menu"); +// add_xml_child(&mut menu_element, "Name", Self::render(&self.name, +// false)); add_xml_child(&mut menu_element, "Directory", +// format!("{}.directory", Self::render(&self.name, true))); let mut +// inc_element = Element::new("Include"); add_xml_child(&mut +// inc_element, "Category", Self::render(&self.name, false)); // menu_element.children.push(XMLNode::Element(inc_element)); // doc.children.push(XMLNode::Element(menu_element)); // self.write_menu_file(&doc); @@ -358,21 +373,23 @@ pub fn install_menu_item(item: Linux, menu_mode: MenuMode) -> Result<(), MenuIns // debug!("Writing {:?}", self.menu_config_location); // indent_xml_tree(doc); // let mut file = File::create(&self.menu_config_location).unwrap(); -// writeln!(file, r#""#).unwrap(); +// writeln!(file, r#""#).unwrap(); // doc.write(&mut file).unwrap(); // writeln!(file).unwrap(); // } // fn ensure_menu_file(&self) { -// if self.menu_config_location.exists() && !self.menu_config_location.is_file() { -// panic!("Menu config location {:?} is not a file!", self.menu_config_location); -// } +// if self.menu_config_location.exists() && +// !self.menu_config_location.is_file() { panic!("Menu config +// location {:?} is not a file!", self.menu_config_location); } // if self.menu_config_location.is_file() { -// let cur_time = Local::now().format("%Y-%m-%d_%Hh%Mm%S").to_string(); -// let backup_menu_file = format!("{}.{}", self.menu_config_location.display(), cur_time); -// fs::copy(&self.menu_config_location, backup_menu_file).unwrap(); +// let cur_time = +// Local::now().format("%Y-%m-%d_%Hh%Mm%S").to_string(); let +// backup_menu_file = format!("{}.{}", self.menu_config_location.display(), +// cur_time); fs::copy(&self.menu_config_location, +// backup_menu_file).unwrap(); // if !self.is_valid_menu_file() { // fs::remove_file(&self.menu_config_location).unwrap(); diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index 4db8be2fe..62579cdc4 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -1,7 +1,3 @@ -use crate::{schema::MacOS, slugify, utils, MenuInstError, MenuMode}; -use fs_err as fs; -use fs_err::File; -use plist::Value; use std::{ io::{BufWriter, Write}, os::unix::fs::PermissionsExt, @@ -9,17 +5,28 @@ use std::{ process::Command, }; +use fs_err as fs; +use fs_err::File; +use plist::Value; + +use crate::{ + schema::{MacOS, MenuItemCommand}, + slugify, utils, MenuInstError, MenuMode, +}; + pub struct MacOSMenu { name: String, prefix: PathBuf, item: MacOS, + command: MenuItemCommand, directories: Directories, } pub struct Directories { /// Path to the .app directory defining the menu item location: PathBuf, - /// Path to the nested .app directory defining the menu item main application + /// Path to the nested .app directory defining the menu item main + /// application nested_location: PathBuf, } @@ -61,34 +68,39 @@ impl Directories { } impl MacOSMenu { - pub fn new(prefix: &Path, item: MacOS, directories: Directories) -> Self { + pub fn new( + prefix: &Path, + item: MacOS, + command: MenuItemCommand, + directories: Directories, + ) -> Self { Self { - name: item - .base - .get_name(crate::schema::Environment::Base) + name: command + .name + .resolve(crate::schema::Environment::Base) .to_string(), prefix: prefix.to_path_buf(), item, + command, directories, } } /// In macOS, file type and URL protocol associations are handled by the /// Apple Events system. When the user opens on a file or URL, the system - /// will send an Apple Event to the application that was registered as a handler. - /// We need a special launcher to handle these events and pass them to the - /// wrapped application in the shortcut. + /// will send an Apple Event to the application that was registered as a + /// handler. We need a special launcher to handle these events and pass + /// them to the wrapped application in the shortcut. /// /// See: /// - /// - The source code at /src/appkit-launcher in this repository - /// fn needs_appkit_launcher(&self) -> bool { self.item.cf_bundle_identifier.is_some() || self.item.cf_bundle_document_types.is_some() } pub fn install_icon(&self) -> Result<(), MenuInstError> { - if let Some(icon) = self.item.base.icon.as_ref() { + if let Some(icon) = self.command.icon.as_ref() { let icon = PathBuf::from(icon); let icon_name = icon.file_name().expect("Failed to get icon name"); let dest = self.directories.resources().join(icon_name); @@ -156,7 +168,7 @@ impl MacOSMenu { Value::String("1.0.0".into()), ); - if let Some(icon) = &self.item.base.icon { + if let Some(icon) = &self.command.icon { // TODO remove unwrap let icon_name = Path::new(&icon).file_name().unwrap().to_str().unwrap(); pl.insert("CFBundleIconFile".into(), Value::String(icon_name.into())); @@ -235,19 +247,30 @@ impl MacOSMenu { // let mut type_array = Vec::new(); // for t in types { // let mut type_dict = plist::Dictionary::new(); - // type_dict.insert("UTTypeConformsTo".into(), Value::Array(t.ut_type_conforms_to.iter().map(|s| Value::String(s.clone())).collect())); - // type_dict.insert("UTTypeDescription".into(), Value::String(t.ut_type_description.clone().unwrap_or_default())); - // type_dict.insert("UTTypeIconFile".into(), Value::String(t.ut_type_icon_file.clone().unwrap_or_default())); - // type_dict.insert("UTTypeIdentifier".into(), Value::String(t.ut_type_identifier.clone())); - // type_dict.insert("UTTypeReferenceURL".into(), Value::String(t.ut_type_reference_url.clone().unwrap_or_default())); - // let mut tag_spec = plist::Dictionary::new(); - // for (k, v) in &t.ut_type_tag_specification { - // tag_spec.insert(k.clone(), Value::Array(v.iter().map(|s| Value::String(s.clone())).collect())); - // } - // type_dict.insert("UTTypeTagSpecification".into(), Value::Dictionary(tag_spec)); - // type_array.push(Value::Dictionary(type_dict)); - // } - // pl.insert("UTExportedTypeDeclarations".into(), Value::Array(type_array)); + // type_dict.insert("UTTypeConformsTo".into(), + // Value::Array(t.ut_type_conforms_to.iter().map(|s| + // Value::String(s.clone())).collect())); + // type_dict.insert("UTTypeDescription".into(), + // Value::String(t.ut_type_description.clone(). + // unwrap_or_default())); type_dict.insert(" + // UTTypeIconFile".into(), + // Value::String(t.ut_type_icon_file.clone(). + // unwrap_or_default())); type_dict.insert(" + // UTTypeIdentifier".into(), + // Value::String(t.ut_type_identifier.clone())); + // type_dict.insert("UTTypeReferenceURL".into(), + // Value::String(t.ut_type_reference_url.clone(). + // unwrap_or_default())); let mut tag_spec = + // plist::Dictionary::new(); for (k, v) in + // &t.ut_type_tag_specification { + // tag_spec.insert(k.clone(), + // Value::Array(v.iter().map(|s| + // Value::String(s.clone())).collect())); } + // type_dict.insert("UTTypeTagSpecification".into(), + // Value::Dictionary(tag_spec)); type_array. + // push(Value::Dictionary(type_dict)); } + // pl.insert("UTExportedTypeDeclarations".into(), + // Value::Array(type_array)); }); // self.item @@ -257,20 +280,26 @@ impl MacOSMenu { // // let mut type_array = Vec::new(); // // for t in types { // // let mut type_dict = plist::Dictionary::new(); - // // type_dict.insert("UTTypeConformsTo".into(), Value::Array(t.ut_type_conforms_to.iter().map(|s| Value::String(s.clone())).collect())); - // // type_dict.insert("UTTypeDescription".into(), Value::String(t.ut_type_description.clone().unwrap_or_default())); - // // type_dict.insert("UTTypeIconFile".into(), Value::String(t.ut_type_icon_file.clone().unwrap_or_default())); - // // type_dict.insert("UTTypeIdentifier".into(), Value::String(t.ut_type_identifier.clone())); - // // type_dict.insert("UTTypeReferenceURL".into(), Value::String(t.ut_type_reference_url.clone().unwrap_or_default())); + // // type_dict.insert("UTTypeConformsTo".into(), + // Value::Array(t.ut_type_conforms_to.iter().map(|s| + // Value::String(s.clone())).collect())); // + // type_dict.insert("UTTypeDescription".into(), + // Value::String(t.ut_type_description.clone().unwrap_or_default())); + // // type_dict.insert("UTTypeIconFile".into(), + // Value::String(t.ut_type_icon_file.clone().unwrap_or_default())); + // // type_dict.insert("UTTypeIdentifier".into(), + // Value::String(t.ut_type_identifier.clone())); // + // type_dict.insert("UTTypeReferenceURL".into(), + // Value::String(t.ut_type_reference_url.clone().unwrap_or_default())); // // let mut tag_spec = plist::Dictionary::new(); // // for (k, v) in &t.ut_type_tag_specification { - // // tag_spec.insert(k.clone(), Value::Array(v.iter().map(|s| Value::String(s.clone())).collect())); - // // } - // // type_dict.insert("UTTypeTagSpecification".into(), Value::Dictionary(tag_spec)); - // // type_array.push(Value::Dictionary(type_dict)); - // // } - // // pl.insert("UTImportedTypeDeclarations".into(), Value::Array(type_array)); - // }); + // // tag_spec.insert(k.clone(), Value::Array(v.iter().map(|s| + // Value::String(s.clone())).collect())); // } + // // type_dict.insert("UTTypeTagSpecification".into(), + // Value::Dictionary(tag_spec)); // + // type_array.push(Value::Dictionary(type_dict)); // } + // // pl.insert("UTImportedTypeDeclarations".into(), + // Value::Array(type_array)); }); println!( "Writing plist to {}", @@ -325,7 +354,7 @@ impl MacOSMenu { fn command(&self) -> String { let mut lines = vec!["#!/bin/sh".to_string()]; - if self.item.base.terminal.unwrap_or(false) { + if self.command.terminal.unwrap_or(false) { lines.extend_from_slice(&[ r#"if [ "${__CFBundleIdentifier:-}" != "com.apple.Terminal" ]; then"#.to_string(), r#" open -b com.apple.terminal "$0""#.to_string(), @@ -334,16 +363,16 @@ impl MacOSMenu { ]); } - if let Some(working_dir) = &self.item.base.working_dir { + if let Some(working_dir) = &self.command.working_dir { fs::create_dir_all(working_dir).expect("Failed to create working directory"); lines.push(format!(r#"cd "{working_dir}""#)); } - if let Some(precommand) = &self.item.base.precommand { + if let Some(precommand) = &self.command.precommand { lines.push(precommand.clone()); } - // if self.item.base.activate { + // if self.command.activate { // // Assuming these fields exist in your MacOS struct // let conda_exe = &self.item.conda_exe; // let prefix = &self.item.prefix; @@ -352,16 +381,17 @@ impl MacOSMenu { // } else { // "shell.bash activate" // }; - // lines.push(format!(r#"eval "$("{}" {} "{}")""#, conda_exe, activate, prefix)); - // } + // lines.push(format!(r#"eval "$("{}" {} "{}")""#, conda_exe, activate, + // prefix)); } - lines.push(utils::quote_args(&self.item.base.command).join(" ")); + lines.push(utils::quote_args(&self.command.command).join(" ")); lines.join("\n") } fn write_appkit_launcher(&self) -> Result { - // let launcher_path = launcher_path.unwrap_or_else(|| self.default_appkit_launcher_path()); + // let launcher_path = launcher_path.unwrap_or_else(|| + // self.default_appkit_launcher_path()); #[cfg(target_arch = "aarch64")] let launcher_bytes = include_bytes!("../data/appkit_launcher_arm64"); #[cfg(target_arch = "x86_64")] @@ -536,12 +566,13 @@ impl MacOSMenu { pub(crate) fn install_menu_item( prefix: &Path, macos_item: MacOS, + command: MenuItemCommand, menu_mode: MenuMode, ) -> Result<(), MenuInstError> { let bundle_name = macos_item.cf_bundle_name.as_ref().unwrap(); let directories = Directories::new(menu_mode, bundle_name); println!("Installing menu item for {bundle_name}"); - let menu = MacOSMenu::new(prefix, macos_item, directories); + let menu = MacOSMenu::new(prefix, macos_item, command, directories); menu.install() } diff --git a/crates/rattler_menuinst/src/schema.rs b/crates/rattler_menuinst/src/schema.rs index 23e9047ff..dca085370 100644 --- a/crates/rattler_menuinst/src/schema.rs +++ b/crates/rattler_menuinst/src/schema.rs @@ -1,6 +1,7 @@ -use serde::{Deserialize, Serialize}; use std::collections::HashMap; +use serde::{Deserialize, Serialize}; + #[derive(Serialize, Deserialize, Debug)] #[serde(deny_unknown_fields)] pub struct MenuItemNameDict { @@ -11,13 +12,10 @@ pub struct MenuItemNameDict { #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(deny_unknown_fields)] pub struct BasePlatformSpecific { - #[serde(default)] pub name: Option, - #[serde(default)] - pub description: String, + pub description: Option, pub icon: Option, - #[serde(default)] - pub command: Vec, + pub command: Option>, pub working_dir: Option, pub precommand: Option, pub precreate: Option, @@ -25,6 +23,15 @@ pub struct BasePlatformSpecific { pub terminal: Option, } +#[derive(Serialize, Deserialize, Debug, Clone)] +#[serde(deny_unknown_fields)] +pub struct Platform { + #[serde(flatten)] + pub base: BasePlatformSpecific, + #[serde(flatten)] + pub specific: T, +} + #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(untagged)] pub enum NameField { @@ -32,9 +39,9 @@ pub enum NameField { Complex(NameComplex), } -impl BasePlatformSpecific { - pub fn get_name(&self, env: Environment) -> &str { - match self.name.as_ref().unwrap() { +impl NameField { + pub fn resolve(&self, env: Environment) -> &str { + match self { NameField::Simple(name) => name, NameField::Complex(complex_name) => match env { Environment::Base => &complex_name.target_environment_is_base, @@ -55,45 +62,9 @@ pub enum Environment { NotBase, } -impl BasePlatformSpecific { - pub fn merge_parent(self, parent: &MenuItem) -> Self { - let name = if self.name.is_none() { - parent.name.clone() - } else { - self.name.unwrap() - }; - - let description = if self.description.is_empty() { - parent.description.clone() - } else { - self.description - }; - - let command = if self.command.is_empty() { - parent.command.clone() - } else { - self.command - }; - - BasePlatformSpecific { - name: Some(name), - description, - icon: self.icon.or(parent.icon.clone()), - command, - working_dir: self.working_dir.or(parent.working_dir.clone()), - precommand: self.precommand.or(parent.precommand.clone()), - precreate: self.precreate.or(parent.precreate.clone()), - activate: self.activate.or(parent.activate), - terminal: self.terminal.or(parent.terminal), - } - } -} - #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(deny_unknown_fields)] pub struct Windows { - #[serde(flatten)] - base: BasePlatformSpecific, desktop: Option, quicklaunch: Option, terminal_profile: Option, @@ -105,8 +76,6 @@ pub struct Windows { #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(deny_unknown_fields)] pub struct Linux { - #[serde(flatten)] - pub base: BasePlatformSpecific, #[serde(rename = "Categories")] pub categories: Option>, #[serde(rename = "DBusActivatable")] @@ -186,8 +155,6 @@ pub struct UTTypeDeclarationModel { #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(deny_unknown_fields)] pub struct MacOS { - #[serde(flatten)] - pub base: BasePlatformSpecific, #[serde(rename = "CFBundleDisplayName")] pub cf_bundle_display_name: Option, #[serde(rename = "CFBundleIdentifier")] @@ -228,14 +195,22 @@ pub struct MacOS { #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(deny_unknown_fields)] pub struct Platforms { - pub linux: Option, - pub osx: Option, - pub win: Option, + pub linux: Option>, + pub osx: Option>, + pub win: Option>, } #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(deny_unknown_fields)] pub struct MenuItem { + #[serde(flatten)] + pub command: MenuItemCommand, + pub platforms: Platforms, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +#[serde(deny_unknown_fields)] +pub struct MenuItemCommand { pub name: NameField, pub description: String, pub command: Vec, @@ -245,7 +220,24 @@ pub struct MenuItem { pub working_dir: Option, pub activate: Option, pub terminal: Option, - pub platforms: Platforms, +} + +impl MenuItemCommand { + pub fn merge(&self, platform: BasePlatformSpecific) -> MenuItemCommand { + MenuItemCommand { + name: platform.name.unwrap_or_else(|| self.name.clone()), + description: platform + .description + .unwrap_or_else(|| self.description.clone()), + command: platform.command.unwrap_or_else(|| self.command.clone()), + icon: platform.icon.as_ref().or_else(|| self.icon.as_ref()).cloned(), + precommand: platform.precommand.or_else(|| self.precommand.clone()), + precreate: platform.precreate.or_else(|| self.precreate.clone()), + working_dir: platform.working_dir.or_else(|| self.working_dir.clone()), + activate: platform.activate.or_else(|| self.activate.clone()), + terminal: platform.terminal.or_else(|| self.terminal.clone()), + } + } } #[derive(Serialize, Deserialize, Debug)] @@ -263,8 +255,6 @@ pub struct MenuInstSchema { mod test { use std::path::{Path, PathBuf}; - use crate::macos::Directories; - pub(crate) fn test_data() -> PathBuf { Path::new(env!("CARGO_MANIFEST_DIR")).join("../../test-data/menuinst") } @@ -304,16 +294,16 @@ mod test { let schema: super::MenuInstSchema = serde_json::from_str(&schema_str).unwrap(); let item = schema.menu_items[0].clone(); - let mut macos_item = item.platforms.osx.clone().unwrap(); - let base_item = macos_item.base.merge_parent(&item); - macos_item.base = base_item; + let macos_item = item.platforms.osx.clone().unwrap(); + let command = item.command.merge(macos_item.base); assert_eq!( - macos_item.base.get_name(super::Environment::Base), + command.name.resolve(super::Environment::Base), "superspyder 1.2 (base)" ); - // let foo = menu_0.platforms.osx.as_ref().unwrap().base.get_name(super::Environment::Base); + // let foo = menu_0.platforms.osx.as_ref().unwrap().base. + // get_name(super::Environment::Base); insta::assert_debug_snapshot!(schema); } } diff --git a/crates/rattler_solve/src/lib.rs b/crates/rattler_solve/src/lib.rs index 1f9510f50..d8d500e9c 100644 --- a/crates/rattler_solve/src/lib.rs +++ b/crates/rattler_solve/src/lib.rs @@ -8,6 +8,7 @@ pub mod libsolv_c; #[cfg(feature = "resolvo")] pub mod resolvo; +// pub mod multi; use std::fmt; diff --git a/crates/rattler_solve/src/multi.rs b/crates/rattler_solve/src/multi.rs new file mode 100644 index 000000000..e69de29bb From 278a8ccc9fdec3f1c9432c77ce39bffc594a3c02 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Sat, 9 Nov 2024 18:32:11 +0100 Subject: [PATCH 010/132] use real data --- test-data/menuinst/spyder/menu.json | 40 ++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/test-data/menuinst/spyder/menu.json b/test-data/menuinst/spyder/menu.json index 1ea556661..0a0dd6982 100644 --- a/test-data/menuinst/spyder/menu.json +++ b/test-data/menuinst/spyder/menu.json @@ -1,23 +1,23 @@ { "$schema": "https://json-schema.org/draft-07/schema", "$id": "https://schemas.conda.io/menuinst-1.schema.json", - "menu_name": "superspyder", + "menu_name": "{{ DISTRIBUTION_NAME }} spyder", "menu_items": [ { "name": { - "target_environment_is_base": "superspyder 1.2 (base)", - "target_environment_is_not_base": "superspyder 1.2 ({{ ENV_NAME }})" + "target_environment_is_base": "Spyder 6 ({{ DISTRIBUTION_NAME }})", + "target_environment_is_not_base": "Spyder 6 ({{ ENV_NAME }})" }, "description": "Scientific PYthon Development EnviRonment", - "icon": "{{ MENU_DIR }}/superspyder.{{ ICON_EXT }}", + "icon": "{{ MENU_DIR }}/spyder.{{ ICON_EXT }}", "activate": false, "terminal": false, "command": [""], "platforms": { "win": { "desktop": true, - "app_user_model_id": "superspyder-ide.superspyder-__PKG_MAJOR_VER__.{{ ENV_NAME }}", - "command": ["{{ PREFIX }}/Scripts/superspyder.exe", "%*"], + "app_user_model_id": "spyder-ide.Spyder-6.{{ ENV_NAME }}", + "command": ["{{ PREFIX }}/Scripts/spyder.exe", "%*"], "file_extensions": [ ".enaml", ".ipy", @@ -33,7 +33,7 @@ "Science" ], "command": ["{{ PREFIX }}/bin/spyder", "%F"], - "StartupWMClass": "Spyder-__PKG_MAJOR_VER__.{{ ENV_NAME }}", + "StartupWMClass": "Spyder-6.{{ ENV_NAME }}", "MimeType": [ "text/x-python" ] @@ -44,15 +44,15 @@ "link_in_bundle": { "{{ PREFIX }}/bin/python": "{{ MENU_ITEM_LOCATION }}/Contents/MacOS/python" }, - "CFBundleName": "Superspyder __PKG_MAJOR_VER__", - "CFBundleIdentifier": "org.superspyder-ide.Superspyder-__PKG_MAJOR_VER__-__CFBID_ENV__", - "CFBundleVersion": "__PKG_VERSION__", + "CFBundleName": "Spyder 6", + "CFBundleIdentifier": "org.spyder-ide.Spyder-6-.prefix", + "CFBundleVersion": "6.0.2", "CFBundleDocumentTypes": [ { "CFBundleTypeName": "text document", "CFBundleTypeRole": "Editor", "LSHandlerRank": "Default", - "CFBundleTypeIconFile": "superspyder.icns", + "CFBundleTypeIconFile": "spyder.icns", "LSItemContentTypes": [ "com.apple.applescript.text", "com.apple.ascii-property-list", @@ -156,6 +156,22 @@ ] } } + }, + { + "platforms": { + "win": { + "name": { + "target_environment_is_base": "Reset Spyder 6 ({{ DISTRIBUTION_NAME }}) to default settings", + "target_environment_is_not_base": "Reset Spyder 6 ({{ ENV_NAME }}) to default settings" + }, + "description": "Scientific PYthon Development EnviRonment", + "activate": false, + "terminal": false, + "desktop": true, + "app_user_model_id": "spyder-ide.Spyder-6.{{ ENV_NAME }}.Reset", + "command": ["{{ PREFIX }}/Scripts/spyder.exe", "--reset"] + } + } } ] -} \ No newline at end of file +} From db9513a9f0d19fa478c30c0a04534e232f8d257a Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Sat, 9 Nov 2024 19:10:32 +0100 Subject: [PATCH 011/132] update test --- crates/rattler_index/src/lib.rs | 2 +- crates/rattler_menuinst/src/schema.rs | 2 +- test-data/menuinst/spyder/menu.json | 16 ---------------- 3 files changed, 2 insertions(+), 18 deletions(-) diff --git a/crates/rattler_index/src/lib.rs b/crates/rattler_index/src/lib.rs index 714aef6d4..37bdac722 100644 --- a/crates/rattler_index/src/lib.rs +++ b/crates/rattler_index/src/lib.rs @@ -161,7 +161,7 @@ pub fn index(output_folder: &Path, target_platform: Option<&Platform>) -> std::i let mut repodata = RepoData { info: Some(ChannelInfo { - subdir: Some(platform.clone()), + subdir: platform.clone(), base_url: None, }), packages: HashMap::default(), diff --git a/crates/rattler_menuinst/src/schema.rs b/crates/rattler_menuinst/src/schema.rs index dca085370..3e51a19f7 100644 --- a/crates/rattler_menuinst/src/schema.rs +++ b/crates/rattler_menuinst/src/schema.rs @@ -299,7 +299,7 @@ mod test { assert_eq!( command.name.resolve(super::Environment::Base), - "superspyder 1.2 (base)" + "Spyder 6 ({{ DISTRIBUTION_NAME }})" ); // let foo = menu_0.platforms.osx.as_ref().unwrap().base. diff --git a/test-data/menuinst/spyder/menu.json b/test-data/menuinst/spyder/menu.json index 0a0dd6982..ee09aad4a 100644 --- a/test-data/menuinst/spyder/menu.json +++ b/test-data/menuinst/spyder/menu.json @@ -156,22 +156,6 @@ ] } } - }, - { - "platforms": { - "win": { - "name": { - "target_environment_is_base": "Reset Spyder 6 ({{ DISTRIBUTION_NAME }}) to default settings", - "target_environment_is_not_base": "Reset Spyder 6 ({{ ENV_NAME }}) to default settings" - }, - "description": "Scientific PYthon Development EnviRonment", - "activate": false, - "terminal": false, - "desktop": true, - "app_user_model_id": "spyder-ide.Spyder-6.{{ ENV_NAME }}.Reset", - "command": ["{{ PREFIX }}/Scripts/spyder.exe", "--reset"] - } - } } ] } From ba32e08840dc370c3cfd0d5ec37e61ddb607a499 Mon Sep 17 00:00:00 2001 From: Bas Zalmstra Date: Sat, 9 Nov 2024 19:25:36 +0100 Subject: [PATCH 012/132] refactor: resolve later --- crates/rattler_menuinst/src/lib.rs | 29 +++- crates/rattler_menuinst/src/macos.rs | 1 - crates/rattler_menuinst/src/render.rs | 208 ++++++++++++++----------- crates/rattler_menuinst/src/schema.rs | 34 +++- crates/rattler_menuinst/src/windows.rs | 77 +++++---- 5 files changed, 210 insertions(+), 139 deletions(-) diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index 9639b0c5a..cbc4ede71 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -2,7 +2,9 @@ use std::path::Path; use rattler_conda_types::Platform; +#[cfg(target_os = "linux")] mod linux; +#[cfg(target_os = "macos")] mod macos; mod render; mod schema; @@ -12,6 +14,8 @@ mod windows; pub mod slugify; pub use slugify::slugify; +use crate::{render::BaseMenuItemPlaceholders, schema::MenuInstSchema}; + pub mod utils; #[derive(Debug, Eq, PartialEq)] @@ -41,23 +45,36 @@ pub fn install_menuitems( file: &Path, prefix: &Path, base_prefix: &Path, - platform: &Platform, + platform: Platform, ) -> Result<(), MenuInstError> { - let placeholders = render::placeholders(base_prefix, prefix, platform); - - let schema = render::render(file, &placeholders)?; + let text = std::fs::read_to_string(file)?; + let menu_inst: MenuInstSchema = serde_json::from_str(&text)?; + let placeholders = BaseMenuItemPlaceholders::new(base_prefix, prefix, platform); - for item in schema.menu_items { + for item in menu_inst.menu_items { if platform.is_linux() { + #[cfg(target_os = "linux")] if let Some(linux_item) = item.platforms.linux { let command = item.command.merge(linux_item.base); linux::install_menu_item(linux_item.specific, command, MenuMode::System)?; } } else if platform.is_osx() { + #[cfg(target_os = "macos")] if let Some(macos_item) = item.platforms.osx { let command = item.command.merge(macos_item.base); macos::install_menu_item(prefix, macos_item.specific, command, MenuMode::System)?; } + } else if platform.is_windows() { + #[cfg(target_os = "windows")] + if let Some(windows_item) = item.platforms.win { + let command = item.command.merge(windows_item.base); + windows::install_menu_item( + prefix, + windows_item.specific, + command, + MenuMode::System, + )?; + } } } @@ -88,6 +105,6 @@ pub mod test { let base_prefix = PathBuf::from("/Users/jaidevd/miniconda3"); let platform = Platform::OsxArm64; - install_menuitems(&schema_path, &prefix, &base_prefix, &platform).unwrap(); + install_menuitems(&schema_path, &prefix, &base_prefix, platform).unwrap(); } } diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index 62579cdc4..840c2e890 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -564,7 +564,6 @@ impl MacOSMenu { } pub(crate) fn install_menu_item( - prefix: &Path, macos_item: MacOS, command: MenuItemCommand, menu_mode: MenuMode, diff --git a/crates/rattler_menuinst/src/render.rs b/crates/rattler_menuinst/src/render.rs index b6385ca71..9bbbce00f 100644 --- a/crates/rattler_menuinst/src/render.rs +++ b/crates/rattler_menuinst/src/render.rs @@ -2,116 +2,138 @@ use rattler_conda_types::Platform; use std::{collections::HashMap, path::Path}; - +use serde::{Deserialize, Serialize}; use crate::schema::MenuInstSchema; -/// Replace placeholders in a string with values from a hashmap -/// This only replaces placeholders in the form of {{ key }} (note: while this looks like a Jinja template, it is not). -fn replace_placeholders(mut text: String, replacements: &HashMap) -> String { - for (key, value) in replacements { - let placeholder = format!("{{{{ {key} }}}}"); - text = text.replace(&placeholder, value); +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(transparent)] +pub struct PlaceholderString(pub String); + +impl PlaceholderString { + pub fn resolve(&self, placeholder: impl AsRef>) -> String { + replace_placeholders(self.0.clone(), placeholder.as_ref()) } - text } -/// Return all placeholders that can be used in the menuinst schema -pub fn placeholders( - base_prefix: &Path, - prefix: &Path, - platform: &Platform, - // menu_item_location: &Path, -) -> HashMap { - let dist_name = |p: &Path| { - p.parent() - .and_then(|p| p.file_name().map(|s| s.to_string_lossy().to_string())) - .unwrap_or_else(|| "empty".to_string()) - }; - - let (python, base_python) = if platform.is_windows() { - (prefix.join("python.exe"), base_prefix.join("python.exe")) - } else { - (prefix.join("bin/python"), base_prefix.join("bin/python")) - }; - - let mut vars = HashMap::from([ - ("BASE_PREFIX", base_prefix.to_path_buf()), - ("PREFIX", prefix.to_path_buf()), - ("PYTHON", python), - ("BASE_PYTHON", base_python), - ("MENU_DIR", prefix.join("menu")), - ("HOME", dirs::home_dir().unwrap_or_default()), - ]); - - if platform.is_windows() { - vars.insert("BIN_DIR", prefix.join("Library/bin")); - vars.insert("SCRIPTS_DIR", prefix.join("Scripts")); - vars.insert("BASE_PYTHONW", base_prefix.join("pythonw.exe")); - vars.insert("PYTHONW", prefix.join("pythonw.exe")); - } else { - vars.insert("BIN_DIR", prefix.join("bin")); - } +pub struct BaseMenuItemPlaceholders { + placeholders: HashMap, +} - if platform.is_osx() { - vars.insert("PYTHONAPP", prefix.join("python.app/Contents/MacOS/python")); +impl BaseMenuItemPlaceholders { + pub fn new(base_prefix: &Path, + prefix: &Path, + platform: Platform) -> Self { + let dist_name = |p: &Path| { + p.parent() + .and_then(|p| p.file_name().map(|s| s.to_string_lossy().to_string())) + .unwrap_or_else(|| "empty".to_string()) + }; + + let (python, base_python) = if platform.is_windows() { + (prefix.join("python.exe"), base_prefix.join("python.exe")) + } else { + (prefix.join("bin/python"), base_prefix.join("bin/python")) + }; + + let mut vars = HashMap::from([ + ("BASE_PREFIX", base_prefix.to_path_buf()), + ("PREFIX", prefix.to_path_buf()), + ("PYTHON", python), + ("BASE_PYTHON", base_python), + ("MENU_DIR", prefix.join("menu")), + ("HOME", dirs::home_dir().unwrap_or_default()), + ]); + + if platform.is_windows() { + vars.insert("BIN_DIR", prefix.join("Library/bin")); + vars.insert("SCRIPTS_DIR", prefix.join("Scripts")); + vars.insert("BASE_PYTHONW", base_prefix.join("pythonw.exe")); + vars.insert("PYTHONW", prefix.join("pythonw.exe")); + } else { + vars.insert("BIN_DIR", prefix.join("bin")); + } + + if platform.is_osx() { + vars.insert("PYTHONAPP", prefix.join("python.app/Contents/MacOS/python")); + } + + // vars.insert("MENU_ITEM_LOCATION", menu_item_location.to_path_buf()); + + let mut vars: HashMap = vars + .into_iter() + .map(|(k, v)| (k.to_string(), v.to_string_lossy().to_string())) + .collect(); + + let icon_ext = if platform.is_windows() { + "ico" + } else if platform.is_osx() { + "icns" + } else { + "png" + }; + vars.insert("ICON_EXT".to_string(), icon_ext.to_string()); + + vars.insert("DISTRIBUTION_NAME".to_string(), dist_name(prefix)); + vars.insert("ENV_NAME".to_string(), dist_name(prefix)); + + BaseMenuItemPlaceholders { + placeholders: vars, + } } - // vars.insert("MENU_ITEM_LOCATION", menu_item_location.to_path_buf()); - - let mut vars: HashMap = vars - .into_iter() - .map(|(k, v)| (k.to_string(), v.to_string_lossy().to_string())) - .collect(); - - let icon_ext = if platform.is_windows() { - "ico" - } else if platform.is_osx() { - "icns" - } else { - "png" - }; - vars.insert("ICON_EXT".to_string(), icon_ext.to_string()); - - vars.insert("DISTRIBUTION_NAME".to_string(), dist_name(prefix)); - vars.insert("ENV_NAME".to_string(), dist_name(prefix)); - - // TODO: (missing!) PY_VER, SP_DIR + pub fn refine(&self, menu_item_location: &Path) -> MenuItemPlaceholders { + let mut vars = self.placeholders.clone(); + vars.insert("MENU_ITEM_LOCATION".to_string(), menu_item_location.to_string_lossy().to_string()); + MenuItemPlaceholders { + placeholders: vars, + } + } +} - vars +pub struct MenuItemPlaceholders { + placeholders: HashMap, } -/// Render a given menuinst schema file with the given variables and return the `MenuInstSchema` -/// See also: `placeholders` -pub fn render( - file: &Path, - variables: &HashMap, -) -> Result { - let text = std::fs::read_to_string(file)?; - let text = replace_placeholders(text, variables); +impl AsRef> for MenuItemPlaceholders { + fn as_ref(&self) -> &HashMap { + &self.placeholders + } +} - let menu_inst: MenuInstSchema = serde_json::from_str(&text)?; +impl AsRef> for BaseMenuItemPlaceholders { + fn as_ref(&self) -> &HashMap { + &self.placeholders + } +} - Ok(menu_inst) +/// Replace placeholders in a string with values from a hashmap +/// This only replaces placeholders in the form of {{ key }} (note: while this looks like a Jinja template, it is not). +fn replace_placeholders(mut text: String, replacements: &HashMap) -> String { + for (key, value) in replacements { + let placeholder = format!("{{{{ {key} }}}}"); + text = text.replace(&placeholder, value); + } + text } #[cfg(test)] mod test { use std::path::Path; - use crate::render::render; - - #[test] - fn test_render_gnuradio() { - let test_data = crate::test::test_data(); - let schema_path = test_data.join("gnuradio/gnuradio-grc.json"); - - let placeholders = crate::render::placeholders( - Path::new("/home/base_prefix"), - Path::new("/home/prefix"), - &rattler_conda_types::Platform::Linux64, - ); - - let schema = render(&schema_path, &placeholders).unwrap(); - insta::assert_debug_snapshot!(schema); - } + // use crate::render::render; + + // #[test] + // fn test_render_gnuradio() { + // let test_data = crate::test::test_data(); + // let schema_path = test_data.join("gnuradio/gnuradio-grc.json"); + // + // let placeholders = crate::render::placeholders( + // Path::new("/home/base_prefix"), + // Path::new("/home/prefix"), + // &rattler_conda_types::Platform::Linux64, + // ); + // + // let schema = render(&schema_path, &placeholders).unwrap(); + // insta::assert_debug_snapshot!(schema); + // } } diff --git a/crates/rattler_menuinst/src/schema.rs b/crates/rattler_menuinst/src/schema.rs index 3e51a19f7..909fbf567 100644 --- a/crates/rattler_menuinst/src/schema.rs +++ b/crates/rattler_menuinst/src/schema.rs @@ -2,6 +2,8 @@ use std::collections::HashMap; use serde::{Deserialize, Serialize}; +use crate::render::{BaseMenuItemPlaceholders, PlaceholderString}; + #[derive(Serialize, Deserialize, Debug)] #[serde(deny_unknown_fields)] pub struct MenuItemNameDict { @@ -35,17 +37,21 @@ pub struct Platform { #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(untagged)] pub enum NameField { - Simple(String), + Simple(PlaceholderString), Complex(NameComplex), } impl NameField { - pub fn resolve(&self, env: Environment) -> &str { + pub fn resolve(&self, env: Environment, placeholders: &BaseMenuItemPlaceholders) -> String { match self { - NameField::Simple(name) => name, + NameField::Simple(name) => name.resolve(placeholders), NameField::Complex(complex_name) => match env { - Environment::Base => &complex_name.target_environment_is_base, - Environment::NotBase => &complex_name.target_environment_is_not_base, + Environment::Base => complex_name + .target_environment_is_base + .resolve(placeholders), + Environment::NotBase => complex_name + .target_environment_is_not_base + .resolve(placeholders), }, } } @@ -53,8 +59,8 @@ impl NameField { #[derive(Serialize, Deserialize, Debug, Clone)] pub struct NameComplex { - pub target_environment_is_base: String, - pub target_environment_is_not_base: String, + pub target_environment_is_base: PlaceholderString, + pub target_environment_is_not_base: PlaceholderString, } pub enum Environment { @@ -230,7 +236,11 @@ impl MenuItemCommand { .description .unwrap_or_else(|| self.description.clone()), command: platform.command.unwrap_or_else(|| self.command.clone()), - icon: platform.icon.as_ref().or_else(|| self.icon.as_ref()).cloned(), + icon: platform + .icon + .as_ref() + .or_else(|| self.icon.as_ref()) + .cloned(), precommand: platform.precommand.or_else(|| self.precommand.clone()), precreate: platform.precreate.or_else(|| self.precreate.clone()), working_dir: platform.working_dir.or_else(|| self.working_dir.clone()), @@ -253,7 +263,10 @@ pub struct MenuInstSchema { #[cfg(test)] mod test { + use std::collections::HashMap; use std::path::{Path, PathBuf}; + use rattler_conda_types::Platform; + use crate::render::BaseMenuItemPlaceholders; pub(crate) fn test_data() -> PathBuf { Path::new(env!("CARGO_MANIFEST_DIR")).join("../../test-data/menuinst") @@ -296,6 +309,11 @@ mod test { let item = schema.menu_items[0].clone(); let macos_item = item.platforms.osx.clone().unwrap(); let command = item.command.merge(macos_item.base); + let placeholders = BaseMenuItemPlaceholders::new( + Path::new("base_prefix"), + Path::new("prefix"), + Platform::Linux64 + ); assert_eq!( command.name.resolve(super::Environment::Base), diff --git a/crates/rattler_menuinst/src/windows.rs b/crates/rattler_menuinst/src/windows.rs index 9f0c893b4..52d3c0b1f 100644 --- a/crates/rattler_menuinst/src/windows.rs +++ b/crates/rattler_menuinst/src/windows.rs @@ -1,35 +1,50 @@ -use std::collections::HashMap; -use std::fs::{self, File}; -use std::io::Write; -use std::path::{Path, PathBuf}; -use std::process::Command; +use std::path::Path; -mod knownfolders; -mod registry; +use crate::{ + schema::{MenuItemCommand, Windows}, + MenuInstError, MenuMode, +}; -struct Directories { - start_menu_location: PathBuf, - quick_launch_location: PathBuf, - desktop_location: PathBuf, -} - -impl Directories { - pub fn create() -> Directories { - let start_menu_location = dirs::start_menu_dir().unwrap(); - let quick_launch_location = dirs::quick_launch_dir().unwrap(); - let desktop_location = dirs::desktop_dir().unwrap(); - - Directories { - start_menu_location, - quick_launch_location, - desktop_location, - } - } -} +// mod knownfolders; +// mod registry; +// +// struct Directories { +// start_menu_location: PathBuf, +// quick_launch_location: PathBuf, +// desktop_location: PathBuf, +// } +// +// impl Directories { +// pub fn create() -> Directories { +// let start_menu_location = dirs::start_menu_dir().unwrap(); +// let quick_launch_location = dirs::quick_launch_dir().unwrap(); +// let desktop_location = dirs::desktop_dir().unwrap(); +// +// Directories { +// start_menu_location, +// quick_launch_location, +// desktop_location, +// } +// } +// } +// +// pub struct WindowsMenu { +// name: String, +// mode: String, +// prefix: PathBuf, +// base_prefix: PathBuf, +// } -pub struct WindowsMenu { - name: String, - mode: String, - prefix: PathBuf, - base_prefix: PathBuf, +pub(crate) fn install_menu_item( + prefix: &Path, + windows_item: Windows, + command: MenuItemCommand, + menu_mode: MenuMode, +) -> Result<(), MenuInstError> { + // let bundle_name = macos_item.cf_bundle_name.as_ref().unwrap(); + // let directories = Directories::new(menu_mode, bundle_name); + // println!("Installing menu item for {bundle_name}"); + // let menu = crate::macos::MacOSMenu::new(prefix, macos_item, command, + // directories); menu.install() + Ok(()) } From 1bfeccfdb0d8d137cae5c2c35489158f7a31d72a Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Sat, 9 Nov 2024 23:21:55 +0100 Subject: [PATCH 013/132] some fixes --- crates/rattler_menuinst/src/lib.rs | 5 +-- crates/rattler_menuinst/src/linux.rs | 2 +- crates/rattler_menuinst/src/macos.rs | 56 +++++++++++++++++++++++----- 3 files changed, 49 insertions(+), 14 deletions(-) diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index cbc4ede71..9d1b3b877 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -97,14 +97,13 @@ pub mod test { fn test_install_menu_item() { println!("Running test_install_menu_item"); let test_data = crate::test::test_data(); - let schema_path = test_data.join("mne_menu/menu/menu.json"); + let schema_path = test_data.join("/Users/wolfv/Programs/rattler/.prefix/Menu/napari-menu.json"); let prefix = schema_path.parent().unwrap().parent().unwrap(); let prefix = std::fs::canonicalize(prefix).unwrap(); println!("prefix: {:?}", prefix); - let base_prefix = PathBuf::from("/Users/jaidevd/miniconda3"); let platform = Platform::OsxArm64; - install_menuitems(&schema_path, &prefix, &base_prefix, platform).unwrap(); + install_menuitems(&schema_path, &prefix, &prefix, &platform).unwrap(); } } diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index e2d23071e..f3df6a7c5 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -20,7 +20,7 @@ use std::{fs::File, path::PathBuf}; use rattler_conda_types::Platform; use crate::{ - schema::{MenuItemCommand, Linux}, + schema::{Linux, MenuItemCommand}, MenuInstError, MenuMode, }; diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index 840c2e890..ee263e27f 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -1,4 +1,5 @@ use std::{ + collections::HashMap, io::{BufWriter, Write}, os::unix::fs::PermissionsExt, path::{Path, PathBuf}, @@ -99,7 +100,39 @@ impl MacOSMenu { self.item.cf_bundle_identifier.is_some() || self.item.cf_bundle_document_types.is_some() } + pub fn precreate(&self) -> Result<(), MenuInstError> { + for (src, dest) in self + .item + .link_in_bundle + .as_ref() + .unwrap_or(&HashMap::new()) + .iter() + { + println!("MenuInst: linking {} to {}", src, dest); + let rendered_dest = self.directories.location.join(dest); + if !rendered_dest.starts_with(&self.directories.location) { + return Err(MenuInstError::InstallError(format!( + "'link_in_bundle' destinations MUST be created inside the .app bundle ({}), but it points to '{}'.", + self.directories.location.display(), + rendered_dest.display() + ))); + } + + if let Some(parent) = rendered_dest.parent() { + println!("Parent: {}", rendered_dest.display()); + fs::create_dir_all(parent)?; + } + println!("Dest: {}", rendered_dest.display()); + assert!(PathBuf::from(src).exists(), "Source file does not exist"); + + fs_err::os::unix::fs::symlink(src, &rendered_dest)?; + println!("MenuInst: link finished {} to {}", src, rendered_dest.display()); + } + Ok(()) + } + pub fn install_icon(&self) -> Result<(), MenuInstError> { + println!("Installing icon"); if let Some(icon) = self.command.icon.as_ref() { let icon = PathBuf::from(icon); let icon_name = icon.file_name().expect("Failed to get icon name"); @@ -139,8 +172,9 @@ impl MacOSMenu { fn write_plist_info(&self) -> Result<(), MenuInstError> { let name = self.name.clone(); + println!("Name: {}", name); let slugname = slugify(&name); - + println!("Slugname: {}", slugname); let shortname = if slugname.len() > 16 { // let hashed = format!("{:x}", Sha256::digest(slugname.as_bytes())); let hashed = "123456"; @@ -318,8 +352,7 @@ impl MacOSMenu { let mut entitlements = plist::Dictionary::new(); if let Some(entitlements_list) = &self.item.entitlements { for e in entitlements_list { - let parts: Vec<&str> = e.split('=').collect(); - entitlements.insert(parts[0].to_string(), Value::String(parts[1].to_string())); + entitlements.insert(e.to_string(), Value::Boolean(true)); } } else { return Ok(()); @@ -333,7 +366,7 @@ impl MacOSMenu { plist::to_writer_xml(writer, &entitlements)?; // sign the .app directory with the entitlements - let _codesign = std::process::Command::new("codesign") + let _codesign = Command::new("/usr/bin/codesign") .arg("--verbose") .arg("--sign") .arg("-") @@ -420,8 +453,10 @@ impl MacOSMenu { } fn write_script(&self, script_path: Option) -> Result { - let script_path = - script_path.unwrap_or_else(|| self.default_launcher_path().with_extension("script")); + let script_path = script_path.unwrap_or_else(|| { + PathBuf::from(format!("{}-script", self.default_launcher_path().to_string_lossy())) + }); + let mut file = File::create(&script_path)?; file.write_all(self.command().as_bytes())?; fs::set_permissions(&script_path, std::fs::Permissions::from_mode(0o755))?; @@ -541,6 +576,7 @@ impl MacOSMenu { pub fn install(&self) -> Result<(), MenuInstError> { self.directories .create_directories(self.needs_appkit_launcher())?; + self.precreate()?; self.install_icon()?; self.write_pkg_info()?; self.write_plist_info()?; @@ -549,14 +585,14 @@ impl MacOSMenu { self.write_script(None)?; self.write_event_handler(None)?; self.maybe_register_with_launchservices(true)?; - + self.sign_with_entitlements()?; Ok(()) } pub fn remove(&self) -> Result, MenuInstError> { println!("Removing {}", self.directories.location.display()); self.maybe_register_with_launchservices(false)?; - fs::remove_dir_all(&self.directories.location).unwrap_or_else(|e| { + fs_err::remove_dir_all(&self.directories.location).unwrap_or_else(|e| { println!("Failed to remove directory: {e}. Ignoring error."); }); Ok(vec![self.directories.location.clone()]) @@ -568,8 +604,8 @@ pub(crate) fn install_menu_item( command: MenuItemCommand, menu_mode: MenuMode, ) -> Result<(), MenuInstError> { - let bundle_name = macos_item.cf_bundle_name.as_ref().unwrap(); - let directories = Directories::new(menu_mode, bundle_name); + let bundle_name = format!("{}.app", macos_item.cf_bundle_name.as_ref().unwrap()); + let directories = Directories::new(menu_mode, &bundle_name); println!("Installing menu item for {bundle_name}"); let menu = MacOSMenu::new(prefix, macos_item, command, directories); menu.install() From 4046c32c6fd04083abc265cf5698a2f34631d238 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Sun, 10 Nov 2024 07:59:12 +0100 Subject: [PATCH 014/132] .. --- crates/rattler_menuinst/src/lib.rs | 7 +++++-- crates/rattler_menuinst/src/macos.rs | 11 +++++++---- crates/rattler_menuinst/src/render.rs | 3 --- crates/rattler_menuinst/src/schema.rs | 3 +-- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index 9d1b3b877..0094ec0b3 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -62,7 +62,7 @@ pub fn install_menuitems( #[cfg(target_os = "macos")] if let Some(macos_item) = item.platforms.osx { let command = item.command.merge(macos_item.base); - macos::install_menu_item(prefix, macos_item.specific, command, MenuMode::System)?; + macos::install_menu_item(prefix, macos_item.specific, command, &placeholders, MenuMode::System)?; } } else if platform.is_windows() { #[cfg(target_os = "windows")] @@ -95,6 +95,9 @@ pub mod test { #[test] fn test_install_menu_item() { + if std::env::var("INSTALL_MENU_ITEM").is_err() { + return; + } println!("Running test_install_menu_item"); let test_data = crate::test::test_data(); let schema_path = test_data.join("/Users/wolfv/Programs/rattler/.prefix/Menu/napari-menu.json"); @@ -104,6 +107,6 @@ pub mod test { println!("prefix: {:?}", prefix); let platform = Platform::OsxArm64; - install_menuitems(&schema_path, &prefix, &prefix, &platform).unwrap(); + install_menuitems(&schema_path, &prefix, &prefix, platform).unwrap(); } } diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index ee263e27f..7b8e68004 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -11,8 +11,7 @@ use fs_err::File; use plist::Value; use crate::{ - schema::{MacOS, MenuItemCommand}, - slugify, utils, MenuInstError, MenuMode, + render::BaseMenuItemPlaceholders, schema::{MacOS, MenuItemCommand}, slugify, utils, MenuInstError, MenuMode }; pub struct MacOSMenu { @@ -74,11 +73,12 @@ impl MacOSMenu { item: MacOS, command: MenuItemCommand, directories: Directories, + placeholders: &BaseMenuItemPlaceholders, ) -> Self { Self { name: command .name - .resolve(crate::schema::Environment::Base) + .resolve(crate::schema::Environment::Base, placeholders) .to_string(), prefix: prefix.to_path_buf(), item, @@ -600,14 +600,17 @@ impl MacOSMenu { } pub(crate) fn install_menu_item( + prefix: &Path, macos_item: MacOS, command: MenuItemCommand, + placeholders: &BaseMenuItemPlaceholders, menu_mode: MenuMode, ) -> Result<(), MenuInstError> { let bundle_name = format!("{}.app", macos_item.cf_bundle_name.as_ref().unwrap()); let directories = Directories::new(menu_mode, &bundle_name); + println!("Installing menu item for {bundle_name}"); - let menu = MacOSMenu::new(prefix, macos_item, command, directories); + let menu = MacOSMenu::new(prefix, macos_item, command, directories, placeholders); menu.install() } diff --git a/crates/rattler_menuinst/src/render.rs b/crates/rattler_menuinst/src/render.rs index 9bbbce00f..c796ceaad 100644 --- a/crates/rattler_menuinst/src/render.rs +++ b/crates/rattler_menuinst/src/render.rs @@ -3,7 +3,6 @@ use rattler_conda_types::Platform; use std::{collections::HashMap, path::Path}; use serde::{Deserialize, Serialize}; -use crate::schema::MenuInstSchema; #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(transparent)] @@ -118,8 +117,6 @@ fn replace_placeholders(mut text: String, replacements: &HashMap #[cfg(test)] mod test { - use std::path::Path; - // use crate::render::render; // #[test] diff --git a/crates/rattler_menuinst/src/schema.rs b/crates/rattler_menuinst/src/schema.rs index 909fbf567..ad129f1f2 100644 --- a/crates/rattler_menuinst/src/schema.rs +++ b/crates/rattler_menuinst/src/schema.rs @@ -263,7 +263,6 @@ pub struct MenuInstSchema { #[cfg(test)] mod test { - use std::collections::HashMap; use std::path::{Path, PathBuf}; use rattler_conda_types::Platform; use crate::render::BaseMenuItemPlaceholders; @@ -316,7 +315,7 @@ mod test { ); assert_eq!( - command.name.resolve(super::Environment::Base), + command.name.resolve(super::Environment::Base, &placeholders), "Spyder 6 ({{ DISTRIBUTION_NAME }})" ); From 791a8f0f71e1558e9569fbd00e7b1168dfdea4b0 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Sun, 10 Nov 2024 08:34:10 +0100 Subject: [PATCH 015/132] more placeholders, remove macos old --- crates/rattler/src/install/driver.rs | 2 +- crates/rattler_menuinst/src/lib.rs | 11 +- crates/rattler_menuinst/src/macos.rs | 70 ++-- crates/rattler_menuinst/src/macos_old.rs | 393 ----------------------- crates/rattler_menuinst/src/render.rs | 28 +- crates/rattler_menuinst/src/schema.rs | 50 +-- 6 files changed, 100 insertions(+), 454 deletions(-) delete mode 100644 crates/rattler_menuinst/src/macos_old.rs diff --git a/crates/rattler/src/install/driver.rs b/crates/rattler/src/install/driver.rs index 7b6cbea81..74351e36f 100644 --- a/crates/rattler/src/install/driver.rs +++ b/crates/rattler/src/install/driver.rs @@ -231,7 +231,7 @@ impl InstallDriver { &file, target_prefix, target_prefix, - &Platform::current(), + Platform::current(), ) .unwrap_or_else(|e| { tracing::warn!("Failed to install menu item: {} (ignored)", e); diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index 0094ec0b3..a2a5eee78 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -62,7 +62,13 @@ pub fn install_menuitems( #[cfg(target_os = "macos")] if let Some(macos_item) = item.platforms.osx { let command = item.command.merge(macos_item.base); - macos::install_menu_item(prefix, macos_item.specific, command, &placeholders, MenuMode::System)?; + macos::install_menu_item( + prefix, + macos_item.specific, + command, + &placeholders, + MenuMode::System, + )?; } } else if platform.is_windows() { #[cfg(target_os = "windows")] @@ -100,7 +106,8 @@ pub mod test { } println!("Running test_install_menu_item"); let test_data = crate::test::test_data(); - let schema_path = test_data.join("/Users/wolfv/Programs/rattler/.prefix/Menu/napari-menu.json"); + let schema_path = + test_data.join("/Users/wolfv/Programs/rattler/.prefix/Menu/napari-menu.json"); let prefix = schema_path.parent().unwrap().parent().unwrap(); let prefix = std::fs::canonicalize(prefix).unwrap(); diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index 7b8e68004..b739fdda9 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -11,7 +11,9 @@ use fs_err::File; use plist::Value; use crate::{ - render::BaseMenuItemPlaceholders, schema::{MacOS, MenuItemCommand}, slugify, utils, MenuInstError, MenuMode + render::{resolve, BaseMenuItemPlaceholders, MenuItemPlaceholders}, + schema::{MacOS, MenuItemCommand}, + slugify, utils, MenuInstError, MenuMode, }; pub struct MacOSMenu { @@ -20,6 +22,7 @@ pub struct MacOSMenu { item: MacOS, command: MenuItemCommand, directories: Directories, + placeholders: MenuItemPlaceholders, } pub struct Directories { @@ -72,18 +75,27 @@ impl MacOSMenu { prefix: &Path, item: MacOS, command: MenuItemCommand, - directories: Directories, + menu_mode: MenuMode, placeholders: &BaseMenuItemPlaceholders, ) -> Self { + + let name = command + .name + .resolve(crate::schema::Environment::Base, placeholders) + .to_string(); + + let bundle_name = format!("{}.app", name); + let directories = Directories::new(menu_mode, &bundle_name); + println!("Installing menu item for {bundle_name}"); + + let refined_placeholders = placeholders.refine(&directories.location); Self { - name: command - .name - .resolve(crate::schema::Environment::Base, placeholders) - .to_string(), + name, prefix: prefix.to_path_buf(), item, command, directories, + placeholders: refined_placeholders, } } @@ -126,7 +138,11 @@ impl MacOSMenu { assert!(PathBuf::from(src).exists(), "Source file does not exist"); fs_err::os::unix::fs::symlink(src, &rendered_dest)?; - println!("MenuInst: link finished {} to {}", src, rendered_dest.display()); + println!( + "MenuInst: link finished {} to {}", + src, + rendered_dest.display() + ); } Ok(()) } @@ -134,7 +150,7 @@ impl MacOSMenu { pub fn install_icon(&self) -> Result<(), MenuInstError> { println!("Installing icon"); if let Some(icon) = self.command.icon.as_ref() { - let icon = PathBuf::from(icon); + let icon = PathBuf::from(icon.resolve(&self.placeholders)); let icon_name = icon.file_name().expect("Failed to get icon name"); let dest = self.directories.resources().join(icon_name); fs::copy(&icon, &dest)?; @@ -172,9 +188,7 @@ impl MacOSMenu { fn write_plist_info(&self) -> Result<(), MenuInstError> { let name = self.name.clone(); - println!("Name: {}", name); let slugname = slugify(&name); - println!("Slugname: {}", slugname); let shortname = if slugname.len() > 16 { // let hashed = format!("{:x}", Sha256::digest(slugname.as_bytes())); let hashed = "123456"; @@ -184,9 +198,16 @@ impl MacOSMenu { }; let mut pl = plist::Dictionary::new(); - pl.insert("CFBundleName".into(), Value::String(shortname)); - pl.insert("CFBundleDisplayName".into(), Value::String(name)); + + let bundle_name = resolve(&self.item.cf_bundle_name, &self.placeholders, &shortname); + pl.insert("CFBundleName".into(), Value::String(bundle_name)); + + let display_name = resolve(&self.item.cf_bundle_display_name, &self.placeholders, &name); + pl.insert("CFBundleDisplayName".into(), Value::String(display_name)); + + // This one is _not_ part of the schema, so we just set it pl.insert("CFBundleExecutable".into(), Value::String(slugname.clone())); + pl.insert( "CFBundleGetInfoString".into(), Value::String(format!("{slugname}-1.0.0")), @@ -203,9 +224,15 @@ impl MacOSMenu { ); if let Some(icon) = &self.command.icon { - // TODO remove unwrap - let icon_name = Path::new(&icon).file_name().unwrap().to_str().unwrap(); - pl.insert("CFBundleIconFile".into(), Value::String(icon_name.into())); + let resolved_icon = icon.resolve(&self.placeholders); + if let Some(icon_name) = Path::new(&resolved_icon) + .file_name() + .and_then(|name| name.to_str()) + { + pl.insert("CFBundleIconFile".into(), Value::String(icon_name.into())); + } else { + tracing::warn!("Failed to extract icon name from path: {:?}", resolved_icon); + } } if self.needs_appkit_launcher() { @@ -454,9 +481,12 @@ impl MacOSMenu { fn write_script(&self, script_path: Option) -> Result { let script_path = script_path.unwrap_or_else(|| { - PathBuf::from(format!("{}-script", self.default_launcher_path().to_string_lossy())) + PathBuf::from(format!( + "{}-script", + self.default_launcher_path().to_string_lossy() + )) }); - + let mut file = File::create(&script_path)?; file.write_all(self.command().as_bytes())?; fs::set_permissions(&script_path, std::fs::Permissions::from_mode(0o755))?; @@ -606,11 +636,7 @@ pub(crate) fn install_menu_item( placeholders: &BaseMenuItemPlaceholders, menu_mode: MenuMode, ) -> Result<(), MenuInstError> { - let bundle_name = format!("{}.app", macos_item.cf_bundle_name.as_ref().unwrap()); - let directories = Directories::new(menu_mode, &bundle_name); - - println!("Installing menu item for {bundle_name}"); - let menu = MacOSMenu::new(prefix, macos_item, command, directories, placeholders); + let menu = MacOSMenu::new(prefix, macos_item, command, menu_mode, placeholders); menu.install() } diff --git a/crates/rattler_menuinst/src/macos_old.rs b/crates/rattler_menuinst/src/macos_old.rs deleted file mode 100644 index 39e94a38f..000000000 --- a/crates/rattler_menuinst/src/macos_old.rs +++ /dev/null @@ -1,393 +0,0 @@ -use std::collections::HashMap; -use std::fs::{self, File}; -use std::io::Write; -use std::os::unix::fs::PermissionsExt; -use std::path::{Path, PathBuf}; -use std::process::Command; - -use plist::Value; -use sha1::{Digest, Sha1}; -use tracing; - -use crate::utils::unix_lex::UnixLex; - -// use crate::utils::{UnixLex, logged_run}; -// use crate::base::{Menu, MenuItem, menuitem_defaults}; - -pub struct MacOSMenu { - name: String, - mode: String, - prefix: PathBuf, -} - -impl MacOSMenu { - pub fn new(name: String, mode: String, prefix: PathBuf) -> Self { - MacOSMenu { name, mode, prefix } - } - - pub fn create(&self) -> Vec { - self.paths() - } - - pub fn remove(&self) -> Vec { - self.paths() - } - - pub fn placeholders(&self) -> HashMap { - let mut placeholders = HashMap::new(); - placeholders.insert( - "SP_DIR".to_string(), - self.site_packages().to_str().unwrap().to_string(), - ); - placeholders.insert("ICON_EXT".to_string(), "icns".to_string()); - placeholders.insert( - "PYTHONAPP".to_string(), - self.prefix - .join("python.app/Contents/MacOS/python") - .to_str() - .unwrap() - .to_string(), - ); - placeholders - } - - fn paths(&self) -> Vec { - vec![] - } - - fn site_packages(&self) -> PathBuf { - // Implement site-packages directory detection logic here - self.prefix.join("lib/python3.x/site-packages") - } -} - -pub struct MacOSMenuItem { - menu: MacOSMenu, - metadata: HashMap, -} - -impl MacOSMenuItem { - pub fn new(menu: MacOSMenu, metadata: HashMap) -> Self { - MacOSMenuItem { menu, metadata } - } - - pub fn location(&self) -> PathBuf { - self.base_location() - .join("Applications") - .join(self.bundle_name()) - } - - fn bundle_name(&self) -> String { - return "foo.app".to_string(); - // format!("{}.app", self.render_key("name", &HashMap::new())) - } - - fn nested_location(&self) -> PathBuf { - self.location() - .join("Contents/Resources") - .join(self.bundle_name()) - } - - fn base_location(&self) -> PathBuf { - // if self.menu.mode == "user" { - // // PathBuf::from(shellexpand::tilde("~").to_string()) - // } else { - // PathBuf::from("/") - // } - PathBuf::from("/FOO") - } - - pub fn create(&self) -> Vec { - if self.location().exists() { - panic!("App already exists at {:?}. Please remove the existing shortcut before installing.", self.location()); - } - tracing::debug!("Creating {:?}", self.location()); - self.create_application_tree(); - // self.precreate(); - // self.copy_icon(); - // self.write_pkginfo(); - // self.write_plistinfo(); - // self.write_appkit_launcher(); - // self.write_launcher(); - // self.write_script(); - // self.write_event_handler(); - // self.maybe_register_with_launchservices(); - self.sign_with_entitlements(); - vec![self.location()] - } - - pub fn remove(&self) -> Vec { - tracing::debug!("Removing {:?}", self.location()); - self.maybe_register_with_launchservices(false); - fs::remove_dir_all(&self.location()).unwrap(); - vec![self.location()] - } - - fn create_application_tree(&self) -> Vec { - let mut paths = vec![ - self.location().join("Contents/Resources"), - self.location().join("Contents/MacOS"), - ]; - if self.needs_appkit_launcher() { - paths.push(self.nested_location().join("Contents/Resources")); - paths.push(self.nested_location().join("Contents/MacOS")); - } - for path in &paths { - fs::create_dir_all(path).unwrap(); - } - paths - } - - fn copy_icon(&self) { - if let Some(icon) = self.render_key("icon", &HashMap::new()) { - fs::copy( - &icon, - self.location() - .join("Contents/Resources") - .join(Path::new(&icon).file_name().unwrap()), - ) - .unwrap(); - if self.needs_appkit_launcher() { - fs::copy( - &icon, - self.nested_location() - .join("Contents/Resources") - .join(Path::new(&icon).file_name().unwrap()), - ) - .unwrap(); - } - } - } - - fn write_pkginfo(&self) { - let app_bundles = if self.needs_appkit_launcher() { - vec![self.location(), self.nested_location()] - } else { - vec![self.location()] - }; - for app in app_bundles { - let mut file = File::create(app.join("Contents/PkgInfo")).unwrap(); - write!(file, "APPL{}", &self.menu.name.to_lowercase()[..8]).unwrap(); - } - } - - fn render(self, value: &str) -> String { - // Implement rendering logic here - value.to_string() - - } - - fn write_plistinfo(&self) { - let name = self.menu.name.clone(); - // let slugname = self.render_key("name", &[("slug", &true.into())].iter().cloned().collect()); - let name = "foo".to_string(); - let slugname = "foo".to_string(); - let shortname = if slugname.len() > 16 { - let hashed = format!("{:x}", Sha1::digest(slugname.as_bytes())); - format!("{}{}", &slugname[..10], &hashed[..6]) - } else { - slugname.clone() - }; - - let mut pl = plist::Dictionary::new(); - pl.insert("CFBundleName".into(), Value::String(shortname)); - pl.insert("CFBundleDisplayName".into(), Value::String(name)); - pl.insert("CFBundleExecutable".into(), Value::String(slugname.clone())); - pl.insert("CFBundleGetInfoString".into(), Value::String(format!("{}-1.0.0", slugname))); - pl.insert("CFBundleIdentifier".into(), Value::String(format!("com.{}", slugname))); - pl.insert("CFBundlePackageType".into(), Value::String("APPL".into())); - pl.insert("CFBundleVersion".into(), Value::String("1.0.0".into())); - pl.insert("CFBundleShortVersionString".into(), Value::String("1.0.0".into())); - - let icon = self.render_key("icon", &HashMap::new()); - - // if let Some(icon) = self.render_key("icon", &HashMap::new()) { - // pl.insert("CFBundleIconFile".into(), Value::String(Path::new(&icon).file_name().unwrap().to_str().unwrap().into())); - // } - - if self.needs_appkit_launcher() { - plist::to_file_xml(self.nested_location().join("Contents/Info.plist"), &pl).unwrap(); - pl.insert("LSBackgroundOnly".into(), Value::Boolean(true)); - pl.insert("CFBundleIdentifier".into(), Value::String(format!("com.{}-appkit-launcher", slugname))); - } - - // Override defaults with user provided values - // for key in menuitem_defaults["platforms"]["osx"].keys() { - // if menuitem_defaults.contains_key(key) || key == "entitlements" || key == "link_in_bundle" { - // continue; - // } - // if let Some(value) = self.render_key(key, &HashMap::new()) { - // if key == "CFBundleVersion" { - // pl.insert("CFBundleShortVersionString".into(), Value::String(value.clone())); - // pl.insert("CFBundleGetInfoString".into(), Value::String(format!("{}-{}", slugname, value))); - // } - // pl.insert(key.into(), Value::String(value)); - // } - // } - - plist::to_file_xml(self.location().join("Contents/Info.plist"), &pl).unwrap(); - } - - fn command(&self) -> String { - let mut lines = vec!["#!/bin/sh".to_string()]; - if self.render_key("terminal", &HashMap::new()) == Some("true".to_string()) { - lines.extend_from_slice(&[ - r#"if [ "${__CFBundleIdentifier:-}" != "com.apple.Terminal" ]; then"#.to_string(), - r#" open -b com.apple.terminal "$0""#.to_string(), - r#" exit $?"#.to_string(), - "fi".to_string(), - ]); - } - - // if let Some(working_dir) = self.render_key("working_dir", &HashMap::new()) { - // fs::create_dir_all(shellexpand::full(&working_dir).unwrap().to_string()).unwrap(); - // lines.push(format!(r#"cd "{}""#, working_dir)); - // } - - if let Some(precommand) = self.render_key("precommand", &HashMap::new()) { - lines.push(precommand); - } - - if self.metadata.get("activate") == Some(&Value::Boolean(true)) { - let conda_exe = &self.menu.prefix.join("bin/conda"); - // let activate = if self.menu.is_micromamba(conda_exe) { "shell activate" } else { "shell.bash activate" }; - // lines.push(format!(r#"eval "$("{}" {} "{}")""#, conda_exe.display(), activate, self.menu.prefix.display())); - } - - // lines.push(UnixLex::quote_args(&self.render_key("command", &HashMap::new()).unwrap()).join(" ")); - - lines.join("\n") - } - - fn default_appkit_launcher_path(&self) -> PathBuf { - self.location() - .join("Contents/MacOS") - .join(self.bundle_name()) - } - - fn default_launcher_path(&self, suffix: Option<&str>) -> PathBuf { - let suffix = suffix.unwrap_or(""); - let name = self.render_key("name", &HashMap::new()).unwrap(); - if self.needs_appkit_launcher() { - return self - .nested_location() - .join("Contents/MacOS") - .join(format!("{name}{suffix}")); - } - self.location() - .join("Contents/MacOS") - .join(format!("{name}{suffix}")) - } - - fn write_appkit_launcher(&self, launcher_path: Option<&Path>) -> PathBuf { - let launcher_path = launcher_path - .map(PathBuf::from) - .unwrap_or_else(|| self.default_appkit_launcher_path()); - // fs::copy(self.find_appkit_launcher(), launcher_path).unwrap(); - // fs::set_permissions(launcher_path, fs::Permissions::from_mode(0o755)).unwrap(); - launcher_path.to_path_buf() - } - - fn write_launcher(&self, launcher_path: Option<&Path>) -> PathBuf { - let launcher_path = launcher_path - .map(PathBuf::from) - .unwrap_or_else(|| self.default_launcher_path(None)); - // fs::copy(self.find_launcher(), launcher_path).unwrap(); - // fs::set_permissions(launcher_path, fs::Permissions::from_mode(0o755)).unwrap(); - launcher_path.to_path_buf() - } - - fn write_script(&self, script_path: Option<&Path>) -> PathBuf { - let script_path = script_path - .map(PathBuf::from) - .unwrap_or_else(|| self.default_launcher_path(None).with_extension("script")); - fs::write(&script_path, self.command()).unwrap(); - fs::set_permissions(&script_path, fs::Permissions::from_mode(0o755)).unwrap(); - script_path - } - - fn write_event_handler(&self, script_path: Option<&Path>) -> Option { - if !self.needs_appkit_launcher() { - return None; - } - let event_handler_logic = self.render_key("event_handler", &HashMap::new())?; - let script_path = script_path - .map(PathBuf::from) - .unwrap_or_else(|| self.location().join("Contents/Resources/handle-event")); - fs::write( - &script_path, - format!("#!/bin/bash\n{}\n", event_handler_logic), - ) - .unwrap(); - fs::set_permissions(&script_path, fs::Permissions::from_mode(0o755)).unwrap(); - Some(script_path) - } - - fn maybe_register_with_launchservices(&self, register: bool) { - if !self.needs_appkit_launcher() { - return; - } - if register { - lsregister(&["-R", self.location().to_str().unwrap()]); - } else { - lsregister(&["-R", "-u", "-all", self.location().to_str().unwrap()]); - } - } - - fn sign_with_entitlements(&self) { - let entitlements = Vec::::new(); - if entitlements.is_empty() { - return; - } - - let mut plist = plist::Dictionary::new(); - for key in entitlements { - plist.insert(key, Value::Boolean(true)); - } - - let slugname = self.render_key("name", &[("slug", &true.into())].iter().cloned().collect()); - let entitlements_path = self.location().join("Contents/Entitlements.plist"); - plist::to_file_xml(&entitlements_path, &plist).unwrap(); - - // logged_run( - // &[ - // "/usr/bin/codesign", - // "--verbose", - // "--sign", - // "-", - // "--prefix", - // &format!("com.{}", slugname), - // "--options", - // "runtime", - // "--force", - // "--deep", - // "--entitlements", - // entitlements_path.to_str().unwrap(), - // self.location().to_str().unwrap(), - // ], - // true, - // ).unwrap(); - } - } - - fn needs_appkit_launcher(&self) -> bool { - self.metadata.get("event_handler").is_some() - } - - fn render_key(&self, key: &str, extra: &HashMap<&str, Value>) -> Option { - // Implement rendering logic here - self.metadata - .get(key) - .and_then(|v| v.as_string().map(|s| s.to_string())) - } - - // Implement other helper methods... -} - -fn lsregister(args: &[&str]) { - let exe = "/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister"; - Command::new(exe) - .args(args) - .output() - .expect("Failed to execute lsregister"); -} diff --git a/crates/rattler_menuinst/src/render.rs b/crates/rattler_menuinst/src/render.rs index c796ceaad..680c187f4 100644 --- a/crates/rattler_menuinst/src/render.rs +++ b/crates/rattler_menuinst/src/render.rs @@ -1,10 +1,10 @@ //! This should take a `serde_json` file, render it with all variables and then load it as a `MenuInst` struct use rattler_conda_types::Platform; -use std::{collections::HashMap, path::Path}; use serde::{Deserialize, Serialize}; +use std::{collections::HashMap, path::Path}; -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize, Hash, PartialEq, Eq)] #[serde(transparent)] pub struct PlaceholderString(pub String); @@ -14,14 +14,19 @@ impl PlaceholderString { } } +pub fn resolve(input: &Option, placeholders: impl AsRef>, default: &str) -> String { + match input { + Some(s) => s.resolve(placeholders), + None => default.to_string(), + } +} + pub struct BaseMenuItemPlaceholders { placeholders: HashMap, } impl BaseMenuItemPlaceholders { - pub fn new(base_prefix: &Path, - prefix: &Path, - platform: Platform) -> Self { + pub fn new(base_prefix: &Path, prefix: &Path, platform: Platform) -> Self { let dist_name = |p: &Path| { p.parent() .and_then(|p| p.file_name().map(|s| s.to_string_lossy().to_string())) @@ -75,17 +80,16 @@ impl BaseMenuItemPlaceholders { vars.insert("DISTRIBUTION_NAME".to_string(), dist_name(prefix)); vars.insert("ENV_NAME".to_string(), dist_name(prefix)); - BaseMenuItemPlaceholders { - placeholders: vars, - } + BaseMenuItemPlaceholders { placeholders: vars } } pub fn refine(&self, menu_item_location: &Path) -> MenuItemPlaceholders { let mut vars = self.placeholders.clone(); - vars.insert("MENU_ITEM_LOCATION".to_string(), menu_item_location.to_string_lossy().to_string()); - MenuItemPlaceholders { - placeholders: vars, - } + vars.insert( + "MENU_ITEM_LOCATION".to_string(), + menu_item_location.to_string_lossy().to_string(), + ); + MenuItemPlaceholders { placeholders: vars } } } diff --git a/crates/rattler_menuinst/src/schema.rs b/crates/rattler_menuinst/src/schema.rs index ad129f1f2..22a062801 100644 --- a/crates/rattler_menuinst/src/schema.rs +++ b/crates/rattler_menuinst/src/schema.rs @@ -16,7 +16,7 @@ pub struct MenuItemNameDict { pub struct BasePlatformSpecific { pub name: Option, pub description: Option, - pub icon: Option, + pub icon: Option, pub command: Option>, pub working_dir: Option, pub precommand: Option, @@ -117,56 +117,56 @@ pub struct Linux { #[serde(deny_unknown_fields)] pub struct CFBundleURLTypesModel { #[serde(rename = "CFBundleTypeRole")] - cf_bundle_type_role: Option, + cf_bundle_type_role: Option, #[serde(rename = "CFBundleURLSchemes")] - cf_bundle_url_schemes: Vec, + cf_bundle_url_schemes: Vec, #[serde(rename = "CFBundleURLName")] - cf_bundle_url_name: Option, + cf_bundle_url_name: Option, #[serde(rename = "CFBundleURLIconFile")] - cf_bundle_url_icon_file: Option, + cf_bundle_url_icon_file: Option, } #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(deny_unknown_fields)] pub struct CFBundleDocumentTypesModel { #[serde(rename = "CFBundleTypeIconFile")] - cf_bundle_type_icon_file: Option, + cf_bundle_type_icon_file: Option, #[serde(rename = "CFBundleTypeName")] - cf_bundle_type_name: String, + cf_bundle_type_name: PlaceholderString, #[serde(rename = "CFBundleTypeRole")] - cf_bundle_type_role: Option, + cf_bundle_type_role: Option, #[serde(rename = "LSItemContentTypes")] - ls_item_content_types: Vec, + ls_item_content_types: Vec, #[serde(rename = "LSHandlerRank")] - ls_handler_rank: String, + ls_handler_rank: PlaceholderString, } #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(deny_unknown_fields)] pub struct UTTypeDeclarationModel { #[serde(rename = "UTTypeConformsTo")] - ut_type_conforms_to: Vec, + ut_type_conforms_to: Vec, #[serde(rename = "UTTypeDescription")] - ut_type_description: Option, + ut_type_description: Option, #[serde(rename = "UTTypeIconFile")] - ut_type_icon_file: Option, + ut_type_icon_file: Option, #[serde(rename = "UTTypeIdentifier")] - ut_type_identifier: String, + ut_type_identifier: PlaceholderString, #[serde(rename = "UTTypeReferenceURL")] - ut_type_reference_url: Option, + ut_type_reference_url: Option, #[serde(rename = "UTTypeTagSpecification")] - ut_type_tag_specification: HashMap>, + ut_type_tag_specification: HashMap>, } #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(deny_unknown_fields)] pub struct MacOS { #[serde(rename = "CFBundleDisplayName")] - pub cf_bundle_display_name: Option, + pub cf_bundle_display_name: Option, #[serde(rename = "CFBundleIdentifier")] - pub cf_bundle_identifier: Option, + pub cf_bundle_identifier: Option, #[serde(rename = "CFBundleName")] - pub cf_bundle_name: Option, + pub cf_bundle_name: Option, #[serde(rename = "CFBundleSpokenName")] pub cf_bundle_spoken_name: Option, #[serde(rename = "CFBundleVersion")] @@ -220,7 +220,7 @@ pub struct MenuItemCommand { pub name: NameField, pub description: String, pub command: Vec, - pub icon: Option, + pub icon: Option, pub precommand: Option, pub precreate: Option, pub working_dir: Option, @@ -263,9 +263,9 @@ pub struct MenuInstSchema { #[cfg(test)] mod test { - use std::path::{Path, PathBuf}; - use rattler_conda_types::Platform; use crate::render::BaseMenuItemPlaceholders; + use rattler_conda_types::Platform; + use std::path::{Path, PathBuf}; pub(crate) fn test_data() -> PathBuf { Path::new(env!("CARGO_MANIFEST_DIR")).join("../../test-data/menuinst") @@ -311,11 +311,13 @@ mod test { let placeholders = BaseMenuItemPlaceholders::new( Path::new("base_prefix"), Path::new("prefix"), - Platform::Linux64 + Platform::Linux64, ); assert_eq!( - command.name.resolve(super::Environment::Base, &placeholders), + command + .name + .resolve(super::Environment::Base, &placeholders), "Spyder 6 ({{ DISTRIBUTION_NAME }})" ); From 9f474e73cfe50b0ab8b3b5b3953d3aed448f76e5 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Sun, 10 Nov 2024 09:40:30 +0100 Subject: [PATCH 016/132] implement more for macos --- crates/rattler_menuinst/src/lib.rs | 6 ++--- crates/rattler_menuinst/src/macos.rs | 33 +++++++++++++++--------- crates/rattler_menuinst/src/render.rs | 7 ++++- crates/rattler_menuinst/src/schema.rs | 22 ++++++++-------- crates/rattler_menuinst/src/utils/mod.rs | 10 +++++-- 5 files changed, 49 insertions(+), 29 deletions(-) diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index a2a5eee78..b1c9e42f1 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -101,9 +101,9 @@ pub mod test { #[test] fn test_install_menu_item() { - if std::env::var("INSTALL_MENU_ITEM").is_err() { - return; - } + // if std::env::var("INSTALL_MENU_ITEM").is_err() { + // return; + // } println!("Running test_install_menu_item"); let test_data = crate::test::test_data(); let schema_path = diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index b739fdda9..a75880cc2 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -16,6 +16,7 @@ use crate::{ slugify, utils, MenuInstError, MenuMode, }; +#[derive(Debug)] pub struct MacOSMenu { name: String, prefix: PathBuf, @@ -25,6 +26,7 @@ pub struct MacOSMenu { placeholders: MenuItemPlaceholders, } +#[derive(Debug)] pub struct Directories { /// Path to the .app directory defining the menu item location: PathBuf, @@ -78,7 +80,6 @@ impl MacOSMenu { menu_mode: MenuMode, placeholders: &BaseMenuItemPlaceholders, ) -> Self { - let name = command .name .resolve(crate::schema::Environment::Base, placeholders) @@ -120,8 +121,10 @@ impl MacOSMenu { .unwrap_or(&HashMap::new()) .iter() { - println!("MenuInst: linking {} to {}", src, dest); - let rendered_dest = self.directories.location.join(dest); + let src = src.resolve(&self.placeholders); + let dest = dest.resolve(&self.placeholders); + println!("MenuInst: linking {src} to {dest}"); + let rendered_dest = self.directories.location.join(&dest); if !rendered_dest.starts_with(&self.directories.location) { return Err(MenuInstError::InstallError(format!( "'link_in_bundle' destinations MUST be created inside the .app bundle ({}), but it points to '{}'.", @@ -135,12 +138,11 @@ impl MacOSMenu { fs::create_dir_all(parent)?; } println!("Dest: {}", rendered_dest.display()); - assert!(PathBuf::from(src).exists(), "Source file does not exist"); + assert!(PathBuf::from(&src).exists(), "Source file does not exist"); - fs_err::os::unix::fs::symlink(src, &rendered_dest)?; + fs_err::os::unix::fs::symlink(&src, &rendered_dest)?; println!( - "MenuInst: link finished {} to {}", - src, + "MenuInst: link finished {src} to {}", rendered_dest.display() ); } @@ -423,13 +425,14 @@ impl MacOSMenu { ]); } - if let Some(working_dir) = &self.command.working_dir { - fs::create_dir_all(working_dir).expect("Failed to create working directory"); - lines.push(format!(r#"cd "{working_dir}""#)); + if let Some(working_dir) = self.command.working_dir.as_ref() { + let working_dir = working_dir.resolve(&self.placeholders); + fs::create_dir_all(&working_dir).expect("Failed to create working directory"); + lines.push(format!("cd \"{working_dir}\"")); } if let Some(precommand) = &self.command.precommand { - lines.push(precommand.clone()); + lines.push(precommand.resolve(&self.placeholders)); } // if self.command.activate { @@ -444,7 +447,12 @@ impl MacOSMenu { // lines.push(format!(r#"eval "$("{}" {} "{}")""#, conda_exe, activate, // prefix)); } - lines.push(utils::quote_args(&self.command.command).join(" ")); + let command = self + .command + .command + .iter() + .map(|s| s.resolve(&self.placeholders)); + lines.push(utils::quote_args(command).join(" ")); lines.join("\n") } @@ -637,6 +645,7 @@ pub(crate) fn install_menu_item( menu_mode: MenuMode, ) -> Result<(), MenuInstError> { let menu = MacOSMenu::new(prefix, macos_item, command, menu_mode, placeholders); + println!("Menu: {:?}", menu); menu.install() } diff --git a/crates/rattler_menuinst/src/render.rs b/crates/rattler_menuinst/src/render.rs index 680c187f4..ac84220de 100644 --- a/crates/rattler_menuinst/src/render.rs +++ b/crates/rattler_menuinst/src/render.rs @@ -14,7 +14,11 @@ impl PlaceholderString { } } -pub fn resolve(input: &Option, placeholders: impl AsRef>, default: &str) -> String { +pub fn resolve( + input: &Option, + placeholders: impl AsRef>, + default: &str, +) -> String { match input { Some(s) => s.resolve(placeholders), None => default.to_string(), @@ -93,6 +97,7 @@ impl BaseMenuItemPlaceholders { } } +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] pub struct MenuItemPlaceholders { placeholders: HashMap, } diff --git a/crates/rattler_menuinst/src/schema.rs b/crates/rattler_menuinst/src/schema.rs index 22a062801..6fcaf00f4 100644 --- a/crates/rattler_menuinst/src/schema.rs +++ b/crates/rattler_menuinst/src/schema.rs @@ -15,12 +15,12 @@ pub struct MenuItemNameDict { #[serde(deny_unknown_fields)] pub struct BasePlatformSpecific { pub name: Option, - pub description: Option, + pub description: Option, pub icon: Option, - pub command: Option>, - pub working_dir: Option, - pub precommand: Option, - pub precreate: Option, + pub command: Option>, + pub working_dir: Option, + pub precommand: Option, + pub precreate: Option, pub activate: Option, pub terminal: Option, } @@ -194,7 +194,7 @@ pub struct MacOS { #[serde(rename = "UTImportedTypeDeclarations")] pub ut_imported_type_declarations: Option>, pub entitlements: Option>, - pub link_in_bundle: Option>, + pub link_in_bundle: Option>, pub event_handler: Option, } @@ -218,12 +218,12 @@ pub struct MenuItem { #[serde(deny_unknown_fields)] pub struct MenuItemCommand { pub name: NameField, - pub description: String, - pub command: Vec, + pub description: PlaceholderString, + pub command: Vec, pub icon: Option, - pub precommand: Option, - pub precreate: Option, - pub working_dir: Option, + pub precommand: Option, + pub precreate: Option, + pub working_dir: Option, pub activate: Option, pub terminal: Option, } diff --git a/crates/rattler_menuinst/src/utils/mod.rs b/crates/rattler_menuinst/src/utils/mod.rs index 5f4c51780..8f1fee72c 100644 --- a/crates/rattler_menuinst/src/utils/mod.rs +++ b/crates/rattler_menuinst/src/utils/mod.rs @@ -6,6 +6,12 @@ pub fn menuinst_data_paths(prefix: &Path) -> Vec { vec![prefix.join("share/menuinst")] } -pub fn quote_args(args: &[String]) -> Vec { - args.iter().map(|arg| format!(r#""{arg}""#)).collect() +pub fn quote_args(args: I) -> Vec +where + I: IntoIterator, + S: AsRef, +{ + args.into_iter() + .map(|arg| format!(r#""{}""#, arg.as_ref())) + .collect() } From ef53370ff51e7e236b6134426752f329ff6efa9b Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Sun, 10 Nov 2024 10:44:57 +0100 Subject: [PATCH 017/132] make linux compile as well --- crates/rattler_menuinst/Cargo.toml | 1 + crates/rattler_menuinst/src/lib.rs | 9 ++-- crates/rattler_menuinst/src/linux.rs | 78 ++++++++++++---------------- crates/rattler_menuinst/src/macos.rs | 29 +++++++---- 4 files changed, 59 insertions(+), 58 deletions(-) diff --git a/crates/rattler_menuinst/Cargo.toml b/crates/rattler_menuinst/Cargo.toml index d2ce68f16..5fcf19de4 100644 --- a/crates/rattler_menuinst/Cargo.toml +++ b/crates/rattler_menuinst/Cargo.toml @@ -18,6 +18,7 @@ shlex = { workspace = true } serde_json = { workspace = true } tracing = { workspace = true } rattler_conda_types = { path = "../rattler_conda_types", default-features = false } +rattler_shell = { path = "../rattler_shell", default-features = false } thiserror = { workspace = true } unicode-normalization = { workspace = true } regex = { workspace = true } diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index b1c9e42f1..5f9f4eceb 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -2,7 +2,6 @@ use std::path::Path; use rattler_conda_types::Platform; -#[cfg(target_os = "linux")] mod linux; #[cfg(target_os = "macos")] mod macos; @@ -53,10 +52,14 @@ pub fn install_menuitems( for item in menu_inst.menu_items { if platform.is_linux() { - #[cfg(target_os = "linux")] if let Some(linux_item) = item.platforms.linux { let command = item.command.merge(linux_item.base); - linux::install_menu_item(linux_item.specific, command, MenuMode::System)?; + linux::install_menu_item( + linux_item.specific, + command, + &placeholders, + MenuMode::System, + )?; } } else if platform.is_osx() { #[cfg(target_os = "macos")] diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index f3df6a7c5..7fa356759 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -19,6 +19,7 @@ use std::{fs::File, path::PathBuf}; use rattler_conda_types::Platform; +use crate::render::{BaseMenuItemPlaceholders, MenuItemPlaceholders}; use crate::{ schema::{Linux, MenuItemCommand}, MenuInstError, MenuMode, @@ -29,6 +30,7 @@ pub struct LinuxMenu { item: Linux, command: MenuItemCommand, directories: Directories, + placeholders: MenuItemPlaceholders, } pub struct Directories { @@ -71,15 +73,25 @@ impl Directories { } impl LinuxMenu { - fn new(item: Linux, command: MenuItemCommand, mode: MenuMode) -> Self { + fn new( + item: Linux, + command: MenuItemCommand, + placeholders: &BaseMenuItemPlaceholders, + mode: MenuMode, + ) -> Self { + let directories = Directories::new(mode); + // TODO unsure if this is the right value for MENU_ITEM_LOCATION + let refined_placeholders = placeholders.refine(&directories.system_menu_config_location); + LinuxMenu { name: command .name - .resolve(crate::schema::Environment::Base) + .resolve(crate::schema::Environment::Base, &placeholders) .to_string(), item, command, - directories: Directories::new(mode), + directories, + placeholders: refined_placeholders, } } @@ -160,7 +172,16 @@ impl LinuxMenu { writeln!(writer, "Type=Application")?; writeln!(writer, "Encoding=UTF-8")?; writeln!(writer, "Name={:?}", self.command.name)?; - writeln!(writer, "Exec={}", self.command.command.join(" "))?; + writeln!( + writer, + "Exec={}", + self.command + .command + .iter() + .map(|s| s.resolve(&self.placeholders)) + .collect::>() + .join(" ") + )?; writeln!( writer, "Terminal={}", @@ -168,14 +189,17 @@ impl LinuxMenu { )?; if let Some(icon) = &self.command.icon { + let icon = icon.resolve(&self.placeholders); writeln!(writer, "Icon={icon}")?; } - if !self.command.description.is_empty() { - writeln!(writer, "Comment={}", self.command.description)?; + let description = self.command.description.resolve(&self.placeholders); + if !description.is_empty() { + writeln!(writer, "Comment={}", description)?; } if let Some(working_dir) = &self.command.working_dir { + let working_dir = working_dir.resolve(&self.placeholders); writeln!(writer, "Path={working_dir}")?; } @@ -203,7 +227,7 @@ impl LinuxMenu { fn install(&self) -> Result<(), MenuInstError> { self.pre_create()?; - + self.create_desktop_entry()?; Ok(()) } @@ -215,9 +239,10 @@ impl LinuxMenu { pub fn install_menu_item( item: Linux, command: MenuItemCommand, + placeholders: &BaseMenuItemPlaceholders, menu_mode: MenuMode, ) -> Result<(), MenuInstError> { - let menu = LinuxMenu::new(item, command, menu_mode); + let menu = LinuxMenu::new(item, command, placeholders, menu_mode); menu.install()?; println!("{:?}", menu.location()); println!("{:?}", menu.directories.config_directory); @@ -334,42 +359,7 @@ pub fn install_menu_item( // let doc = // Element::parse(fs::read_to_string(&self.menu_config_location).unwrap(). // as_bytes()).unwrap(); doc.children.iter().any(|child| { -// if let XMLNode::Element(element) = child { -// if element.name == "Menu" { -// if let Some(name_element) = element.get_child("Name") { -// return name_element.get_text() == -// Some(Self::render(&self.name, false)); } -// } -// } -// false -// }) -// } - -// fn add_this_menu(&self) { -// debug!("Editing {:?} to add {} config", self.menu_config_location, -// Self::render(&self.name, false)); let mut doc = -// Element::parse(fs::read_to_string(&self.menu_config_location).unwrap(). -// as_bytes()).unwrap(); let mut menu_element = Element::new("Menu"); -// add_xml_child(&mut menu_element, "Name", Self::render(&self.name, -// false)); add_xml_child(&mut menu_element, "Directory", -// format!("{}.directory", Self::render(&self.name, true))); let mut -// inc_element = Element::new("Include"); add_xml_child(&mut -// inc_element, "Category", Self::render(&self.name, false)); -// menu_element.children.push(XMLNode::Element(inc_element)); -// doc.children.push(XMLNode::Element(menu_element)); -// self.write_menu_file(&doc); -// } - -// fn is_valid_menu_file(&self) -> bool { -// if let Ok(content) = fs::read_to_string(&self.menu_config_location) { -// if let Ok(doc) = Element::parse(content.as_bytes()) { -// return doc.name == "Menu"; -// } -// } -// false -// } - -// fn write_menu_file(&self, doc: &Element) { +// if let XMLNode::Element(element) { // debug!("Writing {:?}", self.menu_config_location); // indent_xml_tree(doc); // let mut file = File::create(&self.menu_config_location).unwrap(); diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index a75880cc2..98c7caf64 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -9,6 +9,11 @@ use std::{ use fs_err as fs; use fs_err::File; use plist::Value; +use rattler_conda_types::Platform; +use rattler_shell::{ + activation::{ActivationVariables, Activator}, + shell, +}; use crate::{ render::{resolve, BaseMenuItemPlaceholders, MenuItemPlaceholders}, @@ -435,17 +440,19 @@ impl MacOSMenu { lines.push(precommand.resolve(&self.placeholders)); } - // if self.command.activate { - // // Assuming these fields exist in your MacOS struct - // let conda_exe = &self.item.conda_exe; - // let prefix = &self.item.prefix; - // let activate = if self.is_micromamba(conda_exe) { - // "shell activate" - // } else { - // "shell.bash activate" - // }; - // lines.push(format!(r#"eval "$("{}" {} "{}")""#, conda_exe, activate, - // prefix)); } + // Run a cached activation + if self.command.activate.unwrap_or(false) { + // create a bash activation script and emit it into the script + let activator = + Activator::from_path(&self.prefix, shell::Bash, Platform::current()).unwrap(); + let activation_env = activator + .run_activation(ActivationVariables::default(), None) + .unwrap(); + + for (k, v) in activation_env { + lines.push(format!(r#"export {k}="{v}""#, k = k, v = v)); + } + } let command = self .command From 37b3f7051597368d77c296f774e1e91f39ecfec0 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Sun, 10 Nov 2024 10:52:16 +0100 Subject: [PATCH 018/132] linux --- crates/rattler_menuinst/src/linux.rs | 34 ++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index 7fa356759..acba07d31 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -163,6 +163,29 @@ impl LinuxMenu { // f.write("\n".join(lines)) // f.write("\n") + fn command(&self) -> String { + let mut parts = Vec::new(); + if let Some(pre_command) = &self.command.precommand { + parts.push(pre_command.resolve(&self.placeholders)); + } + + if self.command.activate.unwrap_or(false) { + // TODO implement activation here! + } + + let command = self + .command + .command + .iter() + .map(|s| s.resolve(&self.placeholders)) + .collect::>() + .join(" "); + + parts.push(command); + + return parts.join(" && "); + } + fn create_desktop_entry(&self) -> Result<(), MenuInstError> { let file = self.location(); let writer = File::create(file)?; @@ -172,16 +195,7 @@ impl LinuxMenu { writeln!(writer, "Type=Application")?; writeln!(writer, "Encoding=UTF-8")?; writeln!(writer, "Name={:?}", self.command.name)?; - writeln!( - writer, - "Exec={}", - self.command - .command - .iter() - .map(|s| s.resolve(&self.placeholders)) - .collect::>() - .join(" ") - )?; + writeln!(writer, "Exec={}", self.command())?; writeln!( writer, "Terminal={}", From ff23eede1face8d27362dd4069302f1a55ec5921 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Mon, 11 Nov 2024 10:37:31 +0100 Subject: [PATCH 019/132] improve and clean linux implementation --- crates/rattler_menuinst/src/lib.rs | 1 + crates/rattler_menuinst/src/linux.rs | 272 ++++----------------------- 2 files changed, 34 insertions(+), 239 deletions(-) diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index 5f9f4eceb..3800429dd 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -55,6 +55,7 @@ pub fn install_menuitems( if let Some(linux_item) = item.platforms.linux { let command = item.command.merge(linux_item.base); linux::install_menu_item( + prefix, linux_item.specific, command, &placeholders, diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index acba07d31..78b209855 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -1,23 +1,10 @@ -// use std::collections::HashMap; -// use std::env; -// use std::fs::{self, File}; use std::io::Write; -// use std::path::{Path, PathBuf}; -// use std::process::Command; - -// use chrono::Local; -// use log::{debug, warn}; -// use regex::Regex; -// use serde::{Deserialize, Serialize}; -// use tempfile::TempDir; -// use xmltree::{Element, XMLNode}; - -// // Assuming these are defined elsewhere -// use crate::utils::{UnixLex, add_xml_child, indent_xml_tree, logged_run, unlink}; -// use crate::base::{Menu, MenuItem, menuitem_defaults}; +use std::path::Path; use std::{fs::File, path::PathBuf}; use rattler_conda_types::Platform; +use rattler_shell::activation::{ActivationVariables, Activator}; +use rattler_shell::shell; use crate::render::{BaseMenuItemPlaceholders, MenuItemPlaceholders}; use crate::{ @@ -26,6 +13,7 @@ use crate::{ }; pub struct LinuxMenu { + prefix: PathBuf, name: String, item: Linux, command: MenuItemCommand, @@ -74,6 +62,7 @@ impl Directories { impl LinuxMenu { fn new( + prefix: &Path, item: Linux, command: MenuItemCommand, placeholders: &BaseMenuItemPlaceholders, @@ -84,6 +73,7 @@ impl LinuxMenu { let refined_placeholders = placeholders.refine(&directories.system_menu_config_location); LinuxMenu { + prefix: prefix.to_path_buf(), name: command .name .resolve(crate::schema::Environment::Base, &placeholders) @@ -108,69 +98,28 @@ impl LinuxMenu { return Ok(()); } Ok(()) - - // precreate_code = self.item.precreate.unwrap_or(sel.) - // if not precreate_code: - // return - - // with NamedTemporaryFile(delete=False, mode="w") as tmp: - // tmp.write(precreate_code) - // if precreate_code.startswith("#!"): - // os.chmod(tmp.name, 0o755) - // cmd = [tmp.name] - // else: - // cmd = ["bash", tmp.name] - // logged_run(cmd, check=True) - // os.unlink(tmp.name) } - // def _write_desktop_file(self): - // lines = [ - // "[Desktop Entry]", - // "Type=Application", - // "Encoding=UTF-8", - // f'Name={self.render_key("name")}', - // f"Exec={self._command()}", - // f'Terminal={str(self.render_key("terminal")).lower()}', - // ] - - // icon = self.render_key("icon") - // if icon: - // lines.append(f'Icon={self.render_key("icon")}') - - // description = self.render_key("description") - // if description: - // lines.append(f'Comment={self.render_key("description")}') - - // working_dir = self.render_key("working_dir") - // if working_dir: - // Path(working_dir).mkdir(parents=True, exist_ok=True) - // lines.append(f"Path={working_dir}") - - // for key in menuitem_defaults["platforms"]["linux"]: - // if key in (*menuitem_defaults, "glob_patterns"): - // continue - // value = self.render_key(key) - // if value is None: - // continue - // if isinstance(value, bool): - // value = str(value).lower() - // elif isinstance(value, (list, tuple)): - // value = ";".join(value) + ";" - // lines.append(f"{key}={value}") - - // with open(self.location, "w") as f: - // f.write("\n".join(lines)) - // f.write("\n") - fn command(&self) -> String { let mut parts = Vec::new(); if let Some(pre_command) = &self.command.precommand { parts.push(pre_command.resolve(&self.placeholders)); } + // TODO we should use `env` to set the environment variables in the `.desktop` file + let mut envs = Vec::new(); if self.command.activate.unwrap_or(false) { - // TODO implement activation here! + // create a bash activation script and emit it into the script + let activator = + Activator::from_path(&self.prefix, shell::Bash, Platform::current()).unwrap(); + let activation_env = activator + .run_activation(ActivationVariables::default(), None) + .unwrap(); + + for (k, v) in activation_env { + envs.push(format!(r#"{k}="{v}""#, k = k, v = v)); + } + println!("Envs: {:?}", envs); } let command = self @@ -218,6 +167,17 @@ impl LinuxMenu { } // TODO write the rest of the stuff. + // for key in menuitem_defaults["platforms"]["linux"]: + // if key in (*menuitem_defaults, "glob_patterns"): + // continue + // value = self.render_key(key) + // if value is None: + // continue + // if isinstance(value, bool): + // value = str(value).lower() + // elif isinstance(value, (list, tuple)): + // value = ";".join(value) + ";" + // lines.append(f"{key}={value}") Ok(()) } @@ -233,11 +193,6 @@ impl LinuxMenu { Ok(()) } - // def _maybe_register_mime_types(self, register=True): - // mime_types = self.render_key("MimeType") - // if not mime_types: - // return - // self._register_mime_types(mime_types, register=register) fn install(&self) -> Result<(), MenuInstError> { self.pre_create()?; @@ -251,176 +206,15 @@ impl LinuxMenu { } pub fn install_menu_item( + prefix: &Path, item: Linux, command: MenuItemCommand, placeholders: &BaseMenuItemPlaceholders, menu_mode: MenuMode, ) -> Result<(), MenuInstError> { - let menu = LinuxMenu::new(item, command, placeholders, menu_mode); + let menu = LinuxMenu::new(prefix, item, command, placeholders, menu_mode); menu.install()?; println!("{:?}", menu.location()); println!("{:?}", menu.directories.config_directory); Ok(()) -} - -// #[derive(Debug)] -// pub struct LinuxMenu { -// name: String, -// mode: String, -// config_directory: PathBuf, -// data_directory: PathBuf, -// system_menu_config_location: PathBuf, -// menu_config_location: PathBuf, -// directory_entry_location: PathBuf, -// desktop_entries_location: PathBuf, -// } - -// impl LinuxMenu { -// pub fn new(name: String, mode: String) -> Self { -// let system_config_directory = PathBuf::from("/etc/xdg/"); -// let system_data_directory = PathBuf::from("/usr/share"); - -// let (config_directory, data_directory) = if mode == "system" { -// (system_config_directory.clone(), system_data_directory.clone()) -// } else { -// ( -// PathBuf::from(env::var("XDG_CONFIG_HOME").unwrap_or_else(|_| -// "~/.config".to_string())), -// PathBuf::from(env::var("XDG_DATA_HOME").unwrap_or_else(|_| -// "~/.local/share".to_string())), ) -// }; - -// LinuxMenu { -// name, -// mode, -// config_directory: config_directory.clone(), -// data_directory: data_directory.clone(), -// system_menu_config_location: -// system_config_directory.join("menus").join("applications.menu"), -// menu_config_location: -// config_directory.join("menus").join("applications.menu"), -// directory_entry_location: -// data_directory.join("desktop-directories").join(format!("{}.directory", -// Self::render(&name, true))), desktop_entries_location: -// data_directory.join("applications"), } -// } - -// pub fn create(&self) -> Vec { -// self.ensure_directories_exist(); -// let path = self.write_directory_entry(); -// if self.is_valid_menu_file() && self.has_this_menu() { -// return vec![path]; -// } -// self.ensure_menu_file(); -// self.add_this_menu(); -// vec![path] -// } - -// pub fn remove(&self) -> Vec { -// for entry in fs::read_dir(&self.desktop_entries_location).unwrap() { -// let entry = entry.unwrap(); -// let file_name = entry.file_name(); -// if file_name.to_str().unwrap().starts_with(&format!("{}_", -// Self::render(&self.name, true))) { // found one shortcut, so -// don't remove the name from menu return -// vec![self.directory_entry_location.clone()]; } -// } -// unlink(&self.directory_entry_location, true); -// self.remove_this_menu(); -// vec![self.directory_entry_location.clone()] -// } - -// fn ensure_directories_exist(&self) { -// let paths = vec![ -// self.config_directory.join("menus"), -// self.data_directory.join("desktop-directories"), -// self.data_directory.join("applications"), -// ]; -// for path in paths { -// debug!("Ensuring path {:?} exists", path); -// fs::create_dir_all(path).unwrap(); -// } -// } - -// fn write_directory_entry(&self) -> PathBuf { -// let content = format!( -// "[Desktop Entry]\nType=Directory\nEncoding=UTF-8\nName={}", -// Self::render(&self.name, false) -// ); -// debug!("Writing directory entry at {:?}", -// self.directory_entry_location); fs::write(&self. -// directory_entry_location, content).unwrap(); self. -// directory_entry_location.clone() } - -// fn remove_this_menu(&self) { -// debug!("Editing {:?} to remove {} config", self.menu_config_location, -// Self::render(&self.name, false)); let mut doc = -// Element::parse(fs::read_to_string(&self.menu_config_location).unwrap(). -// as_bytes()).unwrap(); doc.children.retain(|child| { -// if let XMLNode::Element(element) = child { -// if element.name == "Menu" { -// if let Some(name_element) = element.get_child("Name") { -// return name_element.get_text() != -// Some(Self::render(&self.name, false)); } -// } -// } -// true -// }); -// self.write_menu_file(&doc); -// } - -// fn has_this_menu(&self) -> bool { -// let doc = -// Element::parse(fs::read_to_string(&self.menu_config_location).unwrap(). -// as_bytes()).unwrap(); doc.children.iter().any(|child| { -// if let XMLNode::Element(element) { -// debug!("Writing {:?}", self.menu_config_location); -// indent_xml_tree(doc); -// let mut file = File::create(&self.menu_config_location).unwrap(); -// writeln!(file, r#""#).unwrap(); -// doc.write(&mut file).unwrap(); -// writeln!(file).unwrap(); -// } - -// fn ensure_menu_file(&self) { -// if self.menu_config_location.exists() && -// !self.menu_config_location.is_file() { panic!("Menu config -// location {:?} is not a file!", self.menu_config_location); } - -// if self.menu_config_location.is_file() { -// let cur_time = -// Local::now().format("%Y-%m-%d_%Hh%Mm%S").to_string(); let -// backup_menu_file = format!("{}.{}", self.menu_config_location.display(), -// cur_time); fs::copy(&self.menu_config_location, -// backup_menu_file).unwrap(); - -// if !self.is_valid_menu_file() { -// fs::remove_file(&self.menu_config_location).unwrap(); -// } -// } else { -// self.new_menu_file(); -// } -// } - -// fn new_menu_file(&self) { -// debug!("Creating {:?}", self.menu_config_location); -// let mut content = String::from("

Applications"); -// if self.mode == "user" { -// content.push_str(&format!(r#"{}"#, self.system_menu_config_location.display())); -// } -// content.push_str("\n"); -// fs::write(&self.menu_config_location, content).unwrap(); -// } - -// fn render(name: &str, slug: bool) -> String { -// // Implement rendering logic here -// if slug { -// name.to_lowercase().replace(" ", "-") -// } else { -// name.to_string() -// } -// } -// } - -// // Implement LinuxMenuItem struct and its methods similarly... +} \ No newline at end of file From 100f977e7c603b38d5a3768a85d182c94c07eaf4 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Mon, 11 Nov 2024 10:51:28 +0100 Subject: [PATCH 020/132] write the rest of the items to linux desktop file --- crates/rattler_menuinst/src/linux.rs | 208 ++++++++++++++++++++++++-- crates/rattler_menuinst/src/schema.rs | 18 +-- 2 files changed, 202 insertions(+), 24 deletions(-) diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index 78b209855..e114287df 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -6,7 +6,7 @@ use rattler_conda_types::Platform; use rattler_shell::activation::{ActivationVariables, Activator}; use rattler_shell::shell; -use crate::render::{BaseMenuItemPlaceholders, MenuItemPlaceholders}; +use crate::render::{BaseMenuItemPlaceholders, MenuItemPlaceholders, PlaceholderString}; use crate::{ schema::{Linux, MenuItemCommand}, MenuInstError, MenuMode, @@ -135,6 +135,15 @@ impl LinuxMenu { return parts.join(" && "); } + fn resolve_and_join(&self, items: &[PlaceholderString]) -> String { + let mut res = String::new(); + for item in items { + res.push_str(&item.resolve(&self.placeholders)); + res.push(';'); + } + res + } + fn create_desktop_entry(&self) -> Result<(), MenuInstError> { let file = self.location(); let writer = File::create(file)?; @@ -166,6 +175,71 @@ impl LinuxMenu { writeln!(writer, "Path={working_dir}")?; } + // resolve categories and join them with a semicolon + if let Some(categories) = &self.item.categories { + writeln!(writer, "Categories={}", self.resolve_and_join(categories))?; + } + + if let Some(dbus_activatable) = &self.item.dbus_activatable { + writeln!(writer, "DBusActivatable={}", dbus_activatable)?; + } + + if let Some(generic_name) = &self.item.generic_name { + writeln!( + writer, + "GenericName={}", + generic_name.resolve(&self.placeholders) + )?; + } + + if let Some(hidden) = &self.item.hidden { + writeln!(writer, "Hidden={}", hidden)?; + } + + if let Some(implements) = &self.item.implements { + writeln!(writer, "Implements={}", self.resolve_and_join(implements))?; + } + + if let Some(keywords) = &self.item.keywords { + writeln!(writer, "Keywords={}", self.resolve_and_join(keywords))?; + } + + if let Some(mime_types) = &self.item.mime_type { + writeln!(writer, "MimeType={}", self.resolve_and_join(mime_types))?; + } + + if let Some(no_display) = &self.item.no_display { + writeln!(writer, "NoDisplay={}", no_display)?; + } + + if let Some(not_show_in) = &self.item.not_show_in { + writeln!(writer, "NotShowIn={}", self.resolve_and_join(not_show_in))?; + } + + if let Some(only_show_in) = &self.item.only_show_in { + writeln!(writer, "OnlyShowIn={}", self.resolve_and_join(only_show_in))?; + } + + if let Some(prefers_non_default_gpu) = &self.item.prefers_non_default_gpu { + writeln!(writer, "PrefersNonDefaultGPU={}", prefers_non_default_gpu)?; + } + + if let Some(startup_notify) = &self.item.startup_notify { + writeln!(writer, "StartupNotify={}", startup_notify)?; + } + + if let Some(startup_wm_class) = &self.item.startup_wm_class { + writeln!( + writer, + "StartupWMClass={}", + startup_wm_class.resolve(&self.placeholders) + )?; + } + + if let Some(try_exec) = &self.item.try_exec { + writeln!(writer, "TryExec={}", try_exec.resolve(&self.placeholders))?; + } + // TODO write the rest of the stuff. // for key in menuitem_defaults["platforms"]["linux"]: // if key in (*menuitem_defaults, "glob_patterns"): @@ -203,18 +277,122 @@ impl LinuxMenu { fn remove(&self) -> Result<(), MenuInstError> { Ok(()) } -} -pub fn install_menu_item( - prefix: &Path, - item: Linux, - command: MenuItemCommand, - placeholders: &BaseMenuItemPlaceholders, - menu_mode: MenuMode, -) -> Result<(), MenuInstError> { - let menu = LinuxMenu::new(prefix, item, command, placeholders, menu_mode); - menu.install()?; - println!("{:?}", menu.location()); - println!("{:?}", menu.directories.config_directory); - Ok(()) -} \ No newline at end of file + // fn maybe_register_mime_types(&self, register: bool) -> Result<(), MenuInstError> { + // if let Some(mime_types) = self.command.mime_type.as_ref().map(|s| s.resolve(&self.placeholders)) { + // self.register_mime_types(mime_types.split(';').collect(), register)?; + // } + // Ok(()) + // } + + // fn register_mime_types(&self, mime_types: Vec<&str>, register: bool) -> Result<(), MenuInstError> { + // let glob_patterns: HashMap = self.command.glob_patterns.as_ref().map(|s| s.resolve(&self.placeholders)).unwrap_or_default(); + // for mime_type in mime_types { + // if let Some(glob_pattern) = glob_patterns.get(mime_type) { + // self.glob_pattern_for_mime_type(mime_type, glob_pattern, register)?; + // } + // } + + // if register { + // if let Some(xdg_mime) = which::which("xdg-mime").ok() { + // let mut command = Command::new(xdg_mime); + // command.arg("default").arg(&self.location()); + // for mime_type in &mime_types { + // command.arg(mime_type); + // } + // self.logged_run(&mut command)?; + // } else { + // log::debug!("xdg-mime not found, not registering mime types as default."); + // } + // } + + // if let Some(update_mime_database) = which::which("update-mime-database").ok() { + // let mut command = Command::new(update_mime_database); + // command.arg("-V").arg(self.menu.data_directory.join("mime")); + // self.logged_run(&mut command)?; + // } + + // Ok(()) + // } + + // fn xml_path_for_mime_type(&self, mime_type: &str) -> (PathBuf, bool) { + // let basename = mime_type.replace("/", "-"); + // let xml_files: Vec = fs::read_dir(self.menu.data_directory.join("mime/applications")) + // .unwrap() + // .filter_map(|entry| { + // let path = entry.unwrap().path(); + // if path.file_name().unwrap().to_str().unwrap().contains(&basename) { + // Some(path) + // } else { + // None + // } + // }) + // .collect(); + + // if !xml_files.is_empty() { + // if xml_files.len() > 1 { + // log::debug!("Found multiple files for MIME type {}: {:?}. Returning first.", mime_type, xml_files); + // } + // return (xml_files[0].clone(), true); + // } + // (self.menu.data_directory.join("mime/packages").join(format!("{}.xml", basename)), false) + // } + + // fn glob_pattern_for_mime_type(&self, mime_type: &str, glob_pattern: &str, install: bool) -> Result { + // let (xml_path, exists) = self.xml_path_for_mime_type(mime_type); + // if exists { + // return Ok(xml_path); + // } + + // // Write the XML that binds our current mime type to the glob pattern + // let xmlns = "http://www.freedesktop.org/standards/shared-mime-info"; + // let mut mime_info = Element::new("mime-info"); + // mime_info.attributes.insert("xmlns".to_string(), xmlns.to_string()); + + // let mut mime_type_tag = Element::new("mime-type"); + // mime_type_tag.attributes.insert("type".to_string(), mime_type.to_string()); + + // let mut glob = Element::new("glob"); + // glob.attributes.insert("pattern".to_string(), glob_pattern.to_string()); + // mime_type_tag.children.push(XMLNode::Element(glob)); + + // let descr = format!("Custom MIME type {} for '{}' files (registered by menuinst)", mime_type, glob_pattern); + // let mut comment = Element::new("comment"); + // comment.children.push(XMLNode::Text(descr)); + // mime_type_tag.children.push(XMLNode::Element(comment)); + + // mime_info.children.push(XMLNode::Element(mime_type_tag)); + // let tree = Element::new("mime-info"); + // tree.children.push(XMLNode::Element(mime_info)); + + // let subcommand = if install { "install" } else { "uninstall" }; + // // Install the XML file and register it as default for our app + // let tmp_dir = TempDir::new()?; + // let tmp_path = tmp_dir.path().join(xml_path.file_name().unwrap()); + // let mut file = fs::File::create(&tmp_path)?; + // tree.write(&mut file)?; + + // let mut command = Command::new("xdg-mime"); + // command.arg(subcommand).arg("--mode").arg(&self.menu.mode).arg("--novendor").arg(tmp_path); + // if let Err(_) = self.logged_run(&mut command) { + // log::debug!("Could not un/register MIME type {} with xdg-mime. Writing to '{}' as a fallback.", mime_type, xml_path.display()); + // let mut file = fs::File::create(&xml_path)?; + // tree.write(&mut file)?; + // } + + // Ok(xml_path) + // } + + // fn paths(&self) -> Vec { + // let mut paths = vec![self.location()]; + // if let Some(mime_types) = self.command.mime_type.as_ref().map(|s| s.resolve(&self.placeholders)) { + // for mime in mime_types.split(';') { + // let (xml_path, exists) = self.xml_path_for_mime_type(mime); + // if exists && fs::read_to_string(&xml_path).unwrap().contains("registered by menuinst") { + // paths.push(xml_path); + // } + // } + // } + // paths + // } +} diff --git a/crates/rattler_menuinst/src/schema.rs b/crates/rattler_menuinst/src/schema.rs index 6fcaf00f4..bc8168f74 100644 --- a/crates/rattler_menuinst/src/schema.rs +++ b/crates/rattler_menuinst/src/schema.rs @@ -83,33 +83,33 @@ pub struct Windows { #[serde(deny_unknown_fields)] pub struct Linux { #[serde(rename = "Categories")] - pub categories: Option>, + pub categories: Option>, #[serde(rename = "DBusActivatable")] pub dbus_activatable: Option, #[serde(rename = "GenericName")] - pub generic_name: Option, + pub generic_name: Option, #[serde(rename = "Hidden")] pub hidden: Option, #[serde(rename = "Implements")] - pub implements: Option>, + pub implements: Option>, #[serde(rename = "Keywords")] - pub keywords: Option>, + pub keywords: Option>, #[serde(rename = "MimeType")] - pub mime_type: Option>, + pub mime_type: Option>, #[serde(rename = "NoDisplay")] pub no_display: Option, #[serde(rename = "NotShowIn")] - pub not_show_in: Option>, + pub not_show_in: Option>, #[serde(rename = "OnlyShowIn")] - pub only_show_in: Option>, + pub only_show_in: Option>, #[serde(rename = "PrefersNonDefaultGPU")] pub prefers_non_default_gpu: Option, #[serde(rename = "StartupNotify")] pub startup_notify: Option, #[serde(rename = "StartupWMClass")] - pub startup_wm_class: Option, + pub startup_wm_class: Option, #[serde(rename = "TryExec")] - pub try_exec: Option, + pub try_exec: Option, pub glob_patterns: Option>, } From 30e78420b896f453f029e8851eb81068cabd8929 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Mon, 11 Nov 2024 10:57:35 +0100 Subject: [PATCH 021/132] remove comment --- crates/rattler_menuinst/src/linux.rs | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index e114287df..af09eb18c 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -240,19 +240,6 @@ impl LinuxMenu { writeln!(writer, "TryExec={}", try_exec.resolve(&self.placeholders))?; } - // TODO write the rest of the stuff. - // for key in menuitem_defaults["platforms"]["linux"]: - // if key in (*menuitem_defaults, "glob_patterns"): - // continue - // value = self.render_key(key) - // if value is None: - // continue - // if isinstance(value, bool): - // value = str(value).lower() - // elif isinstance(value, (list, tuple)): - // value = ";".join(value) + ";" - // lines.append(f"{key}={value}") - Ok(()) } From b402d1bd4ebae44eacf4e909e3b359bb420366fb Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Mon, 11 Nov 2024 12:25:52 +0100 Subject: [PATCH 022/132] re-add missing function --- crates/rattler_menuinst/src/linux.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index af09eb18c..d06dbc16d 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -383,3 +383,18 @@ impl LinuxMenu { // paths // } } + +/// Install a menu item on Linux. +pub fn install_menu_item( + prefix: &Path, + item: Linux, + command: MenuItemCommand, + placeholders: &BaseMenuItemPlaceholders, + menu_mode: MenuMode, +) -> Result<(), MenuInstError> { + let menu = LinuxMenu::new(prefix, item, command, placeholders, menu_mode); + menu.install()?; + println!("{:?}", menu.location()); + println!("{:?}", menu.directories.config_directory); + Ok(()) +} \ No newline at end of file From 3002b5629b26bf439c0409af0810078107000f07 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Mon, 11 Nov 2024 13:30:55 +0100 Subject: [PATCH 023/132] Improve Linux support --- crates/rattler_menuinst/src/lib.rs | 2 +- crates/rattler_menuinst/src/linux.rs | 15 ++++++--------- crates/rattler_menuinst/src/render.rs | 2 +- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index 3800429dd..092de01b1 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -59,7 +59,7 @@ pub fn install_menuitems( linux_item.specific, command, &placeholders, - MenuMode::System, + MenuMode::User, )?; } } else if platform.is_osx() { diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index d06dbc16d..c354bd2ea 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -1,6 +1,7 @@ +use fs_err::File; use std::io::Write; use std::path::Path; -use std::{fs::File, path::PathBuf}; +use std::path::PathBuf; use rattler_conda_types::Platform; use rattler_shell::activation::{ActivationVariables, Activator}; @@ -40,12 +41,8 @@ impl Directories { ) } else { ( - PathBuf::from( - std::env::var("XDG_CONFIG_HOME").unwrap_or_else(|_| "~/.config".to_string()), - ), - PathBuf::from( - std::env::var("XDG_DATA_HOME").unwrap_or_else(|_| "~/.local/share".to_string()), - ), + dirs::home_dir().expect("Could not get home dir"), + dirs::data_dir().expect("Could not get data dir"), ) }; @@ -152,7 +149,7 @@ impl LinuxMenu { writeln!(writer, "[Desktop Entry]")?; writeln!(writer, "Type=Application")?; writeln!(writer, "Encoding=UTF-8")?; - writeln!(writer, "Name={:?}", self.command.name)?; + writeln!(writer, "Name={}", self.name)?; writeln!(writer, "Exec={}", self.command())?; writeln!( writer, @@ -397,4 +394,4 @@ pub fn install_menu_item( println!("{:?}", menu.location()); println!("{:?}", menu.directories.config_directory); Ok(()) -} \ No newline at end of file +} diff --git a/crates/rattler_menuinst/src/render.rs b/crates/rattler_menuinst/src/render.rs index ac84220de..96119c553 100644 --- a/crates/rattler_menuinst/src/render.rs +++ b/crates/rattler_menuinst/src/render.rs @@ -48,7 +48,7 @@ impl BaseMenuItemPlaceholders { ("PREFIX", prefix.to_path_buf()), ("PYTHON", python), ("BASE_PYTHON", base_python), - ("MENU_DIR", prefix.join("menu")), + ("MENU_DIR", prefix.join("Menu")), ("HOME", dirs::home_dir().unwrap_or_default()), ]); From 0f095592df0e133f07458944f8b92ec06c883ea5 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Mon, 11 Nov 2024 13:43:31 +0100 Subject: [PATCH 024/132] Fix clippy warnings --- crates/rattler_menuinst/src/lib.rs | 2 +- crates/rattler_menuinst/src/linux.rs | 20 ++++++++++---------- crates/rattler_menuinst/src/schema.rs | 6 +++--- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index 092de01b1..b64097914 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -115,7 +115,7 @@ pub mod test { let prefix = schema_path.parent().unwrap().parent().unwrap(); let prefix = std::fs::canonicalize(prefix).unwrap(); - println!("prefix: {:?}", prefix); + println!("prefix: {prefix:?}"); let platform = Platform::OsxArm64; install_menuitems(&schema_path, &prefix, &prefix, platform).unwrap(); diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index c354bd2ea..56a183774 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -73,7 +73,7 @@ impl LinuxMenu { prefix: prefix.to_path_buf(), name: command .name - .resolve(crate::schema::Environment::Base, &placeholders) + .resolve(crate::schema::Environment::Base, placeholders) .to_string(), item, command, @@ -114,9 +114,9 @@ impl LinuxMenu { .unwrap(); for (k, v) in activation_env { - envs.push(format!(r#"{k}="{v}""#, k = k, v = v)); + envs.push(format!(r#"{k}="{v}""#)); } - println!("Envs: {:?}", envs); + println!("Envs: {envs:?}"); } let command = self @@ -129,7 +129,7 @@ impl LinuxMenu { parts.push(command); - return parts.join(" && "); + parts.join(" && ") } fn resolve_and_join(&self, items: &[PlaceholderString]) -> String { @@ -164,7 +164,7 @@ impl LinuxMenu { let description = self.command.description.resolve(&self.placeholders); if !description.is_empty() { - writeln!(writer, "Comment={}", description)?; + writeln!(writer, "Comment={description}")?; } if let Some(working_dir) = &self.command.working_dir { @@ -178,7 +178,7 @@ impl LinuxMenu { } if let Some(dbus_activatable) = &self.item.dbus_activatable { - writeln!(writer, "DBusActivatable={}", dbus_activatable)?; + writeln!(writer, "DBusActivatable={dbus_activatable}")?; } if let Some(generic_name) = &self.item.generic_name { @@ -190,7 +190,7 @@ impl LinuxMenu { } if let Some(hidden) = &self.item.hidden { - writeln!(writer, "Hidden={}", hidden)?; + writeln!(writer, "Hidden={hidden}")?; } if let Some(implements) = &self.item.implements { @@ -206,7 +206,7 @@ impl LinuxMenu { } if let Some(no_display) = &self.item.no_display { - writeln!(writer, "NoDisplay={}", no_display)?; + writeln!(writer, "NoDisplay={no_display}")?; } if let Some(not_show_in) = &self.item.not_show_in { @@ -218,11 +218,11 @@ impl LinuxMenu { } if let Some(prefers_non_default_gpu) = &self.item.prefers_non_default_gpu { - writeln!(writer, "PrefersNonDefaultGPU={}", prefers_non_default_gpu)?; + writeln!(writer, "PrefersNonDefaultGPU={prefers_non_default_gpu}")?; } if let Some(startup_notify) = &self.item.startup_notify { - writeln!(writer, "StartupNotify={}", startup_notify)?; + writeln!(writer, "StartupNotify={startup_notify}")?; } if let Some(startup_wm_class) = &self.item.startup_wm_class { diff --git a/crates/rattler_menuinst/src/schema.rs b/crates/rattler_menuinst/src/schema.rs index bc8168f74..bf9ffeeb5 100644 --- a/crates/rattler_menuinst/src/schema.rs +++ b/crates/rattler_menuinst/src/schema.rs @@ -239,13 +239,13 @@ impl MenuItemCommand { icon: platform .icon .as_ref() - .or_else(|| self.icon.as_ref()) + .or(self.icon.as_ref()) .cloned(), precommand: platform.precommand.or_else(|| self.precommand.clone()), precreate: platform.precreate.or_else(|| self.precreate.clone()), working_dir: platform.working_dir.or_else(|| self.working_dir.clone()), - activate: platform.activate.or_else(|| self.activate.clone()), - terminal: platform.terminal.or_else(|| self.terminal.clone()), + activate: platform.activate.or(self.activate), + terminal: platform.terminal.or(self.terminal), } } } From 5f081b5a6fed9fa222352a0d7d5e306a4661ec0b Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Mon, 11 Nov 2024 13:44:39 +0100 Subject: [PATCH 025/132] Another clippy warning --- crates/rattler_menuinst/src/linux.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index 56a183774..d6a4761a6 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -73,8 +73,7 @@ impl LinuxMenu { prefix: prefix.to_path_buf(), name: command .name - .resolve(crate::schema::Environment::Base, placeholders) - .to_string(), + .resolve(crate::schema::Environment::Base, placeholders), item, command, directories, From 26150ea6812f657c7c25d99f814dd7d355103d4d Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Mon, 11 Nov 2024 15:45:38 +0100 Subject: [PATCH 026/132] Run commands with bash --- crates/rattler_menuinst/src/linux.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index d6a4761a6..67acde713 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -128,7 +128,9 @@ impl LinuxMenu { parts.push(command); - parts.join(" && ") + let command = parts.join(" && "); + + format!("bash -c {}", shlex::try_quote(&command).unwrap()) } fn resolve_and_join(&self, items: &[PlaceholderString]) -> String { From 08654d8cd2ea99dad1999923eaf003bd765ba4bf Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Mon, 11 Nov 2024 17:02:34 +0100 Subject: [PATCH 027/132] continue xml writing for mimetypes --- crates/rattler_menuinst/src/linux.rs | 229 +++++++++++++------------- crates/rattler_menuinst/src/schema.rs | 2 +- 2 files changed, 118 insertions(+), 113 deletions(-) diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index 67acde713..17f5fa76f 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -1,7 +1,9 @@ -use fs_err::File; use std::io::Write; -use std::path::Path; -use std::path::PathBuf; +use std::collections::HashMap; +use std::io::Write; +use fs_err::File; +use std::path::{Path, PathBuf}; +use fs_err as fs; use rattler_conda_types::Platform; use rattler_shell::activation::{ActivationVariables, Activator}; @@ -241,18 +243,6 @@ impl LinuxMenu { Ok(()) } - fn register_mime_types(&self) -> Result<(), MenuInstError> { - if self.item.mime_type.is_none() { - return Ok(()); - } - let mime_type = self.item.mime_type.as_ref().unwrap(); - if mime_type.is_empty() { - return Ok(()); - } - - Ok(()) - } - fn install(&self) -> Result<(), MenuInstError> { self.pre_create()?; self.create_desktop_entry()?; @@ -263,110 +253,125 @@ impl LinuxMenu { Ok(()) } - // fn maybe_register_mime_types(&self, register: bool) -> Result<(), MenuInstError> { - // if let Some(mime_types) = self.command.mime_type.as_ref().map(|s| s.resolve(&self.placeholders)) { - // self.register_mime_types(mime_types.split(';').collect(), register)?; - // } - // Ok(()) - // } - - // fn register_mime_types(&self, mime_types: Vec<&str>, register: bool) -> Result<(), MenuInstError> { - // let glob_patterns: HashMap = self.command.glob_patterns.as_ref().map(|s| s.resolve(&self.placeholders)).unwrap_or_default(); - // for mime_type in mime_types { - // if let Some(glob_pattern) = glob_patterns.get(mime_type) { - // self.glob_pattern_for_mime_type(mime_type, glob_pattern, register)?; - // } - // } + fn maybe_register_mime_types(&self, register: bool) -> Result<(), MenuInstError> { + if let Some(mime_types) = self.item.mime_type.as_ref() { + let resolved_mime_types = mime_types + .iter() + .map(|s| s.resolve(&self.placeholders)) + .collect::>(); + self.register_mime_types(&resolved_mime_types, register)?; + } + Ok(()) + } - // if register { - // if let Some(xdg_mime) = which::which("xdg-mime").ok() { - // let mut command = Command::new(xdg_mime); - // command.arg("default").arg(&self.location()); - // for mime_type in &mime_types { - // command.arg(mime_type); - // } - // self.logged_run(&mut command)?; - // } else { - // log::debug!("xdg-mime not found, not registering mime types as default."); - // } - // } + fn register_mime_types( + &self, + mime_types: &[String], + register: bool, + ) -> Result<(), MenuInstError> { + let mut resolved_globs = HashMap::::new(); - // if let Some(update_mime_database) = which::which("update-mime-database").ok() { - // let mut command = Command::new(update_mime_database); - // command.arg("-V").arg(self.menu.data_directory.join("mime")); - // self.logged_run(&mut command)?; - // } + if let Some(globs) = &self.item.glob_patterns { + for (k, v) in globs { + resolved_globs.insert(k.resolve(&self.placeholders), v.resolve(&self.placeholders)); + } + } - // Ok(()) - // } - - // fn xml_path_for_mime_type(&self, mime_type: &str) -> (PathBuf, bool) { - // let basename = mime_type.replace("/", "-"); - // let xml_files: Vec = fs::read_dir(self.menu.data_directory.join("mime/applications")) - // .unwrap() - // .filter_map(|entry| { - // let path = entry.unwrap().path(); - // if path.file_name().unwrap().to_str().unwrap().contains(&basename) { - // Some(path) - // } else { - // None - // } - // }) - // .collect(); + for mime_type in mime_types { + if let Some(glob_pattern) = resolved_globs.get(mime_type) { + self.glob_pattern_for_mime_type(mime_type, glob_pattern, register)?; + } + } - // if !xml_files.is_empty() { - // if xml_files.len() > 1 { - // log::debug!("Found multiple files for MIME type {}: {:?}. Returning first.", mime_type, xml_files); - // } - // return (xml_files[0].clone(), true); - // } - // (self.menu.data_directory.join("mime/packages").join(format!("{}.xml", basename)), false) - // } + // if register { + // if let Some(xdg_mime) = which::which("xdg-mime").ok() { + // let mut command = Command::new(xdg_mime); + // command.arg("default").arg(&self.location()); + // for mime_type in &mime_types { + // command.arg(mime_type); + // } + // self.logged_run(&mut command)?; + // } else { + // log::debug!("xdg-mime not found, not registering mime types as default."); + // } + // } + + // if let Some(update_mime_database) = which::which("update-mime-database").ok() { + // let mut command = Command::new(update_mime_database); + // command.arg("-V").arg(self.menu.data_directory.join("mime")); + // self.logged_run(&mut command)?; + // } - // fn glob_pattern_for_mime_type(&self, mime_type: &str, glob_pattern: &str, install: bool) -> Result { - // let (xml_path, exists) = self.xml_path_for_mime_type(mime_type); - // if exists { - // return Ok(xml_path); - // } + Ok(()) + } - // // Write the XML that binds our current mime type to the glob pattern - // let xmlns = "http://www.freedesktop.org/standards/shared-mime-info"; - // let mut mime_info = Element::new("mime-info"); - // mime_info.attributes.insert("xmlns".to_string(), xmlns.to_string()); - - // let mut mime_type_tag = Element::new("mime-type"); - // mime_type_tag.attributes.insert("type".to_string(), mime_type.to_string()); - - // let mut glob = Element::new("glob"); - // glob.attributes.insert("pattern".to_string(), glob_pattern.to_string()); - // mime_type_tag.children.push(XMLNode::Element(glob)); - - // let descr = format!("Custom MIME type {} for '{}' files (registered by menuinst)", mime_type, glob_pattern); - // let mut comment = Element::new("comment"); - // comment.children.push(XMLNode::Text(descr)); - // mime_type_tag.children.push(XMLNode::Element(comment)); - - // mime_info.children.push(XMLNode::Element(mime_type_tag)); - // let tree = Element::new("mime-info"); - // tree.children.push(XMLNode::Element(mime_info)); - - // let subcommand = if install { "install" } else { "uninstall" }; - // // Install the XML file and register it as default for our app - // let tmp_dir = TempDir::new()?; - // let tmp_path = tmp_dir.path().join(xml_path.file_name().unwrap()); - // let mut file = fs::File::create(&tmp_path)?; - // tree.write(&mut file)?; - - // let mut command = Command::new("xdg-mime"); - // command.arg(subcommand).arg("--mode").arg(&self.menu.mode).arg("--novendor").arg(tmp_path); - // if let Err(_) = self.logged_run(&mut command) { - // log::debug!("Could not un/register MIME type {} with xdg-mime. Writing to '{}' as a fallback.", mime_type, xml_path.display()); - // let mut file = fs::File::create(&xml_path)?; - // tree.write(&mut file)?; - // } + fn xml_path_for_mime_type(&self, mime_type: &str) -> (PathBuf, bool) { + let basename = mime_type.replace("/", "-"); + let xml_files: Vec = fs::read_dir(self.directories.data_directory.join("mime/applications")) + .unwrap() + .filter_map(|entry| { + let path = entry.unwrap().path(); + if path.file_name().unwrap().to_str().unwrap().contains(&basename) { + Some(path) + } else { + None + } + }) + .collect(); + + if !xml_files.is_empty() { + if xml_files.len() > 1 { + tracing::debug!("Found multiple files for MIME type {}: {:?}. Returning first.", mime_type, xml_files); + } + return (xml_files[0].clone(), true); + } + (self.directories.data_directory.join("mime/packages").join(format!("{}.xml", basename)), false) + } + + fn glob_pattern_for_mime_type(&self, mime_type: &str, glob_pattern: &str, install: bool) -> Result { + let (xml_path, exists) = self.xml_path_for_mime_type(mime_type); + if exists { + return Ok(xml_path); + } - // Ok(xml_path) - // } + // // Write the XML that binds our current mime type to the glob pattern + // let xmlns = "http://www.freedesktop.org/standards/shared-mime-info"; + // let mut mime_info = Element::new("mime-info"); + // mime_info.attributes.insert("xmlns".to_string(), xmlns.to_string()); + + // let mut mime_type_tag = Element::new("mime-type"); + // mime_type_tag.attributes.insert("type".to_string(), mime_type.to_string()); + + // let mut glob = Element::new("glob"); + // glob.attributes.insert("pattern".to_string(), glob_pattern.to_string()); + // mime_type_tag.children.push(XMLNode::Element(glob)); + + // let descr = format!("Custom MIME type {} for '{}' files (registered by menuinst)", mime_type, glob_pattern); + // let mut comment = Element::new("comment"); + // comment.children.push(XMLNode::Text(descr)); + // mime_type_tag.children.push(XMLNode::Element(comment)); + + // mime_info.children.push(XMLNode::Element(mime_type_tag)); + // let tree = Element::new("mime-info"); + // tree.children.push(XMLNode::Element(mime_info)); + + // let subcommand = if install { "install" } else { "uninstall" }; + // // Install the XML file and register it as default for our app + // let tmp_dir = TempDir::new()?; + // let tmp_path = tmp_dir.path().join(xml_path.file_name().unwrap()); + // let mut file = fs::File::create(&tmp_path)?; + // tree.write(&mut file)?; + + // let mut command = Command::new("xdg-mime"); + // command.arg(subcommand).arg("--mode").arg(&self.menu.mode).arg("--novendor").arg(tmp_path); + // if let Err(_) = self.logged_run(&mut command) { + // log::debug!("Could not un/register MIME type {} with xdg-mime. Writing to '{}' as a fallback.", mime_type, xml_path.display()); + // let mut file = fs::File::create(&xml_path)?; + // tree.write(&mut file)?; + // } + + Ok(xml_path) + } // fn paths(&self) -> Vec { // let mut paths = vec![self.location()]; diff --git a/crates/rattler_menuinst/src/schema.rs b/crates/rattler_menuinst/src/schema.rs index bf9ffeeb5..52c013d1e 100644 --- a/crates/rattler_menuinst/src/schema.rs +++ b/crates/rattler_menuinst/src/schema.rs @@ -110,7 +110,7 @@ pub struct Linux { pub startup_wm_class: Option, #[serde(rename = "TryExec")] pub try_exec: Option, - pub glob_patterns: Option>, + pub glob_patterns: Option>, } #[derive(Serialize, Deserialize, Debug, Clone)] From 2972e174de838ffeacc39b172adfe2af870b6a13 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Mon, 11 Nov 2024 17:06:44 +0100 Subject: [PATCH 028/132] some clippy --- crates/rattler_menuinst/src/linux.rs | 55 ++++++++++++++++++--------- crates/rattler_menuinst/src/macos.rs | 5 +-- crates/rattler_menuinst/src/schema.rs | 6 +-- 3 files changed, 41 insertions(+), 25 deletions(-) diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index 17f5fa76f..bca4dd5a3 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -1,9 +1,8 @@ -use std::io::Write; +use fs_err as fs; +use fs_err::File; use std::collections::HashMap; use std::io::Write; -use fs_err::File; use std::path::{Path, PathBuf}; -use fs_err as fs; use rattler_conda_types::Platform; use rattler_shell::activation::{ActivationVariables, Activator}; @@ -307,28 +306,50 @@ impl LinuxMenu { fn xml_path_for_mime_type(&self, mime_type: &str) -> (PathBuf, bool) { let basename = mime_type.replace("/", "-"); - let xml_files: Vec = fs::read_dir(self.directories.data_directory.join("mime/applications")) - .unwrap() - .filter_map(|entry| { - let path = entry.unwrap().path(); - if path.file_name().unwrap().to_str().unwrap().contains(&basename) { - Some(path) - } else { - None - } - }) - .collect(); + let xml_files: Vec = + fs::read_dir(self.directories.data_directory.join("mime/applications")) + .unwrap() + .filter_map(|entry| { + let path = entry.unwrap().path(); + if path + .file_name() + .unwrap() + .to_str() + .unwrap() + .contains(&basename) + { + Some(path) + } else { + None + } + }) + .collect(); if !xml_files.is_empty() { if xml_files.len() > 1 { - tracing::debug!("Found multiple files for MIME type {}: {:?}. Returning first.", mime_type, xml_files); + tracing::debug!( + "Found multiple files for MIME type {}: {:?}. Returning first.", + mime_type, + xml_files + ); } return (xml_files[0].clone(), true); } - (self.directories.data_directory.join("mime/packages").join(format!("{}.xml", basename)), false) + ( + self.directories + .data_directory + .join("mime/packages") + .join(format!("{basename}.xml")), + false, + ) } - fn glob_pattern_for_mime_type(&self, mime_type: &str, glob_pattern: &str, install: bool) -> Result { + fn glob_pattern_for_mime_type( + &self, + mime_type: &str, + glob_pattern: &str, + install: bool, + ) -> Result { let (xml_path, exists) = self.xml_path_for_mime_type(mime_type); if exists { return Ok(xml_path); diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index 98c7caf64..e8f16ee3b 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -90,7 +90,7 @@ impl MacOSMenu { .resolve(crate::schema::Environment::Base, placeholders) .to_string(); - let bundle_name = format!("{}.app", name); + let bundle_name = format!("{name}.app"); let directories = Directories::new(menu_mode, &bundle_name); println!("Installing menu item for {bundle_name}"); @@ -450,7 +450,7 @@ impl MacOSMenu { .unwrap(); for (k, v) in activation_env { - lines.push(format!(r#"export {k}="{v}""#, k = k, v = v)); + lines.push(format!(r#"export {k}="{v}""#)); } } @@ -652,7 +652,6 @@ pub(crate) fn install_menu_item( menu_mode: MenuMode, ) -> Result<(), MenuInstError> { let menu = MacOSMenu::new(prefix, macos_item, command, menu_mode, placeholders); - println!("Menu: {:?}", menu); menu.install() } diff --git a/crates/rattler_menuinst/src/schema.rs b/crates/rattler_menuinst/src/schema.rs index 52c013d1e..5e5e4d856 100644 --- a/crates/rattler_menuinst/src/schema.rs +++ b/crates/rattler_menuinst/src/schema.rs @@ -236,11 +236,7 @@ impl MenuItemCommand { .description .unwrap_or_else(|| self.description.clone()), command: platform.command.unwrap_or_else(|| self.command.clone()), - icon: platform - .icon - .as_ref() - .or(self.icon.as_ref()) - .cloned(), + icon: platform.icon.as_ref().or(self.icon.as_ref()).cloned(), precommand: platform.precommand.or_else(|| self.precommand.clone()), precreate: platform.precreate.or_else(|| self.precreate.clone()), working_dir: platform.working_dir.or_else(|| self.working_dir.clone()), From e53e561e3e5effaa629ac91ed0445d0ee1c6caca Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Mon, 11 Nov 2024 17:17:04 +0100 Subject: [PATCH 029/132] Run update-desktop-database --- crates/rattler_menuinst/src/linux.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index bca4dd5a3..866884efa 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -3,6 +3,7 @@ use fs_err::File; use std::collections::HashMap; use std::io::Write; use std::path::{Path, PathBuf}; +use std::process::Command; use rattler_conda_types::Platform; use rattler_shell::activation::{ActivationVariables, Activator}; @@ -242,9 +243,17 @@ impl LinuxMenu { Ok(()) } + fn update_desktop_database() -> Result<(), MenuInstError> { + // We don't care about the output of update-desktop-database + let _ = Command::new("update-desktop-database").output(); + + Ok(()) + } + fn install(&self) -> Result<(), MenuInstError> { self.pre_create()?; self.create_desktop_entry()?; + Self::update_desktop_database()?; Ok(()) } From 02c8b0b62a916dd4a424d72c6772cd258f4f9dd4 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Mon, 11 Nov 2024 17:36:51 +0100 Subject: [PATCH 030/132] write xml file --- crates/rattler_menuinst/src/linux.rs | 144 ++++++++++++++++----------- 1 file changed, 85 insertions(+), 59 deletions(-) diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index 866884efa..583142f2d 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -4,6 +4,7 @@ use std::collections::HashMap; use std::io::Write; use std::path::{Path, PathBuf}; use std::process::Command; +use tempfile::TempDir; use rattler_conda_types::Platform; use rattler_shell::activation::{ActivationVariables, Activator}; @@ -291,18 +292,18 @@ impl LinuxMenu { } } - // if register { - // if let Some(xdg_mime) = which::which("xdg-mime").ok() { - // let mut command = Command::new(xdg_mime); - // command.arg("default").arg(&self.location()); - // for mime_type in &mime_types { - // command.arg(mime_type); - // } - // self.logged_run(&mut command)?; - // } else { - // log::debug!("xdg-mime not found, not registering mime types as default."); - // } - // } + if register { + if let Some(xdg_mime) = which::which("xdg-mime").ok() { + let mut command = Command::new(xdg_mime); + command.arg("default").arg(&self.location()); + for mime_type in &mime_types { + command.arg(mime_type); + } + self.logged_run(&mut command)?; + } else { + tracing::debug!("xdg-mime not found, not registering mime types as default."); + } + } // if let Some(update_mime_database) = which::which("update-mime-database").ok() { // let mut command = Command::new(update_mime_database); @@ -364,57 +365,82 @@ impl LinuxMenu { return Ok(xml_path); } - // // Write the XML that binds our current mime type to the glob pattern - // let xmlns = "http://www.freedesktop.org/standards/shared-mime-info"; - // let mut mime_info = Element::new("mime-info"); - // mime_info.attributes.insert("xmlns".to_string(), xmlns.to_string()); - - // let mut mime_type_tag = Element::new("mime-type"); - // mime_type_tag.attributes.insert("type".to_string(), mime_type.to_string()); - - // let mut glob = Element::new("glob"); - // glob.attributes.insert("pattern".to_string(), glob_pattern.to_string()); - // mime_type_tag.children.push(XMLNode::Element(glob)); - - // let descr = format!("Custom MIME type {} for '{}' files (registered by menuinst)", mime_type, glob_pattern); - // let mut comment = Element::new("comment"); - // comment.children.push(XMLNode::Text(descr)); - // mime_type_tag.children.push(XMLNode::Element(comment)); - - // mime_info.children.push(XMLNode::Element(mime_type_tag)); - // let tree = Element::new("mime-info"); - // tree.children.push(XMLNode::Element(mime_info)); - - // let subcommand = if install { "install" } else { "uninstall" }; - // // Install the XML file and register it as default for our app - // let tmp_dir = TempDir::new()?; - // let tmp_path = tmp_dir.path().join(xml_path.file_name().unwrap()); - // let mut file = fs::File::create(&tmp_path)?; - // tree.write(&mut file)?; - - // let mut command = Command::new("xdg-mime"); - // command.arg(subcommand).arg("--mode").arg(&self.menu.mode).arg("--novendor").arg(tmp_path); - // if let Err(_) = self.logged_run(&mut command) { - // log::debug!("Could not un/register MIME type {} with xdg-mime. Writing to '{}' as a fallback.", mime_type, xml_path.display()); - // let mut file = fs::File::create(&xml_path)?; - // tree.write(&mut file)?; - // } + // Write the XML that binds our current mime type to the glob pattern + let xmlns = "http://www.freedesktop.org/standards/shared-mime-info"; + let description = format!( + "Custom MIME type {mime_type} for '{glob_pattern}' files (registered by menuinst)" + ); + + let xml = format!( + r#" + + + + {} + + "#, + xmlns, mime_type, glob_pattern, description + ); + + let subcommand = if install { "install" } else { "uninstall" }; + // Install the XML file and register it as default for our app + let tmp_dir = TempDir::new()?; + let tmp_path = tmp_dir.path().join(xml_path.file_name().unwrap()); + let mut file = fs::File::create(&tmp_path)?; + file.write_all(xml.as_bytes())?; + + let mut command = Command::new("xdg-mime"); + command + .arg(subcommand) + .arg("--mode") + .arg(&self.menu.mode) + .arg("--novendor") + .arg(tmp_path); + let output = command.output()?; + + if !output.status.success() { + tracing::warn!( + "Could not un/register MIME type {} with xdg-mime. Writing to '{}' as a fallback.", + mime_type, + xml_path.display() + ); + tracing::info!( + "xdg-mime stdout output: {}", + String::from_utf8_lossy(&output.stdout) + ); + tracing::info!( + "xdg-mime stderr output: {}", + String::from_utf8_lossy(&output.stderr) + ); + + let mut file = fs::File::create(&xml_path)?; + file.write_all(xml.as_bytes())?; + } Ok(xml_path) } - // fn paths(&self) -> Vec { - // let mut paths = vec![self.location()]; - // if let Some(mime_types) = self.command.mime_type.as_ref().map(|s| s.resolve(&self.placeholders)) { - // for mime in mime_types.split(';') { - // let (xml_path, exists) = self.xml_path_for_mime_type(mime); - // if exists && fs::read_to_string(&xml_path).unwrap().contains("registered by menuinst") { - // paths.push(xml_path); - // } - // } - // } - // paths - // } + fn paths(&self) -> Vec { + let mut paths = vec![self.location()]; + if let Some(mime_types) = self + .command + .mime_type + .as_ref() + .map(|s| s.resolve(&self.placeholders)) + { + for mime in mime_types.split(';') { + let (xml_path, exists) = self.xml_path_for_mime_type(mime); + if exists + && fs::read_to_string(&xml_path) + .unwrap() + .contains("registered by menuinst") + { + paths.push(xml_path); + } + } + } + paths + } } /// Install a menu item on Linux. From 61326ff4b0bad2a1501f41325cd62f2b2510466e Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Mon, 11 Nov 2024 17:54:39 +0100 Subject: [PATCH 031/132] properly implement the `paths` function --- crates/rattler_menuinst/Cargo.toml | 1 + crates/rattler_menuinst/src/lib.rs | 2 +- crates/rattler_menuinst/src/linux.rs | 60 ++++++++++++++++++++-------- 3 files changed, 45 insertions(+), 18 deletions(-) diff --git a/crates/rattler_menuinst/Cargo.toml b/crates/rattler_menuinst/Cargo.toml index 5fcf19de4..35f8b2d9f 100644 --- a/crates/rattler_menuinst/Cargo.toml +++ b/crates/rattler_menuinst/Cargo.toml @@ -24,6 +24,7 @@ unicode-normalization = { workspace = true } regex = { workspace = true } tempfile = { workspace = true } fs-err = { workspace = true } +which = "7.0.0" [target.'cfg(target_os = "windows")'.dependencies] winapi = "0.3.9" diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index b64097914..176a59e5e 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -17,7 +17,7 @@ use crate::{render::BaseMenuItemPlaceholders, schema::MenuInstSchema}; pub mod utils; -#[derive(Debug, Eq, PartialEq)] +#[derive(Debug, Eq, PartialEq, Clone, Copy)] pub enum MenuMode { System, User, diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index 583142f2d..023397f2a 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -23,6 +23,7 @@ pub struct LinuxMenu { command: MenuItemCommand, directories: Directories, placeholders: MenuItemPlaceholders, + mode: MenuMode, } pub struct Directories { @@ -81,6 +82,7 @@ impl LinuxMenu { command, directories, placeholders: refined_placeholders, + mode, } } @@ -296,10 +298,25 @@ impl LinuxMenu { if let Some(xdg_mime) = which::which("xdg-mime").ok() { let mut command = Command::new(xdg_mime); command.arg("default").arg(&self.location()); - for mime_type in &mime_types { + for mime_type in mime_types { command.arg(mime_type); } - self.logged_run(&mut command)?; + let output = command.output()?; + if !output.status.success() { + tracing::warn!( + "Could not set MIME type {} as default for {}", + mime_types.join(", "), + self.name + ); + tracing::info!( + "xdg-mime stdout output: {}", + String::from_utf8_lossy(&output.stdout) + ); + tracing::info!( + "xdg-mime stderr output: {}", + String::from_utf8_lossy(&output.stderr) + ); + } } else { tracing::debug!("xdg-mime not found, not registering mime types as default."); } @@ -390,10 +407,15 @@ impl LinuxMenu { file.write_all(xml.as_bytes())?; let mut command = Command::new("xdg-mime"); + let mode = match self.mode { + MenuMode::System => "system", + MenuMode::User => "user", + }; + command .arg(subcommand) .arg("--mode") - .arg(&self.menu.mode) + .arg(mode) .arg("--novendor") .arg(tmp_path); let output = command.output()?; @@ -420,22 +442,26 @@ impl LinuxMenu { Ok(xml_path) } + /// All paths that are installed for removal fn paths(&self) -> Vec { let mut paths = vec![self.location()]; - if let Some(mime_types) = self - .command - .mime_type - .as_ref() - .map(|s| s.resolve(&self.placeholders)) - { - for mime in mime_types.split(';') { - let (xml_path, exists) = self.xml_path_for_mime_type(mime); - if exists - && fs::read_to_string(&xml_path) - .unwrap() - .contains("registered by menuinst") - { - paths.push(xml_path); + + if let Some(mime_types) = &self.item.mime_type { + let resolved = mime_types + .iter() + .map(|s| s.resolve(&self.placeholders)) + .collect::>(); + + for mime in resolved { + let (xml_path, exists) = self.xml_path_for_mime_type(&mime); + if !exists { + continue; + } + + if let Ok(content) = fs::read_to_string(&xml_path) { + if content.contains("registered by menuinst") { + paths.push(xml_path); + } } } } From d6fce2afa318fd0a7b24b308d584dd7bcb122c75 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Mon, 11 Nov 2024 19:24:48 +0100 Subject: [PATCH 032/132] implement more macOS --- crates/rattler_menuinst/src/linux.rs | 11 +- crates/rattler_menuinst/src/macos.rs | 161 ++++++++++++++------------ crates/rattler_menuinst/src/schema.rs | 161 ++++++++++++++++++++++++-- 3 files changed, 245 insertions(+), 88 deletions(-) diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index 023397f2a..ad6573490 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -390,13 +390,12 @@ impl LinuxMenu { let xml = format!( r#" - - - - {} + + + + {description} - "#, - xmlns, mime_type, glob_pattern, description + "# ); let subcommand = if install { "install" } else { "uninstall" }; diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index e8f16ee3b..3e852c2eb 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -17,7 +17,7 @@ use rattler_shell::{ use crate::{ render::{resolve, BaseMenuItemPlaceholders, MenuItemPlaceholders}, - schema::{MacOS, MenuItemCommand}, + schema::{MacOS, MenuItemCommand, UTTypeDeclarationModel}, slugify, utils, MenuInstError, MenuMode, }; @@ -77,6 +77,58 @@ impl Directories { } } +impl UTTypeDeclarationModel { + fn to_plist(&self, placeholders: &MenuItemPlaceholders) -> Value { + let mut type_dict = plist::Dictionary::new(); + type_dict.insert( + "UTTypeConformsTo".into(), + Value::Array( + self.ut_type_conforms_to + .iter() + .map(|s| Value::String(s.resolve(placeholders))) + .collect(), + ), + ); + if let Some(desc) = &self.ut_type_description { + type_dict.insert( + "UTTypeDescription".into(), + Value::String(desc.resolve(placeholders)), + ); + } + if let Some(icon) = &self.ut_type_icon_file { + type_dict.insert( + "UTTypeIconFile".into(), + Value::String(icon.resolve(placeholders)), + ); + } + type_dict.insert( + "UTTypeIdentifier".into(), + Value::String(self.ut_type_identifier.resolve(placeholders)), + ); + if let Some(url) = &self.ut_type_reference_url { + type_dict.insert( + "UTTypeReferenceURL".into(), + Value::String(url.resolve(placeholders)), + ); + } + + let mut tag_spec = plist::Dictionary::new(); + for (k, v) in &self.ut_type_tag_specification { + tag_spec.insert( + k.resolve(placeholders), + Value::Array( + v.iter() + .map(|s| Value::String(s.resolve(placeholders))) + .collect(), + ), + ); + } + + type_dict.insert("UTTypeTagSpecification".into(), Value::Dictionary(tag_spec)); + Value::Dictionary(type_dict) + } +} + impl MacOSMenu { pub fn new( prefix: &Path, @@ -87,8 +139,7 @@ impl MacOSMenu { ) -> Self { let name = command .name - .resolve(crate::schema::Environment::Base, placeholders) - .to_string(); + .resolve(crate::schema::Environment::Base, placeholders); let bundle_name = format!("{name}.app"); let directories = Directories::new(menu_mode, &bundle_name); @@ -215,19 +266,24 @@ impl MacOSMenu { // This one is _not_ part of the schema, so we just set it pl.insert("CFBundleExecutable".into(), Value::String(slugname.clone())); - pl.insert( - "CFBundleGetInfoString".into(), - Value::String(format!("{slugname}-1.0.0")), - ); pl.insert( "CFBundleIdentifier".into(), Value::String(format!("com.{slugname}")), ); pl.insert("CFBundlePackageType".into(), Value::String("APPL".into())); - pl.insert("CFBundleVersion".into(), Value::String("1.0.0".into())); + + let cf_bundle_version = resolve(&self.item.cf_bundle_version, &self.placeholders, "1.0.0"); + pl.insert( + "CFBundleVersion".into(), + Value::String(cf_bundle_version.clone()), + ); + pl.insert( + "CFBundleGetInfoString".into(), + Value::String(format!("{slugname}-{cf_bundle_version}")), + ); pl.insert( "CFBundleShortVersionString".into(), - Value::String("1.0.0".into()), + Value::String(cf_bundle_version), ); if let Some(icon) = &self.command.icon { @@ -301,73 +357,34 @@ impl MacOSMenu { ); } - if let Some(supports) = self.item.ns_supports_automatic_graphics_switching { + // if let Some(supports) = self.item.ns_supports_automatic_graphics_switching { + // pl.insert( + // "NSSupportsAutomaticGraphicsSwitching".into(), + // Value::Boolean(supports), + // ); + // } + + if let Some(ut_exported_type_declarations) = &self.item.ut_exported_type_declarations { + let mut type_array = Vec::new(); + for ut_type in ut_exported_type_declarations { + type_array.push(ut_type.to_plist(&self.placeholders)); + } pl.insert( - "NSSupportsAutomaticGraphicsSwitching".into(), - Value::Boolean(supports), + "UTExportedTypeDeclarations".into(), + Value::Array(type_array), ); } - self.item - .ut_exported_type_declarations - .as_ref() - .map(|_types| { - // let mut type_array = Vec::new(); - // for t in types { - // let mut type_dict = plist::Dictionary::new(); - // type_dict.insert("UTTypeConformsTo".into(), - // Value::Array(t.ut_type_conforms_to.iter().map(|s| - // Value::String(s.clone())).collect())); - // type_dict.insert("UTTypeDescription".into(), - // Value::String(t.ut_type_description.clone(). - // unwrap_or_default())); type_dict.insert(" - // UTTypeIconFile".into(), - // Value::String(t.ut_type_icon_file.clone(). - // unwrap_or_default())); type_dict.insert(" - // UTTypeIdentifier".into(), - // Value::String(t.ut_type_identifier.clone())); - // type_dict.insert("UTTypeReferenceURL".into(), - // Value::String(t.ut_type_reference_url.clone(). - // unwrap_or_default())); let mut tag_spec = - // plist::Dictionary::new(); for (k, v) in - // &t.ut_type_tag_specification { - // tag_spec.insert(k.clone(), - // Value::Array(v.iter().map(|s| - // Value::String(s.clone())).collect())); } - // type_dict.insert("UTTypeTagSpecification".into(), - // Value::Dictionary(tag_spec)); type_array. - // push(Value::Dictionary(type_dict)); } - // pl.insert("UTExportedTypeDeclarations".into(), - // Value::Array(type_array)); - }); - - // self.item - // .ut_imported_type_declarations - // .as_ref() - // .map(|_types| { - // // let mut type_array = Vec::new(); - // // for t in types { - // // let mut type_dict = plist::Dictionary::new(); - // // type_dict.insert("UTTypeConformsTo".into(), - // Value::Array(t.ut_type_conforms_to.iter().map(|s| - // Value::String(s.clone())).collect())); // - // type_dict.insert("UTTypeDescription".into(), - // Value::String(t.ut_type_description.clone().unwrap_or_default())); - // // type_dict.insert("UTTypeIconFile".into(), - // Value::String(t.ut_type_icon_file.clone().unwrap_or_default())); - // // type_dict.insert("UTTypeIdentifier".into(), - // Value::String(t.ut_type_identifier.clone())); // - // type_dict.insert("UTTypeReferenceURL".into(), - // Value::String(t.ut_type_reference_url.clone().unwrap_or_default())); - // // let mut tag_spec = plist::Dictionary::new(); - // // for (k, v) in &t.ut_type_tag_specification { - // // tag_spec.insert(k.clone(), Value::Array(v.iter().map(|s| - // Value::String(s.clone())).collect())); // } - // // type_dict.insert("UTTypeTagSpecification".into(), - // Value::Dictionary(tag_spec)); // - // type_array.push(Value::Dictionary(type_dict)); // } - // // pl.insert("UTImportedTypeDeclarations".into(), - // Value::Array(type_array)); }); + if let Some(ut_imported_type_declarations) = &self.item.ut_imported_type_declarations { + let mut type_array = Vec::new(); + for ut_type in ut_imported_type_declarations { + type_array.push(ut_type.to_plist(&self.placeholders)); + } + pl.insert( + "UTImportedTypeDeclarations".into(), + Value::Array(type_array), + ); + } println!( "Writing plist to {}", diff --git a/crates/rattler_menuinst/src/schema.rs b/crates/rattler_menuinst/src/schema.rs index 5e5e4d856..99ba70b46 100644 --- a/crates/rattler_menuinst/src/schema.rs +++ b/crates/rattler_menuinst/src/schema.rs @@ -79,122 +79,263 @@ pub struct Windows { app_user_model_id: Option, } +/// Linux-specific instructions. +/// Check the `Desktop entry specification ` for more details. #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(deny_unknown_fields)] pub struct Linux { + /// Categories in which the entry should be shown in a menu. + /// See 'Registered categories' in the `Menu Spec `. #[serde(rename = "Categories")] pub categories: Option>, + + /// A boolean value specifying if D-Bus activation is supported for this application. #[serde(rename = "DBusActivatable")] pub dbus_activatable: Option, + + /// Generic name of the application; e.g. if the name is 'conda', + /// this would be 'Package Manager'. #[serde(rename = "GenericName")] pub generic_name: Option, + + /// Disable shortcut, signaling a missing resource. #[serde(rename = "Hidden")] pub hidden: Option, + + /// List of supported interfaces. See 'Interfaces' in + /// `Desktop Entry Spec `. #[serde(rename = "Implements")] pub implements: Option>, + + /// Additional terms to describe this shortcut to aid in searching. #[serde(rename = "Keywords")] pub keywords: Option>, + + /// The MIME type(s) supported by this application. Note this includes file + /// types and URL protocols. For URL protocols, use + /// `x-scheme-handler/your-protocol-here`. For example, if you want to + /// register `menuinst:`, you would include `x-scheme-handler/menuinst`. #[serde(rename = "MimeType")] pub mime_type: Option>, + + /// Do not show this item in the menu. Useful to associate MIME types + /// and other registrations, without having an actual clickable item. + /// Not to be confused with 'Hidden'. #[serde(rename = "NoDisplay")] pub no_display: Option, + + /// Desktop environments that should NOT display this item. + /// It'll check against `$XDG_CURRENT_DESKTOP`." #[serde(rename = "NotShowIn")] pub not_show_in: Option>, + + /// Desktop environments that should display this item. + /// It'll check against `$XDG_CURRENT_DESKTOP`. #[serde(rename = "OnlyShowIn")] pub only_show_in: Option>, + + /// Hint that the app prefers to be run on a more powerful discrete GPU if available. #[serde(rename = "PrefersNonDefaultGPU")] pub prefers_non_default_gpu: Option, + + /// Advanced. See `Startup Notification spec `. #[serde(rename = "StartupNotify")] pub startup_notify: Option, + + /// Advanced. See `Startup Notification spec `. #[serde(rename = "StartupWMClass")] pub startup_wm_class: Option, + + /// Filename or absolute path to an executable file on disk used to + /// determine if the program is actually installed and can be run. If the test + /// fails, the shortcut might be ignored / hidden. #[serde(rename = "TryExec")] pub try_exec: Option, + + /// Map of custom MIME types to their corresponding glob patterns (e.g. `*.txt`). + /// Only needed if you define custom MIME types in `MimeType`. pub glob_patterns: Option>, } +/// Describes a URL scheme associated with the app. #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(deny_unknown_fields)] pub struct CFBundleURLTypesModel { + /// This key specifies the app's role with respect to the URL. + /// Can be one of `Editor`, `Viewer`, `Shell`, `None` #[serde(rename = "CFBundleTypeRole")] cf_bundle_type_role: Option, + + /// URL schemes / protocols handled by this type (e.g. 'mailto'). #[serde(rename = "CFBundleURLSchemes")] cf_bundle_url_schemes: Vec, + + /// Abstract name for this URL type. Uniqueness recommended. #[serde(rename = "CFBundleURLName")] cf_bundle_url_name: Option, + + /// Name of the icon image file (minus the .icns extension). #[serde(rename = "CFBundleURLIconFile")] cf_bundle_url_icon_file: Option, } +/// Describes a document type associated with the app. #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(deny_unknown_fields)] pub struct CFBundleDocumentTypesModel { + /// Name of the icon image file (minus the .icns extension). #[serde(rename = "CFBundleTypeIconFile")] cf_bundle_type_icon_file: Option, + + /// Abstract name for this document type. Uniqueness recommended. #[serde(rename = "CFBundleTypeName")] cf_bundle_type_name: PlaceholderString, + + /// This key specifies the app's role with respect to the type. #[serde(rename = "CFBundleTypeRole")] cf_bundle_type_role: Option, + + /// List of UTI (Uniform Type Identifier) strings defining supported file types. + /// + /// # Examples + /// + /// For PNG files, use `public.png` + /// + /// # Details + /// + /// - System-defined UTIs can be found in the [UTI Reference](https://developer.apple.com/library/archive/documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html) + /// - Custom UTIs can be defined via 'UTExportedTypeDeclarations' + /// - UTIs from other apps must be imported via 'UTImportedTypeDeclarations' + /// + /// For more information, see the [Fun with UTIs](https://www.cocoanetics.com/2012/09/fun-with-uti/) guide. #[serde(rename = "LSItemContentTypes")] ls_item_content_types: Vec, + + /// Determines how Launch Services ranks this app among the apps + /// that declare themselves editors or viewers of files of this type. + /// Can be one of `Owner`, `Default` or `Alternate` #[serde(rename = "LSHandlerRank")] - ls_handler_rank: PlaceholderString, + ls_handler_rank: String, // TODO implement validation } +/// A model representing a Uniform Type Identifier (UTI) declaration. #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(deny_unknown_fields)] pub struct UTTypeDeclarationModel { + /// The Uniform Type Identifier types that this type conforms to. #[serde(rename = "UTTypeConformsTo")] - ut_type_conforms_to: Vec, + pub ut_type_conforms_to: Vec, + + /// A description for this type. #[serde(rename = "UTTypeDescription")] - ut_type_description: Option, + pub ut_type_description: Option, + + /// The bundle icon resource to associate with this type. #[serde(rename = "UTTypeIconFile")] - ut_type_icon_file: Option, + pub ut_type_icon_file: Option, + + /// The Uniform Type Identifier to assign to this type. #[serde(rename = "UTTypeIdentifier")] - ut_type_identifier: PlaceholderString, + pub ut_type_identifier: PlaceholderString, + + /// The webpage for a reference document that describes this type. #[serde(rename = "UTTypeReferenceURL")] - ut_type_reference_url: Option, + pub ut_type_reference_url: Option, + + /// A dictionary defining one or more equivalent type identifiers. #[serde(rename = "UTTypeTagSpecification")] - ut_type_tag_specification: HashMap>, + pub ut_type_tag_specification: HashMap>, } +/// macOS specific fields in the menuinst. For more information on the keys, read the following URLs +/// +/// - `CF*` keys: see `Core Foundation Keys ` +/// - `LS*` keys: see `Launch Services Keys ` +/// - `entitlements`: see `entitlements docs ` #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(deny_unknown_fields)] pub struct MacOS { + /// Display name of the bundle, visible to users and used by Siri. If + /// not provided, 'menuinst' will use the 'name' field. #[serde(rename = "CFBundleDisplayName")] pub cf_bundle_display_name: Option, + + /// Unique identifier for the shortcut. Typically uses a reverse-DNS format. + /// If not provided, a identifier will be generated from the 'name' field. #[serde(rename = "CFBundleIdentifier")] pub cf_bundle_identifier: Option, + + /// Short name of the bundle. May be used if `CFBundleDisplayName` is + /// absent. If not provided, 'menuinst' will generate one from the 'name' field. #[serde(rename = "CFBundleName")] pub cf_bundle_name: Option, + + /// Suitable replacement for text-to-speech operations on the app. + /// For example, 'my app one two three' instead of 'MyApp123'. #[serde(rename = "CFBundleSpokenName")] pub cf_bundle_spoken_name: Option, + + /// Build version number for the bundle. In the context of 'menuinst' + /// this can be used to signal a new version of the menu item for the same + /// application version. #[serde(rename = "CFBundleVersion")] - pub cf_bundle_version: Option, + pub cf_bundle_version: Option, + + /// URL types supported by this app. Requires setting `event_handler` too. + /// Note this feature requires macOS 10.15+. #[serde(rename = "CFBundleURLTypes")] pub cf_bundle_url_types: Option>, + + /// Document types supported by this app. Requires setting `event_handler` too. + /// Requires macOS 10.15+. #[serde(rename = "CFBundleDocumentTypes")] pub cf_bundle_document_types: Option>, + + /// The App Store uses this string to determine the appropriate categorization. #[serde(rename = "LSApplicationCategoryType")] pub ls_application_category_type: Option, + + /// Specifies whether this app runs only in the background #[serde(rename = "LSBackgroundOnly")] pub ls_background_only: Option, + + /// List of key-value pairs used to define environment variables. #[serde(rename = "LSEnvironment")] pub ls_environment: Option>, + + /// Minimum version of macOS required for this app to run, as `x.y.z`. + /// For example, for macOS v10.4 and later, use `10.4.0`. (TODO: implement proper parsing) #[serde(rename = "LSMinimumSystemVersion")] pub ls_minimum_system_version: Option, + + /// Whether an app is prohibited from running simultaneously in multiple user sessions. #[serde(rename = "LSMultipleInstancesProhibited")] pub ls_multiple_instances_prohibited: Option, + + /// If true, prevent a universal binary from being run under + /// Rosetta emulation on an Intel-based Mac. #[serde(rename = "LSRequiresNativeExecution")] pub ls_requires_native_execution: Option, - #[serde(rename = "NSSupportsAutomaticGraphicsSwitching")] - pub ns_supports_automatic_graphics_switching: Option, + + /// The uniform type identifiers owned and exported by the app. #[serde(rename = "UTExportedTypeDeclarations")] pub ut_exported_type_declarations: Option>, + + /// The uniform type identifiers inherently supported, but not owned, by the app. #[serde(rename = "UTImportedTypeDeclarations")] pub ut_imported_type_declarations: Option>, + + /// List of permissions to request for the launched application. + /// See `the entitlements docs ` + /// for a full list of possible values. pub entitlements: Option>, + + /// Paths that should be symlinked into the shortcut app bundle. + /// It takes a mapping of source to destination paths. Destination paths must be + /// relative. Placeholder `{{ MENU_ITEM_LOCATION }}` can be useful. pub link_in_bundle: Option>, + + /// Required shell script logic to handle opened URL payloads. pub event_handler: Option, } From f830f2df1a57455c30ddb4fe9c0399da40cba720 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Mon, 11 Nov 2024 19:26:13 +0100 Subject: [PATCH 033/132] register mime types on linux --- crates/rattler_menuinst/src/linux.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index ad6573490..6c9c38437 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -256,6 +256,7 @@ impl LinuxMenu { fn install(&self) -> Result<(), MenuInstError> { self.pre_create()?; self.create_desktop_entry()?; + self.maybe_register_mime_types(true)?; Self::update_desktop_database()?; Ok(()) } From 4a8d70dc373808ad22156abf1cbbb2e6c6a23946 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Mon, 11 Nov 2024 20:26:17 +0100 Subject: [PATCH 034/132] write out the entire plist file --- crates/rattler_menuinst/src/linux.rs | 8 ++- crates/rattler_menuinst/src/macos.rs | 91 +++++++++++++++++++++++++-- crates/rattler_menuinst/src/schema.rs | 31 ++++----- 3 files changed, 109 insertions(+), 21 deletions(-) diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index 6c9c38437..e713b23a9 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -262,6 +262,10 @@ impl LinuxMenu { } fn remove(&self) -> Result<(), MenuInstError> { + let paths = self.paths(); + for path in paths { + fs::remove_file(path)?; + } Ok(()) } @@ -296,9 +300,9 @@ impl LinuxMenu { } if register { - if let Some(xdg_mime) = which::which("xdg-mime").ok() { + if let Ok(xdg_mime) = which::which("xdg-mime") { let mut command = Command::new(xdg_mime); - command.arg("default").arg(&self.location()); + command.arg("default").arg(self.location()); for mime_type in mime_types { command.arg(mime_type); } diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index 3e852c2eb..5af39005c 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -17,7 +17,10 @@ use rattler_shell::{ use crate::{ render::{resolve, BaseMenuItemPlaceholders, MenuItemPlaceholders}, - schema::{MacOS, MenuItemCommand, UTTypeDeclarationModel}, + schema::{ + CFBundleDocumentTypesModel, CFBundleURLTypesModel, MacOS, MenuItemCommand, + UTTypeDeclarationModel, + }, slugify, utils, MenuInstError, MenuMode, }; @@ -129,6 +132,78 @@ impl UTTypeDeclarationModel { } } +impl CFBundleDocumentTypesModel { + fn to_plist(&self, placeholders: &MenuItemPlaceholders) -> Value { + let mut type_dict = plist::Dictionary::new(); + type_dict.insert( + "CFBundleTypeName".into(), + Value::String(self.cf_bundle_type_name.resolve(placeholders)), + ); + + if let Some(icon) = &self.cf_bundle_type_icon_file { + type_dict.insert( + "CFBundleTypeIconFile".into(), + Value::String(icon.resolve(placeholders)), + ); + } + + if let Some(role) = &self.cf_bundle_type_role { + type_dict.insert("CFBundleTypeRole".into(), Value::String(role.clone())); + } + + type_dict.insert( + "LSItemContentType".into(), + Value::Array( + self.ls_item_content_types + .iter() + .map(|s| s.resolve(placeholders).into()) + .collect(), + ), + ); + + type_dict.insert( + "LSHandlerRank".into(), + Value::String(self.ls_handler_rank.clone()), + ); + + Value::Dictionary(type_dict) + } +} + +impl CFBundleURLTypesModel { + fn to_plist(&self, placeholders: &MenuItemPlaceholders) -> Value { + let mut type_dict = plist::Dictionary::new(); + + if let Some(role) = self.cf_bundle_type_role.clone() { + type_dict.insert("CFBundleTypeRole".into(), role.into()); + } + + type_dict.insert( + "CFBundleURLSchemes".into(), + Value::Array( + self.cf_bundle_url_schemes + .iter() + .map(|s| s.resolve(placeholders).into()) + .collect(), + ), + ); + + type_dict.insert( + "CFBundleURLName".into(), + Value::String(self.cf_bundle_url_name.resolve(placeholders)), + ); + + if let Some(icon) = &self.cf_bundle_url_icon_file { + type_dict.insert( + "CFBundleURLIconFile".into(), + Value::String(icon.resolve(placeholders)), + ); + } + + Value::Dictionary(type_dict) + } +} + impl MacOSMenu { pub fn new( prefix: &Path, @@ -206,21 +281,20 @@ impl MacOSMenu { } pub fn install_icon(&self) -> Result<(), MenuInstError> { - println!("Installing icon"); if let Some(icon) = self.command.icon.as_ref() { let icon = PathBuf::from(icon.resolve(&self.placeholders)); let icon_name = icon.file_name().expect("Failed to get icon name"); let dest = self.directories.resources().join(icon_name); fs::copy(&icon, &dest)?; - println!("Installed icon to {}", dest.display()); + tracing::info!("Installed icon to {}", dest.display()); if self.needs_appkit_launcher() { let dest = self.directories.nested_resources().join(icon_name); fs::copy(&icon, dest)?; } } else { - println!("No icon to install"); + tracing::info!("No icon to install"); } Ok(()) @@ -249,6 +323,7 @@ impl MacOSMenu { let slugname = slugify(&name); let shortname = if slugname.len() > 16 { // let hashed = format!("{:x}", Sha256::digest(slugname.as_bytes())); + // TODO let hashed = "123456"; format!("{}{}", &slugname[..10], &hashed[..6]) } else { @@ -298,6 +373,14 @@ impl MacOSMenu { } } + if let Some(cf_bundle_types_model) = &self.item.cf_bundle_document_types { + let mut types_array = Vec::new(); + for cf_bundle_type in cf_bundle_types_model { + types_array.push(cf_bundle_type.to_plist(&self.placeholders)); + } + pl.insert("CFBundleDocumentTypes".into(), Value::Array(types_array)); + } + if self.needs_appkit_launcher() { println!( "Writing plist to {}", diff --git a/crates/rattler_menuinst/src/schema.rs b/crates/rattler_menuinst/src/schema.rs index 99ba70b46..ba1dccbf5 100644 --- a/crates/rattler_menuinst/src/schema.rs +++ b/crates/rattler_menuinst/src/schema.rs @@ -164,36 +164,37 @@ pub struct CFBundleURLTypesModel { /// This key specifies the app's role with respect to the URL. /// Can be one of `Editor`, `Viewer`, `Shell`, `None` #[serde(rename = "CFBundleTypeRole")] - cf_bundle_type_role: Option, + pub cf_bundle_type_role: Option, /// URL schemes / protocols handled by this type (e.g. 'mailto'). #[serde(rename = "CFBundleURLSchemes")] - cf_bundle_url_schemes: Vec, + pub cf_bundle_url_schemes: Vec, /// Abstract name for this URL type. Uniqueness recommended. #[serde(rename = "CFBundleURLName")] - cf_bundle_url_name: Option, + pub cf_bundle_url_name: PlaceholderString, /// Name of the icon image file (minus the .icns extension). #[serde(rename = "CFBundleURLIconFile")] - cf_bundle_url_icon_file: Option, + pub cf_bundle_url_icon_file: Option, } /// Describes a document type associated with the app. #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(deny_unknown_fields)] pub struct CFBundleDocumentTypesModel { - /// Name of the icon image file (minus the .icns extension). - #[serde(rename = "CFBundleTypeIconFile")] - cf_bundle_type_icon_file: Option, - /// Abstract name for this document type. Uniqueness recommended. #[serde(rename = "CFBundleTypeName")] - cf_bundle_type_name: PlaceholderString, + pub cf_bundle_type_name: PlaceholderString, + + /// Name of the icon image file (minus the .icns extension). + #[serde(rename = "CFBundleTypeIconFile")] + pub cf_bundle_type_icon_file: Option, /// This key specifies the app's role with respect to the type. + /// Can be one of `Editor`, `Viewer`, `Shell`, `None` #[serde(rename = "CFBundleTypeRole")] - cf_bundle_type_role: Option, + pub cf_bundle_type_role: Option, /// List of UTI (Uniform Type Identifier) strings defining supported file types. /// @@ -204,18 +205,18 @@ pub struct CFBundleDocumentTypesModel { /// # Details /// /// - System-defined UTIs can be found in the [UTI Reference](https://developer.apple.com/library/archive/documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html) - /// - Custom UTIs can be defined via 'UTExportedTypeDeclarations' - /// - UTIs from other apps must be imported via 'UTImportedTypeDeclarations' + /// - Custom UTIs can be defined via `UTExportedTypeDeclarations` + /// - UTIs from other apps must be imported via `UTImportedTypeDeclarations` /// /// For more information, see the [Fun with UTIs](https://www.cocoanetics.com/2012/09/fun-with-uti/) guide. #[serde(rename = "LSItemContentTypes")] - ls_item_content_types: Vec, + pub ls_item_content_types: Vec, /// Determines how Launch Services ranks this app among the apps /// that declare themselves editors or viewers of files of this type. /// Can be one of `Owner`, `Default` or `Alternate` #[serde(rename = "LSHandlerRank")] - ls_handler_rank: String, // TODO implement validation + pub ls_handler_rank: String, // TODO implement validation } /// A model representing a Uniform Type Identifier (UTI) declaration. @@ -271,7 +272,7 @@ pub struct MacOS { pub cf_bundle_name: Option, /// Suitable replacement for text-to-speech operations on the app. - /// For example, 'my app one two three' instead of 'MyApp123'. + /// For example, "my app one two three" instead of "MyApp123". #[serde(rename = "CFBundleSpokenName")] pub cf_bundle_spoken_name: Option, From d2e16d2a41eddc9d6c98f5e418a48e661c917a3c Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Mon, 11 Nov 2024 20:56:53 +0100 Subject: [PATCH 035/132] fix tests --- crates/rattler_menuinst/src/lib.rs | 6 +- crates/rattler_menuinst/src/schema.rs | 143 ++- ...t__schema__test__deserialize_gnuradio.snap | 68 +- ...nuinst__schema__test__deserialize_grx.snap | 148 ++- ...nuinst__schema__test__deserialize_mne.snap | 1087 ++++++++++------- ...nst__schema__test__deserialize_spyder.snap | 709 +++++++---- 6 files changed, 1397 insertions(+), 764 deletions(-) diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index 176a59e5e..fda0fd50c 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -105,9 +105,9 @@ pub mod test { #[test] fn test_install_menu_item() { - // if std::env::var("INSTALL_MENU_ITEM").is_err() { - // return; - // } + if std::env::var("INSTALL_MENU_ITEM").is_err() { + return; + } println!("Running test_install_menu_item"); let test_data = crate::test::test_data(); let schema_path = diff --git a/crates/rattler_menuinst/src/schema.rs b/crates/rattler_menuinst/src/schema.rs index ba1dccbf5..ea69c7685 100644 --- a/crates/rattler_menuinst/src/schema.rs +++ b/crates/rattler_menuinst/src/schema.rs @@ -11,17 +11,59 @@ pub struct MenuItemNameDict { target_environment_is_not_base: Option, } +/// A platform-specific menu item configuration. +/// +/// This is equivalent to `MenuItem` but without `platforms` field and all fields are optional. +/// All fields default to `None`. #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(deny_unknown_fields)] pub struct BasePlatformSpecific { + /// The name of the menu item. + /// + /// Must be at least 1 character long. pub name: Option, + + /// A longer description of the menu item. + /// + /// Displayed in popup messages. pub description: Option, + + /// Path to the file representing or containing the icon. + /// + /// Must be at least 1 character long. pub icon: Option, + + /// Command to run with the menu item. + /// + /// Represented as a list of strings where each string is an argument. + /// Must contain at least one item. pub command: Option>, + + /// Working directory for the running process. + /// + /// Defaults to user directory on each platform. + /// Must be at least 1 character long. pub working_dir: Option, + + /// Logic to run before the command is executed. + /// + /// Runs before the env is activated, if applicable. + /// Should be simple, preferably single-line. pub precommand: Option, + + /// Logic to run before the shortcut is created. + /// + /// Should be simple, preferably single-line. pub precreate: Option, + + /// Whether to activate the target environment before running `command`. pub activate: Option, + + /// Whether to run the program in a terminal/console. + /// + /// ### Platform-specific behavior + /// - Windows: Only has an effect if `activate` is true + /// - MacOS: The application will ignore command-line arguments pub terminal: Option, } @@ -68,15 +110,50 @@ pub enum Environment { NotBase, } +/// Windows-specific instructions for menu item configuration. +/// +/// Allows overriding global keys for Windows-specific behavior. #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(deny_unknown_fields)] pub struct Windows { - desktop: Option, - quicklaunch: Option, - terminal_profile: Option, - url_protocols: Option>, - file_extensions: Option>, - app_user_model_id: Option, + /// Whether to create a desktop icon in addition to the Start Menu item. + /// + /// Defaults to `true` in the original implementation. + pub desktop: Option, + + /// Whether to create a quick launch icon in addition to the Start Menu item. + /// + /// Defaults to `true` in the original implementation. + pub quicklaunch: Option, + + /// Windows Terminal profile configuration. + pub terminal_profile: Option, + + /// URL protocols that will be associated with this program. + /// + /// Each protocol must contain no whitespace characters. + pub url_protocols: Option>, + + /// File extensions that will be associated with this program. + /// + /// Each extension must start with a dot and contain no whitespace. + pub file_extensions: Option>, + + /// Application User Model ID for Windows 7 and above. + /// + /// Used to associate processes, files and windows with a particular application. + /// Required when shortcut produces duplicated icons. + /// + /// # Format + /// - Must contain at least two segments separated by dots + /// - Maximum length of 128 characters + /// - No whitespace allowed + /// + /// # Default + /// If not set, defaults to `Menuinst.` + /// + /// For more information, see [Microsoft's AppUserModelID documentation](https://learn.microsoft.com/en-us/windows/win32/shell/appids#how-to-form-an-application-defined-appusermodelid) + pub app_user_model_id: Option, } /// Linux-specific instructions. @@ -356,21 +433,65 @@ pub struct MenuItem { pub platforms: Platforms, } +/// Instructions to create a menu item across operating systems. #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(deny_unknown_fields)] pub struct MenuItemCommand { + /// The name of the menu item. + /// + /// Must be at least 1 character long. pub name: NameField, + + /// A longer description of the menu item. + /// + /// Displayed in popup messages. pub description: PlaceholderString, + + /// Command to run with the menu item. + /// + /// Represented as a list of strings where each string is an argument. + /// Must contain at least one item. pub command: Vec, + + /// Path to the file representing or containing the icon. + /// + /// Must be at least 1 character long when provided. pub icon: Option, + + /// Logic to run before the command is executed. + /// + /// Should be simple, preferably single-line. + /// Runs before the environment is activated, if applicable. pub precommand: Option, + + /// Logic to run before the shortcut is created. + /// + /// Should be simple, preferably single-line. pub precreate: Option, + + /// Working directory for the running process. + /// + /// Defaults to user directory on each platform. + /// Must be at least 1 character long when provided. pub working_dir: Option, + + /// Whether to activate the target environment before running `command`. + /// + /// Defaults to `true` in the original implementation. pub activate: Option, + + /// Whether to run the program in a terminal/console. + /// + /// Defaults to `false` in the original implementation. + /// + /// # Platform-specific behavior + /// - Windows: Only has an effect if `activate` is true + /// - MacOS: The application will ignore command-line arguments pub terminal: Option, } impl MenuItemCommand { + /// Merge the generic `MenuItemCommand` with a platform-specific `BasePlatformSpecific`. pub fn merge(&self, platform: BasePlatformSpecific) -> MenuItemCommand { MenuItemCommand { name: platform.name.unwrap_or_else(|| self.name.clone()), @@ -388,14 +509,22 @@ impl MenuItemCommand { } } +/// Metadata required to create menu items across operating systems with `menuinst` #[derive(Serialize, Deserialize, Debug)] #[serde(deny_unknown_fields)] pub struct MenuInstSchema { + /// Version of the menuinst schema. #[serde(rename = "$id")] pub id: String, + + /// Standard of the JSON schema we adhere to. #[serde(rename = "$schema")] pub schema: String, + + /// Name for the category containing the items specified in `menu_items`. pub menu_name: String, + + /// List of menu entries to create across main desktop systems. pub menu_items: Vec, } @@ -456,7 +585,7 @@ mod test { command .name .resolve(super::Environment::Base, &placeholders), - "Spyder 6 ({{ DISTRIBUTION_NAME }})" + "Spyder 6 (empty)" ); // let foo = menu_0.platforms.osx.as_ref().unwrap().base. diff --git a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_gnuradio.snap b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_gnuradio.snap index 9f6ef931c..c271cb86d 100644 --- a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_gnuradio.snap +++ b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_gnuradio.snap @@ -8,45 +8,59 @@ MenuInstSchema { menu_name: "{{ DISTRIBUTION_NAME }}", menu_items: [ MenuItem { - name: "GNU Radio Companion", - description: "Flowgraph builder for GNU Radio", - command: [ - "{{ BIN_DIR }}/gnuradio-companion", - ], - icon: Some( - "{{ MENU_DIR }}/grc.{{ ICON_EXT }}", - ), - precommand: None, - precreate: None, - working_dir: None, - activate: None, - terminal: None, + command: MenuItemCommand { + name: Simple( + PlaceholderString( + "GNU Radio Companion", + ), + ), + description: PlaceholderString( + "Flowgraph builder for GNU Radio", + ), + command: [ + PlaceholderString( + "{{ BIN_DIR }}/gnuradio-companion", + ), + ], + icon: Some( + PlaceholderString( + "{{ MENU_DIR }}/grc.{{ ICON_EXT }}", + ), + ), + precommand: None, + precreate: None, + working_dir: None, + activate: None, + terminal: None, + }, platforms: Platforms { linux: None, osx: None, win: Some( - Windows { + Platform { base: BasePlatformSpecific { - name: "", - description: "", + name: None, + description: None, icon: None, - command: [], + command: None, working_dir: None, precommand: None, precreate: None, activate: None, terminal: None, }, - desktop: Some( - false, - ), - quicklaunch: Some( - false, - ), - terminal_profile: None, - url_protocols: None, - file_extensions: None, - app_user_model_id: None, + specific: Windows { + desktop: Some( + false, + ), + quicklaunch: Some( + false, + ), + terminal_profile: None, + url_protocols: None, + file_extensions: None, + app_user_model_id: None, + }, }, ), }, diff --git a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_grx.snap b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_grx.snap index 42767d3c6..85ff515a1 100644 --- a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_grx.snap +++ b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_grx.snap @@ -8,92 +8,126 @@ MenuInstSchema { menu_name: "{{ DISTRIBUTION_NAME }}", menu_items: [ MenuItem { - name: "gqrx", - description: "Software defined radio", - command: [ - "{{ PREFIX }}/Library/bin/gqrx.exe", - "--edit", - ], - icon: Some( - "{{ MENU_DIR }}/gqrx.{{ ICON_EXT }}", - ), - precommand: None, - precreate: None, - working_dir: None, - activate: None, - terminal: None, + command: MenuItemCommand { + name: Simple( + PlaceholderString( + "gqrx", + ), + ), + description: PlaceholderString( + "Software defined radio", + ), + command: [ + PlaceholderString( + "{{ PREFIX }}/Library/bin/gqrx.exe", + ), + PlaceholderString( + "--edit", + ), + ], + icon: Some( + PlaceholderString( + "{{ MENU_DIR }}/gqrx.{{ ICON_EXT }}", + ), + ), + precommand: None, + precreate: None, + working_dir: None, + activate: None, + terminal: None, + }, platforms: Platforms { linux: None, osx: None, win: Some( - Windows { + Platform { base: BasePlatformSpecific { - name: "", - description: "", + name: None, + description: None, icon: None, - command: [], + command: None, working_dir: None, precommand: None, precreate: None, activate: None, terminal: None, }, - desktop: Some( - false, - ), - quicklaunch: Some( - false, - ), - terminal_profile: None, - url_protocols: None, - file_extensions: None, - app_user_model_id: None, + specific: Windows { + desktop: Some( + false, + ), + quicklaunch: Some( + false, + ), + terminal_profile: None, + url_protocols: None, + file_extensions: None, + app_user_model_id: None, + }, }, ), }, }, MenuItem { - name: "gqrx [reset]", - description: "Software defined radio [reset settings]", - command: [ - "{{ PREFIX }}/Library/bin/gqrx.exe", - "--reset", - "--edit", - ], - icon: Some( - "{{ MENU_DIR }}/gqrx.{{ ICON_EXT }}", - ), - precommand: None, - precreate: None, - working_dir: None, - activate: None, - terminal: None, + command: MenuItemCommand { + name: Simple( + PlaceholderString( + "gqrx [reset]", + ), + ), + description: PlaceholderString( + "Software defined radio [reset settings]", + ), + command: [ + PlaceholderString( + "{{ PREFIX }}/Library/bin/gqrx.exe", + ), + PlaceholderString( + "--reset", + ), + PlaceholderString( + "--edit", + ), + ], + icon: Some( + PlaceholderString( + "{{ MENU_DIR }}/gqrx.{{ ICON_EXT }}", + ), + ), + precommand: None, + precreate: None, + working_dir: None, + activate: None, + terminal: None, + }, platforms: Platforms { linux: None, osx: None, win: Some( - Windows { + Platform { base: BasePlatformSpecific { - name: "", - description: "", + name: None, + description: None, icon: None, - command: [], + command: None, working_dir: None, precommand: None, precreate: None, activate: None, terminal: None, }, - desktop: Some( - false, - ), - quicklaunch: Some( - false, - ), - terminal_profile: None, - url_protocols: None, - file_extensions: None, - app_user_model_id: None, + specific: Windows { + desktop: Some( + false, + ), + quicklaunch: Some( + false, + ), + terminal_profile: None, + url_protocols: None, + file_extensions: None, + app_user_model_id: None, + }, }, ), }, diff --git a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_mne.snap b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_mne.snap index ebafa1976..899ec5997 100644 --- a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_mne.snap +++ b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_mne.snap @@ -8,629 +8,830 @@ MenuInstSchema { menu_name: "MNE-Python (__PKG_VERSION__)", menu_items: [ MenuItem { - name: "Spyder (MNE)", - description: "The Spyder development environment", - command: [ - "will be overridden in platforms section", - ], - icon: Some( - "{{ MENU_DIR }}/mne_spyder.{{ ICON_EXT }}", - ), - precommand: None, - precreate: None, - working_dir: None, - activate: Some( - true, - ), - terminal: Some( - false, - ), + command: MenuItemCommand { + name: Simple( + PlaceholderString( + "Spyder (MNE)", + ), + ), + description: PlaceholderString( + "The Spyder development environment", + ), + command: [ + PlaceholderString( + "will be overridden in platforms section", + ), + ], + icon: Some( + PlaceholderString( + "{{ MENU_DIR }}/spyder.{{ ICON_EXT }}", + ), + ), + precommand: None, + precreate: None, + working_dir: None, + activate: Some( + true, + ), + terminal: Some( + false, + ), + }, platforms: Platforms { linux: Some( - Linux { + Platform { base: BasePlatformSpecific { - name: "", - description: "", + name: None, + description: None, icon: None, - command: [ - "spyder", - ], + command: Some( + [ + PlaceholderString( + "spyder", + ), + ], + ), working_dir: None, precommand: None, precreate: None, activate: None, terminal: None, }, - categories: Some( - [ - "Science", - ], - ), - dbus_activatable: None, - generic_name: None, - hidden: None, - implements: None, - keywords: None, - mime_type: None, - no_display: None, - not_show_in: None, - only_show_in: None, - prefers_non_default_gpu: None, - startup_notify: None, - startup_wm_class: None, - try_exec: None, - glob_patterns: None, + specific: Linux { + categories: Some( + [ + PlaceholderString( + "Science", + ), + ], + ), + dbus_activatable: None, + generic_name: None, + hidden: None, + implements: None, + keywords: None, + mime_type: None, + no_display: None, + not_show_in: None, + only_show_in: None, + prefers_non_default_gpu: None, + startup_notify: None, + startup_wm_class: None, + try_exec: None, + glob_patterns: None, + }, }, ), osx: Some( - MacOS { + Platform { base: BasePlatformSpecific { - name: "", - description: "", + name: None, + description: None, icon: None, - command: [ - "spyder", - ], + command: Some( + [ + PlaceholderString( + "spyder", + ), + ], + ), working_dir: None, precommand: None, precreate: None, activate: None, terminal: None, }, - cf_bundle_display_name: Some( - "Spyder (MNE-Python __PKG_VERSION__)", - ), - cf_bundle_identifier: None, - cf_bundle_name: Some( - "Spyder (MNE-Python __PKG_VERSION__)", - ), - cf_bundle_spoken_name: None, - cf_bundle_version: Some( - "__PKG_VERSION__", - ), - cf_bundle_url_types: None, - cf_bundle_document_types: None, - ls_application_category_type: None, - ls_background_only: None, - ls_environment: None, - ls_minimum_system_version: None, - ls_multiple_instances_prohibited: None, - ls_requires_native_execution: None, - ns_supports_automatic_graphics_switching: None, - ut_exported_type_declarations: None, - ut_imported_type_declarations: None, - entitlements: None, - link_in_bundle: None, - event_handler: None, + specific: MacOS { + cf_bundle_display_name: Some( + PlaceholderString( + "Spyder (MNE-Python __PKG_VERSION__)", + ), + ), + cf_bundle_identifier: None, + cf_bundle_name: Some( + PlaceholderString( + "Spyder (MNE-Python __PKG_VERSION__)", + ), + ), + cf_bundle_spoken_name: None, + cf_bundle_version: Some( + PlaceholderString( + "__PKG_VERSION__", + ), + ), + cf_bundle_url_types: None, + cf_bundle_document_types: None, + ls_application_category_type: None, + ls_background_only: None, + ls_environment: None, + ls_minimum_system_version: None, + ls_multiple_instances_prohibited: None, + ls_requires_native_execution: None, + ut_exported_type_declarations: None, + ut_imported_type_declarations: None, + entitlements: None, + link_in_bundle: None, + event_handler: None, + }, }, ), win: Some( - Windows { + Platform { base: BasePlatformSpecific { - name: "", - description: "", + name: None, + description: None, icon: None, - command: [ - "{{ PYTHONW }}", - "{{ SCRIPTS_DIR }}\\spyder-script.py", - ], + command: Some( + [ + PlaceholderString( + "{{ PYTHONW }}", + ), + PlaceholderString( + "{{ SCRIPTS_DIR }}\\spyder-script.py", + ), + ], + ), working_dir: None, precommand: None, precreate: None, activate: None, terminal: None, }, - desktop: Some( - false, - ), - quicklaunch: None, - terminal_profile: None, - url_protocols: None, - file_extensions: None, - app_user_model_id: None, + specific: Windows { + desktop: Some( + false, + ), + quicklaunch: None, + terminal_profile: None, + url_protocols: None, + file_extensions: None, + app_user_model_id: None, + }, }, ), }, }, MenuItem { - name: "System Info (MNE)", - description: "Information on the MNE-Python runtime environment", - command: [ - "{{ PYTHON }}", - "{{ MENU_DIR }}/mne_sys_info.py", - ], - icon: Some( - "{{ MENU_DIR }}/mne_info.{{ ICON_EXT }}", - ), - precommand: None, - precreate: None, - working_dir: None, - activate: Some( - true, - ), - terminal: Some( - true, - ), + command: MenuItemCommand { + name: Simple( + PlaceholderString( + "System Info (MNE)", + ), + ), + description: PlaceholderString( + "Information on the MNE-Python runtime environment", + ), + command: [ + PlaceholderString( + "{{ PYTHON }}", + ), + PlaceholderString( + "{{ MENU_DIR }}/mne_sys_info.py", + ), + ], + icon: Some( + PlaceholderString( + "{{ MENU_DIR }}/info.{{ ICON_EXT }}", + ), + ), + precommand: None, + precreate: None, + working_dir: None, + activate: Some( + true, + ), + terminal: Some( + true, + ), + }, platforms: Platforms { linux: Some( - Linux { + Platform { base: BasePlatformSpecific { - name: "", - description: "", + name: None, + description: None, icon: None, - command: [], + command: None, working_dir: None, precommand: None, precreate: None, activate: None, terminal: None, }, - categories: Some( - [ - "Science", - ], - ), - dbus_activatable: None, - generic_name: None, - hidden: None, - implements: None, - keywords: None, - mime_type: None, - no_display: None, - not_show_in: None, - only_show_in: None, - prefers_non_default_gpu: None, - startup_notify: None, - startup_wm_class: None, - try_exec: None, - glob_patterns: None, + specific: Linux { + categories: Some( + [ + PlaceholderString( + "Science", + ), + ], + ), + dbus_activatable: None, + generic_name: None, + hidden: None, + implements: None, + keywords: None, + mime_type: None, + no_display: None, + not_show_in: None, + only_show_in: None, + prefers_non_default_gpu: None, + startup_notify: None, + startup_wm_class: None, + try_exec: None, + glob_patterns: None, + }, }, ), osx: Some( - MacOS { + Platform { base: BasePlatformSpecific { - name: "", - description: "", + name: None, + description: None, icon: None, - command: [], + command: None, working_dir: None, precommand: None, precreate: None, activate: None, terminal: None, }, - cf_bundle_display_name: Some( - "System Information (MNE-Python __PKG_VERSION__)", - ), - cf_bundle_identifier: None, - cf_bundle_name: Some( - "System Information (MNE-Python __PKG_VERSION__)", - ), - cf_bundle_spoken_name: None, - cf_bundle_version: Some( - "__PKG_VERSION__", - ), - cf_bundle_url_types: None, - cf_bundle_document_types: None, - ls_application_category_type: None, - ls_background_only: None, - ls_environment: None, - ls_minimum_system_version: None, - ls_multiple_instances_prohibited: None, - ls_requires_native_execution: None, - ns_supports_automatic_graphics_switching: None, - ut_exported_type_declarations: None, - ut_imported_type_declarations: None, - entitlements: None, - link_in_bundle: None, - event_handler: None, + specific: MacOS { + cf_bundle_display_name: Some( + PlaceholderString( + "System Information (MNE-Python __PKG_VERSION__)", + ), + ), + cf_bundle_identifier: None, + cf_bundle_name: Some( + PlaceholderString( + "System Information (MNE-Python __PKG_VERSION__)", + ), + ), + cf_bundle_spoken_name: None, + cf_bundle_version: Some( + PlaceholderString( + "__PKG_VERSION__", + ), + ), + cf_bundle_url_types: None, + cf_bundle_document_types: None, + ls_application_category_type: None, + ls_background_only: None, + ls_environment: None, + ls_minimum_system_version: None, + ls_multiple_instances_prohibited: None, + ls_requires_native_execution: None, + ut_exported_type_declarations: None, + ut_imported_type_declarations: None, + entitlements: None, + link_in_bundle: None, + event_handler: None, + }, }, ), win: Some( - Windows { + Platform { base: BasePlatformSpecific { - name: "", - description: "", + name: None, + description: None, icon: None, - command: [], + command: None, working_dir: None, precommand: None, precreate: None, activate: None, terminal: None, }, - desktop: Some( - false, - ), - quicklaunch: None, - terminal_profile: None, - url_protocols: None, - file_extensions: None, - app_user_model_id: None, + specific: Windows { + desktop: Some( + false, + ), + quicklaunch: None, + terminal_profile: None, + url_protocols: None, + file_extensions: None, + app_user_model_id: None, + }, }, ), }, }, MenuItem { - name: "Prompt (MNE)", - description: "MNE-Python console prompt", - command: [ - "will be overridden in platforms section", - ], - icon: Some( - "{{ MENU_DIR }}/mne_console.{{ ICON_EXT }}", - ), - precommand: None, - precreate: None, - working_dir: None, - activate: Some( - true, - ), - terminal: Some( - true, - ), + command: MenuItemCommand { + name: Simple( + PlaceholderString( + "Prompt (MNE)", + ), + ), + description: PlaceholderString( + "MNE-Python console prompt", + ), + command: [ + PlaceholderString( + "will be overridden in platforms section", + ), + ], + icon: Some( + PlaceholderString( + "{{ MENU_DIR }}/console.{{ ICON_EXT }}", + ), + ), + precommand: None, + precreate: None, + working_dir: None, + activate: Some( + true, + ), + terminal: Some( + true, + ), + }, platforms: Platforms { linux: Some( - Linux { + Platform { base: BasePlatformSpecific { - name: "", - description: "", + name: None, + description: None, icon: None, - command: [ - "exec", - "bash", - "--init-file", - "{{ MENU_DIR }}/mne_open_prompt.sh", - ], + command: Some( + [ + PlaceholderString( + "exec", + ), + PlaceholderString( + "bash", + ), + PlaceholderString( + "--init-file", + ), + PlaceholderString( + "{{ MENU_DIR }}/mne_open_prompt.sh", + ), + ], + ), working_dir: None, precommand: None, precreate: None, activate: None, terminal: None, }, - categories: Some( - [ - "Science", - ], - ), - dbus_activatable: None, - generic_name: None, - hidden: None, - implements: None, - keywords: None, - mime_type: None, - no_display: None, - not_show_in: None, - only_show_in: None, - prefers_non_default_gpu: None, - startup_notify: None, - startup_wm_class: None, - try_exec: None, - glob_patterns: None, + specific: Linux { + categories: Some( + [ + PlaceholderString( + "Science", + ), + ], + ), + dbus_activatable: None, + generic_name: None, + hidden: None, + implements: None, + keywords: None, + mime_type: None, + no_display: None, + not_show_in: None, + only_show_in: None, + prefers_non_default_gpu: None, + startup_notify: None, + startup_wm_class: None, + try_exec: None, + glob_patterns: None, + }, }, ), osx: Some( - MacOS { + Platform { base: BasePlatformSpecific { - name: "", - description: "", + name: None, + description: None, icon: None, - command: [ - "osascript", - "{{ MENU_DIR }}/mne_open_prompt.applescript", - ], + command: Some( + [ + PlaceholderString( + "osascript", + ), + PlaceholderString( + "{{ MENU_DIR }}/mne_open_prompt.applescript", + ), + ], + ), working_dir: None, precommand: None, precreate: None, activate: None, terminal: None, }, - cf_bundle_display_name: Some( - "Prompt (MNE-Python __PKG_VERSION__)", - ), - cf_bundle_identifier: None, - cf_bundle_name: Some( - "Prompt (MNE-Python __PKG_VERSION__)", - ), - cf_bundle_spoken_name: None, - cf_bundle_version: Some( - "__PKG_VERSION__", - ), - cf_bundle_url_types: None, - cf_bundle_document_types: None, - ls_application_category_type: None, - ls_background_only: None, - ls_environment: None, - ls_minimum_system_version: None, - ls_multiple_instances_prohibited: None, - ls_requires_native_execution: None, - ns_supports_automatic_graphics_switching: None, - ut_exported_type_declarations: None, - ut_imported_type_declarations: None, - entitlements: None, - link_in_bundle: None, - event_handler: None, + specific: MacOS { + cf_bundle_display_name: Some( + PlaceholderString( + "Prompt (MNE-Python __PKG_VERSION__)", + ), + ), + cf_bundle_identifier: None, + cf_bundle_name: Some( + PlaceholderString( + "Prompt (MNE-Python __PKG_VERSION__)", + ), + ), + cf_bundle_spoken_name: None, + cf_bundle_version: Some( + PlaceholderString( + "__PKG_VERSION__", + ), + ), + cf_bundle_url_types: None, + cf_bundle_document_types: None, + ls_application_category_type: None, + ls_background_only: None, + ls_environment: None, + ls_minimum_system_version: None, + ls_multiple_instances_prohibited: None, + ls_requires_native_execution: None, + ut_exported_type_declarations: None, + ut_imported_type_declarations: None, + entitlements: None, + link_in_bundle: None, + event_handler: None, + }, }, ), win: Some( - Windows { + Platform { base: BasePlatformSpecific { - name: "", - description: "", + name: None, + description: None, icon: None, - command: [ - "%SystemRoot%\\system32\\cmd.exe", - "/K", - "{{ MENU_DIR }}\\mne_open_prompt.bat", - ], + command: Some( + [ + PlaceholderString( + "%SystemRoot%\\system32\\cmd.exe", + ), + PlaceholderString( + "/K", + ), + PlaceholderString( + "{{ MENU_DIR }}\\mne_open_prompt.bat", + ), + ], + ), working_dir: None, precommand: None, precreate: None, activate: None, terminal: None, }, - desktop: Some( - false, - ), - quicklaunch: None, - terminal_profile: None, - url_protocols: None, - file_extensions: None, - app_user_model_id: None, + specific: Windows { + desktop: Some( + false, + ), + quicklaunch: None, + terminal_profile: None, + url_protocols: None, + file_extensions: None, + app_user_model_id: None, + }, }, ), }, }, MenuItem { - name: "Tutorials (MNE)", - description: "MNE-Python online tutorials", - command: [ - "will be overridden in platforms section", - ], - icon: Some( - "{{ MENU_DIR }}/mne_web.{{ ICON_EXT }}", - ), - precommand: None, - precreate: None, - working_dir: None, - activate: Some( - false, - ), - terminal: Some( - false, - ), + command: MenuItemCommand { + name: Simple( + PlaceholderString( + "Tutorials (MNE)", + ), + ), + description: PlaceholderString( + "MNE-Python online tutorials", + ), + command: [ + PlaceholderString( + "will be overridden in platforms section", + ), + ], + icon: Some( + PlaceholderString( + "{{ MENU_DIR }}/web.{{ ICON_EXT }}", + ), + ), + precommand: None, + precreate: None, + working_dir: None, + activate: Some( + false, + ), + terminal: Some( + false, + ), + }, platforms: Platforms { linux: Some( - Linux { + Platform { base: BasePlatformSpecific { - name: "", - description: "", + name: None, + description: None, icon: None, - command: [ - "xdg-open", - "https://mne.tools/stable/auto_tutorials/", - ], + command: Some( + [ + PlaceholderString( + "xdg-open", + ), + PlaceholderString( + "https://mne.tools/stable/auto_tutorials/", + ), + ], + ), working_dir: None, precommand: None, precreate: None, activate: None, terminal: None, }, - categories: Some( - [ - "Science", - ], - ), - dbus_activatable: None, - generic_name: None, - hidden: None, - implements: None, - keywords: None, - mime_type: None, - no_display: None, - not_show_in: None, - only_show_in: None, - prefers_non_default_gpu: None, - startup_notify: None, - startup_wm_class: None, - try_exec: None, - glob_patterns: None, + specific: Linux { + categories: Some( + [ + PlaceholderString( + "Science", + ), + ], + ), + dbus_activatable: None, + generic_name: None, + hidden: None, + implements: None, + keywords: None, + mime_type: None, + no_display: None, + not_show_in: None, + only_show_in: None, + prefers_non_default_gpu: None, + startup_notify: None, + startup_wm_class: None, + try_exec: None, + glob_patterns: None, + }, }, ), osx: Some( - MacOS { + Platform { base: BasePlatformSpecific { - name: "", - description: "", + name: None, + description: None, icon: None, - command: [ - "open", - "https://mne.tools/stable/auto_tutorials/", - ], + command: Some( + [ + PlaceholderString( + "open", + ), + PlaceholderString( + "https://mne.tools/stable/auto_tutorials/", + ), + ], + ), working_dir: None, precommand: None, precreate: None, activate: None, terminal: None, }, - cf_bundle_display_name: Some( - "Tutorials (MNE-Python __PKG_VERSION__)", - ), - cf_bundle_identifier: None, - cf_bundle_name: Some( - "Tutorials (MNE-Python __PKG_VERSION__)", - ), - cf_bundle_spoken_name: None, - cf_bundle_version: Some( - "__PKG_VERSION__", - ), - cf_bundle_url_types: None, - cf_bundle_document_types: None, - ls_application_category_type: None, - ls_background_only: None, - ls_environment: None, - ls_minimum_system_version: None, - ls_multiple_instances_prohibited: None, - ls_requires_native_execution: None, - ns_supports_automatic_graphics_switching: None, - ut_exported_type_declarations: None, - ut_imported_type_declarations: None, - entitlements: None, - link_in_bundle: None, - event_handler: None, + specific: MacOS { + cf_bundle_display_name: Some( + PlaceholderString( + "Tutorials (MNE-Python __PKG_VERSION__)", + ), + ), + cf_bundle_identifier: None, + cf_bundle_name: Some( + PlaceholderString( + "Tutorials (MNE-Python __PKG_VERSION__)", + ), + ), + cf_bundle_spoken_name: None, + cf_bundle_version: Some( + PlaceholderString( + "__PKG_VERSION__", + ), + ), + cf_bundle_url_types: None, + cf_bundle_document_types: None, + ls_application_category_type: None, + ls_background_only: None, + ls_environment: None, + ls_minimum_system_version: None, + ls_multiple_instances_prohibited: None, + ls_requires_native_execution: None, + ut_exported_type_declarations: None, + ut_imported_type_declarations: None, + entitlements: None, + link_in_bundle: None, + event_handler: None, + }, }, ), win: Some( - Windows { + Platform { base: BasePlatformSpecific { - name: "", - description: "", + name: None, + description: None, icon: None, - command: [ - "%SystemRoot%\\system32\\WindowsPowerShell\\v1.0\\powershell.exe", - "\"start https://mne.tools/stable/auto_tutorials -WindowStyle hidden\"", - ], + command: Some( + [ + PlaceholderString( + "%SystemRoot%\\system32\\WindowsPowerShell\\v1.0\\powershell.exe", + ), + PlaceholderString( + "\"start https://mne.tools/stable/auto_tutorials -WindowStyle hidden\"", + ), + ], + ), working_dir: None, precommand: None, precreate: None, activate: None, terminal: None, }, - desktop: Some( - false, - ), - quicklaunch: None, - terminal_profile: None, - url_protocols: None, - file_extensions: None, - app_user_model_id: None, + specific: Windows { + desktop: Some( + false, + ), + quicklaunch: None, + terminal_profile: None, + url_protocols: None, + file_extensions: None, + app_user_model_id: None, + }, }, ), }, }, MenuItem { - name: "User Forum (MNE)", - description: "MNE-Python forum for discussions, problem solving, and information exchange", - command: [ - "will be overridden in platforms section", - ], - icon: Some( - "{{ MENU_DIR }}/mne_forum.{{ ICON_EXT }}", - ), - precommand: None, - precreate: None, - working_dir: None, - activate: Some( - false, - ), - terminal: Some( - false, - ), + command: MenuItemCommand { + name: Simple( + PlaceholderString( + "User Forum (MNE)", + ), + ), + description: PlaceholderString( + "MNE-Python forum for discussions, problem solving, and information exchange", + ), + command: [ + PlaceholderString( + "will be overridden in platforms section", + ), + ], + icon: Some( + PlaceholderString( + "{{ MENU_DIR }}/forum.{{ ICON_EXT }}", + ), + ), + precommand: None, + precreate: None, + working_dir: None, + activate: Some( + false, + ), + terminal: Some( + false, + ), + }, platforms: Platforms { linux: Some( - Linux { + Platform { base: BasePlatformSpecific { - name: "", - description: "", + name: None, + description: None, icon: None, - command: [ - "xdg-open", - "https://mne.discourse.group", - ], + command: Some( + [ + PlaceholderString( + "xdg-open", + ), + PlaceholderString( + "https://mne.discourse.group", + ), + ], + ), working_dir: None, precommand: None, precreate: None, activate: None, terminal: None, }, - categories: Some( - [ - "Science", - ], - ), - dbus_activatable: None, - generic_name: None, - hidden: None, - implements: None, - keywords: None, - mime_type: None, - no_display: None, - not_show_in: None, - only_show_in: None, - prefers_non_default_gpu: None, - startup_notify: None, - startup_wm_class: None, - try_exec: None, - glob_patterns: None, + specific: Linux { + categories: Some( + [ + PlaceholderString( + "Science", + ), + ], + ), + dbus_activatable: None, + generic_name: None, + hidden: None, + implements: None, + keywords: None, + mime_type: None, + no_display: None, + not_show_in: None, + only_show_in: None, + prefers_non_default_gpu: None, + startup_notify: None, + startup_wm_class: None, + try_exec: None, + glob_patterns: None, + }, }, ), osx: Some( - MacOS { + Platform { base: BasePlatformSpecific { - name: "", - description: "", + name: None, + description: None, icon: None, - command: [ - "open", - "https://mne.discourse.group", - ], + command: Some( + [ + PlaceholderString( + "open", + ), + PlaceholderString( + "https://mne.discourse.group", + ), + ], + ), working_dir: None, precommand: None, precreate: None, activate: None, terminal: None, }, - cf_bundle_display_name: Some( - "Forum (MNE-Python __PKG_VERSION__)", - ), - cf_bundle_identifier: None, - cf_bundle_name: Some( - "Forum (MNE-Python __PKG_VERSION__)", - ), - cf_bundle_spoken_name: None, - cf_bundle_version: Some( - "__PKG_VERSION__", - ), - cf_bundle_url_types: None, - cf_bundle_document_types: None, - ls_application_category_type: None, - ls_background_only: None, - ls_environment: None, - ls_minimum_system_version: None, - ls_multiple_instances_prohibited: None, - ls_requires_native_execution: None, - ns_supports_automatic_graphics_switching: None, - ut_exported_type_declarations: None, - ut_imported_type_declarations: None, - entitlements: None, - link_in_bundle: None, - event_handler: None, + specific: MacOS { + cf_bundle_display_name: Some( + PlaceholderString( + "Forum (MNE-Python __PKG_VERSION__)", + ), + ), + cf_bundle_identifier: None, + cf_bundle_name: Some( + PlaceholderString( + "Forum (MNE-Python __PKG_VERSION__)", + ), + ), + cf_bundle_spoken_name: None, + cf_bundle_version: Some( + PlaceholderString( + "__PKG_VERSION__", + ), + ), + cf_bundle_url_types: None, + cf_bundle_document_types: None, + ls_application_category_type: None, + ls_background_only: None, + ls_environment: None, + ls_minimum_system_version: None, + ls_multiple_instances_prohibited: None, + ls_requires_native_execution: None, + ut_exported_type_declarations: None, + ut_imported_type_declarations: None, + entitlements: None, + link_in_bundle: None, + event_handler: None, + }, }, ), win: Some( - Windows { + Platform { base: BasePlatformSpecific { - name: "", - description: "", + name: None, + description: None, icon: None, - command: [ - "%SystemRoot%\\system32\\WindowsPowerShell\\v1.0\\powershell.exe", - "\"start https://mne.discourse.group -WindowStyle hidden\"", - ], + command: Some( + [ + PlaceholderString( + "%SystemRoot%\\system32\\WindowsPowerShell\\v1.0\\powershell.exe", + ), + PlaceholderString( + "\"start https://mne.discourse.group -WindowStyle hidden\"", + ), + ], + ), working_dir: None, precommand: None, precreate: None, activate: None, terminal: None, }, - desktop: Some( - false, - ), - quicklaunch: None, - terminal_profile: None, - url_protocols: None, - file_extensions: None, - app_user_model_id: None, + specific: Windows { + desktop: Some( + false, + ), + quicklaunch: None, + terminal_profile: None, + url_protocols: None, + file_extensions: None, + app_user_model_id: None, + }, }, ), }, diff --git a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_spyder.snap b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_spyder.snap index dca295bb3..432d09a03 100644 --- a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_spyder.snap +++ b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_spyder.snap @@ -5,273 +5,528 @@ expression: schema MenuInstSchema { id: "https://schemas.conda.io/menuinst-1.schema.json", schema: "https://json-schema.org/draft-07/schema", - menu_name: "superspyder", + menu_name: "{{ DISTRIBUTION_NAME }} spyder", menu_items: [ MenuItem { - name: Complex( - NameComplex { - target_environment_is_base: "superspyder 1.2 (base)", - target_environment_is_not_base: "superspyder 1.2 ({{ ENV_NAME }})", - }, - ), - description: "Scientific PYthon Development EnviRonment", - command: [ - "", - ], - icon: Some( - "{{ MENU_DIR }}/superspyder.{{ ICON_EXT }}", - ), - precommand: None, - precreate: None, - working_dir: None, - activate: Some( - false, - ), - terminal: Some( - false, - ), + command: MenuItemCommand { + name: Complex( + NameComplex { + target_environment_is_base: PlaceholderString( + "Spyder 6 ({{ DISTRIBUTION_NAME }})", + ), + target_environment_is_not_base: PlaceholderString( + "Spyder 6 ({{ ENV_NAME }})", + ), + }, + ), + description: PlaceholderString( + "Scientific PYthon Development EnviRonment", + ), + command: [ + PlaceholderString( + "", + ), + ], + icon: Some( + PlaceholderString( + "{{ MENU_DIR }}/spyder.{{ ICON_EXT }}", + ), + ), + precommand: None, + precreate: None, + working_dir: None, + activate: Some( + false, + ), + terminal: Some( + false, + ), + }, platforms: Platforms { linux: Some( - Linux { + Platform { base: BasePlatformSpecific { name: None, - description: "", + description: None, icon: None, - command: [ - "{{ PREFIX }}/bin/spyder", - "%F", - ], + command: Some( + [ + PlaceholderString( + "{{ PREFIX }}/bin/spyder", + ), + PlaceholderString( + "%F", + ), + ], + ), working_dir: None, precommand: None, precreate: None, activate: None, terminal: None, }, - categories: Some( - [ - "Development", - "Science", - ], - ), - dbus_activatable: None, - generic_name: None, - hidden: None, - implements: None, - keywords: None, - mime_type: Some( - [ - "text/x-python", - ], - ), - no_display: None, - not_show_in: None, - only_show_in: None, - prefers_non_default_gpu: None, - startup_notify: None, - startup_wm_class: Some( - "Spyder-__PKG_MAJOR_VER__.{{ ENV_NAME }}", - ), - try_exec: None, - glob_patterns: None, + specific: Linux { + categories: Some( + [ + PlaceholderString( + "Development", + ), + PlaceholderString( + "Science", + ), + ], + ), + dbus_activatable: None, + generic_name: None, + hidden: None, + implements: None, + keywords: None, + mime_type: Some( + [ + PlaceholderString( + "text/x-python", + ), + ], + ), + no_display: None, + not_show_in: None, + only_show_in: None, + prefers_non_default_gpu: None, + startup_notify: None, + startup_wm_class: Some( + PlaceholderString( + "Spyder-6.{{ ENV_NAME }}", + ), + ), + try_exec: None, + glob_patterns: None, + }, }, ), osx: Some( - MacOS { + Platform { base: BasePlatformSpecific { name: None, - description: "", + description: None, icon: None, - command: [ - "./python", - "{{ PREFIX }}/bin/spyder", - "$@", - ], + command: Some( + [ + PlaceholderString( + "./python", + ), + PlaceholderString( + "{{ PREFIX }}/bin/spyder", + ), + PlaceholderString( + "$@", + ), + ], + ), working_dir: None, precommand: Some( - "pushd \"$(dirname \"$0\")\" &>/dev/null", + PlaceholderString( + "pushd \"$(dirname \"$0\")\" &>/dev/null", + ), ), precreate: None, activate: None, terminal: None, }, - cf_bundle_display_name: None, - cf_bundle_identifier: Some( - "org.superspyder-ide.Superspyder-__PKG_MAJOR_VER__-__CFBID_ENV__", - ), - cf_bundle_name: Some( - "Superspyder __PKG_MAJOR_VER__", - ), - cf_bundle_spoken_name: None, - cf_bundle_version: Some( - "__PKG_VERSION__", - ), - cf_bundle_url_types: None, - cf_bundle_document_types: Some( - [ - CFBundleDocumentTypesModel { - cf_bundle_type_icon_file: Some( - "superspyder.icns", - ), - cf_bundle_type_name: "text document", - cf_bundle_type_role: Some( - "Editor", + specific: MacOS { + cf_bundle_display_name: None, + cf_bundle_identifier: Some( + PlaceholderString( + "org.spyder-ide.Spyder-6-.prefix", + ), + ), + cf_bundle_name: Some( + PlaceholderString( + "Spyder 6", + ), + ), + cf_bundle_spoken_name: None, + cf_bundle_version: Some( + PlaceholderString( + "6.0.2", + ), + ), + cf_bundle_url_types: None, + cf_bundle_document_types: Some( + [ + CFBundleDocumentTypesModel { + cf_bundle_type_name: PlaceholderString( + "text document", + ), + cf_bundle_type_icon_file: Some( + PlaceholderString( + "spyder.icns", + ), + ), + cf_bundle_type_role: Some( + "Editor", + ), + ls_item_content_types: [ + PlaceholderString( + "com.apple.applescript.text", + ), + PlaceholderString( + "com.apple.ascii-property-list", + ), + PlaceholderString( + "com.apple.audio-unit-preset", + ), + PlaceholderString( + "com.apple.binary-property-list", + ), + PlaceholderString( + "com.apple.configprofile", + ), + PlaceholderString( + "com.apple.crashreport", + ), + PlaceholderString( + "com.apple.dashcode.css", + ), + PlaceholderString( + "com.apple.dashcode.javascript", + ), + PlaceholderString( + "com.apple.dashcode.json", + ), + PlaceholderString( + "com.apple.dashcode.manifest", + ), + PlaceholderString( + "com.apple.dt.document.ascii-property-list", + ), + PlaceholderString( + "com.apple.dt.document.script-suite-property-list", + ), + PlaceholderString( + "com.apple.dt.document.script-terminology-property-list", + ), + PlaceholderString( + "com.apple.property-list", + ), + PlaceholderString( + "com.apple.rez-source", + ), + PlaceholderString( + "com.apple.scripting-definition", + ), + PlaceholderString( + "com.apple.structured-text", + ), + PlaceholderString( + "com.apple.traditional-mac-plain-text", + ), + PlaceholderString( + "com.apple.xcode.ada-source", + ), + PlaceholderString( + "com.apple.xcode.apinotes", + ), + PlaceholderString( + "com.apple.xcode.bash-script", + ), + PlaceholderString( + "com.apple.xcode.configsettings", + ), + PlaceholderString( + "com.apple.xcode.csh-script", + ), + PlaceholderString( + "com.apple.xcode.entitlements-property-list", + ), + PlaceholderString( + "com.apple.xcode.fortran-source", + ), + PlaceholderString( + "com.apple.xcode.glsl-source", + ), + PlaceholderString( + "com.apple.xcode.ksh-script", + ), + PlaceholderString( + "com.apple.xcode.lex-source", + ), + PlaceholderString( + "com.apple.xcode.make-script", + ), + PlaceholderString( + "com.apple.xcode.mig-source", + ), + PlaceholderString( + "com.apple.xcode.pascal-source", + ), + PlaceholderString( + "com.apple.xcode.strings-text", + ), + PlaceholderString( + "com.apple.xcode.tcsh-script", + ), + PlaceholderString( + "com.apple.xcode.yacc-source", + ), + PlaceholderString( + "com.apple.xcode.zsh-script", + ), + PlaceholderString( + "com.apple.xml-property-list", + ), + PlaceholderString( + "com.netscape.javascript-source", + ), + PlaceholderString( + "com.scenarist.closed-caption", + ), + PlaceholderString( + "com.sun.java-source", + ), + PlaceholderString( + "com.sun.java-web-start", + ), + PlaceholderString( + "net.daringfireball.markdown", + ), + PlaceholderString( + "org.khronos.glsl-source", + ), + PlaceholderString( + "org.oasis-open.xliff", + ), + PlaceholderString( + "public.ada-source", + ), + PlaceholderString( + "public.assembly-source", + ), + PlaceholderString( + "public.bash-script", + ), + PlaceholderString( + "public.c-header", + ), + PlaceholderString( + "public.c-plus-plus-header", + ), + PlaceholderString( + "public.c-plus-plus-source", + ), + PlaceholderString( + "public.c-source", + ), + PlaceholderString( + "public.case-insensitive-text", + ), + PlaceholderString( + "public.comma-separated-values-text", + ), + PlaceholderString( + "public.csh-script", + ), + PlaceholderString( + "public.css", + ), + PlaceholderString( + "public.delimited-values-text", + ), + PlaceholderString( + "public.dylan-source", + ), + PlaceholderString( + "public.filename-extension", + ), + PlaceholderString( + "public.fortran-77-source", + ), + PlaceholderString( + "public.fortran-90-source", + ), + PlaceholderString( + "public.fortran-95-source", + ), + PlaceholderString( + "public.fortran-source", + ), + PlaceholderString( + "public.html", + ), + PlaceholderString( + "public.json", + ), + PlaceholderString( + "public.ksh-script", + ), + PlaceholderString( + "public.lex-source", + ), + PlaceholderString( + "public.log", + ), + PlaceholderString( + "public.m3u-playlist", + ), + PlaceholderString( + "public.make-source", + ), + PlaceholderString( + "public.mig-source", + ), + PlaceholderString( + "public.mime-type", + ), + PlaceholderString( + "public.module-map", + ), + PlaceholderString( + "public.nasm-assembly-source", + ), + PlaceholderString( + "public.objective-c-plus-plus-source", + ), + PlaceholderString( + "public.objective-c-source", + ), + PlaceholderString( + "public.opencl-source", + ), + PlaceholderString( + "public.pascal-source", + ), + PlaceholderString( + "public.patch-file", + ), + PlaceholderString( + "public.perl-script", + ), + PlaceholderString( + "public.php-script", + ), + PlaceholderString( + "public.plain-text", + ), + PlaceholderString( + "public.python-script", + ), + PlaceholderString( + "public.rss", + ), + PlaceholderString( + "public.ruby-script", + ), + PlaceholderString( + "public.script", + ), + PlaceholderString( + "public.shell-script", + ), + PlaceholderString( + "public.source-code", + ), + PlaceholderString( + "public.tcsh-script", + ), + PlaceholderString( + "public.text", + ), + PlaceholderString( + "public.utf16-external-plain-text", + ), + PlaceholderString( + "public.utf16-plain-text", + ), + PlaceholderString( + "public.utf8-plain-text", + ), + PlaceholderString( + "public.utf8-tab-separated-values-text", + ), + PlaceholderString( + "public.xhtml", + ), + PlaceholderString( + "public.xml", + ), + PlaceholderString( + "public.yacc-source", + ), + PlaceholderString( + "public.yaml", + ), + PlaceholderString( + "public.zsh-script", + ), + ], + ls_handler_rank: "Default", + }, + ], + ), + ls_application_category_type: None, + ls_background_only: None, + ls_environment: None, + ls_minimum_system_version: None, + ls_multiple_instances_prohibited: None, + ls_requires_native_execution: None, + ut_exported_type_declarations: None, + ut_imported_type_declarations: None, + entitlements: None, + link_in_bundle: Some( + { + PlaceholderString( + "{{ PREFIX }}/bin/python", + ): PlaceholderString( + "{{ MENU_ITEM_LOCATION }}/Contents/MacOS/python", ), - ls_item_content_types: [ - "com.apple.applescript.text", - "com.apple.ascii-property-list", - "com.apple.audio-unit-preset", - "com.apple.binary-property-list", - "com.apple.configprofile", - "com.apple.crashreport", - "com.apple.dashcode.css", - "com.apple.dashcode.javascript", - "com.apple.dashcode.json", - "com.apple.dashcode.manifest", - "com.apple.dt.document.ascii-property-list", - "com.apple.dt.document.script-suite-property-list", - "com.apple.dt.document.script-terminology-property-list", - "com.apple.property-list", - "com.apple.rez-source", - "com.apple.scripting-definition", - "com.apple.structured-text", - "com.apple.traditional-mac-plain-text", - "com.apple.xcode.ada-source", - "com.apple.xcode.apinotes", - "com.apple.xcode.bash-script", - "com.apple.xcode.configsettings", - "com.apple.xcode.csh-script", - "com.apple.xcode.entitlements-property-list", - "com.apple.xcode.fortran-source", - "com.apple.xcode.glsl-source", - "com.apple.xcode.ksh-script", - "com.apple.xcode.lex-source", - "com.apple.xcode.make-script", - "com.apple.xcode.mig-source", - "com.apple.xcode.pascal-source", - "com.apple.xcode.strings-text", - "com.apple.xcode.tcsh-script", - "com.apple.xcode.yacc-source", - "com.apple.xcode.zsh-script", - "com.apple.xml-property-list", - "com.netscape.javascript-source", - "com.scenarist.closed-caption", - "com.sun.java-source", - "com.sun.java-web-start", - "net.daringfireball.markdown", - "org.khronos.glsl-source", - "org.oasis-open.xliff", - "public.ada-source", - "public.assembly-source", - "public.bash-script", - "public.c-header", - "public.c-plus-plus-header", - "public.c-plus-plus-source", - "public.c-source", - "public.case-insensitive-text", - "public.comma-separated-values-text", - "public.csh-script", - "public.css", - "public.delimited-values-text", - "public.dylan-source", - "public.filename-extension", - "public.fortran-77-source", - "public.fortran-90-source", - "public.fortran-95-source", - "public.fortran-source", - "public.html", - "public.json", - "public.ksh-script", - "public.lex-source", - "public.log", - "public.m3u-playlist", - "public.make-source", - "public.mig-source", - "public.mime-type", - "public.module-map", - "public.nasm-assembly-source", - "public.objective-c-plus-plus-source", - "public.objective-c-source", - "public.opencl-source", - "public.pascal-source", - "public.patch-file", - "public.perl-script", - "public.php-script", - "public.plain-text", - "public.python-script", - "public.rss", - "public.ruby-script", - "public.script", - "public.shell-script", - "public.source-code", - "public.tcsh-script", - "public.text", - "public.utf16-external-plain-text", - "public.utf16-plain-text", - "public.utf8-plain-text", - "public.utf8-tab-separated-values-text", - "public.xhtml", - "public.xml", - "public.yacc-source", - "public.yaml", - "public.zsh-script", - ], - ls_handler_rank: "Default", }, - ], - ), - ls_application_category_type: None, - ls_background_only: None, - ls_environment: None, - ls_minimum_system_version: None, - ls_multiple_instances_prohibited: None, - ls_requires_native_execution: None, - ns_supports_automatic_graphics_switching: None, - ut_exported_type_declarations: None, - ut_imported_type_declarations: None, - entitlements: None, - link_in_bundle: Some( - { - "{{ PREFIX }}/bin/python": "{{ MENU_ITEM_LOCATION }}/Contents/MacOS/python", - }, - ), - event_handler: None, + ), + event_handler: None, + }, }, ), win: Some( - Windows { + Platform { base: BasePlatformSpecific { name: None, - description: "", + description: None, icon: None, - command: [ - "{{ PREFIX }}/Scripts/superspyder.exe", - "%*", - ], + command: Some( + [ + PlaceholderString( + "{{ PREFIX }}/Scripts/spyder.exe", + ), + PlaceholderString( + "%*", + ), + ], + ), working_dir: None, precommand: None, precreate: None, activate: None, terminal: None, }, - desktop: Some( - true, - ), - quicklaunch: None, - terminal_profile: None, - url_protocols: None, - file_extensions: Some( - [ - ".enaml", - ".ipy", - ".py", - ".pyi", - ".pyw", - ".pyx", - ], - ), - app_user_model_id: Some( - "superspyder-ide.superspyder-__PKG_MAJOR_VER__.{{ ENV_NAME }}", - ), + specific: Windows { + desktop: Some( + true, + ), + quicklaunch: None, + terminal_profile: None, + url_protocols: None, + file_extensions: Some( + [ + ".enaml", + ".ipy", + ".py", + ".pyi", + ".pyw", + ".pyx", + ], + ), + app_user_model_id: Some( + "spyder-ide.Spyder-6.{{ ENV_NAME }}", + ), + }, }, ), }, From 7e88b6b938e5729f07b0c445dcd841db938c39ac Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Mon, 11 Nov 2024 20:58:28 +0100 Subject: [PATCH 036/132] fix some clippy warnings --- crates/rattler_menuinst/src/schema.rs | 28 +++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/crates/rattler_menuinst/src/schema.rs b/crates/rattler_menuinst/src/schema.rs index ea69c7685..65a3ccfe2 100644 --- a/crates/rattler_menuinst/src/schema.rs +++ b/crates/rattler_menuinst/src/schema.rs @@ -62,8 +62,8 @@ pub struct BasePlatformSpecific { /// Whether to run the program in a terminal/console. /// /// ### Platform-specific behavior - /// - Windows: Only has an effect if `activate` is true - /// - MacOS: The application will ignore command-line arguments + /// - `Windows`: Only has an effect if `activate` is true + /// - `MacOS`: The application will ignore command-line arguments pub terminal: Option, } @@ -111,18 +111,18 @@ pub enum Environment { } /// Windows-specific instructions for menu item configuration. -/// +/// /// Allows overriding global keys for Windows-specific behavior. #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(deny_unknown_fields)] pub struct Windows { /// Whether to create a desktop icon in addition to the Start Menu item. - /// + /// /// Defaults to `true` in the original implementation. pub desktop: Option, /// Whether to create a quick launch icon in addition to the Start Menu item. - /// + /// /// Defaults to `true` in the original implementation. pub quicklaunch: Option, @@ -130,28 +130,28 @@ pub struct Windows { pub terminal_profile: Option, /// URL protocols that will be associated with this program. - /// + /// /// Each protocol must contain no whitespace characters. pub url_protocols: Option>, /// File extensions that will be associated with this program. - /// + /// /// Each extension must start with a dot and contain no whitespace. pub file_extensions: Option>, /// Application User Model ID for Windows 7 and above. - /// + /// /// Used to associate processes, files and windows with a particular application. /// Required when shortcut produces duplicated icons. - /// + /// /// # Format /// - Must contain at least two segments separated by dots /// - Maximum length of 128 characters /// - No whitespace allowed - /// + /// /// # Default /// If not set, defaults to `Menuinst.` - /// + /// /// For more information, see [Microsoft's AppUserModelID documentation](https://learn.microsoft.com/en-us/windows/win32/shell/appids#how-to-form-an-application-defined-appusermodelid) pub app_user_model_id: Option, } @@ -349,7 +349,7 @@ pub struct MacOS { pub cf_bundle_name: Option, /// Suitable replacement for text-to-speech operations on the app. - /// For example, "my app one two three" instead of "MyApp123". + /// For example, "my app one two three" instead of `MyApp123`. #[serde(rename = "CFBundleSpokenName")] pub cf_bundle_spoken_name: Option, @@ -485,8 +485,8 @@ pub struct MenuItemCommand { /// Defaults to `false` in the original implementation. /// /// # Platform-specific behavior - /// - Windows: Only has an effect if `activate` is true - /// - MacOS: The application will ignore command-line arguments + /// - `Windows`: Only has an effect if `activate` is true + /// - `MacOS`: The application will ignore command-line arguments pub terminal: Option, } From bfdd26d53c98ed06e69e9b1333e15bf12522524b Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Tue, 12 Nov 2024 09:36:15 +0100 Subject: [PATCH 037/132] add pre-create --- crates/rattler_menuinst/src/lib.rs | 3 +-- crates/rattler_menuinst/src/linux.rs | 12 ++++----- crates/rattler_menuinst/src/macos.rs | 21 +++++++++------ crates/rattler_menuinst/src/util.rs | 38 ++++++++++++++++++++++++++++ 4 files changed, 58 insertions(+), 16 deletions(-) create mode 100644 crates/rattler_menuinst/src/util.rs diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index fda0fd50c..6c8e3045b 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -7,6 +7,7 @@ mod linux; mod macos; mod render; mod schema; +mod util; #[cfg(target_os = "windows")] mod windows; @@ -108,14 +109,12 @@ pub mod test { if std::env::var("INSTALL_MENU_ITEM").is_err() { return; } - println!("Running test_install_menu_item"); let test_data = crate::test::test_data(); let schema_path = test_data.join("/Users/wolfv/Programs/rattler/.prefix/Menu/napari-menu.json"); let prefix = schema_path.parent().unwrap().parent().unwrap(); let prefix = std::fs::canonicalize(prefix).unwrap(); - println!("prefix: {prefix:?}"); let platform = Platform::OsxArm64; install_menuitems(&schema_path, &prefix, &prefix, platform).unwrap(); diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index e713b23a9..67b30f017 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -11,6 +11,7 @@ use rattler_shell::activation::{ActivationVariables, Activator}; use rattler_shell::shell; use crate::render::{BaseMenuItemPlaceholders, MenuItemPlaceholders, PlaceholderString}; +use crate::util::run_pre_create_command; use crate::{ schema::{Linux, MenuItemCommand}, MenuInstError, MenuMode, @@ -94,10 +95,11 @@ impl LinuxMenu { /// Logic to run before the shortcut files are created. fn pre_create(&self) -> Result<(), MenuInstError> { - if Platform::current().is_windows() { - // TODO: return error - return Ok(()); + if let Some(pre_create_command) = &self.command.precreate { + let pre_create_command = pre_create_command.resolve(&self.placeholders); + run_pre_create_command(&pre_create_command)?; } + Ok(()) } @@ -120,7 +122,7 @@ impl LinuxMenu { for (k, v) in activation_env { envs.push(format!(r#"{k}="{v}""#)); } - println!("Envs: {envs:?}"); + tracing::debug!("Envs: {envs:?}"); } let command = self @@ -483,7 +485,5 @@ pub fn install_menu_item( ) -> Result<(), MenuInstError> { let menu = LinuxMenu::new(prefix, item, command, placeholders, menu_mode); menu.install()?; - println!("{:?}", menu.location()); - println!("{:?}", menu.directories.config_directory); Ok(()) } diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index 5af39005c..be2b68956 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -21,7 +21,9 @@ use crate::{ CFBundleDocumentTypesModel, CFBundleURLTypesModel, MacOS, MenuItemCommand, UTTypeDeclarationModel, }, - slugify, utils, MenuInstError, MenuMode, + slugify, + util::run_pre_create_command, + utils, MenuInstError, MenuMode, }; #[derive(Debug)] @@ -218,7 +220,7 @@ impl MacOSMenu { let bundle_name = format!("{name}.app"); let directories = Directories::new(menu_mode, &bundle_name); - println!("Installing menu item for {bundle_name}"); + tracing::info!("Installing menu item for {bundle_name}"); let refined_placeholders = placeholders.refine(&directories.location); Self { @@ -244,7 +246,13 @@ impl MacOSMenu { self.item.cf_bundle_identifier.is_some() || self.item.cf_bundle_document_types.is_some() } + // Run pre-create command pub fn precreate(&self) -> Result<(), MenuInstError> { + if let Some(precreate) = &self.command.precreate { + let pre_create_command = precreate.resolve(&self.placeholders); + run_pre_create_command(&pre_create_command)?; + } + for (src, dest) in self .item .link_in_bundle @@ -254,7 +262,6 @@ impl MacOSMenu { { let src = src.resolve(&self.placeholders); let dest = dest.resolve(&self.placeholders); - println!("MenuInst: linking {src} to {dest}"); let rendered_dest = self.directories.location.join(&dest); if !rendered_dest.starts_with(&self.directories.location) { return Err(MenuInstError::InstallError(format!( @@ -265,14 +272,12 @@ impl MacOSMenu { } if let Some(parent) = rendered_dest.parent() { - println!("Parent: {}", rendered_dest.display()); fs::create_dir_all(parent)?; } - println!("Dest: {}", rendered_dest.display()); - assert!(PathBuf::from(&src).exists(), "Source file does not exist"); fs_err::os::unix::fs::symlink(&src, &rendered_dest)?; - println!( + + tracing::info!( "MenuInst: link finished {src} to {}", rendered_dest.display() ); @@ -382,7 +387,7 @@ impl MacOSMenu { } if self.needs_appkit_launcher() { - println!( + tracing::debug!( "Writing plist to {}", self.directories .nested_location diff --git a/crates/rattler_menuinst/src/util.rs b/crates/rattler_menuinst/src/util.rs new file mode 100644 index 000000000..ce51a163e --- /dev/null +++ b/crates/rattler_menuinst/src/util.rs @@ -0,0 +1,38 @@ +use std::{io::Write, os::unix::fs::PermissionsExt, process::Command}; + +use fs_err as fs; + +use crate::MenuInstError; + +pub fn run_pre_create_command(pre_create_command: &str) -> Result<(), MenuInstError> { + let mut temp_file = tempfile::NamedTempFile::with_suffix(".sh")?; + temp_file.write_all(pre_create_command.as_bytes())?; + let temp_path = temp_file.into_temp_path(); + + // Mark the file as executable or run it with bash + let mut cmd = if pre_create_command.starts_with("!#") { + fs::set_permissions(&temp_path, std::fs::Permissions::from_mode(0o755))?; + Command::new(&temp_path) + } else { + let mut cmd = Command::new("bash"); + cmd.arg(&temp_path); + cmd + }; + + let output = cmd.output()?; + if !output.status.success() { + tracing::error!( + "Failed to run pre-create command (status: {}): \nstdout: {}\nstderr: {}", + output.status, + String::from_utf8_lossy(&output.stdout), + String::from_utf8_lossy(&output.stderr) + ); + + return Err(MenuInstError::InstallError(format!( + "Failed to run pre-create command: {}", + String::from_utf8_lossy(&output.stderr) + ))); + } + + Ok(()) +} From bb18d71da8af3d5d3f660454a635c39f038a4eb6 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Tue, 12 Nov 2024 10:15:04 +0100 Subject: [PATCH 038/132] improve linux code some more --- crates/rattler/src/install/driver.rs | 1 + crates/rattler_menuinst/src/lib.rs | 17 +++--- crates/rattler_menuinst/src/linux.rs | 79 +++++++++++++++++++++------- crates/rattler_menuinst/src/macos.rs | 10 +++- 4 files changed, 77 insertions(+), 30 deletions(-) diff --git a/crates/rattler/src/install/driver.rs b/crates/rattler/src/install/driver.rs index 74351e36f..580f03c9a 100644 --- a/crates/rattler/src/install/driver.rs +++ b/crates/rattler/src/install/driver.rs @@ -232,6 +232,7 @@ impl InstallDriver { target_prefix, target_prefix, Platform::current(), + rattler_menuinst::MenuMode::User, ) .unwrap_or_else(|e| { tracing::warn!("Failed to install menu item: {} (ignored)", e); diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index 6c8e3045b..7426f8371 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -46,6 +46,7 @@ pub fn install_menuitems( prefix: &Path, base_prefix: &Path, platform: Platform, + menu_mode: MenuMode, ) -> Result<(), MenuInstError> { let text = std::fs::read_to_string(file)?; let menu_inst: MenuInstSchema = serde_json::from_str(&text)?; @@ -56,11 +57,12 @@ pub fn install_menuitems( if let Some(linux_item) = item.platforms.linux { let command = item.command.merge(linux_item.base); linux::install_menu_item( + &menu_inst.menu_name, prefix, linux_item.specific, command, &placeholders, - MenuMode::User, + menu_mode, )?; } } else if platform.is_osx() { @@ -72,19 +74,14 @@ pub fn install_menuitems( macos_item.specific, command, &placeholders, - MenuMode::System, + menu_mode, )?; } } else if platform.is_windows() { #[cfg(target_os = "windows")] if let Some(windows_item) = item.platforms.win { let command = item.command.merge(windows_item.base); - windows::install_menu_item( - prefix, - windows_item.specific, - command, - MenuMode::System, - )?; + windows::install_menu_item(prefix, windows_item.specific, command, menu_mode)?; } } } @@ -98,7 +95,7 @@ pub mod test { use rattler_conda_types::Platform; - use crate::install_menuitems; + use crate::{install_menuitems, MenuMode}; pub(crate) fn test_data() -> PathBuf { Path::new(env!("CARGO_MANIFEST_DIR")).join("../../test-data/menuinst") @@ -117,6 +114,6 @@ pub mod test { let prefix = std::fs::canonicalize(prefix).unwrap(); let platform = Platform::OsxArm64; - install_menuitems(&schema_path, &prefix, &prefix, platform).unwrap(); + install_menuitems(&schema_path, &prefix, &prefix, platform, MenuMode::User).unwrap(); } } diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index 67b30f017..fe41ac800 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -11,6 +11,7 @@ use rattler_shell::activation::{ActivationVariables, Activator}; use rattler_shell::shell; use crate::render::{BaseMenuItemPlaceholders, MenuItemPlaceholders, PlaceholderString}; +use crate::slugify; use crate::util::run_pre_create_command; use crate::{ schema::{Linux, MenuItemCommand}, @@ -27,15 +28,42 @@ pub struct LinuxMenu { mode: MenuMode, } +/// Directories used on Linux for menu items pub struct Directories { - config_directory: PathBuf, - data_directory: PathBuf, - system_menu_config_location: PathBuf, - desktop_entries_location: PathBuf, + /// The name of the (parent) menu (in the json defined as `menu_name`) + pub menu_name: String, + + /// The name of the current menu item + pub name: String, + + /// The data directory for the menu + pub data_directory: PathBuf, + + /// The location of the menu configuration file This is the file that is + /// used by the system to determine the menu layout It is usually located at + /// `~/.config/menus/applications.menu` + pub menu_config_location: PathBuf, + + /// The location of the system menu configuration file This is the file that + /// is used by the system to determine the menu layout It is usually located + /// at `/etc/xdg/menus/applications.menu` + pub system_menu_config_location: PathBuf, + + /// The location of the desktop entries This is a directory that contains + /// `.desktop` files that describe the applications that are shown in the + /// menu It is usually located at `/usr/share/applications` or + /// `~/.local/share/applications` + pub desktop_entries_location: PathBuf, + + /// The location of the desktop-directories This is a directory that + /// contains `.directory` files that describe the directories that are shown + /// in the menu It is usually located at `/usr/share/desktop-directories` or + /// `~/.local/share/desktop-directories` + pub directory_entry_location: PathBuf, } impl Directories { - fn new(mode: MenuMode) -> Self { + fn new(mode: MenuMode, menu_name: &str, name: &str) -> Self { let system_config_directory = PathBuf::from("/etc/xdg/"); let system_data_directory = PathBuf::from("/usr/share"); @@ -46,39 +74,53 @@ impl Directories { ) } else { ( - dirs::home_dir().expect("Could not get home dir"), + dirs::config_dir().expect("Could not get config dir"), dirs::data_dir().expect("Could not get data dir"), ) }; Directories { - config_directory: config_directory.clone(), + menu_name: menu_name.to_string(), + name: name.to_string(), data_directory: data_directory.clone(), - system_menu_config_location: system_config_directory - .join("menus") - .join("applications.menu"), + system_menu_config_location: system_config_directory.join("menus/applications.menu"), + menu_config_location: config_directory.join("menus/applications.menu"), desktop_entries_location: data_directory.join("applications"), + directory_entry_location: data_directory + .join(format!("desktop-directories/{}.directory", slugify(name))), } } + + pub fn desktop_file(&self) -> PathBuf { + self.desktop_entries_location.join(format!( + "{}_{}.desktop", + slugify(&self.menu_name), + slugify(&self.name) + )) + } } impl LinuxMenu { fn new( + menu_name: &str, prefix: &Path, item: Linux, command: MenuItemCommand, placeholders: &BaseMenuItemPlaceholders, mode: MenuMode, ) -> Self { - let directories = Directories::new(mode); + let name = command + .name + .resolve(crate::schema::Environment::Base, placeholders); + + let directories = Directories::new(mode, &menu_name, &name); + // This should be the path to the desktop file // TODO unsure if this is the right value for MENU_ITEM_LOCATION - let refined_placeholders = placeholders.refine(&directories.system_menu_config_location); + let refined_placeholders = placeholders.refine(&directories.desktop_file()); LinuxMenu { + name, prefix: prefix.to_path_buf(), - name: command - .name - .resolve(crate::schema::Environment::Base, placeholders), item, command, directories, @@ -88,9 +130,7 @@ impl LinuxMenu { } fn location(&self) -> PathBuf { - // TODO: The Python implementation uses one more variable - let filename = format!("{}.desktop", self.name); - self.directories.desktop_entries_location.join(filename) + self.directories.desktop_file() } /// Logic to run before the shortcut files are created. @@ -477,13 +517,14 @@ impl LinuxMenu { /// Install a menu item on Linux. pub fn install_menu_item( + menu_name: &str, prefix: &Path, item: Linux, command: MenuItemCommand, placeholders: &BaseMenuItemPlaceholders, menu_mode: MenuMode, ) -> Result<(), MenuInstError> { - let menu = LinuxMenu::new(prefix, item, command, placeholders, menu_mode); + let menu = LinuxMenu::new(menu_name, prefix, item, command, placeholders, menu_mode); menu.install()?; Ok(()) } diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index be2b68956..2b2629ceb 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -474,7 +474,15 @@ impl MacOSMenu { ); } - println!( + if let Some(cf_bundle_url_types) = &self.item.cf_bundle_url_types { + let mut url_array = Vec::new(); + for url_type in cf_bundle_url_types { + url_array.push(url_type.to_plist(&self.placeholders)); + } + pl.insert("CFBundleURLTypes".into(), Value::Array(url_array)); + } + + tracing::info!( "Writing plist to {}", self.directories .location From dcf1011a14b9e4f27f0f602860d3f29d53a1bcfc Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Tue, 12 Nov 2024 12:58:56 +0100 Subject: [PATCH 039/132] add directory entry functions --- crates/rattler_menuinst/src/linux.rs | 16 ++++++++++++++-- crates/rattler_menuinst/src/render.rs | 5 +++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index fe41ac800..2a5fa551f 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -114,8 +114,6 @@ impl LinuxMenu { .resolve(crate::schema::Environment::Base, placeholders); let directories = Directories::new(mode, &menu_name, &name); - // This should be the path to the desktop file - // TODO unsure if this is the right value for MENU_ITEM_LOCATION let refined_placeholders = placeholders.refine(&directories.desktop_file()); LinuxMenu { @@ -189,6 +187,20 @@ impl LinuxMenu { res } + fn create_directory_entry(&self) -> Result<(), MenuInstError> { + let file = &self.directories.directory_entry_location; + tracing::info!("Creating directory entry at {:?}", file); + let writer = File::create(file)?; + let mut writer = std::io::BufWriter::new(writer); + + writeln!(writer, "[Desktop Entry]")?; + writeln!(writer, "Type=Directory")?; + writeln!(writer, "Encoding=UTF-8")?; + writeln!(writer, "Name={}", self.name)?; + + Ok(()) + } + fn create_desktop_entry(&self) -> Result<(), MenuInstError> { let file = self.location(); let writer = File::create(file)?; diff --git a/crates/rattler_menuinst/src/render.rs b/crates/rattler_menuinst/src/render.rs index 96119c553..a2bb23fb3 100644 --- a/crates/rattler_menuinst/src/render.rs +++ b/crates/rattler_menuinst/src/render.rs @@ -87,6 +87,11 @@ impl BaseMenuItemPlaceholders { BaseMenuItemPlaceholders { placeholders: vars } } + /// Insert the menu item location into the placeholders + /// + /// - On Linux, this is the path to the `.desktop` file + /// - On Windows, this is the path to the start menu `.lnk` file + /// - On macOS, this is the path to the `.app` bundle pub fn refine(&self, menu_item_location: &Path) -> MenuItemPlaceholders { let mut vars = self.placeholders.clone(); vars.insert( From 9592a891423af7be194543e7002fc22cae792d86 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Sun, 24 Nov 2024 20:56:21 +0100 Subject: [PATCH 040/132] some improvements --- crates/rattler_menuinst/src/lib.rs | 49 +++++++++++++++++++++++++ crates/rattler_menuinst/src/linux.rs | 44 ++++++++++++++--------- crates/rattler_menuinst/src/macos.rs | 52 ++++++--------------------- crates/rattler_menuinst/src/render.rs | 2 +- crates/rattler_menuinst/src/util.rs | 9 +++++ 5 files changed, 98 insertions(+), 58 deletions(-) diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index 7426f8371..b6f481916 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -89,6 +89,55 @@ pub fn install_menuitems( Ok(()) } +/// Remove menu items from a given schema file +pub fn remove_menu_items( + file: &Path, + prefix: &Path, + base_prefix: &Path, + platform: Platform, + menu_mode: MenuMode, +) -> Result<(), MenuInstError> { + let text = std::fs::read_to_string(file)?; + let menu_inst: MenuInstSchema = serde_json::from_str(&text)?; + let placeholders = BaseMenuItemPlaceholders::new(base_prefix, prefix, platform); + + for item in menu_inst.menu_items { + if platform.is_linux() { + if let Some(linux_item) = item.platforms.linux { + let command = item.command.merge(linux_item.base); + linux::remove_menu_item( + &menu_inst.menu_name, + prefix, + linux_item.specific, + command, + &placeholders, + menu_mode, + )?; + } + } else if platform.is_osx() { + #[cfg(target_os = "macos")] + if let Some(macos_item) = item.platforms.osx { + let command = item.command.merge(macos_item.base); + macos::remove_menu_item( + prefix, + macos_item.specific, + command, + &placeholders, + menu_mode, + )?; + } + } else if platform.is_windows() { + #[cfg(target_os = "windows")] + if let Some(windows_item) = item.platforms.win { + let command = item.command.merge(windows_item.base); + windows::remove_menu_item(prefix, windows_item.specific, command, menu_mode)?; + } + } + } + + Ok(()) +} + #[cfg(test)] pub mod test { use std::path::{Path, PathBuf}; diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index 2a5fa551f..8147c17f4 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -12,7 +12,7 @@ use rattler_shell::shell; use crate::render::{BaseMenuItemPlaceholders, MenuItemPlaceholders, PlaceholderString}; use crate::slugify; -use crate::util::run_pre_create_command; +use crate::util::{log_output, run_pre_create_command}; use crate::{ schema::{Linux, MenuItemCommand}, MenuInstError, MenuMode, @@ -29,6 +29,7 @@ pub struct LinuxMenu { } /// Directories used on Linux for menu items +#[allow(unused)] pub struct Directories { /// The name of the (parent) menu (in the json defined as `menu_name`) pub menu_name: String, @@ -367,25 +368,24 @@ impl LinuxMenu { mime_types.join(", "), self.name ); - tracing::info!( - "xdg-mime stdout output: {}", - String::from_utf8_lossy(&output.stdout) - ); - tracing::info!( - "xdg-mime stderr output: {}", - String::from_utf8_lossy(&output.stderr) - ); + log_output("xdg-mime", output); } } else { tracing::debug!("xdg-mime not found, not registering mime types as default."); } } - // if let Some(update_mime_database) = which::which("update-mime-database").ok() { - // let mut command = Command::new(update_mime_database); - // command.arg("-V").arg(self.menu.data_directory.join("mime")); - // self.logged_run(&mut command)?; - // } + if let Some(update_mime_database) = which::which("update-mime-database").ok() { + let mut command = Command::new(update_mime_database); + command + .arg("-V") + .arg(self.directories.data_directory.join("mime")); + let output = command.output()?; + if !output.status.success() { + tracing::warn!("Could not update mime database"); + log_output("update-mime-database", output); + } + } Ok(()) } @@ -537,6 +537,18 @@ pub fn install_menu_item( menu_mode: MenuMode, ) -> Result<(), MenuInstError> { let menu = LinuxMenu::new(menu_name, prefix, item, command, placeholders, menu_mode); - menu.install()?; - Ok(()) + menu.install() +} + +/// Remove a menu item on Linux. +pub fn remove_menu_item( + menu_name: &str, + prefix: &Path, + item: Linux, + command: MenuItemCommand, + placeholders: &BaseMenuItemPlaceholders, + menu_mode: MenuMode, +) -> Result<(), MenuInstError> { + let menu = LinuxMenu::new(menu_name, prefix, item, command, placeholders, menu_mode); + menu.remove() } diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index 2b2629ceb..c98319edd 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -445,13 +445,6 @@ impl MacOSMenu { ); } - // if let Some(supports) = self.item.ns_supports_automatic_graphics_switching { - // pl.insert( - // "NSSupportsAutomaticGraphicsSwitching".into(), - // Value::Boolean(supports), - // ); - // } - if let Some(ut_exported_type_declarations) = &self.item.ut_exported_type_declarations { let mut type_array = Vec::new(); for ut_type in ut_exported_type_declarations { @@ -646,40 +639,6 @@ impl MacOSMenu { Ok(Some(script_path)) } - /// Find the launcher in the menuinst data path - fn find_launcher(&self) -> Result { - let launcher_name = format!("osx_launcher_{}", std::env::consts::ARCH); - for datapath in utils::menuinst_data_paths(&self.prefix) { - let launcher_path = datapath.join(&launcher_name); - if launcher_path.is_file() - && launcher_path.metadata()?.permissions().mode() & 0o111 != 0 - { - return Ok(launcher_path); - } - } - Err(MenuInstError::InstallError(format!( - "Could not find executable launcher for {}", - std::env::consts::ARCH - ))) - } - - /// Find the appkit launcher in the menuinst data path - fn find_appkit_launcher(&self) -> Result { - let launcher_name = format!("appkit_launcher_{}", std::env::consts::ARCH); - for datapath in utils::menuinst_data_paths(&self.prefix) { - let launcher_path = datapath.join(&launcher_name); - if launcher_path.is_file() - && launcher_path.metadata()?.permissions().mode() & 0o111 != 0 - { - return Ok(launcher_path); - } - } - Err(MenuInstError::InstallError(format!( - "Could not find executable appkit launcher for {}", - std::env::consts::ARCH - ))) - } - fn default_appkit_launcher_path(&self) -> PathBuf { let name = slugify(&self.name); self.directories.location.join("Contents/MacOS").join(&name) @@ -768,6 +727,17 @@ pub(crate) fn install_menu_item( menu.install() } +pub(crate) fn remove_menu_item( + prefix: &Path, + macos_item: MacOS, + command: MenuItemCommand, + placeholders: &BaseMenuItemPlaceholders, + menu_mode: MenuMode, +) -> Result, MenuInstError> { + let menu = MacOSMenu::new(prefix, macos_item, command, menu_mode, placeholders); + menu.remove() +} + #[cfg(test)] mod tests { use super::*; diff --git a/crates/rattler_menuinst/src/render.rs b/crates/rattler_menuinst/src/render.rs index a2bb23fb3..d201dcd89 100644 --- a/crates/rattler_menuinst/src/render.rs +++ b/crates/rattler_menuinst/src/render.rs @@ -88,7 +88,7 @@ impl BaseMenuItemPlaceholders { } /// Insert the menu item location into the placeholders - /// + /// /// - On Linux, this is the path to the `.desktop` file /// - On Windows, this is the path to the start menu `.lnk` file /// - On macOS, this is the path to the `.app` bundle diff --git a/crates/rattler_menuinst/src/util.rs b/crates/rattler_menuinst/src/util.rs index ce51a163e..1e12d405e 100644 --- a/crates/rattler_menuinst/src/util.rs +++ b/crates/rattler_menuinst/src/util.rs @@ -4,6 +4,15 @@ use fs_err as fs; use crate::MenuInstError; +pub fn log_output(cmd_info: &str, output: std::process::Output) { + tracing::info!("{}: status {}", cmd_info, output.status); + tracing::info!( + "stdout: {}\nstderr: {}", + String::from_utf8_lossy(&output.stdout), + String::from_utf8_lossy(&output.stderr) + ); +} + pub fn run_pre_create_command(pre_create_command: &str) -> Result<(), MenuInstError> { let mut temp_file = tempfile::NamedTempFile::with_suffix(".sh")?; temp_file.write_all(pre_create_command.as_bytes())?; From 9b214c9c28f0e35b79f25990895bb9bc71d11c48 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Mon, 25 Nov 2024 09:07:09 +0100 Subject: [PATCH 041/132] work on mr. windows --- crates/rattler_menuinst/Cargo.toml | 1 + crates/rattler_menuinst/src/lib.rs | 11 +- crates/rattler_menuinst/src/util.rs | 14 +- crates/rattler_menuinst/src/windows.rs | 191 ++++++++++++++---- .../src/windows/knownfolders.rs | 51 +++-- 5 files changed, 204 insertions(+), 64 deletions(-) diff --git a/crates/rattler_menuinst/Cargo.toml b/crates/rattler_menuinst/Cargo.toml index 35f8b2d9f..c4050e060 100644 --- a/crates/rattler_menuinst/Cargo.toml +++ b/crates/rattler_menuinst/Cargo.toml @@ -25,6 +25,7 @@ regex = { workspace = true } tempfile = { workspace = true } fs-err = { workspace = true } which = "7.0.0" +known-folders = "1.2.0" [target.'cfg(target_os = "windows")'.dependencies] winapi = "0.3.9" diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index b6f481916..f8b6efbc3 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -2,6 +2,7 @@ use std::path::Path; use rattler_conda_types::Platform; +#[cfg(target_os = "linux")] mod linux; #[cfg(target_os = "macos")] mod macos; @@ -54,6 +55,7 @@ pub fn install_menuitems( for item in menu_inst.menu_items { if platform.is_linux() { + #[cfg(target_os = "linux")] if let Some(linux_item) = item.platforms.linux { let command = item.command.merge(linux_item.base); linux::install_menu_item( @@ -81,7 +83,13 @@ pub fn install_menuitems( #[cfg(target_os = "windows")] if let Some(windows_item) = item.platforms.win { let command = item.command.merge(windows_item.base); - windows::install_menu_item(prefix, windows_item.specific, command, menu_mode)?; + windows::install_menu_item( + prefix, + windows_item.specific, + command, + &placeholders, + menu_mode, + )?; } } } @@ -103,6 +111,7 @@ pub fn remove_menu_items( for item in menu_inst.menu_items { if platform.is_linux() { + #[cfg(target_os = "linux")] if let Some(linux_item) = item.platforms.linux { let command = item.command.merge(linux_item.base); linux::remove_menu_item( diff --git a/crates/rattler_menuinst/src/util.rs b/crates/rattler_menuinst/src/util.rs index 1e12d405e..ad24b6d90 100644 --- a/crates/rattler_menuinst/src/util.rs +++ b/crates/rattler_menuinst/src/util.rs @@ -1,9 +1,3 @@ -use std::{io::Write, os::unix::fs::PermissionsExt, process::Command}; - -use fs_err as fs; - -use crate::MenuInstError; - pub fn log_output(cmd_info: &str, output: std::process::Output) { tracing::info!("{}: status {}", cmd_info, output.status); tracing::info!( @@ -13,7 +7,15 @@ pub fn log_output(cmd_info: &str, output: std::process::Output) { ); } +#[cfg(target_family = "unix")] pub fn run_pre_create_command(pre_create_command: &str) -> Result<(), MenuInstError> { + use os::unix::fs::PermissionsExt; + use std::{io::Write, process::Command}; + + use fs_err as fs; + + use crate::MenuInstError; + let mut temp_file = tempfile::NamedTempFile::with_suffix(".sh")?; temp_file.write_all(pre_create_command.as_bytes())?; let temp_path = temp_file.into_temp_path(); diff --git a/crates/rattler_menuinst/src/windows.rs b/crates/rattler_menuinst/src/windows.rs index 52d3c0b1f..e5c461b9d 100644 --- a/crates/rattler_menuinst/src/windows.rs +++ b/crates/rattler_menuinst/src/windows.rs @@ -1,50 +1,171 @@ -use std::path::Path; +use std::path::{Path, PathBuf}; + +use knownfolders::UserHandle; use crate::{ - schema::{MenuItemCommand, Windows}, + render::{BaseMenuItemPlaceholders, MenuItemPlaceholders}, + schema::{Environment, MenuItemCommand, Windows}, MenuInstError, MenuMode, }; -// mod knownfolders; +mod knownfolders; // mod registry; // -// struct Directories { -// start_menu_location: PathBuf, -// quick_launch_location: PathBuf, -// desktop_location: PathBuf, -// } -// -// impl Directories { -// pub fn create() -> Directories { -// let start_menu_location = dirs::start_menu_dir().unwrap(); -// let quick_launch_location = dirs::quick_launch_dir().unwrap(); -// let desktop_location = dirs::desktop_dir().unwrap(); -// -// Directories { -// start_menu_location, -// quick_launch_location, -// desktop_location, -// } -// } -// } -// -// pub struct WindowsMenu { -// name: String, -// mode: String, -// prefix: PathBuf, -// base_prefix: PathBuf, -// } +pub struct Directories { + start_menu: PathBuf, + quick_launch: PathBuf, + desktop: PathBuf, + programs: PathBuf, +} + +impl Directories { + pub fn create() -> Directories { + let known_folders = knownfolders::Folders::new(); + let start_menu = known_folders + .get_folder_path("start", UserHandle::Current) + .unwrap(); + let quick_launch = known_folders + .get_folder_path("quick_launch", UserHandle::Current) + .unwrap(); + let desktop = known_folders + .get_folder_path("desktop", UserHandle::Current) + .unwrap(); + let programs = known_folders + .get_folder_path("programs", UserHandle::Current) + .unwrap(); + + Directories { + start_menu, + quick_launch, + desktop, + programs, + } + } +} + +pub struct WindowsMenu { + prefix: PathBuf, + name: String, + item: Windows, + command: MenuItemCommand, + directories: Directories, + placeholders: MenuItemPlaceholders, +} + +const SHORTCUT_EXTENSION: &str = "lnk"; + +impl WindowsMenu { + pub fn new( + prefix: &Path, + item: Windows, + command: MenuItemCommand, + directories: Directories, + placeholders: &BaseMenuItemPlaceholders, + ) -> Self { + let name = command.name.resolve(Environment::Base, placeholders); + + let programs_link_location = directories + .programs + .join(&name) + .with_extension(SHORTCUT_EXTENSION); + + Self { + prefix: prefix.to_path_buf(), + name, + item, + command, + directories, + placeholders: placeholders.refine(&programs_link_location), + } + } + + fn build_command(&self, with_arg1: bool) { + // TODO handle activation + let mut command = Vec::new(); + for elem in self.command.command.iter() { + command.push(elem.resolve(&self.placeholders)); + } + + if with_arg1 && !command.iter().any(|s| s.contains("%1")) { + command.push("%1".to_string()); + } + + + } + + fn create_shortcut(&self, link_path: &Path, args: &str) -> Result<(), MenuInstError> { + + // target_path, *arguments = self._process_command() + // working_dir = self.render_key("working_dir") + // if working_dir: + // Path(working_dir).mkdir(parents=True, exist_ok=True) + // else: + // working_dir = "%HOMEPATH%" + + // icon = self.render_key("icon") or "" + + // # winshortcut is a windows-only C extension! create_shortcut has this API + // # Notice args must be passed as positional, no keywords allowed! + // # winshortcut.create_shortcut(path, description, filename, arguments="", + // # workdir=None, iconpath=None, iconindex=0, app_id="") + // create_shortcut( + // target_path, + // self._shortcut_filename(ext=""), + // str(path), + // " ".join(arguments), + // working_dir, + // icon, + // 0, + // self._app_user_model_id(), + // ) + Ok(()) + } + + pub fn install(self) -> Result<(), MenuInstError> { + // let paths = [ + // Some(&self.directories.programs), + // if self.item.desktop.unwrap_or(false) { + // self.directories.desktop.as_ref() + // } else { + // None + // }, + // if self.item.quicklaunch.unwrap_or(false) { + // self.directories.quicklaunch.as_ref() + // } else { + // None + // }, + // ]; + // for path in paths.into_iter().filter_map(identity) { + // let link_path = path.join(&self.name).with_extension(SHORTCUT_EXTENSION); + // let args = self.build_command_invocation(); + // } + + Ok(()) + } +} pub(crate) fn install_menu_item( prefix: &Path, windows_item: Windows, command: MenuItemCommand, + placeholders: &BaseMenuItemPlaceholders, + menu_mode: MenuMode, +) -> Result<(), MenuInstError> { + let menu = WindowsMenu::new( + prefix, + windows_item, + command, + Directories::create(), + placeholders, + ); + menu.install() +} + +pub(crate) fn remove_menu_item( + prefix: &Path, + specific: Windows, + command: MenuItemCommand, menu_mode: MenuMode, ) -> Result<(), MenuInstError> { - // let bundle_name = macos_item.cf_bundle_name.as_ref().unwrap(); - // let directories = Directories::new(menu_mode, bundle_name); - // println!("Installing menu item for {bundle_name}"); - // let menu = crate::macos::MacOSMenu::new(prefix, macos_item, command, - // directories); menu.install() - Ok(()) + todo!() } diff --git a/crates/rattler_menuinst/src/windows/knownfolders.rs b/crates/rattler_menuinst/src/windows/knownfolders.rs index 09f7cc9d2..5b94ee099 100644 --- a/crates/rattler_menuinst/src/windows/knownfolders.rs +++ b/crates/rattler_menuinst/src/windows/knownfolders.rs @@ -13,7 +13,7 @@ pub struct Folders { user_folders: HashMap, } -#[derive(Clone, Copy)] +#[derive(Clone, Copy, PartialEq, Eq, Debug)] pub enum UserHandle { Current, Common, @@ -32,6 +32,7 @@ impl Folders { user_folders.insert("start".to_string(), KnownFolder::Programs); user_folders.insert("documents".to_string(), KnownFolder::Documents); user_folders.insert("profile".to_string(), KnownFolder::Profile); + user_folders.insert("quick_launch".to_string(), KnownFolder::QuickLaunch); Folders { system_folders, @@ -59,7 +60,7 @@ impl Folders { }; if let Some(folder) = preferred_folders.get(key) { - if let Some(path) = get_known_folder_path(folder) { + if let Some(path) = get_known_folder_path(*folder) { return Ok(path); } } @@ -67,7 +68,7 @@ impl Folders { // Implement fallback for user documents if preferred_mode == UserHandle::Current && key == "documents" { if let Some(profile_folder) = preferred_folders.get("profile") { - if let Some(profile_path) = get_known_folder_path(profile_folder) { + if let Some(profile_path) = get_known_folder_path(*profile_folder) { let documents_path = profile_path.join("Documents"); if documents_path.is_dir() { return Ok(documents_path); @@ -78,7 +79,7 @@ impl Folders { if check_other_mode { if let Some(folder) = other_folders.get(key) { - if let Some(path) = get_known_folder_path(folder) { + if let Some(path) = get_known_folder_path(*folder) { return Ok(path); } } @@ -97,26 +98,32 @@ impl Folders { } } -fn main() { - let folders = Folders::new(); - - let test_folders = vec![ - ("desktop", UserHandle::Current), - ("documents", UserHandle::Current), - ("start", UserHandle::Common), - ("profile", UserHandle::Common), - ]; - - for (folder, handle) in test_folders { - match folders.get_folder_path(folder, handle) { - Ok(path) => { - tracing::info!("{} path for {:?}: {:?}", folder, handle, path); - match folders.verify_path(&path) { - Ok(_) => println!(" Path verified successfully"), - Err(e) => println!(" Path verification failed: {:?}", e), +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_get_folder_path() { + let folders = Folders::new(); + + let test_folders = vec![ + ("desktop", UserHandle::Current), + ("documents", UserHandle::Current), + ("start", UserHandle::Common), + ("profile", UserHandle::Common), + ]; + + for (folder, handle) in test_folders { + match folders.get_folder_path(folder, handle) { + Ok(path) => { + println!("{} path for {:?}: {:?}", folder, handle, path); + match folders.verify_path(&path) { + Ok(_) => println!(" Path verified successfully"), + Err(e) => println!(" Path verification failed: {:?}", e), + } } + Err(e) => println!("Error getting {} path for {:?}: {:?}", folder, handle, e), } - Err(e) => tracing::error!("Error getting {} path for {:?}: {:?}", folder, handle, e), } } } From 3eb2cc26802e75daa60d76b67a3611c963d4eae9 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Tue, 26 Nov 2024 08:25:08 +0100 Subject: [PATCH 042/132] continue windows implementation --- crates/rattler_menuinst/src/utils/mod.rs | 2 - crates/rattler_menuinst/src/utils/unix_lex.rs | 13 ---- crates/rattler_menuinst/src/windows.rs | 67 +++++++++++++++-- crates/rattler_menuinst/src/windows/lex.rs | 74 +++++++++++++++++++ 4 files changed, 134 insertions(+), 22 deletions(-) delete mode 100644 crates/rattler_menuinst/src/utils/unix_lex.rs create mode 100644 crates/rattler_menuinst/src/windows/lex.rs diff --git a/crates/rattler_menuinst/src/utils/mod.rs b/crates/rattler_menuinst/src/utils/mod.rs index 8f1fee72c..edc1f74a2 100644 --- a/crates/rattler_menuinst/src/utils/mod.rs +++ b/crates/rattler_menuinst/src/utils/mod.rs @@ -1,7 +1,5 @@ use std::path::{Path, PathBuf}; -pub mod unix_lex; - pub fn menuinst_data_paths(prefix: &Path) -> Vec { vec![prefix.join("share/menuinst")] } diff --git a/crates/rattler_menuinst/src/utils/unix_lex.rs b/crates/rattler_menuinst/src/utils/unix_lex.rs deleted file mode 100644 index 2bde985f7..000000000 --- a/crates/rattler_menuinst/src/utils/unix_lex.rs +++ /dev/null @@ -1,13 +0,0 @@ -pub struct UnixLex; - -impl UnixLex { - pub fn quote_args(args: &[String]) -> Vec { - args.iter().map(|a| Self::quote_string(a)).collect() - } - - pub fn quote_string(s: &str) -> String { - shlex::try_quote(s) - .expect("Failed to quote string") - .to_string() - } -} diff --git a/crates/rattler_menuinst/src/windows.rs b/crates/rattler_menuinst/src/windows.rs index e5c461b9d..5f6d8252e 100644 --- a/crates/rattler_menuinst/src/windows.rs +++ b/crates/rattler_menuinst/src/windows.rs @@ -1,16 +1,16 @@ -use std::path::{Path, PathBuf}; +use std::{io::Write as _, path::{Path, PathBuf}}; use knownfolders::UserHandle; use crate::{ - render::{BaseMenuItemPlaceholders, MenuItemPlaceholders}, - schema::{Environment, MenuItemCommand, Windows}, - MenuInstError, MenuMode, + render::{BaseMenuItemPlaceholders, MenuItemPlaceholders}, schema::{Environment, MenuItemCommand, Windows}, utils::quote_args, MenuInstError, MenuMode }; +use fs_err as fs; + mod knownfolders; -// mod registry; -// +mod lex; + pub struct Directories { start_menu: PathBuf, quick_launch: PathBuf, @@ -79,6 +79,52 @@ impl WindowsMenu { } } + fn script_content(&self) -> String { + let mut lines = vec![ + "@echo off".to_string(), + ":: Script generated by conda/menuinst".to_string(), + ]; + + if let Some(pre_command_code) = self.command.precommand.as_ref() { + lines.push(pre_command_code.resolve(&self.placeholders)); + } + + if self.command.activate.unwrap_or_default() { + // TODO handle activation + } + + let args = self.command.command.iter().map(|elem| elem.resolve(&self.placeholders)).collect(); + lines.push(lex::quote_args(args).join(" ")); + + lines.join("\n") + } + + fn shortcut_filename(&self, ext: Option) -> String { + let env = if let Some(env_name) = self.placeholders.as_ref().get("ENV_NAME") { + format!(" ({})", env_name) + } else { + "".to_string() + }; + + let ext = ext.unwrap_or_else(|| "lnk".to_string()); + format!("{}{}{}", self.name, env, ext) + } + + fn write_script(&self, path: Option) -> Result<(), MenuInstError> { + let path = path.unwrap_or_else(|| { + self.prefix.join("Menu").join(self.shortcut_filename(None)) + }); + + if let Some(parent) = path.parent() { + fs::create_dir_all(parent)?; + } + + let mut file = fs::File::create(&path)?; + file.write_all(self.script_content().as_bytes())?; + + Ok(()) + } + fn build_command(&self, with_arg1: bool) { // TODO handle activation let mut command = Vec::new(); @@ -89,8 +135,15 @@ impl WindowsMenu { if with_arg1 && !command.iter().any(|s| s.contains("%1")) { command.push("%1".to_string()); } + } - + fn precreate(&self) -> Result<(), MenuInstError> { + if let Some(precreate_code) = self.command.precreate.as_ref() { + let precreate_code = precreate_code.resolve(&self.placeholders); + // TODO run precreate code in a hidden window + tracing::info!("Precreate code: {}", precreate_code); + } + Ok(()) } fn create_shortcut(&self, link_path: &Path, args: &str) -> Result<(), MenuInstError> { diff --git a/crates/rattler_menuinst/src/windows/lex.rs b/crates/rattler_menuinst/src/windows/lex.rs new file mode 100644 index 000000000..8c20fd195 --- /dev/null +++ b/crates/rattler_menuinst/src/windows/lex.rs @@ -0,0 +1,74 @@ +pub fn quote_args(args: Vec) -> Vec { + if args.len() > 2 + && (args[0].to_uppercase().contains("CMD.EXE") || args[0].to_uppercase().contains("%COMSPEC%")) + && (args[1].to_uppercase() == "/K" || args[1].to_uppercase() == "/C") + && args[2..].iter().any(|arg| arg.contains(' ')) + { + let cmd = ensure_pad(&args[0], '"'); + let flag = args[1].clone(); + let quoted_args = args[2..] + .iter() + .map(|arg| ensure_pad(arg, '"')) + .collect::>() + .join(" "); + vec![cmd, flag, format!("\"{}\"", quoted_args)] + } else { + args.into_iter().map(quote_string).collect() + } +} + +pub fn quote_string(s: String) -> String { + let s = s.trim_matches('"').to_string(); + if s.starts_with('-') || s.starts_with(' ') { + s + } else if s.contains(' ') || s.contains('/') { + format!("\"{}\"", s) + } else { + s + } +} + +pub fn ensure_pad(name: &str, pad: char) -> String { + if name.is_empty() || (name.starts_with(pad) && name.ends_with(pad)) { + name.to_string() + } else { + format!("{}{}{}", pad, name, pad) + } +} + +#[cfg(test)] +mod tests { + use super::{quote_args, quote_string, ensure_pad}; + + #[test] + fn test_quote_args() { + let args = vec![ + "cmd.exe".to_string(), + "/C".to_string(), + "echo".to_string(), + "Hello World".to_string(), + ]; + let expected = vec![ + "\"cmd.exe\"".to_string(), + "/C".to_string(), + "\"echo \"Hello World\"\"".to_string(), + ]; + assert_eq!(quote_args(args), expected); + } + + #[test] + fn test_quote_string() { + assert_eq!(quote_string("Hello World".to_string()), "\"Hello World\""); + assert_eq!(quote_string("Hello".to_string()), "Hello"); + assert_eq!(quote_string("-Hello".to_string()), "-Hello"); + assert_eq!(quote_string(" Hello".to_string()), " Hello"); + assert_eq!(quote_string("Hello/World".to_string()), "\"Hello/World\""); + } + + #[test] + fn test_ensure_pad() { + assert_eq!(ensure_pad("conda", '_'), "_conda_"); + assert_eq!(ensure_pad("_conda_", '_'), "_conda_"); + assert_eq!(ensure_pad("", '_'), ""); + } +} \ No newline at end of file From 583582878552b259be3471be33341bbb6ea196a4 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Tue, 10 Dec 2024 15:32:22 +0100 Subject: [PATCH 043/132] make compile on unix --- crates/rattler_menuinst/src/util.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/rattler_menuinst/src/util.rs b/crates/rattler_menuinst/src/util.rs index ad24b6d90..351de58f6 100644 --- a/crates/rattler_menuinst/src/util.rs +++ b/crates/rattler_menuinst/src/util.rs @@ -8,8 +8,8 @@ pub fn log_output(cmd_info: &str, output: std::process::Output) { } #[cfg(target_family = "unix")] -pub fn run_pre_create_command(pre_create_command: &str) -> Result<(), MenuInstError> { - use os::unix::fs::PermissionsExt; +pub fn run_pre_create_command(pre_create_command: &str) -> Result<(), crate::MenuInstError> { + use std::os::unix::fs::PermissionsExt; use std::{io::Write, process::Command}; use fs_err as fs; From 12395222a57607a19fdf52b7efda3456e6768497 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Tue, 10 Dec 2024 14:56:17 +0100 Subject: [PATCH 044/132] pre-process transaction and remove menu items --- crates/rattler/src/install/driver.rs | 28 ++++++++++++++++++++++++-- crates/rattler_menuinst/src/macos.rs | 28 ++++++++++---------------- crates/rattler_menuinst/src/schema.rs | 1 + crates/rattler_menuinst/src/slugify.rs | 1 + crates/rattler_menuinst/src/util.rs | 1 + 5 files changed, 40 insertions(+), 19 deletions(-) diff --git a/crates/rattler/src/install/driver.rs b/crates/rattler/src/install/driver.rs index 580f03c9a..698f9e82d 100644 --- a/crates/rattler/src/install/driver.rs +++ b/crates/rattler/src/install/driver.rs @@ -1,6 +1,7 @@ use std::{ borrow::Borrow, collections::{HashMap, HashSet}, + ffi::OsStr, path::{Path, PathBuf}, sync::{Arc, Mutex, MutexGuard}, }; @@ -155,10 +156,11 @@ impl InstallDriver { transaction: &Transaction, target_prefix: &Path, ) -> Result, PrePostLinkError> { + let mut result = None; if self.execute_link_scripts { match self.run_pre_unlink_scripts(transaction, target_prefix) { Ok(res) => { - return Ok(Some(res)); + result = Some(res); } Err(e) => { tracing::error!("Error running pre-unlink scripts: {:?}", e); @@ -166,7 +168,29 @@ impl InstallDriver { } } - Ok(None) + // For all packages that are removed, we need to remove menuinst entries as well + for record in transaction.removed_packages().map(Borrow::borrow) { + for path in record.paths_data.paths.iter() { + if path.relative_path.starts_with("Menu") + && path.relative_path.extension() == Some(OsStr::new("json")) + { + match rattler_menuinst::remove_menu_items( + &target_prefix.join(&path.relative_path), + target_prefix, + target_prefix, + Platform::current(), + rattler_menuinst::MenuMode::User, + ) { + Ok(_) => {} + Err(e) => { + tracing::warn!("Failed to remove menu item: {}", e); + } + } + } + } + } + + Ok(result) } /// Runs a blocking task that will execute on a separate thread. The task is diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index c98319edd..ae7532fe1 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -220,7 +220,7 @@ impl MacOSMenu { let bundle_name = format!("{name}.app"); let directories = Directories::new(menu_mode, &bundle_name); - tracing::info!("Installing menu item for {bundle_name}"); + tracing::info!("Editing menu item for {bundle_name}"); let refined_placeholders = placeholders.refine(&directories.location); Self { @@ -707,12 +707,16 @@ impl MacOSMenu { } pub fn remove(&self) -> Result, MenuInstError> { - println!("Removing {}", self.directories.location.display()); + tracing::info!("Removing menu item {}", self.directories.location.display()); self.maybe_register_with_launchservices(false)?; - fs_err::remove_dir_all(&self.directories.location).unwrap_or_else(|e| { - println!("Failed to remove directory: {e}. Ignoring error."); - }); - Ok(vec![self.directories.location.clone()]) + if self.directories.location.exists() { + fs_err::remove_dir_all(&self.directories.location).unwrap_or_else(|e| { + tracing::warn!("Failed to remove directory: {e}. Ignoring error."); + }); + return Ok(vec![self.directories.location.clone()]); + } else { + return Ok(vec![]); + } } } @@ -736,14 +740,4 @@ pub(crate) fn remove_menu_item( ) -> Result, MenuInstError> { let menu = MacOSMenu::new(prefix, macos_item, command, menu_mode, placeholders); menu.remove() -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_slugify() { - assert_eq!(slugify("Hello, World!"), "hello-world"); - } -} +} \ No newline at end of file diff --git a/crates/rattler_menuinst/src/schema.rs b/crates/rattler_menuinst/src/schema.rs index 65a3ccfe2..c929a0b18 100644 --- a/crates/rattler_menuinst/src/schema.rs +++ b/crates/rattler_menuinst/src/schema.rs @@ -107,6 +107,7 @@ pub struct NameComplex { pub enum Environment { Base, + #[allow(dead_code)] NotBase, } diff --git a/crates/rattler_menuinst/src/slugify.rs b/crates/rattler_menuinst/src/slugify.rs index f5bc40984..19f4509ab 100644 --- a/crates/rattler_menuinst/src/slugify.rs +++ b/crates/rattler_menuinst/src/slugify.rs @@ -22,6 +22,7 @@ mod tests { #[test] fn test_basic_slugify() { assert_eq!(slugify("Hello World"), "hello-world"); + assert_eq!(slugify("Hello, World!"), "hello-world"); } #[test] diff --git a/crates/rattler_menuinst/src/util.rs b/crates/rattler_menuinst/src/util.rs index 351de58f6..b64a9f86c 100644 --- a/crates/rattler_menuinst/src/util.rs +++ b/crates/rattler_menuinst/src/util.rs @@ -1,3 +1,4 @@ +#[allow(dead_code)] pub fn log_output(cmd_info: &str, output: std::process::Output) { tracing::info!("{}: status {}", cmd_info, output.status); tracing::info!( From 1e9447c80a273a3cf3a5400387df1c8c2f45ff53 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Tue, 10 Dec 2024 15:45:17 +0100 Subject: [PATCH 045/132] add simple menu test recipe --- test-data/menuinst/pixi-editor/menu/menu.json | 55 ++++++++++++++++++ .../menuinst/pixi-editor/menu/pixi-icon.icns | Bin 0 -> 243049 bytes .../menuinst/pixi-editor/menu/pixi-icon.ico | Bin 0 -> 45971 bytes .../menuinst/pixi-editor/menu/pixi-icon.png | Bin 0 -> 47011 bytes test-data/menuinst/pixi-editor/recipe.yaml | 16 +++++ 5 files changed, 71 insertions(+) create mode 100644 test-data/menuinst/pixi-editor/menu/menu.json create mode 100644 test-data/menuinst/pixi-editor/menu/pixi-icon.icns create mode 100644 test-data/menuinst/pixi-editor/menu/pixi-icon.ico create mode 100644 test-data/menuinst/pixi-editor/menu/pixi-icon.png create mode 100644 test-data/menuinst/pixi-editor/recipe.yaml diff --git a/test-data/menuinst/pixi-editor/menu/menu.json b/test-data/menuinst/pixi-editor/menu/menu.json new file mode 100644 index 000000000..dc7c1be8e --- /dev/null +++ b/test-data/menuinst/pixi-editor/menu/menu.json @@ -0,0 +1,55 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "$id": "https://schemas.conda.io/menuinst-1.schema.json", + "menu_name": "pixi-editor", + "menu_items": [ + { + "name": { + "target_environment_is_base": "pixi-editor", + "target_environment_is_not_base": "pixi-editor ({{ ENV_NAME }})" + }, + "description": "Scientific PYthon Development EnviRonment", + "icon": "{{ MENU_DIR }}/pixi-icon.{{ ICON_EXT }}", + "activate": false, + "terminal": false, + "command": [""], + "platforms": { + "win": { + "desktop": true, + "app_user_model_id": "dev.prefix.pixi-editor", + "command": ["notepad.exe", "%*"], + "file_extensions": [ + ".pixi" + ] + }, + "linux": { + "Categories": [ + "Development", + "Science" + ], + "command": ["gedit", "%F"], + "MimeType": [ + "text/x-pixi" + ] + }, + "osx": { + "command": ["open", "$@"], + "CFBundleName": "Pixi Editor", + "CFBundleIdentifier": "dev.prefix.pixi-editor", + "CFBundleVersion": "0.1.0", + "CFBundleDocumentTypes": [ + { + "CFBundleTypeName": "text document", + "CFBundleTypeRole": "Editor", + "LSHandlerRank": "Default", + "CFBundleTypeIconFile": "pixi-icon.icns", + "LSItemContentTypes": [ + "public.pixi" + ] + } + ] + } + } + } + ] +} diff --git a/test-data/menuinst/pixi-editor/menu/pixi-icon.icns b/test-data/menuinst/pixi-editor/menu/pixi-icon.icns new file mode 100644 index 0000000000000000000000000000000000000000..68f610243a1bbaa1b6e9c11dd872f813e056d083 GIT binary patch literal 243049 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
Byjv&*o$pV*g4K}2dtEd6GW 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 Xou=Qhe@?+100000NkvXXu0mjf586xv literal 0 HcmV?d00001 diff --git a/test-data/menuinst/pixi-editor/menu/pixi-icon.png b/test-data/menuinst/pixi-editor/menu/pixi-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ef095240da88d2de9fb3b883d921c7f96001cba8 GIT binary patch literal 47011 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 a_WyrFezi{@h^kru0000 Date: Tue, 10 Dec 2024 19:07:11 +0100 Subject: [PATCH 046/132] add example menu --- crates/rattler_menuinst/Cargo.toml | 2 + crates/rattler_menuinst/src/lib.rs | 9 + crates/rattler_menuinst/src/linux.rs | 174 +++++++- crates/rattler_menuinst/src/linux/menu_xml.rs | 391 ++++++++++++++++++ ...enu_xml__tests__add_and_remove_menu-2.snap | 14 + ...enu_xml__tests__add_and_remove_menu-3.snap | 7 + ..._menu_xml__tests__add_and_remove_menu.snap | 5 + ...__add_and_remove_menu_xml_structure-2.snap | 14 + ...ts__add_and_remove_menu_xml_structure.snap | 25 ++ ...xml__tests__remove_menu_xml_structure.snap | 10 + crates/rattler_menuinst/src/macos.rs | 2 +- crates/rattler_menuinst/src/windows.rs | 29 +- crates/rattler_menuinst/src/windows/lex.rs | 7 +- test-data/menuinst/linux-menu/example.menu | 12 + 14 files changed, 673 insertions(+), 28 deletions(-) create mode 100644 crates/rattler_menuinst/src/linux/menu_xml.rs create mode 100644 crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu-2.snap create mode 100644 crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu-3.snap create mode 100644 crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu.snap create mode 100644 crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu_xml_structure-2.snap create mode 100644 crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu_xml_structure.snap create mode 100644 crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__remove_menu_xml_structure.snap create mode 100644 test-data/menuinst/linux-menu/example.menu diff --git a/crates/rattler_menuinst/Cargo.toml b/crates/rattler_menuinst/Cargo.toml index c4050e060..c8f646baf 100644 --- a/crates/rattler_menuinst/Cargo.toml +++ b/crates/rattler_menuinst/Cargo.toml @@ -26,6 +26,8 @@ tempfile = { workspace = true } fs-err = { workspace = true } which = "7.0.0" known-folders = "1.2.0" +quick-xml = "0.37.1" +chrono = { workspace = true, features = ["clock"] } [target.'cfg(target_os = "windows")'.dependencies] winapi = "0.3.9" diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index f8b6efbc3..5c0ad0001 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -39,6 +39,10 @@ pub enum MenuInstError { PlistError(#[from] plist::Error), #[error("Failed to sign plist: {0}")] SigningFailed(String), + + #[cfg(target_os = "linux")] + #[error("Failed to install menu item: {0}")] + XmlError(#[from] quick_xml::Error), } // Install menu items from a given schema file @@ -53,6 +57,11 @@ pub fn install_menuitems( let menu_inst: MenuInstSchema = serde_json::from_str(&text)?; let placeholders = BaseMenuItemPlaceholders::new(base_prefix, prefix, platform); + // if platform.is_linux() { + // #[cfg(target_os = "linux")] + // linux::install_menu(&menu_inst.menu_name, prefix, menu_mode)?; + // } + for item in menu_inst.menu_items { if platform.is_linux() { #[cfg(target_os = "linux")] diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index 8147c17f4..09b073124 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -6,6 +6,8 @@ use std::path::{Path, PathBuf}; use std::process::Command; use tempfile::TempDir; +mod menu_xml; + use rattler_conda_types::Platform; use rattler_shell::activation::{ActivationVariables, Activator}; use rattler_shell::shell; @@ -92,6 +94,24 @@ impl Directories { } } + pub fn ensure_directories_exist(&self) -> Result<(), MenuInstError> { + let paths = vec![ + self.menu_config_location.parent().unwrap().to_path_buf(), + self.desktop_entries_location.clone(), + self.directory_entry_location + .parent() + .unwrap() + .to_path_buf(), + ]; + + for path in paths { + tracing::debug!("Ensuring path {} exists", path.display()); + fs::create_dir_all(path)?; + } + + Ok(()) + } + pub fn desktop_file(&self) -> PathBuf { self.desktop_entries_location.join(format!( "{}_{}.desktop", @@ -101,6 +121,146 @@ impl Directories { } } +// pub struct LinuxMenuDirectory { +// name: String, +// directories: Directories, +// mode: MenuMode, +// } + +// impl LinuxMenuDirectory { +// pub fn new(directories: Directories) -> Self { +// // TODO +// let name = "test".to_string(); +// Self { name, directories, mode: MenuMode::User } +// } + +// pub fn create(&self) -> Result { +// self.directories.ensure_directories_exist()?; +// let path = self.write_directory_entry()?; + +// if self.is_valid_menu_file()? && self.has_this_menu()? { +// return Ok(path); +// } + +// self.ensure_menu_file()?; +// self.add_this_menu()?; +// Ok(path) +// } + +// pub fn remove(&self) -> Result { +// fs::remove_file(&self.directories.directory_entry_location).ok(); + +// // Check if any shortcuts still exist +// for entry in fs::read_dir(&self.directories.desktop_entries_location)? { +// let entry = entry?; +// let filename = entry.file_name(); +// let filename = filename.to_string_lossy(); +// if filename.starts_with(&format!("{}_", slugify(&self.directories.menu_name))) { +// return Ok(self.directories.directory_entry_location.clone()); +// } +// } + +// self.remove_this_menu()?; +// Ok(self.directories.directory_entry_location.clone()) +// } + +// fn write_directory_entry(&self) -> Result { +// let file = &self.directories.directory_entry_location; +// tracing::info!("Creating directory entry at {:?}", file); +// let writer = File::create(file)?; +// let mut writer = std::io::BufWriter::new(writer); + +// writeln!(writer, "[Desktop Entry]")?; +// writeln!(writer, "Type=Directory")?; +// writeln!(writer, "Encoding=UTF-8")?; +// writeln!(writer, "Name={}", self.name)?; + +// Ok(file.clone()) +// } + +// fn is_valid_menu_file(&self) -> Result { +// if !self.directories.menu_config_location.exists() { +// return Ok(false); +// } + +// let file = File::open(&self.directories.menu_config_location)?; +// let mut reader = Reader::from_reader(file); +// let mut buf = Vec::new(); + +// // Check if first element is Menu +// match reader.read_event_into(&mut buf)? { +// Event::Start(e) if e.name().as_ref() == b"Menu" => Ok(true), +// _ => Ok(false), +// } +// } + +// fn has_this_menu(&self) -> Result { +// let file = File::open(&self.directories.menu_config_location)?; +// let mut reader = Reader::from_reader(file); +// let mut buf = Vec::new(); +// let mut inside_menu = false; + +// loop { +// match reader.read_event_into(&mut buf)? { +// Event::Start(e) if e.name().as_ref() == b"Menu" => { +// inside_menu = true; +// } +// Event::Start(e) if e.name().as_ref() == b"Name" && inside_menu => { +// if let Event::Text(t) = reader.read_event_into(&mut buf)? { +// if t.unescape()?.into_owned() == self.directories.name { +// return Ok(true); +// } +// } +// } +// Event::Eof => break, +// _ => (), +// } +// buf.clear(); +// } +// Ok(false) +// } + +// fn ensure_menu_file(&self) -> Result<()> { +// if self.directories.menu_config_location.exists() && !self.directories.menu_config_location.is_file() { +// return Err(anyhow!("Menu config location is not a file!")); +// } + +// if self.directories.menu_config_location.is_file() { +// let now = Local::now(); +// let backup = format!("{}.{}", +// self.directories.menu_config_location.display(), +// now.format("%Y-%m-%d_%Hh%Mm%S") +// ); +// fs::copy(&self.directories.menu_config_location, backup)?; + +// if !self.is_valid_menu_file()? { +// fs::remove_file(&self.directories.menu_config_location)?; +// } +// } + +// if !self.directories.menu_config_location.exists() { +// self.new_menu_file()?; +// } +// Ok(()) +// } + +// fn new_menu_file(&self) -> Result<()> { +// tracing::info!("Creating {}", self.directories.menu_config_location.display()); +// let mut contents = String::from("Applications"); + +// if self.mode == MenuMode::User { +// contents.push_str(&format!( +// "{}", +// self.directories.system_menu_config_location.display() +// )); +// } +// contents.push_str("\n"); + +// fs::write(&self.directories.menu_config_location, contents)?; +// Ok(()) +// } +// } + impl LinuxMenu { fn new( menu_name: &str, @@ -188,20 +348,6 @@ impl LinuxMenu { res } - fn create_directory_entry(&self) -> Result<(), MenuInstError> { - let file = &self.directories.directory_entry_location; - tracing::info!("Creating directory entry at {:?}", file); - let writer = File::create(file)?; - let mut writer = std::io::BufWriter::new(writer); - - writeln!(writer, "[Desktop Entry]")?; - writeln!(writer, "Type=Directory")?; - writeln!(writer, "Encoding=UTF-8")?; - writeln!(writer, "Name={}", self.name)?; - - Ok(()) - } - fn create_desktop_entry(&self) -> Result<(), MenuInstError> { let file = self.location(); let writer = File::create(file)?; diff --git a/crates/rattler_menuinst/src/linux/menu_xml.rs b/crates/rattler_menuinst/src/linux/menu_xml.rs new file mode 100644 index 000000000..79770311c --- /dev/null +++ b/crates/rattler_menuinst/src/linux/menu_xml.rs @@ -0,0 +1,391 @@ +use chrono::Utc; +use fs_err::{self as fs, File}; +use quick_xml::events::Event; +use quick_xml::{Reader, Writer}; +use std::io::{BufReader, Write}; +use std::path::PathBuf; + +use crate::{slugify, MenuInstError, MenuMode}; + +pub struct MenuXml { + menu_config_location: PathBuf, + system_menu_config_location: PathBuf, + name: String, + mode: MenuMode, +} + +impl MenuXml { + pub fn new( + menu_config_location: PathBuf, + system_menu_config_location: PathBuf, + name: String, + mode: MenuMode, + ) -> Self { + Self { + menu_config_location, + system_menu_config_location, + name, + mode, + } + } + + pub fn try_open(path: &PathBuf) -> Result>, MenuInstError> { + let file = File::open(path)?; + let buf_reader = BufReader::new(file); + + Ok(Reader::from_reader(buf_reader)) + } + + pub fn remove_menu(&self) -> Result<(), MenuInstError> { + tracing::info!( + "Editing {} to remove {} config", + self.menu_config_location.display(), + self.name + ); + + let xml_content = fs::read_to_string(&self.menu_config_location)?; + let mut reader = Reader::from_str(&xml_content); + + let mut writer = Writer::new(Vec::new()); + let mut buf = Vec::new(); + let mut skip_menu = false; + let mut depth = 0; + + loop { + match reader.read_event_into(&mut buf)? { + Event::DocType(_) | Event::Text(_) if depth == 0 => continue, + Event::Start(e) => { + if e.name().as_ref() == b"Menu" { + depth += 1; + if depth == 1 { + // Always write the root Menu element + writer.write_event(Event::Start(e))?; + } else { + // Check if this is our target menu + let mut inner_buf = Vec::new(); + let mut is_target = false; + while let Ok(inner_event) = reader.read_event_into(&mut inner_buf) { + match inner_event { + Event::Start(se) if se.name().as_ref() == b"Name" => { + if let Event::Text(t) = reader.read_event_into(&mut inner_buf)? { + if t.unescape()?.into_owned() == self.name { + is_target = true; + break; + } + } + break; + } + Event::End(ee) if ee.name().as_ref() == b"Menu" => break, + _ => continue, + } + } + if !is_target { + writer.write_event(Event::Start(e))?; + } else { + skip_menu = true; + } + } + } else if !skip_menu { + writer.write_event(Event::Start(e))?; + } + } + Event::End(e) => { + if e.name().as_ref() == b"Menu" { + depth -= 1; + if depth == 0 || !skip_menu { + writer.write_event(Event::End(e))?; + } + if skip_menu && depth == 0 { + skip_menu = false; + } + } else if !skip_menu { + writer.write_event(Event::End(e))?; + } + } + Event::Text(e) if !skip_menu => { + writer.write_event(Event::Text(e))?; + } + Event::Eof => break, + e => { + if !skip_menu { + writer.write_event(e)?; + } + } + } + buf.clear(); + } + + self.write_menu_file(&writer.into_inner()) + } + + pub fn has_menu(&self) -> Result { + let mut reader = Self::try_open(&self.menu_config_location)?; + let mut buf = Vec::new(); + + loop { + match reader.read_event_into(&mut buf)? { + Event::Start(e) if e.name().as_ref() == b"Menu" => { + if self.is_target_menu(&mut reader, &mut buf)? { + return Ok(true); + } + } + Event::Eof => break, + _ => (), + } + buf.clear(); + } + Ok(false) + } + + pub fn add_menu(&self) -> Result<(), MenuInstError> { + tracing::info!( + "Editing {} to add {} config", + self.menu_config_location.display(), + self.name + ); + + let mut content = fs::read_to_string(&self.menu_config_location)?; + // let insert_pos = content.rfind("").ok_or_else(|| anyhow!("Invalid XML"))?; + let insert_pos = content.rfind("").unwrap(); + + let menu_entry = format!( + r#" + {} + {}.directory + + {} + + +"#, + self.name, + slugify(&self.name), + self.name + ); + + content.insert_str(insert_pos, &menu_entry); + self.write_menu_file(content.as_bytes()) + } + + pub fn is_valid_menu_file(&self) -> bool { + if let Ok(reader) = Self::try_open(&self.menu_config_location) { + let mut buf = Vec::new(); + let mut reader = reader; + + if let Ok(event) = reader.read_event_into(&mut buf) { + match event { + Event::Start(e) => return e.name().as_ref() == b"Menu", + _ => return false, + } + } + } + false + } + + fn write_menu_file(&self, content: &[u8]) -> Result<(), MenuInstError> { + tracing::info!("Writing {}", self.menu_config_location.display()); + let mut file = File::create(&self.menu_config_location)?; + + file.write_all(b"\n")?; + file.write_all(content)?; + file.write_all(b"\n")?; + Ok(()) + } + + pub fn ensure_menu_file(&self) -> Result<(), MenuInstError> { + if self.menu_config_location.exists() && !self.menu_config_location.is_file() { + panic!( + "Menu config location {} is not a file!", + self.menu_config_location.display() + ); + // return Err(anyhow!("Menu config location {} is not a file!", + // self.menu_config_location.display())); + } + + if self.menu_config_location.is_file() { + let timestamp = Utc::now().format("%Y-%m-%d_%Hh%Mm%S").to_string(); + let backup = format!("{}.{}", self.menu_config_location.display(), timestamp); + fs::copy(&self.menu_config_location, &backup)?; + + if !self.is_valid_menu_file() { + fs::remove_file(&self.menu_config_location)?; + } + } + + if !self.menu_config_location.exists() { + self.new_menu_file()?; + } + Ok(()) + } + + fn new_menu_file(&self) -> Result<(), MenuInstError> { + tracing::info!("Creating {}", self.menu_config_location.display()); + let mut content = String::from("Applications"); + + if self.mode == MenuMode::User { + content.push_str(&format!( + "{}", + self.system_menu_config_location.display() + )); + } + content.push_str("\n"); + + fs::write(&self.menu_config_location, content)?; + Ok(()) + } + + fn is_target_menu( + &self, + reader: &mut Reader, + buf: &mut Vec, + ) -> Result { + loop { + match reader.read_event_into(buf)? { + Event::Start(e) if e.name().as_ref() == b"Name" => { + if let Event::Text(t) = reader.read_event_into(buf)? { + return Ok(t.unescape()?.into_owned() == self.name); + } + } + Event::End(e) if e.name().as_ref() == b"Menu" => break, + _ => (), + } + } + Ok(false) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use tempfile::TempDir; + + fn setup_test_dir() -> (TempDir, MenuXml) { + let temp_dir = TempDir::new().unwrap(); + let menu_config = temp_dir.path().join("applications.menu"); + let system_menu_config = temp_dir.path().join("system_applications.menu"); + + let menu_xml = MenuXml::new( + menu_config, + system_menu_config, + "Test Menu".to_string(), + MenuMode::User, + ); + + (temp_dir, menu_xml) + } + + #[test] + fn test_new_menu_file() { + let (_temp_dir, menu_xml) = setup_test_dir(); + menu_xml.new_menu_file().unwrap(); + assert!(menu_xml.is_valid_menu_file()); + } + + #[test] + fn test_add_and_remove_menu() { + let (_temp_dir, menu_xml) = setup_test_dir(); + menu_xml.new_menu_file().unwrap(); + + let system_menu_location = menu_xml.system_menu_config_location.display().to_string(); + + let res = fs::read_to_string(&menu_xml.menu_config_location).unwrap(); + let res = res.replace(&system_menu_location, "/path/to/system_menu"); + insta::assert_snapshot!(res); + + // Add menu + menu_xml.add_menu().unwrap(); + assert!(menu_xml.has_menu().unwrap()); + + let res = fs::read_to_string(&menu_xml.menu_config_location).unwrap(); + let res = res.replace(&system_menu_location, "/path/to/system_menu"); + insta::assert_snapshot!(res); + + // Remove menu + menu_xml.remove_menu().unwrap(); + + let res = fs::read_to_string(&menu_xml.menu_config_location).unwrap(); + let res = res.replace(&system_menu_location, "/path/to/system_menu"); + insta::assert_snapshot!(res); + assert!(!menu_xml.has_menu().unwrap()); + } + + #[test] + fn test_invalid_menu_file() { + let (_temp_dir, menu_xml) = setup_test_dir(); + + // Write invalid content + fs::write(&menu_xml.menu_config_location, "XML").unwrap(); + assert!(!menu_xml.is_valid_menu_file()); + } + + #[test] + fn test_ensure_menu_file() { + let (_temp_dir, menu_xml) = setup_test_dir(); + + // Test with non-existent file + menu_xml.ensure_menu_file().unwrap(); + assert!(menu_xml.menu_config_location.exists()); + assert!(menu_xml.is_valid_menu_file()); + + // Test with invalid file + fs::write(&menu_xml.menu_config_location, "XML").unwrap(); + menu_xml.ensure_menu_file().unwrap(); + assert!(menu_xml.is_valid_menu_file()); + } + + #[test] + fn test_remove_menu_xml_structure() { + let (_temp_dir, menu_xml) = setup_test_dir(); + + // Create initial menu file with content + let initial_content = r#" + + Applications + /path/to/system_menu + + Test Menu + test-menu.directory + + Test Menu + + + "#; + + fs::write(&menu_xml.menu_config_location, initial_content).unwrap(); + + // Remove the menu + menu_xml.remove_menu().unwrap(); + + // Read and verify the result + let result = fs::read_to_string(&menu_xml.menu_config_location).unwrap(); + + insta::assert_snapshot!(result); + } + + #[test] + // load file from test data (example.menu) and add a new entry, then remove it + fn test_add_and_remove_menu_xml_structure() { + let (_temp_dir, menu_xml) = setup_test_dir(); + + let test_data = crate::test::test_data(); + let schema_path = test_data.join("linux-menu/example.menu"); + + // Copy the example.menu file to the menu location + fs::copy(&schema_path, &menu_xml.menu_config_location).unwrap(); + + // Add the menu + menu_xml.add_menu().unwrap(); + + // Read and verify the result + let result = fs::read_to_string(&menu_xml.menu_config_location).unwrap(); + insta::assert_snapshot!(result); + + // Remove the menu + menu_xml.remove_menu().unwrap(); + + // Read and verify the result + let result = fs::read_to_string(&menu_xml.menu_config_location).unwrap(); + insta::assert_snapshot!(result); + } +} diff --git a/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu-2.snap b/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu-2.snap new file mode 100644 index 000000000..c122a0a2c --- /dev/null +++ b/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu-2.snap @@ -0,0 +1,14 @@ +--- +source: crates/rattler_menuinst/src/linux/menu_xml.rs +expression: res +--- + +Applications/path/to/system_menu + Test Menu + test-menu.directory + + Test Menu + + + diff --git a/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu-3.snap b/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu-3.snap new file mode 100644 index 000000000..5e127145a --- /dev/null +++ b/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu-3.snap @@ -0,0 +1,7 @@ +--- +source: crates/rattler_menuinst/src/linux/menu_xml.rs +expression: res +--- + +Applications/path/to/system_menu diff --git a/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu.snap b/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu.snap new file mode 100644 index 000000000..ae45911f1 --- /dev/null +++ b/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu.snap @@ -0,0 +1,5 @@ +--- +source: crates/rattler_menuinst/src/linux/menu_xml.rs +expression: res +--- +Applications/path/to/system_menu diff --git a/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu_xml_structure-2.snap b/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu_xml_structure-2.snap new file mode 100644 index 000000000..6dc8da3ff --- /dev/null +++ b/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu_xml_structure-2.snap @@ -0,0 +1,14 @@ +--- +source: crates/rattler_menuinst/src/linux/menu_xml.rs +expression: result +--- + + +Applications + + shinythings-webmirror.directory + + shinythings-webmirror.desktop + shinythings-webmirror-admin.desktop + diff --git a/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu_xml_structure.snap b/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu_xml_structure.snap new file mode 100644 index 000000000..9471af7c2 --- /dev/null +++ b/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu_xml_structure.snap @@ -0,0 +1,25 @@ +--- +source: crates/rattler_menuinst/src/linux/menu_xml.rs +expression: result +--- + + + +Applications + + WebMirror + shinythings-webmirror.directory + + shinythings-webmirror.desktop + shinythings-webmirror-admin.desktop + + + Test Menu + test-menu.directory + + Test Menu + + + diff --git a/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__remove_menu_xml_structure.snap b/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__remove_menu_xml_structure.snap new file mode 100644 index 000000000..a9dfafda7 --- /dev/null +++ b/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__remove_menu_xml_structure.snap @@ -0,0 +1,10 @@ +--- +source: crates/rattler_menuinst/src/linux/menu_xml.rs +expression: result +--- + + + Applications + /path/to/system_menu + diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index ae7532fe1..d87aeb8ad 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -740,4 +740,4 @@ pub(crate) fn remove_menu_item( ) -> Result, MenuInstError> { let menu = MacOSMenu::new(prefix, macos_item, command, menu_mode, placeholders); menu.remove() -} \ No newline at end of file +} diff --git a/crates/rattler_menuinst/src/windows.rs b/crates/rattler_menuinst/src/windows.rs index 5f6d8252e..6f25b5111 100644 --- a/crates/rattler_menuinst/src/windows.rs +++ b/crates/rattler_menuinst/src/windows.rs @@ -1,9 +1,15 @@ -use std::{io::Write as _, path::{Path, PathBuf}}; +use std::{ + io::Write as _, + path::{Path, PathBuf}, +}; use knownfolders::UserHandle; use crate::{ - render::{BaseMenuItemPlaceholders, MenuItemPlaceholders}, schema::{Environment, MenuItemCommand, Windows}, utils::quote_args, MenuInstError, MenuMode + render::{BaseMenuItemPlaceholders, MenuItemPlaceholders}, + schema::{Environment, MenuItemCommand, Windows}, + utils::quote_args, + MenuInstError, MenuMode, }; use fs_err as fs; @@ -93,7 +99,12 @@ impl WindowsMenu { // TODO handle activation } - let args = self.command.command.iter().map(|elem| elem.resolve(&self.placeholders)).collect(); + let args = self + .command + .command + .iter() + .map(|elem| elem.resolve(&self.placeholders)) + .collect(); lines.push(lex::quote_args(args).join(" ")); lines.join("\n") @@ -111,18 +122,17 @@ impl WindowsMenu { } fn write_script(&self, path: Option) -> Result<(), MenuInstError> { - let path = path.unwrap_or_else(|| { - self.prefix.join("Menu").join(self.shortcut_filename(None)) - }); + let path = + path.unwrap_or_else(|| self.prefix.join("Menu").join(self.shortcut_filename(None))); if let Some(parent) = path.parent() { fs::create_dir_all(parent)?; } - + let mut file = fs::File::create(&path)?; file.write_all(self.script_content().as_bytes())?; - - Ok(()) + + Ok(()) } fn build_command(&self, with_arg1: bool) { @@ -147,7 +157,6 @@ impl WindowsMenu { } fn create_shortcut(&self, link_path: &Path, args: &str) -> Result<(), MenuInstError> { - // target_path, *arguments = self._process_command() // working_dir = self.render_key("working_dir") // if working_dir: diff --git a/crates/rattler_menuinst/src/windows/lex.rs b/crates/rattler_menuinst/src/windows/lex.rs index 8c20fd195..188f93de5 100644 --- a/crates/rattler_menuinst/src/windows/lex.rs +++ b/crates/rattler_menuinst/src/windows/lex.rs @@ -1,6 +1,7 @@ pub fn quote_args(args: Vec) -> Vec { if args.len() > 2 - && (args[0].to_uppercase().contains("CMD.EXE") || args[0].to_uppercase().contains("%COMSPEC%")) + && (args[0].to_uppercase().contains("CMD.EXE") + || args[0].to_uppercase().contains("%COMSPEC%")) && (args[1].to_uppercase() == "/K" || args[1].to_uppercase() == "/C") && args[2..].iter().any(|arg| arg.contains(' ')) { @@ -38,7 +39,7 @@ pub fn ensure_pad(name: &str, pad: char) -> String { #[cfg(test)] mod tests { - use super::{quote_args, quote_string, ensure_pad}; + use super::{ensure_pad, quote_args, quote_string}; #[test] fn test_quote_args() { @@ -71,4 +72,4 @@ mod tests { assert_eq!(ensure_pad("_conda_", '_'), "_conda_"); assert_eq!(ensure_pad("", '_'), ""); } -} \ No newline at end of file +} diff --git a/test-data/menuinst/linux-menu/example.menu b/test-data/menuinst/linux-menu/example.menu new file mode 100644 index 000000000..25e296c90 --- /dev/null +++ b/test-data/menuinst/linux-menu/example.menu @@ -0,0 +1,12 @@ + + +Applications + + WebMirror + shinythings-webmirror.directory + + shinythings-webmirror.desktop + shinythings-webmirror-admin.desktop + + From 6b3f88edd93868425d0cf4217b0519b17f658baa Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Wed, 11 Dec 2024 11:33:01 +0100 Subject: [PATCH 047/132] update linux menu xml modifications --- crates/rattler_menuinst/src/lib.rs | 2 +- crates/rattler_menuinst/src/linux/menu_xml.rs | 159 ++++++++---------- ...enu_xml__tests__add_and_remove_menu-2.snap | 8 +- ...enu_xml__tests__add_and_remove_menu-3.snap | 8 +- ..._menu_xml__tests__add_and_remove_menu.snap | 6 +- ...__add_and_remove_menu_xml_structure-2.snap | 12 +- ...ts__add_and_remove_menu_xml_structure.snap | 2 - ...xml__tests__remove_menu_xml_structure.snap | 8 +- crates/rattler_menuinst/src/schema.rs | 2 +- .../test-data}/gnuradio/gnuradio-grc.json | 0 .../test-data}/gnuradio/grc.ico | Bin .../test-data}/gqrx/gqrx-menu.json | 0 .../test-data}/linux-menu/example.menu | 0 .../rattler_menuinst/test-data}/mne/menu.json | 0 .../test-data}/mne_menu/menu/LICENSE.txt | 0 .../test-data}/mne_menu/menu/console.icns | Bin .../test-data}/mne_menu/menu/console.ico | Bin .../test-data}/mne_menu/menu/console.png | Bin .../test-data}/mne_menu/menu/forum.icns | Bin .../test-data}/mne_menu/menu/forum.ico | Bin .../test-data}/mne_menu/menu/forum.png | Bin .../test-data}/mne_menu/menu/info.icns | Bin .../test-data}/mne_menu/menu/info.ico | Bin .../test-data}/mne_menu/menu/info.png | Bin .../test-data}/mne_menu/menu/menu.json | 0 .../test-data}/mne_menu/menu/mne.png | Bin .../test-data}/mne_menu/menu/mne_sys_info.py | 0 .../mne_menu/menu/open_prompt.applescript | 0 .../test-data}/mne_menu/menu/open_prompt.bat | 0 .../test-data}/mne_menu/menu/open_prompt.sh | 0 .../test-data}/mne_menu/menu/spyder.icns | Bin .../test-data}/mne_menu/menu/spyder.ico | Bin .../test-data}/mne_menu/menu/spyder.png | Bin .../test-data}/mne_menu/menu/web.icns | Bin .../test-data}/mne_menu/menu/web.ico | Bin .../test-data}/mne_menu/menu/web.png | Bin .../test-data}/pixi-editor/menu/menu.json | 0 .../pixi-editor/menu/pixi-icon.icns | Bin .../test-data}/pixi-editor/menu/pixi-icon.ico | Bin .../test-data}/pixi-editor/menu/pixi-icon.png | Bin .../test-data}/pixi-editor/recipe.yaml | 0 .../test-data}/spyder/menu.json | 0 42 files changed, 102 insertions(+), 105 deletions(-) rename {test-data/menuinst => crates/rattler_menuinst/test-data}/gnuradio/gnuradio-grc.json (100%) rename {test-data/menuinst => crates/rattler_menuinst/test-data}/gnuradio/grc.ico (100%) rename {test-data/menuinst => crates/rattler_menuinst/test-data}/gqrx/gqrx-menu.json (100%) rename {test-data/menuinst => crates/rattler_menuinst/test-data}/linux-menu/example.menu (100%) rename {test-data/menuinst => crates/rattler_menuinst/test-data}/mne/menu.json (100%) rename {test-data/menuinst => crates/rattler_menuinst/test-data}/mne_menu/menu/LICENSE.txt (100%) rename {test-data/menuinst => crates/rattler_menuinst/test-data}/mne_menu/menu/console.icns (100%) rename {test-data/menuinst => crates/rattler_menuinst/test-data}/mne_menu/menu/console.ico (100%) rename {test-data/menuinst => crates/rattler_menuinst/test-data}/mne_menu/menu/console.png (100%) rename {test-data/menuinst => crates/rattler_menuinst/test-data}/mne_menu/menu/forum.icns (100%) rename {test-data/menuinst => crates/rattler_menuinst/test-data}/mne_menu/menu/forum.ico (100%) rename {test-data/menuinst => crates/rattler_menuinst/test-data}/mne_menu/menu/forum.png (100%) rename {test-data/menuinst => crates/rattler_menuinst/test-data}/mne_menu/menu/info.icns (100%) rename {test-data/menuinst => crates/rattler_menuinst/test-data}/mne_menu/menu/info.ico (100%) rename {test-data/menuinst => crates/rattler_menuinst/test-data}/mne_menu/menu/info.png (100%) rename {test-data/menuinst => crates/rattler_menuinst/test-data}/mne_menu/menu/menu.json (100%) rename {test-data/menuinst => crates/rattler_menuinst/test-data}/mne_menu/menu/mne.png (100%) rename {test-data/menuinst => crates/rattler_menuinst/test-data}/mne_menu/menu/mne_sys_info.py (100%) rename {test-data/menuinst => crates/rattler_menuinst/test-data}/mne_menu/menu/open_prompt.applescript (100%) rename {test-data/menuinst => crates/rattler_menuinst/test-data}/mne_menu/menu/open_prompt.bat (100%) rename {test-data/menuinst => crates/rattler_menuinst/test-data}/mne_menu/menu/open_prompt.sh (100%) rename {test-data/menuinst => crates/rattler_menuinst/test-data}/mne_menu/menu/spyder.icns (100%) rename {test-data/menuinst => crates/rattler_menuinst/test-data}/mne_menu/menu/spyder.ico (100%) rename {test-data/menuinst => crates/rattler_menuinst/test-data}/mne_menu/menu/spyder.png (100%) rename {test-data/menuinst => crates/rattler_menuinst/test-data}/mne_menu/menu/web.icns (100%) rename {test-data/menuinst => crates/rattler_menuinst/test-data}/mne_menu/menu/web.ico (100%) rename {test-data/menuinst => crates/rattler_menuinst/test-data}/mne_menu/menu/web.png (100%) rename {test-data/menuinst => crates/rattler_menuinst/test-data}/pixi-editor/menu/menu.json (100%) rename {test-data/menuinst => crates/rattler_menuinst/test-data}/pixi-editor/menu/pixi-icon.icns (100%) rename {test-data/menuinst => crates/rattler_menuinst/test-data}/pixi-editor/menu/pixi-icon.ico (100%) rename {test-data/menuinst => crates/rattler_menuinst/test-data}/pixi-editor/menu/pixi-icon.png (100%) rename {test-data/menuinst => crates/rattler_menuinst/test-data}/pixi-editor/recipe.yaml (100%) rename {test-data/menuinst => crates/rattler_menuinst/test-data}/spyder/menu.json (100%) diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index 5c0ad0001..a154cb860 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -165,7 +165,7 @@ pub mod test { use crate::{install_menuitems, MenuMode}; pub(crate) fn test_data() -> PathBuf { - Path::new(env!("CARGO_MANIFEST_DIR")).join("../../test-data/menuinst") + Path::new(env!("CARGO_MANIFEST_DIR")).join("test-data") } #[test] diff --git a/crates/rattler_menuinst/src/linux/menu_xml.rs b/crates/rattler_menuinst/src/linux/menu_xml.rs index 79770311c..712eec02c 100644 --- a/crates/rattler_menuinst/src/linux/menu_xml.rs +++ b/crates/rattler_menuinst/src/linux/menu_xml.rs @@ -2,16 +2,17 @@ use chrono::Utc; use fs_err::{self as fs, File}; use quick_xml::events::Event; use quick_xml::{Reader, Writer}; -use std::io::{BufReader, Write}; +use thiserror::Error; +use std::io::Write; use std::path::PathBuf; -use crate::{slugify, MenuInstError, MenuMode}; +use crate::{slugify, MenuInstError}; pub struct MenuXml { menu_config_location: PathBuf, system_menu_config_location: PathBuf, name: String, - mode: MenuMode, + mode: String, } impl MenuXml { @@ -19,41 +20,54 @@ impl MenuXml { menu_config_location: PathBuf, system_menu_config_location: PathBuf, name: String, - mode: MenuMode, - ) -> Self { - Self { + mode: String, + ) -> Result { + Ok(Self { menu_config_location, system_menu_config_location, name, mode, - } + }) } - pub fn try_open(path: &PathBuf) -> Result>, MenuInstError> { - let file = File::open(path)?; - let buf_reader = BufReader::new(file); + fn is_target_menu(&self, mut reader: Reader<&[u8]>) -> Result { + let mut buf = Vec::new(); + loop { + match reader.read_event_into(&mut buf)? { + Event::Start(e) if e.name().as_ref() == b"Name" => { + if let Event::Text(t) = reader.read_event_into(&mut buf)? { + return Ok(t.unescape()?.into_owned() == self.name); + } + } + Event::End(e) if e.name().as_ref() == b"Menu" => break, + _ => (), + } + } + Ok(false) + } - Ok(Reader::from_reader(buf_reader)) + fn contents(&self) -> Result { + Ok(fs::read_to_string(&self.menu_config_location)?) } pub fn remove_menu(&self) -> Result<(), MenuInstError> { - tracing::info!( + println!( "Editing {} to remove {} config", self.menu_config_location.display(), self.name ); - let xml_content = fs::read_to_string(&self.menu_config_location)?; - let mut reader = Reader::from_str(&xml_content); + let contents = self.contents()?; + let mut reader = Reader::from_str(&contents); + reader.config_mut().trim_text(true); - let mut writer = Writer::new(Vec::new()); + let mut writer = Writer::new_with_indent(Vec::new(), b' ', 2); let mut buf = Vec::new(); let mut skip_menu = false; let mut depth = 0; loop { match reader.read_event_into(&mut buf)? { - Event::DocType(_) | Event::Text(_) if depth == 0 => continue, Event::Start(e) => { if e.name().as_ref() == b"Menu" { depth += 1; @@ -62,27 +76,11 @@ impl MenuXml { writer.write_event(Event::Start(e))?; } else { // Check if this is our target menu - let mut inner_buf = Vec::new(); - let mut is_target = false; - while let Ok(inner_event) = reader.read_event_into(&mut inner_buf) { - match inner_event { - Event::Start(se) if se.name().as_ref() == b"Name" => { - if let Event::Text(t) = reader.read_event_into(&mut inner_buf)? { - if t.unescape()?.into_owned() == self.name { - is_target = true; - break; - } - } - break; - } - Event::End(ee) if ee.name().as_ref() == b"Menu" => break, - _ => continue, - } - } - if !is_target { - writer.write_event(Event::Start(e))?; - } else { + + if self.is_target_menu(reader.clone())? { skip_menu = true; + } else { + writer.write_event(Event::Start(e))?; } } } else if !skip_menu { @@ -90,21 +88,12 @@ impl MenuXml { } } Event::End(e) => { - if e.name().as_ref() == b"Menu" { - depth -= 1; - if depth == 0 || !skip_menu { - writer.write_event(Event::End(e))?; - } - if skip_menu && depth == 0 { - skip_menu = false; - } + if skip_menu && e.name().as_ref() == b"Menu" { + skip_menu = false; } else if !skip_menu { writer.write_event(Event::End(e))?; } } - Event::Text(e) if !skip_menu => { - writer.write_event(Event::Text(e))?; - } Event::Eof => break, e => { if !skip_menu { @@ -119,13 +108,14 @@ impl MenuXml { } pub fn has_menu(&self) -> Result { - let mut reader = Self::try_open(&self.menu_config_location)?; + let contents = self.contents()?; + let mut reader = Reader::from_str(&contents); let mut buf = Vec::new(); loop { match reader.read_event_into(&mut buf)? { Event::Start(e) if e.name().as_ref() == b"Menu" => { - if self.is_target_menu(&mut reader, &mut buf)? { + if self.is_target_menu(reader.clone())? { return Ok(true); } } @@ -138,7 +128,7 @@ impl MenuXml { } pub fn add_menu(&self) -> Result<(), MenuInstError> { - tracing::info!( + println!( "Editing {} to add {} config", self.menu_config_location.display(), self.name @@ -167,14 +157,17 @@ impl MenuXml { } pub fn is_valid_menu_file(&self) -> bool { - if let Ok(reader) = Self::try_open(&self.menu_config_location) { + if let Ok(contents) = self.contents() { + let reader = Reader::from_str(&contents); let mut buf = Vec::new(); let mut reader = reader; - - if let Ok(event) = reader.read_event_into(&mut buf) { - match event { - Event::Start(e) => return e.name().as_ref() == b"Menu", - _ => return false, + loop { + match reader.read_event_into(&mut buf) { + Ok(Event::Start(e)) => if e.name().as_ref() == b"Menu" { + return true; + }, + Ok(Event::Eof) => break, + _ => (), } } } @@ -182,11 +175,8 @@ impl MenuXml { } fn write_menu_file(&self, content: &[u8]) -> Result<(), MenuInstError> { - tracing::info!("Writing {}", self.menu_config_location.display()); + println!("Writing {}", self.menu_config_location.display()); let mut file = File::create(&self.menu_config_location)?; - - file.write_all(b"\n")?; file.write_all(content)?; file.write_all(b"\n")?; Ok(()) @@ -219,43 +209,42 @@ impl MenuXml { } fn new_menu_file(&self) -> Result<(), MenuInstError> { - tracing::info!("Creating {}", self.menu_config_location.display()); - let mut content = String::from("Applications"); + println!("Creating {}", self.menu_config_location.display()); + let mut content = String::from("\n"); + content.push_str("\n Applications\n"); - if self.mode == MenuMode::User { + if self.mode == "user" { content.push_str(&format!( - "{}", + " {}\n", self.system_menu_config_location.display() )); } content.push_str("\n"); - + println!("{}", content); fs::write(&self.menu_config_location, content)?; Ok(()) } +} - fn is_target_menu( - &self, - reader: &mut Reader, - buf: &mut Vec, - ) -> Result { - loop { - match reader.read_event_into(buf)? { - Event::Start(e) if e.name().as_ref() == b"Name" => { - if let Event::Text(t) = reader.read_event_into(buf)? { - return Ok(t.unescape()?.into_owned() == self.name); - } - } - Event::End(e) if e.name().as_ref() == b"Menu" => break, - _ => (), - } - } - Ok(false) +// main function +fn main() { + let menu_config = PathBuf::from("applications.menu"); + let system_menu_config = PathBuf::from("system_applications.menu"); + + let menu_xml = MenuXml::new(menu_config, system_menu_config, "Test Menu".to_string(), "user".to_string()).unwrap(); + menu_xml.ensure_menu_file().unwrap(); + + if menu_xml.has_menu().unwrap() { + menu_xml.remove_menu().unwrap(); + } else { + menu_xml.add_menu().unwrap(); } } #[cfg(test)] mod tests { + use crate::test::test_data; + use super::*; use tempfile::TempDir; @@ -268,8 +257,8 @@ mod tests { menu_config, system_menu_config, "Test Menu".to_string(), - MenuMode::User, - ); + "user".to_string(), + ).unwrap(); (temp_dir, menu_xml) } @@ -368,7 +357,7 @@ mod tests { fn test_add_and_remove_menu_xml_structure() { let (_temp_dir, menu_xml) = setup_test_dir(); - let test_data = crate::test::test_data(); + let test_data = test_data(); let schema_path = test_data.join("linux-menu/example.menu"); // Copy the example.menu file to the menu location diff --git a/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu-2.snap b/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu-2.snap index c122a0a2c..9dc7a87d5 100644 --- a/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu-2.snap +++ b/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu-2.snap @@ -2,9 +2,11 @@ source: crates/rattler_menuinst/src/linux/menu_xml.rs expression: res --- - -Applications/path/to/system_menu + + + Applications + /path/to/system_menu + Test Menu test-menu.directory diff --git a/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu-3.snap b/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu-3.snap index 5e127145a..7946a27d6 100644 --- a/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu-3.snap +++ b/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu-3.snap @@ -2,6 +2,8 @@ source: crates/rattler_menuinst/src/linux/menu_xml.rs expression: res --- - -Applications/path/to/system_menu + + + Applications + /path/to/system_menu + diff --git a/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu.snap b/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu.snap index ae45911f1..7946a27d6 100644 --- a/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu.snap +++ b/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu.snap @@ -2,4 +2,8 @@ source: crates/rattler_menuinst/src/linux/menu_xml.rs expression: res --- -Applications/path/to/system_menu + + + Applications + /path/to/system_menu + diff --git a/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu_xml_structure-2.snap b/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu_xml_structure-2.snap index 6dc8da3ff..73a62efdf 100644 --- a/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu_xml_structure-2.snap +++ b/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu_xml_structure-2.snap @@ -3,12 +3,14 @@ source: crates/rattler_menuinst/src/linux/menu_xml.rs expression: result --- +"http://www.freedesktop.org/standards/menu-spec/menu-1.0.dtd"> -Applications - + Applications + + WebMirror shinythings-webmirror.directory - shinythings-webmirror.desktop - shinythings-webmirror-admin.desktop + shinythings-webmirror.desktop + shinythings-webmirror-admin.desktop + diff --git a/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu_xml_structure.snap b/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu_xml_structure.snap index 9471af7c2..7316724e9 100644 --- a/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu_xml_structure.snap +++ b/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu_xml_structure.snap @@ -2,8 +2,6 @@ source: crates/rattler_menuinst/src/linux/menu_xml.rs expression: result --- - diff --git a/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__remove_menu_xml_structure.snap b/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__remove_menu_xml_structure.snap index a9dfafda7..7055eba36 100644 --- a/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__remove_menu_xml_structure.snap +++ b/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__remove_menu_xml_structure.snap @@ -3,8 +3,8 @@ source: crates/rattler_menuinst/src/linux/menu_xml.rs expression: result --- + "http://standards.freedesktop.org/menu-spec/menu-1.0.dtd"> - Applications - /path/to/system_menu - + Applications + /path/to/system_menu + diff --git a/crates/rattler_menuinst/src/schema.rs b/crates/rattler_menuinst/src/schema.rs index c929a0b18..904e92b33 100644 --- a/crates/rattler_menuinst/src/schema.rs +++ b/crates/rattler_menuinst/src/schema.rs @@ -536,7 +536,7 @@ mod test { use std::path::{Path, PathBuf}; pub(crate) fn test_data() -> PathBuf { - Path::new(env!("CARGO_MANIFEST_DIR")).join("../../test-data/menuinst") + Path::new(env!("CARGO_MANIFEST_DIR")).join("test-data") } #[test] diff --git a/test-data/menuinst/gnuradio/gnuradio-grc.json b/crates/rattler_menuinst/test-data/gnuradio/gnuradio-grc.json similarity index 100% rename from test-data/menuinst/gnuradio/gnuradio-grc.json rename to crates/rattler_menuinst/test-data/gnuradio/gnuradio-grc.json diff --git a/test-data/menuinst/gnuradio/grc.ico b/crates/rattler_menuinst/test-data/gnuradio/grc.ico similarity index 100% rename from test-data/menuinst/gnuradio/grc.ico rename to crates/rattler_menuinst/test-data/gnuradio/grc.ico diff --git a/test-data/menuinst/gqrx/gqrx-menu.json b/crates/rattler_menuinst/test-data/gqrx/gqrx-menu.json similarity index 100% rename from test-data/menuinst/gqrx/gqrx-menu.json rename to crates/rattler_menuinst/test-data/gqrx/gqrx-menu.json diff --git a/test-data/menuinst/linux-menu/example.menu b/crates/rattler_menuinst/test-data/linux-menu/example.menu similarity index 100% rename from test-data/menuinst/linux-menu/example.menu rename to crates/rattler_menuinst/test-data/linux-menu/example.menu diff --git a/test-data/menuinst/mne/menu.json b/crates/rattler_menuinst/test-data/mne/menu.json similarity index 100% rename from test-data/menuinst/mne/menu.json rename to crates/rattler_menuinst/test-data/mne/menu.json diff --git a/test-data/menuinst/mne_menu/menu/LICENSE.txt b/crates/rattler_menuinst/test-data/mne_menu/menu/LICENSE.txt similarity index 100% rename from test-data/menuinst/mne_menu/menu/LICENSE.txt rename to crates/rattler_menuinst/test-data/mne_menu/menu/LICENSE.txt diff --git a/test-data/menuinst/mne_menu/menu/console.icns b/crates/rattler_menuinst/test-data/mne_menu/menu/console.icns similarity index 100% rename from test-data/menuinst/mne_menu/menu/console.icns rename to crates/rattler_menuinst/test-data/mne_menu/menu/console.icns diff --git a/test-data/menuinst/mne_menu/menu/console.ico b/crates/rattler_menuinst/test-data/mne_menu/menu/console.ico similarity index 100% rename from test-data/menuinst/mne_menu/menu/console.ico rename to crates/rattler_menuinst/test-data/mne_menu/menu/console.ico diff --git a/test-data/menuinst/mne_menu/menu/console.png b/crates/rattler_menuinst/test-data/mne_menu/menu/console.png similarity index 100% rename from test-data/menuinst/mne_menu/menu/console.png rename to crates/rattler_menuinst/test-data/mne_menu/menu/console.png diff --git a/test-data/menuinst/mne_menu/menu/forum.icns b/crates/rattler_menuinst/test-data/mne_menu/menu/forum.icns similarity index 100% rename from test-data/menuinst/mne_menu/menu/forum.icns rename to crates/rattler_menuinst/test-data/mne_menu/menu/forum.icns diff --git a/test-data/menuinst/mne_menu/menu/forum.ico b/crates/rattler_menuinst/test-data/mne_menu/menu/forum.ico similarity index 100% rename from test-data/menuinst/mne_menu/menu/forum.ico rename to crates/rattler_menuinst/test-data/mne_menu/menu/forum.ico diff --git a/test-data/menuinst/mne_menu/menu/forum.png b/crates/rattler_menuinst/test-data/mne_menu/menu/forum.png similarity index 100% rename from test-data/menuinst/mne_menu/menu/forum.png rename to crates/rattler_menuinst/test-data/mne_menu/menu/forum.png diff --git a/test-data/menuinst/mne_menu/menu/info.icns b/crates/rattler_menuinst/test-data/mne_menu/menu/info.icns similarity index 100% rename from test-data/menuinst/mne_menu/menu/info.icns rename to crates/rattler_menuinst/test-data/mne_menu/menu/info.icns diff --git a/test-data/menuinst/mne_menu/menu/info.ico b/crates/rattler_menuinst/test-data/mne_menu/menu/info.ico similarity index 100% rename from test-data/menuinst/mne_menu/menu/info.ico rename to crates/rattler_menuinst/test-data/mne_menu/menu/info.ico diff --git a/test-data/menuinst/mne_menu/menu/info.png b/crates/rattler_menuinst/test-data/mne_menu/menu/info.png similarity index 100% rename from test-data/menuinst/mne_menu/menu/info.png rename to crates/rattler_menuinst/test-data/mne_menu/menu/info.png diff --git a/test-data/menuinst/mne_menu/menu/menu.json b/crates/rattler_menuinst/test-data/mne_menu/menu/menu.json similarity index 100% rename from test-data/menuinst/mne_menu/menu/menu.json rename to crates/rattler_menuinst/test-data/mne_menu/menu/menu.json diff --git a/test-data/menuinst/mne_menu/menu/mne.png b/crates/rattler_menuinst/test-data/mne_menu/menu/mne.png similarity index 100% rename from test-data/menuinst/mne_menu/menu/mne.png rename to crates/rattler_menuinst/test-data/mne_menu/menu/mne.png diff --git a/test-data/menuinst/mne_menu/menu/mne_sys_info.py b/crates/rattler_menuinst/test-data/mne_menu/menu/mne_sys_info.py similarity index 100% rename from test-data/menuinst/mne_menu/menu/mne_sys_info.py rename to crates/rattler_menuinst/test-data/mne_menu/menu/mne_sys_info.py diff --git a/test-data/menuinst/mne_menu/menu/open_prompt.applescript b/crates/rattler_menuinst/test-data/mne_menu/menu/open_prompt.applescript similarity index 100% rename from test-data/menuinst/mne_menu/menu/open_prompt.applescript rename to crates/rattler_menuinst/test-data/mne_menu/menu/open_prompt.applescript diff --git a/test-data/menuinst/mne_menu/menu/open_prompt.bat b/crates/rattler_menuinst/test-data/mne_menu/menu/open_prompt.bat similarity index 100% rename from test-data/menuinst/mne_menu/menu/open_prompt.bat rename to crates/rattler_menuinst/test-data/mne_menu/menu/open_prompt.bat diff --git a/test-data/menuinst/mne_menu/menu/open_prompt.sh b/crates/rattler_menuinst/test-data/mne_menu/menu/open_prompt.sh similarity index 100% rename from test-data/menuinst/mne_menu/menu/open_prompt.sh rename to crates/rattler_menuinst/test-data/mne_menu/menu/open_prompt.sh diff --git a/test-data/menuinst/mne_menu/menu/spyder.icns b/crates/rattler_menuinst/test-data/mne_menu/menu/spyder.icns similarity index 100% rename from test-data/menuinst/mne_menu/menu/spyder.icns rename to crates/rattler_menuinst/test-data/mne_menu/menu/spyder.icns diff --git a/test-data/menuinst/mne_menu/menu/spyder.ico b/crates/rattler_menuinst/test-data/mne_menu/menu/spyder.ico similarity index 100% rename from test-data/menuinst/mne_menu/menu/spyder.ico rename to crates/rattler_menuinst/test-data/mne_menu/menu/spyder.ico diff --git a/test-data/menuinst/mne_menu/menu/spyder.png b/crates/rattler_menuinst/test-data/mne_menu/menu/spyder.png similarity index 100% rename from test-data/menuinst/mne_menu/menu/spyder.png rename to crates/rattler_menuinst/test-data/mne_menu/menu/spyder.png diff --git a/test-data/menuinst/mne_menu/menu/web.icns b/crates/rattler_menuinst/test-data/mne_menu/menu/web.icns similarity index 100% rename from test-data/menuinst/mne_menu/menu/web.icns rename to crates/rattler_menuinst/test-data/mne_menu/menu/web.icns diff --git a/test-data/menuinst/mne_menu/menu/web.ico b/crates/rattler_menuinst/test-data/mne_menu/menu/web.ico similarity index 100% rename from test-data/menuinst/mne_menu/menu/web.ico rename to crates/rattler_menuinst/test-data/mne_menu/menu/web.ico diff --git a/test-data/menuinst/mne_menu/menu/web.png b/crates/rattler_menuinst/test-data/mne_menu/menu/web.png similarity index 100% rename from test-data/menuinst/mne_menu/menu/web.png rename to crates/rattler_menuinst/test-data/mne_menu/menu/web.png diff --git a/test-data/menuinst/pixi-editor/menu/menu.json b/crates/rattler_menuinst/test-data/pixi-editor/menu/menu.json similarity index 100% rename from test-data/menuinst/pixi-editor/menu/menu.json rename to crates/rattler_menuinst/test-data/pixi-editor/menu/menu.json diff --git a/test-data/menuinst/pixi-editor/menu/pixi-icon.icns b/crates/rattler_menuinst/test-data/pixi-editor/menu/pixi-icon.icns similarity index 100% rename from test-data/menuinst/pixi-editor/menu/pixi-icon.icns rename to crates/rattler_menuinst/test-data/pixi-editor/menu/pixi-icon.icns diff --git a/test-data/menuinst/pixi-editor/menu/pixi-icon.ico b/crates/rattler_menuinst/test-data/pixi-editor/menu/pixi-icon.ico similarity index 100% rename from test-data/menuinst/pixi-editor/menu/pixi-icon.ico rename to crates/rattler_menuinst/test-data/pixi-editor/menu/pixi-icon.ico diff --git a/test-data/menuinst/pixi-editor/menu/pixi-icon.png b/crates/rattler_menuinst/test-data/pixi-editor/menu/pixi-icon.png similarity index 100% rename from test-data/menuinst/pixi-editor/menu/pixi-icon.png rename to crates/rattler_menuinst/test-data/pixi-editor/menu/pixi-icon.png diff --git a/test-data/menuinst/pixi-editor/recipe.yaml b/crates/rattler_menuinst/test-data/pixi-editor/recipe.yaml similarity index 100% rename from test-data/menuinst/pixi-editor/recipe.yaml rename to crates/rattler_menuinst/test-data/pixi-editor/recipe.yaml diff --git a/test-data/menuinst/spyder/menu.json b/crates/rattler_menuinst/test-data/spyder/menu.json similarity index 100% rename from test-data/menuinst/spyder/menu.json rename to crates/rattler_menuinst/test-data/spyder/menu.json From ead7c2711621b9c93e15cf4c1309a2f5b446d891 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Wed, 11 Dec 2024 12:27:08 +0100 Subject: [PATCH 048/132] make the test recipe noarch: generic --- crates/rattler_menuinst/test-data/pixi-editor/recipe.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/rattler_menuinst/test-data/pixi-editor/recipe.yaml b/crates/rattler_menuinst/test-data/pixi-editor/recipe.yaml index 3f7062526..03767f576 100644 --- a/crates/rattler_menuinst/test-data/pixi-editor/recipe.yaml +++ b/crates/rattler_menuinst/test-data/pixi-editor/recipe.yaml @@ -3,6 +3,7 @@ package: version: "0.1.0" build: + noarch: generic script: - if: unix then: From e2e136fd39701890459ab6a4d46ab71fcc37f693 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Wed, 11 Dec 2024 12:59:32 +0100 Subject: [PATCH 049/132] correct test and add create_shortcut functions --- crates/rattler_menuinst/Cargo.toml | 10 +- crates/rattler_menuinst/src/windows.rs | 1 + .../src/windows/create_shortcut.rs | 167 ++++++++++++++++++ crates/rattler_menuinst/src/windows/lex.rs | 2 +- 4 files changed, 178 insertions(+), 2 deletions(-) create mode 100644 crates/rattler_menuinst/src/windows/create_shortcut.rs diff --git a/crates/rattler_menuinst/Cargo.toml b/crates/rattler_menuinst/Cargo.toml index c8f646baf..19bd67e0f 100644 --- a/crates/rattler_menuinst/Cargo.toml +++ b/crates/rattler_menuinst/Cargo.toml @@ -30,7 +30,15 @@ quick-xml = "0.37.1" chrono = { workspace = true, features = ["clock"] } [target.'cfg(target_os = "windows")'.dependencies] -winapi = "0.3.9" +windows = { version = "0.58", features = [ + "Win32_System_Com", + "Win32_UI_Shell", + "Win32_System_Com_StructuredStorage", + "Win32_UI_Shell_PropertiesSystem", + "Win32_Storage_EnhancedStorage", + "Win32_Foundation", + "implement" +]} winreg = "0.52.0" [dev-dependencies] diff --git a/crates/rattler_menuinst/src/windows.rs b/crates/rattler_menuinst/src/windows.rs index 6f25b5111..32eb2e489 100644 --- a/crates/rattler_menuinst/src/windows.rs +++ b/crates/rattler_menuinst/src/windows.rs @@ -16,6 +16,7 @@ use fs_err as fs; mod knownfolders; mod lex; +mod create_shortcut; pub struct Directories { start_menu: PathBuf, diff --git a/crates/rattler_menuinst/src/windows/create_shortcut.rs b/crates/rattler_menuinst/src/windows/create_shortcut.rs new file mode 100644 index 000000000..7ce16bb79 --- /dev/null +++ b/crates/rattler_menuinst/src/windows/create_shortcut.rs @@ -0,0 +1,167 @@ +use windows::{ + core::*, + Win32::System::Com::*, + Win32::UI::Shell::*, + Win32::System::Com::StructuredStorage::*, + Win32::Storage::EnhancedStorage::PKEY_AppUserModel_ID, +}; +use PropertiesSystem::IPropertyStore; + +fn create_shortcut( + path: String, + description: String, + filename: String, + arguments: Option, + workdir: Option, + iconpath: Option, + iconindex: Option, + app_id: Option, +) -> Result<()> { + unsafe { + // Initialize COM + let co = CoInitialize(None); + if co.is_err() { + panic!("Failed to initialize COM"); + } + + let shell_link: IShellLinkW = CoCreateInstance( + &ShellLink as *const GUID, + None, + CLSCTX_INPROC_SERVER + )?; + + // Get IPersistFile interface + let persist_file: IPersistFile = shell_link.cast()?; + + // Set required properties + shell_link.SetPath(&HSTRING::from(path))?; + shell_link.SetDescription(&HSTRING::from(description))?; + + // Set optional properties + if let Some(args) = arguments { + shell_link.SetArguments(&HSTRING::from(args))?; + } + + if let Some(work_dir) = workdir { + shell_link.SetWorkingDirectory(&HSTRING::from(work_dir))?; + } + + if let Some(icon_path) = iconpath { + shell_link.SetIconLocation( + &HSTRING::from(icon_path), + iconindex.unwrap_or(0) + )?; + } + + // Handle App User Model ID if provided + if let Some(app_id_str) = app_id { + let property_store: IPropertyStore = shell_link.cast()?; + let mut prop_variant = InitPropVariantFromStringAsVector(&HSTRING::from(app_id_str))?; + property_store.SetValue(&PKEY_AppUserModel_ID, &prop_variant)?; + property_store.Commit()?; + PropVariantClear(&mut prop_variant)?; + } + + // Save the shortcut + persist_file.Save(&HSTRING::from(filename), true)?; + + CoUninitialize(); + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use std::fs; + use std::path::Path; + + #[test] + fn test_basic_shortcut_creation() { + let result = create_shortcut( + String::from("C:\\Windows\\notepad.exe"), + String::from("Notepad Shortcut"), + String::from("test_basic.lnk"), + None, + None, + None, + None, + None, + ); + + assert!(result.is_ok()); + assert!(Path::new("test_basic.lnk").exists()); + fs::remove_file("test_basic.lnk").unwrap(); + } + + #[test] + fn test_shortcut_with_arguments() { + let result = create_shortcut( + String::from("C:\\Windows\\notepad.exe"), + String::from("Notepad with Args"), + String::from("test_args.lnk"), + Some(String::from("/A test.txt")), + None, + None, + None, + None, + ); + + assert!(result.is_ok()); + assert!(Path::new("test_args.lnk").exists()); + fs::remove_file("test_args.lnk").unwrap(); + } + + #[test] + fn test_shortcut_with_all_options() { + let result = create_shortcut( + String::from("C:\\Windows\\notepad.exe"), + String::from("Full Options Shortcut"), + String::from("test_full.lnk"), + Some(String::from("/A")), + Some(String::from("C:\\Temp")), + Some(String::from("C:\\Windows\\notepad.exe")), + Some(0), + Some(String::from("MyApp.TestShortcut")), + ); + + assert!(result.is_ok()); + assert!(Path::new("test_full.lnk").exists()); + fs::remove_file("test_full.lnk").unwrap(); + } + + #[test] + fn test_invalid_path() { + let result = create_shortcut( + String::from("C:\\NonExistent\\fake.exe"), + String::from("Invalid Path"), + String::from("test_invalid.lnk"), + None, + None, + None, + None, + None, + ); + + assert!(result.is_ok()); // Note: Windows API doesn't validate path existence + if Path::new("test_invalid.lnk").exists() { + fs::remove_file("test_invalid.lnk").unwrap(); + } + } + + #[test] + fn test_invalid_save_location() { + let result = create_shortcut( + String::from("C:\\Windows\\notepad.exe"), + String::from("Invalid Save"), + String::from("C:\\NonExistent\\Directory\\test.lnk"), + None, + None, + None, + None, + None, + ); + + assert!(result.is_err()); + } +} diff --git a/crates/rattler_menuinst/src/windows/lex.rs b/crates/rattler_menuinst/src/windows/lex.rs index 188f93de5..c25392b86 100644 --- a/crates/rattler_menuinst/src/windows/lex.rs +++ b/crates/rattler_menuinst/src/windows/lex.rs @@ -52,7 +52,7 @@ mod tests { let expected = vec![ "\"cmd.exe\"".to_string(), "/C".to_string(), - "\"echo \"Hello World\"\"".to_string(), + "\"\"echo\" \"Hello World\"\"".to_string(), ]; assert_eq!(quote_args(args), expected); } From 22f130a3476cf1686b79c6122088035ae66db3f9 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Wed, 11 Dec 2024 13:00:12 +0100 Subject: [PATCH 050/132] fmt clippy --- crates/rattler_menuinst/src/linux/menu_xml.rs | 45 +++++++++++-------- crates/rattler_menuinst/src/windows.rs | 2 +- .../src/windows/create_shortcut.rs | 19 +++----- 3 files changed, 33 insertions(+), 33 deletions(-) diff --git a/crates/rattler_menuinst/src/linux/menu_xml.rs b/crates/rattler_menuinst/src/linux/menu_xml.rs index 712eec02c..5c2e57458 100644 --- a/crates/rattler_menuinst/src/linux/menu_xml.rs +++ b/crates/rattler_menuinst/src/linux/menu_xml.rs @@ -2,9 +2,9 @@ use chrono::Utc; use fs_err::{self as fs, File}; use quick_xml::events::Event; use quick_xml::{Reader, Writer}; -use thiserror::Error; use std::io::Write; use std::path::PathBuf; +use thiserror::Error; use crate::{slugify, MenuInstError}; @@ -56,16 +56,16 @@ impl MenuXml { self.menu_config_location.display(), self.name ); - + let contents = self.contents()?; let mut reader = Reader::from_str(&contents); reader.config_mut().trim_text(true); - + let mut writer = Writer::new_with_indent(Vec::new(), b' ', 2); let mut buf = Vec::new(); let mut skip_menu = false; let mut depth = 0; - + loop { match reader.read_event_into(&mut buf)? { Event::Start(e) => { @@ -103,10 +103,10 @@ impl MenuXml { } buf.clear(); } - + self.write_menu_file(&writer.into_inner()) } - + pub fn has_menu(&self) -> Result { let contents = self.contents()?; let mut reader = Reader::from_str(&contents); @@ -163,9 +163,11 @@ impl MenuXml { let mut reader = reader; loop { match reader.read_event_into(&mut buf) { - Ok(Event::Start(e)) => if e.name().as_ref() == b"Menu" { - return true; - }, + Ok(Event::Start(e)) => { + if e.name().as_ref() == b"Menu" { + return true; + } + } Ok(Event::Eof) => break, _ => (), } @@ -231,7 +233,13 @@ fn main() { let menu_config = PathBuf::from("applications.menu"); let system_menu_config = PathBuf::from("system_applications.menu"); - let menu_xml = MenuXml::new(menu_config, system_menu_config, "Test Menu".to_string(), "user".to_string()).unwrap(); + let menu_xml = MenuXml::new( + menu_config, + system_menu_config, + "Test Menu".to_string(), + "user".to_string(), + ) + .unwrap(); menu_xml.ensure_menu_file().unwrap(); if menu_xml.has_menu().unwrap() { @@ -258,7 +266,8 @@ mod tests { system_menu_config, "Test Menu".to_string(), "user".to_string(), - ).unwrap(); + ) + .unwrap(); (temp_dir, menu_xml) } @@ -325,7 +334,7 @@ mod tests { #[test] fn test_remove_menu_xml_structure() { let (_temp_dir, menu_xml) = setup_test_dir(); - + // Create initial menu file with content let initial_content = r#" @@ -340,23 +349,23 @@ mod tests { "#; - + fs::write(&menu_xml.menu_config_location, initial_content).unwrap(); - + // Remove the menu menu_xml.remove_menu().unwrap(); - + // Read and verify the result let result = fs::read_to_string(&menu_xml.menu_config_location).unwrap(); - + insta::assert_snapshot!(result); } - + #[test] // load file from test data (example.menu) and add a new entry, then remove it fn test_add_and_remove_menu_xml_structure() { let (_temp_dir, menu_xml) = setup_test_dir(); - + let test_data = test_data(); let schema_path = test_data.join("linux-menu/example.menu"); diff --git a/crates/rattler_menuinst/src/windows.rs b/crates/rattler_menuinst/src/windows.rs index 32eb2e489..3d8ff9689 100644 --- a/crates/rattler_menuinst/src/windows.rs +++ b/crates/rattler_menuinst/src/windows.rs @@ -14,9 +14,9 @@ use crate::{ use fs_err as fs; +mod create_shortcut; mod knownfolders; mod lex; -mod create_shortcut; pub struct Directories { start_menu: PathBuf, diff --git a/crates/rattler_menuinst/src/windows/create_shortcut.rs b/crates/rattler_menuinst/src/windows/create_shortcut.rs index 7ce16bb79..cb1266ac3 100644 --- a/crates/rattler_menuinst/src/windows/create_shortcut.rs +++ b/crates/rattler_menuinst/src/windows/create_shortcut.rs @@ -1,9 +1,6 @@ use windows::{ - core::*, - Win32::System::Com::*, - Win32::UI::Shell::*, - Win32::System::Com::StructuredStorage::*, - Win32::Storage::EnhancedStorage::PKEY_AppUserModel_ID, + core::*, Win32::Storage::EnhancedStorage::PKEY_AppUserModel_ID, + Win32::System::Com::StructuredStorage::*, Win32::System::Com::*, Win32::UI::Shell::*, }; use PropertiesSystem::IPropertyStore; @@ -24,11 +21,8 @@ fn create_shortcut( panic!("Failed to initialize COM"); } - let shell_link: IShellLinkW = CoCreateInstance( - &ShellLink as *const GUID, - None, - CLSCTX_INPROC_SERVER - )?; + let shell_link: IShellLinkW = + CoCreateInstance(&ShellLink as *const GUID, None, CLSCTX_INPROC_SERVER)?; // Get IPersistFile interface let persist_file: IPersistFile = shell_link.cast()?; @@ -47,10 +41,7 @@ fn create_shortcut( } if let Some(icon_path) = iconpath { - shell_link.SetIconLocation( - &HSTRING::from(icon_path), - iconindex.unwrap_or(0) - )?; + shell_link.SetIconLocation(&HSTRING::from(icon_path), iconindex.unwrap_or(0))?; } // Handle App User Model ID if provided From 582b1cd361d1618c5868385ba70fcf4262f4943d Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Wed, 11 Dec 2024 13:26:37 +0100 Subject: [PATCH 051/132] add tests for registry --- crates/rattler_menuinst/src/windows.rs | 1 + .../rattler_menuinst/src/windows/registry.rs | 153 +++++++++++++++++- 2 files changed, 146 insertions(+), 8 deletions(-) diff --git a/crates/rattler_menuinst/src/windows.rs b/crates/rattler_menuinst/src/windows.rs index 3d8ff9689..437bb982b 100644 --- a/crates/rattler_menuinst/src/windows.rs +++ b/crates/rattler_menuinst/src/windows.rs @@ -16,6 +16,7 @@ use fs_err as fs; mod create_shortcut; mod knownfolders; +mod registry; mod lex; pub struct Directories { diff --git a/crates/rattler_menuinst/src/windows/registry.rs b/crates/rattler_menuinst/src/windows/registry.rs index 34d4bfe9e..50bec8398 100644 --- a/crates/rattler_menuinst/src/windows/registry.rs +++ b/crates/rattler_menuinst/src/windows/registry.rs @@ -1,4 +1,3 @@ -use anyhow::{Context, Result}; use winreg::enums::*; use winreg::RegKey; @@ -8,7 +7,7 @@ pub fn register_file_extension( command: &str, icon: Option<&str>, mode: &str, -) -> Result<()> { +) -> Result<(), std::io::Error> { let hkey = if mode == "system" { HKEY_LOCAL_MACHINE } else { @@ -34,7 +33,7 @@ pub fn register_file_extension( // Set the 'open' command let command_key = classes.create_subkey(&format!("{}\\shell\\open\\command", identifier))?; command_key.0.set_value("", &command)?; - debug!("Created registry entry for command '{}'", command); + tracing::debug!("Created registry entry for command '{}'", command); // Set icon if provided if let Some(icon_path) = icon { @@ -46,7 +45,7 @@ pub fn register_file_extension( Ok(()) } -pub fn unregister_file_extension(extension: &str, identifier: &str, mode: &str) -> Result<()> { +pub fn unregister_file_extension(extension: &str, identifier: &str, mode: &str) -> Result<(), std::io::Error> { let hkey = if mode == "system" { HKEY_LOCAL_MACHINE } else { @@ -66,7 +65,7 @@ pub fn unregister_file_extension(extension: &str, identifier: &str, mode: &str) match ext_key { Ok(key) => { if key.get_value::(identifier).is_err() { - debug!( + tracing::debug!( "Handler '{}' is not associated with extension '{}'", identifier, extension ); @@ -89,7 +88,7 @@ pub fn register_url_protocol( identifier: Option<&str>, icon: Option<&str>, mode: &str, -) -> Result<()> { +) -> Result<(), std::io::Error> { let key = if mode == "system" { RegKey::predef(HKEY_CLASSES_ROOT).create_subkey(protocol)? } else { @@ -102,7 +101,7 @@ pub fn register_url_protocol( key.0.set_value("URL Protocol", &"")?; let command_key = key.0.create_subkey(r"shell\open\command")?; - command_key.set_value("", &command)?; + command_key.0.set_value("", &command)?; if let Some(icon_path) = icon { key.0.set_value("DefaultIcon", &icon_path)?; @@ -115,7 +114,7 @@ pub fn register_url_protocol( Ok(()) } -pub fn unregister_url_protocol(protocol: &str, identifier: Option<&str>, mode: &str) -> Result<()> { +pub fn unregister_url_protocol(protocol: &str, identifier: Option<&str>, mode: &str) -> Result<(), std::io::Error> { let key = if mode == "system" { RegKey::predef(HKEY_CLASSES_ROOT) } else { @@ -139,3 +138,141 @@ pub fn unregister_url_protocol(protocol: &str, identifier: Option<&str>, mode: & Ok(()) } + + +#[cfg(test)] +mod tests { + use super::*; + use winreg::RegKey; + + fn cleanup_registry(extension: &str, identifier: &str, mode: &str) { + let _ = unregister_file_extension(extension, identifier, mode); + } + + fn cleanup_protocol(protocol: &str, identifier: Option<&str>, mode: &str) { + let _ = unregister_url_protocol(protocol, identifier, mode); + } + + #[test] + fn test_register_file_extension_user() -> std::io::Result<()> { + let extension = ".rattlertest"; + let identifier = "TestApp.File"; + let command = "\"C:\\Test\\App.exe\" \"%1\""; + let mode = "user"; + + // Cleanup before test + cleanup_registry(extension, identifier, mode); + + // Test registration + register_file_extension(extension, identifier, command, None, mode)?; + + // Verify registration + let classes = RegKey::predef(HKEY_CURRENT_USER) + .open_subkey("Software\\Classes")?; + + let ext_key = classes.open_subkey(&format!("{}\\OpenWithProgids", extension))?; + assert!(ext_key.get_value::(identifier).is_ok()); + + let cmd_key = classes.open_subkey(&format!("{}\\shell\\open\\command", identifier))?; + let cmd_value: String = cmd_key.get_value("")?; + assert_eq!(cmd_value, command); + + // Cleanup + cleanup_registry(extension, identifier, mode); + Ok(()) + } + + #[test] + fn test_register_file_extension_with_icon() -> std::io::Result<()> { + let extension = ".yrattlertest"; + let identifier = "yTestApp.File"; + let command = "\"C:\\Test\\App.exe\" \"%1\""; + let icon = "C:\\Test\\icon.ico"; + let mode = "user"; + + // Test registration with icon + register_file_extension(extension, identifier, command, Some(icon), mode)?; + + // Verify icon + let classes = RegKey::predef(HKEY_CURRENT_USER) + .open_subkey("Software\\Classes")?; + let icon_key = classes.open_subkey(identifier)?; + let icon_value: String = icon_key.get_value("DefaultIcon")?; + assert_eq!(icon_value, icon); + + // Cleanup + cleanup_registry(extension, identifier, mode); + Ok(()) + } + + #[test] + fn test_unregister_file_extension() -> std::io::Result<()> { + let extension = ".xrattlertest"; + let identifier = "xTestApp.File"; + let command = "\"C:\\Test\\App.exe\" \"%1\""; + let mode = "user"; + + // Setup + register_file_extension(extension, identifier, command, None, mode)?; + + // Test unregistration + unregister_file_extension(extension, identifier, mode)?; + + // Verify removal + let classes = RegKey::predef(HKEY_CURRENT_USER).open_subkey("Software\\Classes")?; + + assert!(classes.open_subkey(identifier).is_err()); + + Ok(()) + } + + #[test] + fn test_register_url_protocol() -> std::io::Result<()> { + let protocol = "rattlertest"; + let command = "\"C:\\Test\\App.exe\" \"%1\""; + let identifier = Some("TestApp"); + let mode = "user"; + + // Cleanup before test + cleanup_protocol(protocol, identifier, mode); + + // Test registration + register_url_protocol(protocol, command, identifier, None, mode)?; + + // Verify registration + let key = RegKey::predef(HKEY_CURRENT_USER) + .open_subkey(&format!("Software\\Classes\\{}", protocol))?; + + let cmd_key = key.open_subkey(r"shell\open\command")?; + let cmd_value: String = cmd_key.get_value("")?; + assert_eq!(cmd_value, command); + + let id_value: String = key.get_value("_menuinst")?; + assert_eq!(id_value, identifier.unwrap()); + + // Cleanup + cleanup_protocol(protocol, identifier, mode); + Ok(()) + } + + #[test] + fn test_unregister_url_protocol() -> std::io::Result<()> { + let protocol = "rattlertest-2"; + let command = "\"C:\\Test\\App.exe\" \"%1\""; + let identifier = Some("xTestApp"); + let mode = "user"; + + // Setup + register_url_protocol(protocol, command, identifier, None, mode)?; + + // Test unregistration + unregister_url_protocol(protocol, identifier, mode)?; + + // Verify removal + let key = RegKey::predef(HKEY_CURRENT_USER) + .open_subkey("Software\\Classes")?; + assert!(key.open_subkey(protocol).is_err()); + + Ok(()) + } +} From b18ccc7b8e4c97e470e674c76f32b891dc31b9bc Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Wed, 11 Dec 2024 13:26:54 +0100 Subject: [PATCH 052/132] fmt --- crates/rattler_menuinst/src/windows.rs | 2 +- .../rattler_menuinst/src/windows/registry.rs | 25 +++++++++++-------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/crates/rattler_menuinst/src/windows.rs b/crates/rattler_menuinst/src/windows.rs index 437bb982b..f95df7797 100644 --- a/crates/rattler_menuinst/src/windows.rs +++ b/crates/rattler_menuinst/src/windows.rs @@ -16,8 +16,8 @@ use fs_err as fs; mod create_shortcut; mod knownfolders; -mod registry; mod lex; +mod registry; pub struct Directories { start_menu: PathBuf, diff --git a/crates/rattler_menuinst/src/windows/registry.rs b/crates/rattler_menuinst/src/windows/registry.rs index 50bec8398..35f7f4ee9 100644 --- a/crates/rattler_menuinst/src/windows/registry.rs +++ b/crates/rattler_menuinst/src/windows/registry.rs @@ -45,7 +45,11 @@ pub fn register_file_extension( Ok(()) } -pub fn unregister_file_extension(extension: &str, identifier: &str, mode: &str) -> Result<(), std::io::Error> { +pub fn unregister_file_extension( + extension: &str, + identifier: &str, + mode: &str, +) -> Result<(), std::io::Error> { let hkey = if mode == "system" { HKEY_LOCAL_MACHINE } else { @@ -67,7 +71,8 @@ pub fn unregister_file_extension(extension: &str, identifier: &str, mode: &str) if key.get_value::(identifier).is_err() { tracing::debug!( "Handler '{}' is not associated with extension '{}'", - identifier, extension + identifier, + extension ); } else { key.delete_value(identifier)?; @@ -114,7 +119,11 @@ pub fn register_url_protocol( Ok(()) } -pub fn unregister_url_protocol(protocol: &str, identifier: Option<&str>, mode: &str) -> Result<(), std::io::Error> { +pub fn unregister_url_protocol( + protocol: &str, + identifier: Option<&str>, + mode: &str, +) -> Result<(), std::io::Error> { let key = if mode == "system" { RegKey::predef(HKEY_CLASSES_ROOT) } else { @@ -139,7 +148,6 @@ pub fn unregister_url_protocol(protocol: &str, identifier: Option<&str>, mode: & Ok(()) } - #[cfg(test)] mod tests { use super::*; @@ -167,8 +175,7 @@ mod tests { register_file_extension(extension, identifier, command, None, mode)?; // Verify registration - let classes = RegKey::predef(HKEY_CURRENT_USER) - .open_subkey("Software\\Classes")?; + let classes = RegKey::predef(HKEY_CURRENT_USER).open_subkey("Software\\Classes")?; let ext_key = classes.open_subkey(&format!("{}\\OpenWithProgids", extension))?; assert!(ext_key.get_value::(identifier).is_ok()); @@ -194,8 +201,7 @@ mod tests { register_file_extension(extension, identifier, command, Some(icon), mode)?; // Verify icon - let classes = RegKey::predef(HKEY_CURRENT_USER) - .open_subkey("Software\\Classes")?; + let classes = RegKey::predef(HKEY_CURRENT_USER).open_subkey("Software\\Classes")?; let icon_key = classes.open_subkey(identifier)?; let icon_value: String = icon_key.get_value("DefaultIcon")?; assert_eq!(icon_value, icon); @@ -269,8 +275,7 @@ mod tests { unregister_url_protocol(protocol, identifier, mode)?; // Verify removal - let key = RegKey::predef(HKEY_CURRENT_USER) - .open_subkey("Software\\Classes")?; + let key = RegKey::predef(HKEY_CURRENT_USER).open_subkey("Software\\Classes")?; assert!(key.open_subkey(protocol).is_err()); Ok(()) From 0169a41b82216fc42e969831664793146587943d Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Wed, 11 Dec 2024 14:40:10 +0100 Subject: [PATCH 053/132] create a first shortcut on Windows --- crates/rattler_menuinst/src/schema.rs | 2 +- crates/rattler_menuinst/src/windows.rs | 72 ++++++++++++++++--- .../src/windows/create_shortcut.rs | 58 +++++++-------- crates/rattler_menuinst/src/windows/lex.rs | 6 +- 4 files changed, 97 insertions(+), 41 deletions(-) diff --git a/crates/rattler_menuinst/src/schema.rs b/crates/rattler_menuinst/src/schema.rs index 904e92b33..a3f3da695 100644 --- a/crates/rattler_menuinst/src/schema.rs +++ b/crates/rattler_menuinst/src/schema.rs @@ -154,7 +154,7 @@ pub struct Windows { /// If not set, defaults to `Menuinst.` /// /// For more information, see [Microsoft's AppUserModelID documentation](https://learn.microsoft.com/en-us/windows/win32/shell/appids#how-to-form-an-application-defined-appusermodelid) - pub app_user_model_id: Option, + pub app_user_model_id: Option, } /// Linux-specific instructions. diff --git a/crates/rattler_menuinst/src/windows.rs b/crates/rattler_menuinst/src/windows.rs index f95df7797..c74d3c25e 100644 --- a/crates/rattler_menuinst/src/windows.rs +++ b/crates/rattler_menuinst/src/windows.rs @@ -8,8 +8,7 @@ use knownfolders::UserHandle; use crate::{ render::{BaseMenuItemPlaceholders, MenuItemPlaceholders}, schema::{Environment, MenuItemCommand, Windows}, - utils::quote_args, - MenuInstError, MenuMode, + slugify, MenuInstError, MenuMode, }; use fs_err as fs; @@ -38,9 +37,11 @@ impl Directories { let desktop = known_folders .get_folder_path("desktop", UserHandle::Current) .unwrap(); - let programs = known_folders - .get_folder_path("programs", UserHandle::Current) - .unwrap(); + // let programs = known_folders + // .get_folder_path("programs", UserHandle::Current) + // .unwrap_or(known_folders.get_folder_path("programs", UserHandle::Common).unwrap()); + + let programs = PathBuf::from("C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs"); Directories { start_menu, @@ -101,13 +102,14 @@ impl WindowsMenu { // TODO handle activation } - let args = self + let args: Vec = self .command .command .iter() .map(|elem| elem.resolve(&self.placeholders)) .collect(); - lines.push(lex::quote_args(args).join(" ")); + + lines.push(lex::quote_args(&args).join(" ")); lines.join("\n") } @@ -137,7 +139,7 @@ impl WindowsMenu { Ok(()) } - fn build_command(&self, with_arg1: bool) { + fn build_command(&self, with_arg1: bool) -> Vec { // TODO handle activation let mut command = Vec::new(); for elem in self.command.command.iter() { @@ -147,6 +149,8 @@ impl WindowsMenu { if with_arg1 && !command.iter().any(|s| s.contains("%1")) { command.push("%1".to_string()); } + + command } fn precreate(&self) -> Result<(), MenuInstError> { @@ -158,7 +162,55 @@ impl WindowsMenu { Ok(()) } - fn create_shortcut(&self, link_path: &Path, args: &str) -> Result<(), MenuInstError> { + fn app_id(&self) -> String { + match self.item.app_user_model_id.as_ref() { + Some(aumi) => aumi.resolve(&self.placeholders), + None => format!( + "Menuinst.{}", + slugify(&self.name) + .replace(".", "") + .chars() + .take(128) + .collect::() + ), + } + } + + fn create_shortcut(&self, args: &[String]) -> Result<(), MenuInstError> { + let icon = self + .command + .icon + .as_ref() + .map(|s| s.resolve(&self.placeholders)); + let workdir = self + .command + .working_dir + .as_ref() + .map(|s| s.resolve(&self.placeholders)); + let app_id = self.app_id(); + + let args = lex::quote_args(args).join(" "); + + let link_name = format!("{}.lnk", self.name); + if self.item.desktop.unwrap_or(false) { + let desktop_link_path = self.directories.desktop.join(link_name); + create_shortcut::create_shortcut( + &self.name, + &self.command.description.resolve(&self.placeholders), + &desktop_link_path.to_string_lossy().to_string(), + Some(&args), + workdir.as_deref(), + icon.as_deref(), + Some(0), + Some(&app_id), + ) + .unwrap(); + } + // if self.metadata["desktop"]: + // extra_dirs.append(self.menu.desktop_location) + // if self.metadata["quicklaunch"] and self.menu.quick_launch_location: + // extra_dirs.append(self.menu.quick_launch_location) + // target_path, *arguments = self._process_command() // working_dir = self.render_key("working_dir") // if working_dir: @@ -186,6 +238,8 @@ impl WindowsMenu { } pub fn install(self) -> Result<(), MenuInstError> { + let args = self.build_command(true); + self.create_shortcut(&args); // let paths = [ // Some(&self.directories.programs), // if self.item.desktop.unwrap_or(false) { diff --git a/crates/rattler_menuinst/src/windows/create_shortcut.rs b/crates/rattler_menuinst/src/windows/create_shortcut.rs index cb1266ac3..5528918b9 100644 --- a/crates/rattler_menuinst/src/windows/create_shortcut.rs +++ b/crates/rattler_menuinst/src/windows/create_shortcut.rs @@ -4,16 +4,18 @@ use windows::{ }; use PropertiesSystem::IPropertyStore; -fn create_shortcut( - path: String, - description: String, - filename: String, - arguments: Option, - workdir: Option, - iconpath: Option, +pub fn create_shortcut( + path: &str, + description: &str, + filename: &str, + arguments: Option<&str>, + workdir: Option<&str>, + iconpath: Option<&str>, iconindex: Option, - app_id: Option, + app_id: Option<&str>, ) -> Result<()> { + tracing::info!("Creating shortcut: {} at {}", filename, path); + unsafe { // Initialize COM let co = CoInitialize(None); @@ -70,9 +72,9 @@ mod tests { #[test] fn test_basic_shortcut_creation() { let result = create_shortcut( - String::from("C:\\Windows\\notepad.exe"), - String::from("Notepad Shortcut"), - String::from("test_basic.lnk"), + "C:\\Windows\\notepad.exe", + "Notepad Shortcut", + "test_basic.lnk", None, None, None, @@ -88,10 +90,10 @@ mod tests { #[test] fn test_shortcut_with_arguments() { let result = create_shortcut( - String::from("C:\\Windows\\notepad.exe"), - String::from("Notepad with Args"), - String::from("test_args.lnk"), - Some(String::from("/A test.txt")), + "C:\\Windows\\notepad.exe", + "Notepad with Args", + "test_args.lnk", + Some("/A test.txt"), None, None, None, @@ -106,14 +108,14 @@ mod tests { #[test] fn test_shortcut_with_all_options() { let result = create_shortcut( - String::from("C:\\Windows\\notepad.exe"), - String::from("Full Options Shortcut"), - String::from("test_full.lnk"), - Some(String::from("/A")), - Some(String::from("C:\\Temp")), - Some(String::from("C:\\Windows\\notepad.exe")), + "C:\\Windows\\notepad.exe", + "Full Options Shortcut", + "test_full.lnk", + Some("/A"), + Some("C:\\Temp"), + Some("C:\\Windows\\notepad.exe"), Some(0), - Some(String::from("MyApp.TestShortcut")), + Some("MyApp.TestShortcut"), ); assert!(result.is_ok()); @@ -124,9 +126,9 @@ mod tests { #[test] fn test_invalid_path() { let result = create_shortcut( - String::from("C:\\NonExistent\\fake.exe"), - String::from("Invalid Path"), - String::from("test_invalid.lnk"), + "C:\\NonExistent\\fake.exe", + "Invalid Path", + "test_invalid.lnk", None, None, None, @@ -143,9 +145,9 @@ mod tests { #[test] fn test_invalid_save_location() { let result = create_shortcut( - String::from("C:\\Windows\\notepad.exe"), - String::from("Invalid Save"), - String::from("C:\\NonExistent\\Directory\\test.lnk"), + "C:\\Windows\\notepad.exe", + "Invalid Save", + "C:\\NonExistent\\Directory\\test.lnk", None, None, None, diff --git a/crates/rattler_menuinst/src/windows/lex.rs b/crates/rattler_menuinst/src/windows/lex.rs index c25392b86..f3cf286a9 100644 --- a/crates/rattler_menuinst/src/windows/lex.rs +++ b/crates/rattler_menuinst/src/windows/lex.rs @@ -1,4 +1,4 @@ -pub fn quote_args(args: Vec) -> Vec { +pub fn quote_args(args: &[String]) -> Vec { if args.len() > 2 && (args[0].to_uppercase().contains("CMD.EXE") || args[0].to_uppercase().contains("%COMSPEC%")) @@ -14,11 +14,11 @@ pub fn quote_args(args: Vec) -> Vec { .join(" "); vec![cmd, flag, format!("\"{}\"", quoted_args)] } else { - args.into_iter().map(quote_string).collect() + args.into_iter().map(|s| quote_string(&s)).collect() } } -pub fn quote_string(s: String) -> String { +pub fn quote_string(s: &str) -> String { let s = s.trim_matches('"').to_string(); if s.starts_with('-') || s.starts_with(' ') { s From d48686b4a5346ac0c9ce66efd57b41d61fd1e043 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Wed, 11 Dec 2024 17:00:12 +0100 Subject: [PATCH 054/132] improve --- crates/rattler_menuinst/src/windows.rs | 72 +++++++++---------- .../src/windows/create_shortcut.rs | 1 + 2 files changed, 35 insertions(+), 38 deletions(-) diff --git a/crates/rattler_menuinst/src/windows.rs b/crates/rattler_menuinst/src/windows.rs index c74d3c25e..54a6e40bf 100644 --- a/crates/rattler_menuinst/src/windows.rs +++ b/crates/rattler_menuinst/src/windows.rs @@ -182,64 +182,60 @@ impl WindowsMenu { .icon .as_ref() .map(|s| s.resolve(&self.placeholders)); - let workdir = self - .command - .working_dir - .as_ref() - .map(|s| s.resolve(&self.placeholders)); + + let workdir = if let Some(workdir) = &self.command.working_dir { + workdir.resolve(&self.placeholders) + } else { + "%HOMEPATH%".to_string() + }; + + if workdir != "%HOMEPATH%" { + fs::create_dir_all(&workdir)?; + } + let app_id = self.app_id(); + // split args into command and arguments + let (command, args) = args.split_first().unwrap(); let args = lex::quote_args(args).join(" "); let link_name = format!("{}.lnk", self.name); if self.item.desktop.unwrap_or(false) { - let desktop_link_path = self.directories.desktop.join(link_name); + let desktop_link_path = self.directories.desktop.join(&link_name); create_shortcut::create_shortcut( - &self.name, + &command, &self.command.description.resolve(&self.placeholders), &desktop_link_path.to_string_lossy().to_string(), Some(&args), - workdir.as_deref(), + Some(&workdir), + icon.as_deref(), + Some(0), + Some(&app_id), + ) + .unwrap(); + } + + if self.item.quicklaunch.unwrap_or(false) && self.directories.quick_launch.is_dir() { + let quicklaunch_link_path = self.directories.quick_launch.join(link_name); + create_shortcut::create_shortcut( + &self.name, + &self.command.description.resolve(&self.placeholders), + &quicklaunch_link_path.to_string_lossy().to_string(), + Some(&args), + Some(&workdir), icon.as_deref(), Some(0), Some(&app_id), ) .unwrap(); } - // if self.metadata["desktop"]: - // extra_dirs.append(self.menu.desktop_location) - // if self.metadata["quicklaunch"] and self.menu.quick_launch_location: - // extra_dirs.append(self.menu.quick_launch_location) - - // target_path, *arguments = self._process_command() - // working_dir = self.render_key("working_dir") - // if working_dir: - // Path(working_dir).mkdir(parents=True, exist_ok=True) - // else: - // working_dir = "%HOMEPATH%" - - // icon = self.render_key("icon") or "" - - // # winshortcut is a windows-only C extension! create_shortcut has this API - // # Notice args must be passed as positional, no keywords allowed! - // # winshortcut.create_shortcut(path, description, filename, arguments="", - // # workdir=None, iconpath=None, iconindex=0, app_id="") - // create_shortcut( - // target_path, - // self._shortcut_filename(ext=""), - // str(path), - // " ".join(arguments), - // working_dir, - // icon, - // 0, - // self._app_user_model_id(), - // ) + Ok(()) } pub fn install(self) -> Result<(), MenuInstError> { - let args = self.build_command(true); - self.create_shortcut(&args); + let args = self.build_command(false); + self.create_shortcut(&args)?; // let paths = [ // Some(&self.directories.programs), // if self.item.desktop.unwrap_or(false) { diff --git a/crates/rattler_menuinst/src/windows/create_shortcut.rs b/crates/rattler_menuinst/src/windows/create_shortcut.rs index 5528918b9..f4f590bc4 100644 --- a/crates/rattler_menuinst/src/windows/create_shortcut.rs +++ b/crates/rattler_menuinst/src/windows/create_shortcut.rs @@ -4,6 +4,7 @@ use windows::{ }; use PropertiesSystem::IPropertyStore; +/// Create a Windows `.lnk` shortcut file at the specified path. pub fn create_shortcut( path: &str, description: &str, From 8de50214691c4a71cd08e2fcd7f2425b8fab4451 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Thu, 12 Dec 2024 11:28:30 +0100 Subject: [PATCH 055/132] add SingleMainWindow --- crates/rattler_menuinst/src/linux.rs | 144 +----------------- crates/rattler_menuinst/src/linux/menu_xml.rs | 9 +- crates/rattler_menuinst/src/schema.rs | 4 + crates/rattler_menuinst/src/windows.rs | 7 +- 4 files changed, 15 insertions(+), 149 deletions(-) diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index 09b073124..9f2e852a9 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -121,146 +121,6 @@ impl Directories { } } -// pub struct LinuxMenuDirectory { -// name: String, -// directories: Directories, -// mode: MenuMode, -// } - -// impl LinuxMenuDirectory { -// pub fn new(directories: Directories) -> Self { -// // TODO -// let name = "test".to_string(); -// Self { name, directories, mode: MenuMode::User } -// } - -// pub fn create(&self) -> Result { -// self.directories.ensure_directories_exist()?; -// let path = self.write_directory_entry()?; - -// if self.is_valid_menu_file()? && self.has_this_menu()? { -// return Ok(path); -// } - -// self.ensure_menu_file()?; -// self.add_this_menu()?; -// Ok(path) -// } - -// pub fn remove(&self) -> Result { -// fs::remove_file(&self.directories.directory_entry_location).ok(); - -// // Check if any shortcuts still exist -// for entry in fs::read_dir(&self.directories.desktop_entries_location)? { -// let entry = entry?; -// let filename = entry.file_name(); -// let filename = filename.to_string_lossy(); -// if filename.starts_with(&format!("{}_", slugify(&self.directories.menu_name))) { -// return Ok(self.directories.directory_entry_location.clone()); -// } -// } - -// self.remove_this_menu()?; -// Ok(self.directories.directory_entry_location.clone()) -// } - -// fn write_directory_entry(&self) -> Result { -// let file = &self.directories.directory_entry_location; -// tracing::info!("Creating directory entry at {:?}", file); -// let writer = File::create(file)?; -// let mut writer = std::io::BufWriter::new(writer); - -// writeln!(writer, "[Desktop Entry]")?; -// writeln!(writer, "Type=Directory")?; -// writeln!(writer, "Encoding=UTF-8")?; -// writeln!(writer, "Name={}", self.name)?; - -// Ok(file.clone()) -// } - -// fn is_valid_menu_file(&self) -> Result { -// if !self.directories.menu_config_location.exists() { -// return Ok(false); -// } - -// let file = File::open(&self.directories.menu_config_location)?; -// let mut reader = Reader::from_reader(file); -// let mut buf = Vec::new(); - -// // Check if first element is Menu -// match reader.read_event_into(&mut buf)? { -// Event::Start(e) if e.name().as_ref() == b"Menu" => Ok(true), -// _ => Ok(false), -// } -// } - -// fn has_this_menu(&self) -> Result { -// let file = File::open(&self.directories.menu_config_location)?; -// let mut reader = Reader::from_reader(file); -// let mut buf = Vec::new(); -// let mut inside_menu = false; - -// loop { -// match reader.read_event_into(&mut buf)? { -// Event::Start(e) if e.name().as_ref() == b"Menu" => { -// inside_menu = true; -// } -// Event::Start(e) if e.name().as_ref() == b"Name" && inside_menu => { -// if let Event::Text(t) = reader.read_event_into(&mut buf)? { -// if t.unescape()?.into_owned() == self.directories.name { -// return Ok(true); -// } -// } -// } -// Event::Eof => break, -// _ => (), -// } -// buf.clear(); -// } -// Ok(false) -// } - -// fn ensure_menu_file(&self) -> Result<()> { -// if self.directories.menu_config_location.exists() && !self.directories.menu_config_location.is_file() { -// return Err(anyhow!("Menu config location is not a file!")); -// } - -// if self.directories.menu_config_location.is_file() { -// let now = Local::now(); -// let backup = format!("{}.{}", -// self.directories.menu_config_location.display(), -// now.format("%Y-%m-%d_%Hh%Mm%S") -// ); -// fs::copy(&self.directories.menu_config_location, backup)?; - -// if !self.is_valid_menu_file()? { -// fs::remove_file(&self.directories.menu_config_location)?; -// } -// } - -// if !self.directories.menu_config_location.exists() { -// self.new_menu_file()?; -// } -// Ok(()) -// } - -// fn new_menu_file(&self) -> Result<()> { -// tracing::info!("Creating {}", self.directories.menu_config_location.display()); -// let mut contents = String::from("Applications"); - -// if self.mode == MenuMode::User { -// contents.push_str(&format!( -// "{}", -// self.directories.system_menu_config_location.display() -// )); -// } -// contents.push_str("\n"); - -// fs::write(&self.directories.menu_config_location, contents)?; -// Ok(()) -// } -// } - impl LinuxMenu { fn new( menu_name: &str, @@ -424,6 +284,10 @@ impl LinuxMenu { writeln!(writer, "OnlyShowIn={}", self.resolve_and_join(only_show_in))?; } + if let Some(single_main_window) = &self.item.single_main_window { + writeln!(writer, "SingleMainWindow={single_main_window}")?; + } + if let Some(prefers_non_default_gpu) = &self.item.prefers_non_default_gpu { writeln!(writer, "PrefersNonDefaultGPU={prefers_non_default_gpu}")?; } diff --git a/crates/rattler_menuinst/src/linux/menu_xml.rs b/crates/rattler_menuinst/src/linux/menu_xml.rs index 5c2e57458..94750c957 100644 --- a/crates/rattler_menuinst/src/linux/menu_xml.rs +++ b/crates/rattler_menuinst/src/linux/menu_xml.rs @@ -51,7 +51,7 @@ impl MenuXml { } pub fn remove_menu(&self) -> Result<(), MenuInstError> { - println!( + tracing::info!( "Editing {} to remove {} config", self.menu_config_location.display(), self.name @@ -128,7 +128,7 @@ impl MenuXml { } pub fn add_menu(&self) -> Result<(), MenuInstError> { - println!( + tracing::info!( "Editing {} to add {} config", self.menu_config_location.display(), self.name @@ -177,7 +177,7 @@ impl MenuXml { } fn write_menu_file(&self, content: &[u8]) -> Result<(), MenuInstError> { - println!("Writing {}", self.menu_config_location.display()); + tracing::info!("Writing {}", self.menu_config_location.display()); let mut file = File::create(&self.menu_config_location)?; file.write_all(content)?; file.write_all(b"\n")?; @@ -211,7 +211,7 @@ impl MenuXml { } fn new_menu_file(&self) -> Result<(), MenuInstError> { - println!("Creating {}", self.menu_config_location.display()); + tracing::info!("Creating {}", self.menu_config_location.display()); let mut content = String::from("\n"); content.push_str("\n Applications\n"); @@ -222,7 +222,6 @@ impl MenuXml { )); } content.push_str("\n"); - println!("{}", content); fs::write(&self.menu_config_location, content)?; Ok(()) } diff --git a/crates/rattler_menuinst/src/schema.rs b/crates/rattler_menuinst/src/schema.rs index a3f3da695..ab5239a0e 100644 --- a/crates/rattler_menuinst/src/schema.rs +++ b/crates/rattler_menuinst/src/schema.rs @@ -189,6 +189,10 @@ pub struct Linux { #[serde(rename = "Keywords")] pub keywords: Option>, + /// Do not show the 'New Window' option in the app's context menu. + #[serde(rename = "SingleMainWindow")] + pub single_main_window: Option, + /// The MIME type(s) supported by this application. Note this includes file /// types and URL protocols. For URL protocols, use /// `x-scheme-handler/your-protocol-here`. For example, if you want to diff --git a/crates/rattler_menuinst/src/windows.rs b/crates/rattler_menuinst/src/windows.rs index 54a6e40bf..b6738215b 100644 --- a/crates/rattler_menuinst/src/windows.rs +++ b/crates/rattler_menuinst/src/windows.rs @@ -1,23 +1,22 @@ +use fs_err as fs; use std::{ io::Write as _, path::{Path, PathBuf}, }; -use knownfolders::UserHandle; - use crate::{ render::{BaseMenuItemPlaceholders, MenuItemPlaceholders}, schema::{Environment, MenuItemCommand, Windows}, slugify, MenuInstError, MenuMode, }; -use fs_err as fs; - mod create_shortcut; mod knownfolders; mod lex; mod registry; +use knownfolders::UserHandle; + pub struct Directories { start_menu: PathBuf, quick_launch: PathBuf, From 8b298dd8a5445468ff01a9e010e16a8a707c384f Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Thu, 12 Dec 2024 15:01:35 +0100 Subject: [PATCH 056/132] add macos testing of the whole menu installation --- crates/rattler_menuinst/src/linux.rs | 77 ++++++++ crates/rattler_menuinst/src/macos.rs | 166 +++++++++++++++++- crates/rattler_menuinst/src/render.rs | 4 +- crates/rattler_menuinst/src/schema.rs | 2 +- ...nuinst__schema__test__deserialize_mne.snap | 5 + ...nst__schema__test__deserialize_spyder.snap | 5 +- 6 files changed, 251 insertions(+), 8 deletions(-) diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index 9f2e852a9..493f6f323 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -148,6 +148,14 @@ impl LinuxMenu { } } + /// Set the directories for the menu item + fn with_directories(self, directories: Directories) -> Self { + LinuxMenu { + directories, + ..self + } + } + fn location(&self) -> PathBuf { self.directories.desktop_file() } @@ -562,3 +570,72 @@ pub fn remove_menu_item( let menu = LinuxMenu::new(menu_name, prefix, item, command, placeholders, menu_mode); menu.remove() } + +#[cfg(test)] +mod tests { + impl super::Directories { + pub fn new_test() -> Self { + let menu_name = "Test Menu"; + let name = "Test Item"; + let data_directory = tempfile::tempdir().unwrap().path().to_path_buf(); + let system_menu_config_location = tempfile::tempdir().unwrap().path().to_path_buf(); + let menu_config_location = tempfile::tempdir().unwrap().path().to_path_buf(); + let desktop_entries_location = tempfile::tempdir().unwrap().path().to_path_buf(); + let directory_entry_location = tempfile::tempdir().unwrap().path().to_path_buf(); + + Directories { + menu_name: menu_name.to_string(), + name: name.to_string(), + data_directory, + system_menu_config_location, + menu_config_location, + desktop_entries_location, + directory_entry_location, + } + } + } + + #[test] + fn test_directories() { + let dirs = super::Directories::new_test(); + assert!(dirs.ensure_directories_exist().is_ok()); + } + + #[test] + fn test_installation() { + let dirs = super::Directories::new_test(); + + let spyder = test_data().join("spyder/menu.json"); + let (prefix, base_prefix) = (Path::new("/base/prefix"), Path::new("/prefix")); + let text = std::fs::read_to_string(file)?; + let menu_inst: MenuInstSchema = serde_json::from_str(&text)?; + let placeholders = BaseMenuItemPlaceholders::new( + Path::from("/base/prefix"), + Path::from("/prefix"), + Platform::Linux64, + ); + let item = menu_inst.menu_items[0]; + let linux_item = item.platforms.linux.unwrap(); + let command = item.command.merge(linux_item.base); + LinuxMenu::new( + menu_inst.menu_name, + prefix, + item, + command, + placeholders, + MenuMode::User, + ) + .with_directories(dirs) + .install() + .unwrap(); + + // linux::install_menu_item( + // &, + // prefix, + // linux_item.specific, + // command, + // &placeholders, + // menu_mode, + // )?; + } +} diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index d87aeb8ad..cb8adb4db 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -26,7 +26,7 @@ use crate::{ utils, MenuInstError, MenuMode, }; -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct MacOSMenu { name: String, prefix: PathBuf, @@ -36,7 +36,7 @@ pub struct MacOSMenu { placeholders: MenuItemPlaceholders, } -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct Directories { /// Path to the .app directory defining the menu item location: PathBuf, @@ -207,19 +207,20 @@ impl CFBundleURLTypesModel { } impl MacOSMenu { - pub fn new( + fn new_impl( prefix: &Path, item: MacOS, command: MenuItemCommand, menu_mode: MenuMode, placeholders: &BaseMenuItemPlaceholders, + directories: Option, ) -> Self { let name = command .name .resolve(crate::schema::Environment::Base, placeholders); let bundle_name = format!("{name}.app"); - let directories = Directories::new(menu_mode, &bundle_name); + let directories = directories.unwrap_or(Directories::new(menu_mode, &bundle_name)); tracing::info!("Editing menu item for {bundle_name}"); let refined_placeholders = placeholders.refine(&directories.location); @@ -233,6 +234,35 @@ impl MacOSMenu { } } + #[cfg(test)] + pub fn new_with_directories( + prefix: &Path, + item: MacOS, + command: MenuItemCommand, + menu_mode: MenuMode, + placeholders: &BaseMenuItemPlaceholders, + directories: Directories, + ) -> Self { + Self::new_impl( + prefix, + item, + command, + menu_mode, + placeholders, + Some(directories), + ) + } + + pub fn new( + prefix: &Path, + item: MacOS, + command: MenuItemCommand, + menu_mode: MenuMode, + placeholders: &BaseMenuItemPlaceholders, + ) -> Self { + Self::new_impl(prefix, item, command, menu_mode, placeholders, None) + } + /// In macOS, file type and URL protocol associations are handled by the /// Apple Events system. When the user opens on a file or URL, the system /// will send an Apple Event to the application that was registered as a @@ -741,3 +771,131 @@ pub(crate) fn remove_menu_item( let menu = MacOSMenu::new(prefix, macos_item, command, menu_mode, placeholders); menu.remove() } + +#[cfg(test)] +mod tests { + use crate::{schema::MenuInstSchema, test::test_data, MenuMode}; + use std::{ + collections::HashMap, + fs, + path::{Path, PathBuf}, + }; + use tempfile::TempDir; + + impl super::Directories { + pub fn new_test() -> Self { + // Create a temporary directory for testing + Self { + location: tempfile::tempdir().unwrap().into_path(), + nested_location: tempfile::tempdir().unwrap().into_path(), + } + } + } + + #[test] + fn test_directories() { + let dirs = super::Directories::new_test(); + assert!(dirs.location.exists()); + assert!(dirs.nested_location.exists()); + } + + struct FakePlaceholders { + placeholders: HashMap, + } + + impl AsRef> for FakePlaceholders { + fn as_ref(&self) -> &HashMap { + &self.placeholders + } + } + + struct FakePrefix { + _tmp_dir: TempDir, + prefix_path: PathBuf, + schema: MenuInstSchema, + } + + impl FakePrefix { + fn new(schema_json: &Path) -> Self { + let tmp_dir = TempDir::new().unwrap(); + let prefix_path = tmp_dir.path().join("test-env"); + let schema_json = test_data().join(schema_json); + let menu_folder = prefix_path.join("Menu"); + + fs::create_dir_all(&menu_folder).unwrap(); + fs::copy( + &schema_json, + menu_folder.join(schema_json.file_name().unwrap()), + ) + .unwrap(); + + // Create a icon file for the + let schema = std::fs::read_to_string(schema_json).unwrap(); + let parsed_schema: MenuInstSchema = serde_json::from_str(&schema).unwrap(); + + let mut placeholders = HashMap::::new(); + placeholders.insert( + "MENU_DIR".to_string(), + menu_folder.to_string_lossy().to_string(), + ); + + for item in &parsed_schema.menu_items { + let icon = item.command.icon.as_ref().unwrap(); + for ext in &["icns", "png", "svg"] { + placeholders.insert("ICON_EXT".to_string(), ext.to_string()); + let icon_path = icon.resolve(FakePlaceholders { + placeholders: placeholders.clone(), + }); + fs::write(&icon_path, &[]).unwrap(); + } + } + + fs::create_dir_all(prefix_path.join("bin")).unwrap(); + fs::write(prefix_path.join("bin/python"), &[]).unwrap(); + + Self { + _tmp_dir: tmp_dir, + prefix_path, + schema: parsed_schema, + } + } + + pub fn prefix(&self) -> &Path { + &self.prefix_path + } + } + + #[test] + fn test_macos_menu_installation() { + let dirs = super::Directories::new_test(); + let fake_prefix = FakePrefix::new(Path::new("spyder/menu.json")); + + let placeholders = super::BaseMenuItemPlaceholders::new( + &fake_prefix.prefix(), + &fake_prefix.prefix(), + rattler_conda_types::Platform::current(), + ); + + let item = fake_prefix.schema.menu_items[0].clone(); + let macos = item.platforms.osx.unwrap(); + let command = item.command.merge(macos.base); + + let menu = super::MacOSMenu::new_with_directories( + fake_prefix.prefix(), + macos.specific, + command, + MenuMode::User, + &placeholders, + dirs.clone(), + ); + menu.install().unwrap(); + + assert!(dirs.location.exists()); + assert!(dirs.nested_location.exists()); + + // check that the plist file was created + insta::assert_snapshot!( + fs::read_to_string(dirs.location.join("Contents/Info.plist")).unwrap() + ); + } +} diff --git a/crates/rattler_menuinst/src/render.rs b/crates/rattler_menuinst/src/render.rs index d201dcd89..2e8794d01 100644 --- a/crates/rattler_menuinst/src/render.rs +++ b/crates/rattler_menuinst/src/render.rs @@ -32,8 +32,8 @@ pub struct BaseMenuItemPlaceholders { impl BaseMenuItemPlaceholders { pub fn new(base_prefix: &Path, prefix: &Path, platform: Platform) -> Self { let dist_name = |p: &Path| { - p.parent() - .and_then(|p| p.file_name().map(|s| s.to_string_lossy().to_string())) + p.file_name() + .map(|s| s.to_string_lossy().to_string()) .unwrap_or_else(|| "empty".to_string()) }; diff --git a/crates/rattler_menuinst/src/schema.rs b/crates/rattler_menuinst/src/schema.rs index ab5239a0e..1e67b7901 100644 --- a/crates/rattler_menuinst/src/schema.rs +++ b/crates/rattler_menuinst/src/schema.rs @@ -590,7 +590,7 @@ mod test { command .name .resolve(super::Environment::Base, &placeholders), - "Spyder 6 (empty)" + "Spyder 6 (prefix)" ); // let foo = menu_0.platforms.osx.as_ref().unwrap().base. diff --git a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_mne.snap b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_mne.snap index 899ec5997..6d2222ef4 100644 --- a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_mne.snap +++ b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_mne.snap @@ -70,6 +70,7 @@ MenuInstSchema { hidden: None, implements: None, keywords: None, + single_main_window: None, mime_type: None, no_display: None, not_show_in: None, @@ -231,6 +232,7 @@ MenuInstSchema { hidden: None, implements: None, keywords: None, + single_main_window: None, mime_type: None, no_display: None, not_show_in: None, @@ -389,6 +391,7 @@ MenuInstSchema { hidden: None, implements: None, keywords: None, + single_main_window: None, mime_type: None, no_display: None, not_show_in: None, @@ -562,6 +565,7 @@ MenuInstSchema { hidden: None, implements: None, keywords: None, + single_main_window: None, mime_type: None, no_display: None, not_show_in: None, @@ -732,6 +736,7 @@ MenuInstSchema { hidden: None, implements: None, keywords: None, + single_main_window: None, mime_type: None, no_display: None, not_show_in: None, diff --git a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_spyder.snap b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_spyder.snap index 432d09a03..151db7450 100644 --- a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_spyder.snap +++ b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_spyder.snap @@ -81,6 +81,7 @@ MenuInstSchema { hidden: None, implements: None, keywords: None, + single_main_window: None, mime_type: Some( [ PlaceholderString( @@ -524,7 +525,9 @@ MenuInstSchema { ], ), app_user_model_id: Some( - "spyder-ide.Spyder-6.{{ ENV_NAME }}", + PlaceholderString( + "spyder-ide.Spyder-6.{{ ENV_NAME }}", + ), ), }, }, From c446acb371c254a3e5a2e759ad1feaa32d8a56fc Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Thu, 12 Dec 2024 15:28:03 +0100 Subject: [PATCH 057/132] add snapshot test for linux desktop file --- crates/rattler_menuinst/src/linux.rs | 226 +++++++++++++----- ..._menuinst__linux__tests__installation.snap | 15 ++ 2 files changed, 180 insertions(+), 61 deletions(-) create mode 100644 crates/rattler_menuinst/src/snapshots/rattler_menuinst__linux__tests__installation.snap diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index 493f6f323..3fe2cc4bb 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -32,6 +32,7 @@ pub struct LinuxMenu { /// Directories used on Linux for menu items #[allow(unused)] +#[derive(Debug, Clone)] pub struct Directories { /// The name of the (parent) menu (in the json defined as `menu_name`) pub menu_name: String, @@ -129,12 +130,24 @@ impl LinuxMenu { command: MenuItemCommand, placeholders: &BaseMenuItemPlaceholders, mode: MenuMode, + ) -> Self { + Self::new_impl(menu_name, prefix, item, command, placeholders, mode, None) + } + + pub fn new_impl( + menu_name: &str, + prefix: &Path, + item: Linux, + command: MenuItemCommand, + placeholders: &BaseMenuItemPlaceholders, + mode: MenuMode, + directories: Option, ) -> Self { let name = command .name .resolve(crate::schema::Environment::Base, placeholders); - let directories = Directories::new(mode, &menu_name, &name); + let directories = directories.unwrap_or_else(|| Directories::new(mode, &menu_name, &name)); let refined_placeholders = placeholders.refine(&directories.desktop_file()); LinuxMenu { @@ -148,12 +161,24 @@ impl LinuxMenu { } } - /// Set the directories for the menu item - fn with_directories(self, directories: Directories) -> Self { - LinuxMenu { - directories, - ..self - } + #[cfg(test)] + pub fn new_with_directories( + menu_name: &str, + prefix: &Path, + item: Linux, + command: MenuItemCommand, + placeholders: &BaseMenuItemPlaceholders, + directories: Directories, + ) -> Self { + Self::new_impl( + menu_name, + prefix, + item, + command, + placeholders, + MenuMode::User, + Some(directories), + ) } fn location(&self) -> PathBuf { @@ -573,69 +598,148 @@ pub fn remove_menu_item( #[cfg(test)] mod tests { - impl super::Directories { - pub fn new_test() -> Self { - let menu_name = "Test Menu"; - let name = "Test Item"; - let data_directory = tempfile::tempdir().unwrap().path().to_path_buf(); - let system_menu_config_location = tempfile::tempdir().unwrap().path().to_path_buf(); - let menu_config_location = tempfile::tempdir().unwrap().path().to_path_buf(); - let desktop_entries_location = tempfile::tempdir().unwrap().path().to_path_buf(); - let directory_entry_location = tempfile::tempdir().unwrap().path().to_path_buf(); - - Directories { - menu_name: menu_name.to_string(), - name: name.to_string(), - data_directory, - system_menu_config_location, - menu_config_location, - desktop_entries_location, - directory_entry_location, + use fs_err as fs; + use std::{ + collections::HashMap, + path::{Path, PathBuf}, + }; + use tempfile::TempDir; + + use crate::{ + render::BaseMenuItemPlaceholders, schema::MenuInstSchema, test::test_data, MenuMode, + }; + + use super::{Directories, LinuxMenu}; + + struct FakeDirectories { + _tmp_dir: TempDir, + directories: Directories, + } + + impl FakeDirectories { + fn new() -> Self { + let tmp_dir = TempDir::new().unwrap(); + let directories = Directories { + menu_name: "Test".to_string(), + name: "Test".to_string(), + data_directory: tmp_dir.path().to_path_buf(), + system_menu_config_location: tmp_dir.path().join("system_menu_config_location"), + menu_config_location: tmp_dir.path().join("menu_config_location"), + desktop_entries_location: tmp_dir.path().join("desktop_entries_location"), + directory_entry_location: tmp_dir.path().join("directory_entry_location"), + }; + + directories.ensure_directories_exist().unwrap(); + + Self { + _tmp_dir: tmp_dir, + directories, } } + + pub fn directories(&self) -> &Directories { + &self.directories + } } - #[test] - fn test_directories() { - let dirs = super::Directories::new_test(); - assert!(dirs.ensure_directories_exist().is_ok()); + struct FakePlaceholders { + placeholders: HashMap, + } + + impl AsRef> for FakePlaceholders { + fn as_ref(&self) -> &HashMap { + &self.placeholders + } + } + + struct FakePrefix { + _tmp_dir: TempDir, + prefix_path: PathBuf, + schema: MenuInstSchema, + } + + impl FakePrefix { + fn new(schema_json: &str) -> Self { + let tmp_dir = TempDir::new().unwrap(); + let prefix_path = tmp_dir.path().join("test-env"); + let schema_json = test_data().join(schema_json); + let menu_folder = prefix_path.join("Menu"); + + fs::create_dir_all(&menu_folder).unwrap(); + fs::copy( + &schema_json, + menu_folder.join(schema_json.file_name().unwrap()), + ) + .unwrap(); + + // Create a icon file for the + let schema = std::fs::read_to_string(schema_json).unwrap(); + let parsed_schema: MenuInstSchema = serde_json::from_str(&schema).unwrap(); + + let mut placeholders = HashMap::::new(); + placeholders.insert( + "MENU_DIR".to_string(), + menu_folder.to_string_lossy().to_string(), + ); + + for item in &parsed_schema.menu_items { + let icon = item.command.icon.as_ref().unwrap(); + for ext in &["icns", "png", "svg"] { + placeholders.insert("ICON_EXT".to_string(), ext.to_string()); + let icon_path = icon.resolve(FakePlaceholders { + placeholders: placeholders.clone(), + }); + fs::write(&icon_path, &[]).unwrap(); + } + } + + fs::create_dir_all(prefix_path.join("bin")).unwrap(); + fs::write(prefix_path.join("bin/python"), &[]).unwrap(); + + Self { + _tmp_dir: tmp_dir, + prefix_path, + schema: parsed_schema, + } + } + + pub fn prefix(&self) -> &Path { + &self.prefix_path + } } #[test] fn test_installation() { - let dirs = super::Directories::new_test(); - - let spyder = test_data().join("spyder/menu.json"); - let (prefix, base_prefix) = (Path::new("/base/prefix"), Path::new("/prefix")); - let text = std::fs::read_to_string(file)?; - let menu_inst: MenuInstSchema = serde_json::from_str(&text)?; - let placeholders = BaseMenuItemPlaceholders::new( - Path::from("/base/prefix"), - Path::from("/prefix"), - Platform::Linux64, + let dirs = FakeDirectories::new(); + + let fake_prefix = FakePrefix::new("spyder/menu.json"); + + let item = fake_prefix.schema.menu_items[0].clone(); + let linux = item.platforms.linux.unwrap(); + let command = item.command.merge(linux.base); + + let placeholders = super::BaseMenuItemPlaceholders::new( + &fake_prefix.prefix(), + &fake_prefix.prefix(), + rattler_conda_types::Platform::current(), ); - let item = menu_inst.menu_items[0]; - let linux_item = item.platforms.linux.unwrap(); - let command = item.command.merge(linux_item.base); - LinuxMenu::new( - menu_inst.menu_name, - prefix, - item, + + let linux_menu = LinuxMenu::new_with_directories( + &fake_prefix.schema.menu_name, + fake_prefix.prefix(), + linux.specific, command, - placeholders, - MenuMode::User, - ) - .with_directories(dirs) - .install() - .unwrap(); - - // linux::install_menu_item( - // &, - // prefix, - // linux_item.specific, - // command, - // &placeholders, - // menu_mode, - // )?; + &placeholders, + dirs.directories().clone(), + ); + + linux_menu.install().unwrap(); + + // check snapshot of desktop file + let desktop_file = dirs.directories().desktop_file(); + let desktop_file_content = fs::read_to_string(&desktop_file).unwrap(); + let desktop_file_content = + desktop_file_content.replace(&fake_prefix.prefix().to_str().unwrap(), ""); + insta::assert_snapshot!(desktop_file_content); } } diff --git a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__linux__tests__installation.snap b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__linux__tests__installation.snap new file mode 100644 index 000000000..d8f1f246e --- /dev/null +++ b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__linux__tests__installation.snap @@ -0,0 +1,15 @@ +--- +source: crates/rattler_menuinst/src/linux.rs +expression: desktop_file_content +--- +[Desktop Entry] +Type=Application +Encoding=UTF-8 +Name=Spyder 6 (test-env) +Exec=bash -c '/bin/spyder %F' +Terminal=false +Icon=/Menu/spyder.png +Comment=Scientific PYthon Development EnviRonment +Categories=Development;Science; +MimeType=text/x-python; +StartupWMClass=Spyder-6.test-env From 141b1e89aaa5b033accdc01e8713db4c741f28e8 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Thu, 12 Dec 2024 15:31:08 +0100 Subject: [PATCH 058/132] a little clean up --- crates/rattler_menuinst/src/linux/menu_xml.rs | 21 ------------------- crates/rattler_menuinst/src/utils/mod.rs | 6 ------ 2 files changed, 27 deletions(-) diff --git a/crates/rattler_menuinst/src/linux/menu_xml.rs b/crates/rattler_menuinst/src/linux/menu_xml.rs index 94750c957..7f74a1a68 100644 --- a/crates/rattler_menuinst/src/linux/menu_xml.rs +++ b/crates/rattler_menuinst/src/linux/menu_xml.rs @@ -227,27 +227,6 @@ impl MenuXml { } } -// main function -fn main() { - let menu_config = PathBuf::from("applications.menu"); - let system_menu_config = PathBuf::from("system_applications.menu"); - - let menu_xml = MenuXml::new( - menu_config, - system_menu_config, - "Test Menu".to_string(), - "user".to_string(), - ) - .unwrap(); - menu_xml.ensure_menu_file().unwrap(); - - if menu_xml.has_menu().unwrap() { - menu_xml.remove_menu().unwrap(); - } else { - menu_xml.add_menu().unwrap(); - } -} - #[cfg(test)] mod tests { use crate::test::test_data; diff --git a/crates/rattler_menuinst/src/utils/mod.rs b/crates/rattler_menuinst/src/utils/mod.rs index edc1f74a2..1ea366d0a 100644 --- a/crates/rattler_menuinst/src/utils/mod.rs +++ b/crates/rattler_menuinst/src/utils/mod.rs @@ -1,9 +1,3 @@ -use std::path::{Path, PathBuf}; - -pub fn menuinst_data_paths(prefix: &Path) -> Vec { - vec![prefix.join("share/menuinst")] -} - pub fn quote_args(args: I) -> Vec where I: IntoIterator, From f9e59e0e4bc1598d67b2397bb8ef3f4a792698c7 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Thu, 12 Dec 2024 15:35:30 +0100 Subject: [PATCH 059/132] clean --- crates/rattler_menuinst/src/schema.rs | 2 - ...macos__tests__macos_menu_installation.snap | 143 ++++++++++++++++++ 2 files changed, 143 insertions(+), 2 deletions(-) create mode 100644 crates/rattler_menuinst/src/snapshots/rattler_menuinst__macos__tests__macos_menu_installation.snap diff --git a/crates/rattler_menuinst/src/schema.rs b/crates/rattler_menuinst/src/schema.rs index 1e67b7901..e3adf16ee 100644 --- a/crates/rattler_menuinst/src/schema.rs +++ b/crates/rattler_menuinst/src/schema.rs @@ -593,8 +593,6 @@ mod test { "Spyder 6 (prefix)" ); - // let foo = menu_0.platforms.osx.as_ref().unwrap().base. - // get_name(super::Environment::Base); insta::assert_debug_snapshot!(schema); } } diff --git a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__macos__tests__macos_menu_installation.snap b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__macos__tests__macos_menu_installation.snap new file mode 100644 index 000000000..2a94e0b8e --- /dev/null +++ b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__macos__tests__macos_menu_installation.snap @@ -0,0 +1,143 @@ +--- +source: crates/rattler_menuinst/src/macos.rs +expression: "fs::read_to_string(dirs.location.join(\"Contents/Info.plist\")).unwrap()" +--- + + + + + CFBundleName + Spyder 6 + CFBundleDisplayName + Spyder 6 (test-env) + CFBundleExecutable + spyder-6-test-env + CFBundleIdentifier + com.spyder-6-test-env-appkit-launcher + CFBundlePackageType + APPL + CFBundleVersion + 6.0.2 + CFBundleGetInfoString + spyder-6-test-env-6.0.2 + CFBundleShortVersionString + 6.0.2 + CFBundleIconFile + spyder.icns + CFBundleDocumentTypes + + + CFBundleTypeName + text document + CFBundleTypeIconFile + spyder.icns + CFBundleTypeRole + Editor + LSItemContentType + + com.apple.applescript.text + com.apple.ascii-property-list + com.apple.audio-unit-preset + com.apple.binary-property-list + com.apple.configprofile + com.apple.crashreport + com.apple.dashcode.css + com.apple.dashcode.javascript + com.apple.dashcode.json + com.apple.dashcode.manifest + com.apple.dt.document.ascii-property-list + com.apple.dt.document.script-suite-property-list + com.apple.dt.document.script-terminology-property-list + com.apple.property-list + com.apple.rez-source + com.apple.scripting-definition + com.apple.structured-text + com.apple.traditional-mac-plain-text + com.apple.xcode.ada-source + com.apple.xcode.apinotes + com.apple.xcode.bash-script + com.apple.xcode.configsettings + com.apple.xcode.csh-script + com.apple.xcode.entitlements-property-list + com.apple.xcode.fortran-source + com.apple.xcode.glsl-source + com.apple.xcode.ksh-script + com.apple.xcode.lex-source + com.apple.xcode.make-script + com.apple.xcode.mig-source + com.apple.xcode.pascal-source + com.apple.xcode.strings-text + com.apple.xcode.tcsh-script + com.apple.xcode.yacc-source + com.apple.xcode.zsh-script + com.apple.xml-property-list + com.netscape.javascript-source + com.scenarist.closed-caption + com.sun.java-source + com.sun.java-web-start + net.daringfireball.markdown + org.khronos.glsl-source + org.oasis-open.xliff + public.ada-source + public.assembly-source + public.bash-script + public.c-header + public.c-plus-plus-header + public.c-plus-plus-source + public.c-source + public.case-insensitive-text + public.comma-separated-values-text + public.csh-script + public.css + public.delimited-values-text + public.dylan-source + public.filename-extension + public.fortran-77-source + public.fortran-90-source + public.fortran-95-source + public.fortran-source + public.html + public.json + public.ksh-script + public.lex-source + public.log + public.m3u-playlist + public.make-source + public.mig-source + public.mime-type + public.module-map + public.nasm-assembly-source + public.objective-c-plus-plus-source + public.objective-c-source + public.opencl-source + public.pascal-source + public.patch-file + public.perl-script + public.php-script + public.plain-text + public.python-script + public.rss + public.ruby-script + public.script + public.shell-script + public.source-code + public.tcsh-script + public.text + public.utf16-external-plain-text + public.utf16-plain-text + public.utf8-plain-text + public.utf8-tab-separated-values-text + public.xhtml + public.xml + public.yacc-source + public.yaml + public.zsh-script + + LSHandlerRank + Default + + + LSBackgroundOnly + + + From 3cd2c19b578f7738ae9fc1b63019bd5ed902450e Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Thu, 12 Dec 2024 17:43:50 +0100 Subject: [PATCH 060/132] use correct defaults --- crates/rattler_menuinst/src/windows.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/rattler_menuinst/src/windows.rs b/crates/rattler_menuinst/src/windows.rs index b6738215b..630ae221f 100644 --- a/crates/rattler_menuinst/src/windows.rs +++ b/crates/rattler_menuinst/src/windows.rs @@ -199,7 +199,7 @@ impl WindowsMenu { let args = lex::quote_args(args).join(" "); let link_name = format!("{}.lnk", self.name); - if self.item.desktop.unwrap_or(false) { + if self.item.desktop.unwrap_or(true) { let desktop_link_path = self.directories.desktop.join(&link_name); create_shortcut::create_shortcut( &command, @@ -214,7 +214,7 @@ impl WindowsMenu { .unwrap(); } - if self.item.quicklaunch.unwrap_or(false) && self.directories.quick_launch.is_dir() { + if self.item.quicklaunch.unwrap_or(true) && self.directories.quick_launch.is_dir() { let quicklaunch_link_path = self.directories.quick_launch.join(link_name); create_shortcut::create_shortcut( &self.name, From e73d5162c2d3f568747cd16b12b79afd9f838ea2 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Fri, 13 Dec 2024 04:01:19 +0100 Subject: [PATCH 061/132] remove $id, add nsautomaticgraphicsswitching, update snapshots --- crates/rattler_menuinst/src/macos.rs | 9 ++ crates/rattler_menuinst/src/schema.rs | 19 ++- ...t__schema__test__deserialize_defaults.snap | 135 ++++++++++++++++++ ...t__schema__test__deserialize_gnuradio.snap | 1 - ...nuinst__schema__test__deserialize_grx.snap | 1 - ...nuinst__schema__test__deserialize_mne.snap | 6 +- ...nst__schema__test__deserialize_spyder.snap | 2 +- .../test-data/defaults/defaults.json | 68 +++++++++ 8 files changed, 232 insertions(+), 9 deletions(-) create mode 100644 crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_defaults.snap create mode 100644 crates/rattler_menuinst/test-data/defaults/defaults.json diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index cb8adb4db..baf42a634 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -468,6 +468,15 @@ impl MacOSMenu { ); } + if let Some(ns_supports_automatic_graphics_switching) = + self.item.ns_supports_automatic_graphics_switching + { + pl.insert( + "NSSupportsAutomaticGraphicsSwitching".into(), + Value::Boolean(ns_supports_automatic_graphics_switching), + ); + } + if let Some(requires_native) = self.item.ls_requires_native_execution { pl.insert( "LSRequiresNativeExecution".into(), diff --git a/crates/rattler_menuinst/src/schema.rs b/crates/rattler_menuinst/src/schema.rs index e3adf16ee..d21783139 100644 --- a/crates/rattler_menuinst/src/schema.rs +++ b/crates/rattler_menuinst/src/schema.rs @@ -408,6 +408,10 @@ pub struct MacOS { #[serde(rename = "UTImportedTypeDeclarations")] pub ut_imported_type_declarations: Option>, + /// If true, allows an OpenGL app to utilize the integrated GPU. + #[serde(rename = "NSSupportsAutomaticGraphicsSwitching")] + pub ns_supports_automatic_graphics_switching: Option, + /// List of permissions to request for the launched application. /// See `the entitlements docs ` /// for a full list of possible values. @@ -516,12 +520,7 @@ impl MenuItemCommand { /// Metadata required to create menu items across operating systems with `menuinst` #[derive(Serialize, Deserialize, Debug)] -#[serde(deny_unknown_fields)] pub struct MenuInstSchema { - /// Version of the menuinst schema. - #[serde(rename = "$id")] - pub id: String, - /// Standard of the JSON schema we adhere to. #[serde(rename = "$schema")] pub schema: String, @@ -595,4 +594,14 @@ mod test { insta::assert_debug_snapshot!(schema); } + + /// Test against the defaults file from original menuinst + #[test] + fn test_deserialize_defaults() { + let test_data = test_data(); + let schema_path = test_data.join("defaults/defaults.json"); + let schema_str = std::fs::read_to_string(schema_path).unwrap(); + let schema: super::MenuInstSchema = serde_json::from_str(&schema_str).unwrap(); + insta::assert_debug_snapshot!(schema); + } } diff --git a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_defaults.snap b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_defaults.snap new file mode 100644 index 000000000..4e359cc1b --- /dev/null +++ b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_defaults.snap @@ -0,0 +1,135 @@ +--- +source: crates/rattler_menuinst/src/schema.rs +expression: schema +--- +MenuInstSchema { + schema: "https://schemas.conda.org/menuinst-1.schema.json", + menu_name: "REQUIRED", + menu_items: [ + MenuItem { + command: MenuItemCommand { + name: Simple( + PlaceholderString( + "REQUIRED", + ), + ), + description: PlaceholderString( + "REQUIRED", + ), + command: [ + PlaceholderString( + "REQUIRED", + ), + ], + icon: None, + precommand: None, + precreate: None, + working_dir: None, + activate: Some( + true, + ), + terminal: Some( + false, + ), + }, + platforms: Platforms { + linux: Some( + Platform { + base: BasePlatformSpecific { + name: None, + description: None, + icon: None, + command: None, + working_dir: None, + precommand: None, + precreate: None, + activate: None, + terminal: None, + }, + specific: Linux { + categories: None, + dbus_activatable: None, + generic_name: None, + hidden: None, + implements: None, + keywords: None, + single_main_window: None, + mime_type: None, + no_display: None, + not_show_in: None, + only_show_in: None, + prefers_non_default_gpu: None, + startup_notify: None, + startup_wm_class: None, + try_exec: None, + glob_patterns: None, + }, + }, + ), + osx: Some( + Platform { + base: BasePlatformSpecific { + name: None, + description: None, + icon: None, + command: None, + working_dir: None, + precommand: None, + precreate: None, + activate: None, + terminal: None, + }, + specific: MacOS { + cf_bundle_display_name: None, + cf_bundle_identifier: None, + cf_bundle_name: None, + cf_bundle_spoken_name: None, + cf_bundle_version: None, + cf_bundle_url_types: None, + cf_bundle_document_types: None, + ls_application_category_type: None, + ls_background_only: None, + ls_environment: None, + ls_minimum_system_version: None, + ls_multiple_instances_prohibited: None, + ls_requires_native_execution: None, + ut_exported_type_declarations: None, + ut_imported_type_declarations: None, + ns_supports_automatic_graphics_switching: None, + entitlements: None, + link_in_bundle: None, + event_handler: None, + }, + }, + ), + win: Some( + Platform { + base: BasePlatformSpecific { + name: None, + description: None, + icon: None, + command: None, + working_dir: None, + precommand: None, + precreate: None, + activate: None, + terminal: None, + }, + specific: Windows { + desktop: Some( + true, + ), + quicklaunch: Some( + false, + ), + terminal_profile: None, + url_protocols: None, + file_extensions: None, + app_user_model_id: None, + }, + }, + ), + }, + }, + ], +} diff --git a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_gnuradio.snap b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_gnuradio.snap index c271cb86d..1b7059e78 100644 --- a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_gnuradio.snap +++ b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_gnuradio.snap @@ -3,7 +3,6 @@ source: crates/rattler_menuinst/src/schema.rs expression: schema --- MenuInstSchema { - id: "https://schemas.conda.io/menuinst-1.schema.json", schema: "https://json-schema.org/draft-07/schema", menu_name: "{{ DISTRIBUTION_NAME }}", menu_items: [ diff --git a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_grx.snap b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_grx.snap index 85ff515a1..44565b58a 100644 --- a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_grx.snap +++ b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_grx.snap @@ -3,7 +3,6 @@ source: crates/rattler_menuinst/src/schema.rs expression: schema --- MenuInstSchema { - id: "https://schemas.conda.io/menuinst-1.schema.json", schema: "https://json-schema.org/draft-07/schema", menu_name: "{{ DISTRIBUTION_NAME }}", menu_items: [ diff --git a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_mne.snap b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_mne.snap index 6d2222ef4..171e43acf 100644 --- a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_mne.snap +++ b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_mne.snap @@ -3,7 +3,6 @@ source: crates/rattler_menuinst/src/schema.rs expression: schema --- MenuInstSchema { - id: "https://schemas.conda.io/menuinst-1.schema.json", schema: "https://json-schema.org/draft-07/schema", menu_name: "MNE-Python (__PKG_VERSION__)", menu_items: [ @@ -130,6 +129,7 @@ MenuInstSchema { ls_requires_native_execution: None, ut_exported_type_declarations: None, ut_imported_type_declarations: None, + ns_supports_automatic_graphics_switching: None, entitlements: None, link_in_bundle: None, event_handler: None, @@ -286,6 +286,7 @@ MenuInstSchema { ls_requires_native_execution: None, ut_exported_type_declarations: None, ut_imported_type_declarations: None, + ns_supports_automatic_graphics_switching: None, entitlements: None, link_in_bundle: None, event_handler: None, @@ -454,6 +455,7 @@ MenuInstSchema { ls_requires_native_execution: None, ut_exported_type_declarations: None, ut_imported_type_declarations: None, + ns_supports_automatic_graphics_switching: None, entitlements: None, link_in_bundle: None, event_handler: None, @@ -628,6 +630,7 @@ MenuInstSchema { ls_requires_native_execution: None, ut_exported_type_declarations: None, ut_imported_type_declarations: None, + ns_supports_automatic_graphics_switching: None, entitlements: None, link_in_bundle: None, event_handler: None, @@ -799,6 +802,7 @@ MenuInstSchema { ls_requires_native_execution: None, ut_exported_type_declarations: None, ut_imported_type_declarations: None, + ns_supports_automatic_graphics_switching: None, entitlements: None, link_in_bundle: None, event_handler: None, diff --git a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_spyder.snap b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_spyder.snap index 151db7450..649b26766 100644 --- a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_spyder.snap +++ b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_spyder.snap @@ -3,7 +3,6 @@ source: crates/rattler_menuinst/src/schema.rs expression: schema --- MenuInstSchema { - id: "https://schemas.conda.io/menuinst-1.schema.json", schema: "https://json-schema.org/draft-07/schema", menu_name: "{{ DISTRIBUTION_NAME }} spyder", menu_items: [ @@ -471,6 +470,7 @@ MenuInstSchema { ls_requires_native_execution: None, ut_exported_type_declarations: None, ut_imported_type_declarations: None, + ns_supports_automatic_graphics_switching: None, entitlements: None, link_in_bundle: Some( { diff --git a/crates/rattler_menuinst/test-data/defaults/defaults.json b/crates/rattler_menuinst/test-data/defaults/defaults.json new file mode 100644 index 000000000..56499b3f7 --- /dev/null +++ b/crates/rattler_menuinst/test-data/defaults/defaults.json @@ -0,0 +1,68 @@ +{ + "menu_name": "REQUIRED", + "menu_items": [ + { + "name": "REQUIRED", + "description": "REQUIRED", + "command": [ + "REQUIRED" + ], + "icon": null, + "precommand": null, + "precreate": null, + "working_dir": null, + "activate": true, + "terminal": false, + "platforms": { + "linux": { + "Categories": null, + "DBusActivatable": null, + "GenericName": null, + "Hidden": null, + "Implements": null, + "Keywords": null, + "MimeType": null, + "NoDisplay": null, + "NotShowIn": null, + "OnlyShowIn": null, + "PrefersNonDefaultGPU": null, + "SingleMainWindow": null, + "StartupNotify": null, + "StartupWMClass": null, + "TryExec": null, + "glob_patterns": null + }, + "osx": { + "CFBundleDisplayName": null, + "CFBundleIdentifier": null, + "CFBundleName": null, + "CFBundleSpokenName": null, + "CFBundleVersion": null, + "CFBundleURLTypes": null, + "CFBundleDocumentTypes": null, + "LSApplicationCategoryType": null, + "LSBackgroundOnly": null, + "LSEnvironment": null, + "LSMinimumSystemVersion": null, + "LSMultipleInstancesProhibited": null, + "LSRequiresNativeExecution": null, + "NSSupportsAutomaticGraphicsSwitching": null, + "UTExportedTypeDeclarations": null, + "UTImportedTypeDeclarations": null, + "entitlements": null, + "link_in_bundle": null, + "event_handler": null + }, + "win": { + "desktop": true, + "quicklaunch": false, + "terminal_profile": null, + "url_protocols": null, + "file_extensions": null, + "app_user_model_id": null + } + } + } + ], + "$schema": "https://schemas.conda.org/menuinst-1.schema.json" + } \ No newline at end of file From 390a7b7f7923fef1680a15e16a5e35aa26000b10 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Fri, 13 Dec 2024 04:02:51 +0100 Subject: [PATCH 062/132] clippy --- crates/rattler_menuinst/src/macos.rs | 4 ++-- crates/rattler_menuinst/src/render.rs | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index baf42a634..a58aae73e 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -752,9 +752,9 @@ impl MacOSMenu { fs_err::remove_dir_all(&self.directories.location).unwrap_or_else(|e| { tracing::warn!("Failed to remove directory: {e}. Ignoring error."); }); - return Ok(vec![self.directories.location.clone()]); + Ok(vec![self.directories.location.clone()]) } else { - return Ok(vec![]); + Ok(vec![]) } } } diff --git a/crates/rattler_menuinst/src/render.rs b/crates/rattler_menuinst/src/render.rs index 2e8794d01..ea0fd4998 100644 --- a/crates/rattler_menuinst/src/render.rs +++ b/crates/rattler_menuinst/src/render.rs @@ -33,8 +33,7 @@ impl BaseMenuItemPlaceholders { pub fn new(base_prefix: &Path, prefix: &Path, platform: Platform) -> Self { let dist_name = |p: &Path| { p.file_name() - .map(|s| s.to_string_lossy().to_string()) - .unwrap_or_else(|| "empty".to_string()) + .map_or_else(|| "empty".to_string(), |s| s.to_string_lossy().to_string()) }; let (python, base_python) = if platform.is_windows() { From c565f54a15d8d0d946406fb9000ca4ff81355de8 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Fri, 13 Dec 2024 04:41:39 +0100 Subject: [PATCH 063/132] small improvement --- crates/rattler_menuinst/src/linux.rs | 4 ++-- crates/rattler_menuinst/src/linux/menu_xml.rs | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index 3fe2cc4bb..2a2f42105 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -147,7 +147,7 @@ impl LinuxMenu { .name .resolve(crate::schema::Environment::Base, placeholders); - let directories = directories.unwrap_or_else(|| Directories::new(mode, &menu_name, &name)); + let directories = directories.unwrap_or_else(|| Directories::new(mode, menu_name, &name)); let refined_placeholders = placeholders.refine(&directories.desktop_file()); LinuxMenu { @@ -418,7 +418,7 @@ impl LinuxMenu { } } - if let Some(update_mime_database) = which::which("update-mime-database").ok() { + if let Ok(update_mime_database) = which::which("update-mime-database") { let mut command = Command::new(update_mime_database); command .arg("-V") diff --git a/crates/rattler_menuinst/src/linux/menu_xml.rs b/crates/rattler_menuinst/src/linux/menu_xml.rs index 7f74a1a68..30bb67a16 100644 --- a/crates/rattler_menuinst/src/linux/menu_xml.rs +++ b/crates/rattler_menuinst/src/linux/menu_xml.rs @@ -4,7 +4,6 @@ use quick_xml::events::Event; use quick_xml::{Reader, Writer}; use std::io::Write; use std::path::PathBuf; -use thiserror::Error; use crate::{slugify, MenuInstError}; From b51b59eb1c059cd86e7495b3051976a1e5709f4f Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Mon, 16 Dec 2024 11:08:03 +0100 Subject: [PATCH 064/132] .. --- crates/rattler_menuinst/src/lib.rs | 20 ------------------- crates/rattler_menuinst/src/linux.rs | 10 ++++++---- crates/rattler_menuinst/src/linux/menu_xml.rs | 1 + crates/rattler_menuinst/src/render.rs | 1 + 4 files changed, 8 insertions(+), 24 deletions(-) diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index a154cb860..cf506ac4b 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -160,27 +160,7 @@ pub fn remove_menu_items( pub mod test { use std::path::{Path, PathBuf}; - use rattler_conda_types::Platform; - - use crate::{install_menuitems, MenuMode}; - pub(crate) fn test_data() -> PathBuf { Path::new(env!("CARGO_MANIFEST_DIR")).join("test-data") } - - #[test] - fn test_install_menu_item() { - if std::env::var("INSTALL_MENU_ITEM").is_err() { - return; - } - let test_data = crate::test::test_data(); - let schema_path = - test_data.join("/Users/wolfv/Programs/rattler/.prefix/Menu/napari-menu.json"); - - let prefix = schema_path.parent().unwrap().parent().unwrap(); - let prefix = std::fs::canonicalize(prefix).unwrap(); - let platform = Platform::OsxArm64; - - install_menuitems(&schema_path, &prefix, &prefix, platform, MenuMode::User).unwrap(); - } } diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index 2a2f42105..cae062eee 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -148,6 +148,7 @@ impl LinuxMenu { .resolve(crate::schema::Environment::Base, placeholders); let directories = directories.unwrap_or_else(|| Directories::new(mode, menu_name, &name)); + let refined_placeholders = placeholders.refine(&directories.desktop_file()); LinuxMenu { @@ -352,6 +353,7 @@ impl LinuxMenu { } fn install(&self) -> Result<(), MenuInstError> { + self.directories.ensure_directories_exist()?; self.pre_create()?; self.create_desktop_entry()?; self.maybe_register_mime_types(true)?; @@ -606,7 +608,7 @@ mod tests { use tempfile::TempDir; use crate::{ - render::BaseMenuItemPlaceholders, schema::MenuInstSchema, test::test_data, MenuMode, + schema::MenuInstSchema, test::test_data, }; use super::{Directories, LinuxMenu}; @@ -689,7 +691,7 @@ mod tests { let icon_path = icon.resolve(FakePlaceholders { placeholders: placeholders.clone(), }); - fs::write(&icon_path, &[]).unwrap(); + fs::write(&icon_path, []).unwrap(); } } @@ -719,8 +721,8 @@ mod tests { let command = item.command.merge(linux.base); let placeholders = super::BaseMenuItemPlaceholders::new( - &fake_prefix.prefix(), - &fake_prefix.prefix(), + fake_prefix.prefix(), + fake_prefix.prefix(), rattler_conda_types::Platform::current(), ); diff --git a/crates/rattler_menuinst/src/linux/menu_xml.rs b/crates/rattler_menuinst/src/linux/menu_xml.rs index 30bb67a16..c4fa5cb16 100644 --- a/crates/rattler_menuinst/src/linux/menu_xml.rs +++ b/crates/rattler_menuinst/src/linux/menu_xml.rs @@ -1,3 +1,4 @@ +#![allow(dead_code)] use chrono::Utc; use fs_err::{self as fs, File}; use quick_xml::events::Event; diff --git a/crates/rattler_menuinst/src/render.rs b/crates/rattler_menuinst/src/render.rs index ea0fd4998..0d07c1719 100644 --- a/crates/rattler_menuinst/src/render.rs +++ b/crates/rattler_menuinst/src/render.rs @@ -14,6 +14,7 @@ impl PlaceholderString { } } +#[allow(dead_code)] pub fn resolve( input: &Option, placeholders: impl AsRef>, From 4a708a494c85a6a0742c0ed136b763cea79d8e9b Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Mon, 16 Dec 2024 16:28:41 +0100 Subject: [PATCH 065/132] fix things up --- crates/rattler_menuinst/src/macos.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index a58aae73e..a3c224477 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -154,7 +154,7 @@ impl CFBundleDocumentTypesModel { } type_dict.insert( - "LSItemContentType".into(), + "LSItemContentTypes".into(), Value::Array( self.ls_item_content_types .iter() @@ -273,7 +273,7 @@ impl MacOSMenu { /// - /// - The source code at /src/appkit-launcher in this repository fn needs_appkit_launcher(&self) -> bool { - self.item.cf_bundle_identifier.is_some() || self.item.cf_bundle_document_types.is_some() + self.item.event_handler.is_some() } // Run pre-create command @@ -646,7 +646,7 @@ impl MacOSMenu { self.default_launcher_path().to_string_lossy() )) }); - + tracing::info!("Writing script to {}", script_path.display()); let mut file = File::create(&script_path)?; file.write_all(self.command().as_bytes())?; fs::set_permissions(&script_path, std::fs::Permissions::from_mode(0o755))?; @@ -714,7 +714,7 @@ impl MacOSMenu { fn lsregister(args: &[&str]) -> Result<(), MenuInstError> { let exe = "/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister"; - + tracing::debug!("Calling lsregister with args: {:?}", args); let output = Command::new(exe).args(args).output().map_err(|e| { MenuInstError::InstallError(format!("Failed to execute lsregister: {e}")) })?; From 6004fc73949632d94e51bb18d286b5dcef20abe9 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Mon, 16 Dec 2024 17:09:58 +0100 Subject: [PATCH 066/132] add handler for mime config --- crates/rattler_menuinst/Cargo.toml | 1 + crates/rattler_menuinst/src/linux.rs | 4 +- .../rattler_menuinst/src/linux/mime_config.rs | 276 ++++++++++++++++++ 3 files changed, 280 insertions(+), 1 deletion(-) create mode 100644 crates/rattler_menuinst/src/linux/mime_config.rs diff --git a/crates/rattler_menuinst/Cargo.toml b/crates/rattler_menuinst/Cargo.toml index 19bd67e0f..68d4728d3 100644 --- a/crates/rattler_menuinst/Cargo.toml +++ b/crates/rattler_menuinst/Cargo.toml @@ -28,6 +28,7 @@ which = "7.0.0" known-folders = "1.2.0" quick-xml = "0.37.1" chrono = { workspace = true, features = ["clock"] } +configparser = { version = "3.1.0", features = ["indexmap"] } [target.'cfg(target_os = "windows")'.dependencies] windows = { version = "0.58", features = [ diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index cae062eee..ded333b44 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -7,6 +7,7 @@ use std::process::Command; use tempfile::TempDir; mod menu_xml; +mod mime_config; use rattler_conda_types::Platform; use rattler_shell::activation::{ActivationVariables, Activator}; @@ -385,6 +386,7 @@ impl LinuxMenu { mime_types: &[String], register: bool, ) -> Result<(), MenuInstError> { + tracing::info!("Registering mime types {:?}", mime_types); let mut resolved_globs = HashMap::::new(); if let Some(globs) = &self.item.glob_patterns { @@ -416,7 +418,7 @@ impl LinuxMenu { log_output("xdg-mime", output); } } else { - tracing::debug!("xdg-mime not found, not registering mime types as default."); + tracing::info!("xdg-mime not found, not registering mime types as default."); } } diff --git a/crates/rattler_menuinst/src/linux/mime_config.rs b/crates/rattler_menuinst/src/linux/mime_config.rs new file mode 100644 index 000000000..8f22fdd6d --- /dev/null +++ b/crates/rattler_menuinst/src/linux/mime_config.rs @@ -0,0 +1,276 @@ +use configparser::ini::Ini; +use std::path::{Path, PathBuf}; +use thiserror::Error; + +#[derive(Error, Debug)] +pub enum MimeConfigError { + #[error("IO error: {0}")] + Io(#[from] std::io::Error), + #[error("Config parse error: {0}")] + Parse(String), +} + +#[derive(Debug)] +pub struct MimeConfig { + config: Ini, + path: PathBuf, +} + +impl MimeConfig { + pub fn new>(path: P) -> Self { + Self { + // cs == case-sensitive + config: Ini::new_cs(), + path: path.as_ref().to_path_buf(), + } + } + + pub fn load(&mut self) -> Result<(), MimeConfigError> { + if self.path.exists() { + self.config + .load(&self.path) + .map_err(|e| MimeConfigError::Parse(e.to_string()))?; + } + Ok(()) + } + + pub fn save(&self) -> Result<(), MimeConfigError> { + self.config + .write(&self.path) + .map_err(|e| MimeConfigError::Io(e))?; + Ok(()) + } + + pub fn register_mime_type(&mut self, mime_type: &str, application: &str) { + // Ensure sections exist + self.config.set_default_section("Default Applications"); + self.config.set_default_section("Added Associations"); + + // Only set default if not already set + if !self.config.get("Default Applications", mime_type).is_some() { + self.config.set( + "Default Applications", + mime_type, + Some(application.to_string()), + ); + } + + // Update associations + let existing = self + .config + .get("Added Associations", mime_type) + .unwrap_or_default(); + + let new_value = if !existing.is_empty() && !existing.contains(application) { + format!("{};{}", existing, application) + } else { + application.to_string() + }; + + self.config + .set("Added Associations", mime_type, Some(new_value)); + } + + pub fn deregister_mime_type(&mut self, mime_type: &str, application: &str) { + for section in &["Default Applications", "Added Associations"] { + if let Some(value) = self.config.get(section, mime_type) { + if value == application { + self.config.remove_key(section, mime_type); + } else if value.contains(application) { + let new_value: String = value + .split(';') + .filter(|&x| x != application) + .collect::>() + .join(";"); + self.config.set(section, mime_type, Some(new_value)); + } + } + + // Remove empty sections + if let Some(section_map) = self.config.get_map_ref().get(*section) { + if section_map.is_empty() { + self.config.remove_section(section); + } + } + } + } + + pub fn get_default_application(&self, mime_type: &str) -> Option { + self.config.get("Default Applications", mime_type) + } + + pub fn get_associations(&self, mime_type: &str) -> Vec { + self.config + .get("Added Associations", mime_type) + .map(|s| s.split(';').map(String::from).collect()) + .unwrap_or_default() + } +} + +#[cfg(test)] +mod tests { + use super::*; + use insta::assert_snapshot; + use tempfile::NamedTempFile; + + fn create_temp_config() -> (MimeConfig, NamedTempFile) { + let file = NamedTempFile::new().unwrap(); + let config = MimeConfig::new(file.path()); + (config, file) + } + + #[test] + fn test_register_new_mime_type() { + let (mut config, _file) = create_temp_config(); + + config.register_mime_type("text/plain", "notepad.desktop"); + + assert_eq!( + config.get_default_application("text/plain"), + Some("notepad.desktop".to_string()) + ); + assert_eq!( + config.get_associations("text/plain"), + vec!["notepad.desktop"] + ); + } + + #[test] + fn test_register_multiple_applications() { + let (mut config, _file) = create_temp_config(); + + config.register_mime_type("text/plain", "notepad.desktop"); + config.register_mime_type("text/plain", "gedit.desktop"); + + // First application remains the default + assert_eq!( + config.get_default_application("text/plain"), + Some("notepad.desktop".to_string()) + ); + + // Both applications in associations + let associations = config.get_associations("text/plain"); + assert!(associations.contains(&"notepad.desktop".to_string())); + assert!(associations.contains(&"gedit.desktop".to_string())); + } + + #[test] + fn test_deregister_mime_type() { + let (mut config, _file) = create_temp_config(); + + config.register_mime_type("text/plain", "notepad.desktop"); + config.register_mime_type("text/plain", "gedit.desktop"); + config.deregister_mime_type("text/plain", "notepad.desktop"); + + // notepad should be removed from associations + let associations = config.get_associations("text/plain"); + assert!(!associations.contains(&"notepad.desktop".to_string())); + assert!(associations.contains(&"gedit.desktop".to_string())); + } + + #[test] + fn test_load_and_save() -> Result<(), MimeConfigError> { + let (mut config, file) = create_temp_config(); + + config.register_mime_type("text/plain", "notepad.desktop"); + config.save()?; + + let mut new_config = MimeConfig::new(file.path()); + new_config.load()?; + + assert_eq!( + new_config.get_default_application("text/plain"), + Some("notepad.desktop".to_string()) + ); + Ok(()) + } + + fn get_config_contents(config: &MimeConfig) -> String { + config.save().unwrap(); + std::fs::read_to_string(&config.path).unwrap() + } + + #[test] + fn test_mime_config_snapshots() { + let (mut config, _file) = create_temp_config(); + + // Test progressive changes to the config + config.register_mime_type("text/plain", "notepad.desktop"); + insta::assert_snapshot!(get_config_contents(&config), @r###" + text/plain=notepad.desktop + [Default Applications] + text/plain=notepad.desktop + "###); + + config.register_mime_type("text/plain", "gedit.desktop"); + insta::assert_snapshot!(get_config_contents(&config), @r###" + text/plain=notepad.desktop;gedit.desktop + [Default Applications] + text/plain=notepad.desktop + "###); + + config.register_mime_type("application/pdf", "pdf-reader.desktop"); + insta::assert_snapshot!(get_config_contents(&config), @r###" + text/plain=notepad.desktop;gedit.desktop + application/pdf=pdf-reader.desktop + [Default Applications] + text/plain=notepad.desktop + application/pdf=pdf-reader.desktop + "###); + + config.deregister_mime_type("text/plain", "notepad.desktop"); + insta::assert_snapshot!(get_config_contents(&config), @r###" + text/plain=gedit.desktop + application/pdf=pdf-reader.desktop + [Default Applications] + application/pdf=pdf-reader.desktop + "###); + } + + #[test] + fn test_complex_mime_associations_snapshot() { + let (mut config, _file) = create_temp_config(); + + // Add multiple mime types with multiple applications + let test_cases = [ + ( + "text/plain", + vec!["notepad.desktop", "gedit.desktop", "vim.desktop"], + ), + ( + "application/pdf", + vec!["pdf-reader.desktop", "browser.desktop"], + ), + ("image/jpeg", vec!["image-viewer.desktop", "gimp.desktop"]), + ]; + + for (mime_type, apps) in test_cases.iter() { + for app in apps { + config.register_mime_type(mime_type, app); + } + } + + insta::assert_snapshot!(get_config_contents(&config), @r###" + text/plain=notepad.desktop;gedit.desktop;vim.desktop + application/pdf=pdf-reader.desktop;browser.desktop + image/jpeg=image-viewer.desktop;gimp.desktop + [Default Applications] + text/plain=notepad.desktop + application/pdf=pdf-reader.desktop + image/jpeg=image-viewer.desktop + "###); + + // Remove some applications + config.deregister_mime_type("text/plain", "gedit.desktop"); + config.deregister_mime_type("application/pdf", "pdf-reader.desktop"); + + insta::assert_snapshot!(get_config_contents(&config), @r###" + text/plain=notepad.desktop;vim.desktop + application/pdf=browser.desktop + image/jpeg=image-viewer.desktop;gimp.desktop + [Default Applications] + text/plain=notepad.desktop + image/jpeg=image-viewer.desktop + "###); + } +} From a14792ed676b8b0ec131a5c1d03e773f714a1b81 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Mon, 16 Dec 2024 17:15:07 +0100 Subject: [PATCH 067/132] .. --- crates/rattler_menuinst/src/linux/mime_config.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/crates/rattler_menuinst/src/linux/mime_config.rs b/crates/rattler_menuinst/src/linux/mime_config.rs index 8f22fdd6d..24ed5af77 100644 --- a/crates/rattler_menuinst/src/linux/mime_config.rs +++ b/crates/rattler_menuinst/src/linux/mime_config.rs @@ -62,7 +62,7 @@ impl MimeConfig { .unwrap_or_default(); let new_value = if !existing.is_empty() && !existing.contains(application) { - format!("{};{}", existing, application) + format!("{existing};{application}") } else { application.to_string() }; @@ -110,7 +110,6 @@ impl MimeConfig { #[cfg(test)] mod tests { use super::*; - use insta::assert_snapshot; use tempfile::NamedTempFile; fn create_temp_config() -> (MimeConfig, NamedTempFile) { From cfcb718b0e365a8446f585627647196fb8205ed2 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Mon, 16 Dec 2024 17:19:18 +0100 Subject: [PATCH 068/132] some clippy --- crates/rattler_menuinst/src/linux/mime_config.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/rattler_menuinst/src/linux/mime_config.rs b/crates/rattler_menuinst/src/linux/mime_config.rs index 24ed5af77..0c7dba3eb 100644 --- a/crates/rattler_menuinst/src/linux/mime_config.rs +++ b/crates/rattler_menuinst/src/linux/mime_config.rs @@ -29,7 +29,7 @@ impl MimeConfig { if self.path.exists() { self.config .load(&self.path) - .map_err(|e| MimeConfigError::Parse(e.to_string()))?; + .map_err(MimeConfigError::Parse)?; } Ok(()) } @@ -37,7 +37,7 @@ impl MimeConfig { pub fn save(&self) -> Result<(), MimeConfigError> { self.config .write(&self.path) - .map_err(|e| MimeConfigError::Io(e))?; + .map_err(MimeConfigError::Io)?; Ok(()) } @@ -47,7 +47,7 @@ impl MimeConfig { self.config.set_default_section("Added Associations"); // Only set default if not already set - if !self.config.get("Default Applications", mime_type).is_some() { + if self.config.get("Default Applications", mime_type).is_none() { self.config.set( "Default Applications", mime_type, From 5cd9bb46f05497827c57ed91e6e40bdef6f60fe6 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Tue, 17 Dec 2024 09:49:55 +0100 Subject: [PATCH 069/132] more placeholders --- crates/rattler_menuinst/src/linux.rs | 4 +--- crates/rattler_menuinst/src/linux/mime_config.rs | 4 +--- crates/rattler_menuinst/src/macos.rs | 13 +++++++++++-- crates/rattler_menuinst/src/schema.rs | 6 +++--- ...inst__macos__tests__macos_menu_installation.snap | 6 ++---- 5 files changed, 18 insertions(+), 15 deletions(-) diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index ded333b44..1e9907637 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -609,9 +609,7 @@ mod tests { }; use tempfile::TempDir; - use crate::{ - schema::MenuInstSchema, test::test_data, - }; + use crate::{schema::MenuInstSchema, test::test_data}; use super::{Directories, LinuxMenu}; diff --git a/crates/rattler_menuinst/src/linux/mime_config.rs b/crates/rattler_menuinst/src/linux/mime_config.rs index 0c7dba3eb..6ffb6f9f3 100644 --- a/crates/rattler_menuinst/src/linux/mime_config.rs +++ b/crates/rattler_menuinst/src/linux/mime_config.rs @@ -35,9 +35,7 @@ impl MimeConfig { } pub fn save(&self) -> Result<(), MimeConfigError> { - self.config - .write(&self.path) - .map_err(MimeConfigError::Io)?; + self.config.write(&self.path).map_err(MimeConfigError::Io)?; Ok(()) } diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index a3c224477..28e6a1e7f 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -387,10 +387,12 @@ impl MacOSMenu { "CFBundleVersion".into(), Value::String(cf_bundle_version.clone()), ); + pl.insert( "CFBundleGetInfoString".into(), Value::String(format!("{slugname}-{cf_bundle_version}")), ); + pl.insert( "CFBundleShortVersionString".into(), Value::String(cf_bundle_version), @@ -416,6 +418,13 @@ impl MacOSMenu { pl.insert("CFBundleDocumentTypes".into(), Value::Array(types_array)); } + if let Some(cf_bundle_spoken_names) = &self.item.cf_bundle_spoken_name { + pl.insert( + "CFBundleSpokenName".into(), + Value::String(cf_bundle_spoken_names.resolve(&self.placeholders)), + ); + } + if self.needs_appkit_launcher() { tracing::debug!( "Writing plist to {}", @@ -449,7 +458,7 @@ impl MacOSMenu { if let Some(env) = self.item.ls_environment.as_ref() { let mut env_dict = plist::Dictionary::new(); for (k, v) in env { - env_dict.insert(k.into(), Value::String(v.into())); + env_dict.insert(k.into(), Value::String(v.resolve(&self.placeholders))); } pl.insert("LSEnvironment".into(), Value::Dictionary(env_dict)); } @@ -662,7 +671,7 @@ impl MacOSMenu { } let event_handler_logic = match self.item.event_handler.as_ref() { - Some(logic) => logic, + Some(logic) => logic.resolve(&self.placeholders), None => return Ok(None), }; diff --git a/crates/rattler_menuinst/src/schema.rs b/crates/rattler_menuinst/src/schema.rs index d21783139..8f98a1188 100644 --- a/crates/rattler_menuinst/src/schema.rs +++ b/crates/rattler_menuinst/src/schema.rs @@ -356,7 +356,7 @@ pub struct MacOS { /// Suitable replacement for text-to-speech operations on the app. /// For example, "my app one two three" instead of `MyApp123`. #[serde(rename = "CFBundleSpokenName")] - pub cf_bundle_spoken_name: Option, + pub cf_bundle_spoken_name: Option, /// Build version number for the bundle. In the context of 'menuinst' /// this can be used to signal a new version of the menu item for the same @@ -384,7 +384,7 @@ pub struct MacOS { /// List of key-value pairs used to define environment variables. #[serde(rename = "LSEnvironment")] - pub ls_environment: Option>, + pub ls_environment: Option>, /// Minimum version of macOS required for this app to run, as `x.y.z`. /// For example, for macOS v10.4 and later, use `10.4.0`. (TODO: implement proper parsing) @@ -423,7 +423,7 @@ pub struct MacOS { pub link_in_bundle: Option>, /// Required shell script logic to handle opened URL payloads. - pub event_handler: Option, + pub event_handler: Option, } #[derive(Serialize, Deserialize, Debug, Clone)] diff --git a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__macos__tests__macos_menu_installation.snap b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__macos__tests__macos_menu_installation.snap index 2a94e0b8e..35b14479c 100644 --- a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__macos__tests__macos_menu_installation.snap +++ b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__macos__tests__macos_menu_installation.snap @@ -13,7 +13,7 @@ expression: "fs::read_to_string(dirs.location.join(\"Contents/Info.plist\")).unw CFBundleExecutable spyder-6-test-env CFBundleIdentifier - com.spyder-6-test-env-appkit-launcher + com.spyder-6-test-env CFBundlePackageType APPL CFBundleVersion @@ -33,7 +33,7 @@ expression: "fs::read_to_string(dirs.location.join(\"Contents/Info.plist\")).unw spyder.icns CFBundleTypeRole Editor - LSItemContentType + LSItemContentTypes com.apple.applescript.text com.apple.ascii-property-list @@ -137,7 +137,5 @@ expression: "fs::read_to_string(dirs.location.join(\"Contents/Info.plist\")).unw Default - LSBackgroundOnly - From b7a34bd67c05006c50362fbf62ff4d84ba617c0b Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Tue, 17 Dec 2024 10:10:07 +0100 Subject: [PATCH 070/132] [skip ci] .. --- crates/rattler_menuinst/src/linux.rs | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index 1e9907637..c02cd2862 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -216,7 +216,6 @@ impl LinuxMenu { for (k, v) in activation_env { envs.push(format!(r#"{k}="{v}""#)); } - tracing::debug!("Envs: {envs:?}"); } let command = self @@ -401,25 +400,14 @@ impl LinuxMenu { } } + let mimeapps = self.directories.config_directory.join("mimeapps.list"); + if register { - if let Ok(xdg_mime) = which::which("xdg-mime") { - let mut command = Command::new(xdg_mime); - command.arg("default").arg(self.location()); - for mime_type in mime_types { - command.arg(mime_type); - } - let output = command.output()?; - if !output.status.success() { - tracing::warn!( - "Could not set MIME type {} as default for {}", - mime_types.join(", "), - self.name - ); - log_output("xdg-mime", output); - } - } else { - tracing::info!("xdg-mime not found, not registering mime types as default."); - } + let config = MimeConfig::new(mimeapps); + + } else if mimeapps.exists() { + // in this case we remove the mime type from the mimeapps.list file + } if let Ok(update_mime_database) = which::which("update-mime-database") { From 374807ed83f3330b4e154e734a87cc4b687441e7 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Mon, 16 Dec 2024 11:08:25 +0100 Subject: [PATCH 071/132] run pre-create --- crates/rattler_menuinst/src/windows.rs | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/crates/rattler_menuinst/src/windows.rs b/crates/rattler_menuinst/src/windows.rs index 630ae221f..e2e7bc65e 100644 --- a/crates/rattler_menuinst/src/windows.rs +++ b/crates/rattler_menuinst/src/windows.rs @@ -5,9 +5,7 @@ use std::{ }; use crate::{ - render::{BaseMenuItemPlaceholders, MenuItemPlaceholders}, - schema::{Environment, MenuItemCommand, Windows}, - slugify, MenuInstError, MenuMode, + render::{BaseMenuItemPlaceholders, MenuItemPlaceholders}, schema::{Environment, MenuItemCommand, Windows}, slugify, util::log_output, MenuInstError, MenuMode }; mod create_shortcut; @@ -155,8 +153,20 @@ impl WindowsMenu { fn precreate(&self) -> Result<(), MenuInstError> { if let Some(precreate_code) = self.command.precreate.as_ref() { let precreate_code = precreate_code.resolve(&self.placeholders); - // TODO run precreate code in a hidden window - tracing::info!("Precreate code: {}", precreate_code); + + if precreate_code.is_empty() { + return Ok(()); + } + + let temp_file = tempfile::NamedTempFile::with_suffix(".bat")?; + fs::write(temp_file.path(), precreate_code)?; + + let output = std::process::Command::new("cmd") + .arg("/c") + .arg(temp_file.path()) + .output()?; + + log_output("precreate", output); } Ok(()) } From 1271afc91d68be50380f7931595877cc76b0654b Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Mon, 16 Dec 2024 12:13:31 +0100 Subject: [PATCH 072/132] implement more --- crates/rattler_menuinst/src/lib.rs | 7 ++++ crates/rattler_menuinst/src/windows.rs | 49 +++++++++++--------------- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index cf506ac4b..829b86987 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -40,9 +40,16 @@ pub enum MenuInstError { #[error("Failed to sign plist: {0}")] SigningFailed(String), + #[error("Failed to install menu item: {0}")] + ActivationError(#[from] rattler_shell::activation::ActivationError), + #[cfg(target_os = "linux")] #[error("Failed to install menu item: {0}")] XmlError(#[from] quick_xml::Error), + + #[cfg(target_os = "windows")] + #[error("Failed to install menu item: {0}")] + WindowsError(#[from] ::windows::core::Error) } // Install menu items from a given schema file diff --git a/crates/rattler_menuinst/src/windows.rs b/crates/rattler_menuinst/src/windows.rs index e2e7bc65e..4909d8552 100644 --- a/crates/rattler_menuinst/src/windows.rs +++ b/crates/rattler_menuinst/src/windows.rs @@ -1,4 +1,6 @@ use fs_err as fs; +use rattler_conda_types::Platform; +use rattler_shell::{activation::{ActivationVariables, Activator}, shell}; use std::{ io::Write as _, path::{Path, PathBuf}, @@ -85,7 +87,7 @@ impl WindowsMenu { } } - fn script_content(&self) -> String { + fn script_content(&self) -> Result { let mut lines = vec![ "@echo off".to_string(), ":: Script generated by conda/menuinst".to_string(), @@ -96,7 +98,15 @@ impl WindowsMenu { } if self.command.activate.unwrap_or_default() { - // TODO handle activation + // create a bash activation script and emit it into the script + let activator = + Activator::from_path(&self.prefix, shell::CmdExe, Platform::current()).unwrap(); + let activation_env = activator + .run_activation(ActivationVariables::default(), None)?; + + for (k, v) in activation_env { + lines.push(format!(r#"set "{k}={v}""#)); + } } let args: Vec = self @@ -108,7 +118,7 @@ impl WindowsMenu { lines.push(lex::quote_args(&args).join(" ")); - lines.join("\n") + Ok(lines.join("\n")) } fn shortcut_filename(&self, ext: Option) -> String { @@ -131,7 +141,7 @@ impl WindowsMenu { } let mut file = fs::File::create(&path)?; - file.write_all(self.script_content().as_bytes())?; + file.write_all(self.script_content()?.as_bytes())?; Ok(()) } @@ -185,7 +195,8 @@ impl WindowsMenu { } } - fn create_shortcut(&self, args: &[String]) -> Result<(), MenuInstError> { + fn create_shortcut(&self, args: &[String]) -> Result, MenuInstError> { + let mut created_files = Vec::new(); let icon = self .command .icon @@ -220,8 +231,8 @@ impl WindowsMenu { icon.as_deref(), Some(0), Some(&app_id), - ) - .unwrap(); + )?; + created_files.push(desktop_link_path); } if self.item.quicklaunch.unwrap_or(true) && self.directories.quick_launch.is_dir() { @@ -235,34 +246,16 @@ impl WindowsMenu { icon.as_deref(), Some(0), Some(&app_id), - ) - .unwrap(); + )?; + created_files.push(quicklaunch_link_path); } - Ok(()) + Ok(created_files) } pub fn install(self) -> Result<(), MenuInstError> { let args = self.build_command(false); self.create_shortcut(&args)?; - // let paths = [ - // Some(&self.directories.programs), - // if self.item.desktop.unwrap_or(false) { - // self.directories.desktop.as_ref() - // } else { - // None - // }, - // if self.item.quicklaunch.unwrap_or(false) { - // self.directories.quicklaunch.as_ref() - // } else { - // None - // }, - // ]; - // for path in paths.into_iter().filter_map(identity) { - // let link_path = path.join(&self.name).with_extension(SHORTCUT_EXTENSION); - // let args = self.build_command_invocation(); - // } - Ok(()) } } From 9afee1505e84ce1d02a9602997cc8aac745870da Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Wed, 18 Dec 2024 09:36:59 +0100 Subject: [PATCH 073/132] wire up more on Windows --- crates/rattler_menuinst/src/lib.rs | 12 +- crates/rattler_menuinst/src/linux.rs | 2 - crates/rattler_menuinst/src/windows.rs | 280 ++++++++++++++---- .../src/windows/create_shortcut.rs | 6 +- crates/rattler_menuinst/src/windows/lex.rs | 12 +- .../rattler_menuinst/src/windows/registry.rs | 225 ++++++++++---- 6 files changed, 415 insertions(+), 122 deletions(-) diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index 829b86987..d98c695f8 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -46,10 +46,10 @@ pub enum MenuInstError { #[cfg(target_os = "linux")] #[error("Failed to install menu item: {0}")] XmlError(#[from] quick_xml::Error), - + #[cfg(target_os = "windows")] #[error("Failed to install menu item: {0}")] - WindowsError(#[from] ::windows::core::Error) + WindowsError(#[from] ::windows::core::Error), } // Install menu items from a given schema file @@ -155,7 +155,13 @@ pub fn remove_menu_items( #[cfg(target_os = "windows")] if let Some(windows_item) = item.platforms.win { let command = item.command.merge(windows_item.base); - windows::remove_menu_item(prefix, windows_item.specific, command, menu_mode)?; + windows::remove_menu_item( + prefix, + windows_item.specific, + command, + &placeholders, + menu_mode, + )?; } } } diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index c02cd2862..c07df06d7 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -404,10 +404,8 @@ impl LinuxMenu { if register { let config = MimeConfig::new(mimeapps); - } else if mimeapps.exists() { // in this case we remove the mime type from the mimeapps.list file - } if let Ok(update_mime_database) = which::which("update-mime-database") { diff --git a/crates/rattler_menuinst/src/windows.rs b/crates/rattler_menuinst/src/windows.rs index 4909d8552..8c301fdce 100644 --- a/crates/rattler_menuinst/src/windows.rs +++ b/crates/rattler_menuinst/src/windows.rs @@ -1,13 +1,21 @@ use fs_err as fs; use rattler_conda_types::Platform; -use rattler_shell::{activation::{ActivationVariables, Activator}, shell}; +use rattler_shell::{ + activation::{ActivationVariables, Activator}, + shell, +}; +use registry::notify_shell_changes; use std::{ io::Write as _, path::{Path, PathBuf}, }; use crate::{ - render::{BaseMenuItemPlaceholders, MenuItemPlaceholders}, schema::{Environment, MenuItemCommand, Windows}, slugify, util::log_output, MenuInstError, MenuMode + render::{BaseMenuItemPlaceholders, MenuItemPlaceholders}, + schema::{Environment, MenuItemCommand, Windows}, + slugify, + util::log_output, + MenuInstError, MenuMode, }; mod create_shortcut; @@ -19,34 +27,49 @@ use knownfolders::UserHandle; pub struct Directories { start_menu: PathBuf, - quick_launch: PathBuf, + quick_launch: Option, desktop: PathBuf, - programs: PathBuf, } +fn shortcut_filename(name: &str, env_name: Option<&str>, ext: Option<&str>) -> String { + let env = if let Some(env_name) = env_name { + format!(" ({})", env_name) + } else { + "".to_string() + }; + + let ext = ext.unwrap_or_else(|| "lnk"); + format!("{}{}{}", name, env, ext) +} + +/// On Windows we can create shortcuts in several places: +/// - Start Menu +/// - Desktop +/// - Quick launch (only for user installs) impl Directories { - pub fn create() -> Directories { + pub fn create(menu_mode: MenuMode) -> Directories { + let user_handle = match menu_mode { + MenuMode::System => UserHandle::Common, + MenuMode::User => UserHandle::Current, + }; + let known_folders = knownfolders::Folders::new(); - let start_menu = known_folders - .get_folder_path("start", UserHandle::Current) - .unwrap(); - let quick_launch = known_folders - .get_folder_path("quick_launch", UserHandle::Current) - .unwrap(); + let start_menu = known_folders.get_folder_path("start", user_handle).unwrap(); + let quick_launch = if menu_mode == MenuMode::User { + known_folders + .get_folder_path("quick_launch", user_handle) + .ok() + } else { + None + }; let desktop = known_folders - .get_folder_path("desktop", UserHandle::Current) + .get_folder_path("desktop", user_handle) .unwrap(); - // let programs = known_folders - // .get_folder_path("programs", UserHandle::Current) - // .unwrap_or(known_folders.get_folder_path("programs", UserHandle::Common).unwrap()); - - let programs = PathBuf::from("C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs"); Directories { start_menu, quick_launch, desktop, - programs, } } } @@ -58,6 +81,7 @@ pub struct WindowsMenu { command: MenuItemCommand, directories: Directories, placeholders: MenuItemPlaceholders, + menu_mode: MenuMode, } const SHORTCUT_EXTENSION: &str = "lnk"; @@ -69,21 +93,24 @@ impl WindowsMenu { command: MenuItemCommand, directories: Directories, placeholders: &BaseMenuItemPlaceholders, + menu_mode: MenuMode, ) -> Self { let name = command.name.resolve(Environment::Base, placeholders); - let programs_link_location = directories - .programs + let location = directories + .start_menu .join(&name) .with_extension(SHORTCUT_EXTENSION); + // self.menu.start_menu_location / self._shortcut_filename() Self { prefix: prefix.to_path_buf(), name, item, command, directories, - placeholders: placeholders.refine(&programs_link_location), + placeholders: placeholders.refine(&location), + menu_mode, } } @@ -101,8 +128,7 @@ impl WindowsMenu { // create a bash activation script and emit it into the script let activator = Activator::from_path(&self.prefix, shell::CmdExe, Platform::current()).unwrap(); - let activation_env = activator - .run_activation(ActivationVariables::default(), None)?; + let activation_env = activator.run_activation(ActivationVariables::default(), None)?; for (k, v) in activation_env { lines.push(format!(r#"set "{k}={v}""#)); @@ -121,43 +147,103 @@ impl WindowsMenu { Ok(lines.join("\n")) } - fn shortcut_filename(&self, ext: Option) -> String { + fn shortcut_filename(&self, ext: Option<&str>) -> String { let env = if let Some(env_name) = self.placeholders.as_ref().get("ENV_NAME") { format!(" ({})", env_name) } else { "".to_string() }; - let ext = ext.unwrap_or_else(|| "lnk".to_string()); + let ext = ext.unwrap_or_else(|| "lnk"); format!("{}{}{}", self.name, env, ext) } - fn write_script(&self, path: Option) -> Result<(), MenuInstError> { - let path = - path.unwrap_or_else(|| self.prefix.join("Menu").join(self.shortcut_filename(None))); - + fn write_script(&self, path: &Path) -> Result<(), MenuInstError> { if let Some(parent) = path.parent() { fs::create_dir_all(parent)?; } - let mut file = fs::File::create(&path)?; + let mut file = fs::File::create(path)?; file.write_all(self.script_content()?.as_bytes())?; Ok(()) } - fn build_command(&self, with_arg1: bool) -> Vec { - // TODO handle activation - let mut command = Vec::new(); - for elem in self.command.command.iter() { - command.push(elem.resolve(&self.placeholders)); - } + fn path_for_script(&self) -> PathBuf { + self.prefix + .join("Menu") + .join(self.shortcut_filename(Some("bat"))) + } - if with_arg1 && !command.iter().any(|s| s.contains("%1")) { - command.push("%1".to_string()); - } + fn build_command(&self, with_arg1: bool) -> Result, MenuInstError> { + if self.command.activate.unwrap_or(false) { + let script_path = self.path_for_script(); + self.write_script(&script_path)?; + + let system_root = std::env::var("SystemRoot").unwrap_or("C:\\Windows".to_string()); + let system32 = Path::new(&system_root).join("system32"); + let cmd_exe = system32.join("cmd.exe").to_string_lossy().to_string(); + + if self.command.terminal.unwrap_or(false) { + let mut command = [&cmd_exe, "/D", "/K"] + .iter() + .map(|s| s.to_string()) + .collect::>(); + + // add script path with quotes + command.push(format!("\"{}\"", script_path.to_string_lossy())); + + if with_arg1 { + command.push("%1".to_string()); + } + Ok(command) + } else { + let script_path = self.path_for_script(); + self.write_script(&script_path)?; + + let arg1 = if with_arg1 { "%1 " } else { "" }; + let powershell = system32 + .join("WindowsPowerShell") + .join("v1.0") + .join("powershell.exe") + .to_string_lossy() + .to_string(); + + let mut command = [ + &cmd_exe, + "/D", + "/C", + "START", + "/MIN", + "\"\"", + &powershell, + "-WindowStyle", + "hidden", + ] + .iter() + .map(|s| s.to_string()) + .collect::>(); + + command.push(format!( + "\"start '{}' {}-WindowStyle hidden\"", + script_path.to_string_lossy(), + arg1 + )); + + Ok(command) + } + } else { + let mut command = Vec::new(); + for elem in self.command.command.iter() { + command.push(elem.resolve(&self.placeholders)); + } + + if with_arg1 && !command.iter().any(|s| s.contains("%1")) { + command.push("%1".to_string()); + } - command + Ok(command) + } } fn precreate(&self) -> Result<(), MenuInstError> { @@ -225,7 +311,7 @@ impl WindowsMenu { create_shortcut::create_shortcut( &command, &self.command.description.resolve(&self.placeholders), - &desktop_link_path.to_string_lossy().to_string(), + &desktop_link_path, Some(&args), Some(&workdir), icon.as_deref(), @@ -235,29 +321,99 @@ impl WindowsMenu { created_files.push(desktop_link_path); } - if self.item.quicklaunch.unwrap_or(true) && self.directories.quick_launch.is_dir() { - let quicklaunch_link_path = self.directories.quick_launch.join(link_name); - create_shortcut::create_shortcut( - &self.name, - &self.command.description.resolve(&self.placeholders), - &quicklaunch_link_path.to_string_lossy().to_string(), - Some(&args), - Some(&workdir), + if let Some(quick_launch_dir) = self.directories.quick_launch.as_ref() { + if self.item.quicklaunch.unwrap_or(true) { + let quicklaunch_link_path = quick_launch_dir.join(link_name); + create_shortcut::create_shortcut( + &self.name, + &self.command.description.resolve(&self.placeholders), + &quicklaunch_link_path, + Some(&args), + Some(&workdir), + icon.as_deref(), + Some(0), + Some(&app_id), + )?; + created_files.push(quicklaunch_link_path); + } + } + Ok(created_files) + } + + fn icon(&self) -> Option { + self.command + .icon + .as_ref() + .map(|s| s.resolve(&self.placeholders)) + } + + fn register_file_extensions(&self) -> Result<(), MenuInstError> { + let Some(extensions) = &self.item.file_extensions else { + return Ok(()); + }; + + let icon = self.icon(); + let command = self.build_command(true)?.join(" "); + let name = &self.name; + let app_user_model_id = self.app_id(); + + for extension in extensions { + let identifier = format!("{name}.AssocFile{extension}"); + registry::register_file_extension( + extension, + &identifier, + &command, icon.as_deref(), - Some(0), - Some(&app_id), + Some(name), + Some(&app_user_model_id), + None, // friendly type name currently not set + self.menu_mode, )?; - created_files.push(quicklaunch_link_path); } - Ok(created_files) + Ok(()) + } + + fn register_url_protocols(&self) -> Result { + let protocols = match &self.item.url_protocols { + Some(protocols) if !protocols.is_empty() => protocols, + _ => return Ok(false), + }; + + let command = self.build_command(true)?.join(" "); + let icon = self.icon(); + let name = &self.name; + let app_user_model_id = format!("{name}.Protocol"); + + for protocol in protocols { + let identifier = format!("{name}.Protocol{protocol}"); + registry::register_url_protocol( + protocol, + &command, + Some(&identifier), + icon.as_deref(), + Some(name), + Some(&app_user_model_id), + self.menu_mode, + )?; + } + + Ok(true) } - pub fn install(self) -> Result<(), MenuInstError> { - let args = self.build_command(false); + pub fn install(&self) -> Result<(), MenuInstError> { + let args = self.build_command(false)?; + self.precreate()?; self.create_shortcut(&args)?; + self.register_file_extensions()?; + self.register_url_protocols()?; + notify_shell_changes(); Ok(()) } + + pub fn remove(&self) -> Result<(), MenuInstError> { + todo!() + } } pub(crate) fn install_menu_item( @@ -271,8 +427,9 @@ pub(crate) fn install_menu_item( prefix, windows_item, command, - Directories::create(), + Directories::create(menu_mode), placeholders, + menu_mode, ); menu.install() } @@ -281,7 +438,16 @@ pub(crate) fn remove_menu_item( prefix: &Path, specific: Windows, command: MenuItemCommand, + placeholders: &BaseMenuItemPlaceholders, menu_mode: MenuMode, ) -> Result<(), MenuInstError> { - todo!() + let menu = WindowsMenu::new( + prefix, + specific, + command, + Directories::create(menu_mode), + placeholders, + menu_mode, + ); + menu.remove() } diff --git a/crates/rattler_menuinst/src/windows/create_shortcut.rs b/crates/rattler_menuinst/src/windows/create_shortcut.rs index f4f590bc4..6cd699fb6 100644 --- a/crates/rattler_menuinst/src/windows/create_shortcut.rs +++ b/crates/rattler_menuinst/src/windows/create_shortcut.rs @@ -1,3 +1,5 @@ +use std::path::Path; + use windows::{ core::*, Win32::Storage::EnhancedStorage::PKEY_AppUserModel_ID, Win32::System::Com::StructuredStorage::*, Win32::System::Com::*, Win32::UI::Shell::*, @@ -8,14 +10,14 @@ use PropertiesSystem::IPropertyStore; pub fn create_shortcut( path: &str, description: &str, - filename: &str, + filename: &Path, arguments: Option<&str>, workdir: Option<&str>, iconpath: Option<&str>, iconindex: Option, app_id: Option<&str>, ) -> Result<()> { - tracing::info!("Creating shortcut: {} at {}", filename, path); + tracing::info!("Creating shortcut: {:?} at {}", filename, path); unsafe { // Initialize COM diff --git a/crates/rattler_menuinst/src/windows/lex.rs b/crates/rattler_menuinst/src/windows/lex.rs index f3cf286a9..09115daec 100644 --- a/crates/rattler_menuinst/src/windows/lex.rs +++ b/crates/rattler_menuinst/src/windows/lex.rs @@ -54,16 +54,16 @@ mod tests { "/C".to_string(), "\"\"echo\" \"Hello World\"\"".to_string(), ]; - assert_eq!(quote_args(args), expected); + assert_eq!(quote_args(&args), expected); } #[test] fn test_quote_string() { - assert_eq!(quote_string("Hello World".to_string()), "\"Hello World\""); - assert_eq!(quote_string("Hello".to_string()), "Hello"); - assert_eq!(quote_string("-Hello".to_string()), "-Hello"); - assert_eq!(quote_string(" Hello".to_string()), " Hello"); - assert_eq!(quote_string("Hello/World".to_string()), "\"Hello/World\""); + assert_eq!(quote_string("Hello World"), "\"Hello World\""); + assert_eq!(quote_string("Hello"), "Hello"); + assert_eq!(quote_string("-Hello"), "-Hello"); + assert_eq!(quote_string(" Hello"), " Hello"); + assert_eq!(quote_string("Hello/World"), "\"Hello/World\""); } #[test] diff --git a/crates/rattler_menuinst/src/windows/registry.rs b/crates/rattler_menuinst/src/windows/registry.rs index 35f7f4ee9..caae48dd5 100644 --- a/crates/rattler_menuinst/src/windows/registry.rs +++ b/crates/rattler_menuinst/src/windows/registry.rs @@ -1,14 +1,20 @@ +use windows::Win32::UI::Shell::{SHChangeNotify, SHCNE_ASSOCCHANGED, SHCNF_IDLIST}; use winreg::enums::*; use winreg::RegKey; +use crate::MenuMode; + pub fn register_file_extension( extension: &str, identifier: &str, command: &str, icon: Option<&str>, - mode: &str, + app_name: Option<&str>, + app_user_model_id: Option<&str>, + friendly_type_name: Option<&str>, + mode: MenuMode, ) -> Result<(), std::io::Error> { - let hkey = if mode == "system" { + let hkey = if mode == MenuMode::System { HKEY_LOCAL_MACHINE } else { HKEY_CURRENT_USER @@ -20,26 +26,60 @@ pub fn register_file_extension( // Associate extension with handler let ext_key = classes.create_subkey(&format!("{}\\OpenWithProgids", extension))?; ext_key.0.set_value(identifier, &"")?; - tracing::debug!("Created registry entry for extension '{}'", extension); // Register the handler - let handler_desc = format!("{} {} handler", extension, identifier); + let handler_desc = format!("{} {} file", extension, identifier); classes .create_subkey(identifier)? .0 .set_value("", &handler_desc)?; - tracing::debug!("Created registry entry for handler '{}'", identifier); // Set the 'open' command let command_key = classes.create_subkey(&format!("{}\\shell\\open\\command", identifier))?; command_key.0.set_value("", &command)?; - tracing::debug!("Created registry entry for command '{}'", command); + + // Set app name related values if provided + if let Some(name) = app_name { + let open_key = classes.create_subkey(&format!("{}\\shell\\open", identifier))?; + open_key.0.set_value("", &name)?; + classes + .create_subkey(identifier)? + .0 + .set_value("FriendlyAppName", &name)?; + classes + .create_subkey(&format!("{}\\shell\\open", identifier))? + .0 + .set_value("FriendlyAppName", &name)?; + } + + // Set app user model ID if provided + if let Some(id) = app_user_model_id { + classes + .create_subkey(identifier)? + .0 + .set_value("AppUserModelID", &id)?; + } // Set icon if provided if let Some(icon_path) = icon { - let icon_key = classes.create_subkey(identifier)?; - icon_key.0.set_value("DefaultIcon", &icon_path)?; - tracing::debug!("Created registry entry for icon '{}'", icon_path); + // Set default icon and shell open icon + classes + .create_subkey(identifier)? + .0 + .set_value("DefaultIcon", &icon_path)?; + classes + .create_subkey(&format!("{}\\shell\\open", identifier))? + .0 + .set_value("Icon", &icon_path)?; + } + + // Set friendly type name if provided + // NOTE: Windows <10 requires the string in a PE file, but we just set the raw string + if let Some(friendly_name) = friendly_type_name { + classes + .create_subkey(identifier)? + .0 + .set_value("FriendlyTypeName", &friendly_name)?; } Ok(()) @@ -48,9 +88,9 @@ pub fn register_file_extension( pub fn unregister_file_extension( extension: &str, identifier: &str, - mode: &str, + mode: MenuMode, ) -> Result<(), std::io::Error> { - let hkey = if mode == "system" { + let hkey = if mode == MenuMode::System { HKEY_LOCAL_MACHINE } else { HKEY_CURRENT_USER @@ -87,33 +127,76 @@ pub fn unregister_file_extension( Ok(()) } +fn title_case(s: &str) -> String { + let mut result = String::with_capacity(s.len()); + let mut capitalize_next = true; + + for c in s.chars() { + if c.is_whitespace() || c == '-' || c == '_' { + capitalize_next = true; + result.push(c); + } else if capitalize_next { + result.extend(c.to_uppercase()); + capitalize_next = false; + } else { + result.extend(c.to_lowercase()); + } + } + + result +} + pub fn register_url_protocol( protocol: &str, command: &str, identifier: Option<&str>, icon: Option<&str>, - mode: &str, + app_name: Option<&str>, + app_user_model_id: Option<&str>, + mode: MenuMode, ) -> Result<(), std::io::Error> { - let key = if mode == "system" { - RegKey::predef(HKEY_CLASSES_ROOT).create_subkey(protocol)? + let base_path = if mode == MenuMode::System { + format!("Software\\Classes\\{}", protocol) } else { - RegKey::predef(HKEY_CURRENT_USER) - .create_subkey(&format!("Software\\Classes\\{}", protocol))? + format!("Software\\Classes\\{}", protocol) }; - key.0 - .set_value("", &format!("URL:{}", protocol.to_uppercase()))?; - key.0.set_value("URL Protocol", &"")?; + let hkey = if mode == MenuMode::System { + HKEY_LOCAL_MACHINE + } else { + HKEY_CURRENT_USER + }; - let command_key = key.0.create_subkey(r"shell\open\command")?; + let classes = RegKey::predef(hkey); + let protocol_key = classes.create_subkey(&base_path)?; + + protocol_key + .0 + .set_value("", &format!("URL:{}", title_case(protocol)))?; + protocol_key.0.set_value("URL Protocol", &"")?; + + let command_key = protocol_key.0.create_subkey("shell\\open\\command")?; command_key.0.set_value("", &command)?; + if let Some(name) = app_name { + let open_key = protocol_key.0.create_subkey("shell\\open")?; + open_key.0.set_value("", &name)?; + protocol_key.0.set_value("FriendlyAppName", &name)?; + open_key.0.set_value("FriendlyAppName", &name)?; + } + if let Some(icon_path) = icon { - key.0.set_value("DefaultIcon", &icon_path)?; + protocol_key.0.set_value("DefaultIcon", &icon_path)?; + let open_key = protocol_key.0.create_subkey("shell\\open")?; + open_key.0.set_value("Icon", &icon_path)?; + } + + if let Some(aumi) = app_user_model_id { + protocol_key.0.set_value("AppUserModelId", &aumi)?; } if let Some(id) = identifier { - key.0.set_value("_menuinst", &id)?; + protocol_key.0.set_value("_menuinst", &id)?; } Ok(()) @@ -122,42 +205,46 @@ pub fn register_url_protocol( pub fn unregister_url_protocol( protocol: &str, identifier: Option<&str>, - mode: &str, + mode: MenuMode, ) -> Result<(), std::io::Error> { - let key = if mode == "system" { - RegKey::predef(HKEY_CLASSES_ROOT) + let hkey = if mode == MenuMode::System { + HKEY_LOCAL_MACHINE } else { - RegKey::predef(HKEY_CURRENT_USER).open_subkey("Software\\Classes")? + HKEY_CURRENT_USER }; - let delete = match key.open_subkey(protocol) { - Ok(k) => match k.get_value::("_menuinst") { - Ok(value) => identifier.is_none() || Some(value.as_str()) == identifier, - Err(_) => identifier.is_none(), - }, - Err(e) => { - tracing::error!("Could not check key {} for deletion: {}", protocol, e); - return Ok(()); - } - }; + let base_path = format!("Software\\Classes\\{}", protocol); - if delete { - key.delete_subkey_all(protocol)?; + if let Ok(key) = RegKey::predef(hkey).open_subkey(&base_path) { + if let Some(id) = identifier { + if let Ok(value) = key.get_value::("_menuinst") { + if value != id { + return Ok(()); + } + } + } + let _ = RegKey::predef(hkey).delete_subkey_all(&base_path); } Ok(()) } +pub fn notify_shell_changes() { + unsafe { + SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, None, None); + } +} + #[cfg(test)] mod tests { use super::*; use winreg::RegKey; - fn cleanup_registry(extension: &str, identifier: &str, mode: &str) { + fn cleanup_registry(extension: &str, identifier: &str, mode: MenuMode) { let _ = unregister_file_extension(extension, identifier, mode); } - fn cleanup_protocol(protocol: &str, identifier: Option<&str>, mode: &str) { + fn cleanup_protocol(protocol: &str, identifier: Option<&str>, mode: MenuMode) { let _ = unregister_url_protocol(protocol, identifier, mode); } @@ -166,13 +253,13 @@ mod tests { let extension = ".rattlertest"; let identifier = "TestApp.File"; let command = "\"C:\\Test\\App.exe\" \"%1\""; - let mode = "user"; + let mode = MenuMode::User; // Cleanup before test - cleanup_registry(extension, identifier, mode); + cleanup_registry(extension, identifier, MenuMode::User); // Test registration - register_file_extension(extension, identifier, command, None, mode)?; + register_file_extension(extension, identifier, command, None, None, None, None, mode)?; // Verify registration let classes = RegKey::predef(HKEY_CURRENT_USER).open_subkey("Software\\Classes")?; @@ -185,7 +272,7 @@ mod tests { assert_eq!(cmd_value, command); // Cleanup - cleanup_registry(extension, identifier, mode); + cleanup_registry(extension, identifier, MenuMode::User); Ok(()) } @@ -195,10 +282,22 @@ mod tests { let identifier = "yTestApp.File"; let command = "\"C:\\Test\\App.exe\" \"%1\""; let icon = "C:\\Test\\icon.ico"; - let mode = "user"; + let mode = MenuMode::User; + let app_name = Some("Test App"); + let app_user_model_id = Some("TestApp"); + let friendly_type_name = Some("Test App File"); // Test registration with icon - register_file_extension(extension, identifier, command, Some(icon), mode)?; + register_file_extension( + extension, + identifier, + command, + Some(icon), + app_name, + app_user_model_id, + friendly_type_name, + mode, + )?; // Verify icon let classes = RegKey::predef(HKEY_CURRENT_USER).open_subkey("Software\\Classes")?; @@ -216,10 +315,10 @@ mod tests { let extension = ".xrattlertest"; let identifier = "xTestApp.File"; let command = "\"C:\\Test\\App.exe\" \"%1\""; - let mode = "user"; + let mode = MenuMode::User; // Setup - register_file_extension(extension, identifier, command, None, mode)?; + register_file_extension(extension, identifier, command, None, None, None, None, mode)?; // Test unregistration unregister_file_extension(extension, identifier, mode)?; @@ -237,13 +336,24 @@ mod tests { let protocol = "rattlertest"; let command = "\"C:\\Test\\App.exe\" \"%1\""; let identifier = Some("TestApp"); - let mode = "user"; + let app_name = Some("Test App"); + let icon = Some("C:\\Test\\icon.ico"); + let app_user_model_id = Some("TestApp"); + let mode = MenuMode::User; // Cleanup before test cleanup_protocol(protocol, identifier, mode); // Test registration - register_url_protocol(protocol, command, identifier, None, mode)?; + register_url_protocol( + protocol, + command, + identifier, + icon, + app_name, + app_user_model_id, + mode, + )?; // Verify registration let key = RegKey::predef(HKEY_CURRENT_USER) @@ -266,10 +376,21 @@ mod tests { let protocol = "rattlertest-2"; let command = "\"C:\\Test\\App.exe\" \"%1\""; let identifier = Some("xTestApp"); - let mode = "user"; + let app_name = Some("Test App"); + let icon = Some("C:\\Test\\icon.ico"); + let app_user_model_id = Some("TestApp"); + let mode = MenuMode::User; // Setup - register_url_protocol(protocol, command, identifier, None, mode)?; + register_url_protocol( + protocol, + command, + identifier, + icon, + app_name, + app_user_model_id, + mode, + )?; // Test unregistration unregister_url_protocol(protocol, identifier, mode)?; From a458d9649fb861f7476e5d2ee93150e78a3e2902 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Wed, 18 Dec 2024 10:08:22 +0100 Subject: [PATCH 074/132] fix location --- crates/rattler_menuinst/src/windows.rs | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/crates/rattler_menuinst/src/windows.rs b/crates/rattler_menuinst/src/windows.rs index 8c301fdce..f1e4fb3e1 100644 --- a/crates/rattler_menuinst/src/windows.rs +++ b/crates/rattler_menuinst/src/windows.rs @@ -31,7 +31,7 @@ pub struct Directories { desktop: PathBuf, } -fn shortcut_filename(name: &str, env_name: Option<&str>, ext: Option<&str>) -> String { +fn shortcut_filename(name: &str, env_name: Option<&String>, ext: Option<&str>) -> String { let env = if let Some(env_name) = env_name { format!(" ({})", env_name) } else { @@ -97,9 +97,11 @@ impl WindowsMenu { ) -> Self { let name = command.name.resolve(Environment::Base, placeholders); + let shortcut_name = shortcut_filename(&name, placeholders.as_ref().get("ENV_NAME"), Some(SHORTCUT_EXTENSION)); + let location = directories .start_menu - .join(&name) + .join(&shortcut_name) .with_extension(SHORTCUT_EXTENSION); // self.menu.start_menu_location / self._shortcut_filename() @@ -148,14 +150,7 @@ impl WindowsMenu { } fn shortcut_filename(&self, ext: Option<&str>) -> String { - let env = if let Some(env_name) = self.placeholders.as_ref().get("ENV_NAME") { - format!(" ({})", env_name) - } else { - "".to_string() - }; - - let ext = ext.unwrap_or_else(|| "lnk"); - format!("{}{}{}", self.name, env, ext) + shortcut_filename(&self.name, self.placeholders.as_ref().get("ENV_NAME"), ext) } fn write_script(&self, path: &Path) -> Result<(), MenuInstError> { From 40d2be4bcd7156cf0c38282e3be848bf761bea3c Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Wed, 18 Dec 2024 10:31:38 +0100 Subject: [PATCH 075/132] use the mime config things --- crates/rattler_menuinst/src/linux.rs | 19 ++++++++++++++++++- .../rattler_menuinst/src/linux/mime_config.rs | 9 ++++----- crates/rattler_menuinst/src/windows.rs | 6 +++++- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index c07df06d7..ff0c7a424 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -1,5 +1,6 @@ use fs_err as fs; use fs_err::File; +use mime_config::MimeConfig; use std::collections::HashMap; use std::io::Write; use std::path::{Path, PathBuf}; @@ -44,6 +45,9 @@ pub struct Directories { /// The data directory for the menu pub data_directory: PathBuf, + /// The configuration directory for the menu + pub config_directory: PathBuf, + /// The location of the menu configuration file This is the file that is /// used by the system to determine the menu layout It is usually located at /// `~/.config/menus/applications.menu` @@ -90,6 +94,7 @@ impl Directories { data_directory: data_directory.clone(), system_menu_config_location: system_config_directory.join("menus/applications.menu"), menu_config_location: config_directory.join("menus/applications.menu"), + config_directory, desktop_entries_location: data_directory.join("applications"), directory_entry_location: data_directory .join(format!("desktop-directories/{}.directory", slugify(name))), @@ -403,9 +408,21 @@ impl LinuxMenu { let mimeapps = self.directories.config_directory.join("mimeapps.list"); if register { - let config = MimeConfig::new(mimeapps); + let mut config = MimeConfig::new(mimeapps); + config.load()?; + for mime_type in mime_types { + tracing::info!("Registering mime type {} for {}", mime_type, &self.name); + config.register_mime_type(mime_type, &self.name); + } + config.save()?; } else if mimeapps.exists() { // in this case we remove the mime type from the mimeapps.list file + let mut config = MimeConfig::new(mimeapps); + for mime_type in mime_types { + tracing::info!("Deregistering mime type {} for {}", mime_type, &self.name); + config.deregister_mime_type(mime_type, &self.name); + } + config.save()?; } if let Ok(update_mime_database) = which::which("update-mime-database") { diff --git a/crates/rattler_menuinst/src/linux/mime_config.rs b/crates/rattler_menuinst/src/linux/mime_config.rs index 6ffb6f9f3..a0f868b13 100644 --- a/crates/rattler_menuinst/src/linux/mime_config.rs +++ b/crates/rattler_menuinst/src/linux/mime_config.rs @@ -25,18 +25,17 @@ impl MimeConfig { } } - pub fn load(&mut self) -> Result<(), MimeConfigError> { + pub fn load(&mut self) -> Result<(), std::io::Error> { if self.path.exists() { self.config .load(&self.path) - .map_err(MimeConfigError::Parse)?; + .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))?; } Ok(()) } - pub fn save(&self) -> Result<(), MimeConfigError> { - self.config.write(&self.path).map_err(MimeConfigError::Io)?; - Ok(()) + pub fn save(&self) -> Result<(), std::io::Error> { + self.config.write(&self.path) } pub fn register_mime_type(&mut self, mime_type: &str, application: &str) { diff --git a/crates/rattler_menuinst/src/windows.rs b/crates/rattler_menuinst/src/windows.rs index f1e4fb3e1..4d6f7891a 100644 --- a/crates/rattler_menuinst/src/windows.rs +++ b/crates/rattler_menuinst/src/windows.rs @@ -97,7 +97,11 @@ impl WindowsMenu { ) -> Self { let name = command.name.resolve(Environment::Base, placeholders); - let shortcut_name = shortcut_filename(&name, placeholders.as_ref().get("ENV_NAME"), Some(SHORTCUT_EXTENSION)); + let shortcut_name = shortcut_filename( + &name, + placeholders.as_ref().get("ENV_NAME"), + Some(SHORTCUT_EXTENSION), + ); let location = directories .start_menu From 6df5eb8a870155ad31325a707ba4b3d80449a84e Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Wed, 18 Dec 2024 10:36:27 +0100 Subject: [PATCH 076/132] remove warnings, fix test --- crates/rattler_menuinst/src/linux.rs | 9 ++++++++- crates/rattler_menuinst/src/linux/mime_config.rs | 4 ++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index ff0c7a424..c998c2e8f 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -102,6 +102,9 @@ impl Directories { } pub fn ensure_directories_exist(&self) -> Result<(), MenuInstError> { + fs::create_dir_all(&self.data_directory)?; + fs::create_dir_all(&self.config_directory)?; + let paths = vec![ self.menu_config_location.parent().unwrap().to_path_buf(), self.desktop_entries_location.clone(), @@ -624,10 +627,14 @@ mod tests { impl FakeDirectories { fn new() -> Self { let tmp_dir = TempDir::new().unwrap(); + let data_directory = tmp_dir.path().join("data"); + let config_directory = tmp_dir.path().join("config"); + let directories = Directories { menu_name: "Test".to_string(), name: "Test".to_string(), - data_directory: tmp_dir.path().to_path_buf(), + data_directory, + config_directory, system_menu_config_location: tmp_dir.path().join("system_menu_config_location"), menu_config_location: tmp_dir.path().join("menu_config_location"), desktop_entries_location: tmp_dir.path().join("desktop_entries_location"), diff --git a/crates/rattler_menuinst/src/linux/mime_config.rs b/crates/rattler_menuinst/src/linux/mime_config.rs index a0f868b13..cacf0c169 100644 --- a/crates/rattler_menuinst/src/linux/mime_config.rs +++ b/crates/rattler_menuinst/src/linux/mime_config.rs @@ -6,8 +6,6 @@ use thiserror::Error; pub enum MimeConfigError { #[error("IO error: {0}")] Io(#[from] std::io::Error), - #[error("Config parse error: {0}")] - Parse(String), } #[derive(Debug)] @@ -92,10 +90,12 @@ impl MimeConfig { } } + #[cfg(test)] pub fn get_default_application(&self, mime_type: &str) -> Option { self.config.get("Default Applications", mime_type) } + #[cfg(test)] pub fn get_associations(&self, mime_type: &str) -> Vec { self.config .get("Added Associations", mime_type) From aaaa56709921cd73a7c284b43e4bd3d3dfdd5d49 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Wed, 18 Dec 2024 15:51:31 +0100 Subject: [PATCH 077/132] make things work --- crates/rattler_menuinst/src/linux.rs | 70 +++++++++++-------- .../rattler_menuinst/src/linux/mime_config.rs | 63 ++++++++++++----- 2 files changed, 87 insertions(+), 46 deletions(-) diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index c998c2e8f..6cb14c19c 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -252,6 +252,7 @@ impl LinuxMenu { fn create_desktop_entry(&self) -> Result<(), MenuInstError> { let file = self.location(); + tracing::info!("Creating desktop entry at {}", file.display()); let writer = File::create(file)?; let mut writer = std::io::BufWriter::new(writer); @@ -443,26 +444,35 @@ impl LinuxMenu { Ok(()) } - fn xml_path_for_mime_type(&self, mime_type: &str) -> (PathBuf, bool) { + fn xml_path_for_mime_type(&self, mime_type: &str) -> Result<(PathBuf, bool), std::io::Error> { let basename = mime_type.replace("/", "-"); - let xml_files: Vec = - fs::read_dir(self.directories.data_directory.join("mime/applications")) - .unwrap() - .filter_map(|entry| { - let path = entry.unwrap().path(); - if path - .file_name() - .unwrap() - .to_str() - .unwrap() - .contains(&basename) - { - Some(path) - } else { - None - } - }) - .collect(); + let mime_directory = self.directories.data_directory.join("mime/applications"); + if !mime_directory.is_dir() { + return Ok(( + self.directories + .data_directory + .join("mime/packages") + .join(format!("{basename}.xml")), + false, + )); + } + + let xml_files: Vec = fs::read_dir(mime_directory)? + .filter_map(|entry| { + let path = entry.unwrap().path(); + if path + .file_name() + .unwrap() + .to_str() + .unwrap() + .contains(&basename) + { + Some(path) + } else { + None + } + }) + .collect(); if !xml_files.is_empty() { if xml_files.len() > 1 { @@ -472,15 +482,15 @@ impl LinuxMenu { xml_files ); } - return (xml_files[0].clone(), true); + return Ok((xml_files[0].clone(), true)); } - ( + Ok(( self.directories .data_directory .join("mime/packages") .join(format!("{basename}.xml")), false, - ) + )) } fn glob_pattern_for_mime_type( @@ -489,7 +499,7 @@ impl LinuxMenu { glob_pattern: &str, install: bool, ) -> Result { - let (xml_path, exists) = self.xml_path_for_mime_type(mime_type); + let (xml_path, exists) = self.xml_path_for_mime_type(mime_type).unwrap(); if exists { return Ok(xml_path); } @@ -502,12 +512,12 @@ impl LinuxMenu { let xml = format!( r#" - - - - {description} - - "# + + + + {description} + +"# ); let subcommand = if install { "install" } else { "uninstall" }; @@ -564,7 +574,7 @@ impl LinuxMenu { .collect::>(); for mime in resolved { - let (xml_path, exists) = self.xml_path_for_mime_type(&mime); + let (xml_path, exists) = self.xml_path_for_mime_type(&mime).unwrap(); if !exists { continue; } diff --git a/crates/rattler_menuinst/src/linux/mime_config.rs b/crates/rattler_menuinst/src/linux/mime_config.rs index cacf0c169..b4178a19e 100644 --- a/crates/rattler_menuinst/src/linux/mime_config.rs +++ b/crates/rattler_menuinst/src/linux/mime_config.rs @@ -36,11 +36,12 @@ impl MimeConfig { self.config.write(&self.path) } - pub fn register_mime_type(&mut self, mime_type: &str, application: &str) { - // Ensure sections exist - self.config.set_default_section("Default Applications"); - self.config.set_default_section("Added Associations"); + #[cfg(test)] + pub fn to_string(&self) -> String { + self.config.writes() + } + pub fn register_mime_type(&mut self, mime_type: &str, application: &str) { // Only set default if not already set if self.config.get("Default Applications", mime_type).is_none() { self.config.set( @@ -106,6 +107,8 @@ impl MimeConfig { #[cfg(test)] mod tests { + use crate::test::test_data; + use super::*; use tempfile::NamedTempFile; @@ -193,33 +196,37 @@ mod tests { // Test progressive changes to the config config.register_mime_type("text/plain", "notepad.desktop"); insta::assert_snapshot!(get_config_contents(&config), @r###" - text/plain=notepad.desktop [Default Applications] text/plain=notepad.desktop + [Added Associations] + text/plain=notepad.desktop "###); config.register_mime_type("text/plain", "gedit.desktop"); insta::assert_snapshot!(get_config_contents(&config), @r###" - text/plain=notepad.desktop;gedit.desktop [Default Applications] text/plain=notepad.desktop + [Added Associations] + text/plain=notepad.desktop;gedit.desktop "###); config.register_mime_type("application/pdf", "pdf-reader.desktop"); insta::assert_snapshot!(get_config_contents(&config), @r###" - text/plain=notepad.desktop;gedit.desktop - application/pdf=pdf-reader.desktop [Default Applications] text/plain=notepad.desktop application/pdf=pdf-reader.desktop + [Added Associations] + text/plain=notepad.desktop;gedit.desktop + application/pdf=pdf-reader.desktop "###); config.deregister_mime_type("text/plain", "notepad.desktop"); insta::assert_snapshot!(get_config_contents(&config), @r###" - text/plain=gedit.desktop - application/pdf=pdf-reader.desktop [Default Applications] application/pdf=pdf-reader.desktop + [Added Associations] + text/plain=gedit.desktop + application/pdf=pdf-reader.desktop "###); } @@ -247,13 +254,14 @@ mod tests { } insta::assert_snapshot!(get_config_contents(&config), @r###" - text/plain=notepad.desktop;gedit.desktop;vim.desktop - application/pdf=pdf-reader.desktop;browser.desktop - image/jpeg=image-viewer.desktop;gimp.desktop [Default Applications] text/plain=notepad.desktop application/pdf=pdf-reader.desktop image/jpeg=image-viewer.desktop + [Added Associations] + text/plain=notepad.desktop;gedit.desktop;vim.desktop + application/pdf=pdf-reader.desktop;browser.desktop + image/jpeg=image-viewer.desktop;gimp.desktop "###); // Remove some applications @@ -261,12 +269,35 @@ mod tests { config.deregister_mime_type("application/pdf", "pdf-reader.desktop"); insta::assert_snapshot!(get_config_contents(&config), @r###" - text/plain=notepad.desktop;vim.desktop - application/pdf=browser.desktop - image/jpeg=image-viewer.desktop;gimp.desktop [Default Applications] text/plain=notepad.desktop image/jpeg=image-viewer.desktop + [Added Associations] + text/plain=notepad.desktop;vim.desktop + application/pdf=browser.desktop + image/jpeg=image-viewer.desktop;gimp.desktop "###); } + + #[test] + fn test_existing_mimeapps() { + // load from test-data/linux/mimeapps.list + let path = test_data().join("linux-menu/mimeapps.list"); + let mut mimeapps = MimeConfig::new(path); + mimeapps.load().unwrap(); + + insta::assert_debug_snapshot!(mimeapps.config.get_map()); + + // Test adding a new mime type + mimeapps.register_mime_type("text/pixi", "pixi-app.desktop"); + + insta::assert_debug_snapshot!(mimeapps.config.get_map()); + insta::assert_snapshot!(mimeapps.to_string()); + + // Test removing an application + mimeapps.deregister_mime_type("text/html", "google-chrome.desktop"); + mimeapps.deregister_mime_type("text/pixi", "pixi-app.desktop"); + + insta::assert_debug_snapshot!(mimeapps.config.get_map()); + } } From ecbbe8d115704632c02b90ee7f538c9f7fb3df90 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Fri, 20 Dec 2024 13:51:27 +0100 Subject: [PATCH 078/132] more menuinst changes --- crates/rattler_menuinst/src/linux.rs | 46 ++++++++++++++----- ..._menuinst__linux__tests__installation.snap | 2 +- ...nst__schema__test__deserialize_spyder.snap | 12 ++++- .../test-data/spyder/menu.json | 7 ++- 4 files changed, 50 insertions(+), 17 deletions(-) diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index 6cb14c19c..fbc0cfa8b 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -122,6 +122,10 @@ impl Directories { Ok(()) } + pub fn mime_directory(&self) -> PathBuf { + self.data_directory.join("mime") + } + pub fn desktop_file(&self) -> PathBuf { self.desktop_entries_location.join(format!( "{}_{}.desktop", @@ -433,7 +437,7 @@ impl LinuxMenu { let mut command = Command::new(update_mime_database); command .arg("-V") - .arg(self.directories.data_directory.join("mime")); + .arg(self.directories.mime_directory()); let output = command.output()?; if !output.status.success() { tracing::warn!("Could not update mime database"); @@ -446,18 +450,15 @@ impl LinuxMenu { fn xml_path_for_mime_type(&self, mime_type: &str) -> Result<(PathBuf, bool), std::io::Error> { let basename = mime_type.replace("/", "-"); - let mime_directory = self.directories.data_directory.join("mime/applications"); + let mime_directory = self.directories.data_directory.join("mime/packages"); if !mime_directory.is_dir() { return Ok(( - self.directories - .data_directory - .join("mime/packages") - .join(format!("{basename}.xml")), + mime_directory.join(format!("{basename}.xml")), false, )); } - let xml_files: Vec = fs::read_dir(mime_directory)? + let xml_files: Vec = fs::read_dir(&mime_directory)? .filter_map(|entry| { let path = entry.unwrap().path(); if path @@ -485,10 +486,7 @@ impl LinuxMenu { return Ok((xml_files[0].clone(), true)); } Ok(( - self.directories - .data_directory - .join("mime/packages") - .join(format!("{basename}.xml")), + mime_directory.join(format!("{basename}.xml")), false, )) } @@ -501,6 +499,7 @@ impl LinuxMenu { ) -> Result { let (xml_path, exists) = self.xml_path_for_mime_type(mime_type).unwrap(); if exists { + println!("XML path exists"); return Ok(xml_path); } @@ -730,6 +729,19 @@ mod tests { } } + // print the whole tree of a directory + fn print_tree(path: &Path) { + for entry in fs::read_dir(path).unwrap() { + let entry = entry.unwrap(); + let path = entry.path(); + println!("{}", path.display()); + if path.is_dir() { + print_tree(&path); + } + } + } + + #[test] fn test_installation() { let dirs = FakeDirectories::new(); @@ -756,12 +768,22 @@ mod tests { ); linux_menu.install().unwrap(); - + print_tree(&dirs.directories().config_directory); // check snapshot of desktop file let desktop_file = dirs.directories().desktop_file(); let desktop_file_content = fs::read_to_string(&desktop_file).unwrap(); let desktop_file_content = desktop_file_content.replace(&fake_prefix.prefix().to_str().unwrap(), ""); insta::assert_snapshot!(desktop_file_content); + + // check mimeapps.list + let mimeapps_file = dirs.directories().config_directory.join("mimeapps.list"); + let mimeapps_file_content = fs::read_to_string(&mimeapps_file).unwrap(); + insta::assert_snapshot!(mimeapps_file_content); + + let mime_file = dirs::data_dir().unwrap().join("mime/packages/text-x-spython.xml"); + let mime_file_content = fs::read_to_string(&mime_file).unwrap(); + insta::assert_snapshot!(mime_file_content); + } } diff --git a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__linux__tests__installation.snap b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__linux__tests__installation.snap index d8f1f246e..115e0dc30 100644 --- a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__linux__tests__installation.snap +++ b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__linux__tests__installation.snap @@ -11,5 +11,5 @@ Terminal=false Icon=/Menu/spyder.png Comment=Scientific PYthon Development EnviRonment Categories=Development;Science; -MimeType=text/x-python; +MimeType=text/x-spython; StartupWMClass=Spyder-6.test-env diff --git a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_spyder.snap b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_spyder.snap index 649b26766..36e3b70b0 100644 --- a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_spyder.snap +++ b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_spyder.snap @@ -84,7 +84,7 @@ MenuInstSchema { mime_type: Some( [ PlaceholderString( - "text/x-python", + "text/x-spython", ), ], ), @@ -99,7 +99,15 @@ MenuInstSchema { ), ), try_exec: None, - glob_patterns: None, + glob_patterns: Some( + { + PlaceholderString( + "text/x-spython", + ): PlaceholderString( + "*.spy", + ), + }, + ), }, }, ), diff --git a/crates/rattler_menuinst/test-data/spyder/menu.json b/crates/rattler_menuinst/test-data/spyder/menu.json index ee09aad4a..85d6c1ddc 100644 --- a/crates/rattler_menuinst/test-data/spyder/menu.json +++ b/crates/rattler_menuinst/test-data/spyder/menu.json @@ -35,8 +35,11 @@ "command": ["{{ PREFIX }}/bin/spyder", "%F"], "StartupWMClass": "Spyder-6.{{ ENV_NAME }}", "MimeType": [ - "text/x-python" - ] + "text/x-spython" + ], + "glob_patterns": { + "text/x-spython": "*.spy" + } }, "osx": { "precommand": "pushd \"$(dirname \"$0\")\" &>/dev/null", From 144abb145aee206e93d7a0e17ad2bd4c7477acfa Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Fri, 20 Dec 2024 13:52:49 +0100 Subject: [PATCH 079/132] add missing files --- ...me_config__tests__existing_mimeapps-2.snap | 33 +++++++++++++++++++ ...me_config__tests__existing_mimeapps-3.snap | 13 ++++++++ ...me_config__tests__existing_mimeapps-4.snap | 22 +++++++++++++ ...mime_config__tests__existing_mimeapps.snap | 25 ++++++++++++++ ...enuinst__linux__tests__installation-2.snap | 8 +++++ ...nst__linux__tests__installation-3.snap.new | 13 ++++++++ .../test-data/linux-menu/mimeapps.list | 6 ++++ 7 files changed, 120 insertions(+) create mode 100644 crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__mime_config__tests__existing_mimeapps-2.snap create mode 100644 crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__mime_config__tests__existing_mimeapps-3.snap create mode 100644 crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__mime_config__tests__existing_mimeapps-4.snap create mode 100644 crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__mime_config__tests__existing_mimeapps.snap create mode 100644 crates/rattler_menuinst/src/snapshots/rattler_menuinst__linux__tests__installation-2.snap create mode 100644 crates/rattler_menuinst/src/snapshots/rattler_menuinst__linux__tests__installation-3.snap.new create mode 100644 crates/rattler_menuinst/test-data/linux-menu/mimeapps.list diff --git a/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__mime_config__tests__existing_mimeapps-2.snap b/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__mime_config__tests__existing_mimeapps-2.snap new file mode 100644 index 000000000..769426fdd --- /dev/null +++ b/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__mime_config__tests__existing_mimeapps-2.snap @@ -0,0 +1,33 @@ +--- +source: crates/rattler_menuinst/src/linux/mime_config.rs +expression: mimeapps.config.get_map() +--- +Some( + { + "Default Applications": { + "text/html": Some( + "google-chrome.desktop", + ), + "x-scheme-handler/http": Some( + "google-chrome.desktop", + ), + "x-scheme-handler/https": Some( + "google-chrome.desktop", + ), + "x-scheme-handler/about": Some( + "google-chrome.desktop", + ), + "x-scheme-handler/unknown": Some( + "google-chrome.desktop", + ), + "text/pixi": Some( + "pixi-app.desktop", + ), + }, + "Added Associations": { + "text/pixi": Some( + "pixi-app.desktop", + ), + }, + }, +) diff --git a/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__mime_config__tests__existing_mimeapps-3.snap b/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__mime_config__tests__existing_mimeapps-3.snap new file mode 100644 index 000000000..136dc7fba --- /dev/null +++ b/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__mime_config__tests__existing_mimeapps-3.snap @@ -0,0 +1,13 @@ +--- +source: crates/rattler_menuinst/src/linux/mime_config.rs +expression: mimeapps.to_string() +--- +[Default Applications] +text/html=google-chrome.desktop +x-scheme-handler/http=google-chrome.desktop +x-scheme-handler/https=google-chrome.desktop +x-scheme-handler/about=google-chrome.desktop +x-scheme-handler/unknown=google-chrome.desktop +text/pixi=pixi-app.desktop +[Added Associations] +text/pixi=pixi-app.desktop diff --git a/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__mime_config__tests__existing_mimeapps-4.snap b/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__mime_config__tests__existing_mimeapps-4.snap new file mode 100644 index 000000000..3c8169446 --- /dev/null +++ b/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__mime_config__tests__existing_mimeapps-4.snap @@ -0,0 +1,22 @@ +--- +source: crates/rattler_menuinst/src/linux/mime_config.rs +expression: mimeapps.config.get_map() +--- +Some( + { + "Default Applications": { + "x-scheme-handler/unknown": Some( + "google-chrome.desktop", + ), + "x-scheme-handler/http": Some( + "google-chrome.desktop", + ), + "x-scheme-handler/https": Some( + "google-chrome.desktop", + ), + "x-scheme-handler/about": Some( + "google-chrome.desktop", + ), + }, + }, +) diff --git a/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__mime_config__tests__existing_mimeapps.snap b/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__mime_config__tests__existing_mimeapps.snap new file mode 100644 index 000000000..ae870dcd6 --- /dev/null +++ b/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__mime_config__tests__existing_mimeapps.snap @@ -0,0 +1,25 @@ +--- +source: crates/rattler_menuinst/src/linux/mime_config.rs +expression: mimeapps.config.get_map() +--- +Some( + { + "Default Applications": { + "text/html": Some( + "google-chrome.desktop", + ), + "x-scheme-handler/http": Some( + "google-chrome.desktop", + ), + "x-scheme-handler/https": Some( + "google-chrome.desktop", + ), + "x-scheme-handler/about": Some( + "google-chrome.desktop", + ), + "x-scheme-handler/unknown": Some( + "google-chrome.desktop", + ), + }, + }, +) diff --git a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__linux__tests__installation-2.snap b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__linux__tests__installation-2.snap new file mode 100644 index 000000000..761d31df4 --- /dev/null +++ b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__linux__tests__installation-2.snap @@ -0,0 +1,8 @@ +--- +source: crates/rattler_menuinst/src/linux.rs +expression: mimeapps_file_content +--- +[Default Applications] +text/x-spython=Spyder 6 (test-env) +[Added Associations] +text/x-spython=Spyder 6 (test-env) diff --git a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__linux__tests__installation-3.snap.new b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__linux__tests__installation-3.snap.new new file mode 100644 index 000000000..8dbda9694 --- /dev/null +++ b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__linux__tests__installation-3.snap.new @@ -0,0 +1,13 @@ +--- +source: crates/rattler_menuinst/src/linux.rs +assertion_line: 786 +expression: mime_file_content +snapshot_kind: text +--- + + + + + Custom MIME type text/x-spython for '*.spy' files (registered by menuinst) + + diff --git a/crates/rattler_menuinst/test-data/linux-menu/mimeapps.list b/crates/rattler_menuinst/test-data/linux-menu/mimeapps.list new file mode 100644 index 000000000..fe4f43332 --- /dev/null +++ b/crates/rattler_menuinst/test-data/linux-menu/mimeapps.list @@ -0,0 +1,6 @@ +[Default Applications] +text/html=google-chrome.desktop +x-scheme-handler/http=google-chrome.desktop +x-scheme-handler/https=google-chrome.desktop +x-scheme-handler/about=google-chrome.desktop +x-scheme-handler/unknown=google-chrome.desktop From 99cefa43e837fa9e728c41484f0e875b00251592 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Fri, 20 Dec 2024 14:07:26 +0100 Subject: [PATCH 080/132] fix tests, add a new error --- crates/rattler_menuinst/src/lib.rs | 6 ++- crates/rattler_menuinst/src/linux.rs | 46 ++++++++----------- crates/rattler_menuinst/src/linux/menu_xml.rs | 7 +-- ...nuinst__linux__tests__installation-3.snap} | 2 - 4 files changed, 24 insertions(+), 37 deletions(-) rename crates/rattler_menuinst/src/snapshots/{rattler_menuinst__linux__tests__installation-3.snap.new => rattler_menuinst__linux__tests__installation-3.snap} (90%) diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index d98c695f8..e61f6fb4f 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -1,4 +1,4 @@ -use std::path::Path; +use std::path::{Path, PathBuf}; use rattler_conda_types::Platform; @@ -50,6 +50,10 @@ pub enum MenuInstError { #[cfg(target_os = "windows")] #[error("Failed to install menu item: {0}")] WindowsError(#[from] ::windows::core::Error), + + #[cfg(target_os = "linux")] + #[error("Menu config location is not a file: {0:?}")] + MenuConfigNotAFile(PathBuf), } // Install menu items from a given schema file diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index fbc0cfa8b..239cb3cc3 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -435,9 +435,7 @@ impl LinuxMenu { if let Ok(update_mime_database) = which::which("update-mime-database") { let mut command = Command::new(update_mime_database); - command - .arg("-V") - .arg(self.directories.mime_directory()); + command.arg("-V").arg(self.directories.mime_directory()); let output = command.output()?; if !output.status.success() { tracing::warn!("Could not update mime database"); @@ -452,10 +450,7 @@ impl LinuxMenu { let basename = mime_type.replace("/", "-"); let mime_directory = self.directories.data_directory.join("mime/packages"); if !mime_directory.is_dir() { - return Ok(( - mime_directory.join(format!("{basename}.xml")), - false, - )); + return Ok((mime_directory.join(format!("{basename}.xml")), false)); } let xml_files: Vec = fs::read_dir(&mime_directory)? @@ -485,10 +480,7 @@ impl LinuxMenu { } return Ok((xml_files[0].clone(), true)); } - Ok(( - mime_directory.join(format!("{basename}.xml")), - false, - )) + Ok((mime_directory.join(format!("{basename}.xml")), false)) } fn glob_pattern_for_mime_type( @@ -499,7 +491,6 @@ impl LinuxMenu { ) -> Result { let (xml_path, exists) = self.xml_path_for_mime_type(mime_type).unwrap(); if exists { - println!("XML path exists"); return Ok(xml_path); } @@ -639,6 +630,9 @@ mod tests { let data_directory = tmp_dir.path().join("data"); let config_directory = tmp_dir.path().join("config"); + std::env::set_var("XDG_DATA_HOME", &data_directory); + std::env::set_var("XDG_CONFIG_HOME", &config_directory); + let directories = Directories { menu_name: "Test".to_string(), name: "Test".to_string(), @@ -663,6 +657,13 @@ mod tests { } } + impl Drop for FakeDirectories { + fn drop(&mut self) { + std::env::remove_var("XDG_DATA_HOME"); + std::env::remove_var("XDG_CONFIG_HOME"); + } + } + struct FakePlaceholders { placeholders: HashMap, } @@ -729,19 +730,6 @@ mod tests { } } - // print the whole tree of a directory - fn print_tree(path: &Path) { - for entry in fs::read_dir(path).unwrap() { - let entry = entry.unwrap(); - let path = entry.path(); - println!("{}", path.display()); - if path.is_dir() { - print_tree(&path); - } - } - } - - #[test] fn test_installation() { let dirs = FakeDirectories::new(); @@ -768,7 +756,7 @@ mod tests { ); linux_menu.install().unwrap(); - print_tree(&dirs.directories().config_directory); + // check snapshot of desktop file let desktop_file = dirs.directories().desktop_file(); let desktop_file_content = fs::read_to_string(&desktop_file).unwrap(); @@ -781,9 +769,11 @@ mod tests { let mimeapps_file_content = fs::read_to_string(&mimeapps_file).unwrap(); insta::assert_snapshot!(mimeapps_file_content); - let mime_file = dirs::data_dir().unwrap().join("mime/packages/text-x-spython.xml"); + let mime_file = dirs + .directories() + .data_directory + .join("mime/packages/text-x-spython.xml"); let mime_file_content = fs::read_to_string(&mime_file).unwrap(); insta::assert_snapshot!(mime_file_content); - } } diff --git a/crates/rattler_menuinst/src/linux/menu_xml.rs b/crates/rattler_menuinst/src/linux/menu_xml.rs index c4fa5cb16..b31567945 100644 --- a/crates/rattler_menuinst/src/linux/menu_xml.rs +++ b/crates/rattler_menuinst/src/linux/menu_xml.rs @@ -186,12 +186,7 @@ impl MenuXml { pub fn ensure_menu_file(&self) -> Result<(), MenuInstError> { if self.menu_config_location.exists() && !self.menu_config_location.is_file() { - panic!( - "Menu config location {} is not a file!", - self.menu_config_location.display() - ); - // return Err(anyhow!("Menu config location {} is not a file!", - // self.menu_config_location.display())); + return Err(MenuInstError::MenuConfigNotAFile(self.menu_config_location.clone())); } if self.menu_config_location.is_file() { diff --git a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__linux__tests__installation-3.snap.new b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__linux__tests__installation-3.snap similarity index 90% rename from crates/rattler_menuinst/src/snapshots/rattler_menuinst__linux__tests__installation-3.snap.new rename to crates/rattler_menuinst/src/snapshots/rattler_menuinst__linux__tests__installation-3.snap index 8dbda9694..83ec13657 100644 --- a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__linux__tests__installation-3.snap.new +++ b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__linux__tests__installation-3.snap @@ -1,8 +1,6 @@ --- source: crates/rattler_menuinst/src/linux.rs -assertion_line: 786 expression: mime_file_content -snapshot_kind: text --- From 116e505e6a7a09e0ff16bb0ce6409fd2634b22f3 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Wed, 19 Feb 2025 07:11:56 +0100 Subject: [PATCH 081/132] rebase --- Cargo.toml | 1 + crates/rattler/Cargo.toml | 1 + crates/rattler/src/install/driver.rs | 2 +- crates/rattler_menuinst/src/linux/menu_xml.rs | 4 +++- 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 9ebcde2f0..53e9b975d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -166,6 +166,7 @@ tracing-test = { version = "0.2.5" } trybuild = { version = "1.0.103" } typed-path = { version = "0.10.0" } url = { version = "2.5.4" } +unicode-normalization = "0.1.24" uuid = { version = "1.13.1", default-features = false } walkdir = "2.5.0" windows-sys = { version = "0.59.0", default-features = false } diff --git a/crates/rattler/Cargo.toml b/crates/rattler/Cargo.toml index b6170dbfd..5b8ba7d8d 100644 --- a/crates/rattler/Cargo.toml +++ b/crates/rattler/Cargo.toml @@ -38,6 +38,7 @@ rattler_digest = { path = "../rattler_digest", version = "1.0.6", default-featur rattler_networking = { path = "../rattler_networking", version = "0.22.4", default-features = false } rattler_shell = { path = "../rattler_shell", version = "0.22.19", default-features = false } rattler_package_streaming = { path = "../rattler_package_streaming", version = "0.22.28", default-features = false, features = ["reqwest"] } +rattler_menuinst = { path = "../rattler_menuinst", version = "0.1.0", default-features = false } rayon = { workspace = true } reflink-copy = { workspace = true } regex = { workspace = true } diff --git a/crates/rattler/src/install/driver.rs b/crates/rattler/src/install/driver.rs index 698f9e82d..fbdbb9216 100644 --- a/crates/rattler/src/install/driver.rs +++ b/crates/rattler/src/install/driver.rs @@ -250,7 +250,7 @@ impl InstallDriver { if let Ok(read_dir) = target_prefix.join("Menu").read_dir() { for file in read_dir.flatten() { let file = file.path(); - if file.is_file() && file.extension().map_or(false, |ext| ext == "json") { + if file.is_file() && file.extension().is_some_and(|ext| ext == "json") { rattler_menuinst::install_menuitems( &file, target_prefix, diff --git a/crates/rattler_menuinst/src/linux/menu_xml.rs b/crates/rattler_menuinst/src/linux/menu_xml.rs index b31567945..c9a7dece6 100644 --- a/crates/rattler_menuinst/src/linux/menu_xml.rs +++ b/crates/rattler_menuinst/src/linux/menu_xml.rs @@ -186,7 +186,9 @@ impl MenuXml { pub fn ensure_menu_file(&self) -> Result<(), MenuInstError> { if self.menu_config_location.exists() && !self.menu_config_location.is_file() { - return Err(MenuInstError::MenuConfigNotAFile(self.menu_config_location.clone())); + return Err(MenuInstError::MenuConfigNotAFile( + self.menu_config_location.clone(), + )); } if self.menu_config_location.is_file() { From d8e5cf6ca1774aae21c53488e2cf7b5301a13f2c Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Wed, 19 Feb 2025 07:37:13 +0100 Subject: [PATCH 082/132] fix tests and clippy --- crates/rattler_conda_types/src/match_spec/mod.rs | 2 +- crates/rattler_menuinst/src/linux.rs | 4 ++-- crates/rattler_menuinst/src/linux/mime_config.rs | 7 +------ 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/crates/rattler_conda_types/src/match_spec/mod.rs b/crates/rattler_conda_types/src/match_spec/mod.rs index 294c9c999..ad522fb26 100644 --- a/crates/rattler_conda_types/src/match_spec/mod.rs +++ b/crates/rattler_conda_types/src/match_spec/mod.rs @@ -824,6 +824,6 @@ mod tests { #[test] fn test_size_stays_the_same() { - assert_eq!(std::mem::size_of::(), 464); + assert_eq!(std::mem::size_of::(), 488); } } diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index 239cb3cc3..3433d7823 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -716,7 +716,7 @@ mod tests { } fs::create_dir_all(prefix_path.join("bin")).unwrap(); - fs::write(prefix_path.join("bin/python"), &[]).unwrap(); + fs::write(prefix_path.join("bin/python"), []).unwrap(); Self { _tmp_dir: tmp_dir, @@ -761,7 +761,7 @@ mod tests { let desktop_file = dirs.directories().desktop_file(); let desktop_file_content = fs::read_to_string(&desktop_file).unwrap(); let desktop_file_content = - desktop_file_content.replace(&fake_prefix.prefix().to_str().unwrap(), ""); + desktop_file_content.replace(fake_prefix.prefix().to_str().unwrap(), ""); insta::assert_snapshot!(desktop_file_content); // check mimeapps.list diff --git a/crates/rattler_menuinst/src/linux/mime_config.rs b/crates/rattler_menuinst/src/linux/mime_config.rs index b4178a19e..3df890685 100644 --- a/crates/rattler_menuinst/src/linux/mime_config.rs +++ b/crates/rattler_menuinst/src/linux/mime_config.rs @@ -36,11 +36,6 @@ impl MimeConfig { self.config.write(&self.path) } - #[cfg(test)] - pub fn to_string(&self) -> String { - self.config.writes() - } - pub fn register_mime_type(&mut self, mime_type: &str, application: &str) { // Only set default if not already set if self.config.get("Default Applications", mime_type).is_none() { @@ -292,7 +287,7 @@ mod tests { mimeapps.register_mime_type("text/pixi", "pixi-app.desktop"); insta::assert_debug_snapshot!(mimeapps.config.get_map()); - insta::assert_snapshot!(mimeapps.to_string()); + insta::assert_snapshot!(mimeapps.config.writes()); // Test removing an application mimeapps.deregister_mime_type("text/html", "google-chrome.desktop"); From c7b69c1e1c6ed7623e6bfb5626abb2999e06abb7 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Wed, 19 Feb 2025 11:08:38 +0100 Subject: [PATCH 083/132] start to implement the `MenuinstTracker` to make removal simple --- crates/rattler/src/install/driver.rs | 35 +++++--- crates/rattler_menuinst/src/lib.rs | 77 ++++++---------- crates/rattler_menuinst/src/macos.rs | 130 +++++++++++++++------------ 3 files changed, 122 insertions(+), 120 deletions(-) diff --git a/crates/rattler/src/install/driver.rs b/crates/rattler/src/install/driver.rs index fbdbb9216..ec435ea81 100644 --- a/crates/rattler/src/install/driver.rs +++ b/crates/rattler/src/install/driver.rs @@ -10,6 +10,7 @@ use indexmap::IndexSet; use itertools::Itertools; use rattler_conda_types::{prefix_record::PathType, PackageRecord, Platform, PrefixRecord}; use simple_spawn_blocking::{tokio::run_blocking_task, Cancelled}; +use tempfile::NamedTempFile; use thiserror::Error; use tokio::sync::{AcquireError, OwnedSemaphorePermit, Semaphore}; @@ -172,15 +173,10 @@ impl InstallDriver { for record in transaction.removed_packages().map(Borrow::borrow) { for path in record.paths_data.paths.iter() { if path.relative_path.starts_with("Menu") - && path.relative_path.extension() == Some(OsStr::new("json")) + && path.relative_path.extension() == Some(OsStr::new(".menuist-tracker")) { - match rattler_menuinst::remove_menu_items( - &target_prefix.join(&path.relative_path), - target_prefix, - target_prefix, - Platform::current(), - rattler_menuinst::MenuMode::User, - ) { + let record_path = target_prefix.join(&path.relative_path); + match rattler_menuinst::remove_menu_items(&record_path) { Ok(_) => {} Err(e) => { tracing::warn!("Failed to remove menu item: {}", e); @@ -251,16 +247,29 @@ impl InstallDriver { for file in read_dir.flatten() { let file = file.path(); if file.is_file() && file.extension().is_some_and(|ext| ext == "json") { - rattler_menuinst::install_menuitems( + let Ok(tracker) = rattler_menuinst::install_menuitems( &file, target_prefix, target_prefix, Platform::current(), rattler_menuinst::MenuMode::User, - ) - .unwrap_or_else(|e| { - tracing::warn!("Failed to install menu item: {} (ignored)", e); - }); + ) else { + tracing::warn!("Failed to install menu items for: {}", file.display()); + continue; + }; + + // TODO store tracker in conda-meta? + for elem in tracker { + let file = NamedTempFile::with_suffix_in( + target_prefix.join("conda-meta"), + ".menuinst-tracker", + ) + .unwrap(); + // TODO get rid of expect + elem.save_to(file.path()) + .expect("Failed to save menuinst tracker"); + file.keep().unwrap(); + } } } } diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index e61f6fb4f..d19f0dfe5 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -1,4 +1,7 @@ -use std::path::{Path, PathBuf}; +use std::path::Path; + +#[cfg(target_os = "linux")] +use std::path::PathBuf; use rattler_conda_types::Platform; @@ -12,8 +15,11 @@ mod util; #[cfg(target_os = "windows")] mod windows; +pub mod tracker; + pub mod slugify; pub use slugify::slugify; +use tracker::MenuinstTracker; use crate::{render::BaseMenuItemPlaceholders, schema::MenuInstSchema}; @@ -63,7 +69,7 @@ pub fn install_menuitems( base_prefix: &Path, platform: Platform, menu_mode: MenuMode, -) -> Result<(), MenuInstError> { +) -> Result, MenuInstError> { let text = std::fs::read_to_string(file)?; let menu_inst: MenuInstSchema = serde_json::from_str(&text)?; let placeholders = BaseMenuItemPlaceholders::new(base_prefix, prefix, platform); @@ -72,7 +78,7 @@ pub fn install_menuitems( // #[cfg(target_os = "linux")] // linux::install_menu(&menu_inst.menu_name, prefix, menu_mode)?; // } - + let mut trackers = Vec::new(); for item in menu_inst.menu_items { if platform.is_linux() { #[cfg(target_os = "linux")] @@ -91,14 +97,15 @@ pub fn install_menuitems( #[cfg(target_os = "macos")] if let Some(macos_item) = item.platforms.osx { let command = item.command.merge(macos_item.base); - macos::install_menu_item( + let macos_tracker = macos::install_menu_item( prefix, macos_item.specific, command, &placeholders, menu_mode, )?; - } + trackers.push(MenuinstTracker::MacOs(macos_tracker)); + }; } else if platform.is_windows() { #[cfg(target_os = "windows")] if let Some(windows_item) = item.platforms.win { @@ -114,59 +121,25 @@ pub fn install_menuitems( } } - Ok(()) + Ok(trackers) } /// Remove menu items from a given schema file -pub fn remove_menu_items( - file: &Path, - prefix: &Path, - base_prefix: &Path, - platform: Platform, - menu_mode: MenuMode, -) -> Result<(), MenuInstError> { - let text = std::fs::read_to_string(file)?; - let menu_inst: MenuInstSchema = serde_json::from_str(&text)?; - let placeholders = BaseMenuItemPlaceholders::new(base_prefix, prefix, platform); +pub fn remove_menu_items(tracker: &Path) -> Result<(), MenuInstError> { + let tracker = MenuinstTracker::load_from(tracker).expect("Could not load tracker file"); - for item in menu_inst.menu_items { - if platform.is_linux() { + #[allow(unused)] + match tracker { + MenuinstTracker::MacOs(tracker) => { + macos::remove_menu_item(&tracker).unwrap(); + } + MenuinstTracker::Linux(tracker) => { #[cfg(target_os = "linux")] - if let Some(linux_item) = item.platforms.linux { - let command = item.command.merge(linux_item.base); - linux::remove_menu_item( - &menu_inst.menu_name, - prefix, - linux_item.specific, - command, - &placeholders, - menu_mode, - )?; - } - } else if platform.is_osx() { - #[cfg(target_os = "macos")] - if let Some(macos_item) = item.platforms.osx { - let command = item.command.merge(macos_item.base); - macos::remove_menu_item( - prefix, - macos_item.specific, - command, - &placeholders, - menu_mode, - )?; - } - } else if platform.is_windows() { + linux::remove_menu_item(&tracker)?; + } + MenuinstTracker::Windows(tracker) => { #[cfg(target_os = "windows")] - if let Some(windows_item) = item.platforms.win { - let command = item.command.merge(windows_item.base); - windows::remove_menu_item( - prefix, - windows_item.specific, - command, - &placeholders, - menu_mode, - )?; - } + windows::remove_menu_item(&tracker)?; } } diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index 28e6a1e7f..fe3605fe3 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -22,6 +22,7 @@ use crate::{ UTTypeDeclarationModel, }, slugify, + tracker::MacOsTracker, util::run_pre_create_command, utils, MenuInstError, MenuMode, }; @@ -69,13 +70,27 @@ impl Directories { self.nested_location.join("Contents/Resources") } - pub fn create_directories(&self, needs_appkit_launcher: bool) -> Result<(), MenuInstError> { + pub fn create_directories( + &self, + needs_appkit_launcher: bool, + tracker: &mut MacOsTracker, + ) -> Result<(), MenuInstError> { fs::create_dir_all(self.location.join("Contents/Resources"))?; fs::create_dir_all(self.location.join("Contents/MacOS"))?; + tracker.paths.push(self.location.join("Contents/Resources")); + tracker.paths.push(self.location.join("Contents/MacOS")); + if needs_appkit_launcher { fs::create_dir_all(self.nested_location.join("Contents/Resources"))?; fs::create_dir_all(self.nested_location.join("Contents/MacOS"))?; + + tracker + .paths + .push(self.nested_location.join("Contents/Resources")); + tracker + .paths + .push(self.nested_location.join("Contents/MacOS")); } Ok(()) @@ -206,6 +221,26 @@ impl CFBundleURLTypesModel { } } +/// Call `lsregister` with args +fn lsregister(args: &[&str], directory: &Path) -> Result<(), MenuInstError> { + let exe = "/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister"; + tracing::debug!("Calling lsregister with args: {:?}", args); + let output = Command::new(exe) + .args(args) + .arg(directory) + .output() + .map_err(|e| MenuInstError::InstallError(format!("failed to execute lsregister: {e}")))?; + + if !output.status.success() { + return Err(MenuInstError::InstallError(format!( + "lsregister failed with exit code: {}", + output.status + ))); + } + + Ok(()) +} + impl MacOSMenu { fn new_impl( prefix: &Path, @@ -704,43 +739,19 @@ impl MacOSMenu { } } - fn maybe_register_with_launchservices(&self, register: bool) -> Result<(), MenuInstError> { + fn register_launchservice(&self, tracker: &mut MacOsTracker) -> Result<(), MenuInstError> { if !self.needs_appkit_launcher() { return Ok(()); } - if register { - Self::lsregister(&["-R", self.directories.location.to_str().unwrap()]) - } else { - Self::lsregister(&[ - "-R", - "-u", - "-all", - self.directories.location.to_str().unwrap(), - ]) - } - } - - fn lsregister(args: &[&str]) -> Result<(), MenuInstError> { - let exe = "/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister"; - tracing::debug!("Calling lsregister with args: {:?}", args); - let output = Command::new(exe).args(args).output().map_err(|e| { - MenuInstError::InstallError(format!("Failed to execute lsregister: {e}")) - })?; - - if !output.status.success() { - return Err(MenuInstError::InstallError(format!( - "lsregister failed with exit code: {}", - output.status - ))); - } - + lsregister(&["-R"], &self.directories.location)?; + tracker.lsregister = Some(self.directories.location.clone()); Ok(()) } - pub fn install(&self) -> Result<(), MenuInstError> { + pub fn install(&self, tracker: &mut MacOsTracker) -> Result<(), MenuInstError> { self.directories - .create_directories(self.needs_appkit_launcher())?; + .create_directories(self.needs_appkit_launcher(), tracker)?; self.precreate()?; self.install_icon()?; self.write_pkg_info()?; @@ -749,23 +760,10 @@ impl MacOSMenu { self.write_launcher()?; self.write_script(None)?; self.write_event_handler(None)?; - self.maybe_register_with_launchservices(true)?; + self.register_launchservice(tracker)?; self.sign_with_entitlements()?; Ok(()) } - - pub fn remove(&self) -> Result, MenuInstError> { - tracing::info!("Removing menu item {}", self.directories.location.display()); - self.maybe_register_with_launchservices(false)?; - if self.directories.location.exists() { - fs_err::remove_dir_all(&self.directories.location).unwrap_or_else(|e| { - tracing::warn!("Failed to remove directory: {e}. Ignoring error."); - }); - Ok(vec![self.directories.location.clone()]) - } else { - Ok(vec![]) - } - } } pub(crate) fn install_menu_item( @@ -774,20 +772,42 @@ pub(crate) fn install_menu_item( command: MenuItemCommand, placeholders: &BaseMenuItemPlaceholders, menu_mode: MenuMode, -) -> Result<(), MenuInstError> { +) -> Result { let menu = MacOSMenu::new(prefix, macos_item, command, menu_mode, placeholders); - menu.install() + let mut tracker = MacOsTracker::new(); + menu.install(&mut tracker)?; + Ok(tracker) } -pub(crate) fn remove_menu_item( - prefix: &Path, - macos_item: MacOS, - command: MenuItemCommand, - placeholders: &BaseMenuItemPlaceholders, - menu_mode: MenuMode, -) -> Result, MenuInstError> { - let menu = MacOSMenu::new(prefix, macos_item, command, menu_mode, placeholders); - menu.remove() +pub(crate) fn remove_menu_item(tracker: &MacOsTracker) -> Result, Vec> { + let mut removed = Vec::new(); + let mut errors = Vec::new(); + for path in &tracker.paths { + if path.exists() { + match fs_err::remove_dir_all(path) { + Ok(_) => { + removed.push(path.clone()); + } + Err(e) => { + errors.push(e.into()); + } + } + } + } + + if let Some(lsregister_path) = &tracker.lsregister { + match lsregister(&["-R", "-u", "-all"], lsregister_path) { + Ok(_) => {} + Err(e) => { + tracing::warn!("Failed to unregister with lsregister: {}", e); + errors.push(e); + } + } + } + if !errors.is_empty() { + return Err(errors); + } + Ok(removed) } #[cfg(test)] From 6f7cedd0d40cb11fcef70e2067d692f625726c09 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Wed, 19 Feb 2025 11:08:52 +0100 Subject: [PATCH 084/132] implement tracker --- crates/rattler_menuinst/src/tracker.rs | 84 ++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 crates/rattler_menuinst/src/tracker.rs diff --git a/crates/rattler_menuinst/src/tracker.rs b/crates/rattler_menuinst/src/tracker.rs new file mode 100644 index 000000000..d36fbb9a5 --- /dev/null +++ b/crates/rattler_menuinst/src/tracker.rs @@ -0,0 +1,84 @@ +use fs_err::File; +use serde::{Deserialize, Serialize}; +use std::{ + io::{self, BufReader, BufWriter}, + path::{Path, PathBuf}, +}; +use thiserror::Error; + +/// Track the installation of menu items on the system and make it easy to remove them +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub enum MenuinstTracker { + Linux(LinuxTracker), + Windows(WindowsTracker), + MacOs(MacOsTracker), +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct LinuxTracker { + pub paths: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct WindowsTracker {} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct MacOsTracker { + pub paths: Vec, + pub lsregister: Option, +} + +impl MacOsTracker { + pub fn new() -> Self { + Self { + paths: vec![], + lsregister: None, + } + } +} + +/// Errors that can occur when saving or loading the menu installation tracker +#[derive(Debug, Error)] +pub enum TrackerError { + #[error("Failed to create file: {0}")] + FileCreate(#[source] io::Error), + #[error("Failed to read file: {0}")] + FileRead(#[source] io::Error), + #[error("Failed to serialize tracker: {0}")] + Serialize(#[source] serde_json::Error), + #[error("Failed to deserialize tracker: {0}")] + Deserialize(#[source] serde_json::Error), +} + +impl MenuinstTracker { + /// Saves the menu installation tracker to a JSON file at the specified path. + /// + /// # Arguments + /// * `path` - The path where to save the tracker file + /// + /// # Errors + /// Returns a [`TrackerError`] if: + /// * The file cannot be created + /// * The tracker cannot be serialized to JSON + pub fn save_to(&self, path: impl AsRef) -> Result<(), TrackerError> { + let file = File::create(path.as_ref()).map_err(TrackerError::FileCreate)?; + let writer = BufWriter::new(file); + serde_json::to_writer_pretty(writer, self).map_err(TrackerError::Serialize) + } + + /// Loads a menu installation tracker from a JSON file. + /// + /// # Arguments + /// * `path` - The path to the tracker file to load + /// + /// # Errors + /// Returns a [`TrackerError`] if: + /// * The file cannot be opened + /// * The file contains invalid JSON + /// * The JSON does not represent a valid tracker + pub fn load_from(path: impl AsRef) -> Result { + let file = File::open(path.as_ref()).map_err(TrackerError::FileRead)?; + let reader = BufReader::new(file); + serde_json::from_reader(reader).map_err(TrackerError::Deserialize) + } +} From 8d3e66a5c5cbdaedc644ec53580705c893927907 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Wed, 19 Feb 2025 11:46:32 +0100 Subject: [PATCH 085/132] continue tracker implementation --- crates/rattler/Cargo.toml | 1 + crates/rattler/src/install/driver.rs | 111 +++++++++++------- crates/rattler/src/install/installer/mod.rs | 1 + .../rattler_conda_types/src/prefix_record.rs | 6 + crates/rattler_menuinst/src/lib.rs | 4 +- crates/rattler_menuinst/src/macos.rs | 2 +- crates/rattler_menuinst/src/tracker.rs | 11 +- 7 files changed, 83 insertions(+), 53 deletions(-) diff --git a/crates/rattler/Cargo.toml b/crates/rattler/Cargo.toml index 5b8ba7d8d..6f9b78485 100644 --- a/crates/rattler/Cargo.toml +++ b/crates/rattler/Cargo.toml @@ -53,6 +53,7 @@ tracing = { workspace = true } url = { workspace = true, features = ["serde"] } uuid = { workspace = true, features = ["v4", "fast-rng"] } console = { workspace = true, optional = true } +serde_json.workspace = true [dev-dependencies] assert_matches = { workspace = true } diff --git a/crates/rattler/src/install/driver.rs b/crates/rattler/src/install/driver.rs index ec435ea81..0f3a9f06c 100644 --- a/crates/rattler/src/install/driver.rs +++ b/crates/rattler/src/install/driver.rs @@ -1,7 +1,6 @@ use std::{ borrow::Borrow, collections::{HashMap, HashSet}, - ffi::OsStr, path::{Path, PathBuf}, sync::{Arc, Mutex, MutexGuard}, }; @@ -10,7 +9,6 @@ use indexmap::IndexSet; use itertools::Itertools; use rattler_conda_types::{prefix_record::PathType, PackageRecord, Platform, PrefixRecord}; use simple_spawn_blocking::{tokio::run_blocking_task, Cancelled}; -use tempfile::NamedTempFile; use thiserror::Error; use tokio::sync::{AcquireError, OwnedSemaphorePermit, Semaphore}; @@ -33,6 +31,7 @@ pub struct InstallDriver { io_concurrency_semaphore: Option>, pub(crate) clobber_registry: Arc>, execute_link_scripts: bool, + install_menu_items: bool, } impl Default for InstallDriver { @@ -40,6 +39,7 @@ impl Default for InstallDriver { Self::builder() .execute_link_scripts(false) .with_io_concurrency_limit(100) + .install_menu_items(true) .finish() } } @@ -50,6 +50,7 @@ pub struct InstallDriverBuilder { io_concurrency_semaphore: Option>, clobber_registry: Option, execute_link_scripts: bool, + install_menu_items: bool, } /// The result of the post-processing step. @@ -115,6 +116,14 @@ impl InstallDriverBuilder { } } + /// Whether to install menu items or not. + pub fn install_menu_items(self, install_menu_items: bool) -> Self { + Self { + install_menu_items, + ..self + } + } + pub fn finish(self) -> InstallDriver { InstallDriver { io_concurrency_semaphore: self.io_concurrency_semaphore, @@ -124,6 +133,7 @@ impl InstallDriverBuilder { .map(Arc::new) .unwrap_or_default(), execute_link_scripts: self.execute_link_scripts, + install_menu_items: self.install_menu_items, } } } @@ -170,17 +180,13 @@ impl InstallDriver { } // For all packages that are removed, we need to remove menuinst entries as well - for record in transaction.removed_packages().map(Borrow::borrow) { - for path in record.paths_data.paths.iter() { - if path.relative_path.starts_with("Menu") - && path.relative_path.extension() == Some(OsStr::new(".menuist-tracker")) - { - let record_path = target_prefix.join(&path.relative_path); - match rattler_menuinst::remove_menu_items(&record_path) { - Ok(_) => {} - Err(e) => { - tracing::warn!("Failed to remove menu item: {}", e); - } + for record in transaction.removed_packages() { + let prefix_record = record.borrow(); + if let Some(data) = &prefix_record.menuinst_tracker { + match rattler_menuinst::remove_menu_items(data) { + Ok(_) => {} + Err(e) => { + tracing::warn!("Failed to remove menu item: {}", e); } } } @@ -242,33 +248,58 @@ impl InstallDriver { None }; - // find all files in `$PREFIX/Menu/*.json` and install them with `menuinst` - if let Ok(read_dir) = target_prefix.join("Menu").read_dir() { - for file in read_dir.flatten() { - let file = file.path(); - if file.is_file() && file.extension().is_some_and(|ext| ext == "json") { - let Ok(tracker) = rattler_menuinst::install_menuitems( - &file, - target_prefix, - target_prefix, - Platform::current(), - rattler_menuinst::MenuMode::User, - ) else { - tracing::warn!("Failed to install menu items for: {}", file.display()); - continue; - }; - - // TODO store tracker in conda-meta? - for elem in tracker { - let file = NamedTempFile::with_suffix_in( - target_prefix.join("conda-meta"), - ".menuinst-tracker", - ) - .unwrap(); - // TODO get rid of expect - elem.save_to(file.path()) - .expect("Failed to save menuinst tracker"); - file.keep().unwrap(); + // TODO this would overwrite prefix records that were changed in the `unclobber` + // code path + + if self.install_menu_items { + // Install menu items from prefix records + for record in prefix_records.iter() { + // Look for Menu/*.json files in the package paths + let menu_files: Vec<_> = record + .paths_data + .paths + .iter() + .filter(|path| { + path.relative_path.starts_with("Menu/") + && path + .relative_path + .extension() + .is_some_and(|ext| ext == "json") + }) + .collect(); + + if !menu_files.is_empty() { + for menu_file in menu_files { + let full_path = target_prefix.join(&menu_file.relative_path); + match rattler_menuinst::install_menuitems( + &full_path, + target_prefix, + target_prefix, + Platform::current(), + rattler_menuinst::MenuMode::User, + ) { + Ok(tracker_vec) => { + // Store tracker in the prefix record + let mut record = record.clone(); + record.menuinst_tracker = + Some(serde_json::to_value(tracker_vec).unwrap()); + + // Save the updated prefix record + record + .write_to_path( + target_prefix.join("conda-meta").join(record.file_name()), + true, + ) + .expect("Failed to write prefix record"); + } + Err(e) => { + tracing::warn!( + "Failed to install menu items for {}: {}", + full_path.display(), + e + ); + } + } } } } diff --git a/crates/rattler/src/install/installer/mod.rs b/crates/rattler/src/install/installer/mod.rs index bfafbe32a..ad68cf82c 100644 --- a/crates/rattler/src/install/installer/mod.rs +++ b/crates/rattler/src/install/installer/mod.rs @@ -512,6 +512,7 @@ async fn link_package( // ... link_type: Some(LinkType::HardLink), }), + menuinst_tracker: None, }; let conda_meta_path = target_prefix.join("conda-meta"); diff --git a/crates/rattler_conda_types/src/prefix_record.rs b/crates/rattler_conda_types/src/prefix_record.rs index 0fd32d822..0597e2a49 100644 --- a/crates/rattler_conda_types/src/prefix_record.rs +++ b/crates/rattler_conda_types/src/prefix_record.rs @@ -179,6 +179,11 @@ pub struct PrefixRecord { /// currently another spec was used. Note: conda seems to serialize a "None" string value instead of `null`. #[serde(default, skip_serializing_if = "Option::is_none")] pub requested_spec: Option, + + /// If menuinst is enabled and added menu items, this field contains the menuinst tracker data. + /// This data is used to remove the menu items when the package is uninstalled. + #[serde(default, skip_serializing_if = "Option::is_none")] + pub menuinst_tracker: Option, } impl PrefixRecord { @@ -209,6 +214,7 @@ impl PrefixRecord { paths_data: paths.into(), link, requested_spec, + menuinst_tracker: None, } } diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index d19f0dfe5..75fdc08c1 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -125,8 +125,8 @@ pub fn install_menuitems( } /// Remove menu items from a given schema file -pub fn remove_menu_items(tracker: &Path) -> Result<(), MenuInstError> { - let tracker = MenuinstTracker::load_from(tracker).expect("Could not load tracker file"); +pub fn remove_menu_items(tracker: &serde_json::Value) -> Result<(), MenuInstError> { + let tracker = serde_json::from_value(tracker.clone())?; #[allow(unused)] match tracker { diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index fe3605fe3..c74d235a6 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -774,7 +774,7 @@ pub(crate) fn install_menu_item( menu_mode: MenuMode, ) -> Result { let menu = MacOSMenu::new(prefix, macos_item, command, menu_mode, placeholders); - let mut tracker = MacOsTracker::new(); + let mut tracker = MacOsTracker::default(); menu.install(&mut tracker)?; Ok(tracker) } diff --git a/crates/rattler_menuinst/src/tracker.rs b/crates/rattler_menuinst/src/tracker.rs index d36fbb9a5..2b926ba7a 100644 --- a/crates/rattler_menuinst/src/tracker.rs +++ b/crates/rattler_menuinst/src/tracker.rs @@ -22,21 +22,12 @@ pub struct LinuxTracker { #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] pub struct WindowsTracker {} -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq)] pub struct MacOsTracker { pub paths: Vec, pub lsregister: Option, } -impl MacOsTracker { - pub fn new() -> Self { - Self { - paths: vec![], - lsregister: None, - } - } -} - /// Errors that can occur when saving or loading the menu installation tracker #[derive(Debug, Error)] pub enum TrackerError { From 61fefc591119e0c67845dba0eb601f4672f2571e Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Wed, 19 Feb 2025 13:24:22 +0100 Subject: [PATCH 086/132] make things kinda work on linux --- crates/rattler/src/install/test_utils.rs | 1 + crates/rattler_menuinst/src/lib.rs | 10 +- crates/rattler_menuinst/src/linux.rs | 322 +++++++++++++---------- crates/rattler_menuinst/src/tracker.rs | 9 +- 4 files changed, 194 insertions(+), 148 deletions(-) diff --git a/crates/rattler/src/install/test_utils.rs b/crates/rattler/src/install/test_utils.rs index a761e99dc..9c3ad5136 100644 --- a/crates/rattler/src/install/test_utils.rs +++ b/crates/rattler/src/install/test_utils.rs @@ -43,6 +43,7 @@ pub async fn install_package_to_environment( paths_data: paths.into(), requested_spec: None, link: None, + menuinst_tracker: None, }; // Create the conda-meta directory if it doesnt exist yet. diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index 75fdc08c1..2774ec934 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -18,6 +18,7 @@ mod windows; pub mod tracker; pub mod slugify; +use serde::{Deserialize, Serialize}; pub use slugify::slugify; use tracker::MenuinstTracker; @@ -25,9 +26,10 @@ use crate::{render::BaseMenuItemPlaceholders, schema::MenuInstSchema}; pub mod utils; -#[derive(Debug, Eq, PartialEq, Clone, Copy)] +#[derive(Default, Debug, Eq, PartialEq, Clone, Copy, Serialize, Deserialize)] pub enum MenuMode { System, + #[default] User, } @@ -84,7 +86,7 @@ pub fn install_menuitems( #[cfg(target_os = "linux")] if let Some(linux_item) = item.platforms.linux { let command = item.command.merge(linux_item.base); - linux::install_menu_item( + let linux_tracker = linux::install_menu_item( &menu_inst.menu_name, prefix, linux_item.specific, @@ -92,6 +94,7 @@ pub fn install_menuitems( &placeholders, menu_mode, )?; + trackers.push(MenuinstTracker::Linux(linux_tracker)); } } else if platform.is_osx() { #[cfg(target_os = "macos")] @@ -131,11 +134,12 @@ pub fn remove_menu_items(tracker: &serde_json::Value) -> Result<(), MenuInstErro #[allow(unused)] match tracker { MenuinstTracker::MacOs(tracker) => { + #[cfg(target_os = "macos")] macos::remove_menu_item(&tracker).unwrap(); } MenuinstTracker::Linux(tracker) => { #[cfg(target_os = "linux")] - linux::remove_menu_item(&tracker)?; + linux::remove_menu_item(&tracker).unwrap(); } MenuinstTracker::Windows(tracker) => { #[cfg(target_os = "windows")] diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index 3433d7823..42ba3e910 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -16,6 +16,7 @@ use rattler_shell::shell; use crate::render::{BaseMenuItemPlaceholders, MenuItemPlaceholders, PlaceholderString}; use crate::slugify; +use crate::tracker::LinuxTracker; use crate::util::{log_output, run_pre_create_command}; use crate::{ schema::{Linux, MenuItemCommand}, @@ -135,6 +136,76 @@ impl Directories { } } +/// Update the mime database for a given directory +fn update_mime_database(directory: &Path) -> Result<(), MenuInstError> { + if let Ok(update_mime_database) = which::which("update-mime-database") { + let output = Command::new(update_mime_database) + .arg("-V") + .arg(directory) + .output()?; + + if !output.status.success() { + tracing::warn!("Could not update mime database"); + log_output("update-mime-database", output); + } + } + Ok(()) +} + +enum XdgMimeOperation { + Install, + Uninstall, +} + +/// XDG Mime invocation error +#[derive(Debug, thiserror::Error)] +pub enum XdgMimeError { + #[error("IO error: {0}")] + IoError(#[from] std::io::Error), +} + +fn xdg_mime( + xml_file: &Path, + mode: MenuMode, + operation: XdgMimeOperation, +) -> Result<(), XdgMimeError> { + let mut command = Command::new("xdg-mime"); + + let mode = match mode { + MenuMode::System => "system", + MenuMode::User => "user", + }; + + let operation = match operation { + XdgMimeOperation::Install => "install", + XdgMimeOperation::Uninstall => "uninstall", + }; + + command + .arg(operation) + .arg("--mode") + .arg(mode) + .arg("--novendor") + .arg(xml_file); + + let output = command.output()?; + + if !output.status.success() { + tracing::warn!( + "Could not un/register MIME type with xdg-mime. Writing to '{}' as a fallback.", + xml_file.display() + ); + log_output("xdg-mime", output); + + return Err(XdgMimeError::IoError(std::io::Error::new( + std::io::ErrorKind::Other, + "xdg-mime failed", + ))); + } + + Ok(()) +} + impl LinuxMenu { fn new( menu_name: &str, @@ -242,7 +313,10 @@ impl LinuxMenu { let command = parts.join(" && "); - format!("bash -c {}", shlex::try_quote(&command).unwrap()) + format!( + "bash -c {}", + shlex::try_quote(&command).expect("could not quote command") + ) } fn resolve_and_join(&self, items: &[PlaceholderString]) -> String { @@ -254,12 +328,14 @@ impl LinuxMenu { res } - fn create_desktop_entry(&self) -> Result<(), MenuInstError> { + fn create_desktop_entry(&self, tracker: &mut LinuxTracker) -> Result<(), MenuInstError> { let file = self.location(); tracing::info!("Creating desktop entry at {}", file.display()); - let writer = File::create(file)?; + let writer = File::create(&file)?; let mut writer = std::io::BufWriter::new(writer); + tracker.paths.push(file); + writeln!(writer, "[Desktop Entry]")?; writeln!(writer, "Type=Application")?; writeln!(writer, "Encoding=UTF-8")?; @@ -365,39 +441,25 @@ impl LinuxMenu { Ok(()) } - fn install(&self) -> Result<(), MenuInstError> { + fn install(&self, tracker: &mut LinuxTracker) -> Result<(), MenuInstError> { self.directories.ensure_directories_exist()?; self.pre_create()?; - self.create_desktop_entry()?; - self.maybe_register_mime_types(true)?; + self.create_desktop_entry(tracker)?; + self.register_mime_types(tracker)?; Self::update_desktop_database()?; Ok(()) } - fn remove(&self) -> Result<(), MenuInstError> { - let paths = self.paths(); - for path in paths { - fs::remove_file(path)?; - } - Ok(()) - } + fn register_mime_types(&self, tracker: &mut LinuxTracker) -> Result<(), MenuInstError> { + let Some(mime_types) = self.item.mime_type.as_ref() else { + return Ok(()); + }; - fn maybe_register_mime_types(&self, register: bool) -> Result<(), MenuInstError> { - if let Some(mime_types) = self.item.mime_type.as_ref() { - let resolved_mime_types = mime_types - .iter() - .map(|s| s.resolve(&self.placeholders)) - .collect::>(); - self.register_mime_types(&resolved_mime_types, register)?; - } - Ok(()) - } + let mime_types = mime_types + .iter() + .map(|s| s.resolve(&self.placeholders)) + .collect::>(); - fn register_mime_types( - &self, - mime_types: &[String], - register: bool, - ) -> Result<(), MenuInstError> { tracing::info!("Registering mime types {:?}", mime_types); let mut resolved_globs = HashMap::::new(); @@ -407,41 +469,26 @@ impl LinuxMenu { } } - for mime_type in mime_types { + for mime_type in &mime_types { if let Some(glob_pattern) = resolved_globs.get(mime_type) { - self.glob_pattern_for_mime_type(mime_type, glob_pattern, register)?; + self.glob_pattern_for_mime_type(mime_type, glob_pattern, tracker)?; } } let mimeapps = self.directories.config_directory.join("mimeapps.list"); - if register { - let mut config = MimeConfig::new(mimeapps); - config.load()?; - for mime_type in mime_types { - tracing::info!("Registering mime type {} for {}", mime_type, &self.name); - config.register_mime_type(mime_type, &self.name); - } - config.save()?; - } else if mimeapps.exists() { - // in this case we remove the mime type from the mimeapps.list file - let mut config = MimeConfig::new(mimeapps); - for mime_type in mime_types { - tracing::info!("Deregistering mime type {} for {}", mime_type, &self.name); - config.deregister_mime_type(mime_type, &self.name); - } - config.save()?; + let mut config = MimeConfig::new(mimeapps); + config.load()?; + for mime_type in mime_types { + tracing::info!("Registering mime type {} for {}", mime_type, &self.name); + config.register_mime_type(&mime_type, &self.name); + tracker + .mime_types + .push((mime_type.clone(), self.name.clone())); } + config.save()?; - if let Ok(update_mime_database) = which::which("update-mime-database") { - let mut command = Command::new(update_mime_database); - command.arg("-V").arg(self.directories.mime_directory()); - let output = command.output()?; - if !output.status.success() { - tracing::warn!("Could not update mime database"); - log_output("update-mime-database", output); - } - } + update_mime_database(&self.directories.mime_directory())?; Ok(()) } @@ -455,14 +502,10 @@ impl LinuxMenu { let xml_files: Vec = fs::read_dir(&mime_directory)? .filter_map(|entry| { - let path = entry.unwrap().path(); - if path - .file_name() - .unwrap() - .to_str() - .unwrap() - .contains(&basename) - { + let entry = entry.ok()?; + let path = entry.path(); + let file_name = path.file_name()?.to_str()?; + if file_name.contains(&basename) { Some(path) } else { None @@ -487,11 +530,12 @@ impl LinuxMenu { &self, mime_type: &str, glob_pattern: &str, - install: bool, - ) -> Result { - let (xml_path, exists) = self.xml_path_for_mime_type(mime_type).unwrap(); + tracker: &mut LinuxTracker, + ) -> Result<(), MenuInstError> { + let (xml_path, exists) = self.xml_path_for_mime_type(mime_type)?; if exists { - return Ok(xml_path); + // Already registered this mime type + return Ok(()); } // Write the XML that binds our current mime type to the glob pattern @@ -510,73 +554,31 @@ impl LinuxMenu { "# ); - let subcommand = if install { "install" } else { "uninstall" }; // Install the XML file and register it as default for our app - let tmp_dir = TempDir::new()?; - let tmp_path = tmp_dir.path().join(xml_path.file_name().unwrap()); - let mut file = fs::File::create(&tmp_path)?; - file.write_all(xml.as_bytes())?; - - let mut command = Command::new("xdg-mime"); - let mode = match self.mode { - MenuMode::System => "system", - MenuMode::User => "user", - }; - - command - .arg(subcommand) - .arg("--mode") - .arg(mode) - .arg("--novendor") - .arg(tmp_path); - let output = command.output()?; - - if !output.status.success() { - tracing::warn!( - "Could not un/register MIME type {} with xdg-mime. Writing to '{}' as a fallback.", - mime_type, - xml_path.display() - ); - tracing::info!( - "xdg-mime stdout output: {}", - String::from_utf8_lossy(&output.stdout) - ); - tracing::info!( - "xdg-mime stderr output: {}", - String::from_utf8_lossy(&output.stderr) - ); + let file_name = xml_path.file_name().expect("we should have a filename"); + let mime_dir_in_prefix = self.prefix.join("Menu/registered-mimetypes"); + fs::create_dir_all(&mime_dir_in_prefix)?; - let mut file = fs::File::create(&xml_path)?; - file.write_all(xml.as_bytes())?; - } - - Ok(xml_path) - } - - /// All paths that are installed for removal - fn paths(&self) -> Vec { - let mut paths = vec![self.location()]; - - if let Some(mime_types) = &self.item.mime_type { - let resolved = mime_types - .iter() - .map(|s| s.resolve(&self.placeholders)) - .collect::>(); - - for mime in resolved { - let (xml_path, exists) = self.xml_path_for_mime_type(&mime).unwrap(); - if !exists { - continue; - } - - if let Ok(content) = fs::read_to_string(&xml_path) { - if content.contains("registered by menuinst") { - paths.push(xml_path); - } - } + let temp_dir = TempDir::new_in(&mime_dir_in_prefix)?; + let file_path = temp_dir.path().join(file_name); + let mut file = File::create(&file_path)?; + file.write_all(xml.as_bytes())?; + file.flush()?; + + match xdg_mime(file.path(), self.mode, XdgMimeOperation::Install) { + Ok(_) => { + // keep temp dir in prefix around and the temp file + // because we re-use it when unregistering the mime type. + let _ = temp_dir.into_path(); + tracker.registered_mime_files.push(file_path); + } + Err(_) => { + fs::write(&xml_path, xml)?; + tracker.paths.push(xml_path); } } - paths + + Ok(()) } } @@ -588,22 +590,53 @@ pub fn install_menu_item( command: MenuItemCommand, placeholders: &BaseMenuItemPlaceholders, menu_mode: MenuMode, -) -> Result<(), MenuInstError> { +) -> Result { + let mut tracker = LinuxTracker::default(); let menu = LinuxMenu::new(menu_name, prefix, item, command, placeholders, menu_mode); - menu.install() + menu.install(&mut tracker)?; + + Ok(tracker) } /// Remove a menu item on Linux. -pub fn remove_menu_item( - menu_name: &str, - prefix: &Path, - item: Linux, - command: MenuItemCommand, - placeholders: &BaseMenuItemPlaceholders, - menu_mode: MenuMode, -) -> Result<(), MenuInstError> { - let menu = LinuxMenu::new(menu_name, prefix, item, command, placeholders, menu_mode); - menu.remove() +pub fn remove_menu_item(tracker: &LinuxTracker) -> Result<(), MenuInstError> { + for path in &tracker.paths { + match fs::remove_file(path) { + Ok(_) => {} + Err(e) => { + tracing::warn!("Could not remove file {}: {}", path.display(), e); + } + } + } + + for path in &tracker.registered_mime_files { + let _ = xdg_mime( + &path, + tracker.install_mode.clone(), + XdgMimeOperation::Uninstall, + ) + .map_err(|e| tracing::warn!("Could not uninstall mime type: {}", e)); + } + + // invoke xdg-mime uninstall ... + if !tracker.mime_types.is_empty() { + // load mimetype config + // TODO - store path to mime config + let mut config = MimeConfig::new(PathBuf::from("/tmp/mimeapps.list")); + for mime_type in &tracker.mime_types { + tracing::info!( + "Unregistering mime type {} for {}", + mime_type.0, + mime_type.1 + ); + config.deregister_mime_type(&mime_type.0, &mime_type.1); + } + config.save()?; + // TODO use `mime directory`. + update_mime_database(&PathBuf::from("/tmp/mime"))?; + } + + Ok(()) } #[cfg(test)] @@ -615,7 +648,7 @@ mod tests { }; use tempfile::TempDir; - use crate::{schema::MenuInstSchema, test::test_data}; + use crate::{schema::MenuInstSchema, test::test_data, tracker::LinuxTracker}; use super::{Directories, LinuxMenu}; @@ -755,7 +788,8 @@ mod tests { dirs.directories().clone(), ); - linux_menu.install().unwrap(); + let mut tracker = LinuxTracker::default(); + linux_menu.install(&mut tracker).unwrap(); // check snapshot of desktop file let desktop_file = dirs.directories().desktop_file(); diff --git a/crates/rattler_menuinst/src/tracker.rs b/crates/rattler_menuinst/src/tracker.rs index 2b926ba7a..2d51e3c9f 100644 --- a/crates/rattler_menuinst/src/tracker.rs +++ b/crates/rattler_menuinst/src/tracker.rs @@ -6,6 +6,8 @@ use std::{ }; use thiserror::Error; +use crate::MenuMode; + /// Track the installation of menu items on the system and make it easy to remove them #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] pub enum MenuinstTracker { @@ -14,9 +16,14 @@ pub enum MenuinstTracker { MacOs(MacOsTracker), } -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq)] pub struct LinuxTracker { + pub install_mode: MenuMode, pub paths: Vec, + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub mime_types: Vec<(String, String)>, + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub registered_mime_files: Vec, } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] From 46f2f0f5bc6b7638e5b4fcf0c654df90d04ba53f Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Wed, 19 Feb 2025 16:05:04 +0100 Subject: [PATCH 087/132] fix stuff on macOS --- crates/rattler-bin/src/commands/create.rs | 1 + crates/rattler/src/install/installer/mod.rs | 11 +++++++ crates/rattler_menuinst/src/lib.rs | 32 ++++++++++---------- crates/rattler_menuinst/src/macos.rs | 33 +++++++-------------- crates/rattler_menuinst/src/tracker.rs | 2 +- 5 files changed, 41 insertions(+), 38 deletions(-) diff --git a/crates/rattler-bin/src/commands/create.rs b/crates/rattler-bin/src/commands/create.rs index 16788141f..506d60d28 100644 --- a/crates/rattler-bin/src/commands/create.rs +++ b/crates/rattler-bin/src/commands/create.rs @@ -306,6 +306,7 @@ pub async fn create(opt: Opt) -> anyhow::Result<()> { .with_target_platform(install_platform) .with_installed_packages(installed_packages) .with_execute_link_scripts(true) + .with_install_menu_items(true) .with_reporter( IndicatifReporter::builder() .with_multi_progress(global_multi_progress()) diff --git a/crates/rattler/src/install/installer/mod.rs b/crates/rattler/src/install/installer/mod.rs index ad68cf82c..0810d6714 100644 --- a/crates/rattler/src/install/installer/mod.rs +++ b/crates/rattler/src/install/installer/mod.rs @@ -50,6 +50,7 @@ pub struct Installer { target_platform: Option, apple_code_sign_behavior: AppleCodeSignBehavior, alternative_target_prefix: Option, + install_menu_items: bool, // TODO: Determine upfront if these are possible. // allow_symbolic_links: Option, // allow_hard_links: Option, @@ -134,6 +135,15 @@ impl Installer { } } + /// Sets whether menu items should be installed or not + #[must_use] + pub fn with_install_menu_items(self, install_menu_items: bool) -> Self { + Self { + install_menu_items, + ..self + } + } + /// Sets whether to execute link scripts or not. /// /// By default, link scripts are not executed. Link scripts can run @@ -303,6 +313,7 @@ impl Installer { // Construct a driver. let driver = InstallDriver::builder() .execute_link_scripts(self.execute_link_scripts) + .install_menu_items(self.install_menu_items) .with_io_concurrency_semaphore( self.io_semaphore.unwrap_or(Arc::new(Semaphore::new(100))), ) diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index 2774ec934..a1d3ed553 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -129,21 +129,23 @@ pub fn install_menuitems( /// Remove menu items from a given schema file pub fn remove_menu_items(tracker: &serde_json::Value) -> Result<(), MenuInstError> { - let tracker = serde_json::from_value(tracker.clone())?; - - #[allow(unused)] - match tracker { - MenuinstTracker::MacOs(tracker) => { - #[cfg(target_os = "macos")] - macos::remove_menu_item(&tracker).unwrap(); - } - MenuinstTracker::Linux(tracker) => { - #[cfg(target_os = "linux")] - linux::remove_menu_item(&tracker).unwrap(); - } - MenuinstTracker::Windows(tracker) => { - #[cfg(target_os = "windows")] - windows::remove_menu_item(&tracker)?; + let tracker: Vec = serde_json::from_value(tracker.clone())?; + + for el in tracker { + #[allow(unused)] + match el { + MenuinstTracker::MacOs(tracker) => { + #[cfg(target_os = "macos")] + macos::remove_menu_item(&tracker).unwrap(); + } + MenuinstTracker::Linux(tracker) => { + #[cfg(target_os = "linux")] + linux::remove_menu_item(&tracker).unwrap(); + } + MenuinstTracker::Windows(tracker) => { + #[cfg(target_os = "windows")] + windows::remove_menu_item(&tracker)?; + } } } diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index c74d235a6..565fae05c 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -75,22 +75,14 @@ impl Directories { needs_appkit_launcher: bool, tracker: &mut MacOsTracker, ) -> Result<(), MenuInstError> { + tracker.app_folder = self.location.clone(); + fs::create_dir_all(self.location.join("Contents/Resources"))?; fs::create_dir_all(self.location.join("Contents/MacOS"))?; - tracker.paths.push(self.location.join("Contents/Resources")); - tracker.paths.push(self.location.join("Contents/MacOS")); - if needs_appkit_launcher { fs::create_dir_all(self.nested_location.join("Contents/Resources"))?; fs::create_dir_all(self.nested_location.join("Contents/MacOS"))?; - - tracker - .paths - .push(self.nested_location.join("Contents/Resources")); - tracker - .paths - .push(self.nested_location.join("Contents/MacOS")); } Ok(()) @@ -782,16 +774,12 @@ pub(crate) fn install_menu_item( pub(crate) fn remove_menu_item(tracker: &MacOsTracker) -> Result, Vec> { let mut removed = Vec::new(); let mut errors = Vec::new(); - for path in &tracker.paths { - if path.exists() { - match fs_err::remove_dir_all(path) { - Ok(_) => { - removed.push(path.clone()); - } - Err(e) => { - errors.push(e.into()); - } - } + match fs_err::remove_dir_all(&tracker.app_folder) { + Ok(_) => { + removed.push(tracker.app_folder.clone()); + } + Err(e) => { + errors.push(e.into()); } } @@ -812,7 +800,7 @@ pub(crate) fn remove_menu_item(tracker: &MacOsTracker) -> Result, V #[cfg(test)] mod tests { - use crate::{schema::MenuInstSchema, test::test_data, MenuMode}; + use crate::{schema::MenuInstSchema, test::test_data, tracker::MacOsTracker, MenuMode}; use std::{ collections::HashMap, fs, @@ -926,7 +914,8 @@ mod tests { &placeholders, dirs.clone(), ); - menu.install().unwrap(); + let mut tracker = MacOsTracker::default(); + menu.install(&mut tracker).unwrap(); assert!(dirs.location.exists()); assert!(dirs.nested_location.exists()); diff --git a/crates/rattler_menuinst/src/tracker.rs b/crates/rattler_menuinst/src/tracker.rs index 2d51e3c9f..e1202c2fb 100644 --- a/crates/rattler_menuinst/src/tracker.rs +++ b/crates/rattler_menuinst/src/tracker.rs @@ -31,7 +31,7 @@ pub struct WindowsTracker {} #[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq)] pub struct MacOsTracker { - pub paths: Vec, + pub app_folder: PathBuf, pub lsregister: Option, } From b5b121ea78497f40aff4d519de2881493e988733 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Wed, 19 Feb 2025 17:59:18 +0100 Subject: [PATCH 088/132] refactor windows code --- crates/rattler_menuinst/src/lib.rs | 3 +- crates/rattler_menuinst/src/tracker.rs | 9 +- crates/rattler_menuinst/src/windows.rs | 177 ++++++++++-------- .../src/windows/create_shortcut.rs | 159 +++++++++------- .../src/windows/knownfolders.rs | 6 +- crates/rattler_menuinst/src/windows/lex.rs | 6 +- .../rattler_menuinst/src/windows/registry.rs | 177 +++++++++++------- 7 files changed, 314 insertions(+), 223 deletions(-) diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index a1d3ed553..a895cc34f 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -80,7 +80,7 @@ pub fn install_menuitems( // #[cfg(target_os = "linux")] // linux::install_menu(&menu_inst.menu_name, prefix, menu_mode)?; // } - let mut trackers = Vec::new(); + let trackers = Vec::new(); for item in menu_inst.menu_items { if platform.is_linux() { #[cfg(target_os = "linux")] @@ -156,6 +156,7 @@ pub fn remove_menu_items(tracker: &serde_json::Value) -> Result<(), MenuInstErro pub mod test { use std::path::{Path, PathBuf}; + #[allow(dead_code)] pub(crate) fn test_data() -> PathBuf { Path::new(env!("CARGO_MANIFEST_DIR")).join("test-data") } diff --git a/crates/rattler_menuinst/src/tracker.rs b/crates/rattler_menuinst/src/tracker.rs index e1202c2fb..999cba443 100644 --- a/crates/rattler_menuinst/src/tracker.rs +++ b/crates/rattler_menuinst/src/tracker.rs @@ -26,8 +26,13 @@ pub struct LinuxTracker { pub registered_mime_files: Vec, } -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] -pub struct WindowsTracker {} +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct WindowsTracker { + pub menu_mode: MenuMode, + pub files: Vec, + pub file_extensions: Vec<(String, String)>, + pub url_protocols: Vec<(String, String)>, +} #[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq)] pub struct MacOsTracker { diff --git a/crates/rattler_menuinst/src/windows.rs b/crates/rattler_menuinst/src/windows.rs index 4d6f7891a..82322b0db 100644 --- a/crates/rattler_menuinst/src/windows.rs +++ b/crates/rattler_menuinst/src/windows.rs @@ -1,10 +1,11 @@ +use create_shortcut::Shortcut; use fs_err as fs; use rattler_conda_types::Platform; use rattler_shell::{ activation::{ActivationVariables, Activator}, shell, }; -use registry::notify_shell_changes; +use registry::{notify_shell_changes, FileExtension, UrlProtocol}; use std::{ io::Write as _, path::{Path, PathBuf}, @@ -14,6 +15,7 @@ use crate::{ render::{BaseMenuItemPlaceholders, MenuItemPlaceholders}, schema::{Environment, MenuItemCommand, Windows}, slugify, + tracker::WindowsTracker, util::log_output, MenuInstError, MenuMode, }; @@ -33,13 +35,13 @@ pub struct Directories { fn shortcut_filename(name: &str, env_name: Option<&String>, ext: Option<&str>) -> String { let env = if let Some(env_name) = env_name { - format!(" ({})", env_name) + format!(" ({env_name})") } else { "".to_string() }; - let ext = ext.unwrap_or_else(|| "lnk"); - format!("{}{}{}", name, env, ext) + let ext = ext.unwrap_or("lnk"); + format!("{name}{env}{ext}") } /// On Windows we can create shortcuts in several places: @@ -186,7 +188,7 @@ impl WindowsMenu { if self.command.terminal.unwrap_or(false) { let mut command = [&cmd_exe, "/D", "/K"] .iter() - .map(|s| s.to_string()) + .map(|s| (*s).to_string()) .collect::>(); // add script path with quotes @@ -220,7 +222,7 @@ impl WindowsMenu { "hidden", ] .iter() - .map(|s| s.to_string()) + .map(ToString::to_string) .collect::>(); command.push(format!( @@ -253,12 +255,15 @@ impl WindowsMenu { return Ok(()); } - let temp_file = tempfile::NamedTempFile::with_suffix(".bat")?; - fs::write(temp_file.path(), precreate_code)?; + let mut temp_file = tempfile::NamedTempFile::with_suffix(".bat")?; + temp_file.write_all(precreate_code.as_bytes())?; + + // Close file and keep temporary path around + let path = temp_file.into_temp_path(); let output = std::process::Command::new("cmd") .arg("/c") - .arg(temp_file.path()) + .arg(&path) .output()?; log_output("precreate", output); @@ -280,8 +285,11 @@ impl WindowsMenu { } } - fn create_shortcut(&self, args: &[String]) -> Result, MenuInstError> { - let mut created_files = Vec::new(); + fn create_shortcut( + &self, + args: &[String], + tracker: &mut WindowsTracker, + ) -> Result<(), MenuInstError> { let icon = self .command .icon @@ -307,36 +315,40 @@ impl WindowsMenu { let link_name = format!("{}.lnk", self.name); if self.item.desktop.unwrap_or(true) { let desktop_link_path = self.directories.desktop.join(&link_name); - create_shortcut::create_shortcut( - &command, - &self.command.description.resolve(&self.placeholders), - &desktop_link_path, - Some(&args), - Some(&workdir), - icon.as_deref(), - Some(0), - Some(&app_id), - )?; - created_files.push(desktop_link_path); + let shortcut = Shortcut { + path: command, + description: &self.command.description.resolve(&self.placeholders), + filename: &desktop_link_path, + arguments: Some(&args), + workdir: Some(&workdir), + iconpath: icon.as_deref(), + iconindex: Some(0), + app_id: Some(&app_id), + }; + + create_shortcut::create_shortcut(shortcut)?; + tracker.files.push(desktop_link_path.clone()); } if let Some(quick_launch_dir) = self.directories.quick_launch.as_ref() { if self.item.quicklaunch.unwrap_or(true) { let quicklaunch_link_path = quick_launch_dir.join(link_name); - create_shortcut::create_shortcut( - &self.name, - &self.command.description.resolve(&self.placeholders), - &quicklaunch_link_path, - Some(&args), - Some(&workdir), - icon.as_deref(), - Some(0), - Some(&app_id), - )?; - created_files.push(quicklaunch_link_path); + let shortcut = Shortcut { + path: &self.name, + description: &self.command.description.resolve(&self.placeholders), + filename: &quicklaunch_link_path, + arguments: Some(&args), + workdir: Some(&workdir), + iconpath: icon.as_deref(), + iconindex: Some(0), + app_id: Some(&app_id), + }; + + create_shortcut::create_shortcut(shortcut)?; + tracker.files.push(quicklaunch_link_path.clone()); } } - Ok(created_files) + Ok(()) } fn icon(&self) -> Option { @@ -346,7 +358,7 @@ impl WindowsMenu { .map(|s| s.resolve(&self.placeholders)) } - fn register_file_extensions(&self) -> Result<(), MenuInstError> { + fn register_file_extensions(&self, tracker: &mut WindowsTracker) -> Result<(), MenuInstError> { let Some(extensions) = &self.item.file_extensions else { return Ok(()); }; @@ -358,22 +370,28 @@ impl WindowsMenu { for extension in extensions { let identifier = format!("{name}.AssocFile{extension}"); - registry::register_file_extension( + + let file_extension = FileExtension { extension, - &identifier, - &command, - icon.as_deref(), - Some(name), - Some(&app_user_model_id), - None, // friendly type name currently not set - self.menu_mode, - )?; + identifier: &identifier, + command: &command, + icon: icon.as_deref(), + app_name: Some(name), + app_user_model_id: Some(&app_user_model_id), + friendly_type_name: None, + }; + + registry::register_file_extension(file_extension, self.menu_mode)?; + + tracker + .file_extensions + .push((extension.clone(), identifier)); } Ok(()) } - fn register_url_protocols(&self) -> Result { + fn register_url_protocols(&self, tracker: &mut WindowsTracker) -> Result { let protocols = match &self.item.url_protocols { Some(protocols) if !protocols.is_empty() => protocols, _ => return Ok(false), @@ -386,33 +404,32 @@ impl WindowsMenu { for protocol in protocols { let identifier = format!("{name}.Protocol{protocol}"); - registry::register_url_protocol( + + let url_protocol = UrlProtocol { protocol, - &command, - Some(&identifier), - icon.as_deref(), - Some(name), - Some(&app_user_model_id), - self.menu_mode, - )?; + command: &command, + identifier: &identifier, + icon: icon.as_deref(), + app_name: Some(name), + app_user_model_id: Some(&app_user_model_id), + }; + + registry::register_url_protocol(url_protocol, self.menu_mode)?; + tracker.url_protocols.push((protocol.clone(), identifier)); } Ok(true) } - pub fn install(&self) -> Result<(), MenuInstError> { + pub fn install(&self, tracker: &mut WindowsTracker) -> Result<(), MenuInstError> { let args = self.build_command(false)?; self.precreate()?; - self.create_shortcut(&args)?; - self.register_file_extensions()?; - self.register_url_protocols()?; + self.create_shortcut(&args, tracker)?; + self.register_file_extensions(tracker)?; + self.register_url_protocols(tracker)?; notify_shell_changes(); Ok(()) } - - pub fn remove(&self) -> Result<(), MenuInstError> { - todo!() - } } pub(crate) fn install_menu_item( @@ -421,7 +438,8 @@ pub(crate) fn install_menu_item( command: MenuItemCommand, placeholders: &BaseMenuItemPlaceholders, menu_mode: MenuMode, -) -> Result<(), MenuInstError> { +) -> Result { + let mut tracker = WindowsTracker::default(); let menu = WindowsMenu::new( prefix, windows_item, @@ -430,23 +448,24 @@ pub(crate) fn install_menu_item( placeholders, menu_mode, ); - menu.install() + menu.install(&mut tracker)?; + Ok(tracker) } -pub(crate) fn remove_menu_item( - prefix: &Path, - specific: Windows, - command: MenuItemCommand, - placeholders: &BaseMenuItemPlaceholders, - menu_mode: MenuMode, -) -> Result<(), MenuInstError> { - let menu = WindowsMenu::new( - prefix, - specific, - command, - Directories::create(menu_mode), - placeholders, - menu_mode, - ); - menu.remove() +pub(crate) fn remove_menu_item(tracker: &WindowsTracker) -> Result<(), MenuInstError> { + for file in &tracker.files { + fs::remove_file(file)?; + } + + let menu_mode = tracker.menu_mode; + for (extension, identifier) in &tracker.file_extensions { + registry::unregister_file_extension(extension, identifier, menu_mode)?; + } + + for (protocol, identifier) in &tracker.url_protocols { + registry::unregister_url_protocol(protocol, identifier, menu_mode)?; + } + + notify_shell_changes(); + Ok(()) } diff --git a/crates/rattler_menuinst/src/windows/create_shortcut.rs b/crates/rattler_menuinst/src/windows/create_shortcut.rs index 6cd699fb6..fd36d6c58 100644 --- a/crates/rattler_menuinst/src/windows/create_shortcut.rs +++ b/crates/rattler_menuinst/src/windows/create_shortcut.rs @@ -1,30 +1,47 @@ use std::path::Path; use windows::{ - core::*, Win32::Storage::EnhancedStorage::PKEY_AppUserModel_ID, - Win32::System::Com::StructuredStorage::*, Win32::System::Com::*, Win32::UI::Shell::*, + core::{Interface, Result, GUID, HSTRING}, + Win32::Storage::EnhancedStorage::PKEY_AppUserModel_ID, + Win32::System::Com::StructuredStorage::{InitPropVariantFromStringAsVector, PropVariantClear}, + Win32::System::Com::{ + CoCreateInstance, CoInitialize, CoUninitialize, IPersistFile, CLSCTX_INPROC_SERVER, + }, + Win32::UI::Shell::{IShellLinkW, PropertiesSystem, ShellLink}, }; use PropertiesSystem::IPropertyStore; +#[derive(Debug, Clone, Copy)] +pub struct Shortcut<'a> { + pub path: &'a str, + pub description: &'a str, + pub filename: &'a Path, + pub arguments: Option<&'a str>, + pub workdir: Option<&'a str>, + pub iconpath: Option<&'a str>, + pub iconindex: Option, + pub app_id: Option<&'a str>, +} + /// Create a Windows `.lnk` shortcut file at the specified path. -pub fn create_shortcut( - path: &str, - description: &str, - filename: &Path, - arguments: Option<&str>, - workdir: Option<&str>, - iconpath: Option<&str>, - iconindex: Option, - app_id: Option<&str>, -) -> Result<()> { +pub fn create_shortcut(shortcut: Shortcut<'_>) -> Result<()> { + let Shortcut { + path, + description, + filename, + arguments, + workdir, + iconpath, + iconindex, + app_id, + } = shortcut; + tracing::info!("Creating shortcut: {:?} at {}", filename, path); unsafe { // Initialize COM let co = CoInitialize(None); - if co.is_err() { - panic!("Failed to initialize COM"); - } + assert!(!co.is_err(), "Failed to initialize COM"); let shell_link: IShellLinkW = CoCreateInstance(&ShellLink as *const GUID, None, CLSCTX_INPROC_SERVER)?; @@ -72,54 +89,60 @@ mod tests { use std::fs; use std::path::Path; + fn create_test_shortcut(filename: &'static str) -> Shortcut<'static> { + Shortcut { + path: r"C:\Windows\notepad.exe", + description: "Test Shortcut", + filename: Path::new(filename), + arguments: None, + workdir: None, + iconpath: None, + iconindex: None, + app_id: None, + } + } + + fn cleanup(filename: &str) { + let path = Path::new(filename); + if path.exists() { + fs::remove_file(path).unwrap(); + } + } + #[test] fn test_basic_shortcut_creation() { - let result = create_shortcut( - "C:\\Windows\\notepad.exe", - "Notepad Shortcut", - "test_basic.lnk", - None, - None, - None, - None, - None, - ); + let shortcut = create_test_shortcut("test_basic.lnk"); + let result = create_shortcut(shortcut); assert!(result.is_ok()); - assert!(Path::new("test_basic.lnk").exists()); - fs::remove_file("test_basic.lnk").unwrap(); + assert!(shortcut.filename.exists()); + cleanup("test_basic.lnk"); } #[test] fn test_shortcut_with_arguments() { - let result = create_shortcut( - "C:\\Windows\\notepad.exe", - "Notepad with Args", - "test_args.lnk", - Some("/A test.txt"), - None, - None, - None, - None, - ); + let mut shortcut = create_test_shortcut("test_args.lnk"); + shortcut.arguments = Some("/A test.txt"); + let result = create_shortcut(shortcut); assert!(result.is_ok()); - assert!(Path::new("test_args.lnk").exists()); - fs::remove_file("test_args.lnk").unwrap(); + assert!(shortcut.filename.exists()); + cleanup("test_args.lnk"); } #[test] fn test_shortcut_with_all_options() { - let result = create_shortcut( - "C:\\Windows\\notepad.exe", - "Full Options Shortcut", - "test_full.lnk", - Some("/A"), - Some("C:\\Temp"), - Some("C:\\Windows\\notepad.exe"), - Some(0), - Some("MyApp.TestShortcut"), - ); + let shortcut = Shortcut { + path: r"C:\Windows\notepad.exe", + description: "Full Options Shortcut", + filename: Path::new("test_full.lnk"), + arguments: Some("/A"), + workdir: Some(r"C:\Temp"), + iconpath: Some(r"C:\Windows\notepad.exe"), + iconindex: Some(0), + app_id: Some("MyApp.TestShortcut"), + }; + let result = create_shortcut(shortcut); assert!(result.is_ok()); assert!(Path::new("test_full.lnk").exists()); @@ -128,35 +151,27 @@ mod tests { #[test] fn test_invalid_path() { - let result = create_shortcut( - "C:\\NonExistent\\fake.exe", - "Invalid Path", - "test_invalid.lnk", - None, - None, - None, - None, - None, - ); + let mut shortcut = create_test_shortcut("test_invalid.lnk"); + shortcut.path = r"C:\NonExistent\fake.exe"; + let result = create_shortcut(shortcut); assert!(result.is_ok()); // Note: Windows API doesn't validate path existence - if Path::new("test_invalid.lnk").exists() { - fs::remove_file("test_invalid.lnk").unwrap(); - } + cleanup("test_invalid.lnk"); } #[test] fn test_invalid_save_location() { - let result = create_shortcut( - "C:\\Windows\\notepad.exe", - "Invalid Save", - "C:\\NonExistent\\Directory\\test.lnk", - None, - None, - None, - None, - None, - ); + let shortcut = Shortcut { + path: r"C:\Windows\notepad.exe", + description: "Invalid Save", + filename: Path::new(r"C:\NonExistent\Directory\test.lnk"), + arguments: None, + workdir: None, + iconpath: None, + iconindex: None, + app_id: None, + }; + let result = create_shortcut(shortcut); assert!(result.is_err()); } diff --git a/crates/rattler_menuinst/src/windows/knownfolders.rs b/crates/rattler_menuinst/src/windows/knownfolders.rs index 5b94ee099..41aabf089 100644 --- a/crates/rattler_menuinst/src/windows/knownfolders.rs +++ b/crates/rattler_menuinst/src/windows/knownfolders.rs @@ -116,13 +116,13 @@ mod tests { for (folder, handle) in test_folders { match folders.get_folder_path(folder, handle) { Ok(path) => { - println!("{} path for {:?}: {:?}", folder, handle, path); + println!("{folder} path for {handle:?}: {path:?}"); match folders.verify_path(&path) { Ok(_) => println!(" Path verified successfully"), - Err(e) => println!(" Path verification failed: {:?}", e), + Err(e) => println!(" Path verification failed: {e:?}"), } } - Err(e) => println!("Error getting {} path for {:?}: {:?}", folder, handle, e), + Err(e) => println!("Error getting {folder} path for {handle:?}: {e:?}"), } } } diff --git a/crates/rattler_menuinst/src/windows/lex.rs b/crates/rattler_menuinst/src/windows/lex.rs index 09115daec..afe8ed10d 100644 --- a/crates/rattler_menuinst/src/windows/lex.rs +++ b/crates/rattler_menuinst/src/windows/lex.rs @@ -14,7 +14,7 @@ pub fn quote_args(args: &[String]) -> Vec { .join(" "); vec![cmd, flag, format!("\"{}\"", quoted_args)] } else { - args.into_iter().map(|s| quote_string(&s)).collect() + args.iter().map(|s| quote_string(s)).collect() } } @@ -23,7 +23,7 @@ pub fn quote_string(s: &str) -> String { if s.starts_with('-') || s.starts_with(' ') { s } else if s.contains(' ') || s.contains('/') { - format!("\"{}\"", s) + format!("\"{s}\"") } else { s } @@ -33,7 +33,7 @@ pub fn ensure_pad(name: &str, pad: char) -> String { if name.is_empty() || (name.starts_with(pad) && name.ends_with(pad)) { name.to_string() } else { - format!("{}{}{}", pad, name, pad) + format!("{pad}{name}{pad}") } } diff --git a/crates/rattler_menuinst/src/windows/registry.rs b/crates/rattler_menuinst/src/windows/registry.rs index caae48dd5..54ea024d3 100644 --- a/crates/rattler_menuinst/src/windows/registry.rs +++ b/crates/rattler_menuinst/src/windows/registry.rs @@ -1,19 +1,34 @@ use windows::Win32::UI::Shell::{SHChangeNotify, SHCNE_ASSOCCHANGED, SHCNF_IDLIST}; -use winreg::enums::*; +use winreg::enums::{HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, KEY_ALL_ACCESS}; use winreg::RegKey; use crate::MenuMode; +#[derive(Debug, Clone, Copy)] +pub struct FileExtension<'a> { + pub extension: &'a str, + pub identifier: &'a str, + pub command: &'a str, + pub icon: Option<&'a str>, + pub app_name: Option<&'a str>, + pub app_user_model_id: Option<&'a str>, + pub friendly_type_name: Option<&'a str>, +} + pub fn register_file_extension( - extension: &str, - identifier: &str, - command: &str, - icon: Option<&str>, - app_name: Option<&str>, - app_user_model_id: Option<&str>, - friendly_type_name: Option<&str>, + file_extension: FileExtension<'_>, mode: MenuMode, ) -> Result<(), std::io::Error> { + let FileExtension { + extension, + identifier, + command, + icon, + app_name, + app_user_model_id, + friendly_type_name, + } = file_extension; + let hkey = if mode == MenuMode::System { HKEY_LOCAL_MACHINE } else { @@ -24,30 +39,30 @@ pub fn register_file_extension( RegKey::predef(hkey).open_subkey_with_flags("Software\\Classes", KEY_ALL_ACCESS)?; // Associate extension with handler - let ext_key = classes.create_subkey(&format!("{}\\OpenWithProgids", extension))?; + let ext_key = classes.create_subkey(format!("{extension}\\OpenWithProgids"))?; ext_key.0.set_value(identifier, &"")?; // Register the handler - let handler_desc = format!("{} {} file", extension, identifier); + let handler_desc = format!("{extension} {identifier} file"); classes .create_subkey(identifier)? .0 .set_value("", &handler_desc)?; // Set the 'open' command - let command_key = classes.create_subkey(&format!("{}\\shell\\open\\command", identifier))?; + let command_key = classes.create_subkey(format!("{identifier}\\shell\\open\\command"))?; command_key.0.set_value("", &command)?; // Set app name related values if provided if let Some(name) = app_name { - let open_key = classes.create_subkey(&format!("{}\\shell\\open", identifier))?; + let open_key = classes.create_subkey(format!("{identifier}\\shell\\open"))?; open_key.0.set_value("", &name)?; classes .create_subkey(identifier)? .0 .set_value("FriendlyAppName", &name)?; classes - .create_subkey(&format!("{}\\shell\\open", identifier))? + .create_subkey(format!("{identifier}\\shell\\open"))? .0 .set_value("FriendlyAppName", &name)?; } @@ -68,7 +83,7 @@ pub fn register_file_extension( .0 .set_value("DefaultIcon", &icon_path)?; classes - .create_subkey(&format!("{}\\shell\\open", identifier))? + .create_subkey(format!("{identifier}\\shell\\open"))? .0 .set_value("Icon", &icon_path)?; } @@ -104,7 +119,7 @@ pub fn unregister_file_extension( // Remove the association in OpenWithProgids let ext_key = - classes.open_subkey_with_flags(&format!("{}\\OpenWithProgids", extension), KEY_ALL_ACCESS); + classes.open_subkey_with_flags(format!("{extension}\\OpenWithProgids"), KEY_ALL_ACCESS); match ext_key { Ok(key) => { @@ -120,7 +135,7 @@ pub fn unregister_file_extension( } Err(e) => { tracing::error!("Could not check key '{}' for deletion: {}", extension, e); - return Err(e.into()); + return Err(e); } } @@ -146,27 +161,41 @@ fn title_case(s: &str) -> String { result } +#[derive(Debug, Clone, Copy)] +pub struct UrlProtocol<'a> { + pub protocol: &'a str, + pub command: &'a str, + pub identifier: &'a str, + pub icon: Option<&'a str>, + pub app_name: Option<&'a str>, + pub app_user_model_id: Option<&'a str>, +} + pub fn register_url_protocol( - protocol: &str, - command: &str, - identifier: Option<&str>, - icon: Option<&str>, - app_name: Option<&str>, - app_user_model_id: Option<&str>, + url_protocol: UrlProtocol<'_>, mode: MenuMode, ) -> Result<(), std::io::Error> { - let base_path = if mode == MenuMode::System { - format!("Software\\Classes\\{}", protocol) - } else { - format!("Software\\Classes\\{}", protocol) - }; + let UrlProtocol { + protocol, + command, + identifier, + icon, + app_name, + app_user_model_id, + } = url_protocol; let hkey = if mode == MenuMode::System { - HKEY_LOCAL_MACHINE + HKEY_CLASSES_ROOT } else { HKEY_CURRENT_USER }; + let base_path = if mode == MenuMode::System { + protocol.to_string() + } else { + format!("Software\\Classes\\{protocol}") + }; + let classes = RegKey::predef(hkey); let protocol_key = classes.create_subkey(&base_path)?; @@ -195,32 +224,32 @@ pub fn register_url_protocol( protocol_key.0.set_value("AppUserModelId", &aumi)?; } - if let Some(id) = identifier { - protocol_key.0.set_value("_menuinst", &id)?; - } + protocol_key.0.set_value("_menuinst", &identifier)?; Ok(()) } pub fn unregister_url_protocol( protocol: &str, - identifier: Option<&str>, + identifier: &str, mode: MenuMode, ) -> Result<(), std::io::Error> { let hkey = if mode == MenuMode::System { - HKEY_LOCAL_MACHINE + HKEY_CLASSES_ROOT } else { HKEY_CURRENT_USER }; - let base_path = format!("Software\\Classes\\{}", protocol); + let base_path = if mode == MenuMode::System { + protocol.to_string() + } else { + format!("Software\\Classes\\{protocol}") + }; if let Ok(key) = RegKey::predef(hkey).open_subkey(&base_path) { - if let Some(id) = identifier { - if let Ok(value) = key.get_value::("_menuinst") { - if value != id { - return Ok(()); - } + if let Ok(value) = key.get_value::("_menuinst") { + if value != identifier { + return Ok(()); } } let _ = RegKey::predef(hkey).delete_subkey_all(&base_path); @@ -244,7 +273,7 @@ mod tests { let _ = unregister_file_extension(extension, identifier, mode); } - fn cleanup_protocol(protocol: &str, identifier: Option<&str>, mode: MenuMode) { + fn cleanup_protocol(protocol: &str, identifier: &str, mode: MenuMode) { let _ = unregister_url_protocol(protocol, identifier, mode); } @@ -256,23 +285,32 @@ mod tests { let mode = MenuMode::User; // Cleanup before test - cleanup_registry(extension, identifier, MenuMode::User); + cleanup_registry(extension, identifier, mode); + let file_extension = FileExtension { + extension, + identifier, + command, + icon: None, + app_name: None, + app_user_model_id: None, + friendly_type_name: None, + }; // Test registration - register_file_extension(extension, identifier, command, None, None, None, None, mode)?; + register_file_extension(file_extension, mode)?; // Verify registration let classes = RegKey::predef(HKEY_CURRENT_USER).open_subkey("Software\\Classes")?; - let ext_key = classes.open_subkey(&format!("{}\\OpenWithProgids", extension))?; + let ext_key = classes.open_subkey(format!("{extension}\\OpenWithProgids"))?; assert!(ext_key.get_value::(identifier).is_ok()); - let cmd_key = classes.open_subkey(&format!("{}\\shell\\open\\command", identifier))?; + let cmd_key = classes.open_subkey(format!("{identifier}\\shell\\open\\command"))?; let cmd_value: String = cmd_key.get_value("")?; assert_eq!(cmd_value, command); // Cleanup - cleanup_registry(extension, identifier, MenuMode::User); + cleanup_registry(extension, identifier, mode); Ok(()) } @@ -287,17 +325,18 @@ mod tests { let app_user_model_id = Some("TestApp"); let friendly_type_name = Some("Test App File"); - // Test registration with icon - register_file_extension( + let file_extension = FileExtension { extension, identifier, command, - Some(icon), + icon: Some(icon), app_name, app_user_model_id, friendly_type_name, - mode, - )?; + }; + + // Test registration with icon + register_file_extension(file_extension, mode)?; // Verify icon let classes = RegKey::predef(HKEY_CURRENT_USER).open_subkey("Software\\Classes")?; @@ -317,8 +356,18 @@ mod tests { let command = "\"C:\\Test\\App.exe\" \"%1\""; let mode = MenuMode::User; + let file_extension = FileExtension { + extension, + identifier, + command, + icon: None, + app_name: None, + app_user_model_id: None, + friendly_type_name: None, + }; + // Setup - register_file_extension(extension, identifier, command, None, None, None, None, mode)?; + register_file_extension(file_extension, mode)?; // Test unregistration unregister_file_extension(extension, identifier, mode)?; @@ -335,7 +384,7 @@ mod tests { fn test_register_url_protocol() -> std::io::Result<()> { let protocol = "rattlertest"; let command = "\"C:\\Test\\App.exe\" \"%1\""; - let identifier = Some("TestApp"); + let identifier = "TestApp"; let app_name = Some("Test App"); let icon = Some("C:\\Test\\icon.ico"); let app_user_model_id = Some("TestApp"); @@ -344,27 +393,28 @@ mod tests { // Cleanup before test cleanup_protocol(protocol, identifier, mode); - // Test registration - register_url_protocol( + let url_protocol = UrlProtocol { protocol, command, identifier, icon, app_name, app_user_model_id, - mode, - )?; + }; + + // Test registration + register_url_protocol(url_protocol, mode)?; // Verify registration let key = RegKey::predef(HKEY_CURRENT_USER) - .open_subkey(&format!("Software\\Classes\\{}", protocol))?; + .open_subkey(format!("Software\\Classes\\{protocol}"))?; let cmd_key = key.open_subkey(r"shell\open\command")?; let cmd_value: String = cmd_key.get_value("")?; assert_eq!(cmd_value, command); let id_value: String = key.get_value("_menuinst")?; - assert_eq!(id_value, identifier.unwrap()); + assert_eq!(id_value, identifier); // Cleanup cleanup_protocol(protocol, identifier, mode); @@ -375,22 +425,23 @@ mod tests { fn test_unregister_url_protocol() -> std::io::Result<()> { let protocol = "rattlertest-2"; let command = "\"C:\\Test\\App.exe\" \"%1\""; - let identifier = Some("xTestApp"); + let identifier = "xTestApp"; let app_name = Some("Test App"); let icon = Some("C:\\Test\\icon.ico"); let app_user_model_id = Some("TestApp"); let mode = MenuMode::User; - // Setup - register_url_protocol( + let url_protocol = UrlProtocol { protocol, command, identifier, icon, app_name, app_user_model_id, - mode, - )?; + }; + + // Setup + register_url_protocol(url_protocol, mode)?; // Test unregistration unregister_url_protocol(protocol, identifier, mode)?; From 3aabb34c3bef4b3dc22fabf9af2b23231bdf9852 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Wed, 19 Feb 2025 18:18:09 +0100 Subject: [PATCH 089/132] implement tracker on Windows and fix a number of clippy things --- crates/rattler_menuinst/src/tracker.rs | 13 ++++++++++++- crates/rattler_menuinst/src/windows.rs | 3 ++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/crates/rattler_menuinst/src/tracker.rs b/crates/rattler_menuinst/src/tracker.rs index 999cba443..17a7d269b 100644 --- a/crates/rattler_menuinst/src/tracker.rs +++ b/crates/rattler_menuinst/src/tracker.rs @@ -26,7 +26,7 @@ pub struct LinuxTracker { pub registered_mime_files: Vec, } -#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq)] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] pub struct WindowsTracker { pub menu_mode: MenuMode, pub files: Vec, @@ -34,6 +34,17 @@ pub struct WindowsTracker { pub url_protocols: Vec<(String, String)>, } +impl WindowsTracker { + pub fn new(menu_mode: MenuMode) -> Self { + Self { + menu_mode, + files: Vec::new(), + file_extensions: Vec::new(), + url_protocols: Vec::new(), + } + } +} + #[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq)] pub struct MacOsTracker { pub app_folder: PathBuf, diff --git a/crates/rattler_menuinst/src/windows.rs b/crates/rattler_menuinst/src/windows.rs index 82322b0db..11ae672c9 100644 --- a/crates/rattler_menuinst/src/windows.rs +++ b/crates/rattler_menuinst/src/windows.rs @@ -439,7 +439,8 @@ pub(crate) fn install_menu_item( placeholders: &BaseMenuItemPlaceholders, menu_mode: MenuMode, ) -> Result { - let mut tracker = WindowsTracker::default(); + let mut tracker = WindowsTracker::new(menu_mode); + tracker.menu_mode = menu_mode; let menu = WindowsMenu::new( prefix, windows_item, From 43187247ebf013ba57a0cdde1292aa73eed64645 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Wed, 19 Feb 2025 18:19:46 +0100 Subject: [PATCH 090/132] cleanup --- crates/rattler_menuinst/src/lib.rs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index a895cc34f..8248815e9 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -76,11 +76,7 @@ pub fn install_menuitems( let menu_inst: MenuInstSchema = serde_json::from_str(&text)?; let placeholders = BaseMenuItemPlaceholders::new(base_prefix, prefix, platform); - // if platform.is_linux() { - // #[cfg(target_os = "linux")] - // linux::install_menu(&menu_inst.menu_name, prefix, menu_mode)?; - // } - let trackers = Vec::new(); + let mut trackers = Vec::new(); for item in menu_inst.menu_items { if platform.is_linux() { #[cfg(target_os = "linux")] @@ -113,13 +109,14 @@ pub fn install_menuitems( #[cfg(target_os = "windows")] if let Some(windows_item) = item.platforms.win { let command = item.command.merge(windows_item.base); - windows::install_menu_item( + let tracker = windows::install_menu_item( prefix, windows_item.specific, command, &placeholders, menu_mode, )?; + trackers.push(MenuinstTracker::Windows(tracker)); } } } From 1bc887f2310730ab63f4c0c6ad8c51dabd821738 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Wed, 19 Feb 2025 19:17:52 +0100 Subject: [PATCH 091/132] fix clippy --- crates/rattler_menuinst/src/linux.rs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index 42ba3e910..885810941 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -610,12 +610,8 @@ pub fn remove_menu_item(tracker: &LinuxTracker) -> Result<(), MenuInstError> { } for path in &tracker.registered_mime_files { - let _ = xdg_mime( - &path, - tracker.install_mode.clone(), - XdgMimeOperation::Uninstall, - ) - .map_err(|e| tracing::warn!("Could not uninstall mime type: {}", e)); + let _ = xdg_mime(path, tracker.install_mode, XdgMimeOperation::Uninstall) + .map_err(|e| tracing::warn!("Could not uninstall mime type: {}", e)); } // invoke xdg-mime uninstall ... From 1f5713c4e0c46cb6b855d0ea91a5b4461743bf65 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Thu, 20 Feb 2025 08:56:09 +0100 Subject: [PATCH 092/132] fix win build --- crates/rattler_menuinst/src/windows.rs | 11 +-- .../src/windows/knownfolders.rs | 78 +++++++++---------- 2 files changed, 45 insertions(+), 44 deletions(-) diff --git a/crates/rattler_menuinst/src/windows.rs b/crates/rattler_menuinst/src/windows.rs index 11ae672c9..96251d9eb 100644 --- a/crates/rattler_menuinst/src/windows.rs +++ b/crates/rattler_menuinst/src/windows.rs @@ -25,7 +25,7 @@ mod knownfolders; mod lex; mod registry; -use knownfolders::UserHandle; +use knownfolders::{Folder, UserHandle}; pub struct Directories { start_menu: PathBuf, @@ -56,16 +56,18 @@ impl Directories { }; let known_folders = knownfolders::Folders::new(); - let start_menu = known_folders.get_folder_path("start", user_handle).unwrap(); + let start_menu = known_folders + .get_folder_path(Folder::Start, user_handle) + .unwrap(); let quick_launch = if menu_mode == MenuMode::User { known_folders - .get_folder_path("quick_launch", user_handle) + .get_folder_path(Folder::QuickLaunch, user_handle) .ok() } else { None }; let desktop = known_folders - .get_folder_path("desktop", user_handle) + .get_folder_path(Folder::Desktop, user_handle) .unwrap(); Directories { @@ -440,7 +442,6 @@ pub(crate) fn install_menu_item( menu_mode: MenuMode, ) -> Result { let mut tracker = WindowsTracker::new(menu_mode); - tracker.menu_mode = menu_mode; let menu = WindowsMenu::new( prefix, windows_item, diff --git a/crates/rattler_menuinst/src/windows/knownfolders.rs b/crates/rattler_menuinst/src/windows/knownfolders.rs index 41aabf089..6945aa55e 100644 --- a/crates/rattler_menuinst/src/windows/knownfolders.rs +++ b/crates/rattler_menuinst/src/windows/knownfolders.rs @@ -1,16 +1,17 @@ use known_folders::{get_known_folder_path, KnownFolder}; use std::collections::HashMap; -use std::path::{Path, PathBuf}; +use std::path::PathBuf; +use thiserror::Error; -#[derive(Debug)] +#[derive(Debug, Error)] pub enum FolderError { + #[error("Path not found")] PathNotFound, - PathNotVerifiable, } pub struct Folders { - system_folders: HashMap, - user_folders: HashMap, + system_folders: HashMap, + user_folders: HashMap, } #[derive(Clone, Copy, PartialEq, Eq, Debug)] @@ -19,20 +20,31 @@ pub enum UserHandle { Common, } +#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)] +pub enum Folder { + Desktop, + Start, + Documents, + Profile, + QuickLaunch, + LocalAppData, +} + impl Folders { pub fn new() -> Self { let mut system_folders = HashMap::new(); - system_folders.insert("desktop".to_string(), KnownFolder::PublicDesktop); - system_folders.insert("start".to_string(), KnownFolder::CommonPrograms); - system_folders.insert("documents".to_string(), KnownFolder::PublicDocuments); - system_folders.insert("profile".to_string(), KnownFolder::ProgramData); + system_folders.insert(Folder::Desktop, KnownFolder::PublicDesktop); + system_folders.insert(Folder::Start, KnownFolder::CommonPrograms); + system_folders.insert(Folder::Documents, KnownFolder::PublicDocuments); + system_folders.insert(Folder::Profile, KnownFolder::ProgramData); let mut user_folders = HashMap::new(); - user_folders.insert("desktop".to_string(), KnownFolder::Desktop); - user_folders.insert("start".to_string(), KnownFolder::Programs); - user_folders.insert("documents".to_string(), KnownFolder::Documents); - user_folders.insert("profile".to_string(), KnownFolder::Profile); - user_folders.insert("quick_launch".to_string(), KnownFolder::QuickLaunch); + user_folders.insert(Folder::Desktop, KnownFolder::Desktop); + user_folders.insert(Folder::Start, KnownFolder::Programs); + user_folders.insert(Folder::Documents, KnownFolder::Documents); + user_folders.insert(Folder::Profile, KnownFolder::Profile); + user_folders.insert(Folder::QuickLaunch, KnownFolder::QuickLaunch); + user_folders.insert(Folder::LocalAppData, KnownFolder::LocalAppData); Folders { system_folders, @@ -42,7 +54,7 @@ impl Folders { pub fn get_folder_path( &self, - key: &str, + key: Folder, user_handle: UserHandle, ) -> Result { self.folder_path(user_handle, true, key) @@ -52,22 +64,22 @@ impl Folders { &self, preferred_mode: UserHandle, check_other_mode: bool, - key: &str, + key: Folder, ) -> Result { let (preferred_folders, other_folders) = match preferred_mode { UserHandle::Current => (&self.user_folders, &self.system_folders), UserHandle::Common => (&self.system_folders, &self.user_folders), }; - if let Some(folder) = preferred_folders.get(key) { + if let Some(folder) = preferred_folders.get(&key) { if let Some(path) = get_known_folder_path(*folder) { return Ok(path); } } // Implement fallback for user documents - if preferred_mode == UserHandle::Current && key == "documents" { - if let Some(profile_folder) = preferred_folders.get("profile") { + if preferred_mode == UserHandle::Current && key == Folder::Documents { + if let Some(profile_folder) = preferred_folders.get(&Folder::Profile) { if let Some(profile_path) = get_known_folder_path(*profile_folder) { let documents_path = profile_path.join("Documents"); if documents_path.is_dir() { @@ -78,7 +90,7 @@ impl Folders { } if check_other_mode { - if let Some(folder) = other_folders.get(key) { + if let Some(folder) = other_folders.get(&key) { if let Some(path) = get_known_folder_path(*folder) { return Ok(path); } @@ -87,15 +99,6 @@ impl Folders { Err(FolderError::PathNotFound) } - - pub fn verify_path>(&self, path: P) -> Result { - let path = path.as_ref(); - if path.exists() && path.is_dir() { - Ok(path.to_path_buf()) - } else { - Err(FolderError::PathNotVerifiable) - } - } } #[cfg(test)] @@ -107,22 +110,19 @@ mod tests { let folders = Folders::new(); let test_folders = vec![ - ("desktop", UserHandle::Current), - ("documents", UserHandle::Current), - ("start", UserHandle::Common), - ("profile", UserHandle::Common), + (Folder::Desktop, UserHandle::Current), + (Folder::Documents, UserHandle::Current), + (Folder::Start, UserHandle::Common), + (Folder::Profile, UserHandle::Common), ]; for (folder, handle) in test_folders { match folders.get_folder_path(folder, handle) { Ok(path) => { - println!("{folder} path for {handle:?}: {path:?}"); - match folders.verify_path(&path) { - Ok(_) => println!(" Path verified successfully"), - Err(e) => println!(" Path verification failed: {e:?}"), - } + println!("{folder:?} path for {handle:?}: {path:?}"); + assert!(path.exists()) } - Err(e) => println!("Error getting {folder} path for {handle:?}: {e:?}"), + Err(e) => println!("Error getting {folder:?} path for {handle:?}: {e:?}"), } } } From 3d94672046c0c479761878d0551a0e09dd15e27f Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Thu, 20 Feb 2025 13:31:10 +0100 Subject: [PATCH 093/132] use latest windows bindings and windows-registry crate --- crates/rattler_menuinst/Cargo.toml | 11 +- crates/rattler_menuinst/src/schema.rs | 6 +- ...nst__schema__test__deserialize_spyder.snap | 24 ++- crates/rattler_menuinst/src/tracker.rs | 2 + crates/rattler_menuinst/src/windows.rs | 49 ++++- .../rattler_menuinst/src/windows/registry.rs | 168 ++++++++---------- 6 files changed, 147 insertions(+), 113 deletions(-) diff --git a/crates/rattler_menuinst/Cargo.toml b/crates/rattler_menuinst/Cargo.toml index 68d4728d3..60f5d0f45 100644 --- a/crates/rattler_menuinst/Cargo.toml +++ b/crates/rattler_menuinst/Cargo.toml @@ -31,16 +31,13 @@ chrono = { workspace = true, features = ["clock"] } configparser = { version = "3.1.0", features = ["indexmap"] } [target.'cfg(target_os = "windows")'.dependencies] -windows = { version = "0.58", features = [ - "Win32_System_Com", - "Win32_UI_Shell", +windows = { version = "0.59.0", features = [ "Win32_System_Com_StructuredStorage", "Win32_UI_Shell_PropertiesSystem", "Win32_Storage_EnhancedStorage", - "Win32_Foundation", - "implement" + "Win32_System_Variant", ]} -winreg = "0.52.0" +windows-registry = "0.4.0" [dev-dependencies] -insta = { workspace = true } +insta = { workspace = true, features = ["json"] } diff --git a/crates/rattler_menuinst/src/schema.rs b/crates/rattler_menuinst/src/schema.rs index 8f98a1188..dfb428af9 100644 --- a/crates/rattler_menuinst/src/schema.rs +++ b/crates/rattler_menuinst/src/schema.rs @@ -128,17 +128,17 @@ pub struct Windows { pub quicklaunch: Option, /// Windows Terminal profile configuration. - pub terminal_profile: Option, + pub terminal_profile: Option, /// URL protocols that will be associated with this program. /// /// Each protocol must contain no whitespace characters. - pub url_protocols: Option>, + pub url_protocols: Option>, /// File extensions that will be associated with this program. /// /// Each extension must start with a dot and contain no whitespace. - pub file_extensions: Option>, + pub file_extensions: Option>, /// Application User Model ID for Windows 7 and above. /// diff --git a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_spyder.snap b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_spyder.snap index 36e3b70b0..b68a73a7d 100644 --- a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_spyder.snap +++ b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_spyder.snap @@ -524,12 +524,24 @@ MenuInstSchema { url_protocols: None, file_extensions: Some( [ - ".enaml", - ".ipy", - ".py", - ".pyi", - ".pyw", - ".pyx", + PlaceholderString( + ".enaml", + ), + PlaceholderString( + ".ipy", + ), + PlaceholderString( + ".py", + ), + PlaceholderString( + ".pyi", + ), + PlaceholderString( + ".pyw", + ), + PlaceholderString( + ".pyx", + ), ], ), app_user_model_id: Some( diff --git a/crates/rattler_menuinst/src/tracker.rs b/crates/rattler_menuinst/src/tracker.rs index 17a7d269b..3aff5e5ae 100644 --- a/crates/rattler_menuinst/src/tracker.rs +++ b/crates/rattler_menuinst/src/tracker.rs @@ -32,6 +32,7 @@ pub struct WindowsTracker { pub files: Vec, pub file_extensions: Vec<(String, String)>, pub url_protocols: Vec<(String, String)>, + pub terminal_profiles: Vec<(String, PathBuf)>, } impl WindowsTracker { @@ -41,6 +42,7 @@ impl WindowsTracker { files: Vec::new(), file_extensions: Vec::new(), url_protocols: Vec::new(), + terminal_profiles: Vec::new(), } } } diff --git a/crates/rattler_menuinst/src/windows.rs b/crates/rattler_menuinst/src/windows.rs index 96251d9eb..a9549d16e 100644 --- a/crates/rattler_menuinst/src/windows.rs +++ b/crates/rattler_menuinst/src/windows.rs @@ -10,6 +10,7 @@ use std::{ io::Write as _, path::{Path, PathBuf}, }; +use terminal::TerminalProfile; use crate::{ render::{BaseMenuItemPlaceholders, MenuItemPlaceholders}, @@ -24,6 +25,7 @@ mod create_shortcut; mod knownfolders; mod lex; mod registry; +mod terminal; use knownfolders::{Folder, UserHandle}; @@ -31,6 +33,7 @@ pub struct Directories { start_menu: PathBuf, quick_launch: Option, desktop: PathBuf, + pub known_folders: knownfolders::Folders, } fn shortcut_filename(name: &str, env_name: Option<&String>, ext: Option<&str>) -> String { @@ -74,6 +77,7 @@ impl Directories { start_menu, quick_launch, desktop, + known_folders, } } } @@ -371,10 +375,10 @@ impl WindowsMenu { let app_user_model_id = self.app_id(); for extension in extensions { + let extension = extension.resolve(&self.placeholders); let identifier = format!("{name}.AssocFile{extension}"); - let file_extension = FileExtension { - extension, + extension: &extension, identifier: &identifier, command: &command, icon: icon.as_deref(), @@ -405,10 +409,11 @@ impl WindowsMenu { let app_user_model_id = format!("{name}.Protocol"); for protocol in protocols { + let protocol = protocol.resolve(&self.placeholders); let identifier = format!("{name}.Protocol{protocol}"); let url_protocol = UrlProtocol { - protocol, + protocol: &protocol, command: &command, identifier: &identifier, icon: icon.as_deref(), @@ -423,12 +428,45 @@ impl WindowsMenu { Ok(true) } + fn register_windows_terminal(&self, tracker: &mut WindowsTracker) -> Result<(), MenuInstError> { + let Some(terminal_profile) = self.item.terminal_profile.as_ref() else { + return Ok(()); + }; + + let terminal_profile = terminal_profile.resolve(&self.placeholders); + + let profile = TerminalProfile { + name: terminal_profile, + icon: self.icon(), + commandline: self.build_command(true)?.join(" "), + starting_directory: self + .command + .working_dir + .as_ref() + .map(|s| s.resolve(&self.placeholders)), + }; + + for location in terminal::windows_terminal_settings_files( + self.menu_mode, + &self.directories.known_folders, + ) { + // TODO get rid of unwrap :) + terminal::add_windows_terminal_profile(&location, &profile).unwrap(); + tracker + .terminal_profiles + .push((profile.name.clone(), location)); + } + + Ok(()) + } + pub fn install(&self, tracker: &mut WindowsTracker) -> Result<(), MenuInstError> { let args = self.build_command(false)?; self.precreate()?; self.create_shortcut(&args, tracker)?; self.register_file_extensions(tracker)?; self.register_url_protocols(tracker)?; + self.register_windows_terminal(tracker)?; notify_shell_changes(); Ok(()) } @@ -468,6 +506,11 @@ pub(crate) fn remove_menu_item(tracker: &WindowsTracker) -> Result<(), MenuInstE registry::unregister_url_protocol(protocol, identifier, menu_mode)?; } + for (profile, location) in &tracker.terminal_profiles { + // TODO get rid of unwrap + terminal::remove_terminal_profile(location, profile).unwrap(); + } + notify_shell_changes(); Ok(()) } diff --git a/crates/rattler_menuinst/src/windows/registry.rs b/crates/rattler_menuinst/src/windows/registry.rs index 54ea024d3..1f2b92d44 100644 --- a/crates/rattler_menuinst/src/windows/registry.rs +++ b/crates/rattler_menuinst/src/windows/registry.rs @@ -1,8 +1,5 @@ -use windows::Win32::UI::Shell::{SHChangeNotify, SHCNE_ASSOCCHANGED, SHCNF_IDLIST}; -use winreg::enums::{HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, KEY_ALL_ACCESS}; -use winreg::RegKey; - use crate::MenuMode; +use windows::Win32::UI::Shell::{SHChangeNotify, SHCNE_ASSOCCHANGED, SHCNF_IDLIST}; #[derive(Debug, Clone, Copy)] pub struct FileExtension<'a> { @@ -28,73 +25,61 @@ pub fn register_file_extension( app_user_model_id, friendly_type_name, } = file_extension; - let hkey = if mode == MenuMode::System { - HKEY_LOCAL_MACHINE + windows_registry::LOCAL_MACHINE } else { - HKEY_CURRENT_USER + windows_registry::CURRENT_USER }; - let classes = - RegKey::predef(hkey).open_subkey_with_flags("Software\\Classes", KEY_ALL_ACCESS)?; + let classes = hkey.create(r"Software\Classes")?; // Associate extension with handler - let ext_key = classes.create_subkey(format!("{extension}\\OpenWithProgids"))?; - ext_key.0.set_value(identifier, &"")?; + let ext_key = classes.create(format!(r"{extension}\OpenWithProgids"))?; + ext_key.set_string(identifier, "")?; // Register the handler let handler_desc = format!("{extension} {identifier} file"); - classes - .create_subkey(identifier)? - .0 - .set_value("", &handler_desc)?; + classes.create(identifier)?.set_string("", &handler_desc)?; // Set the 'open' command - let command_key = classes.create_subkey(format!("{identifier}\\shell\\open\\command"))?; - command_key.0.set_value("", &command)?; + classes + .create(format!(r"{identifier}\shell\open\command"))? + .set_string("", command)?; // Set app name related values if provided if let Some(name) = app_name { - let open_key = classes.create_subkey(format!("{identifier}\\shell\\open"))?; - open_key.0.set_value("", &name)?; + let open_key = classes.create(format!(r"{identifier}\shell\open"))?; + open_key.set_string("", name)?; + open_key.set_string("FriendlyAppName", name)?; classes - .create_subkey(identifier)? - .0 - .set_value("FriendlyAppName", &name)?; - classes - .create_subkey(format!("{identifier}\\shell\\open"))? - .0 - .set_value("FriendlyAppName", &name)?; + .create(identifier)? + .set_string("FriendlyAppName", name)?; } // Set app user model ID if provided if let Some(id) = app_user_model_id { classes - .create_subkey(identifier)? - .0 - .set_value("AppUserModelID", &id)?; + .create(identifier)? + .set_string("AppUserModelID", id)?; } // Set icon if provided if let Some(icon_path) = icon { // Set default icon and shell open icon classes - .create_subkey(identifier)? - .0 - .set_value("DefaultIcon", &icon_path)?; + .create(identifier)? + .set_string("DefaultIcon", icon_path)?; classes - .create_subkey(format!("{identifier}\\shell\\open"))? - .0 - .set_value("Icon", &icon_path)?; + .create(format!(r"{identifier}\shell\open"))? + .set_string("Icon", icon_path)?; } // Set friendly type name if provided // NOTE: Windows <10 requires the string in a PE file, but we just set the raw string if let Some(friendly_name) = friendly_type_name { classes - .create_subkey(identifier)? - .0 - .set_value("FriendlyTypeName", &friendly_name)?; + .create(identifier)? + .set_string("FriendlyTypeName", friendly_name)?; } Ok(()) @@ -106,36 +91,34 @@ pub fn unregister_file_extension( mode: MenuMode, ) -> Result<(), std::io::Error> { let hkey = if mode == MenuMode::System { - HKEY_LOCAL_MACHINE + windows_registry::LOCAL_MACHINE } else { - HKEY_CURRENT_USER + windows_registry::CURRENT_USER }; - let classes = - RegKey::predef(hkey).open_subkey_with_flags("Software\\Classes", KEY_ALL_ACCESS)?; + let classes = hkey.create(r"Software\Classes")?; // Delete the identifier key - classes.delete_subkey_all(identifier)?; + classes.remove_tree(identifier)?; // Remove the association in OpenWithProgids - let ext_key = - classes.open_subkey_with_flags(format!("{extension}\\OpenWithProgids"), KEY_ALL_ACCESS); + let ext_key = classes.create(format!(r"{extension}\OpenWithProgids")); match ext_key { Ok(key) => { - if key.get_value::(identifier).is_err() { + if key.get_string(identifier).is_err() { tracing::debug!( "Handler '{}' is not associated with extension '{}'", identifier, extension ); } else { - key.delete_value(identifier)?; + key.remove_value(identifier)?; } } Err(e) => { tracing::error!("Could not check key '{}' for deletion: {}", extension, e); - return Err(e); + return Err(e.into()); } } @@ -185,46 +168,45 @@ pub fn register_url_protocol( } = url_protocol; let hkey = if mode == MenuMode::System { - HKEY_CLASSES_ROOT + windows_registry::CLASSES_ROOT } else { - HKEY_CURRENT_USER + windows_registry::CURRENT_USER }; let base_path = if mode == MenuMode::System { protocol.to_string() } else { - format!("Software\\Classes\\{protocol}") + format!(r"Software\Classes\{protocol}") }; - let classes = RegKey::predef(hkey); - let protocol_key = classes.create_subkey(&base_path)?; + let protocol_key = hkey.create(base_path)?; - protocol_key - .0 - .set_value("", &format!("URL:{}", title_case(protocol)))?; - protocol_key.0.set_value("URL Protocol", &"")?; + protocol_key.set_string("", &format!("URL:{}", title_case(protocol)))?; + protocol_key.set_string("URL Protocol", "")?; - let command_key = protocol_key.0.create_subkey("shell\\open\\command")?; - command_key.0.set_value("", &command)?; + protocol_key + .create(r"shell\open\command")? + .set_string("", command)?; if let Some(name) = app_name { - let open_key = protocol_key.0.create_subkey("shell\\open")?; - open_key.0.set_value("", &name)?; - protocol_key.0.set_value("FriendlyAppName", &name)?; - open_key.0.set_value("FriendlyAppName", &name)?; + // let open_key = command_key.create(r"shell\open")?; + let open_key = protocol_key.create(r"shell\open")?; + open_key.set_string("", name)?; + open_key.set_string("FriendlyAppName", name)?; + protocol_key.set_string("FriendlyAppName", name)?; } if let Some(icon_path) = icon { - protocol_key.0.set_value("DefaultIcon", &icon_path)?; - let open_key = protocol_key.0.create_subkey("shell\\open")?; - open_key.0.set_value("Icon", &icon_path)?; + protocol_key.set_string("DefaultIcon", icon_path)?; + let open_key = protocol_key.create(r"shell\open")?; + open_key.set_string("Icon", icon_path)?; } if let Some(aumi) = app_user_model_id { - protocol_key.0.set_value("AppUserModelId", &aumi)?; + protocol_key.set_string("AppUserModelId", aumi)?; } - protocol_key.0.set_value("_menuinst", &identifier)?; + protocol_key.set_string("_menuinst", identifier)?; Ok(()) } @@ -235,24 +217,25 @@ pub fn unregister_url_protocol( mode: MenuMode, ) -> Result<(), std::io::Error> { let hkey = if mode == MenuMode::System { - HKEY_CLASSES_ROOT + windows_registry::CLASSES_ROOT } else { - HKEY_CURRENT_USER + windows_registry::CURRENT_USER }; let base_path = if mode == MenuMode::System { protocol.to_string() } else { - format!("Software\\Classes\\{protocol}") + format!(r"Software\Classes\{protocol}") }; - if let Ok(key) = RegKey::predef(hkey).open_subkey(&base_path) { - if let Ok(value) = key.get_value::("_menuinst") { - if value != identifier { + if let Ok(key) = hkey.create(&base_path) { + if let Ok(value) = key.get_string("_menuinst") { + if value == identifier { + hkey.remove_tree(&base_path)?; + } else { return Ok(()); } } - let _ = RegKey::predef(hkey).delete_subkey_all(&base_path); } Ok(()) @@ -267,8 +250,6 @@ pub fn notify_shell_changes() { #[cfg(test)] mod tests { use super::*; - use winreg::RegKey; - fn cleanup_registry(extension: &str, identifier: &str, mode: MenuMode) { let _ = unregister_file_extension(extension, identifier, mode); } @@ -300,13 +281,13 @@ mod tests { register_file_extension(file_extension, mode)?; // Verify registration - let classes = RegKey::predef(HKEY_CURRENT_USER).open_subkey("Software\\Classes")?; + let classes = windows_registry::CURRENT_USER.open(r"Software\Classes")?; - let ext_key = classes.open_subkey(format!("{extension}\\OpenWithProgids"))?; - assert!(ext_key.get_value::(identifier).is_ok()); + let ext_key = classes.open(format!("{extension}\\OpenWithProgids"))?; + assert!(ext_key.get_string(identifier).is_ok()); - let cmd_key = classes.open_subkey(format!("{identifier}\\shell\\open\\command"))?; - let cmd_value: String = cmd_key.get_value("")?; + let cmd_key = classes.open(format!("{identifier}\\shell\\open\\command"))?; + let cmd_value: String = cmd_key.get_string("")?; assert_eq!(cmd_value, command); // Cleanup @@ -339,9 +320,9 @@ mod tests { register_file_extension(file_extension, mode)?; // Verify icon - let classes = RegKey::predef(HKEY_CURRENT_USER).open_subkey("Software\\Classes")?; - let icon_key = classes.open_subkey(identifier)?; - let icon_value: String = icon_key.get_value("DefaultIcon")?; + let classes = windows_registry::CURRENT_USER.open(r"Software\Classes")?; + let icon_key = classes.open(identifier)?; + let icon_value = icon_key.get_string("DefaultIcon")?; assert_eq!(icon_value, icon); // Cleanup @@ -373,9 +354,9 @@ mod tests { unregister_file_extension(extension, identifier, mode)?; // Verify removal - let classes = RegKey::predef(HKEY_CURRENT_USER).open_subkey("Software\\Classes")?; + let classes = windows_registry::CURRENT_USER.open(r"Software\Classes")?; - assert!(classes.open_subkey(identifier).is_err()); + assert!(classes.open(identifier).is_err()); Ok(()) } @@ -406,14 +387,13 @@ mod tests { register_url_protocol(url_protocol, mode)?; // Verify registration - let key = RegKey::predef(HKEY_CURRENT_USER) - .open_subkey(format!("Software\\Classes\\{protocol}"))?; + let key = windows_registry::CURRENT_USER.open(format!(r"Software\Classes\{protocol}"))?; - let cmd_key = key.open_subkey(r"shell\open\command")?; - let cmd_value: String = cmd_key.get_value("")?; + let cmd_key = key.open(r"shell\open\command")?; + let cmd_value = cmd_key.get_string("")?; assert_eq!(cmd_value, command); - let id_value: String = key.get_value("_menuinst")?; + let id_value: String = key.get_string("_menuinst")?; assert_eq!(id_value, identifier); // Cleanup @@ -447,8 +427,8 @@ mod tests { unregister_url_protocol(protocol, identifier, mode)?; // Verify removal - let key = RegKey::predef(HKEY_CURRENT_USER).open_subkey("Software\\Classes")?; - assert!(key.open_subkey(protocol).is_err()); + let key = windows_registry::CURRENT_USER.open(r"Software\Classes")?; + assert!(key.open(protocol).is_err()); Ok(()) } From 38906b8c5a5e93715449a99e57b093e3996ea9c3 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Thu, 20 Feb 2025 13:31:41 +0100 Subject: [PATCH 094/132] add terminal profile stuff --- .../rattler_menuinst/src/windows/terminal.rs | 372 ++++++++++++++++++ 1 file changed, 372 insertions(+) create mode 100644 crates/rattler_menuinst/src/windows/terminal.rs diff --git a/crates/rattler_menuinst/src/windows/terminal.rs b/crates/rattler_menuinst/src/windows/terminal.rs new file mode 100644 index 000000000..ecdb14630 --- /dev/null +++ b/crates/rattler_menuinst/src/windows/terminal.rs @@ -0,0 +1,372 @@ +use serde::{Deserialize, Serialize}; +use serde_json::Value; +use std::collections::BTreeMap; +use std::fs; +use std::path::{Path, PathBuf}; +use thiserror::Error; + +use crate::MenuMode; + +use super::knownfolders::{Folder, Folders, UserHandle}; + +#[derive(Clone, Debug, Serialize, Deserialize, Default)] +pub struct TerminalProfile { + pub commandline: String, + pub name: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub icon: Option, + #[serde(skip_serializing_if = "Option::is_none")] + #[serde(rename = "startingDirectory")] + pub starting_directory: Option, +} + +#[derive(Default, Debug, Serialize, Deserialize)] +struct Profiles { + list: Vec, + #[serde(flatten)] + other: BTreeMap, +} + +#[derive(Default, Debug, Serialize, Deserialize)] +struct Settings { + #[serde(default)] + profiles: Option, + #[serde(flatten)] + other: BTreeMap, +} + +#[derive(Debug, Error)] +pub enum TerminalUpdateError { + #[error("Failed to read or write settings file")] + Io(#[from] std::io::Error), + #[error("Failed to parse settings file")] + Serde(#[from] serde_json::Error), +} + +pub fn add_windows_terminal_profile( + location: &Path, + profile: &TerminalProfile, +) -> Result<(), TerminalUpdateError> { + // Early return if no parent directory exists + if !location.parent().is_some_and(Path::exists) { + tracing::warn!("Parent directory does not exist for {:?}", location); + return Ok(()); + } + + // Read existing settings or create new + let mut settings: Settings = if location.exists() { + let content = fs::read_to_string(location)?; + serde_json::from_str(&content)? + } else { + Settings::default() + }; + + let name = profile.name.clone(); + + // Ensure profiles structure exists + if settings.profiles.is_none() { + settings.profiles = Some(Profiles::default()); + } + + let profiles = settings.profiles.as_mut().unwrap(); + + // Update or append profile + if let Some(index) = profiles.list.iter().position(|el| el.name == name) { + tracing::warn!("Overwriting terminal profile for {}", name); + profiles.list[index] = profile.clone(); + } else { + profiles.list.push(profile.clone()); + } + + // Write back to file + let json = serde_json::to_string_pretty(&settings)?; + fs::write(location, json)?; + + Ok(()) +} + +pub fn remove_terminal_profile(location: &Path, name: &str) -> Result<(), TerminalUpdateError> { + // Read existing settings or return early if no file exists + let mut settings: Settings = if location.exists() { + let content = fs::read_to_string(location)?; + serde_json::from_str(&content)? + } else { + return Ok(()); + }; + + // Ensure that profiles exist + let Some(profiles) = settings.profiles.as_mut() else { + return Ok(()); + }; + + // Remove profile + profiles.list.retain(|el| el.name != name); + + // Write back to file + let json = serde_json::to_string_pretty(&settings)?; + fs::write(location, json)?; + + Ok(()) +} + +pub fn windows_terminal_settings_files(mode: MenuMode, folders: &Folders) -> Vec { + if mode != MenuMode::User { + return Vec::new(); + } + + // Assuming folder_path is a function you have that returns a String + let Ok(localappdata) = folders.get_folder_path(Folder::LocalAppData, UserHandle::Current) + else { + return Vec::new(); + }; + + let packages = localappdata.join("Packages"); + + let mut profile_locations = Vec::new(); + + if let Ok(entries) = fs::read_dir(&packages) { + for entry in entries.filter_map(Result::ok) { + let file_name = entry.file_name(); + let file_name = file_name.to_string_lossy(); + + // Check for both stable and preview versions + if file_name.starts_with("Microsoft.WindowsTerminal_") + || file_name.starts_with("Microsoft.WindowsTerminalPreview_") + { + profile_locations.push(entry.path().join("LocalState").join("settings.json")); + } + } + } + + // Unpackaged (Scoop, Chocolatey, etc.) + let unpackaged_path = localappdata + .join("Microsoft") + .join("Windows Terminal") + .join("settings.json"); + + if unpackaged_path.parent().is_some_and(Path::exists) { + profile_locations.push(unpackaged_path); + } + + tracing::debug!( + "Found Windows Terminal settings files: {:?}", + profile_locations + ); + profile_locations +} + +#[cfg(test)] +mod tests { + use super::*; + use insta::assert_json_snapshot; + use tempfile::{NamedTempFile, TempDir}; + + fn create_test_profile() -> TerminalProfile { + TerminalProfile { + commandline: "cmd.exe".to_string(), + name: "Test Profile".to_string(), + icon: Some("🚀".to_string()), + starting_directory: Some("C:\\Users".to_string()), + } + } + + #[test] + fn test_add_new_profile() { + let temp_file = NamedTempFile::new().unwrap(); + let initial_json = r#"{ + "defaultProfile": "Windows.Terminal.Cmd", + "theme": "dark", + "profiles": { + "defaults": { + "fontFace": "Cascadia Code" + }, + "list": [] + } + }"#; + fs::write(temp_file.path(), initial_json).unwrap(); + + let profile = create_test_profile(); + add_windows_terminal_profile(temp_file.path(), &profile).unwrap(); + + let content = fs::read_to_string(temp_file.path()).unwrap(); + let json: serde_json::Value = serde_json::from_str(&content).unwrap(); + assert_json_snapshot!(json, @r###" + { + "profiles": { + "list": [ + { + "commandline": "cmd.exe", + "name": "Test Profile", + "icon": "🚀", + "startingDirectory": "C:\\Users" + } + ], + "defaults": { + "fontFace": "Cascadia Code" + } + }, + "defaultProfile": "Windows.Terminal.Cmd", + "theme": "dark" + } + "###); + } + + #[test] + fn test_update_existing_profile() { + let temp_file = NamedTempFile::new().unwrap(); + let initial_json = r#"{ + "profiles": { + "list": [ + { + "commandline": "old.exe", + "name": "Test Profile", + "icon": "⭐" + } + ] + } + }"#; + fs::write(temp_file.path(), initial_json).unwrap(); + + let profile = create_test_profile(); + add_windows_terminal_profile(temp_file.path(), &profile).unwrap(); + + let content = fs::read_to_string(temp_file.path()).unwrap(); + let json: serde_json::Value = serde_json::from_str(&content).unwrap(); + assert_json_snapshot!(json, @r###" + { + "profiles": { + "list": [ + { + "commandline": "cmd.exe", + "name": "Test Profile", + "icon": "🚀", + "startingDirectory": "C:\\Users" + } + ] + } + } + "###); + } + + #[test] + fn test_remove_profile() { + let temp_file = NamedTempFile::new().unwrap(); + let initial_json = r#"{ + "theme": "dark", + "profiles": { + "list": [ + { + "commandline": "cmd.exe", + "name": "Test Profile", + "icon": "🚀" + }, + { + "commandline": "powershell.exe", + "name": "PowerShell", + "icon": "⚡" + } + ] + } + }"#; + fs::write(temp_file.path(), initial_json).unwrap(); + + remove_terminal_profile(temp_file.path(), "Test Profile").unwrap(); + + let content = fs::read_to_string(temp_file.path()).unwrap(); + let json: serde_json::Value = serde_json::from_str(&content).unwrap(); + assert_json_snapshot!(json, @r###" + { + "profiles": { + "list": [ + { + "commandline": "powershell.exe", + "name": "PowerShell", + "icon": "⚡" + } + ] + }, + "theme": "dark" + } + "###); + } + + #[test] + fn test_add_profile_to_empty_file() { + let temp_dir = TempDir::new().unwrap(); + let profile = create_test_profile(); + let temp_file = temp_dir.path().join("settings.json"); + add_windows_terminal_profile(&temp_file, &profile).unwrap(); + + let content = fs::read_to_string(temp_file).unwrap(); + let json: serde_json::Value = serde_json::from_str(&content).unwrap(); + assert_json_snapshot!(json, @r###" + { + "profiles": { + "list": [ + { + "commandline": "cmd.exe", + "name": "Test Profile", + "icon": "🚀", + "startingDirectory": "C:\\Users" + } + ] + } + } + "###); + } + + #[test] + fn test_remove_profile_from_nonexistent_file() { + let temp_dir = TempDir::new().unwrap(); + let result = + remove_terminal_profile(&temp_dir.path().join("settings.json"), "Test Profile"); + assert!(result.is_ok()); + } + + #[test] + fn test_preserve_unknown_fields() { + let temp_file = NamedTempFile::new().unwrap(); + let initial_json = r#"{ + "customSetting": true, + "profiles": { + "customProfileSetting": "value", + "list": [] + }, + "keybindings": [ + { + "command": "copy", + "keys": "ctrl+c" + } + ] + }"#; + fs::write(temp_file.path(), initial_json).unwrap(); + + let profile = create_test_profile(); + add_windows_terminal_profile(temp_file.path(), &profile).unwrap(); + + let content = fs::read_to_string(temp_file.path()).unwrap(); + let json: serde_json::Value = serde_json::from_str(&content).unwrap(); + assert_json_snapshot!(json, @r###" + { + "profiles": { + "list": [ + { + "commandline": "cmd.exe", + "name": "Test Profile", + "icon": "🚀", + "startingDirectory": "C:\\Users" + } + ], + "customProfileSetting": "value" + }, + "customSetting": true, + "keybindings": [ + { + "command": "copy", + "keys": "ctrl+c" + } + ] + } + "###); + } +} From b6e190b49452758c16b3265956f7adc3a3e5e58b Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Thu, 20 Feb 2025 13:38:06 +0100 Subject: [PATCH 095/132] more docs --- .../rattler_menuinst/src/windows/terminal.rs | 65 +++++++++++++++++-- 1 file changed, 61 insertions(+), 4 deletions(-) diff --git a/crates/rattler_menuinst/src/windows/terminal.rs b/crates/rattler_menuinst/src/windows/terminal.rs index ecdb14630..e644b2d57 100644 --- a/crates/rattler_menuinst/src/windows/terminal.rs +++ b/crates/rattler_menuinst/src/windows/terminal.rs @@ -43,6 +43,26 @@ pub enum TerminalUpdateError { Serde(#[from] serde_json::Error), } +/// Adds or updates a Windows Terminal profile in the settings file at the specified location. +/// If a profile with the same name exists, it is overwritten. +/// +/// # Arguments +/// * `location` - Path to the settings.json file +/// * `profile` - The TerminalProfile to add or update +/// +/// # Errors +/// Returns a `TerminalUpdateError` if file operations or JSON serialization/deserialization fail. +/// +/// # Examples +/// ```ignore +/// let profile = TerminalProfile { +/// commandline: "cmd.exe".to_string(), +/// name: "My Profile".to_string(), +/// icon: Some("icon.png".to_string()), +/// starting_directory: None, +/// }; +/// add_windows_terminal_profile(Path::new("settings.json"), &profile)?; +/// ``` pub fn add_windows_terminal_profile( location: &Path, profile: &TerminalProfile, @@ -85,6 +105,25 @@ pub fn add_windows_terminal_profile( Ok(()) } +/// Removes a profile with the specified name from the Windows Terminal settings file. +/// +/// If the file or the named profile does not exist, this function does nothing and returns +/// successfully. The updated settings are written back to the file. +/// +/// # Arguments +/// * `location` - Path to the `settings.json` file from which to remove the profile. +/// * `name` - The name of the profile to remove. +/// +/// # Errors +/// Returns a `TerminalUpdateError` if: +/// - The file cannot be read or written (e.g., insufficient permissions). +/// - The existing settings file contains invalid JSON. +/// - Serialization to JSON fails. +/// +/// # Examples +/// ```ignore +/// remove_terminal_profile(Path::new("settings.json"), "My Profile")?; +/// ``` pub fn remove_terminal_profile(location: &Path, name: &str) -> Result<(), TerminalUpdateError> { // Read existing settings or return early if no file exists let mut settings: Settings = if location.exists() { @@ -109,6 +148,27 @@ pub fn remove_terminal_profile(location: &Path, name: &str) -> Result<(), Termin Ok(()) } +/// Retrieves a list of potential Windows Terminal settings file locations for the current user. +/// +/// This function searches for settings files in both packaged (Microsoft Store) and unpackaged +/// (e.g., Scoop, Chocolatey) installations of Windows Terminal, including stable and preview +/// versions. Returns an empty vector if not in `User` mode or if folder paths cannot be retrieved. +/// +/// # Arguments +/// * `mode` - The `MenuMode` specifying the context; only `User` mode is supported. +/// * `folders` - A `Folders` instance providing access to known folder paths (e.g., LocalAppData). +/// +/// # Returns +/// A vector of `PathBuf` objects representing the locations of `settings.json` files. +/// +/// # Examples +/// ```ignore +/// let folders = Folders::new(); // Assuming Folders impl +/// let paths = windows_terminal_settings_files(MenuMode::User, &folders); +/// for path in paths { +/// println!("Found settings at: {:?}", path); +/// } +/// ``` pub fn windows_terminal_settings_files(mode: MenuMode, folders: &Folders) -> Vec { if mode != MenuMode::User { return Vec::new(); @@ -139,10 +199,7 @@ pub fn windows_terminal_settings_files(mode: MenuMode, folders: &Folders) -> Vec } // Unpackaged (Scoop, Chocolatey, etc.) - let unpackaged_path = localappdata - .join("Microsoft") - .join("Windows Terminal") - .join("settings.json"); + let unpackaged_path = localappdata.join("Microsoft/Windows Terminal/settings.json"); if unpackaged_path.parent().is_some_and(Path::exists) { profile_locations.push(unpackaged_path); From 2645838e4a20de923347acbb9669ada83dad9111 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Thu, 20 Feb 2025 13:44:35 +0100 Subject: [PATCH 096/132] add more docs --- .../rattler_menuinst/src/windows/registry.rs | 139 ++++++++++++++++++ 1 file changed, 139 insertions(+) diff --git a/crates/rattler_menuinst/src/windows/registry.rs b/crates/rattler_menuinst/src/windows/registry.rs index 1f2b92d44..98ad381e1 100644 --- a/crates/rattler_menuinst/src/windows/registry.rs +++ b/crates/rattler_menuinst/src/windows/registry.rs @@ -12,6 +12,32 @@ pub struct FileExtension<'a> { pub friendly_type_name: Option<&'a str>, } +/// Registers a file extension handler in the Windows Registry. +/// +/// Associates a file extension with a command and optional metadata (e.g., icon, app name) under +/// either the system-wide (`HKEY_LOCAL_MACHINE`) or current user (`HKEY_CURRENT_USER`) registry hive, +/// depending on the `mode`. +/// +/// # Arguments +/// * `file_extension` - A `FileExtension` struct containing registration details. +/// * `mode` - The `MenuMode` specifying whether to register system-wide (`System`) or for the current user (`User`). +/// +/// # Errors +/// Returns a `std::io::Error` if registry operations fail (e.g., insufficient permissions or invalid keys). +/// +/// # Examples +/// ```ignore +/// let file_ext = FileExtension { +/// extension: ".test", +/// identifier: "TestApp.File", +/// command: "\"C:\\Test\\App.exe\" \"%1\"", +/// icon: Some("C:\\Test\\icon.ico"), +/// app_name: Some("Test App"), +/// app_user_model_id: None, +/// friendly_type_name: Some("Test File"), +/// }; +/// register_file_extension(file_ext, MenuMode::User)?; +/// ``` pub fn register_file_extension( file_extension: FileExtension<'_>, mode: MenuMode, @@ -85,6 +111,23 @@ pub fn register_file_extension( Ok(()) } +/// Unregisters a file extension handler from the Windows Registry. +/// +/// Removes the association between a file extension and its identifier, as well as the handler's registry entries, +/// based on the specified `mode` (system-wide or current user). +/// +/// # Arguments +/// * `extension` - The file extension (e.g., `.test`) to unregister. +/// * `identifier` - The identifier of the handler (e.g., `TestApp.File`) to remove. +/// * `mode` - The `MenuMode` specifying the registry hive (`System` or `User`). +/// +/// # Errors +/// Returns a `std::io::Error` if registry operations fail (e.g., insufficient permissions or key not found). +/// +/// # Examples +/// ```ignore +/// unregister_file_extension(".test", "TestApp.File", MenuMode::User)?; +/// ``` pub fn unregister_file_extension( extension: &str, identifier: &str, @@ -125,6 +168,22 @@ pub fn unregister_file_extension( Ok(()) } +/// Converts a string to title case, capitalizing the first letter of each word. +/// +/// Words are separated by whitespace, hyphens, or underscores. This is used internally +/// to format URL protocol names. +/// +/// # Arguments +/// * `s` - The input string to convert. +/// +/// # Returns +/// A new `String` in title case. +/// +/// # Examples +/// ```ignore +/// assert_eq!(title_case("hello-world"), "Hello-World"); +/// assert_eq!(title_case("my_url"), "My_Url"); +/// ``` fn title_case(s: &str) -> String { let mut result = String::with_capacity(s.len()); let mut capitalize_next = true; @@ -144,16 +203,50 @@ fn title_case(s: &str) -> String { result } +/// Represents a URL protocol registration with associated metadata. +/// +/// This struct defines the properties needed to register a custom URL protocol handler in the Windows Registry, +/// such as a command to execute and optional application details. #[derive(Debug, Clone, Copy)] pub struct UrlProtocol<'a> { + /// The URL protocol name (e.g., `rattlertest`). pub protocol: &'a str, + /// The command to execute when the protocol is invoked. pub command: &'a str, + /// The identifier for the protocol handler. pub identifier: &'a str, + /// The path to an icon file to associate with the protocol. pub icon: Option<&'a str>, + /// The friendly name of the application. pub app_name: Option<&'a str>, + /// The application user model ID (AUMI) for the protocol handler. pub app_user_model_id: Option<&'a str>, } +/// Registers a custom URL protocol handler in the Windows Registry. +/// +/// Creates registry entries for a URL protocol (e.g., `myapp://`) with a command and optional metadata, +/// under either `HKEY_CLASSES_ROOT` (system-wide) or `HKEY_CURRENT_USER` (user-specific) based on `mode`. +/// +/// # Arguments +/// * `url_protocol` - A `UrlProtocol` struct containing registration details. +/// * `mode` - The `MenuMode` specifying the registry hive (`System` or `User`). +/// +/// # Errors +/// Returns a `std::io::Error` if registry operations fail (e.g., insufficient permissions). +/// +/// # Examples +/// ```ignore +/// let url_proto = UrlProtocol { +/// protocol: "myapp", +/// command: "\"C:\\MyApp\\App.exe\" \"%1\"", +/// identifier: "MyApp", +/// icon: Some("C:\\MyApp\\icon.ico"), +/// app_name: Some("My App"), +/// app_user_model_id: None, +/// }; +/// register_url_protocol(url_proto, MenuMode::User)?; +/// ``` pub fn register_url_protocol( url_protocol: UrlProtocol<'_>, mode: MenuMode, @@ -211,6 +304,23 @@ pub fn register_url_protocol( Ok(()) } +/// Unregisters a URL protocol handler from the Windows Registry. +/// +/// Removes the registry entries for a URL protocol if the identifier matches, based on the specified `mode`. +/// Does nothing if the protocol or identifier doesn’t exist or doesn’t match. +/// +/// # Arguments +/// * `protocol` - The protocol name (e.g., `myapp`) to unregister. +/// * `identifier` - The identifier of the handler to verify before removal. +/// * `mode` - The `MenuMode` specifying the registry hive (`System` or `User`). +/// +/// # Errors +/// Returns a `std::io::Error` if registry operations fail (e.g., insufficient permissions). +/// +/// # Examples +/// ```ignore +/// unregister_url_protocol("myapp", "MyApp", MenuMode::User)?; +/// ``` pub fn unregister_url_protocol( protocol: &str, identifier: &str, @@ -241,6 +351,20 @@ pub fn unregister_url_protocol( Ok(()) } +/// Notifies the Windows shell of changes to file associations or protocols. +/// +/// Calls `SHChangeNotify` with `SHCNE_ASSOCCHANGED` to refresh the shell’s understanding of registered +/// file extensions or URL protocols. This is typically called after registration/unregistration. +/// +/// # Safety +/// This function uses an unsafe Windows API call but is safe under normal conditions as it passes +/// valid parameters. +/// +/// # Examples +/// ```ignore +/// register_file_extension(file_ext, MenuMode::User)?; +/// notify_shell_changes(); +/// ``` pub fn notify_shell_changes() { unsafe { SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, None, None); @@ -258,6 +382,21 @@ mod tests { let _ = unregister_url_protocol(protocol, identifier, mode); } + #[test] + fn test_title_case() { + let inputs = [ + ("hello-world", "Hello-World"), + ("my_url", "My_Url"), + ("my_url_protocol", "My_Url_Protocol"), + ("my_url_protocol_test", "My_Url_Protocol_Test"), + ("my_url_protocol_test_2", "My_Url_Protocol_Test_2"), + ]; + + for (input, expected) in inputs.iter() { + assert_eq!(title_case(input), *expected); + } + } + #[test] fn test_register_file_extension_user() -> std::io::Result<()> { let extension = ".rattlertest"; From 0310c46cc475e5a6baf59df69a1b08776f6caa96 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Thu, 20 Feb 2025 17:26:45 +0100 Subject: [PATCH 097/132] add menuinst types to rattler_conda_types --- crates/rattler/src/install/driver.rs | 7 +- crates/rattler/src/install/installer/mod.rs | 2 +- crates/rattler_conda_types/src/lib.rs | 1 + .../rattler_conda_types/src/menuinst/mod.rs | 129 ++++++++++++++++++ .../rattler_conda_types/src/prefix_record.rs | 8 +- crates/rattler_menuinst/src/lib.rs | 23 ++-- crates/rattler_menuinst/src/linux.rs | 2 + crates/rattler_menuinst/src/macos.rs | 3 +- crates/rattler_menuinst/src/tracker.rs | 100 -------------- 9 files changed, 150 insertions(+), 125 deletions(-) create mode 100644 crates/rattler_conda_types/src/menuinst/mod.rs delete mode 100644 crates/rattler_menuinst/src/tracker.rs diff --git a/crates/rattler/src/install/driver.rs b/crates/rattler/src/install/driver.rs index 0f3a9f06c..069c82c7a 100644 --- a/crates/rattler/src/install/driver.rs +++ b/crates/rattler/src/install/driver.rs @@ -182,8 +182,8 @@ impl InstallDriver { // For all packages that are removed, we need to remove menuinst entries as well for record in transaction.removed_packages() { let prefix_record = record.borrow(); - if let Some(data) = &prefix_record.menuinst_tracker { - match rattler_menuinst::remove_menu_items(data) { + if !prefix_record.installed_system_menus.is_empty() { + match rattler_menuinst::remove_menu_items(&prefix_record.installed_system_menus) { Ok(_) => {} Err(e) => { tracing::warn!("Failed to remove menu item: {}", e); @@ -281,8 +281,7 @@ impl InstallDriver { Ok(tracker_vec) => { // Store tracker in the prefix record let mut record = record.clone(); - record.menuinst_tracker = - Some(serde_json::to_value(tracker_vec).unwrap()); + record.installed_system_menus = tracker_vec; // Save the updated prefix record record diff --git a/crates/rattler/src/install/installer/mod.rs b/crates/rattler/src/install/installer/mod.rs index 0810d6714..1a73f5053 100644 --- a/crates/rattler/src/install/installer/mod.rs +++ b/crates/rattler/src/install/installer/mod.rs @@ -523,7 +523,7 @@ async fn link_package( // ... link_type: Some(LinkType::HardLink), }), - menuinst_tracker: None, + installed_system_menus: Vec::new(), }; let conda_meta_path = target_prefix.join("conda-meta"); diff --git a/crates/rattler_conda_types/src/lib.rs b/crates/rattler_conda_types/src/lib.rs index c305b5ed4..415beacd7 100644 --- a/crates/rattler_conda_types/src/lib.rs +++ b/crates/rattler_conda_types/src/lib.rs @@ -8,6 +8,7 @@ mod channel; mod channel_data; mod explicit_environment_spec; mod match_spec; +pub mod menuinst; mod no_arch_type; mod parse_mode; mod platform; diff --git a/crates/rattler_conda_types/src/menuinst/mod.rs b/crates/rattler_conda_types/src/menuinst/mod.rs new file mode 100644 index 000000000..1a5422fa2 --- /dev/null +++ b/crates/rattler_conda_types/src/menuinst/mod.rs @@ -0,0 +1,129 @@ +//! Define types that can be serialized into a [`PrefixRecord`] to track +//! menu entries installed into the system. +use serde::{Deserialize, Serialize}; +use std::path::PathBuf; + +/// Menu mode that was used to install the menu entries +#[derive(Default, Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)] +pub enum MenuMode { + /// System-wide installation + System, + + /// User installation + #[default] + User, +} + +/// Tracker for menu entries installed into the system +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub enum Tracker { + /// Linux tracker + Linux(LinuxTracker), + /// Windows tracker + Windows(WindowsTracker), + /// macOS tracker + MacOs(MacOsTracker), +} + +/// Registered MIME file on the system +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct LinuxRegisteredMimeFile { + /// The application that was registered + pub application: String, + /// The location of the config file that was edited + pub config_file: PathBuf, + /// The MIME types that were associated to the application + pub mime_types: Vec, +} + +/// Tracker for Linux installations +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct LinuxTracker { + /// The menu mode that was used to install the menu entries + pub install_mode: MenuMode, + + /// List of desktop files that were installed + pub paths: Vec, + + /// MIME types that were installed + #[serde(default, skip_serializing_if = "Option::is_none")] + pub mime_types: Option, + + /// MIME type glob files that were registered on the system + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub registered_mime_files: Vec, +} + +/// File extension that was installed +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct WindowsFileExtension { + /// The file extension that was installed + pub extension: String, + /// The identifier of the file extension + pub identifier: String, +} + +/// URL protocol that was installed +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct WindowsUrlProtocol { + /// The URL protocol that was installed + pub protocol: String, + /// The identifier of the URL protocol + pub identifier: String, +} + +/// Terminal profile that was installed +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct TerminalProfile { + /// The name of the terminal profile + pub configuration_file: PathBuf, + /// The identifier of the terminal profile + pub identifier: String, +} + +/// Tracker for Windows installations +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct WindowsTracker { + /// The menu mode that was used to install the menu entries + pub menu_mode: MenuMode, + + /// List of shortcuts that were installed + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub shortcuts: Vec, + + /// List of file extensions that were installed + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub file_extensions: Vec, + + /// List of URL protocols that were installed + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub url_protocols: Vec, + + /// List of terminal profiles that were installed + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub terminal_profiles: Vec, +} + +impl WindowsTracker { + /// Create a new Windows tracker + pub fn new(menu_mode: MenuMode) -> Self { + Self { + menu_mode, + shortcuts: Vec::new(), + file_extensions: Vec::new(), + url_protocols: Vec::new(), + terminal_profiles: Vec::new(), + } + } +} + +/// Tracker for macOS installations +#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct MacOsTracker { + /// The app folder that was installed, e.g. ~/Applications/foobar.app + pub app_folder: PathBuf, + /// Argument that was used to call `lsregister` and that we need to + /// call to unregister the app + #[serde(default, skip_serializing_if = "Option::is_none")] + pub lsregister: Option, +} diff --git a/crates/rattler_conda_types/src/prefix_record.rs b/crates/rattler_conda_types/src/prefix_record.rs index 0597e2a49..b402254dd 100644 --- a/crates/rattler_conda_types/src/prefix_record.rs +++ b/crates/rattler_conda_types/src/prefix_record.rs @@ -3,7 +3,7 @@ use crate::package::FileMode; use crate::repo_data::RecordFromPath; use crate::repo_data_record::RepoDataRecord; -use crate::PackageRecord; +use crate::{menuinst, PackageRecord}; use rattler_digest::serde::SerializableHash; use serde::{Deserialize, Serialize}; use serde_repr::{Deserialize_repr, Serialize_repr}; @@ -182,8 +182,8 @@ pub struct PrefixRecord { /// If menuinst is enabled and added menu items, this field contains the menuinst tracker data. /// This data is used to remove the menu items when the package is uninstalled. - #[serde(default, skip_serializing_if = "Option::is_none")] - pub menuinst_tracker: Option, + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub installed_system_menus: Vec, } impl PrefixRecord { @@ -214,7 +214,7 @@ impl PrefixRecord { paths_data: paths.into(), link, requested_spec, - menuinst_tracker: None, + installed_system_menus: Vec::new(), } } diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index 8248815e9..046c3f344 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -3,7 +3,7 @@ use std::path::Path; #[cfg(target_os = "linux")] use std::path::PathBuf; -use rattler_conda_types::Platform; +use rattler_conda_types::{menuinst::Tracker, Platform}; #[cfg(target_os = "linux")] mod linux; @@ -15,12 +15,9 @@ mod util; #[cfg(target_os = "windows")] mod windows; -pub mod tracker; - pub mod slugify; use serde::{Deserialize, Serialize}; pub use slugify::slugify; -use tracker::MenuinstTracker; use crate::{render::BaseMenuItemPlaceholders, schema::MenuInstSchema}; @@ -71,7 +68,7 @@ pub fn install_menuitems( base_prefix: &Path, platform: Platform, menu_mode: MenuMode, -) -> Result, MenuInstError> { +) -> Result, MenuInstError> { let text = std::fs::read_to_string(file)?; let menu_inst: MenuInstSchema = serde_json::from_str(&text)?; let placeholders = BaseMenuItemPlaceholders::new(base_prefix, prefix, platform); @@ -90,7 +87,7 @@ pub fn install_menuitems( &placeholders, menu_mode, )?; - trackers.push(MenuinstTracker::Linux(linux_tracker)); + trackers.push(Tracker::Linux(linux_tracker)); } } else if platform.is_osx() { #[cfg(target_os = "macos")] @@ -103,7 +100,7 @@ pub fn install_menuitems( &placeholders, menu_mode, )?; - trackers.push(MenuinstTracker::MacOs(macos_tracker)); + trackers.push(Tracker::MacOs(macos_tracker)); }; } else if platform.is_windows() { #[cfg(target_os = "windows")] @@ -116,7 +113,7 @@ pub fn install_menuitems( &placeholders, menu_mode, )?; - trackers.push(MenuinstTracker::Windows(tracker)); + trackers.push(Tracker::Windows(tracker)); } } } @@ -125,21 +122,19 @@ pub fn install_menuitems( } /// Remove menu items from a given schema file -pub fn remove_menu_items(tracker: &serde_json::Value) -> Result<(), MenuInstError> { - let tracker: Vec = serde_json::from_value(tracker.clone())?; - +pub fn remove_menu_items(tracker: &Vec) -> Result<(), MenuInstError> { for el in tracker { #[allow(unused)] match el { - MenuinstTracker::MacOs(tracker) => { + Tracker::MacOs(tracker) => { #[cfg(target_os = "macos")] macos::remove_menu_item(&tracker).unwrap(); } - MenuinstTracker::Linux(tracker) => { + Tracker::Linux(tracker) => { #[cfg(target_os = "linux")] linux::remove_menu_item(&tracker).unwrap(); } - MenuinstTracker::Windows(tracker) => { + Tracker::Windows(tracker) => { #[cfg(target_os = "windows")] windows::remove_menu_item(&tracker)?; } diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index 885810941..7a30b33ef 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -559,6 +559,8 @@ impl LinuxMenu { let mime_dir_in_prefix = self.prefix.join("Menu/registered-mimetypes"); fs::create_dir_all(&mime_dir_in_prefix)?; + // We store the mime file in a temporary dir inside the prefix, but we actually keep + // the file + directory around for eventual removal (just use tempdir for unique folder) let temp_dir = TempDir::new_in(&mime_dir_in_prefix)?; let file_path = temp_dir.path().join(file_name); let mut file = File::create(&file_path)?; diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index 565fae05c..52bc1fc8e 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -9,7 +9,7 @@ use std::{ use fs_err as fs; use fs_err::File; use plist::Value; -use rattler_conda_types::Platform; +use rattler_conda_types::{menuinst::MacOsTracker, Platform}; use rattler_shell::{ activation::{ActivationVariables, Activator}, shell, @@ -22,7 +22,6 @@ use crate::{ UTTypeDeclarationModel, }, slugify, - tracker::MacOsTracker, util::run_pre_create_command, utils, MenuInstError, MenuMode, }; diff --git a/crates/rattler_menuinst/src/tracker.rs b/crates/rattler_menuinst/src/tracker.rs deleted file mode 100644 index 3aff5e5ae..000000000 --- a/crates/rattler_menuinst/src/tracker.rs +++ /dev/null @@ -1,100 +0,0 @@ -use fs_err::File; -use serde::{Deserialize, Serialize}; -use std::{ - io::{self, BufReader, BufWriter}, - path::{Path, PathBuf}, -}; -use thiserror::Error; - -use crate::MenuMode; - -/// Track the installation of menu items on the system and make it easy to remove them -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] -pub enum MenuinstTracker { - Linux(LinuxTracker), - Windows(WindowsTracker), - MacOs(MacOsTracker), -} - -#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq)] -pub struct LinuxTracker { - pub install_mode: MenuMode, - pub paths: Vec, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - pub mime_types: Vec<(String, String)>, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - pub registered_mime_files: Vec, -} - -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] -pub struct WindowsTracker { - pub menu_mode: MenuMode, - pub files: Vec, - pub file_extensions: Vec<(String, String)>, - pub url_protocols: Vec<(String, String)>, - pub terminal_profiles: Vec<(String, PathBuf)>, -} - -impl WindowsTracker { - pub fn new(menu_mode: MenuMode) -> Self { - Self { - menu_mode, - files: Vec::new(), - file_extensions: Vec::new(), - url_protocols: Vec::new(), - terminal_profiles: Vec::new(), - } - } -} - -#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq)] -pub struct MacOsTracker { - pub app_folder: PathBuf, - pub lsregister: Option, -} - -/// Errors that can occur when saving or loading the menu installation tracker -#[derive(Debug, Error)] -pub enum TrackerError { - #[error("Failed to create file: {0}")] - FileCreate(#[source] io::Error), - #[error("Failed to read file: {0}")] - FileRead(#[source] io::Error), - #[error("Failed to serialize tracker: {0}")] - Serialize(#[source] serde_json::Error), - #[error("Failed to deserialize tracker: {0}")] - Deserialize(#[source] serde_json::Error), -} - -impl MenuinstTracker { - /// Saves the menu installation tracker to a JSON file at the specified path. - /// - /// # Arguments - /// * `path` - The path where to save the tracker file - /// - /// # Errors - /// Returns a [`TrackerError`] if: - /// * The file cannot be created - /// * The tracker cannot be serialized to JSON - pub fn save_to(&self, path: impl AsRef) -> Result<(), TrackerError> { - let file = File::create(path.as_ref()).map_err(TrackerError::FileCreate)?; - let writer = BufWriter::new(file); - serde_json::to_writer_pretty(writer, self).map_err(TrackerError::Serialize) - } - - /// Loads a menu installation tracker from a JSON file. - /// - /// # Arguments - /// * `path` - The path to the tracker file to load - /// - /// # Errors - /// Returns a [`TrackerError`] if: - /// * The file cannot be opened - /// * The file contains invalid JSON - /// * The JSON does not represent a valid tracker - pub fn load_from(path: impl AsRef) -> Result { - let file = File::open(path.as_ref()).map_err(TrackerError::FileRead)?; - let reader = BufReader::new(file); - serde_json::from_reader(reader).map_err(TrackerError::Deserialize) - } -} From ccaf57b18bff64baccf63f4eeff7802928ae79a3 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Thu, 20 Feb 2025 18:13:19 +0100 Subject: [PATCH 098/132] fix everything up on linux --- crates/rattler/src/install/driver.rs | 6 +- crates/rattler/src/install/test_utils.rs | 2 +- .../rattler_conda_types/src/menuinst/mod.rs | 2 + crates/rattler_menuinst/src/lib.rs | 13 +--- crates/rattler_menuinst/src/linux.rs | 76 +++++++++++-------- .../rattler_menuinst/src/linux/mime_config.rs | 20 ++--- 6 files changed, 64 insertions(+), 55 deletions(-) diff --git a/crates/rattler/src/install/driver.rs b/crates/rattler/src/install/driver.rs index 069c82c7a..7a19d10ba 100644 --- a/crates/rattler/src/install/driver.rs +++ b/crates/rattler/src/install/driver.rs @@ -7,7 +7,9 @@ use std::{ use indexmap::IndexSet; use itertools::Itertools; -use rattler_conda_types::{prefix_record::PathType, PackageRecord, Platform, PrefixRecord}; +use rattler_conda_types::{ + menuinst::MenuMode, prefix_record::PathType, PackageRecord, Platform, PrefixRecord, +}; use simple_spawn_blocking::{tokio::run_blocking_task, Cancelled}; use thiserror::Error; use tokio::sync::{AcquireError, OwnedSemaphorePermit, Semaphore}; @@ -276,7 +278,7 @@ impl InstallDriver { target_prefix, target_prefix, Platform::current(), - rattler_menuinst::MenuMode::User, + MenuMode::User, ) { Ok(tracker_vec) => { // Store tracker in the prefix record diff --git a/crates/rattler/src/install/test_utils.rs b/crates/rattler/src/install/test_utils.rs index 9c3ad5136..699608efc 100644 --- a/crates/rattler/src/install/test_utils.rs +++ b/crates/rattler/src/install/test_utils.rs @@ -43,7 +43,7 @@ pub async fn install_package_to_environment( paths_data: paths.into(), requested_spec: None, link: None, - menuinst_tracker: None, + installed_system_menus: Vec::new(), }; // Create the conda-meta directory if it doesnt exist yet. diff --git a/crates/rattler_conda_types/src/menuinst/mod.rs b/crates/rattler_conda_types/src/menuinst/mod.rs index 1a5422fa2..f1d74f647 100644 --- a/crates/rattler_conda_types/src/menuinst/mod.rs +++ b/crates/rattler_conda_types/src/menuinst/mod.rs @@ -30,6 +30,8 @@ pub enum Tracker { pub struct LinuxRegisteredMimeFile { /// The application that was registered pub application: String, + /// Path to use when calling `update-mime-database` + pub database_path: PathBuf, /// The location of the config file that was edited pub config_file: PathBuf, /// The MIME types that were associated to the application diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index 046c3f344..9baa78f58 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -3,7 +3,10 @@ use std::path::Path; #[cfg(target_os = "linux")] use std::path::PathBuf; -use rattler_conda_types::{menuinst::Tracker, Platform}; +use rattler_conda_types::{ + menuinst::{MenuMode, Tracker}, + Platform, +}; #[cfg(target_os = "linux")] mod linux; @@ -16,20 +19,12 @@ mod util; mod windows; pub mod slugify; -use serde::{Deserialize, Serialize}; pub use slugify::slugify; use crate::{render::BaseMenuItemPlaceholders, schema::MenuInstSchema}; pub mod utils; -#[derive(Default, Debug, Eq, PartialEq, Clone, Copy, Serialize, Deserialize)] -pub enum MenuMode { - System, - #[default] - User, -} - #[derive(thiserror::Error, Debug)] pub enum MenuInstError { #[error("IO error: {0}")] diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index 7a30b33ef..715bcf568 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -1,6 +1,7 @@ use fs_err as fs; use fs_err::File; use mime_config::MimeConfig; +use rattler_conda_types::menuinst::{LinuxRegisteredMimeFile, LinuxTracker, MenuMode}; use std::collections::HashMap; use std::io::Write; use std::path::{Path, PathBuf}; @@ -16,11 +17,10 @@ use rattler_shell::shell; use crate::render::{BaseMenuItemPlaceholders, MenuItemPlaceholders, PlaceholderString}; use crate::slugify; -use crate::tracker::LinuxTracker; use crate::util::{log_output, run_pre_create_command}; use crate::{ schema::{Linux, MenuItemCommand}, - MenuInstError, MenuMode, + MenuInstError, }; pub struct LinuxMenu { @@ -164,6 +164,7 @@ pub enum XdgMimeError { IoError(#[from] std::io::Error), } +/// Run `xdg-mime` with the given arguments fn xdg_mime( xml_file: &Path, mode: MenuMode, @@ -206,6 +207,14 @@ fn xdg_mime( Ok(()) } +/// Update the desktop database by running `update-desktop-database` +fn update_desktop_database() -> Result<(), MenuInstError> { + // We don't care about the output of update-desktop-database + let _ = Command::new("update-desktop-database").output(); + + Ok(()) +} + impl LinuxMenu { fn new( menu_name: &str, @@ -434,19 +443,12 @@ impl LinuxMenu { Ok(()) } - fn update_desktop_database() -> Result<(), MenuInstError> { - // We don't care about the output of update-desktop-database - let _ = Command::new("update-desktop-database").output(); - - Ok(()) - } - fn install(&self, tracker: &mut LinuxTracker) -> Result<(), MenuInstError> { self.directories.ensure_directories_exist()?; self.pre_create()?; self.create_desktop_entry(tracker)?; self.register_mime_types(tracker)?; - Self::update_desktop_database()?; + update_desktop_database()?; Ok(()) } @@ -477,17 +479,21 @@ impl LinuxMenu { let mimeapps = self.directories.config_directory.join("mimeapps.list"); - let mut config = MimeConfig::new(mimeapps); - config.load()?; - for mime_type in mime_types { + let mut config = MimeConfig::load(&mimeapps)?; + for mime_type in &mime_types { tracing::info!("Registering mime type {} for {}", mime_type, &self.name); - config.register_mime_type(&mime_type, &self.name); - tracker - .mime_types - .push((mime_type.clone(), self.name.clone())); + config.register_mime_type(mime_type, &self.name); } config.save()?; + // Store the data so that we can remove it later + tracker.mime_types = Some(LinuxRegisteredMimeFile { + mime_types: mime_types.clone(), + database_path: self.directories.mime_directory(), + application: self.name.clone(), + config_file: mimeapps, + }); + update_mime_database(&self.directories.mime_directory())?; Ok(()) @@ -575,6 +581,9 @@ impl LinuxMenu { tracker.registered_mime_files.push(file_path); } Err(_) => { + if let Some(parent) = xml_path.parent() { + fs::create_dir_all(parent)?; + } fs::write(&xml_path, xml)?; tracker.paths.push(xml_path); } @@ -612,26 +621,26 @@ pub fn remove_menu_item(tracker: &LinuxTracker) -> Result<(), MenuInstError> { } for path in &tracker.registered_mime_files { - let _ = xdg_mime(path, tracker.install_mode, XdgMimeOperation::Uninstall) - .map_err(|e| tracing::warn!("Could not uninstall mime type: {}", e)); + match xdg_mime(path, tracker.install_mode, XdgMimeOperation::Uninstall) { + Ok(_) => {} + Err(e) => { + tracing::warn!("Could not uninstall mime type: {}", e); + } + } + // Remove the temporary directory we created for the glob file + fs::remove_dir_all(path.parent().unwrap())?; } - // invoke xdg-mime uninstall ... - if !tracker.mime_types.is_empty() { + if let Some(installed_mime_types) = tracker.mime_types.as_ref() { // load mimetype config - // TODO - store path to mime config - let mut config = MimeConfig::new(PathBuf::from("/tmp/mimeapps.list")); - for mime_type in &tracker.mime_types { - tracing::info!( - "Unregistering mime type {} for {}", - mime_type.0, - mime_type.1 - ); - config.deregister_mime_type(&mime_type.0, &mime_type.1); + let mut config = MimeConfig::load(&installed_mime_types.config_file)?; + let application = &installed_mime_types.application; + for mime_type in &installed_mime_types.mime_types { + config.deregister_mime_type(&mime_type, &application); } config.save()?; - // TODO use `mime directory`. - update_mime_database(&PathBuf::from("/tmp/mime"))?; + + update_mime_database(&installed_mime_types.database_path)?; } Ok(()) @@ -640,13 +649,14 @@ pub fn remove_menu_item(tracker: &LinuxTracker) -> Result<(), MenuInstError> { #[cfg(test)] mod tests { use fs_err as fs; + use rattler_conda_types::menuinst::LinuxTracker; use std::{ collections::HashMap, path::{Path, PathBuf}, }; use tempfile::TempDir; - use crate::{schema::MenuInstSchema, test::test_data, tracker::LinuxTracker}; + use crate::{schema::MenuInstSchema, test::test_data}; use super::{Directories, LinuxMenu}; diff --git a/crates/rattler_menuinst/src/linux/mime_config.rs b/crates/rattler_menuinst/src/linux/mime_config.rs index 3df890685..6fd6fd6e8 100644 --- a/crates/rattler_menuinst/src/linux/mime_config.rs +++ b/crates/rattler_menuinst/src/linux/mime_config.rs @@ -17,19 +17,21 @@ pub struct MimeConfig { impl MimeConfig { pub fn new>(path: P) -> Self { Self { - // cs == case-sensitive config: Ini::new_cs(), path: path.as_ref().to_path_buf(), } } - pub fn load(&mut self) -> Result<(), std::io::Error> { - if self.path.exists() { - self.config - .load(&self.path) + /// Create a new MimeConfig instance and load the configuration from the given path + pub fn load>(path: P) -> Result { + let mut this = Self::new(path); + + if this.path.exists() { + this.config + .load(&this.path) .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))?; } - Ok(()) + Ok(this) } pub fn save(&self) -> Result<(), std::io::Error> { @@ -169,8 +171,7 @@ mod tests { config.register_mime_type("text/plain", "notepad.desktop"); config.save()?; - let mut new_config = MimeConfig::new(file.path()); - new_config.load()?; + let new_config = MimeConfig::load(file.path())?; assert_eq!( new_config.get_default_application("text/plain"), @@ -278,8 +279,7 @@ mod tests { fn test_existing_mimeapps() { // load from test-data/linux/mimeapps.list let path = test_data().join("linux-menu/mimeapps.list"); - let mut mimeapps = MimeConfig::new(path); - mimeapps.load().unwrap(); + let mut mimeapps = MimeConfig::load(path).unwrap(); insta::assert_debug_snapshot!(mimeapps.config.get_map()); From 8f6702a539eb32f6fd97b9cc43cc81563b49b27e Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Thu, 20 Feb 2025 18:35:45 +0100 Subject: [PATCH 099/132] fix up windows --- .../rattler_conda_types/src/menuinst/mod.rs | 4 +- crates/rattler_menuinst/src/windows.rs | 82 ++++++++++++++----- 2 files changed, 64 insertions(+), 22 deletions(-) diff --git a/crates/rattler_conda_types/src/menuinst/mod.rs b/crates/rattler_conda_types/src/menuinst/mod.rs index f1d74f647..00472e9a3 100644 --- a/crates/rattler_conda_types/src/menuinst/mod.rs +++ b/crates/rattler_conda_types/src/menuinst/mod.rs @@ -76,7 +76,7 @@ pub struct WindowsUrlProtocol { /// Terminal profile that was installed #[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] -pub struct TerminalProfile { +pub struct WindowsTerminalProfile { /// The name of the terminal profile pub configuration_file: PathBuf, /// The identifier of the terminal profile @@ -103,7 +103,7 @@ pub struct WindowsTracker { /// List of terminal profiles that were installed #[serde(default, skip_serializing_if = "Vec::is_empty")] - pub terminal_profiles: Vec, + pub terminal_profiles: Vec, } impl WindowsTracker { diff --git a/crates/rattler_menuinst/src/windows.rs b/crates/rattler_menuinst/src/windows.rs index a9549d16e..1688ef2c2 100644 --- a/crates/rattler_menuinst/src/windows.rs +++ b/crates/rattler_menuinst/src/windows.rs @@ -1,6 +1,9 @@ use create_shortcut::Shortcut; use fs_err as fs; -use rattler_conda_types::Platform; +use rattler_conda_types::{ + menuinst::{WindowsFileExtension, WindowsTerminalProfile, WindowsTracker, WindowsUrlProtocol}, + Platform, +}; use rattler_shell::{ activation::{ActivationVariables, Activator}, shell, @@ -16,7 +19,6 @@ use crate::{ render::{BaseMenuItemPlaceholders, MenuItemPlaceholders}, schema::{Environment, MenuItemCommand, Windows}, slugify, - tracker::WindowsTracker, util::log_output, MenuInstError, MenuMode, }; @@ -333,7 +335,7 @@ impl WindowsMenu { }; create_shortcut::create_shortcut(shortcut)?; - tracker.files.push(desktop_link_path.clone()); + tracker.shortcuts.push(desktop_link_path.clone()); } if let Some(quick_launch_dir) = self.directories.quick_launch.as_ref() { @@ -351,7 +353,7 @@ impl WindowsMenu { }; create_shortcut::create_shortcut(shortcut)?; - tracker.files.push(quicklaunch_link_path.clone()); + tracker.shortcuts.push(quicklaunch_link_path.clone()); } } Ok(()) @@ -389,9 +391,10 @@ impl WindowsMenu { registry::register_file_extension(file_extension, self.menu_mode)?; - tracker - .file_extensions - .push((extension.clone(), identifier)); + tracker.file_extensions.push(WindowsFileExtension { + extension: extension.clone(), + identifier: identifier.clone(), + }); } Ok(()) @@ -422,7 +425,10 @@ impl WindowsMenu { }; registry::register_url_protocol(url_protocol, self.menu_mode)?; - tracker.url_protocols.push((protocol.clone(), identifier)); + tracker.url_protocols.push(WindowsUrlProtocol { + protocol: protocol.clone(), + identifier: identifier.clone(), + }); } Ok(true) @@ -452,9 +458,10 @@ impl WindowsMenu { ) { // TODO get rid of unwrap :) terminal::add_windows_terminal_profile(&location, &profile).unwrap(); - tracker - .terminal_profiles - .push((profile.name.clone(), location)); + tracker.terminal_profiles.push(WindowsTerminalProfile { + configuration_file: location, + identifier: profile.name.clone(), + }); } Ok(()) @@ -493,22 +500,57 @@ pub(crate) fn install_menu_item( } pub(crate) fn remove_menu_item(tracker: &WindowsTracker) -> Result<(), MenuInstError> { - for file in &tracker.files { - fs::remove_file(file)?; + for file in &tracker.shortcuts { + match fs::remove_file(file) { + Ok(_) => {} + Err(e) => { + tracing::warn!("Failed to remove shortcut {}: {}", file.display(), e); + } + } } let menu_mode = tracker.menu_mode; - for (extension, identifier) in &tracker.file_extensions { - registry::unregister_file_extension(extension, identifier, menu_mode)?; + for ext in &tracker.file_extensions { + match registry::unregister_file_extension(&ext.extension, &ext.identifier, menu_mode) { + Ok(_) => {} + Err(e) => { + tracing::warn!( + "Failed to remove file extension {} with identifier {}: {}", + ext.extension, + ext.identifier, + e + ); + } + } } - for (protocol, identifier) in &tracker.url_protocols { - registry::unregister_url_protocol(protocol, identifier, menu_mode)?; + for protocol in &tracker.url_protocols { + match registry::unregister_url_protocol(&protocol.protocol, &protocol.identifier, menu_mode) + { + Ok(_) => {} + Err(e) => { + tracing::warn!( + "Failed to remove URL protocol {} with identifier {}: {}", + protocol.protocol, + protocol.identifier, + e + ); + } + } } - for (profile, location) in &tracker.terminal_profiles { - // TODO get rid of unwrap - terminal::remove_terminal_profile(location, profile).unwrap(); + for profile in &tracker.terminal_profiles { + match terminal::remove_terminal_profile(&profile.configuration_file, &profile.identifier) { + Ok(_) => {} + Err(e) => { + tracing::warn!( + "Failed to remove terminal profile {} in {}: {}", + profile.identifier, + profile.configuration_file.display(), + e + ); + } + } } notify_shell_changes(); From 5fc3195175b2a9cc30970da94607b391fcf29e84 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Thu, 20 Feb 2025 18:40:58 +0100 Subject: [PATCH 100/132] clippy --- crates/rattler_menuinst/src/lib.rs | 6 +++--- crates/rattler_menuinst/src/linux.rs | 2 +- crates/rattler_menuinst/src/windows/terminal.rs | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index 9baa78f58..98078ed8d 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -123,15 +123,15 @@ pub fn remove_menu_items(tracker: &Vec) -> Result<(), MenuInstError> { match el { Tracker::MacOs(tracker) => { #[cfg(target_os = "macos")] - macos::remove_menu_item(&tracker).unwrap(); + macos::remove_menu_item(tracker).unwrap(); } Tracker::Linux(tracker) => { #[cfg(target_os = "linux")] - linux::remove_menu_item(&tracker).unwrap(); + linux::remove_menu_item(tracker).unwrap(); } Tracker::Windows(tracker) => { #[cfg(target_os = "windows")] - windows::remove_menu_item(&tracker)?; + windows::remove_menu_item(tracker)?; } } } diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index 715bcf568..d8006a67e 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -636,7 +636,7 @@ pub fn remove_menu_item(tracker: &LinuxTracker) -> Result<(), MenuInstError> { let mut config = MimeConfig::load(&installed_mime_types.config_file)?; let application = &installed_mime_types.application; for mime_type in &installed_mime_types.mime_types { - config.deregister_mime_type(&mime_type, &application); + config.deregister_mime_type(mime_type, application); } config.save()?; diff --git a/crates/rattler_menuinst/src/windows/terminal.rs b/crates/rattler_menuinst/src/windows/terminal.rs index e644b2d57..47c24c795 100644 --- a/crates/rattler_menuinst/src/windows/terminal.rs +++ b/crates/rattler_menuinst/src/windows/terminal.rs @@ -48,7 +48,7 @@ pub enum TerminalUpdateError { /// /// # Arguments /// * `location` - Path to the settings.json file -/// * `profile` - The TerminalProfile to add or update +/// * `profile` - The `TerminalProfile` to add or update /// /// # Errors /// Returns a `TerminalUpdateError` if file operations or JSON serialization/deserialization fail. @@ -156,7 +156,7 @@ pub fn remove_terminal_profile(location: &Path, name: &str) -> Result<(), Termin /// /// # Arguments /// * `mode` - The `MenuMode` specifying the context; only `User` mode is supported. -/// * `folders` - A `Folders` instance providing access to known folder paths (e.g., LocalAppData). +/// * `folders` - A `Folders` instance providing access to known folder paths (e.g., `LocalAppData`). /// /// # Returns /// A vector of `PathBuf` objects representing the locations of `settings.json` files. From 800d64272b7bdf413c8c1b59f0512ee94c22c381 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Thu, 20 Feb 2025 19:12:14 +0100 Subject: [PATCH 101/132] fix docs --- crates/rattler_conda_types/src/menuinst/mod.rs | 2 +- crates/rattler_menuinst/src/macos.rs | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/crates/rattler_conda_types/src/menuinst/mod.rs b/crates/rattler_conda_types/src/menuinst/mod.rs index 00472e9a3..4f4f09813 100644 --- a/crates/rattler_conda_types/src/menuinst/mod.rs +++ b/crates/rattler_conda_types/src/menuinst/mod.rs @@ -1,4 +1,4 @@ -//! Define types that can be serialized into a [`PrefixRecord`] to track +//! Define types that can be serialized into a `PrefixRecord` to track //! menu entries installed into the system. use serde::{Deserialize, Serialize}; use std::path::PathBuf; diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index 52bc1fc8e..86a7f0544 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -799,12 +799,13 @@ pub(crate) fn remove_menu_item(tracker: &MacOsTracker) -> Result, V #[cfg(test)] mod tests { - use crate::{schema::MenuInstSchema, test::test_data, tracker::MacOsTracker, MenuMode}; + use crate::{schema::MenuInstSchema, test::test_data, MenuMode}; use std::{ collections::HashMap, fs, path::{Path, PathBuf}, }; + use rattler_conda_types::menuinst::MacOsTracker; use tempfile::TempDir; impl super::Directories { From 075e242d99c182d001f6a0054bb9248eb87506ae Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Fri, 21 Feb 2025 11:06:34 +0100 Subject: [PATCH 102/132] fmt --- crates/rattler_menuinst/src/macos.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index 86a7f0544..b6407968d 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -800,12 +800,12 @@ pub(crate) fn remove_menu_item(tracker: &MacOsTracker) -> Result, V #[cfg(test)] mod tests { use crate::{schema::MenuInstSchema, test::test_data, MenuMode}; + use rattler_conda_types::menuinst::MacOsTracker; use std::{ collections::HashMap, fs, path::{Path, PathBuf}, }; - use rattler_conda_types::menuinst::MacOsTracker; use tempfile::TempDir; impl super::Directories { From ee82081401c7f347df5c971c61b94f74f7975703 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Fri, 21 Feb 2025 11:29:24 +0100 Subject: [PATCH 103/132] add in `installed_system_menus` to python bindings --- py-rattler/src/record.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/py-rattler/src/record.rs b/py-rattler/src/record.rs index da2884e0d..29e74a0be 100644 --- a/py-rattler/src/record.rs +++ b/py-rattler/src/record.rs @@ -237,6 +237,8 @@ impl PyRecord { paths_data: paths_data.into(), link: link.map(Into::into), requested_spec, + // TODO wire up support + installed_system_menus: Vec::new(), }), }) } From 55f9b31d5d65ac4f141c73d5d55c27a7daa14235 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Fri, 21 Feb 2025 11:38:19 +0100 Subject: [PATCH 104/132] make things a bit nicer perhaps --- crates/rattler_conda_types/src/menuinst/mod.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/rattler_conda_types/src/menuinst/mod.rs b/crates/rattler_conda_types/src/menuinst/mod.rs index 4f4f09813..62973ba8d 100644 --- a/crates/rattler_conda_types/src/menuinst/mod.rs +++ b/crates/rattler_conda_types/src/menuinst/mod.rs @@ -16,6 +16,7 @@ pub enum MenuMode { /// Tracker for menu entries installed into the system #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[serde(tag = "type", rename_all = "snake_case")] pub enum Tracker { /// Linux tracker Linux(LinuxTracker), From 806faa6d3f3a7821fb61444bd7288d6d8615995b Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Fri, 21 Feb 2025 13:13:33 +0100 Subject: [PATCH 105/132] stricter typing for macos version and other macos types --- crates/rattler_menuinst/src/macos.rs | 14 +-- crates/rattler_menuinst/src/schema.rs | 131 +++++++++++++++++++++++++- 2 files changed, 130 insertions(+), 15 deletions(-) diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index b6407968d..0475e2897 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -156,7 +156,7 @@ impl CFBundleDocumentTypesModel { } if let Some(role) = &self.cf_bundle_type_role { - type_dict.insert("CFBundleTypeRole".into(), Value::String(role.clone())); + type_dict.insert("CFBundleTypeRole".into(), role.to_value()); } type_dict.insert( @@ -169,10 +169,7 @@ impl CFBundleDocumentTypesModel { ), ); - type_dict.insert( - "LSHandlerRank".into(), - Value::String(self.ls_handler_rank.clone()), - ); + type_dict.insert("LSHandlerRank".into(), self.ls_handler_rank.to_value()); Value::Dictionary(type_dict) } @@ -183,7 +180,7 @@ impl CFBundleURLTypesModel { let mut type_dict = plist::Dictionary::new(); if let Some(role) = self.cf_bundle_type_role.clone() { - type_dict.insert("CFBundleTypeRole".into(), role.into()); + type_dict.insert("CFBundleTypeRole".into(), role.to_value()); } type_dict.insert( @@ -490,10 +487,7 @@ impl MacOSMenu { } if let Some(version) = self.item.ls_minimum_system_version.as_ref() { - pl.insert( - "LSMinimumSystemVersion".into(), - Value::String(version.clone()), - ); + pl.insert("LSMinimumSystemVersion".into(), version.to_value()); } if let Some(prohibited) = self.item.ls_multiple_instances_prohibited { diff --git a/crates/rattler_menuinst/src/schema.rs b/crates/rattler_menuinst/src/schema.rs index dfb428af9..670ce0b82 100644 --- a/crates/rattler_menuinst/src/schema.rs +++ b/crates/rattler_menuinst/src/schema.rs @@ -239,6 +239,35 @@ pub struct Linux { pub glob_patterns: Option>, } +// Enum for CFBundleTypeRole with validation +#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] +pub enum CFBundleTypeRole { + /// The app is the creator/owner of this file type + Editor, + /// The app is a viewer of this file type + Viewer, + /// The app is a shell for this file type + Shell, + /// Quick Look Generator + QLGenerator, + /// The app is not a handler for this file type + None, +} + +impl CFBundleTypeRole { + pub fn to_value(&self) -> plist::Value { + plist::Value::String( + match self { + CFBundleTypeRole::Editor => "Editor", + CFBundleTypeRole::Viewer => "Viewer", + CFBundleTypeRole::Shell => "Shell", + CFBundleTypeRole::QLGenerator => "QLGenerator", + CFBundleTypeRole::None => "None", + } + .to_string(), + ) + } +} /// Describes a URL scheme associated with the app. #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(deny_unknown_fields)] @@ -246,7 +275,7 @@ pub struct CFBundleURLTypesModel { /// This key specifies the app's role with respect to the URL. /// Can be one of `Editor`, `Viewer`, `Shell`, `None` #[serde(rename = "CFBundleTypeRole")] - pub cf_bundle_type_role: Option, + pub cf_bundle_type_role: Option, /// URL schemes / protocols handled by this type (e.g. 'mailto'). #[serde(rename = "CFBundleURLSchemes")] @@ -261,6 +290,32 @@ pub struct CFBundleURLTypesModel { pub cf_bundle_url_icon_file: Option, } +// Enum for LSHandlerRank with validation +#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] +pub enum LSHandlerRank { + /// The app is the creator/owner of this file type + Owner, + /// The app is the default handler for this file type + Default, + /// The app is an alternate handler for this file type + Alternate, + /// The app is not a handler for this file type + None, +} + +impl LSHandlerRank { + pub fn to_value(&self) -> plist::Value { + plist::Value::String( + match self { + LSHandlerRank::Owner => "Owner", + LSHandlerRank::Default => "Default", + LSHandlerRank::Alternate => "Alternate", + LSHandlerRank::None => "None", + } + .to_string(), + ) + } +} /// Describes a document type associated with the app. #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(deny_unknown_fields)] @@ -276,7 +331,7 @@ pub struct CFBundleDocumentTypesModel { /// This key specifies the app's role with respect to the type. /// Can be one of `Editor`, `Viewer`, `Shell`, `None` #[serde(rename = "CFBundleTypeRole")] - pub cf_bundle_type_role: Option, + pub cf_bundle_type_role: Option, /// List of UTI (Uniform Type Identifier) strings defining supported file types. /// @@ -296,9 +351,9 @@ pub struct CFBundleDocumentTypesModel { /// Determines how Launch Services ranks this app among the apps /// that declare themselves editors or viewers of files of this type. - /// Can be one of `Owner`, `Default` or `Alternate` + /// Can be one of `Owner`, `Default`, `Alternate` or `None` #[serde(rename = "LSHandlerRank")] - pub ls_handler_rank: String, // TODO implement validation + pub ls_handler_rank: LSHandlerRank, } /// A model representing a Uniform Type Identifier (UTI) declaration. @@ -330,6 +385,58 @@ pub struct UTTypeDeclarationModel { pub ut_type_tag_specification: HashMap>, } +/// macOS version number. +#[derive(Debug, Clone)] +pub struct MacOSVersion(Vec); + +impl Serialize for MacOSVersion { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + self.0 + .iter() + .map(|v| v.to_string()) + .collect::>() + .join(".") + .serialize(serializer) + } +} + +impl<'de> Deserialize<'de> for MacOSVersion { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + let s = String::deserialize(deserializer)?; + let version = s + .split('.') + .map(|s| s.parse()) + .collect::, _>>() + .map_err(serde::de::Error::custom)?; + + if version.len() > 3 { + return Err(serde::de::Error::custom( + "Version number must have at most 3 components", + )); + } + + Ok(MacOSVersion(version)) + } +} + +impl MacOSVersion { + pub fn to_value(&self) -> plist::Value { + plist::Value::String( + self.0 + .iter() + .map(|v| v.to_string()) + .collect::>() + .join("."), + ) + } +} + /// macOS specific fields in the menuinst. For more information on the keys, read the following URLs /// /// - `CF*` keys: see `Core Foundation Keys ` @@ -389,7 +496,7 @@ pub struct MacOS { /// Minimum version of macOS required for this app to run, as `x.y.z`. /// For example, for macOS v10.4 and later, use `10.4.0`. (TODO: implement proper parsing) #[serde(rename = "LSMinimumSystemVersion")] - pub ls_minimum_system_version: Option, + pub ls_minimum_system_version: Option, /// Whether an app is prohibited from running simultaneously in multiple user sessions. #[serde(rename = "LSMultipleInstancesProhibited")] @@ -604,4 +711,18 @@ mod test { let schema: super::MenuInstSchema = serde_json::from_str(&schema_str).unwrap(); insta::assert_debug_snapshot!(schema); } + + /// Test macOS version parsing + #[test] + fn test_macos_version() { + let version = super::MacOSVersion(vec![10, 15, 0]); + assert_eq!( + version.to_value(), + plist::Value::String("10.15.0".to_string()) + ); + + // parsing from string + let version: super::MacOSVersion = serde_json::from_str("\"10.15.0\"").unwrap(); + assert_eq!(version.0, vec![10, 15, 0]); + } } From f0555d71b7a6243594a98a4d3c13e9bec641c390 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Fri, 21 Feb 2025 13:16:08 +0100 Subject: [PATCH 106/132] fix clippy and tests --- crates/rattler_menuinst/src/schema.rs | 6 +++--- .../rattler_menuinst__schema__test__deserialize_spyder.snap | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/crates/rattler_menuinst/src/schema.rs b/crates/rattler_menuinst/src/schema.rs index 670ce0b82..c08f8e224 100644 --- a/crates/rattler_menuinst/src/schema.rs +++ b/crates/rattler_menuinst/src/schema.rs @@ -396,7 +396,7 @@ impl Serialize for MacOSVersion { { self.0 .iter() - .map(|v| v.to_string()) + .map(ToString::to_string) .collect::>() .join(".") .serialize(serializer) @@ -411,7 +411,7 @@ impl<'de> Deserialize<'de> for MacOSVersion { let s = String::deserialize(deserializer)?; let version = s .split('.') - .map(|s| s.parse()) + .map(str::parse) .collect::, _>>() .map_err(serde::de::Error::custom)?; @@ -430,7 +430,7 @@ impl MacOSVersion { plist::Value::String( self.0 .iter() - .map(|v| v.to_string()) + .map(ToString::to_string) .collect::>() .join("."), ) diff --git a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_spyder.snap b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_spyder.snap index b68a73a7d..7da7579e2 100644 --- a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_spyder.snap +++ b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_spyder.snap @@ -171,7 +171,7 @@ MenuInstSchema { ), ), cf_bundle_type_role: Some( - "Editor", + Editor, ), ls_item_content_types: [ PlaceholderString( @@ -466,7 +466,7 @@ MenuInstSchema { "public.zsh-script", ), ], - ls_handler_rank: "Default", + ls_handler_rank: Default, }, ], ), From fba48330f0116a321b272f0ac39a7c6b2d0feddd Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Fri, 21 Feb 2025 14:10:51 +0100 Subject: [PATCH 107/132] move macos specific stuff --- crates/rattler_menuinst/src/macos.rs | 66 ++++++++++++++++++++++++--- crates/rattler_menuinst/src/schema.rs | 56 +---------------------- 2 files changed, 61 insertions(+), 61 deletions(-) diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index 0475e2897..e91f6309d 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -18,8 +18,7 @@ use rattler_shell::{ use crate::{ render::{resolve, BaseMenuItemPlaceholders, MenuItemPlaceholders}, schema::{ - CFBundleDocumentTypesModel, CFBundleURLTypesModel, MacOS, MenuItemCommand, - UTTypeDeclarationModel, + CFBundleDocumentTypesModel, CFBundleTypeRole, CFBundleURLTypesModel, LSHandlerRank, MacOS, MacOSVersion, MenuItemCommand, UTTypeDeclarationModel }, slugify, util::run_pre_create_command, @@ -156,7 +155,7 @@ impl CFBundleDocumentTypesModel { } if let Some(role) = &self.cf_bundle_type_role { - type_dict.insert("CFBundleTypeRole".into(), role.to_value()); + type_dict.insert("CFBundleTypeRole".into(), role.to_plist()); } type_dict.insert( @@ -169,7 +168,7 @@ impl CFBundleDocumentTypesModel { ), ); - type_dict.insert("LSHandlerRank".into(), self.ls_handler_rank.to_value()); + type_dict.insert("LSHandlerRank".into(), self.ls_handler_rank.to_plist()); Value::Dictionary(type_dict) } @@ -180,7 +179,7 @@ impl CFBundleURLTypesModel { let mut type_dict = plist::Dictionary::new(); if let Some(role) = self.cf_bundle_type_role.clone() { - type_dict.insert("CFBundleTypeRole".into(), role.to_value()); + type_dict.insert("CFBundleTypeRole".into(), role.to_plist()); } type_dict.insert( @@ -209,6 +208,47 @@ impl CFBundleURLTypesModel { } } +impl MacOSVersion { + pub fn to_plist(&self) -> plist::Value { + plist::Value::String( + self.0 + .iter() + .map(ToString::to_string) + .collect::>() + .join("."), + ) + } +} + +impl LSHandlerRank { + pub fn to_plist(&self) -> plist::Value { + plist::Value::String( + match self { + LSHandlerRank::Owner => "Owner", + LSHandlerRank::Default => "Default", + LSHandlerRank::Alternate => "Alternate", + LSHandlerRank::None => "None", + } + .to_string(), + ) + } +} + +impl CFBundleTypeRole { + pub fn to_plist(&self) -> plist::Value { + plist::Value::String( + match self { + CFBundleTypeRole::Editor => "Editor", + CFBundleTypeRole::Viewer => "Viewer", + CFBundleTypeRole::Shell => "Shell", + CFBundleTypeRole::QLGenerator => "QLGenerator", + CFBundleTypeRole::None => "None", + } + .to_string(), + ) + } +} + /// Call `lsregister` with args fn lsregister(args: &[&str], directory: &Path) -> Result<(), MenuInstError> { let exe = "/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister"; @@ -487,7 +527,7 @@ impl MacOSMenu { } if let Some(version) = self.item.ls_minimum_system_version.as_ref() { - pl.insert("LSMinimumSystemVersion".into(), version.to_value()); + pl.insert("LSMinimumSystemVersion".into(), version.to_plist()); } if let Some(prohibited) = self.item.ls_multiple_instances_prohibited { @@ -919,4 +959,18 @@ mod tests { fs::read_to_string(dirs.location.join("Contents/Info.plist")).unwrap() ); } + + /// Test macOS version parsing + #[test] + fn test_macos_version() { + let version = super::MacOSVersion(vec![10, 15, 0]); + assert_eq!( + version.to_plist(), + plist::Value::String("10.15.0".to_string()) + ); + + // parsing from string + let version: super::MacOSVersion = serde_json::from_str("\"10.15.0\"").unwrap(); + assert_eq!(version.0, vec![10, 15, 0]); + } } diff --git a/crates/rattler_menuinst/src/schema.rs b/crates/rattler_menuinst/src/schema.rs index c08f8e224..a61867e4f 100644 --- a/crates/rattler_menuinst/src/schema.rs +++ b/crates/rattler_menuinst/src/schema.rs @@ -254,20 +254,6 @@ pub enum CFBundleTypeRole { None, } -impl CFBundleTypeRole { - pub fn to_value(&self) -> plist::Value { - plist::Value::String( - match self { - CFBundleTypeRole::Editor => "Editor", - CFBundleTypeRole::Viewer => "Viewer", - CFBundleTypeRole::Shell => "Shell", - CFBundleTypeRole::QLGenerator => "QLGenerator", - CFBundleTypeRole::None => "None", - } - .to_string(), - ) - } -} /// Describes a URL scheme associated with the app. #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(deny_unknown_fields)] @@ -303,19 +289,6 @@ pub enum LSHandlerRank { None, } -impl LSHandlerRank { - pub fn to_value(&self) -> plist::Value { - plist::Value::String( - match self { - LSHandlerRank::Owner => "Owner", - LSHandlerRank::Default => "Default", - LSHandlerRank::Alternate => "Alternate", - LSHandlerRank::None => "None", - } - .to_string(), - ) - } -} /// Describes a document type associated with the app. #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(deny_unknown_fields)] @@ -387,7 +360,7 @@ pub struct UTTypeDeclarationModel { /// macOS version number. #[derive(Debug, Clone)] -pub struct MacOSVersion(Vec); +pub struct MacOSVersion(pub(crate) Vec); impl Serialize for MacOSVersion { fn serialize(&self, serializer: S) -> Result @@ -424,19 +397,6 @@ impl<'de> Deserialize<'de> for MacOSVersion { Ok(MacOSVersion(version)) } } - -impl MacOSVersion { - pub fn to_value(&self) -> plist::Value { - plist::Value::String( - self.0 - .iter() - .map(ToString::to_string) - .collect::>() - .join("."), - ) - } -} - /// macOS specific fields in the menuinst. For more information on the keys, read the following URLs /// /// - `CF*` keys: see `Core Foundation Keys ` @@ -711,18 +671,4 @@ mod test { let schema: super::MenuInstSchema = serde_json::from_str(&schema_str).unwrap(); insta::assert_debug_snapshot!(schema); } - - /// Test macOS version parsing - #[test] - fn test_macos_version() { - let version = super::MacOSVersion(vec![10, 15, 0]); - assert_eq!( - version.to_value(), - plist::Value::String("10.15.0".to_string()) - ); - - // parsing from string - let version: super::MacOSVersion = serde_json::from_str("\"10.15.0\"").unwrap(); - assert_eq!(version.0, vec![10, 15, 0]); - } } From 56c81714f9e1a2a5d1b3a43615411c98e84a74a9 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Fri, 21 Feb 2025 14:11:09 +0100 Subject: [PATCH 108/132] fmt --- crates/rattler_menuinst/src/macos.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index e91f6309d..797142a81 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -18,7 +18,8 @@ use rattler_shell::{ use crate::{ render::{resolve, BaseMenuItemPlaceholders, MenuItemPlaceholders}, schema::{ - CFBundleDocumentTypesModel, CFBundleTypeRole, CFBundleURLTypesModel, LSHandlerRank, MacOS, MacOSVersion, MenuItemCommand, UTTypeDeclarationModel + CFBundleDocumentTypesModel, CFBundleTypeRole, CFBundleURLTypesModel, LSHandlerRank, MacOS, + MacOSVersion, MenuItemCommand, UTTypeDeclarationModel, }, slugify, util::run_pre_create_command, From 1e78cde63eb5e14d9c5356a27c88419888ead835 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Sun, 23 Feb 2025 23:55:03 +0100 Subject: [PATCH 109/132] simplify --- crates/rattler_menuinst/src/lib.rs | 2 +- crates/rattler_menuinst/src/macos.rs | 62 +++++++++------------------ crates/rattler_menuinst/src/schema.rs | 6 ++- 3 files changed, 26 insertions(+), 44 deletions(-) diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index 98078ed8d..c7f7a99f2 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -127,7 +127,7 @@ pub fn remove_menu_items(tracker: &Vec) -> Result<(), MenuInstError> { } Tracker::Linux(tracker) => { #[cfg(target_os = "linux")] - linux::remove_menu_item(tracker).unwrap(); + linux::remove_menu_item(tracker)?; } Tracker::Windows(tracker) => { #[cfg(target_os = "windows")] diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index 797142a81..70555736f 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -1,6 +1,5 @@ use std::{ - collections::HashMap, - io::{BufWriter, Write}, + io::Write, os::unix::fs::PermissionsExt, path::{Path, PathBuf}, process::Command, @@ -11,7 +10,7 @@ use fs_err::File; use plist::Value; use rattler_conda_types::{menuinst::MacOsTracker, Platform}; use rattler_shell::{ - activation::{ActivationVariables, Activator}, + activation::{ActivationError, ActivationVariables, Activator}, shell, }; @@ -347,13 +346,7 @@ impl MacOSMenu { run_pre_create_command(&pre_create_command)?; } - for (src, dest) in self - .item - .link_in_bundle - .as_ref() - .unwrap_or(&HashMap::new()) - .iter() - { + for (src, dest) in &self.item.link_in_bundle { let src = src.resolve(&self.placeholders); let dest = dest.resolve(&self.placeholders); let rendered_dest = self.directories.location.join(&dest); @@ -584,35 +577,28 @@ impl MacOSMenu { pl.insert("CFBundleURLTypes".into(), Value::Array(url_array)); } - tracing::info!( - "Writing plist to {}", - self.directories - .location - .join("Contents/Info.plist") - .display() - ); - plist::to_file_xml(self.directories.location.join("Contents/Info.plist"), &pl)?; - - Ok(()) + let plist_target = self.directories.location.join("Contents/Info.plist"); + tracing::info!("Writing plist to {:?}", plist_target); + Ok(plist::to_file_xml(plist_target, &pl)?) } fn sign_with_entitlements(&self) -> Result<(), MenuInstError> { // write a plist file with the entitlements to the filesystem - let mut entitlements = plist::Dictionary::new(); - if let Some(entitlements_list) = &self.item.entitlements { - for e in entitlements_list { - entitlements.insert(e.to_string(), Value::Boolean(true)); - } - } else { + if self.item.entitlements.is_empty() { return Ok(()); } + let mut entitlements = plist::Dictionary::new(); + + for e in &self.item.entitlements { + entitlements.insert(e.to_string(), Value::Boolean(true)); + } + let entitlements_file = self .directories .location .join("Contents/Entitlements.plist"); - let writer = BufWriter::new(File::create(&entitlements_file)?); - plist::to_writer_xml(writer, &entitlements)?; + plist::to_file_xml(&entitlements_file, &entitlements)?; // sign the .app directory with the entitlements let _codesign = Command::new("/usr/bin/codesign") @@ -627,13 +613,13 @@ impl MacOSMenu { .arg(format!("com.{}", slugify(&self.name))) .arg("--entitlements") .arg(&entitlements_file) - .arg(self.directories.location.to_str().unwrap()) + .arg(&self.directories.location) .output()?; Ok(()) } - fn command(&self) -> String { + fn command(&self) -> Result { let mut lines = vec!["#!/bin/sh".to_string()]; if self.command.terminal.unwrap_or(false) { @@ -658,11 +644,8 @@ impl MacOSMenu { // Run a cached activation if self.command.activate.unwrap_or(false) { // create a bash activation script and emit it into the script - let activator = - Activator::from_path(&self.prefix, shell::Bash, Platform::current()).unwrap(); - let activation_env = activator - .run_activation(ActivationVariables::default(), None) - .unwrap(); + let activator = Activator::from_path(&self.prefix, shell::Bash, Platform::current())?; + let activation_env = activator.run_activation(ActivationVariables::default(), None)?; for (k, v) in activation_env { lines.push(format!(r#"export {k}="{v}""#)); @@ -676,20 +659,17 @@ impl MacOSMenu { .map(|s| s.resolve(&self.placeholders)); lines.push(utils::quote_args(command).join(" ")); - lines.join("\n") + Ok(lines.join("\n")) } fn write_appkit_launcher(&self) -> Result { - // let launcher_path = launcher_path.unwrap_or_else(|| - // self.default_appkit_launcher_path()); #[cfg(target_arch = "aarch64")] let launcher_bytes = include_bytes!("../data/appkit_launcher_arm64"); #[cfg(target_arch = "x86_64")] let launcher_bytes = include_bytes!("../data/appkit_launcher_x86_64"); let launcher_path = self.default_appkit_launcher_path(); - let mut file = File::create(&launcher_path)?; - file.write_all(launcher_bytes)?; + fs::write(&launcher_path, launcher_bytes)?; fs::set_permissions(&launcher_path, std::fs::Permissions::from_mode(0o755))?; Ok(launcher_path) @@ -718,7 +698,7 @@ impl MacOSMenu { }); tracing::info!("Writing script to {}", script_path.display()); let mut file = File::create(&script_path)?; - file.write_all(self.command().as_bytes())?; + file.write_all(self.command()?.as_bytes())?; fs::set_permissions(&script_path, std::fs::Permissions::from_mode(0o755))?; Ok(script_path) } diff --git a/crates/rattler_menuinst/src/schema.rs b/crates/rattler_menuinst/src/schema.rs index a61867e4f..1b3c56e40 100644 --- a/crates/rattler_menuinst/src/schema.rs +++ b/crates/rattler_menuinst/src/schema.rs @@ -482,12 +482,14 @@ pub struct MacOS { /// List of permissions to request for the launched application. /// See `the entitlements docs ` /// for a full list of possible values. - pub entitlements: Option>, + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub entitlements: Vec, /// Paths that should be symlinked into the shortcut app bundle. /// It takes a mapping of source to destination paths. Destination paths must be /// relative. Placeholder `{{ MENU_ITEM_LOCATION }}` can be useful. - pub link_in_bundle: Option>, + #[serde(default, skip_serializing_if = "HashMap::is_empty")] + pub link_in_bundle: HashMap, /// Required shell script logic to handle opened URL payloads. pub event_handler: Option, From ba4e8f4592f1906ab364b97f750121a7accafff9 Mon Sep 17 00:00:00 2001 From: Ruben Arts Date: Mon, 24 Feb 2025 09:28:53 +0100 Subject: [PATCH 110/132] remove index map --- crates/rattler_menuinst/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/rattler_menuinst/Cargo.toml b/crates/rattler_menuinst/Cargo.toml index 60f5d0f45..4831defab 100644 --- a/crates/rattler_menuinst/Cargo.toml +++ b/crates/rattler_menuinst/Cargo.toml @@ -28,7 +28,7 @@ which = "7.0.0" known-folders = "1.2.0" quick-xml = "0.37.1" chrono = { workspace = true, features = ["clock"] } -configparser = { version = "3.1.0", features = ["indexmap"] } +configparser = { version = "3.1.0" } [target.'cfg(target_os = "windows")'.dependencies] windows = { version = "0.59.0", features = [ From eafca67b699ead4728459989cacd367e219c6914 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Mon, 24 Feb 2025 09:33:49 +0100 Subject: [PATCH 111/132] clean up cargo.toml --- Cargo.toml | 1 + crates/rattler_menuinst/Cargo.toml | 17 +++++++++++------ crates/rattler_menuinst/src/macos.rs | 5 ++--- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 53e9b975d..ba1fde538 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -169,6 +169,7 @@ url = { version = "2.5.4" } unicode-normalization = "0.1.24" uuid = { version = "1.13.1", default-features = false } walkdir = "2.5.0" +which = "7.0.2" windows-sys = { version = "0.59.0", default-features = false } winver = { version = "1.0.0" } zip = { version = "2.2.2", default-features = false } diff --git a/crates/rattler_menuinst/Cargo.toml b/crates/rattler_menuinst/Cargo.toml index 4831defab..033136f74 100644 --- a/crates/rattler_menuinst/Cargo.toml +++ b/crates/rattler_menuinst/Cargo.toml @@ -11,7 +11,6 @@ license.workspace = true readme.workspace = true [dependencies] -plist = { workspace = true } dirs = { workspace = true } serde = { workspace = true, features = ["derive"] } shlex = { workspace = true } @@ -24,20 +23,26 @@ unicode-normalization = { workspace = true } regex = { workspace = true } tempfile = { workspace = true } fs-err = { workspace = true } -which = "7.0.0" -known-folders = "1.2.0" -quick-xml = "0.37.1" +which = { workspace = true } chrono = { workspace = true, features = ["clock"] } + +[target.'cfg(target_os = "macos")'.dependencies] +plist = { workspace = true } +sha2 = { workspace = true } + +[target.'cfg(target_os = "linux")'.dependencies] +quick-xml = "0.37.1" configparser = { version = "3.1.0" } [target.'cfg(target_os = "windows")'.dependencies] -windows = { version = "0.59.0", features = [ +known-folders = "1.2.0" +windows = { version = "0.60.0", features = [ "Win32_System_Com_StructuredStorage", "Win32_UI_Shell_PropertiesSystem", "Win32_Storage_EnhancedStorage", "Win32_System_Variant", ]} -windows-registry = "0.4.0" +windows-registry = "0.5.0" [dev-dependencies] insta = { workspace = true, features = ["json"] } diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index 70555736f..348a485ae 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -13,6 +13,7 @@ use rattler_shell::{ activation::{ActivationError, ActivationVariables, Activator}, shell, }; +use sha2::{Digest as _, Sha256}; use crate::{ render::{resolve, BaseMenuItemPlaceholders, MenuItemPlaceholders}, @@ -414,9 +415,7 @@ impl MacOSMenu { let name = self.name.clone(); let slugname = slugify(&name); let shortname = if slugname.len() > 16 { - // let hashed = format!("{:x}", Sha256::digest(slugname.as_bytes())); - // TODO - let hashed = "123456"; + let hashed = format!("{:x}", Sha256::digest(slugname.as_bytes())); format!("{}{}", &slugname[..10], &hashed[..6]) } else { slugname.clone() From 1f0185e4677e99253357bcaa7f84138cb2acc9db Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Mon, 24 Feb 2025 09:36:31 +0100 Subject: [PATCH 112/132] update single lib --- crates/rattler_menuinst/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/rattler_menuinst/Cargo.toml b/crates/rattler_menuinst/Cargo.toml index 033136f74..ea90765fd 100644 --- a/crates/rattler_menuinst/Cargo.toml +++ b/crates/rattler_menuinst/Cargo.toml @@ -31,7 +31,7 @@ plist = { workspace = true } sha2 = { workspace = true } [target.'cfg(target_os = "linux")'.dependencies] -quick-xml = "0.37.1" +quick-xml = "0.37.2" configparser = { version = "3.1.0" } [target.'cfg(target_os = "windows")'.dependencies] From 9c4f43a7d9d7ad55fe844ab2e644a3d9d16e995e Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Mon, 24 Feb 2025 09:57:16 +0100 Subject: [PATCH 113/132] move things around --- crates/rattler_menuinst/src/lib.rs | 4 --- crates/rattler_menuinst/src/macos.rs | 27 ++++++++++--------- crates/rattler_menuinst/src/render.rs | 20 -------------- crates/rattler_menuinst/src/schema.rs | 8 +++--- ...nuinst__schema__test__deserialize_mne.snap | 10 +++---- ...nst__schema__test__deserialize_spyder.snap | 16 +++++------ crates/rattler_menuinst/src/utils/mod.rs | 5 ++++ .../src/{ => utils}/slugify.rs | 4 +-- .../src/{util.rs => utils/terminal.rs} | 4 ++- 9 files changed, 41 insertions(+), 57 deletions(-) rename crates/rattler_menuinst/src/{ => utils}/slugify.rs (90%) rename crates/rattler_menuinst/src/{util.rs => utils/terminal.rs} (93%) diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index c7f7a99f2..8b6376aa1 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -14,13 +14,9 @@ mod linux; mod macos; mod render; mod schema; -mod util; #[cfg(target_os = "windows")] mod windows; -pub mod slugify; -pub use slugify::slugify; - use crate::{render::BaseMenuItemPlaceholders, schema::MenuInstSchema}; pub mod utils; diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index 348a485ae..7c1d6862d 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -21,11 +21,12 @@ use crate::{ CFBundleDocumentTypesModel, CFBundleTypeRole, CFBundleURLTypesModel, LSHandlerRank, MacOS, MacOSVersion, MenuItemCommand, UTTypeDeclarationModel, }, - slugify, - util::run_pre_create_command, - utils, MenuInstError, MenuMode, + utils::{self, log_output, run_pre_create_command}, + MenuInstError, MenuMode, }; +use crate::utils::slugify; + #[derive(Debug, Clone)] pub struct MacOSMenu { name: String, @@ -261,10 +262,7 @@ fn lsregister(args: &[&str], directory: &Path) -> Result<(), MenuInstError> { .map_err(|e| MenuInstError::InstallError(format!("failed to execute lsregister: {e}")))?; if !output.status.success() { - return Err(MenuInstError::InstallError(format!( - "lsregister failed with exit code: {}", - output.status - ))); + log_output("lsregister", output); } Ok(()) @@ -347,7 +345,11 @@ impl MacOSMenu { run_pre_create_command(&pre_create_command)?; } - for (src, dest) in &self.item.link_in_bundle { + let Some(link_in_bundle) = &self.item.link_in_bundle else { + return Ok(()); + }; + + for (src, dest) in link_in_bundle { let src = src.resolve(&self.placeholders); let dest = dest.resolve(&self.placeholders); let rendered_dest = self.directories.location.join(&dest); @@ -370,6 +372,7 @@ impl MacOSMenu { rendered_dest.display() ); } + Ok(()) } @@ -583,14 +586,14 @@ impl MacOSMenu { fn sign_with_entitlements(&self) -> Result<(), MenuInstError> { // write a plist file with the entitlements to the filesystem - if self.item.entitlements.is_empty() { + let Some(item_entitlements) = &self.item.entitlements else { return Ok(()); - } + }; let mut entitlements = plist::Dictionary::new(); - for e in &self.item.entitlements { - entitlements.insert(e.to_string(), Value::Boolean(true)); + for e in item_entitlements { + entitlements.insert(e.clone(), Value::Boolean(true)); } let entitlements_file = self diff --git a/crates/rattler_menuinst/src/render.rs b/crates/rattler_menuinst/src/render.rs index 0d07c1719..7aef34bac 100644 --- a/crates/rattler_menuinst/src/render.rs +++ b/crates/rattler_menuinst/src/render.rs @@ -128,23 +128,3 @@ fn replace_placeholders(mut text: String, replacements: &HashMap } text } - -#[cfg(test)] -mod test { - // use crate::render::render; - - // #[test] - // fn test_render_gnuradio() { - // let test_data = crate::test::test_data(); - // let schema_path = test_data.join("gnuradio/gnuradio-grc.json"); - // - // let placeholders = crate::render::placeholders( - // Path::new("/home/base_prefix"), - // Path::new("/home/prefix"), - // &rattler_conda_types::Platform::Linux64, - // ); - // - // let schema = render(&schema_path, &placeholders).unwrap(); - // insta::assert_debug_snapshot!(schema); - // } -} diff --git a/crates/rattler_menuinst/src/schema.rs b/crates/rattler_menuinst/src/schema.rs index 1b3c56e40..84c66142e 100644 --- a/crates/rattler_menuinst/src/schema.rs +++ b/crates/rattler_menuinst/src/schema.rs @@ -482,14 +482,14 @@ pub struct MacOS { /// List of permissions to request for the launched application. /// See `the entitlements docs ` /// for a full list of possible values. - #[serde(default, skip_serializing_if = "Vec::is_empty")] - pub entitlements: Vec, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub entitlements: Option>, /// Paths that should be symlinked into the shortcut app bundle. /// It takes a mapping of source to destination paths. Destination paths must be /// relative. Placeholder `{{ MENU_ITEM_LOCATION }}` can be useful. - #[serde(default, skip_serializing_if = "HashMap::is_empty")] - pub link_in_bundle: HashMap, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub link_in_bundle: Option>, /// Required shell script logic to handle opened URL payloads. pub event_handler: Option, diff --git a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_mne.snap b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_mne.snap index 171e43acf..206717e5a 100644 --- a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_mne.snap +++ b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_mne.snap @@ -131,7 +131,7 @@ MenuInstSchema { ut_imported_type_declarations: None, ns_supports_automatic_graphics_switching: None, entitlements: None, - link_in_bundle: None, + link_in_bundle: {}, event_handler: None, }, }, @@ -288,7 +288,7 @@ MenuInstSchema { ut_imported_type_declarations: None, ns_supports_automatic_graphics_switching: None, entitlements: None, - link_in_bundle: None, + link_in_bundle: {}, event_handler: None, }, }, @@ -457,7 +457,7 @@ MenuInstSchema { ut_imported_type_declarations: None, ns_supports_automatic_graphics_switching: None, entitlements: None, - link_in_bundle: None, + link_in_bundle: {}, event_handler: None, }, }, @@ -632,7 +632,7 @@ MenuInstSchema { ut_imported_type_declarations: None, ns_supports_automatic_graphics_switching: None, entitlements: None, - link_in_bundle: None, + link_in_bundle: {}, event_handler: None, }, }, @@ -804,7 +804,7 @@ MenuInstSchema { ut_imported_type_declarations: None, ns_supports_automatic_graphics_switching: None, entitlements: None, - link_in_bundle: None, + link_in_bundle: {}, event_handler: None, }, }, diff --git a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_spyder.snap b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_spyder.snap index 7da7579e2..b0634d6ca 100644 --- a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_spyder.snap +++ b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_spyder.snap @@ -480,15 +480,13 @@ MenuInstSchema { ut_imported_type_declarations: None, ns_supports_automatic_graphics_switching: None, entitlements: None, - link_in_bundle: Some( - { - PlaceholderString( - "{{ PREFIX }}/bin/python", - ): PlaceholderString( - "{{ MENU_ITEM_LOCATION }}/Contents/MacOS/python", - ), - }, - ), + link_in_bundle: { + PlaceholderString( + "{{ PREFIX }}/bin/python", + ): PlaceholderString( + "{{ MENU_ITEM_LOCATION }}/Contents/MacOS/python", + ), + }, event_handler: None, }, }, diff --git a/crates/rattler_menuinst/src/utils/mod.rs b/crates/rattler_menuinst/src/utils/mod.rs index 1ea366d0a..914e72cab 100644 --- a/crates/rattler_menuinst/src/utils/mod.rs +++ b/crates/rattler_menuinst/src/utils/mod.rs @@ -1,3 +1,8 @@ +pub mod slugify; +pub use slugify::slugify; +pub mod terminal; +pub use terminal::{log_output, run_pre_create_command}; + pub fn quote_args(args: I) -> Vec where I: IntoIterator, diff --git a/crates/rattler_menuinst/src/slugify.rs b/crates/rattler_menuinst/src/utils/slugify.rs similarity index 90% rename from crates/rattler_menuinst/src/slugify.rs rename to crates/rattler_menuinst/src/utils/slugify.rs index 19f4509ab..919ed2531 100644 --- a/crates/rattler_menuinst/src/slugify.rs +++ b/crates/rattler_menuinst/src/utils/slugify.rs @@ -6,12 +6,12 @@ pub fn slugify(text: &str) -> String { let normalized = text.nfkd().filter(char::is_ascii).collect::(); // Remove special characters, convert to lowercase, and trim - let re_special = Regex::new(r"[^\w\s-]").unwrap(); + let re_special = Regex::new(r"[^\w\s-]").expect("Invalid regex"); let without_special = re_special.replace_all(&normalized, "").to_string(); let trimmed = without_special.trim().to_lowercase(); // Replace whitespace and hyphens with a single hyphen - let re_spaces = Regex::new(r"[_\s-]+").unwrap(); + let re_spaces = Regex::new(r"[_\s-]+").expect("Invalid regex"); re_spaces.replace_all(&trimmed, "-").to_string() } diff --git a/crates/rattler_menuinst/src/util.rs b/crates/rattler_menuinst/src/utils/terminal.rs similarity index 93% rename from crates/rattler_menuinst/src/util.rs rename to crates/rattler_menuinst/src/utils/terminal.rs index b64a9f86c..fcf695f1b 100644 --- a/crates/rattler_menuinst/src/util.rs +++ b/crates/rattler_menuinst/src/utils/terminal.rs @@ -1,4 +1,6 @@ -#[allow(dead_code)] +//! Utility functions for working with the terminal output + +/// Log the output of a command to terminal pub fn log_output(cmd_info: &str, output: std::process::Output) { tracing::info!("{}: status {}", cmd_info, output.status); tracing::info!( From ac855fd7e9f24e86eaecaee060c8ec1776a97150 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Mon, 24 Feb 2025 10:14:26 +0100 Subject: [PATCH 114/132] enable indexmap for tests --- crates/rattler_menuinst/Cargo.toml | 1 + crates/rattler_menuinst/src/lib.rs | 1 + crates/rattler_menuinst/src/linux.rs | 3 +-- crates/rattler_menuinst/src/linux/menu_xml.rs | 6 ++---- ..._menuinst__schema__test__deserialize_mne.snap | 10 +++++----- ...nuinst__schema__test__deserialize_spyder.snap | 16 +++++++++------- 6 files changed, 19 insertions(+), 18 deletions(-) diff --git a/crates/rattler_menuinst/Cargo.toml b/crates/rattler_menuinst/Cargo.toml index ea90765fd..42bec7c4a 100644 --- a/crates/rattler_menuinst/Cargo.toml +++ b/crates/rattler_menuinst/Cargo.toml @@ -46,3 +46,4 @@ windows-registry = "0.5.0" [dev-dependencies] insta = { workspace = true, features = ["json"] } +configparser = { version = "3.1.0", features = ["indexmap"] } \ No newline at end of file diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index 8b6376aa1..9b8c5317b 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -31,6 +31,7 @@ pub enum MenuInstError { #[error("Failed to install menu item: {0}")] InstallError(String), + #[cfg(target_os = "macos")] #[error("Failed to create plist: {0}")] PlistError(#[from] plist::Error), #[error("Failed to sign plist: {0}")] diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index d8006a67e..e1fb18b10 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -16,8 +16,7 @@ use rattler_shell::activation::{ActivationVariables, Activator}; use rattler_shell::shell; use crate::render::{BaseMenuItemPlaceholders, MenuItemPlaceholders, PlaceholderString}; -use crate::slugify; -use crate::util::{log_output, run_pre_create_command}; +use crate::utils::{log_output, run_pre_create_command, slugify}; use crate::{ schema::{Linux, MenuItemCommand}, MenuInstError, diff --git a/crates/rattler_menuinst/src/linux/menu_xml.rs b/crates/rattler_menuinst/src/linux/menu_xml.rs index c9a7dece6..07fad51c4 100644 --- a/crates/rattler_menuinst/src/linux/menu_xml.rs +++ b/crates/rattler_menuinst/src/linux/menu_xml.rs @@ -1,12 +1,10 @@ -#![allow(dead_code)] use chrono::Utc; use fs_err::{self as fs, File}; -use quick_xml::events::Event; -use quick_xml::{Reader, Writer}; +use quick_xml::{events::Event, Reader, Writer}; use std::io::Write; use std::path::PathBuf; -use crate::{slugify, MenuInstError}; +use crate::{utils::slugify, MenuInstError}; pub struct MenuXml { menu_config_location: PathBuf, diff --git a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_mne.snap b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_mne.snap index 206717e5a..171e43acf 100644 --- a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_mne.snap +++ b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_mne.snap @@ -131,7 +131,7 @@ MenuInstSchema { ut_imported_type_declarations: None, ns_supports_automatic_graphics_switching: None, entitlements: None, - link_in_bundle: {}, + link_in_bundle: None, event_handler: None, }, }, @@ -288,7 +288,7 @@ MenuInstSchema { ut_imported_type_declarations: None, ns_supports_automatic_graphics_switching: None, entitlements: None, - link_in_bundle: {}, + link_in_bundle: None, event_handler: None, }, }, @@ -457,7 +457,7 @@ MenuInstSchema { ut_imported_type_declarations: None, ns_supports_automatic_graphics_switching: None, entitlements: None, - link_in_bundle: {}, + link_in_bundle: None, event_handler: None, }, }, @@ -632,7 +632,7 @@ MenuInstSchema { ut_imported_type_declarations: None, ns_supports_automatic_graphics_switching: None, entitlements: None, - link_in_bundle: {}, + link_in_bundle: None, event_handler: None, }, }, @@ -804,7 +804,7 @@ MenuInstSchema { ut_imported_type_declarations: None, ns_supports_automatic_graphics_switching: None, entitlements: None, - link_in_bundle: {}, + link_in_bundle: None, event_handler: None, }, }, diff --git a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_spyder.snap b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_spyder.snap index b0634d6ca..7da7579e2 100644 --- a/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_spyder.snap +++ b/crates/rattler_menuinst/src/snapshots/rattler_menuinst__schema__test__deserialize_spyder.snap @@ -480,13 +480,15 @@ MenuInstSchema { ut_imported_type_declarations: None, ns_supports_automatic_graphics_switching: None, entitlements: None, - link_in_bundle: { - PlaceholderString( - "{{ PREFIX }}/bin/python", - ): PlaceholderString( - "{{ MENU_ITEM_LOCATION }}/Contents/MacOS/python", - ), - }, + link_in_bundle: Some( + { + PlaceholderString( + "{{ PREFIX }}/bin/python", + ): PlaceholderString( + "{{ MENU_ITEM_LOCATION }}/Contents/MacOS/python", + ), + }, + ), event_handler: None, }, }, From 86515a34821f9a99246a36eec4b95de15017a054 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Mon, 24 Feb 2025 10:50:55 +0100 Subject: [PATCH 115/132] more clean up for linux --- crates/rattler_menuinst/Cargo.toml | 2 +- crates/rattler_menuinst/src/lib.rs | 7 +++ crates/rattler_menuinst/src/linux.rs | 46 +++++++++---------- crates/rattler_menuinst/src/linux/menu_xml.rs | 3 ++ 4 files changed, 33 insertions(+), 25 deletions(-) diff --git a/crates/rattler_menuinst/Cargo.toml b/crates/rattler_menuinst/Cargo.toml index 42bec7c4a..40ecf0ec8 100644 --- a/crates/rattler_menuinst/Cargo.toml +++ b/crates/rattler_menuinst/Cargo.toml @@ -13,7 +13,6 @@ readme.workspace = true [dependencies] dirs = { workspace = true } serde = { workspace = true, features = ["derive"] } -shlex = { workspace = true } serde_json = { workspace = true } tracing = { workspace = true } rattler_conda_types = { path = "../rattler_conda_types", default-features = false } @@ -33,6 +32,7 @@ sha2 = { workspace = true } [target.'cfg(target_os = "linux")'.dependencies] quick-xml = "0.37.2" configparser = { version = "3.1.0" } +shlex = { workspace = true } [target.'cfg(target_os = "windows")'.dependencies] known-folders = "1.2.0" diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index 9b8c5317b..0c340a246 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -31,6 +31,13 @@ pub enum MenuInstError { #[error("Failed to install menu item: {0}")] InstallError(String), + #[error("Invalid path: {0}")] + InvalidPath(PathBuf), + + #[cfg(target_os = "linux")] + #[error("Could not quote command with shlex: {0}")] + ShlexQuoteError(#[from] shlex::QuoteError), + #[cfg(target_os = "macos")] #[error("Failed to create plist: {0}")] PlistError(#[from] plist::Error), diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index e1fb18b10..5d1e5d9aa 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -83,8 +83,8 @@ impl Directories { ) } else { ( - dirs::config_dir().expect("Could not get config dir"), - dirs::data_dir().expect("Could not get data dir"), + dirs::config_dir().expect("could not get config dir"), + dirs::data_dir().expect("could not get data dir"), ) }; @@ -106,12 +106,13 @@ impl Directories { fs::create_dir_all(&self.config_directory)?; let paths = vec![ - self.menu_config_location.parent().unwrap().to_path_buf(), - self.desktop_entries_location.clone(), + self.menu_config_location + .parent() + .ok_or_else(|| MenuInstError::InvalidPath(self.menu_config_location.clone()))?, + &self.desktop_entries_location, self.directory_entry_location .parent() - .unwrap() - .to_path_buf(), + .ok_or_else(|| MenuInstError::InvalidPath(self.directory_entry_location.clone()))?, ]; for path in paths { @@ -288,21 +289,17 @@ impl LinuxMenu { Ok(()) } - fn command(&self) -> String { + fn command(&self) -> Result { let mut parts = Vec::new(); if let Some(pre_command) = &self.command.precommand { parts.push(pre_command.resolve(&self.placeholders)); } - // TODO we should use `env` to set the environment variables in the `.desktop` file let mut envs = Vec::new(); if self.command.activate.unwrap_or(false) { // create a bash activation script and emit it into the script - let activator = - Activator::from_path(&self.prefix, shell::Bash, Platform::current()).unwrap(); - let activation_env = activator - .run_activation(ActivationVariables::default(), None) - .unwrap(); + let activator = Activator::from_path(&self.prefix, shell::Bash, Platform::current())?; + let activation_env = activator.run_activation(ActivationVariables::default(), None)?; for (k, v) in activation_env { envs.push(format!(r#"{k}="{v}""#)); @@ -320,11 +317,12 @@ impl LinuxMenu { parts.push(command); let command = parts.join(" && "); - - format!( - "bash -c {}", - shlex::try_quote(&command).expect("could not quote command") - ) + let bash_command = format!("bash -c {}", shlex::try_quote(&command)?); + if envs.is_empty() { + Ok(bash_command) + } else { + Ok(format!("env {} {}", envs.join(" "), bash_command)) + } } fn resolve_and_join(&self, items: &[PlaceholderString]) -> String { @@ -348,7 +346,7 @@ impl LinuxMenu { writeln!(writer, "Type=Application")?; writeln!(writer, "Encoding=UTF-8")?; writeln!(writer, "Name={}", self.name)?; - writeln!(writer, "Exec={}", self.command())?; + writeln!(writer, "Exec={}", self.command()?)?; writeln!( writer, "Terminal={}", @@ -568,11 +566,9 @@ impl LinuxMenu { // the file + directory around for eventual removal (just use tempdir for unique folder) let temp_dir = TempDir::new_in(&mime_dir_in_prefix)?; let file_path = temp_dir.path().join(file_name); - let mut file = File::create(&file_path)?; - file.write_all(xml.as_bytes())?; - file.flush()?; + fs::write(&file_path, &xml)?; - match xdg_mime(file.path(), self.mode, XdgMimeOperation::Install) { + match xdg_mime(&file_path, self.mode, XdgMimeOperation::Install) { Ok(_) => { // keep temp dir in prefix around and the temp file // because we re-use it when unregistering the mime type. @@ -627,7 +623,9 @@ pub fn remove_menu_item(tracker: &LinuxTracker) -> Result<(), MenuInstError> { } } // Remove the temporary directory we created for the glob file - fs::remove_dir_all(path.parent().unwrap())?; + if let Some(parent) = path.parent() { + fs::remove_dir_all(parent)?; + } } if let Some(installed_mime_types) = tracker.mime_types.as_ref() { diff --git a/crates/rattler_menuinst/src/linux/menu_xml.rs b/crates/rattler_menuinst/src/linux/menu_xml.rs index 07fad51c4..aaac5cff9 100644 --- a/crates/rattler_menuinst/src/linux/menu_xml.rs +++ b/crates/rattler_menuinst/src/linux/menu_xml.rs @@ -1,3 +1,6 @@ +//! Linux menu XML manipulation + +#![allow(dead_code)] use chrono::Utc; use fs_err::{self as fs, File}; use quick_xml::{events::Event, Reader, Writer}; From 636c71a7412e2e1d047707849824ecde89f1c531 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Mon, 24 Feb 2025 11:13:18 +0100 Subject: [PATCH 116/132] clippy --- crates/rattler_menuinst/src/lib.rs | 9 +++++---- crates/rattler_menuinst/src/utils/mod.rs | 5 ++++- crates/rattler_menuinst/src/windows.rs | 11 ++++++----- crates/rattler_menuinst/src/windows/registry.rs | 2 +- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index 0c340a246..901d518de 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -1,7 +1,4 @@ -use std::path::Path; - -#[cfg(target_os = "linux")] -use std::path::PathBuf; +use std::path::{Path, PathBuf}; use rattler_conda_types::{ menuinst::{MenuMode, Tracker}, @@ -55,6 +52,10 @@ pub enum MenuInstError { #[error("Failed to install menu item: {0}")] WindowsError(#[from] ::windows::core::Error), + #[cfg(target_os = "windows")] + #[error("Failed to register terminal profile: {0}")] + TerminalProfileError(#[from] windows::TerminalUpdateError), + #[cfg(target_os = "linux")] #[error("Menu config location is not a file: {0:?}")] MenuConfigNotAFile(PathBuf), diff --git a/crates/rattler_menuinst/src/utils/mod.rs b/crates/rattler_menuinst/src/utils/mod.rs index 914e72cab..5145fa3e0 100644 --- a/crates/rattler_menuinst/src/utils/mod.rs +++ b/crates/rattler_menuinst/src/utils/mod.rs @@ -1,7 +1,10 @@ pub mod slugify; pub use slugify::slugify; pub mod terminal; -pub use terminal::{log_output, run_pre_create_command}; +pub use terminal::log_output; + +#[cfg(target_family = "unix")] +pub use terminal::run_pre_create_command; pub fn quote_args(args: I) -> Vec where diff --git a/crates/rattler_menuinst/src/windows.rs b/crates/rattler_menuinst/src/windows.rs index 1688ef2c2..ad1aa5c81 100644 --- a/crates/rattler_menuinst/src/windows.rs +++ b/crates/rattler_menuinst/src/windows.rs @@ -14,12 +14,12 @@ use std::{ path::{Path, PathBuf}, }; use terminal::TerminalProfile; +pub use terminal::TerminalUpdateError; use crate::{ render::{BaseMenuItemPlaceholders, MenuItemPlaceholders}, schema::{Environment, MenuItemCommand, Windows}, - slugify, - util::log_output, + utils::{log_output, slugify}, MenuInstError, MenuMode, }; @@ -317,7 +317,9 @@ impl WindowsMenu { let app_id = self.app_id(); // split args into command and arguments - let (command, args) = args.split_first().unwrap(); + let Some((command, args)) = args.split_first() else { + return Ok(()); + }; let args = lex::quote_args(args).join(" "); let link_name = format!("{}.lnk", self.name); @@ -456,8 +458,7 @@ impl WindowsMenu { self.menu_mode, &self.directories.known_folders, ) { - // TODO get rid of unwrap :) - terminal::add_windows_terminal_profile(&location, &profile).unwrap(); + terminal::add_windows_terminal_profile(&location, &profile)?; tracker.terminal_profiles.push(WindowsTerminalProfile { configuration_file: location, identifier: profile.name.clone(), diff --git a/crates/rattler_menuinst/src/windows/registry.rs b/crates/rattler_menuinst/src/windows/registry.rs index 98ad381e1..4e230a45d 100644 --- a/crates/rattler_menuinst/src/windows/registry.rs +++ b/crates/rattler_menuinst/src/windows/registry.rs @@ -274,7 +274,7 @@ pub fn register_url_protocol( let protocol_key = hkey.create(base_path)?; - protocol_key.set_string("", &format!("URL:{}", title_case(protocol)))?; + protocol_key.set_string("", format!("URL:{}", title_case(protocol)))?; protocol_key.set_string("URL Protocol", "")?; protocol_key From 08683b3f94fd9fa03c9a68c2e13cd3ee88f7fc86 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Mon, 24 Feb 2025 13:00:42 +0100 Subject: [PATCH 117/132] update defaults.json --- .../rattler_conda_types/src/match_spec/mod.rs | 5 - .../data/menuinst.default.json | 10 +- .../data/menuinst.schema.json | 731 ------------------ 3 files changed, 5 insertions(+), 741 deletions(-) delete mode 100644 crates/rattler_menuinst/data/menuinst.schema.json diff --git a/crates/rattler_conda_types/src/match_spec/mod.rs b/crates/rattler_conda_types/src/match_spec/mod.rs index ad522fb26..65e5027e1 100644 --- a/crates/rattler_conda_types/src/match_spec/mod.rs +++ b/crates/rattler_conda_types/src/match_spec/mod.rs @@ -821,9 +821,4 @@ mod tests { MatchSpec::from_nameless(NamelessMatchSpec::from_str(">=12", Strict).unwrap(), None); assert!(!spec.is_virtual()); } - - #[test] - fn test_size_stays_the_same() { - assert_eq!(std::mem::size_of::(), 488); - } } diff --git a/crates/rattler_menuinst/data/menuinst.default.json b/crates/rattler_menuinst/data/menuinst.default.json index c9acad433..ac04d612f 100644 --- a/crates/rattler_menuinst/data/menuinst.default.json +++ b/crates/rattler_menuinst/data/menuinst.default.json @@ -1,6 +1,4 @@ { - "id_": "https://schemas.conda.io/menuinst-1.schema.json", - "schema_": "https://json-schema.org/draft-07/schema", "menu_name": "REQUIRED", "menu_items": [ { @@ -28,6 +26,7 @@ "NotShowIn": null, "OnlyShowIn": null, "PrefersNonDefaultGPU": null, + "SingleMainWindow": null, "StartupNotify": null, "StartupWMClass": null, "TryExec": null, @@ -56,7 +55,7 @@ }, "win": { "desktop": true, - "quicklaunch": true, + "quicklaunch": false, "terminal_profile": null, "url_protocols": null, "file_extensions": null, @@ -64,5 +63,6 @@ } } } - ] -} + ], + "$schema": "https://schemas.conda.org/menuinst-1-1-0.schema.json" +} \ No newline at end of file diff --git a/crates/rattler_menuinst/data/menuinst.schema.json b/crates/rattler_menuinst/data/menuinst.schema.json deleted file mode 100644 index 3ce530521..000000000 --- a/crates/rattler_menuinst/data/menuinst.schema.json +++ /dev/null @@ -1,731 +0,0 @@ -{ - "title": "MenuInstSchema", - "description": "Metadata required to create menu items across operating systems with ``menuinst``.", - "type": "object", - "properties": { - "$id": { - "title": "$Id", - "description": "Version of the menuinst schema.", - "enum": [ - "https://schemas.conda.io/menuinst-1.schema.json" - ], - "type": "string" - }, - "$schema": { - "title": "$Schema", - "description": "Standard of the JSON schema we adhere to.", - "enum": [ - "https://json-schema.org/draft-07/schema" - ], - "type": "string" - }, - "menu_name": { - "title": "Menu Name", - "minLength": 1, - "type": "string" - }, - "menu_items": { - "title": "Menu Items", - "minItems": 1, - "type": "array", - "items": { - "$ref": "#/definitions/MenuItem" - } - } - }, - "required": [ - "$id", - "$schema", - "menu_name", - "menu_items" - ], - "additionalProperties": false, - "definitions": { - "MenuItemNameDict": { - "title": "MenuItemNameDict", - "description": "Variable menu item name.\nUse this dictionary if the menu item name depends on installation parameters\nsuch as the target environment.", - "type": "object", - "properties": { - "target_environment_is_base": { - "title": "Target Environment Is Base", - "minLength": 1, - "type": "string" - }, - "target_environment_is_not_base": { - "title": "Target Environment Is Not Base", - "minLength": 1, - "type": "string" - } - }, - "additionalProperties": false - }, - "Linux": { - "title": "Linux", - "description": "Linux-specific instructions.\n\nCheck the `Desktop entry specification\n`__\nfor more details.", - "type": "object", - "properties": { - "name": { - "title": "Name", - "anyOf": [ - { - "type": "string", - "minLength": 1 - }, - { - "$ref": "#/definitions/MenuItemNameDict" - } - ] - }, - "description": { - "title": "Description", - "type": "string" - }, - "icon": { - "title": "Icon", - "minLength": 1, - "type": "string" - }, - "command": { - "title": "Command", - "minItems": 1, - "type": "array", - "items": { - "type": "string" - } - }, - "working_dir": { - "title": "Working Dir", - "minLength": 1, - "type": "string" - }, - "precommand": { - "title": "Precommand", - "minLength": 1, - "type": "string" - }, - "precreate": { - "title": "Precreate", - "minLength": 1, - "type": "string" - }, - "activate": { - "title": "Activate", - "type": "boolean" - }, - "terminal": { - "title": "Terminal", - "type": "boolean" - }, - "Categories": { - "title": "Categories", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string", - "pattern": "^.+;$" - } - ] - }, - "DBusActivatable": { - "title": "Dbusactivatable", - "type": "boolean" - }, - "GenericName": { - "title": "Genericname", - "type": "string" - }, - "Hidden": { - "title": "Hidden", - "type": "boolean" - }, - "Implements": { - "title": "Implements", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string", - "pattern": "^.+;$" - } - ] - }, - "Keywords": { - "title": "Keywords", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string", - "pattern": "^.+;$" - } - ] - }, - "MimeType": { - "title": "Mimetype", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string", - "pattern": "^.+;$" - } - ] - }, - "NoDisplay": { - "title": "Nodisplay", - "type": "boolean" - }, - "NotShowIn": { - "title": "Notshowin", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string", - "pattern": "^.+;$" - } - ] - }, - "OnlyShowIn": { - "title": "Onlyshowin", - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string", - "pattern": "^.+;$" - } - ] - }, - "PrefersNonDefaultGPU": { - "title": "Prefersnondefaultgpu", - "type": "boolean" - }, - "StartupNotify": { - "title": "Startupnotify", - "type": "boolean" - }, - "StartupWMClass": { - "title": "Startupwmclass", - "type": "string" - }, - "TryExec": { - "title": "Tryexec", - "type": "string" - }, - "glob_patterns": { - "title": "Glob Patterns", - "type": "object", - "additionalProperties": { - "type": "string", - "pattern": ".*\\*.*" - } - } - }, - "additionalProperties": false - }, - "CFBundleURLTypesModel": { - "title": "CFBundleURLTypesModel", - "description": "Describes a URL scheme associated with the app.", - "type": "object", - "properties": { - "CFBundleTypeRole": { - "title": "Cfbundletyperole", - "enum": [ - "Editor", - "Viewer", - "Shell", - "None" - ], - "type": "string" - }, - "CFBundleURLSchemes": { - "title": "Cfbundleurlschemes", - "type": "array", - "items": { - "type": "string" - } - }, - "CFBundleURLName": { - "title": "Cfbundleurlname", - "type": "string" - }, - "CFBundleURLIconFile": { - "title": "Cfbundleurliconfile", - "type": "string" - } - }, - "required": [ - "CFBundleURLSchemes" - ], - "additionalProperties": false - }, - "CFBundleDocumentTypesModel": { - "title": "CFBundleDocumentTypesModel", - "description": "Describes a document type associated with the app.", - "type": "object", - "properties": { - "CFBundleTypeIconFile": { - "title": "Cfbundletypeiconfile", - "type": "string" - }, - "CFBundleTypeName": { - "title": "Cfbundletypename", - "type": "string" - }, - "CFBundleTypeRole": { - "title": "Cfbundletyperole", - "enum": [ - "Editor", - "Viewer", - "Shell", - "None" - ], - "type": "string" - }, - "LSItemContentTypes": { - "title": "Lsitemcontenttypes", - "type": "array", - "items": { - "type": "string" - } - }, - "LSHandlerRank": { - "title": "Lshandlerrank", - "enum": [ - "Owner", - "Default", - "Alternate" - ], - "type": "string" - } - }, - "required": [ - "CFBundleTypeName", - "LSItemContentTypes", - "LSHandlerRank" - ], - "additionalProperties": false - }, - "UTTypeDeclarationModel": { - "title": "UTTypeDeclarationModel", - "type": "object", - "properties": { - "UTTypeConformsTo": { - "title": "Uttypeconformsto", - "type": "array", - "items": { - "type": "string" - } - }, - "UTTypeDescription": { - "title": "Uttypedescription", - "type": "string" - }, - "UTTypeIconFile": { - "title": "Uttypeiconfile", - "type": "string" - }, - "UTTypeIdentifier": { - "title": "Uttypeidentifier", - "type": "string" - }, - "UTTypeReferenceURL": { - "title": "Uttypereferenceurl", - "type": "string" - }, - "UTTypeTagSpecification": { - "title": "Uttypetagspecification", - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "required": [ - "UTTypeConformsTo", - "UTTypeIdentifier", - "UTTypeTagSpecification" - ], - "additionalProperties": false - }, - "MacOS": { - "title": "MacOS", - "description": "Mac-specific instructions. Check these URLs for more info:\n\n- ``CF*`` keys: see `Core Foundation Keys `__\n- ``LS*`` keys: see `Launch Services Keys `__\n- ``entitlements``: see `Entitlements documentation `__", - "type": "object", - "properties": { - "name": { - "title": "Name", - "anyOf": [ - { - "type": "string", - "minLength": 1 - }, - { - "$ref": "#/definitions/MenuItemNameDict" - } - ] - }, - "description": { - "title": "Description", - "type": "string" - }, - "icon": { - "title": "Icon", - "minLength": 1, - "type": "string" - }, - "command": { - "title": "Command", - "minItems": 1, - "type": "array", - "items": { - "type": "string" - } - }, - "working_dir": { - "title": "Working Dir", - "minLength": 1, - "type": "string" - }, - "precommand": { - "title": "Precommand", - "minLength": 1, - "type": "string" - }, - "precreate": { - "title": "Precreate", - "minLength": 1, - "type": "string" - }, - "activate": { - "title": "Activate", - "type": "boolean" - }, - "terminal": { - "title": "Terminal", - "type": "boolean" - }, - "CFBundleDisplayName": { - "title": "Cfbundledisplayname", - "type": "string" - }, - "CFBundleIdentifier": { - "title": "Cfbundleidentifier", - "pattern": "^[A-z0-9\\-\\.]+$", - "type": "string" - }, - "CFBundleName": { - "title": "Cfbundlename", - "maxLength": 16, - "type": "string" - }, - "CFBundleSpokenName": { - "title": "Cfbundlespokenname", - "type": "string" - }, - "CFBundleVersion": { - "title": "Cfbundleversion", - "pattern": "^\\S+$", - "type": "string" - }, - "CFBundleURLTypes": { - "title": "Cfbundleurltypes", - "type": "array", - "items": { - "$ref": "#/definitions/CFBundleURLTypesModel" - } - }, - "CFBundleDocumentTypes": { - "title": "Cfbundledocumenttypes", - "type": "array", - "items": { - "$ref": "#/definitions/CFBundleDocumentTypesModel" - } - }, - "LSApplicationCategoryType": { - "title": "Lsapplicationcategorytype", - "pattern": "^public\\.app-category\\.\\S+$", - "type": "string" - }, - "LSBackgroundOnly": { - "title": "Lsbackgroundonly", - "type": "boolean" - }, - "LSEnvironment": { - "title": "Lsenvironment", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "LSMinimumSystemVersion": { - "title": "Lsminimumsystemversion", - "pattern": "^\\d+\\.\\d+\\.\\d+$", - "type": "string" - }, - "LSMultipleInstancesProhibited": { - "title": "Lsmultipleinstancesprohibited", - "type": "boolean" - }, - "LSRequiresNativeExecution": { - "title": "Lsrequiresnativeexecution", - "type": "boolean" - }, - "NSSupportsAutomaticGraphicsSwitching": { - "title": "Nssupportsautomaticgraphicsswitching", - "type": "boolean" - }, - "UTExportedTypeDeclarations": { - "title": "Utexportedtypedeclarations", - "type": "array", - "items": { - "$ref": "#/definitions/UTTypeDeclarationModel" - } - }, - "UTImportedTypeDeclarations": { - "title": "Utimportedtypedeclarations", - "type": "array", - "items": { - "$ref": "#/definitions/UTTypeDeclarationModel" - } - }, - "entitlements": { - "title": "Entitlements", - "type": "array", - "items": { - "type": "string", - "pattern": "[a-z0-9\\.\\-]+" - } - }, - "link_in_bundle": { - "title": "Link In Bundle", - "type": "object", - "additionalProperties": { - "type": "string", - "pattern": "^(?!\\/)(?!\\.\\./).*" - } - }, - "event_handler": { - "title": "Event Handler", - "minLength": 1, - "type": "string" - } - }, - "additionalProperties": false - }, - "Windows": { - "title": "Windows", - "description": "Windows-specific instructions. You can override global keys here if needed", - "type": "object", - "properties": { - "name": { - "title": "Name", - "anyOf": [ - { - "type": "string", - "minLength": 1 - }, - { - "$ref": "#/definitions/MenuItemNameDict" - } - ] - }, - "description": { - "title": "Description", - "type": "string" - }, - "icon": { - "title": "Icon", - "minLength": 1, - "type": "string" - }, - "command": { - "title": "Command", - "minItems": 1, - "type": "array", - "items": { - "type": "string" - } - }, - "working_dir": { - "title": "Working Dir", - "minLength": 1, - "type": "string" - }, - "precommand": { - "title": "Precommand", - "minLength": 1, - "type": "string" - }, - "precreate": { - "title": "Precreate", - "minLength": 1, - "type": "string" - }, - "activate": { - "title": "Activate", - "type": "boolean" - }, - "terminal": { - "title": "Terminal", - "type": "boolean" - }, - "desktop": { - "title": "Desktop", - "default": true, - "type": "boolean" - }, - "quicklaunch": { - "title": "Quicklaunch", - "default": true, - "type": "boolean" - }, - "terminal_profile": { - "title": "Terminal Profile", - "minLength": 1, - "type": "string" - }, - "url_protocols": { - "title": "Url Protocols", - "type": "array", - "items": { - "type": "string", - "pattern": "\\S+" - } - }, - "file_extensions": { - "title": "File Extensions", - "type": "array", - "items": { - "type": "string", - "pattern": "\\.\\S*" - } - }, - "app_user_model_id": { - "title": "App User Model Id", - "maxLength": 128, - "pattern": "\\S+\\.\\S+", - "type": "string" - } - }, - "additionalProperties": false - }, - "Platforms": { - "title": "Platforms", - "description": "Platform specific options.\n\nNote each of these fields supports the same keys as the top-level :class:`MenuItem`\n(sans ``platforms`` itself), in case overrides are needed.", - "type": "object", - "properties": { - "linux": { - "$ref": "#/definitions/Linux" - }, - "osx": { - "$ref": "#/definitions/MacOS" - }, - "win": { - "$ref": "#/definitions/Windows" - } - }, - "additionalProperties": false - }, - "MenuItem": { - "title": "MenuItem", - "description": "Instructions to create a menu item across operating systems.", - "type": "object", - "properties": { - "name": { - "title": "Name", - "anyOf": [ - { - "type": "string", - "minLength": 1 - }, - { - "$ref": "#/definitions/MenuItemNameDict" - } - ] - }, - "description": { - "title": "Description", - "type": "string" - }, - "command": { - "title": "Command", - "minItems": 1, - "type": "array", - "items": { - "type": "string" - } - }, - "icon": { - "title": "Icon", - "minLength": 1, - "type": "string" - }, - "precommand": { - "title": "Precommand", - "minLength": 1, - "type": "string" - }, - "precreate": { - "title": "Precreate", - "minLength": 1, - "type": "string" - }, - "working_dir": { - "title": "Working Dir", - "minLength": 1, - "type": "string" - }, - "activate": { - "title": "Activate", - "default": true, - "type": "boolean" - }, - "terminal": { - "title": "Terminal", - "default": false, - "type": "boolean" - }, - "platforms": { - "$ref": "#/definitions/Platforms" - } - }, - "required": [ - "name", - "description", - "command", - "platforms" - ], - "additionalProperties": false - } - } -} From 7a38f0e6eb3134c057993ff6cb165b37583e37a9 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Mon, 24 Feb 2025 13:05:56 +0100 Subject: [PATCH 118/132] fix casing of error messages --- crates/rattler_menuinst/src/lib.rs | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index 901d518de..d34c6a104 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -22,42 +22,42 @@ pub mod utils; pub enum MenuInstError { #[error("IO error: {0}")] IoError(#[from] std::io::Error), - #[error("Deserialization error: {0}")] + #[error("deserialization error: {0}")] SerdeError(#[from] serde_json::Error), - #[error("Failed to install menu item: {0}")] + #[error("failed to install menu item: {0}")] InstallError(String), - #[error("Invalid path: {0}")] + #[error("invalid path: {0}")] InvalidPath(PathBuf), #[cfg(target_os = "linux")] - #[error("Could not quote command with shlex: {0}")] + #[error("could not quote command with shlex: {0}")] ShlexQuoteError(#[from] shlex::QuoteError), #[cfg(target_os = "macos")] - #[error("Failed to create plist: {0}")] + #[error("failed to create plist: {0}")] PlistError(#[from] plist::Error), - #[error("Failed to sign plist: {0}")] + #[error("failed to sign plist: {0}")] SigningFailed(String), - #[error("Failed to install menu item: {0}")] + #[error("failed to install menu item: {0}")] ActivationError(#[from] rattler_shell::activation::ActivationError), #[cfg(target_os = "linux")] - #[error("Failed to install menu item: {0}")] + #[error("failed to install menu item: {0}")] XmlError(#[from] quick_xml::Error), #[cfg(target_os = "windows")] - #[error("Failed to install menu item: {0}")] + #[error("failed to install menu item: {0}")] WindowsError(#[from] ::windows::core::Error), #[cfg(target_os = "windows")] - #[error("Failed to register terminal profile: {0}")] + #[error("failed to register terminal profile: {0}")] TerminalProfileError(#[from] windows::TerminalUpdateError), #[cfg(target_os = "linux")] - #[error("Menu config location is not a file: {0:?}")] + #[error("fenu config location is not a file: {0:?}")] MenuConfigNotAFile(PathBuf), } From 223bba0af96b91cb0664c56b74722f0b009bc563 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Mon, 24 Feb 2025 13:16:58 +0100 Subject: [PATCH 119/132] fix typo --- crates/rattler_menuinst/src/lib.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index d34c6a104..ba97bef2b 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -22,6 +22,7 @@ pub mod utils; pub enum MenuInstError { #[error("IO error: {0}")] IoError(#[from] std::io::Error), + #[error("deserialization error: {0}")] SerdeError(#[from] serde_json::Error), @@ -38,6 +39,8 @@ pub enum MenuInstError { #[cfg(target_os = "macos")] #[error("failed to create plist: {0}")] PlistError(#[from] plist::Error), + + #[cfg(target_os = "macos")] #[error("failed to sign plist: {0}")] SigningFailed(String), @@ -57,7 +60,7 @@ pub enum MenuInstError { TerminalProfileError(#[from] windows::TerminalUpdateError), #[cfg(target_os = "linux")] - #[error("fenu config location is not a file: {0:?}")] + #[error("menu config location is not a file: {0:?}")] MenuConfigNotAFile(PathBuf), } From b303b3d35687626b0e130e9b19726dd8ae576412 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Mon, 24 Feb 2025 13:18:15 +0100 Subject: [PATCH 120/132] only warn when removal doesnt work --- crates/rattler_menuinst/src/lib.rs | 2 +- crates/rattler_menuinst/src/macos.rs | 9 ++------- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index ba97bef2b..03168d8c6 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -131,7 +131,7 @@ pub fn remove_menu_items(tracker: &Vec) -> Result<(), MenuInstError> { match el { Tracker::MacOs(tracker) => { #[cfg(target_os = "macos")] - macos::remove_menu_item(tracker).unwrap(); + macos::remove_menu_item(tracker)?; } Tracker::Linux(tracker) => { #[cfg(target_os = "linux")] diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index 7c1d6862d..80365ee43 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -787,15 +787,14 @@ pub(crate) fn install_menu_item( Ok(tracker) } -pub(crate) fn remove_menu_item(tracker: &MacOsTracker) -> Result, Vec> { +pub(crate) fn remove_menu_item(tracker: &MacOsTracker) -> Result, MenuInstError> { let mut removed = Vec::new(); - let mut errors = Vec::new(); match fs_err::remove_dir_all(&tracker.app_folder) { Ok(_) => { removed.push(tracker.app_folder.clone()); } Err(e) => { - errors.push(e.into()); + tracing::warn!("Failed to remove app folder: {}", e); } } @@ -804,13 +803,9 @@ pub(crate) fn remove_menu_item(tracker: &MacOsTracker) -> Result, V Ok(_) => {} Err(e) => { tracing::warn!("Failed to unregister with lsregister: {}", e); - errors.push(e); } } } - if !errors.is_empty() { - return Err(errors); - } Ok(removed) } From 7df5c6f884a2026e456c232b7c508f50af3ef1fc Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Mon, 24 Feb 2025 14:00:55 +0100 Subject: [PATCH 121/132] add install-menu and remove-menu to rattler --- crates/rattler-bin/Cargo.toml | 1 + crates/rattler-bin/src/commands/create.rs | 1 - crates/rattler-bin/src/commands/menu.rs | 54 ++++++++++++++++ crates/rattler-bin/src/commands/mod.rs | 1 + crates/rattler-bin/src/main.rs | 4 ++ crates/rattler/src/install/driver.rs | 72 +-------------------- crates/rattler/src/install/installer/mod.rs | 11 ---- crates/rattler_menuinst/src/lib.rs | 59 ++++++++++++++++- 8 files changed, 119 insertions(+), 84 deletions(-) create mode 100644 crates/rattler-bin/src/commands/menu.rs diff --git a/crates/rattler-bin/Cargo.toml b/crates/rattler-bin/Cargo.toml index 8ec1adb12..f308d79c9 100644 --- a/crates/rattler-bin/Cargo.toml +++ b/crates/rattler-bin/Cargo.toml @@ -34,6 +34,7 @@ rattler_repodata_gateway = { path="../rattler_repodata_gateway", version = "0.21 rattler_solve = { path="../rattler_solve", version = "1.3.8", default-features = false, features = ["resolvo", "libsolv_c"] } rattler_virtual_packages = { path="../rattler_virtual_packages", version = "2.0.3", default-features = false } rattler_cache = { path="../rattler_cache", version = "0.3.9", default-features = false } +rattler_menuinst = { path="../rattler_menuinst", version = "0.1.0", default-features = false } reqwest = { workspace = true } reqwest-middleware = { workspace = true } tokio = { workspace = true, features = ["rt-multi-thread", "macros"] } diff --git a/crates/rattler-bin/src/commands/create.rs b/crates/rattler-bin/src/commands/create.rs index 506d60d28..16788141f 100644 --- a/crates/rattler-bin/src/commands/create.rs +++ b/crates/rattler-bin/src/commands/create.rs @@ -306,7 +306,6 @@ pub async fn create(opt: Opt) -> anyhow::Result<()> { .with_target_platform(install_platform) .with_installed_packages(installed_packages) .with_execute_link_scripts(true) - .with_install_menu_items(true) .with_reporter( IndicatifReporter::builder() .with_multi_progress(global_multi_progress()) diff --git a/crates/rattler-bin/src/commands/menu.rs b/crates/rattler-bin/src/commands/menu.rs new file mode 100644 index 000000000..19858030e --- /dev/null +++ b/crates/rattler-bin/src/commands/menu.rs @@ -0,0 +1,54 @@ +use anyhow::{Context, Result}; +use clap::Parser; +use rattler_conda_types::{PackageName, PrefixRecord}; +use std::path::PathBuf; + +#[derive(Debug, Parser)] +pub struct InstallOpt { + /// Target prefix to look for the package (defaults to `.prefix`) + #[clap(long, short, default_value = ".prefix")] + target_prefix: PathBuf, + + /// Name of the package for which to install menu items + package_name: PackageName, +} + +pub async fn install_menu(opts: InstallOpt) -> Result<()> { + // Find the prefix record in the target_prefix and call `install_menu` on it + let records: Vec = PrefixRecord::collect_from_prefix(&opts.target_prefix)?; + + let record = records + .iter() + .find(|r| r.repodata_record.package_record.name == opts.package_name) + .with_context(|| { + format!( + "Package {} not found in prefix {:?}", + opts.package_name.as_normalized(), + opts.target_prefix + ) + })?; + + rattler_menuinst::install_menuitems_for_record(&opts.target_prefix, &record)?; + + Ok(()) +} + +pub async fn remove_menu(opts: InstallOpt) -> Result<()> { + // Find the prefix record in the target_prefix and call `remove_menu` on it + let records: Vec = PrefixRecord::collect_from_prefix(&opts.target_prefix)?; + + let record = records + .iter() + .find(|r| r.repodata_record.package_record.name == opts.package_name) + .with_context(|| { + format!( + "Package {} not found in prefix {:?}", + opts.package_name.as_normalized(), + opts.target_prefix + ) + })?; + + rattler_menuinst::remove_menu_items(&record.installed_system_menus)?; + + Ok(()) +} diff --git a/crates/rattler-bin/src/commands/mod.rs b/crates/rattler-bin/src/commands/mod.rs index 859818d54..8becfb26f 100644 --- a/crates/rattler-bin/src/commands/mod.rs +++ b/crates/rattler-bin/src/commands/mod.rs @@ -1,2 +1,3 @@ pub mod create; +pub mod menu; pub mod virtual_packages; diff --git a/crates/rattler-bin/src/main.rs b/crates/rattler-bin/src/main.rs index 745757fe7..ce01cc740 100644 --- a/crates/rattler-bin/src/main.rs +++ b/crates/rattler-bin/src/main.rs @@ -39,6 +39,8 @@ struct Opt { enum Command { Create(commands::create::Opt), VirtualPackages(commands::virtual_packages::Opt), + InstallMenu(commands::menu::InstallOpt), + RemoveMenu(commands::menu::InstallOpt), } /// Entry point of the `rattler` cli. @@ -72,5 +74,7 @@ async fn main() -> anyhow::Result<()> { match opt.command { Command::Create(opts) => commands::create::create(opts).await, Command::VirtualPackages(opts) => commands::virtual_packages::virtual_packages(opts), + Command::InstallMenu(opts) => commands::menu::install_menu(opts).await, + Command::RemoveMenu(opts) => commands::menu::remove_menu(opts).await, } } diff --git a/crates/rattler/src/install/driver.rs b/crates/rattler/src/install/driver.rs index 7a19d10ba..56ae15e9b 100644 --- a/crates/rattler/src/install/driver.rs +++ b/crates/rattler/src/install/driver.rs @@ -7,9 +7,7 @@ use std::{ use indexmap::IndexSet; use itertools::Itertools; -use rattler_conda_types::{ - menuinst::MenuMode, prefix_record::PathType, PackageRecord, Platform, PrefixRecord, -}; +use rattler_conda_types::{prefix_record::PathType, PackageRecord, PrefixRecord}; use simple_spawn_blocking::{tokio::run_blocking_task, Cancelled}; use thiserror::Error; use tokio::sync::{AcquireError, OwnedSemaphorePermit, Semaphore}; @@ -33,7 +31,6 @@ pub struct InstallDriver { io_concurrency_semaphore: Option>, pub(crate) clobber_registry: Arc>, execute_link_scripts: bool, - install_menu_items: bool, } impl Default for InstallDriver { @@ -41,7 +38,6 @@ impl Default for InstallDriver { Self::builder() .execute_link_scripts(false) .with_io_concurrency_limit(100) - .install_menu_items(true) .finish() } } @@ -52,7 +48,6 @@ pub struct InstallDriverBuilder { io_concurrency_semaphore: Option>, clobber_registry: Option, execute_link_scripts: bool, - install_menu_items: bool, } /// The result of the post-processing step. @@ -118,14 +113,6 @@ impl InstallDriverBuilder { } } - /// Whether to install menu items or not. - pub fn install_menu_items(self, install_menu_items: bool) -> Self { - Self { - install_menu_items, - ..self - } - } - pub fn finish(self) -> InstallDriver { InstallDriver { io_concurrency_semaphore: self.io_concurrency_semaphore, @@ -135,7 +122,6 @@ impl InstallDriverBuilder { .map(Arc::new) .unwrap_or_default(), execute_link_scripts: self.execute_link_scripts, - install_menu_items: self.install_menu_items, } } } @@ -250,62 +236,6 @@ impl InstallDriver { None }; - // TODO this would overwrite prefix records that were changed in the `unclobber` - // code path - - if self.install_menu_items { - // Install menu items from prefix records - for record in prefix_records.iter() { - // Look for Menu/*.json files in the package paths - let menu_files: Vec<_> = record - .paths_data - .paths - .iter() - .filter(|path| { - path.relative_path.starts_with("Menu/") - && path - .relative_path - .extension() - .is_some_and(|ext| ext == "json") - }) - .collect(); - - if !menu_files.is_empty() { - for menu_file in menu_files { - let full_path = target_prefix.join(&menu_file.relative_path); - match rattler_menuinst::install_menuitems( - &full_path, - target_prefix, - target_prefix, - Platform::current(), - MenuMode::User, - ) { - Ok(tracker_vec) => { - // Store tracker in the prefix record - let mut record = record.clone(); - record.installed_system_menus = tracker_vec; - - // Save the updated prefix record - record - .write_to_path( - target_prefix.join("conda-meta").join(record.file_name()), - true, - ) - .expect("Failed to write prefix record"); - } - Err(e) => { - tracing::warn!( - "Failed to install menu items for {}: {}", - full_path.display(), - e - ); - } - } - } - } - } - } - Ok(PostProcessResult { post_link_result, clobbered_paths, diff --git a/crates/rattler/src/install/installer/mod.rs b/crates/rattler/src/install/installer/mod.rs index 1a73f5053..f595e06b2 100644 --- a/crates/rattler/src/install/installer/mod.rs +++ b/crates/rattler/src/install/installer/mod.rs @@ -50,7 +50,6 @@ pub struct Installer { target_platform: Option, apple_code_sign_behavior: AppleCodeSignBehavior, alternative_target_prefix: Option, - install_menu_items: bool, // TODO: Determine upfront if these are possible. // allow_symbolic_links: Option, // allow_hard_links: Option, @@ -135,15 +134,6 @@ impl Installer { } } - /// Sets whether menu items should be installed or not - #[must_use] - pub fn with_install_menu_items(self, install_menu_items: bool) -> Self { - Self { - install_menu_items, - ..self - } - } - /// Sets whether to execute link scripts or not. /// /// By default, link scripts are not executed. Link scripts can run @@ -313,7 +303,6 @@ impl Installer { // Construct a driver. let driver = InstallDriver::builder() .execute_link_scripts(self.execute_link_scripts) - .install_menu_items(self.install_menu_items) .with_io_concurrency_semaphore( self.io_semaphore.unwrap_or(Arc::new(Semaphore::new(100))), ) diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index 03168d8c6..38efa3c7f 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -2,7 +2,7 @@ use std::path::{Path, PathBuf}; use rattler_conda_types::{ menuinst::{MenuMode, Tracker}, - Platform, + Platform, PrefixRecord, }; #[cfg(target_os = "linux")] @@ -64,6 +64,63 @@ pub enum MenuInstError { MenuConfigNotAFile(PathBuf), } +/// Install menu items for a given prefix record according to `Menu/*.json` files +/// Note: this function will update the prefix record with the installed menu items +/// and write it back to the prefix record file if any Menu item is found +pub fn install_menuitems_for_record( + target_prefix: &Path, + prefix_record: &PrefixRecord, +) -> Result<(), MenuInstError> { + // Look for Menu/*.json files in the package paths + let menu_files: Vec<_> = prefix_record + .paths_data + .paths + .iter() + .filter(|path| { + path.relative_path.starts_with("Menu/") + && path + .relative_path + .extension() + .is_some_and(|ext| ext == "json") + }) + .collect(); + + if !menu_files.is_empty() { + for menu_file in menu_files { + let full_path = target_prefix.join(&menu_file.relative_path); + match install_menuitems( + &full_path, + target_prefix, + target_prefix, + Platform::current(), + MenuMode::User, + ) { + Ok(tracker_vec) => { + // Store tracker in the prefix record + let mut record = prefix_record.clone(); + record.installed_system_menus = tracker_vec; + + // Save the updated prefix record + record + .write_to_path( + target_prefix.join("conda-meta").join(record.file_name()), + true, + ) + .expect("Failed to write prefix record"); + } + Err(e) => { + tracing::warn!( + "Failed to install menu items for {}: {}", + full_path.display(), + e + ); + } + } + } + } + Ok(()) +} + // Install menu items from a given schema file pub fn install_menuitems( file: &Path, From edbdd222dd8a3d7030db1cacf9845037eb70e76b Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Mon, 24 Feb 2025 14:43:40 +0100 Subject: [PATCH 122/132] improve logging on macos --- crates/rattler-bin/src/commands/menu.rs | 6 +++--- crates/rattler_menuinst/src/macos.rs | 26 +++++++++++++++---------- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/crates/rattler-bin/src/commands/menu.rs b/crates/rattler-bin/src/commands/menu.rs index 19858030e..335fa2bf9 100644 --- a/crates/rattler-bin/src/commands/menu.rs +++ b/crates/rattler-bin/src/commands/menu.rs @@ -1,7 +1,7 @@ use anyhow::{Context, Result}; use clap::Parser; use rattler_conda_types::{PackageName, PrefixRecord}; -use std::path::PathBuf; +use std::{fs, path::PathBuf}; #[derive(Debug, Parser)] pub struct InstallOpt { @@ -27,8 +27,8 @@ pub async fn install_menu(opts: InstallOpt) -> Result<()> { opts.target_prefix ) })?; - - rattler_menuinst::install_menuitems_for_record(&opts.target_prefix, &record)?; + let prefix = fs::canonicalize(&opts.target_prefix)?; + rattler_menuinst::install_menuitems_for_record(&prefix, &record)?; Ok(()) } diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index 80365ee43..99eca69ce 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -352,25 +352,24 @@ impl MacOSMenu { for (src, dest) in link_in_bundle { let src = src.resolve(&self.placeholders); let dest = dest.resolve(&self.placeholders); - let rendered_dest = self.directories.location.join(&dest); - if !rendered_dest.starts_with(&self.directories.location) { + let dest = self.directories.location.join(&dest); + if !dest.starts_with(&self.directories.location) { return Err(MenuInstError::InstallError(format!( "'link_in_bundle' destinations MUST be created inside the .app bundle ({}), but it points to '{}'.", self.directories.location.display(), - rendered_dest.display() + dest.display() ))); } - if let Some(parent) = rendered_dest.parent() { + if let Some(parent) = dest.parent() { fs::create_dir_all(parent)?; } - fs_err::os::unix::fs::symlink(&src, &rendered_dest)?; + let src = fs::canonicalize(src)?; - tracing::info!( - "MenuInst: link finished {src} to {}", - rendered_dest.display() - ); + fs_err::os::unix::fs::symlink(&src, &dest)?; + + tracing::info!("Symlinked {src:?} to {dest:?}",); } Ok(()) @@ -789,8 +788,10 @@ pub(crate) fn install_menu_item( pub(crate) fn remove_menu_item(tracker: &MacOsTracker) -> Result, MenuInstError> { let mut removed = Vec::new(); + tracing::info!("Removing macOS menu item"); match fs_err::remove_dir_all(&tracker.app_folder) { Ok(_) => { + tracing::info!("Removed app folder: {}", tracker.app_folder.display()); removed.push(tracker.app_folder.clone()); } Err(e) => { @@ -800,7 +801,12 @@ pub(crate) fn remove_menu_item(tracker: &MacOsTracker) -> Result, M if let Some(lsregister_path) = &tracker.lsregister { match lsregister(&["-R", "-u", "-all"], lsregister_path) { - Ok(_) => {} + Ok(_) => { + tracing::info!( + "Unregistered with lsregister: {}", + lsregister_path.display() + ); + } Err(e) => { tracing::warn!("Failed to unregister with lsregister: {}", e); } From faa76d95b7ccb14eb0f398dfeb3af59bd1ed5d38 Mon Sep 17 00:00:00 2001 From: Wolf Vollprecht Date: Mon, 24 Feb 2025 14:44:49 +0100 Subject: [PATCH 123/132] clippy --- crates/rattler-bin/src/commands/menu.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/rattler-bin/src/commands/menu.rs b/crates/rattler-bin/src/commands/menu.rs index 335fa2bf9..fe63fb62a 100644 --- a/crates/rattler-bin/src/commands/menu.rs +++ b/crates/rattler-bin/src/commands/menu.rs @@ -28,7 +28,7 @@ pub async fn install_menu(opts: InstallOpt) -> Result<()> { ) })?; let prefix = fs::canonicalize(&opts.target_prefix)?; - rattler_menuinst::install_menuitems_for_record(&prefix, &record)?; + rattler_menuinst::install_menuitems_for_record(&prefix, record)?; Ok(()) } From 9babf90124a6857591a0b20cdb0095afd6ffb3cb Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Mon, 24 Feb 2025 14:58:53 +0100 Subject: [PATCH 124/132] Improve `install_menuitems_for_record` --- crates/rattler-bin/src/commands/menu.rs | 9 +++- crates/rattler_menuinst/src/lib.rs | 56 +++++++++++-------------- pixi.toml | 4 +- 3 files changed, 33 insertions(+), 36 deletions(-) diff --git a/crates/rattler-bin/src/commands/menu.rs b/crates/rattler-bin/src/commands/menu.rs index fe63fb62a..cdb2a1585 100644 --- a/crates/rattler-bin/src/commands/menu.rs +++ b/crates/rattler-bin/src/commands/menu.rs @@ -1,6 +1,6 @@ use anyhow::{Context, Result}; use clap::Parser; -use rattler_conda_types::{PackageName, PrefixRecord}; +use rattler_conda_types::{menuinst::MenuMode, PackageName, Platform, PrefixRecord}; use std::{fs, path::PathBuf}; #[derive(Debug, Parser)] @@ -28,7 +28,12 @@ pub async fn install_menu(opts: InstallOpt) -> Result<()> { ) })?; let prefix = fs::canonicalize(&opts.target_prefix)?; - rattler_menuinst::install_menuitems_for_record(&prefix, record)?; + rattler_menuinst::install_menuitems_for_record( + &prefix, + record, + Platform::current(), + MenuMode::User, + )?; Ok(()) } diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index 38efa3c7f..9421b830c 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -70,6 +70,8 @@ pub enum MenuInstError { pub fn install_menuitems_for_record( target_prefix: &Path, prefix_record: &PrefixRecord, + platform: Platform, + menu_mode: MenuMode, ) -> Result<(), MenuInstError> { // Look for Menu/*.json files in the package paths let menu_files: Vec<_> = prefix_record @@ -85,39 +87,29 @@ pub fn install_menuitems_for_record( }) .collect(); - if !menu_files.is_empty() { - for menu_file in menu_files { - let full_path = target_prefix.join(&menu_file.relative_path); - match install_menuitems( - &full_path, - target_prefix, - target_prefix, - Platform::current(), - MenuMode::User, - ) { - Ok(tracker_vec) => { - // Store tracker in the prefix record - let mut record = prefix_record.clone(); - record.installed_system_menus = tracker_vec; - - // Save the updated prefix record - record - .write_to_path( - target_prefix.join("conda-meta").join(record.file_name()), - true, - ) - .expect("Failed to write prefix record"); - } - Err(e) => { - tracing::warn!( - "Failed to install menu items for {}: {}", - full_path.display(), - e - ); - } - } - } + for menu_file in menu_files { + let full_path = target_prefix.join(&menu_file.relative_path); + let tracker_vec = install_menuitems( + &full_path, + target_prefix, + target_prefix, + platform, + menu_mode, + )?; + + // Store tracker in the prefix record + let mut record = prefix_record.clone(); + record.installed_system_menus = tracker_vec; + + // Save the updated prefix record + record + .write_to_path( + target_prefix.join("conda-meta").join(record.file_name()), + true, + ) + .expect("Failed to write prefix record"); } + Ok(()) } diff --git a/pixi.toml b/pixi.toml index 1855ef747..c78d3a3a5 100644 --- a/pixi.toml +++ b/pixi.toml @@ -23,7 +23,7 @@ rattler = "cargo run --bin rattler --release --" [dependencies] cxx-compiler = "~=1.6.0" -openssl = "~=3.1" +openssl = "<=3.3,<3.4" make = "~=4.3" pkg-config = "~=0.29.2" rust = "~=1.84.0" @@ -33,7 +33,7 @@ cargo-nextest = ">=0.9.91,<0.10" [target.linux-64.dependencies] clang = ">=18.1.8,<19.0" compilers = ">=1.6.0" -mold = ">=2.33.0,<3.0" +mold = "*" [target.linux-64.activation] scripts = ["scripts/activate_linux.sh"] From 8d84e8c7ccb7a05e090112bf6654d468becf8739 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Mon, 24 Feb 2025 15:56:37 +0100 Subject: [PATCH 125/132] Remove unneeded file --- .../data/menuinst.default.json | 68 ------------------- 1 file changed, 68 deletions(-) delete mode 100644 crates/rattler_menuinst/data/menuinst.default.json diff --git a/crates/rattler_menuinst/data/menuinst.default.json b/crates/rattler_menuinst/data/menuinst.default.json deleted file mode 100644 index ac04d612f..000000000 --- a/crates/rattler_menuinst/data/menuinst.default.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "menu_name": "REQUIRED", - "menu_items": [ - { - "name": "REQUIRED", - "description": "REQUIRED", - "command": [ - "REQUIRED" - ], - "icon": null, - "precommand": null, - "precreate": null, - "working_dir": null, - "activate": true, - "terminal": false, - "platforms": { - "linux": { - "Categories": null, - "DBusActivatable": null, - "GenericName": null, - "Hidden": null, - "Implements": null, - "Keywords": null, - "MimeType": null, - "NoDisplay": null, - "NotShowIn": null, - "OnlyShowIn": null, - "PrefersNonDefaultGPU": null, - "SingleMainWindow": null, - "StartupNotify": null, - "StartupWMClass": null, - "TryExec": null, - "glob_patterns": null - }, - "osx": { - "CFBundleDisplayName": null, - "CFBundleIdentifier": null, - "CFBundleName": null, - "CFBundleSpokenName": null, - "CFBundleVersion": null, - "CFBundleURLTypes": null, - "CFBundleDocumentTypes": null, - "LSApplicationCategoryType": null, - "LSBackgroundOnly": null, - "LSEnvironment": null, - "LSMinimumSystemVersion": null, - "LSMultipleInstancesProhibited": null, - "LSRequiresNativeExecution": null, - "NSSupportsAutomaticGraphicsSwitching": null, - "UTExportedTypeDeclarations": null, - "UTImportedTypeDeclarations": null, - "entitlements": null, - "link_in_bundle": null, - "event_handler": null - }, - "win": { - "desktop": true, - "quicklaunch": false, - "terminal_profile": null, - "url_protocols": null, - "file_extensions": null, - "app_user_model_id": null - } - } - } - ], - "$schema": "https://schemas.conda.org/menuinst-1-1-0.schema.json" -} \ No newline at end of file From 4ee5a3479c32698a2924195cf89c27b88d7524f4 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Mon, 24 Feb 2025 16:51:50 +0100 Subject: [PATCH 126/132] Clean up code --- crates/rattler_menuinst/Cargo.toml | 3 +- crates/rattler_menuinst/src/lib.rs | 1 - crates/rattler_menuinst/src/linux.rs | 27 +- crates/rattler_menuinst/src/linux/menu_xml.rs | 365 ------------------ ...enu_xml__tests__add_and_remove_menu-2.snap | 16 - ...enu_xml__tests__add_and_remove_menu-3.snap | 9 - ..._menu_xml__tests__add_and_remove_menu.snap | 9 - ...__add_and_remove_menu_xml_structure-2.snap | 16 - ...ts__add_and_remove_menu_xml_structure.snap | 23 -- ...xml__tests__remove_menu_xml_structure.snap | 10 - crates/rattler_menuinst/src/render.rs | 14 - crates/rattler_menuinst/src/utils/slugify.rs | 22 +- crates/rattler_menuinst/src/utils/terminal.rs | 15 +- 13 files changed, 39 insertions(+), 491 deletions(-) delete mode 100644 crates/rattler_menuinst/src/linux/menu_xml.rs delete mode 100644 crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu-2.snap delete mode 100644 crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu-3.snap delete mode 100644 crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu.snap delete mode 100644 crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu_xml_structure-2.snap delete mode 100644 crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu_xml_structure.snap delete mode 100644 crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__remove_menu_xml_structure.snap diff --git a/crates/rattler_menuinst/Cargo.toml b/crates/rattler_menuinst/Cargo.toml index 40ecf0ec8..61a2b19b9 100644 --- a/crates/rattler_menuinst/Cargo.toml +++ b/crates/rattler_menuinst/Cargo.toml @@ -24,6 +24,7 @@ tempfile = { workspace = true } fs-err = { workspace = true } which = { workspace = true } chrono = { workspace = true, features = ["clock"] } +once_cell = {workspace = true} [target.'cfg(target_os = "macos")'.dependencies] plist = { workspace = true } @@ -46,4 +47,4 @@ windows-registry = "0.5.0" [dev-dependencies] insta = { workspace = true, features = ["json"] } -configparser = { version = "3.1.0", features = ["indexmap"] } \ No newline at end of file +configparser = { version = "3.1.0", features = ["indexmap"] } diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index 9421b830c..a83d116d6 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -200,7 +200,6 @@ pub fn remove_menu_items(tracker: &Vec) -> Result<(), MenuInstError> { pub mod test { use std::path::{Path, PathBuf}; - #[allow(dead_code)] pub(crate) fn test_data() -> PathBuf { Path::new(env!("CARGO_MANIFEST_DIR")).join("test-data") } diff --git a/crates/rattler_menuinst/src/linux.rs b/crates/rattler_menuinst/src/linux.rs index 5d1e5d9aa..73bbb9658 100644 --- a/crates/rattler_menuinst/src/linux.rs +++ b/crates/rattler_menuinst/src/linux.rs @@ -8,7 +8,6 @@ use std::path::{Path, PathBuf}; use std::process::Command; use tempfile::TempDir; -mod menu_xml; mod mime_config; use rattler_conda_types::Platform; @@ -48,25 +47,27 @@ pub struct Directories { /// The configuration directory for the menu pub config_directory: PathBuf, - /// The location of the menu configuration file This is the file that is - /// used by the system to determine the menu layout It is usually located at - /// `~/.config/menus/applications.menu` + /// The location of the menu configuration file. + /// This is the file that is used by the system to determine the menu layout + /// It is usually located at `~/.config/menus/applications.menu` pub menu_config_location: PathBuf, - /// The location of the system menu configuration file This is the file that - /// is used by the system to determine the menu layout It is usually located - /// at `/etc/xdg/menus/applications.menu` + /// The location of the system menu configuration file + /// This is the file that is used by the system to determine the menu layout. + /// It is usually located at `/etc/xdg/menus/applications.menu` pub system_menu_config_location: PathBuf, - /// The location of the desktop entries This is a directory that contains - /// `.desktop` files that describe the applications that are shown in the - /// menu It is usually located at `/usr/share/applications` or + /// The location of the desktop entries + /// This is a directory that contains `.desktop` files + /// that describe the applications that are shown in the menu. + /// It is usually located at `/usr/share/applications` or /// `~/.local/share/applications` pub desktop_entries_location: PathBuf, - /// The location of the desktop-directories This is a directory that - /// contains `.directory` files that describe the directories that are shown - /// in the menu It is usually located at `/usr/share/desktop-directories` or + /// The location of the desktop-directories + /// This is a directory that contains `.directory` files + /// that describe the directories that are shown in the menu + /// It is usually located at `/usr/share/desktop-directories` or /// `~/.local/share/desktop-directories` pub directory_entry_location: PathBuf, } diff --git a/crates/rattler_menuinst/src/linux/menu_xml.rs b/crates/rattler_menuinst/src/linux/menu_xml.rs deleted file mode 100644 index aaac5cff9..000000000 --- a/crates/rattler_menuinst/src/linux/menu_xml.rs +++ /dev/null @@ -1,365 +0,0 @@ -//! Linux menu XML manipulation - -#![allow(dead_code)] -use chrono::Utc; -use fs_err::{self as fs, File}; -use quick_xml::{events::Event, Reader, Writer}; -use std::io::Write; -use std::path::PathBuf; - -use crate::{utils::slugify, MenuInstError}; - -pub struct MenuXml { - menu_config_location: PathBuf, - system_menu_config_location: PathBuf, - name: String, - mode: String, -} - -impl MenuXml { - pub fn new( - menu_config_location: PathBuf, - system_menu_config_location: PathBuf, - name: String, - mode: String, - ) -> Result { - Ok(Self { - menu_config_location, - system_menu_config_location, - name, - mode, - }) - } - - fn is_target_menu(&self, mut reader: Reader<&[u8]>) -> Result { - let mut buf = Vec::new(); - loop { - match reader.read_event_into(&mut buf)? { - Event::Start(e) if e.name().as_ref() == b"Name" => { - if let Event::Text(t) = reader.read_event_into(&mut buf)? { - return Ok(t.unescape()?.into_owned() == self.name); - } - } - Event::End(e) if e.name().as_ref() == b"Menu" => break, - _ => (), - } - } - Ok(false) - } - - fn contents(&self) -> Result { - Ok(fs::read_to_string(&self.menu_config_location)?) - } - - pub fn remove_menu(&self) -> Result<(), MenuInstError> { - tracing::info!( - "Editing {} to remove {} config", - self.menu_config_location.display(), - self.name - ); - - let contents = self.contents()?; - let mut reader = Reader::from_str(&contents); - reader.config_mut().trim_text(true); - - let mut writer = Writer::new_with_indent(Vec::new(), b' ', 2); - let mut buf = Vec::new(); - let mut skip_menu = false; - let mut depth = 0; - - loop { - match reader.read_event_into(&mut buf)? { - Event::Start(e) => { - if e.name().as_ref() == b"Menu" { - depth += 1; - if depth == 1 { - // Always write the root Menu element - writer.write_event(Event::Start(e))?; - } else { - // Check if this is our target menu - - if self.is_target_menu(reader.clone())? { - skip_menu = true; - } else { - writer.write_event(Event::Start(e))?; - } - } - } else if !skip_menu { - writer.write_event(Event::Start(e))?; - } - } - Event::End(e) => { - if skip_menu && e.name().as_ref() == b"Menu" { - skip_menu = false; - } else if !skip_menu { - writer.write_event(Event::End(e))?; - } - } - Event::Eof => break, - e => { - if !skip_menu { - writer.write_event(e)?; - } - } - } - buf.clear(); - } - - self.write_menu_file(&writer.into_inner()) - } - - pub fn has_menu(&self) -> Result { - let contents = self.contents()?; - let mut reader = Reader::from_str(&contents); - let mut buf = Vec::new(); - - loop { - match reader.read_event_into(&mut buf)? { - Event::Start(e) if e.name().as_ref() == b"Menu" => { - if self.is_target_menu(reader.clone())? { - return Ok(true); - } - } - Event::Eof => break, - _ => (), - } - buf.clear(); - } - Ok(false) - } - - pub fn add_menu(&self) -> Result<(), MenuInstError> { - tracing::info!( - "Editing {} to add {} config", - self.menu_config_location.display(), - self.name - ); - - let mut content = fs::read_to_string(&self.menu_config_location)?; - // let insert_pos = content.rfind("").ok_or_else(|| anyhow!("Invalid XML"))?; - let insert_pos = content.rfind("").unwrap(); - - let menu_entry = format!( - r#" - {} - {}.directory - - {} - - -"#, - self.name, - slugify(&self.name), - self.name - ); - - content.insert_str(insert_pos, &menu_entry); - self.write_menu_file(content.as_bytes()) - } - - pub fn is_valid_menu_file(&self) -> bool { - if let Ok(contents) = self.contents() { - let reader = Reader::from_str(&contents); - let mut buf = Vec::new(); - let mut reader = reader; - loop { - match reader.read_event_into(&mut buf) { - Ok(Event::Start(e)) => { - if e.name().as_ref() == b"Menu" { - return true; - } - } - Ok(Event::Eof) => break, - _ => (), - } - } - } - false - } - - fn write_menu_file(&self, content: &[u8]) -> Result<(), MenuInstError> { - tracing::info!("Writing {}", self.menu_config_location.display()); - let mut file = File::create(&self.menu_config_location)?; - file.write_all(content)?; - file.write_all(b"\n")?; - Ok(()) - } - - pub fn ensure_menu_file(&self) -> Result<(), MenuInstError> { - if self.menu_config_location.exists() && !self.menu_config_location.is_file() { - return Err(MenuInstError::MenuConfigNotAFile( - self.menu_config_location.clone(), - )); - } - - if self.menu_config_location.is_file() { - let timestamp = Utc::now().format("%Y-%m-%d_%Hh%Mm%S").to_string(); - let backup = format!("{}.{}", self.menu_config_location.display(), timestamp); - fs::copy(&self.menu_config_location, &backup)?; - - if !self.is_valid_menu_file() { - fs::remove_file(&self.menu_config_location)?; - } - } - - if !self.menu_config_location.exists() { - self.new_menu_file()?; - } - Ok(()) - } - - fn new_menu_file(&self) -> Result<(), MenuInstError> { - tracing::info!("Creating {}", self.menu_config_location.display()); - let mut content = String::from("\n"); - content.push_str("\n Applications\n"); - - if self.mode == "user" { - content.push_str(&format!( - " {}\n", - self.system_menu_config_location.display() - )); - } - content.push_str("\n"); - fs::write(&self.menu_config_location, content)?; - Ok(()) - } -} - -#[cfg(test)] -mod tests { - use crate::test::test_data; - - use super::*; - use tempfile::TempDir; - - fn setup_test_dir() -> (TempDir, MenuXml) { - let temp_dir = TempDir::new().unwrap(); - let menu_config = temp_dir.path().join("applications.menu"); - let system_menu_config = temp_dir.path().join("system_applications.menu"); - - let menu_xml = MenuXml::new( - menu_config, - system_menu_config, - "Test Menu".to_string(), - "user".to_string(), - ) - .unwrap(); - - (temp_dir, menu_xml) - } - - #[test] - fn test_new_menu_file() { - let (_temp_dir, menu_xml) = setup_test_dir(); - menu_xml.new_menu_file().unwrap(); - assert!(menu_xml.is_valid_menu_file()); - } - - #[test] - fn test_add_and_remove_menu() { - let (_temp_dir, menu_xml) = setup_test_dir(); - menu_xml.new_menu_file().unwrap(); - - let system_menu_location = menu_xml.system_menu_config_location.display().to_string(); - - let res = fs::read_to_string(&menu_xml.menu_config_location).unwrap(); - let res = res.replace(&system_menu_location, "/path/to/system_menu"); - insta::assert_snapshot!(res); - - // Add menu - menu_xml.add_menu().unwrap(); - assert!(menu_xml.has_menu().unwrap()); - - let res = fs::read_to_string(&menu_xml.menu_config_location).unwrap(); - let res = res.replace(&system_menu_location, "/path/to/system_menu"); - insta::assert_snapshot!(res); - - // Remove menu - menu_xml.remove_menu().unwrap(); - - let res = fs::read_to_string(&menu_xml.menu_config_location).unwrap(); - let res = res.replace(&system_menu_location, "/path/to/system_menu"); - insta::assert_snapshot!(res); - assert!(!menu_xml.has_menu().unwrap()); - } - - #[test] - fn test_invalid_menu_file() { - let (_temp_dir, menu_xml) = setup_test_dir(); - - // Write invalid content - fs::write(&menu_xml.menu_config_location, "XML").unwrap(); - assert!(!menu_xml.is_valid_menu_file()); - } - - #[test] - fn test_ensure_menu_file() { - let (_temp_dir, menu_xml) = setup_test_dir(); - - // Test with non-existent file - menu_xml.ensure_menu_file().unwrap(); - assert!(menu_xml.menu_config_location.exists()); - assert!(menu_xml.is_valid_menu_file()); - - // Test with invalid file - fs::write(&menu_xml.menu_config_location, "XML").unwrap(); - menu_xml.ensure_menu_file().unwrap(); - assert!(menu_xml.is_valid_menu_file()); - } - - #[test] - fn test_remove_menu_xml_structure() { - let (_temp_dir, menu_xml) = setup_test_dir(); - - // Create initial menu file with content - let initial_content = r#" - - Applications - /path/to/system_menu - - Test Menu - test-menu.directory - - Test Menu - - - "#; - - fs::write(&menu_xml.menu_config_location, initial_content).unwrap(); - - // Remove the menu - menu_xml.remove_menu().unwrap(); - - // Read and verify the result - let result = fs::read_to_string(&menu_xml.menu_config_location).unwrap(); - - insta::assert_snapshot!(result); - } - - #[test] - // load file from test data (example.menu) and add a new entry, then remove it - fn test_add_and_remove_menu_xml_structure() { - let (_temp_dir, menu_xml) = setup_test_dir(); - - let test_data = test_data(); - let schema_path = test_data.join("linux-menu/example.menu"); - - // Copy the example.menu file to the menu location - fs::copy(&schema_path, &menu_xml.menu_config_location).unwrap(); - - // Add the menu - menu_xml.add_menu().unwrap(); - - // Read and verify the result - let result = fs::read_to_string(&menu_xml.menu_config_location).unwrap(); - insta::assert_snapshot!(result); - - // Remove the menu - menu_xml.remove_menu().unwrap(); - - // Read and verify the result - let result = fs::read_to_string(&menu_xml.menu_config_location).unwrap(); - insta::assert_snapshot!(result); - } -} diff --git a/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu-2.snap b/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu-2.snap deleted file mode 100644 index 9dc7a87d5..000000000 --- a/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu-2.snap +++ /dev/null @@ -1,16 +0,0 @@ ---- -source: crates/rattler_menuinst/src/linux/menu_xml.rs -expression: res ---- - - - Applications - /path/to/system_menu - - Test Menu - test-menu.directory - - Test Menu - - - diff --git a/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu-3.snap b/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu-3.snap deleted file mode 100644 index 7946a27d6..000000000 --- a/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu-3.snap +++ /dev/null @@ -1,9 +0,0 @@ ---- -source: crates/rattler_menuinst/src/linux/menu_xml.rs -expression: res ---- - - - Applications - /path/to/system_menu - diff --git a/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu.snap b/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu.snap deleted file mode 100644 index 7946a27d6..000000000 --- a/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu.snap +++ /dev/null @@ -1,9 +0,0 @@ ---- -source: crates/rattler_menuinst/src/linux/menu_xml.rs -expression: res ---- - - - Applications - /path/to/system_menu - diff --git a/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu_xml_structure-2.snap b/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu_xml_structure-2.snap deleted file mode 100644 index 73a62efdf..000000000 --- a/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu_xml_structure-2.snap +++ /dev/null @@ -1,16 +0,0 @@ ---- -source: crates/rattler_menuinst/src/linux/menu_xml.rs -expression: result ---- - - - Applications - - WebMirror - shinythings-webmirror.directory - - shinythings-webmirror.desktop - shinythings-webmirror-admin.desktop - - diff --git a/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu_xml_structure.snap b/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu_xml_structure.snap deleted file mode 100644 index 7316724e9..000000000 --- a/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__add_and_remove_menu_xml_structure.snap +++ /dev/null @@ -1,23 +0,0 @@ ---- -source: crates/rattler_menuinst/src/linux/menu_xml.rs -expression: result ---- - - -Applications - - WebMirror - shinythings-webmirror.directory - - shinythings-webmirror.desktop - shinythings-webmirror-admin.desktop - - - Test Menu - test-menu.directory - - Test Menu - - - diff --git a/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__remove_menu_xml_structure.snap b/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__remove_menu_xml_structure.snap deleted file mode 100644 index 7055eba36..000000000 --- a/crates/rattler_menuinst/src/linux/snapshots/rattler_menuinst__linux__menu_xml__tests__remove_menu_xml_structure.snap +++ /dev/null @@ -1,10 +0,0 @@ ---- -source: crates/rattler_menuinst/src/linux/menu_xml.rs -expression: result ---- - - - Applications - /path/to/system_menu - diff --git a/crates/rattler_menuinst/src/render.rs b/crates/rattler_menuinst/src/render.rs index 7aef34bac..ebce68b16 100644 --- a/crates/rattler_menuinst/src/render.rs +++ b/crates/rattler_menuinst/src/render.rs @@ -14,18 +14,6 @@ impl PlaceholderString { } } -#[allow(dead_code)] -pub fn resolve( - input: &Option, - placeholders: impl AsRef>, - default: &str, -) -> String { - match input { - Some(s) => s.resolve(placeholders), - None => default.to_string(), - } -} - pub struct BaseMenuItemPlaceholders { placeholders: HashMap, } @@ -65,8 +53,6 @@ impl BaseMenuItemPlaceholders { vars.insert("PYTHONAPP", prefix.join("python.app/Contents/MacOS/python")); } - // vars.insert("MENU_ITEM_LOCATION", menu_item_location.to_path_buf()); - let mut vars: HashMap = vars .into_iter() .map(|(k, v)| (k.to_string(), v.to_string_lossy().to_string())) diff --git a/crates/rattler_menuinst/src/utils/slugify.rs b/crates/rattler_menuinst/src/utils/slugify.rs index 919ed2531..7faade677 100644 --- a/crates/rattler_menuinst/src/utils/slugify.rs +++ b/crates/rattler_menuinst/src/utils/slugify.rs @@ -1,18 +1,32 @@ +use once_cell::sync::Lazy; use regex::Regex; use unicode_normalization::UnicodeNormalization; +/// Converts a given text to a slug. +/// +/// This function performs the following steps: +/// 1. Normalizes the text using Unicode normalization and removes non-ASCII characters. +/// 2. Removes special characters, converts the text to lowercase, and trims whitespace. +/// 3. Replaces whitespace and hyphens with a single hyphen. +/// +/// # Examples +/// +/// ``` +/// let slug = slugify("Hello, World!"); +/// assert_eq!(slug, "hello-world"); +/// ``` pub fn slugify(text: &str) -> String { // Normalize the text and remove non-ASCII characters let normalized = text.nfkd().filter(char::is_ascii).collect::(); // Remove special characters, convert to lowercase, and trim - let re_special = Regex::new(r"[^\w\s-]").expect("Invalid regex"); - let without_special = re_special.replace_all(&normalized, "").to_string(); + static RE_SPECIAL: Lazy = Lazy::new(|| Regex::new(r"[^\w\s-]").expect("Invalid regex")); + let without_special = RE_SPECIAL.replace_all(&normalized, "").to_string(); let trimmed = without_special.trim().to_lowercase(); // Replace whitespace and hyphens with a single hyphen - let re_spaces = Regex::new(r"[_\s-]+").expect("Invalid regex"); - re_spaces.replace_all(&trimmed, "-").to_string() + static RE_SPACES: Lazy = Lazy::new(|| Regex::new(r"[_\s-]+").expect("Invalid regex")); + RE_SPACES.replace_all(&trimmed, "-").to_string() } #[cfg(test)] diff --git a/crates/rattler_menuinst/src/utils/terminal.rs b/crates/rattler_menuinst/src/utils/terminal.rs index fcf695f1b..023bc02d0 100644 --- a/crates/rattler_menuinst/src/utils/terminal.rs +++ b/crates/rattler_menuinst/src/utils/terminal.rs @@ -34,19 +34,14 @@ pub fn run_pre_create_command(pre_create_command: &str) -> Result<(), crate::Men }; let output = cmd.output()?; - if !output.status.success() { - tracing::error!( + if output.status.success() { + Ok(()) + } else { + Err(MenuInstError::InstallError(format!( "Failed to run pre-create command (status: {}): \nstdout: {}\nstderr: {}", output.status, String::from_utf8_lossy(&output.stdout), String::from_utf8_lossy(&output.stderr) - ); - - return Err(MenuInstError::InstallError(format!( - "Failed to run pre-create command: {}", - String::from_utf8_lossy(&output.stderr) - ))); + ))) } - - Ok(()) } From 1ad46b383d0ab7efcc18e5eec610a91ddba9be2a Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Mon, 24 Feb 2025 16:57:11 +0100 Subject: [PATCH 127/132] Remove unneeded test data --- .../test-data/mne_menu/menu/LICENSE.txt | 6 - .../test-data/mne_menu/menu/console.icns | Bin 25290 -> 0 bytes .../test-data/mne_menu/menu/console.ico | Bin 165935 -> 0 bytes .../test-data/mne_menu/menu/console.png | Bin 11397 -> 0 bytes .../test-data/mne_menu/menu/forum.icns | Bin 96520 -> 0 bytes .../test-data/mne_menu/menu/forum.ico | Bin 299932 -> 0 bytes .../test-data/mne_menu/menu/forum.png | Bin 15823 -> 0 bytes .../test-data/mne_menu/menu/info.icns | Bin 49946 -> 0 bytes .../test-data/mne_menu/menu/info.ico | Bin 301278 -> 0 bytes .../test-data/mne_menu/menu/info.png | Bin 16668 -> 0 bytes .../test-data/mne_menu/menu/menu.json | 168 ------------------ .../test-data/mne_menu/menu/mne.png | Bin 165760 -> 0 bytes .../test-data/mne_menu/menu/mne_sys_info.py | 25 --- .../mne_menu/menu/open_prompt.applescript | 4 - .../test-data/mne_menu/menu/open_prompt.bat | 10 -- .../test-data/mne_menu/menu/open_prompt.sh | 10 -- .../test-data/mne_menu/menu/spyder.icns | Bin 31281 -> 0 bytes .../test-data/mne_menu/menu/spyder.ico | Bin 311358 -> 0 bytes .../test-data/mne_menu/menu/spyder.png | Bin 19403 -> 0 bytes .../test-data/mne_menu/menu/web.icns | Bin 71075 -> 0 bytes .../test-data/mne_menu/menu/web.ico | Bin 310263 -> 0 bytes .../test-data/mne_menu/menu/web.png | Bin 24622 -> 0 bytes .../test-data/pixi-editor/menu/menu.json | 55 ------ .../test-data/pixi-editor/menu/pixi-icon.icns | Bin 243049 -> 0 bytes .../test-data/pixi-editor/menu/pixi-icon.ico | Bin 45971 -> 0 bytes .../test-data/pixi-editor/menu/pixi-icon.png | Bin 47011 -> 0 bytes .../test-data/pixi-editor/recipe.yaml | 17 -- crates/rattler_solve/src/lib.rs | 1 - crates/rattler_solve/src/multi.rs | 0 29 files changed, 296 deletions(-) delete mode 100644 crates/rattler_menuinst/test-data/mne_menu/menu/LICENSE.txt delete mode 100644 crates/rattler_menuinst/test-data/mne_menu/menu/console.icns delete mode 100644 crates/rattler_menuinst/test-data/mne_menu/menu/console.ico delete mode 100644 crates/rattler_menuinst/test-data/mne_menu/menu/console.png delete mode 100644 crates/rattler_menuinst/test-data/mne_menu/menu/forum.icns delete mode 100644 crates/rattler_menuinst/test-data/mne_menu/menu/forum.ico delete mode 100644 crates/rattler_menuinst/test-data/mne_menu/menu/forum.png delete mode 100644 crates/rattler_menuinst/test-data/mne_menu/menu/info.icns delete mode 100644 crates/rattler_menuinst/test-data/mne_menu/menu/info.ico delete mode 100644 crates/rattler_menuinst/test-data/mne_menu/menu/info.png delete mode 100644 crates/rattler_menuinst/test-data/mne_menu/menu/menu.json delete mode 100644 crates/rattler_menuinst/test-data/mne_menu/menu/mne.png delete mode 100644 crates/rattler_menuinst/test-data/mne_menu/menu/mne_sys_info.py delete mode 100644 crates/rattler_menuinst/test-data/mne_menu/menu/open_prompt.applescript delete mode 100755 crates/rattler_menuinst/test-data/mne_menu/menu/open_prompt.bat delete mode 100755 crates/rattler_menuinst/test-data/mne_menu/menu/open_prompt.sh delete mode 100644 crates/rattler_menuinst/test-data/mne_menu/menu/spyder.icns delete mode 100644 crates/rattler_menuinst/test-data/mne_menu/menu/spyder.ico delete mode 100644 crates/rattler_menuinst/test-data/mne_menu/menu/spyder.png delete mode 100644 crates/rattler_menuinst/test-data/mne_menu/menu/web.icns delete mode 100644 crates/rattler_menuinst/test-data/mne_menu/menu/web.ico delete mode 100644 crates/rattler_menuinst/test-data/mne_menu/menu/web.png delete mode 100644 crates/rattler_menuinst/test-data/pixi-editor/menu/menu.json delete mode 100644 crates/rattler_menuinst/test-data/pixi-editor/menu/pixi-icon.icns delete mode 100644 crates/rattler_menuinst/test-data/pixi-editor/menu/pixi-icon.ico delete mode 100644 crates/rattler_menuinst/test-data/pixi-editor/menu/pixi-icon.png delete mode 100644 crates/rattler_menuinst/test-data/pixi-editor/recipe.yaml delete mode 100644 crates/rattler_solve/src/multi.rs diff --git a/crates/rattler_menuinst/test-data/mne_menu/menu/LICENSE.txt b/crates/rattler_menuinst/test-data/mne_menu/menu/LICENSE.txt deleted file mode 100644 index f92369c54..000000000 --- a/crates/rattler_menuinst/test-data/mne_menu/menu/LICENSE.txt +++ /dev/null @@ -1,6 +0,0 @@ -The Spyder icons were taken from the Spyder project -(https://github.com/spyder-ide/spyder) and are therefore placed -under an MIT license. - -The other icons were taken from https://github.com/paomedia/small-n-flat and -are placed in the public domain. diff --git a/crates/rattler_menuinst/test-data/mne_menu/menu/console.icns b/crates/rattler_menuinst/test-data/mne_menu/menu/console.icns deleted file mode 100644 index 3c7896f60fee9bfa43f5ddfe8c1b0fd74bc0d30a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25290 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 R<0yV4Z_rGE2C+ZS{~y25Cr$tW diff --git a/crates/rattler_menuinst/test-data/mne_menu/menu/console.ico b/crates/rattler_menuinst/test-data/mne_menu/menu/console.ico deleted file mode 100644 index cf824a41ecdabd2adf5c5d0d68ca0e6eca8497d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165935 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 Tb3i`0ud>q_Qbn;pxbOb~V=rQ# diff --git a/crates/rattler_menuinst/test-data/mne_menu/menu/console.png b/crates/rattler_menuinst/test-data/mne_menu/menu/console.png deleted file mode 100644 index 836099c53a785cf922fb8c7d22b32dac825ea26f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11397 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 w9uPUIA=JWu0b>7P?EnA( diff --git a/crates/rattler_menuinst/test-data/mne_menu/menu/forum.ico b/crates/rattler_menuinst/test-data/mne_menu/menu/forum.ico deleted file mode 100644 index 66f945fb50c9adcbfda911e0115f1d2da9ee9f7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 299932 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 a#rDQatnbP9`0v=vaXZQ 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 diff --git a/crates/rattler_menuinst/test-data/mne_menu/menu/forum.png b/crates/rattler_menuinst/test-data/mne_menu/menu/forum.png deleted file mode 100644 index f85b57588c6f6446186ec582e1c8c588df7c4f18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15823 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

$sGPA{ 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 a0r9ITtS`eFOAv?M0Qu+2(q)n+LH`4B4>vym diff --git a/crates/rattler_menuinst/test-data/mne_menu/menu/info.icns b/crates/rattler_menuinst/test-data/mne_menu/menu/info.icns deleted file mode 100644 index 635cde1b0684960bd9d1946f959ec32a02cdc24d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49946 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 diff --git a/crates/rattler_menuinst/test-data/mne_menu/menu/info.ico b/crates/rattler_menuinst/test-data/mne_menu/menu/info.ico deleted file mode 100644 index 24a4118058ba90627b1e8afb8d0a57e512242adf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 301278 zcmeEP2YeO9*WDy^siJ~(QFviAD=Eq_7%}%-Z+&irApS{-y_{;MHQufefhhJqSURZC@ouBe^HO%V~t0kD3D`U z5i7)RyZ;4$OW6|I%YNaN^lUa#uP&mUDSu()r{ z=T?4Rd&Pz?>z&#(r2Zv>$Bg4SreRwBAIfK)*DU|6_Q1_U>Yv{;I$qs7COa6%b4_JKKjhxVZPLM(Uogny8z;x>x;k%zXkpW*pBk4bw6Y^Dh6iwzBM# zT2;3WYmmfd`-BL6Ih^)t_< zpYCK{;^S=jA>Y24�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

k6vDH?(6bre8hp>+?KojZ`$q% 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 diff --git a/crates/rattler_menuinst/test-data/mne_menu/menu/menu.json b/crates/rattler_menuinst/test-data/mne_menu/menu/menu.json deleted file mode 100644 index 78d3b8834..000000000 --- a/crates/rattler_menuinst/test-data/mne_menu/menu/menu.json +++ /dev/null @@ -1,168 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft-07/schema", - "$id": "https://schemas.conda.io/menuinst-1.schema.json", - "menu_name": "MNE-Python (1.2.3)", - "menu_items": [{ - "name": "Spyder (MNE)", - "description": "The Spyder development environment", - "icon": "{{ MENU_DIR }}/spyder.{{ ICON_EXT }}", - "command": ["will be overridden in platforms section"], - "activate": true, - "terminal": false, - "platforms": { - "win": { - "command": [ - "{{ PYTHONW }}", - "{{ SCRIPTS_DIR }}\\spyder-script.py" - ], - "desktop": false - }, - "linux": { - "command": ["spyder"], - "Categories": [ - "Science" - ] - }, - "osx": { - "command": ["spyder"], - "CFBundleName": "Spyder (MNE-Python 1.2.3)", - "CFBundleDisplayName": "Spyder (MNE-Python 1.2.3)", - "CFBundleVersion": "1.2.3" - } - } - }, - { - "name": "System Info (MNE)", - "description": "Information on the MNE-Python runtime environment", - "icon": "{{ MENU_DIR }}/info.{{ ICON_EXT }}", - "command": [ - "{{ PYTHON }}", - "{{ MENU_DIR }}/mne_sys_info.py" - ], - "activate": true, - "terminal": true, - "platforms": { - "win": { - "desktop": false - }, - "linux": { - "Categories": [ - "Science" - ] - }, - "osx": { - "CFBundleName": "System Information (MNE-Python 1.2.3)", - "CFBundleDisplayName": "System Information (MNE-Python 1.2.3)", - "CFBundleVersion": "1.2.3" - } - } - }, - { - "name": "Prompt (MNE)", - "description": "MNE-Python console prompt", - "icon": "{{ MENU_DIR }}/console.{{ ICON_EXT }}", - "activate": true, - "terminal": true, - "command": ["will be overridden in platforms section"], - "platforms": { - "win": { - "command": [ - "%SystemRoot%\\system32\\cmd.exe", - "/K", - "{{ MENU_DIR }}\\open_prompt.bat" - ], - "desktop": false - }, - "linux": { - "command": [ - "exec", - "bash", - "--init-file", - "{{ MENU_DIR }}/open_prompt.sh" - ], - "Categories": [ - "Science" - ] - }, - "osx": { - "command": [ - "osascript", - "{{ MENU_DIR }}/open_prompt.applescript" - ], - "CFBundleName": "Prompt (MNE-Python 1.2.3)", - "CFBundleDisplayName": "Prompt (MNE-Python 1.2.3)", - "CFBundleVersion": "1.2.3" - } - } - }, - { - "name": "Tutorials (MNE)", - "description": "MNE-Python online tutorials", - "icon": "{{ MENU_DIR }}/web.{{ ICON_EXT }}", - "activate": false, - "terminal": false, - "command": ["will be overridden in platforms section"], - "platforms": { - "win": { - "command": [ - "%SystemRoot%\\system32\\WindowsPowerShell\\v1.0\\powershell.exe", - "\"start https://mne.tools/stable/auto_tutorials -WindowStyle hidden\"" - ], - "desktop": false - }, - "linux": { - "command": [ - "xdg-open", - "https://mne.tools/stable/auto_tutorials/" - ], - "Categories": [ - "Science" - ] - }, - "osx": { - "command": [ - "open", - "https://mne.tools/stable/auto_tutorials/" - ], - "CFBundleName": "Tutorials (MNE-Python 1.2.3)", - "CFBundleDisplayName": "Tutorials (MNE-Python 1.2.3)", - "CFBundleVersion": "1.2.3" - } - } - }, - { - "name": "User Forum (MNE)", - "description": "MNE-Python forum for discussions, problem solving, and information exchange", - "icon": "{{ MENU_DIR }}/forum.{{ ICON_EXT }}", - "activate": false, - "terminal": false, - "command": ["will be overridden in platforms section"], - "platforms": { - "win": { - "command": [ - "%SystemRoot%\\system32\\WindowsPowerShell\\v1.0\\powershell.exe", - "\"start https://mne.discourse.group -WindowStyle hidden\"" - ], - "desktop": false - }, - "linux": { - "command": [ - "xdg-open", - "https://mne.discourse.group" - ], - "Categories": [ - "Science" - ] - }, - "osx": { - "command": [ - "open", - "https://mne.discourse.group" - ], - "CFBundleName": "Forum (MNE-Python 1.2.3)", - "CFBundleDisplayName": "Forum (MNE-Python 1.2.3)", - "CFBundleVersion": "1.2.3" - } - } - }] -} diff --git a/crates/rattler_menuinst/test-data/mne_menu/menu/mne.png b/crates/rattler_menuinst/test-data/mne_menu/menu/mne.png deleted file mode 100644 index 864f8160be8992ac58a32f3d06c59a9dc1a4fb15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165760 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%0AtclFf9NiJ*`h0zlA!D8GBx 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 diff --git a/crates/rattler_menuinst/test-data/mne_menu/menu/mne_sys_info.py b/crates/rattler_menuinst/test-data/mne_menu/menu/mne_sys_info.py deleted file mode 100644 index 5c0d59a4d..000000000 --- a/crates/rattler_menuinst/test-data/mne_menu/menu/mne_sys_info.py +++ /dev/null @@ -1,25 +0,0 @@ -# This will be invoked by the System Information menu entry - -import tempfile -import mne - - -def main(): - report = mne.Report(title='MNE System Information') - report.add_sys_info(title='System Information') - - report_file = tempfile.NamedTemporaryFile( - prefix='mne_sys_info', - suffix='.html', - delete=False - ) - report_file.close() # close it so we can open it again for writing - report.save( - fname=report_file.name, - open_browser=True, - overwrite=True - ) - - -if __name__ == '__main__': - main() diff --git a/crates/rattler_menuinst/test-data/mne_menu/menu/open_prompt.applescript b/crates/rattler_menuinst/test-data/mne_menu/menu/open_prompt.applescript deleted file mode 100644 index 9944f7b07..000000000 --- a/crates/rattler_menuinst/test-data/mne_menu/menu/open_prompt.applescript +++ /dev/null @@ -1,4 +0,0 @@ -tell application "Terminal" - do script "source __PREFIX__/Menu/mne_open_prompt.sh" - activate -end tell diff --git a/crates/rattler_menuinst/test-data/mne_menu/menu/open_prompt.bat b/crates/rattler_menuinst/test-data/mne_menu/menu/open_prompt.bat deleted file mode 100755 index 0b087b0a8..000000000 --- a/crates/rattler_menuinst/test-data/mne_menu/menu/open_prompt.bat +++ /dev/null @@ -1,10 +0,0 @@ -:: This is used to initialize the bash prompt on Windows. -@ECHO OFF - -call %__PREFIX__%\Scripts\Activate.bat -FOR /F "tokens=*" %%g IN ('python --version') do (SET PYVER=%%g) -FOR /F "tokens=*" %%g IN ('where python') do (SET PYPATH=%%g) -FOR /F "tokens=*" %%g IN ('mne --version') do (SET MNEVER=%%g) - -ECHO Using %PYVER% from %PYPATH% -ECHO This is %MNEVER% diff --git a/crates/rattler_menuinst/test-data/mne_menu/menu/open_prompt.sh b/crates/rattler_menuinst/test-data/mne_menu/menu/open_prompt.sh deleted file mode 100755 index 075cce969..000000000 --- a/crates/rattler_menuinst/test-data/mne_menu/menu/open_prompt.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -# This is used to initialize the bash prompt on macOS and Linux. - -if [[ -f ~/.bashrc ]] && [[ ${OSTYPE} != 'darwin'* ]]; then - source ~/.bashrc -fi -source __PREFIX__/bin/activate -echo "Using $(python --version) from $(which python)" -echo "This is $(mne --version)" diff --git a/crates/rattler_menuinst/test-data/mne_menu/menu/spyder.icns b/crates/rattler_menuinst/test-data/mne_menu/menu/spyder.icns deleted file mode 100644 index 8bcd28b9403b236868b17acc3383ea54effc6f50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31281 zcmeFZV~}S-(=YgM+qP}nHm7adw%s$+wr$(CZQFMD&ilsQjg8$K`)R-2xKEv`NJO4I z$cU_8)X6%Q#&*sCfESacF(cO{u`hW5dUQZKrptqar!SE0D$;!5F4AAngKxnTLuDv{GZkU;C~0; zpZu@=b7%ac@S_A^{x9i&xce{mzuW&q2893u`oH>*34jCuB;sUh=wk20O(<>XtZ3>) zsAlTqY-w*t$VAV@$VkuhqYQxk=LrY^1_}xQ`q2TP2ntF{D*oU5k1hZe=zppO{-0_= z{@>cafd6`30FTpumq^$NqJ-RJTWDaT7U2Og03@=^_xE0bgUCo=9aJaEE{mhYGaRFE=YQbz0i|V%b=+)U6ctxzwbX?SeIoMKI zo=;w2nuK74FRRzWYHeJn;SZ{i^oK zMz0&YvvUBK{$OqpQ_XcgP~5-ySWLB`NdL-`c_W#=FA%?3Xky>2L=o9E5}3q{Kjy91 zz33r`hTG5bD(b*Pc&~-gYWe}faTe#E1JpG&8xa!F84`GByh@C~-RmW6pG^k>YvF~S z#Uz1aVc$d{w$>_tP;nYnHq2U5>sv+3RMfN^#DVNQMRxgr=k$OG=~M#Tz`-#;rZDSe zFalD&>u%;EK?eO8;BkjolT14(dj6MxfSokCwD#tsIRHIS?h8d0nw5Lr=OMXm=l+P&)zltHujVyf_){?x`Dk3NyGz) zzA}{>3TpxShq=3Ed_{pge7z-1uC)R*=B1-$gqi;MoKPNuP*j&2 zl;wzrc+fN1Knr70NTC{Hg87rZ+{(`+t|-xzIwg=$&3(!Fd<9X~DukC|Xov>_6mp&! zT^{I+^>v<^e3*8Gh9h&qHhqHW($SCwC+YQtAGsM0tGaaN3rM z&0jHremLL?Okm>VQ6NlODg`MN@AS{4z{p>mo~2%^$tJ?}3=`Zv3=qT}%D?V6rh3YH zy0Uzc{HC%@aeoioXkD=^O21xGG#Z8Nq&_e3crox^`5dXZi9zM5+P8i;VlGDn1~jVR z<}8oX;+NZ=adYOuUR%k53CJGUfdEBxDNS|Chg|#}BlKSQunPF2JEdDr@MaVBUU^4( z!DQ9?P8=b16NYc*+b2LmS-(@kMXIrYY9iKT-Rb3%Eg=iYbJ{VI67XfDK+cIl+Lxdm zeoo02cH>q`I1c^mVxG#lAyK!2(j-ICP`z&cevD!^jCg7b&V^^1b4;~di>iO~hYq?d zj?U9Y9Z^g~MOCC;07eglmSh@rW2X2dXL^A2vH6qIFMBvm{|xSB4gnVBQaFY(Io?Ka z&&kVI=F;d&JU$*zxjZruQDL_(1tOVXCrixF)#dXn_g@6tb&&zJ^?rXW$iy9TWHwcKn;-#uLy&ur91oJ7AF%b0}wVoK1{hArXJ7KYmN_4c*ez0)AAiQ>yMt(<4Cli}Rxx}6{G zjAZ+Cf~6Rj-GLpxDvt=G$gdSF=$JnI>u<}WWP#MaKTXmqV_dPBF(JPL;5oPN!adC| znX!lb|AiQ3F~Ei@-_geNrsRiL7j;>3qw-hr8%Xa^s6h;)?>FZ$^be}+xT|yjhLX|_ zyYi4PBUGYKsQWe{@*hp9fettVX+H6$+`K%9w zx`_Who?kp`#qZuM!URYsKfsfaV!8at>e5A;UI*GDvYZrk7UC7W#TO0O1&xP>^KM7o zmH&T2{=Z$wXZra4pdKFBu>WQ&L>;@@0Y&e|(lVe$4=&f6Xxz8(Gt5ZdwI5o;DMLeq zREn|DumTeSWwt22-jW1$-egKRTm(wYA*1=nU? z==^pcBKKmImlp#LD1zr!7NXnd7ay1DIag5Bl^ zyqas9YR6&4VkCqcc_X|~wb-L}KD_G+U((z97!s1!)@eQ4od!?)Cqbzx^0*)NanRj$r(_20(43rP* zeSCjClioP^8F+DGq6rCD2$HB=OQ~sZ#vY2Z@3cFM5W!h8e{!lVyQ-RlmB)`GTT`{5 zP~t^-6s^dYU*;Atk;D4JGE+ntmMs%!)1Fniv=%OYntkN&1wUQzC`+9fbRzX*OD3qk z7Bd=)p0{DA?OGC7^iw;!)b6^S)V9SWk}|BmRDZFq_8j_!kppr7aXOJ)W93URb{bwy z>To{B6XYxAv_|=j=UiVEsIo>V`58nZe(+_d3z55DyX~dQ5v3ZdrW;J>zb+T%KX!qr#04h^E?sfC@LTvi@ukrpwHogkvY`ulQiK|HdEk zd}13$NG5{&93(?+PfzhK_e_n+QrdOwKc@U^U;Ig5N|;Am?E4tWb;eICGM3&3PMd2> z9gV9ErGO*3Y4Srv(J*?|R}|mgC#Z38CCfS>f;V)K!uqBqgq>q84-Brs+u8$~RnQga zNcrOwOh{BKBUdf2cGCH(A?GXvb!{S5vpP3;`my*^lqK13-v?Z;vZX}iJevz!97f)L zr4$aE6T#AwvnqPVEypGma(r1U7z;BeOIQ<#CLO+;hZ3|Ym9{A_8^3MFXF>+!)2MhB zGUI+1DKM75RY1ZsqH>uIpCI|QXeayH_KQa+mqylvF}l;n{I&>54itnR61ymPp)24N z-eB{lLG!RxDZ-pyZL-#vroL|@qppx0NM3U9*wiV{v>rV&^e`ALNSEtN^f}ZF`Na-w zu>*D7-#AA6uiQ-f!15ik;flS|TPkUmcY@auBqIuiIn14y(6Z6VU&;E<4~qQvh&u6J zJS9mfqVS|zbI4oHrV+#jdoT(~1cx;ZL>N$gjC)bPo*voc^I^}4(Qg^?1Z3$8yz7z4 zjGaS{-O_T5W1C7COvcm`VNWLY#50Ki=&foW40laxs(br0&mzI%dNrMO`V7 z$IBocJ>_-Z)XD|nR&IQUtkQvAdhf|4KoxuqHFk)ick@I?41#!dbZyZ@K&*|i zJDN%@5`;Sg8bF@)m3OKatwJ;MQ3r}J5?;vQ@4@yhy~mJw+{j1-9h5-{Q}+kqym*mS zb|$Xu$X6_kCBT_cOY+eRbylPzSlqNs@OC)!QDyW;hK^sfRo4eNa=b{#C~6T)f@Phq zj1!0I7x~N0afQDI&;(u`N6!h*3mWUM?X{;|z@$~3Ms9LqiE#kw1TK|>Vr*Ne81KXT ztKqdcsLuO$ z54bWe7Y(kPkq2B)&-Fxn1AV!@0h4zKs%<2Oy*3kIVD{{Bw}bj0AKs3$631^s>xYff zK@D{{md;_qwvT|U(?Gn$ib}^pH@m{dsc)w1 zAb~>D4NpeZD6r}pDn0O7yK_T0<~_0%i?u4#J?22W8@~_#yLDqeQAel9&2ck?3xS5~v-bLUz)R_yB#UC3KESmEf#a zy?0=GoyoHs(VunaI?LC958Ni0c5ObExoax1gX$gq*_r)O8q6^o1B_aW5HL zPdcvr?(5KfyR)>;M}g>zJ<&qB_`aMqnSCWX_MIT=CiB*VFw#Y+N*`W~Z@Zty-aF{T zlE0{YgxsN&{!jLTe|wr-1c^2ksc@t@lcy03s~#FjEPO0Hc>o7yDutL*hNXO-HeLFx zI_{zwYb_pJX3@PR5pjL?aCBcOwb|jKPNDtrN~Oxt=U(Gh_=8K-#E0=8D;h(b7K+wl zbgVS3zLdjQw8d-ibk?KO^HEG)xj3V`24Y|l=AN{`;R^DMiRls7BM^W0S~R$o23E!$ z0%eXOyPa4pR`+32YKDt&W&*9`XOgFUgEKH|c^#!|X|6v_qq95-NWAiDkLDL4ctVsK zHDvJArh{_T3(_4*ccOl z+)mcB_VQe86zsPMZEq@WO!qlnp6r7UDL9)w#+$@OwIvfSzv(#69 znXN}v(*VJ6#V_HF;9AN}I-+m_mplJSUH?g4|4Ci{NnQUdrmp_KIiV;7L8E_GF?ldi z03Jc9AZ0YFt%(hUtZVw7sb^bYIgJv(nU5|gp7@z$G~-niv6SUMz}ulz)!S+>*QHqU z|30%{ciYw8#k~|{WvT|T%HPJGK8+{$Twsh?_gy-)Ou2_z9t*|6g>;+llP{q&*Q_)9 zG|*^&-?NAhk4S@3T0yJ0XSJ&C821hA#D1%gcxv7a2?=n9ig2}PO7Mc-laQ5~yOC!} z=*lq>Y&GPQc+nfTPdpn&e#%fr9v4vmfU8JXD=2^x5b^0P*hgAAp#6dr0~`G;d#~0| zQd3xOdtu2c57^9h?V%$mv%p&*kPhKv?pf4C&o;8+o!vehhCl9sgaiNrTUeqE(lP*u zDhJ`)O&XCCAeE-qs7U^Q(|b3b!e3K0cBHw>IDx}+mB#NcMV^R>OCkT{FoKdUZP^2-h>Xy?wb%iuhWaM^|N!D61(^cT5}Q8^Y?~;n>BwjQvP8Dt`yjXqq7n zF94;$J@2j=3_d>^wxzK@4R2fwCMd*>7MSX+HeZvXi{sRHFUyb!r6f+ZL_9LPi*CZ5 z$H+}H>cuu??Rc2Abk5b7Io;7vO@9{7tscrj5%O#!`8b@9?z8Ay^3tn9G zzOBX0c}tuFk7?yh@90cBw9RUe&K#%^H6So))I{PTGRCHFj^~m@<#YE)26s@7UgSP4 z9=y+Pi>oy1C6BA`2zcKCH5cVrHITLUn;Zh?0vMq^=lwZevZ`B8T;-awEUm5|1-EwQ zLz2=A_ns{znDS2;bYVU|!p6ZFuB5fu zu!ZJgOa2=TwVq!)5{D_(T)iA9jifN&Wrh2mbzrB(#Oz}IyBgC4g%0$KKR#IGn7^n8 z9Agf~MFf_qMbB8#+qYPZlXMs-KYb1SneGn%43(&1@07;-xtXl$>H>lRVRarKtm zQV98lg(^H1t-W{bkJuwWPeq$(w=N&7cn1?qjtmueGgL8*M)qWSDn~4fFbwOnf{fLs>8Axm?Q5fHoH5R}KZZSBtkv(Dr&acR%@s&@GdJ|GK3;yFBkT{t z(+66p2*a<@EQUFw-KO#bd-yc-b`oK@0{O0V!mjl@)`M7n*-cZm>xsE zrd?IAy2w&_aHuN$r#{v9bl=zE|Fm4&=?_YOD(Ex_FMLCS{4lsMAN9?;=N%8%P0q{0 zsD2M`Geq-eN%UA3QEtlk5NF>FyMWX8EzQF+z z+YCA6(BD3^xKw?@qrtOyJ)e$8^#SN%hB-}8ygU&`eHccM4w~3x!aHV@19^!8yhujNh5DfmCv^ODP(Zu9XMauFI@j674fMeT-af zoyV9A{{rpiF{7McjXlsGxqm~8$c|64*G*Ls%6@e8at_{KDB0^>Og5)pt0}uv{25_^ z;@a_Cj``-J!iuE_gR6^4kU*S8kX<5u@3O_UEouziLoi#m#6CEFlwS7R z75oa9^FX_;MSh6ElRga$B=H!PbPM!Kgy(-_IJK?2pN2YOrwhw`hr-$O4tBcE^In6>;Qex<}9d1T7C zYS;dHk})R#e%8rVO)tV+s5v#+b5x-s_pWC(IKo+Nbtw>3*X(ywkls7?{b4qKA*kzo z2iN;x7PXO%Zl&ae+{6RWvUoSp&R5Q7#~Qrinb*~4hF!CIoRHn7F!m)yK8rArC4&Iw z7yKdRz}^Xux%hA_tSb|Jj9=c>C?cE!L9?x^_ zYFlXGc0c1t*q+HZkWP+Men=d5hW5l|4V~oUAXGuMA&YqTGvfE*&F>$`0Osz8nYc$% z`U-w5NO$EA#WeR1QA9$F%+L?c{p|OBEcYnI{GyZ1`U~gL;ATjpY}m@BN`E}{tbk(kdX%0nOOB?82hGkFVW4~t^gJGTZEd3=qXsg9H>u~-S%_Tmhrm4Yj zk&okdg~7kIV+D{AtR1e1C`xaRByl5Uf*|4oY%%}}wA(pnPDYVbf6R`%JuhRop}q3| zTIU>#RQAm_Bs7|+%NrBO;yT~jrKw*Bzhv-3kYe|u_-kr=E)d@KcP~^O>9AtB#v{B# zti6zgwey~58!aM-$~1$*{e8nD+L0ccqW7h7458d=UtWELlCQ%UT-30EUC_*B){uNu z^@xk-jxG|Vp-B~^6lRXK8#EiMb$-mkMY>q6a1k&!lnkOy?loJDsRi`iLBkJwzMMbiG>rT^#$m4{~X5s3{u z+fI;tF1T)ATT!QHU#$#R{MZDSO@Oz1>lQoFOFe&(tVCeryrPA-s36h2nB{0YIqJ4{ z$Dms>CA3R&kLmI|QGg(+EQa^3`K0n!aN0cN8ck5OX+dmWK5tCo8I)`z%olRX9ETd< zvIpj|wj{3bxbtXg>(yNwAt@LEz0YU9dUzt{Iit)q;n4r;q@axv+$RZfESQR=@(NYE z#!qi5QGB|3+Ex99Fim6-nVv!IcmIir%vhkWWqZQLFpNDGEW*Y2(tx@CkK8gL{(}3f zGAkjHq-~4gO3IHI!qXzvFiP0YLtW@=t)MBfi3>JqQ-A zYk4Ux++mG8LKKLcJ@}l9)yIjIo7*15*P=6SuO@JElQA}rj=fo+#g&cz=?|!O#(w?X zUVMC0@bPm!C5%hAavl_1H^Qv+@o6SrNX7K8^q4m>n=`!)(FKlyfcyzH zo$eq1-56l~zScJ9Q(kU;zmnVHZf8110V&tUNU&YHBr2};wRI4N&V>bGTQc2eAh+T& zV%1A&SV2HF(G1)Of(Mpsh#E#ZI)yLl+-;S7T>xL4=&7f_!NC6hJEEVcgs1TsRC#iF z+tbRN%OU%8fAUdbZ{O+!`_F~`y*!XfmSPI;8JKyq2mg=6u}{*Qx456TZQdM#P;^VI@JR!m_!Yi z^O71Ejw}9L8ElVVOFUHUv*ZmDX&YKz(#ZY|6s5V4vcxnzi3(Jpx|{lh>l*9sUM%l| zSH?u)jHWE3$E4B3M&Ah5j`|-oZ8L(-Q|S{r+fcsr*eJ+u_GLh`#7#iyWS`CgqYXUP zkssVrJLB9`h~5h4>kl(%jtq4@Si>nR3r0zpL&OC0p(?&vX)K0oM?N%rs*-^!VH;jP2{gwqcc0^;6*= z7%zSbEnh4W7p8Qg^rL?#CV67rD&ctxn)XAD^=Kv=_DD_?e^_8wyK|XlNTNW%f!?h_ z=r1y8>m4OAUx^w(w%_Zfjf~RjC?nuwx=KaY1o2tw?vA8|p>HEVEn&(uunl+=N@2qP zH1WVXzG>3rzOLRoc~~b`p@VxWs6hT2Cx`P*4iWsm56SLDP`Pd}?-H5fnj#H`gi8k+ zRkWPHb_KZ#MBbiWZD+J@93p^p8(>I~Y|vzEAOtS`HglASg~?qces2PP6Zi#P3RpHP zdardCNZ({>e%q#dYWxf@%(`J2^Z2nBK_*XE0RIc_HrR&#u`>-Ws>jC4{Zfb;(SXLD z;pz=YPFPN_T_wZ^*|p=*1P2N*?p(~Qq1-B zT`;ac!S7tyD`M=uWPv9%JtNUyh{{9%f&DRgL$w8Co**f4TH)VDE12n&-ZFB%yd^%I zEloLSxAy-Iar@DSbHTR+(R?DXn9xpk@@APmjjwcuC{OHPGraCn^bvAb@TlxaGltjX zuNEiVnff^EMn+O}DL~#*2o%=Q&x;rqIF5$AN&z|0m}ixzhR6~uH*`eKSWr*NOb2$# z3ax1r;LUI-1C5J^a3MA{JNdvb;{OF12~IzBMgA*A=AoA{^pdO^N|jv#eW^X^3IcA% zd;ZrBCe<+@sR_1{n#_cNAo(@NHuflIW8W8`2nUwRQc=hH_pJk`YyNKGr8HsH6Zx_C2Zm^*#L>!gGL)~RxrcK9 zHt;Oe>)|b#RP-yt{9IJJUmpr|l2lv=Cbl|vXNvGlVX>N}@%MHp`7(%%ShnHzmrQ=@ zh=v(apLK5_hz1)gr2%S|zFPa#*O3T*-1@xX(hvB^g_4#Vhb17xKICtcb6d@x{0zd@ zq3nL%XN(!OZ(*rjXV=>hSi^u(gBhgA!rL0xu+>v89xqbx%+r#&6L?Ui;!<8JgDd{>UIk3{SH1N2>T>N zDqEFxinxC+eq(~vpTGCkUPr(Cl@0sgUM*xy4KY6LH91Eay+{NOC{sRIjICA%yRB4L z;%W=_;g8CHz=mNRbJ{Lg`fpGSQ2FiqQo;jehS22Q!h z@IMuVHofvv;%r2HD}XFj5(^xQ(qgi*@#=i{%u2lH1U1(3hAeYa$={>Fvc`gnp%upj zvP9W$Olaz=>w8&Kgq5Wy2Ro_pa}3kb-{Ovg=6`h1BW0TJwof~;pg2TFO4p8sBc2P0 zvZSJ5Pduv!dH|wJ;I;ipRxdXO2!b0L36kFQ($pnSp#GXU0=OT)vRyJCDR^R!9 zen-y_ixouRK%-fHza=rw-aKt=ho>;RES#Dz%#0KPUd&5wL6%5wD=?cJ-bQ@J_2NjKXcrpZW^hUo911E_m&i${wtpL2#?#3MU zT@LnKsDiztQ&Dv5M!_ORR8fmTwUh;LdhpU#J*J@2|274ZobN~%KC?&svqk$dFK?uC z4#%3eB?@$6xRwhm#3F`Bbl<9)^xvic5US}`sR&K7OEAx#_#zpo1dWCpuiE=mgWdza zzMW6S^jRYC4x{wW@fgB1Zf1x2Z;uBVBj#yXBT5ldwaF$q`ZT5cMA%2W?pl;8_N893 z7U&0h-cf64QW&sT>c_kAm}|3c6(0Twu*_>Ri2$RToMCY)oX)_N}ezAo@`347CZIT_P@7s zyQ}QJ+8aWjY}Bt7Y0l^UH}VK?69G$X_~CN0>9Rg#s6u|sB#JJMx9d&Y-k~&>Qq`1w zirh3+xzDS_QSmtK%H^rMT~3K@rXS|>*_OP}9N8VrJtPb|abgaFNlMeLsK|#J2R4XqB0^1s# zrDGeO61hPRl3)d!@lJve)Yj3oY1SmW{5g9vI^OYtckDrnk=}fq3&KmL_UGjJ&>CjX3z_i2Y36`X1#&x=UiyzBR z9Ph$gWfDc<0QxcaPM!mz*oel7*AbC|#F-KsHu(jsJj`x11N_Hyz6xJG`Y_;t20}>T zo?KM1rGQM7$YG?AHhDC%G+ljkwAO~Yfdm?MiIiG*m7IpTk)+1IgOuysT7q*17DEJN z3R1VeEs+})H19xXXhF8}Luzk3y=8txd}tG@lgZ4zUuLLAc86pI8?o|CFX6Mf%R}k`Y=&d{1ke5jsvZx!)4|47lDp3f^jOdC0Bni@o}fb-kjM;$ zs8$Tc%;4J#v&B@i9J>ZB(tRQR^?-W9m>N90>Zn_>`02lWGLXuQfLOBcKJrcV#aIFT z^Y+^?Irsyh{3$aOa3GS46zyS1t6z*yS&S^Vj17||0RhX|0|vr0lswf4`xTi*%6smJ*$sC z3eLB!CdjtD&N4%-gq*cAp60Hsx=6Iz8;R>J5BRMkb9wn%4TUK~pw^u0FS%(gCweee z#0mxH@5nDT$M0tRL-&udcq(bR#Hwak72%hKe^E`axT_l>ui|qDEIEtVyeCMV6R=&b z4z;gU`W9oRfk+e4eGjbx5)b`uPtyLrkQB=_esU8Ox>f$TyT%r^G|GXP`PIWjoPl+v zSyuPqle?3O_SxfTNm%=1!*5RgHs@r(^J{AL`t2rUN2pqHL-IMwwIm*Y7?t%{A4K}v z!hIam6!EIoH-b0Ph-*hQzhQNp0%MzeEEDl1fe562A6!Dsd_Se4ccWE~ztM{<ltBpWZ+#|*t=9+81sNmapO=ME`PXVz@}-d-c$9LV6WX=A7qL;*o?$vWO6JKR2E|A0b!(kLE# z!JU_QrrQy?p4Squ<6bb`X|rSkYZxwYC~kIH!KRphel$f$d)HBO@yD{+2uQx4H7 z*W5jCt@0UF$auf|Jfj`XSVF;DU8V!+u{Ih4&<<6+X?f=z*8ITjNq|5SiXj&uU(zC5Y|_< zlAthXP}nybfe-RHf82g%r?YKX)4p6QgDcw%<$# zf1#UpNqZw`CZK{Kb4{&|Fo=$_gO?(`$y1eTqiDU$6^pn`QSRrG4mY4cii8hh=H;&{LWRT#mK|_K( zZ)Plgoj>5#%Lqeq5fYhp>Y8SK;vgO+oX&AQqdJ)EiHu%G~qfhEm zUAfig?#0ckWNd`3Sst#(@BfC0tnR+enf0k#-Yh`lcWt&k`l9UOI0J%;C=DNkR-8=Z zuo6VBZ4Kar5La~$qI(W`Z|ZJ+Co;SrS6*w+d0>BIaeuz(a$O<%`rxcVM+1zb;bB>} zkXNsP5WJ$wQq~MMc6yz}l(KT8_+lwUauwg)c1B!g#`aHCdFEw6$+uDN!@AItQ}X(0j?!l1L$db`gSaLuD%JiMqx z@@O%FYu7rony1ODH8HXr1gqOTENz6Wk@Ci1_kGvvYS7hc2UMKxGtTnF%r92&2u&rJ zqkV4OU4Yx%`l6ws-KXXTw7ed55llGpf>=AnnTOoJvdcdl;ZbQ;49MyCkPtUPVM7J- z1}OxGSaq~P39{P{uP0%S7hBOVRd~LUmYcMX7_bNau*65O-Jdn;3^W6E%9c;*$x%a0 zWi-1x3=28AP8k8DjsZjRSAfxw& zoR2uI{3JiNgN$!R5N$i)ce-BmVyo&Efy{^w)~qK&>g`*2JrXJXp1vOH4jUVthQ-}4 zb(H*DBMS^&(vpu;s1lINE$a_D3~^>0NZvHND7v4|*nahZ>^OCB=}n8BT9$RO(3Ni$ zX3ETw>%92s@_~AXEQ~Q5>71&!RllL5?c^hk)f+09k!vF7b71PMu|H{7OgiUy%)`K) zxuT+ZPn#&}&;>dT-*QH$37N4YrQ953#ect&?y(K$zDEplxm_SUn zwARr+1-JIePXNK@+#LP4@GBJcFY_MLc6F#{863429=fdXBHE+m*iv@s)IKyZW;C(D zmyk|yY0~$Lgk+rTN-gOozF3T6LO7W)MjOr|R~Kz8Q4_lvOD>9hD?6n`kR{;xElc zdx?G??-&Sz_{p;o7LPJF*$k(ADPdtUYP^JU=jNlM;v-@>FI#!~tcG4j1_MC}$PaSr zyI;}sde8y>CiY;C+s6de?*tPA8SGb$6(J@lxg)jN@32$Px?f2PZRLga0~IjRn~ol@ zW-_wbKC@T#OZFXEDrE5h6cK~_>U}AB*bFsj!X*93<1tPVv9?PXbv%!tqeNn_AN#~& zzAU5nsYmj?nNQPx)!u&U9^@X{nV*mco4VJe;DWPDEGna99iGmn!voK4irB^cjPhjB z9GBSOz5byhO|h#SGtEaKlPInDmK-;00Z2OE)Xuh3K)1Edr1 zL#9gXq%x!KkRf81;i~miR(^ulRv5 zMvI+c3D~1~;;&2u)03AG;~(tQTx<2!9Ieg6K&n|slE>Os_3CTuUo0}#J3iApLB&F z_(pGe-Ox|AO4Rmy5(w94bn~oI^^%$Pn+Hen4JrQlSGuHqpg?Tc&*9%L7m!kzvEi)X zB`uF`-y@2{d~y6S=nctg*4_&lVIz8ofYHQmvfOPO0Rv=5hQ*eX4QMM3EkUN-k?HsT zfh)37_3DRtH@7hcgT6>ctk!;LTA4wj(IIs>jY!KI^Z|N$C_pHG&inU^5?Y~W7i^Mi zgS}SZBXtm;<%acJH**DJ_`_uI_O(e)QwPo0>~H_aq3(6yG{%gj7x)3$(-CwZePiDS zC2H|PH~s#ZxiX%IvVf12_CVd-SD=Z?9PHNPZ0c79<|7_lRXYSTcKA>mgSD;46NB^` zHh)%C+dgR`yZV(#FS)O_NP8v!SEM;IR!C8pOK0CXD_a<(JmWsv12gc#@;_GZdG3yT zX^l#vgpm$f9HQ-@-*`yF1v8TZJRT?_XxH@y+kFx%9PdmQxHGJ?`^w6BgVHTwsD#K4 z#7o+TaZv@;3laX$Vfx-%yUb_!=;O@CHhSXcJW$c*;OUU@9LRAT8yNHFukvQet-l4eXgX z2!n-2=!7_;Z#xoHNGU!jhlQ?dDigy+jo20Cn6VpST!R@+#?}^np6L6k$o^FU8IY3K zbb`r~NZyJply8YQxlAarWPZ2AnBQ>s9?#KOl&*zw6j0IGEoe3lnqmMne_VaPGXgT- zt=5?Cg}>dm5@$P}88_^7sYXxqQbfkTN@Ksb3S{zWzPuQyen&cy8s@>S%PNYtbwCZc zBE+6WFbTU41~|9s&cg>dOg@)SQv|9V7gcVUzp}jhYRSQUs1sPcgP|puN*pct`l6?9 z?vhR2mTi`-?$yotL72>JO$W{Hj5uE_s0UfG9m9r1<`12t{RlnSn3SI!`8WB+Vg(Dw z?)UL5EmpRed95xgioYHzfiz&doIG~3>^$SwZ8;)+27I|*;JyF|`mgom z;v2ILawjO3k`&5EC=Tr6>5KZ?#ONGQQ;(;Lkb^uSLrS~aEMvva5%hVYpy^yq+6u=^ zUHH~?o4}kKbv(breNRZ)t4;qrg8pUD6mGh=ZL#QhfvVrz<>YkC&^KWEOGQwQrw`vW zKtfM@wa zA*jkZo>$O0ReN{K(k3t)Mp-jas*ZCeO>=lnW|N*U3D-O&t|nZanKp^)Q24?@>jxh# zZ<$0HlDC#5nIdkViY{WhqI@gSaO|N7wkREL1F0!$)0sj&vP**KL+d>JmZ$oT@jaK#N-?z<1Md}q1`Glysg#wGXKj4ADLHV ziDEYWdePSbvX%X$oud7Rhx=>$@4ZcmhoIh|M1f2vgs|Qklk0)-FBY_^AI#6u2>O6M z)W6-xMvxVG1`@~+oiiuiFF3rx>@$UJ^RW41`L?XqDB&n528f#a?1^poD^(*~((Pgq zXwr`PQxyZbihf#5ipj4&@2)z~JH+GpvWMEuXlW8kr+<-$h+MiV(Tmo2F5GxN z%{%Qx%nZ7XXxY$W-0=1Kay2mOGXCNzj#dRsoAJq(o1i+~F~T!`awOI55ANMOO|j-= zW$JF0u2!Ycir&`bq)5MzbI%Rh zZqm}^Ts-~Ne8OzoU2k0!iAa4hlp7K>$;}XbDdw0`sKZ*Oo2DwB&aX#!(PkXa)?IA9 z=C23p6%K*mM+9-5LHxnJ)`V&iAPbq3Ko6#xOmc7z4Zp)bG$I}iEw*_1w(#5VWa!4M z7?*IXiQ}s}ezVk}Qa+qh=*;=F6Tb1wC)^A&B3yCGhR50BE(cRjdeG6Hj7vYlR?!J! zvy-;i-?RYv$%%-`O<35AHw1c_G9Cl4Fd%Fw!F*xhqKy2l31r=ejlps3GJ*OvSWwDy z(Iue2w*)Vpi1|>q4<5i(xz(XNPW;693gQ1Bi$g@NEEvYZ1}(qI8av!-C!CjaKV%s% zSp~1K-G@qXxrHQGR!F{xIWT1c@h0*zs|aCTTP)!u$gzDWGl>dC|U3;+UWzgS|6F3M27xu*mp+7N!jv_9DuXz6IFa_E$!BrTp^=c&^Jqg6{?qXwP!O~aQpyVFHd7XSE@ zIQY>cVbV0V&kx^ntMNGPU&KrR71%_kEL_hi6tw%bs-qdiEw(YhD2D0co-8E|%Ejeq z)yTCTD5&DfXDiWq)=n=-KG5GZy6P>|cfkRR)zjwO@;E3SAC}FjN6O!_Ci8GmX86<5Q(_=&(~ zGJ^}lj!J|^^RTlDRxL~$4-`)1;9Y&{(l1EJSiytnvZ)^~(!>jbCy zIpB7}8rfa5x+PShW7YqUE>+7^dUWOcQ^1#~6wu6qa)gnkOw86F~&q!;Bs4 zJO zOeLw|VysSg<>C$nZ~4S-m;WbB?WHy@2e##Y!a=>dGQyb^Tak(%K) z$S$E{(HbYuXbrv&1RnN5`@hCSz^<8{9rW4VAf>8rC$UkQu+QP=M!&;-q2y88q1?E$ zT4_`KLq_{uS#6YSc2xr21cy|``qOqw*Ij`YX-Ak(B|RTciD21C0}5+Dm!e?CjsvPb zQ6r(}!o1SGG?5b!O5>|-J<3p-`=L%mv?YraoEC+yeVXoS=f+ASY!jJ+zt3W$xOB?@ z!+yEfTvW#OfgxbIIZ z4bIVqV!3UyY?+evyFRID3|mE3XpbbXu3l+{O?cCp3*gqZ3hnT=uMl0hiRAfI?qk9- zBr||8ZVLArN}DTcmg_v?Ju`v$v=6FZ6u5{y0gSp!1s75!HEwMvA0<$V+XS;9MQX|J z?<>N!d(6JG_U6>~a77)ESlwCeH7nwH#LVUT$)tBPy?ES`oS|-vC`12D8@{?y-)L9l zbmhFP4ONj;^XFrSv8`vAQV3PX*Xq<%!?3v>Qnh>JG*tCzTO@RR=`eQaOdsoGR@i2s ztsdnWQh07M*?Rc39TFG_7S1t5B9ZI zloD+aUh6Mz6djNnV~(bEl!Z8INrhr3=+h7En!20jZH?6maqz1+RN36sai7u#Y7GeY z`}&C|>{EvOTBr_4SjqGwbQ*_@AT{E40Wt9=Ar8xM$>+sCY<$_pKvfff<*$xx(GuRY zFkk+{V}hrzt$?q4LeH)?DKK-e?DeuxP-n-E8G>I-V7wT|gmuxg_$_maY63P(sZ)W< zZ65D;t>E!E*!(fh*8&`Z_2BtxYmUCeN2CzFO%=F=E_N^YzWSR+@BrlC3MH2j)m&em z-QPYgwHKN7I+>5q5GWeysBk}%ST1nF_OJ?UcYgIHT~i6@CC_vMcq<`6kRDi==qtmy z`(1}z=< z8OPT7pecvknOd`b#~(+7UaefZyB@8)rLX#5eV3C{D=|+`F@SV4copXiqU^3J16fQE z?BsLBGY4X#&bZZHiv;mEQ<62?A%WaK-jNxTcNj7HOnY+MMxOU6wn|qQzl+xa1(6Di zPwnVa<-YsbB}!7czrQ#`_=BOh(17CaB9A#@i6kRbQjON&-=#WK#K>oY)O21bO+&m3) z`tmyf@wU7vBs`JMg6pL>LKRNHcD;?mgIXZ$)jmA_*FgJ-TjsC-~vzz5OYtRjjGjoYb{0z`?L; zK`lBixO5dy8V&w#7somp-6}&?`0*yP{v{PKRt<{|fA7_u1vy;y&m*DE?SC-x>IbD7 zsrQU~%CKlvq01m40WV6pdL?zJUUao$^ri^(*f=KEC}vmKEDc}9G}2Mr>RO(xZAf&O ztgO3&%>x+Jb%&eEq-;u9ps?&D(b8uFahnTvZ^3oXNY-&6e#Lgu%g_~)<`SpPXc|*Q zvcOcQc@|fF{H>}hu@0GeCJk4^Pur`>Gx-O$|H7%?skK&m;RehIn`;Ce%zQ-gz;x>WP$5GF%m?}9X&Nqr58-Y_BMe{73T21BkW3pmxsNwLSAgV-Cw3% zx**u!S?ruw|Ga&iScWqp1MwdNtlu(L)9xo4Q6= zA>7JAhail$b_PV|fp1F+Cu2AK)PYkUaPShdUm?Hs2HqXgwAgDu%#4(0j)%J>^_2lu z>2W?R_u>g#MIw$o|MzLvci}k)Q`tzPOBn~ueA1)G|EI#MS{#y7G#2WUbb^hSCG$x` zcffM~{RTmZPH$}oht_!-yfRtDcf!diIj*dh1wLN>#TqPlVeZDxMENm>E5wRel7R~Y zOQHM&IR|Xt$}svFiSZwt46(WlO`9w!e*;}qt8}#db}J@2G+124jr|}-2;b{DT(b=fr92`EOpfn5nf(jHKG{DKXQFAl>uW%a zsD`S8>RD1DK!2GmQtazPRnd$_fk}NhZdCeMSR`Eo8eMd0RtYAHHQF-h8j6FpeDz0p zWb$RJ7jN#T+|^~m(R(vKnEZ6W(nw6N(H zb=w|90;Fb*CB<7C*zB<+4|&T4ux~R-E1PC_kCOkAe3xpoDVkJeK#bk!de@RwZj$)V zx9Hd+-Z|{k`<0AXAYwip{Y4~K^g%NUe!o7Q zlWjlJxu{#DWM@{Bli2JT2`wui7Tv@9LEU=qqnRwyLv5;+%l@LC9`JbTvG_0Aw8N|S z;I88rn@oP@SC!kUpG4K+oR;ml*=IUat1d`sQEhYdE%6{z@)QHw+5-_qSFd*ZM8Rui zY9;WWOzISa?(fC&^_Ic3xAl28=7^p3A7)Go(LQ#g={vHM@xZ9|M;_uug`_>6n2 ze>(Iu&{>zKUEglgYD;NaOd=iWW5}$RJA0}{(M1vw{I29V3gQ1A`Wpm>tjTKo#5^jo z##P9vGyVZXX7Kqia#e%AafqTV*s1IkmHWP4cZfQi5s5?~mY{&mEMw@juWzJss*s2|}w!eCwll zO8w3l-}ZqC=$1;E?0K#U4UYoR`MDKfrCRopGxV}2L(b(HgKtdkd_Fv-t2sU1zEpc} zOoJBi(XwDCoVWU>|I^oBUxu{)F5iotG2fDCklP63r?TQP>W1}VMzY7O0EMTxoaL=1 za*PV6=+*?P9@3j|Sx0@G+4ca%?vhOjw3xBhS$q>y<7C%yTc477O{_4;Uj?@71nV2F zetiLaejd=P{ReHlR)(Y50h}tf9LcgSTD?NNF)&iXrtZy6Wkiou;7HQU@F`7jE!0Rg zL0C>bkrL9sy(r)G?oIFB^zKdX-t_KG@80z8P4C|H?oIFB^zKdX-t_KG@80z8P4C|H z?oIFB^zMJF-tECE{gEd(2cHP9A9Xr|1uhL=F!dm_sw?0}RdK-5VYO48z**o{Gxamj zo1gZP}>PEowV= zrf@hHMnk7$?fBl&w%>hbzePq?!8aIx;oP5%=f7!nxJo6Ndv&V?i7+vu&1uvNvQro= z);gnehc(aqMZr9$0loTP+0o$GD%Yd%GIq*JBPivymF8k&9qLj7Ga7C2D2E>NUj2w@ zS5KK7-yQS~jQO`#$Y>)BuW9P=TZjCb#P@)J%(s8@*|L7FYIpy;r4@ZExr;p zis<9kcX@t>1a&SKA_CJ0_HQB*u~nze-vEzr=Ni2gF`-kq#I45HHbWZ%m5xlK3#glO zewL0jfwrU~r|^<7Lx@%V_(U-=~hho+3Xt+c;+@2^Og;hIzRw>7A; z$%4NAG4K&Y4(_b_{>_E!R5RzMF4hdoxjKIZZ;<$cR5kO8(6ywt6Zn2Ja|}i$WUi*v zb!&WRWq>c>GN~j<1>pOLWRSEOvwt}Az}a4(tZl63iZN*Yu%xLXf%fKP{g!9|IA%WR7-M$ zJ2^?lNc@N8j_%^^gFU2&Zh}^B*3Vu$soiG%B*Fzwp+}Q=;gTeIEMLFd!8VcjMwiTkz8wd&D}SK`lcvE(4t&l?%&G z7jB7iVLIY>@ojtxS=sLgjtzieb zrqQv}DE~aquq?ayJp?ezPE&7MVkDWg>|rk%pbyk5d%)d@iGR4hk1W&&BR|i)0`|EO zwB^s9XDz=tO%Tr?7f&1R8yc)o>2f7!SZkeCO!wEYma{+H9d{tN!Vv`4_4g&P(d pS$!UN=7fE`!TUH9DN@ra#k#H%QY~L$aO!ydkF9;cZ}D~c{{YAWm2m(7 diff --git a/crates/rattler_menuinst/test-data/mne_menu/menu/spyder.ico b/crates/rattler_menuinst/test-data/mne_menu/menu/spyder.ico deleted file mode 100644 index 4aafb0878d6b45d44652cb88697ce63cf8f4ed01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 311358 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 diff --git a/crates/rattler_menuinst/test-data/mne_menu/menu/spyder.png b/crates/rattler_menuinst/test-data/mne_menu/menu/spyder.png deleted file mode 100644 index 4d7341d5184a190cb49471812bc7096e8604b181..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19403 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 diff --git a/crates/rattler_menuinst/test-data/mne_menu/menu/web.icns b/crates/rattler_menuinst/test-data/mne_menu/menu/web.icns deleted file mode 100644 index 7cecbfcd2986d25d883a50d62fc4cf97beef42cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71075 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

TjptYdZ+(8 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≦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 diff --git a/crates/rattler_menuinst/test-data/mne_menu/menu/web.ico b/crates/rattler_menuinst/test-data/mne_menu/menu/web.ico deleted file mode 100644 index 6f3ddb57a9d42364dfc72bc09bda69ce313d9b54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 310263 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 z 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 O1)!>=saPRz7V>}j8Q;tR diff --git a/crates/rattler_menuinst/test-data/mne_menu/menu/web.png b/crates/rattler_menuinst/test-data/mne_menu/menu/web.png deleted file mode 100644 index bb5e8ba312f3e17d2bad6328ff534363e3bc38e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24622 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 diff --git a/crates/rattler_menuinst/test-data/pixi-editor/menu/menu.json b/crates/rattler_menuinst/test-data/pixi-editor/menu/menu.json deleted file mode 100644 index dc7c1be8e..000000000 --- a/crates/rattler_menuinst/test-data/pixi-editor/menu/menu.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft-07/schema", - "$id": "https://schemas.conda.io/menuinst-1.schema.json", - "menu_name": "pixi-editor", - "menu_items": [ - { - "name": { - "target_environment_is_base": "pixi-editor", - "target_environment_is_not_base": "pixi-editor ({{ ENV_NAME }})" - }, - "description": "Scientific PYthon Development EnviRonment", - "icon": "{{ MENU_DIR }}/pixi-icon.{{ ICON_EXT }}", - "activate": false, - "terminal": false, - "command": [""], - "platforms": { - "win": { - "desktop": true, - "app_user_model_id": "dev.prefix.pixi-editor", - "command": ["notepad.exe", "%*"], - "file_extensions": [ - ".pixi" - ] - }, - "linux": { - "Categories": [ - "Development", - "Science" - ], - "command": ["gedit", "%F"], - "MimeType": [ - "text/x-pixi" - ] - }, - "osx": { - "command": ["open", "$@"], - "CFBundleName": "Pixi Editor", - "CFBundleIdentifier": "dev.prefix.pixi-editor", - "CFBundleVersion": "0.1.0", - "CFBundleDocumentTypes": [ - { - "CFBundleTypeName": "text document", - "CFBundleTypeRole": "Editor", - "LSHandlerRank": "Default", - "CFBundleTypeIconFile": "pixi-icon.icns", - "LSItemContentTypes": [ - "public.pixi" - ] - } - ] - } - } - } - ] -} diff --git a/crates/rattler_menuinst/test-data/pixi-editor/menu/pixi-icon.icns b/crates/rattler_menuinst/test-data/pixi-editor/menu/pixi-icon.icns deleted file mode 100644 index 68f610243a1bbaa1b6e9c11dd872f813e056d083..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 243049 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�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≪#&;W#ek_m))(8(TMGnu2FG~}BWXu%{ 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 VkA__(t(J~$IU^c?;r4%T|Jec&vH$=8 diff --git a/crates/rattler_menuinst/test-data/pixi-editor/menu/pixi-icon.ico b/crates/rattler_menuinst/test-data/pixi-editor/menu/pixi-icon.ico deleted file mode 100644 index 6d58d94fd310459bb64a2e502e583a9edc3508c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45971 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

Byjv&*o$pV*g4K}2dtEd6GW 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 Xou=Qhe@?+100000NkvXXu0mjf586xv diff --git a/crates/rattler_menuinst/test-data/pixi-editor/menu/pixi-icon.png b/crates/rattler_menuinst/test-data/pixi-editor/menu/pixi-icon.png deleted file mode 100644 index ef095240da88d2de9fb3b883d921c7f96001cba8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47011 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 a_WyrFezi{@h^kru0000 Date: Mon, 24 Feb 2025 16:58:03 +0100 Subject: [PATCH 128/132] Revert pixi toml to main --- pixi.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pixi.toml b/pixi.toml index c78d3a3a5..1855ef747 100644 --- a/pixi.toml +++ b/pixi.toml @@ -23,7 +23,7 @@ rattler = "cargo run --bin rattler --release --" [dependencies] cxx-compiler = "~=1.6.0" -openssl = "<=3.3,<3.4" +openssl = "~=3.1" make = "~=4.3" pkg-config = "~=0.29.2" rust = "~=1.84.0" @@ -33,7 +33,7 @@ cargo-nextest = ">=0.9.91,<0.10" [target.linux-64.dependencies] clang = ">=18.1.8,<19.0" compilers = ">=1.6.0" -mold = "*" +mold = ">=2.33.0,<3.0" [target.linux-64.activation] scripts = ["scripts/activate_linux.sh"] From 4716453df2f94aec346efad04a8c84f4b5510a14 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Tue, 25 Feb 2025 09:41:29 +0100 Subject: [PATCH 129/132] Fix doctest --- crates/rattler_menuinst/src/utils/slugify.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/rattler_menuinst/src/utils/slugify.rs b/crates/rattler_menuinst/src/utils/slugify.rs index 7faade677..28f4f40fd 100644 --- a/crates/rattler_menuinst/src/utils/slugify.rs +++ b/crates/rattler_menuinst/src/utils/slugify.rs @@ -12,6 +12,7 @@ use unicode_normalization::UnicodeNormalization; /// # Examples /// /// ``` +/// # use rattler_menuinst::utils::slugify; /// let slug = slugify("Hello, World!"); /// assert_eq!(slug, "hello-world"); /// ``` From c6e7b7a428b3bddf97a2796bcb66b38bcdf6742b Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Tue, 25 Feb 2025 09:44:32 +0100 Subject: [PATCH 130/132] Add resolve again --- crates/rattler_menuinst/src/macos.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index 99eca69ce..9add1346f 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -815,6 +815,17 @@ pub(crate) fn remove_menu_item(tracker: &MacOsTracker) -> Result, M Ok(removed) } +fn resolve( + input: &Option, + placeholders: impl AsRef>, + default: &str, +) -> String { + match input { + Some(s) => s.resolve(placeholders), + None => default.to_string(), + } +} + #[cfg(test)] mod tests { use crate::{schema::MenuInstSchema, test::test_data, MenuMode}; From 3e436eec99e6150d888eab03a1910db2935de256 Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Tue, 25 Feb 2025 09:47:22 +0100 Subject: [PATCH 131/132] Allow dead code --- crates/rattler_menuinst/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/rattler_menuinst/src/lib.rs b/crates/rattler_menuinst/src/lib.rs index a83d116d6..9421b830c 100644 --- a/crates/rattler_menuinst/src/lib.rs +++ b/crates/rattler_menuinst/src/lib.rs @@ -200,6 +200,7 @@ pub fn remove_menu_items(tracker: &Vec) -> Result<(), MenuInstError> { pub mod test { use std::path::{Path, PathBuf}; + #[allow(dead_code)] pub(crate) fn test_data() -> PathBuf { Path::new(env!("CARGO_MANIFEST_DIR")).join("test-data") } From 4557f24d4ebe7a0966a78b295e2dfb40df83b83b Mon Sep 17 00:00:00 2001 From: Julian Hofer Date: Tue, 25 Feb 2025 09:52:34 +0100 Subject: [PATCH 132/132] Fix macos --- crates/rattler_menuinst/src/macos.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/rattler_menuinst/src/macos.rs b/crates/rattler_menuinst/src/macos.rs index 9add1346f..871b61172 100644 --- a/crates/rattler_menuinst/src/macos.rs +++ b/crates/rattler_menuinst/src/macos.rs @@ -15,8 +15,9 @@ use rattler_shell::{ }; use sha2::{Digest as _, Sha256}; +use crate::utils::slugify; use crate::{ - render::{resolve, BaseMenuItemPlaceholders, MenuItemPlaceholders}, + render::{BaseMenuItemPlaceholders, MenuItemPlaceholders, PlaceholderString}, schema::{ CFBundleDocumentTypesModel, CFBundleTypeRole, CFBundleURLTypesModel, LSHandlerRank, MacOS, MacOSVersion, MenuItemCommand, UTTypeDeclarationModel, @@ -24,8 +25,7 @@ use crate::{ utils::{self, log_output, run_pre_create_command}, MenuInstError, MenuMode, }; - -use crate::utils::slugify; +use std::collections::HashMap; #[derive(Debug, Clone)] pub struct MacOSMenu {
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�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≪#&;W#ek_m))(8(TMGnu2FG~}BWXu%{ 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 VkA__(t(J~$IU^c?;r4%T|Jec&vH$=8 literal 0 HcmV?d00001 diff --git a/test-data/menuinst/pixi-editor/menu/pixi-icon.ico b/test-data/menuinst/pixi-editor/menu/pixi-icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..6d58d94fd310459bb64a2e502e583a9edc3508c7 GIT binary patch literal 45971 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