From 5aedcfed4603c722b319ba862886b961215b2b8c Mon Sep 17 00:00:00 2001 From: sertschgi <58653179+sertschgi@users.noreply.github.com> Date: Wed, 5 Mar 2025 21:10:22 +0100 Subject: [PATCH 01/12] Create rust.yml --- .github/workflows/rust.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .github/workflows/rust.yml diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml new file mode 100644 index 0000000..9fd45e0 --- /dev/null +++ b/.github/workflows/rust.yml @@ -0,0 +1,22 @@ +name: Rust + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +env: + CARGO_TERM_COLOR: always + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: Build + run: cargo build --verbose + - name: Run tests + run: cargo test --verbose From ef2c5fa075fdf8241ad6bb6d8bf95e109c95d712 Mon Sep 17 00:00:00 2001 From: sertschgi <58653179+sertschgi@users.noreply.github.com> Date: Wed, 5 Mar 2025 21:14:19 +0100 Subject: [PATCH 02/12] Update rust.yml --- .github/workflows/rust.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 9fd45e0..ad00172 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -2,9 +2,9 @@ name: Rust on: push: - branches: [ "main" ] + branches: [ "dev" ] pull_request: - branches: [ "main" ] + branches: [ "dev" ] env: CARGO_TERM_COLOR: always From ec94c2e2df05b8202cec21f65ca621c6877d61c8 Mon Sep 17 00:00:00 2001 From: Malte Rauschenbach Date: Mon, 10 Mar 2025 08:05:24 +0100 Subject: [PATCH 03/12] Recommit versioning --- .../node.bin | Bin 434 -> 473 bytes extern/backend/nodes/bundled_node/meta.toml | 9 +++- .../node.bin | Bin 645 -> 671 bytes .../nodes/complex_bundled_node/meta.toml | 11 +++- .../node.bin | Bin 169 -> 182 bytes extern/backend/nodes/test_code_node/meta.toml | 9 +++- extern/backend/src/modules/nms.rs | 2 +- extern/backend/src/modules/nms/create.rs | 11 ++-- extern/backend/src/modules/nms/modify.rs | 0 extern/backend/src/modules/utils.rs | 4 -- extern/backend/src/modules/utils/metadata.rs | 16 ++++-- extern/backend/src/modules/utils/node.rs | 9 ++-- extern/backend/src/modules/utils/save_node.rs | 7 ++- extern/backend/src/modules/utils/search.rs | 23 --------- extern/backend/tests/create.rs | 48 ++++++++++++------ 15 files changed, 84 insertions(+), 65 deletions(-) delete mode 100644 extern/backend/src/modules/nms/modify.rs delete mode 100644 extern/backend/src/modules/utils/search.rs diff --git a/extern/backend/nodes/bundled_node/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/node.bin b/extern/backend/nodes/bundled_node/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/node.bin index 8428a81d360c0011de55522824de9ad01a3ec453..9106cf993dd79950500ea60c9c7373bc4b48a2fd 100644 GIT binary patch delta 134 zcmdnQe3N;?R9;pF2r$qy&@-HD$S5IdXb@sxZe?I(WoWKvXlZV2Vr*h=GVxG8QA#Zh UOeV)Ms$r@X!!Xvu+{_{h0I@R|?f?J) delta 152 zcmcb~yoq_jR9yxrkb}}j21cg32FAJurXhxwRt82^24;GemPVFl#+D|Q6VK-puffdF Uz;tp2qnaMER+t+Y8yQ6b0B%MY(*OVf diff --git a/extern/backend/nodes/bundled_node/meta.toml b/extern/backend/nodes/bundled_node/meta.toml index 59f7f76..d2c5e6b 100644 --- a/extern/backend/nodes/bundled_node/meta.toml +++ b/extern/backend/nodes/bundled_node/meta.toml @@ -1,5 +1,10 @@ name = "bundled_node" description = "A bundled node" author = "Author" -date = "2025-03-05T19:02:06.992970322Z" -impls = [[{ deps = [] }, "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"]] +date = "2025-03-10T07:02:17.197348768Z" + +[[versions]] +version = "0.0.1" + +[versions.env] +deps = [] diff --git a/extern/backend/nodes/complex_bundled_node/347d4e7d76b463a7b8415486415c698bf2c792ee6384f96eca96e1d45a2f3986/node.bin b/extern/backend/nodes/complex_bundled_node/347d4e7d76b463a7b8415486415c698bf2c792ee6384f96eca96e1d45a2f3986/node.bin index 18482092f68623543e8e61d3d37430bb2404a0bc..4c66ac29f51f217ad468e67147b1b56df44393de 100644 GIT binary patch delta 172 zcmZo=ozFTUPhh&6(3PoQ3s>iO2zvQN2PI6b%NBSXJ^P$@E%&4l&-FhWCYW$c{OO?b zX=U{_=GoelMZNt@)<2iI#m>OMP*xfLdb7H1ce-c7^&bcKZ<`#;7|Y8FlmGz(Jp(<% s$-5XWMGXx?49u+zjI0dJ^$ab|jm<5MjV&j0FzI2c6~k0(X=W4!0An{bQ~&?~ delta 144 zcmbQw+R8d1PryCNjsMcZBYVzxoLd+>|G@i+b=d-CoHIQXqxbF&bmTlZ*<3|v;!g*a zEy;ETtKS{z^>$-<(^{PQkez{nVckCM4685GTK+i5H2*qooIN>~F?MnQlclJEX^5ev im4T6!ftjAArIDqDnUS%*D-&}o19LqSb3-#zQv(CzC;;X`2>k#6 diff --git a/extern/backend/nodes/test_code_node/meta.toml b/extern/backend/nodes/test_code_node/meta.toml index 5244942..36295fa 100644 --- a/extern/backend/nodes/test_code_node/meta.toml +++ b/extern/backend/nodes/test_code_node/meta.toml @@ -1,5 +1,10 @@ name = "test_code_node" description = "A simple code node" author = "Author" -date = "2025-03-05T17:47:07.471655003Z" -impls = [[{ deps = [] }, "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"]] +date = "2025-03-10T07:02:17.197342610Z" + +[[versions]] +version = "0.0.1" + +[versions.env] +deps = [] diff --git a/extern/backend/src/modules/nms.rs b/extern/backend/src/modules/nms.rs index 07f2059..970c49c 100644 --- a/extern/backend/src/modules/nms.rs +++ b/extern/backend/src/modules/nms.rs @@ -1,6 +1,6 @@ pub mod create; pub mod delete; -pub mod modify; +pub mod query; fn check_name(name: String) -> bool { name.chars() diff --git a/extern/backend/src/modules/nms/create.rs b/extern/backend/src/modules/nms/create.rs index 5d70ed5..75801e5 100644 --- a/extern/backend/src/modules/nms/create.rs +++ b/extern/backend/src/modules/nms/create.rs @@ -6,7 +6,7 @@ use std::io::Write; use std::path::Path; // #[cfg(feature = "desktop")] -pub fn create_node(node: Node) -> Result<(), String> { +pub fn save_node(node: Node) -> Result<(), String> { let name = node.name.clone(); if !check_name(name.clone()) { @@ -18,11 +18,10 @@ pub fn create_node(node: Node) -> Result<(), String> { if !Path::new("nodes/").exists() { create_dir(Path::new("nodes/")).map_err(|e| e.to_string())?; } - if Path::new("nodes/").join(name.clone()).exists() { - return Err(format!("A node named {} does already exist!", name)); + if !Path::new("nodes/").join(name.clone()).exists() { + create_dir(Path::new("nodes/").join(name.clone())).map_err(|e| e.to_string())?; } - create_dir(Path::new("nodes/").join(name.clone())).map_err(|e| e.to_string())?; let meta: Metadata = node.clone().into(); let meta_toml = toml::to_string(&meta).unwrap(); let mut meta_file = File::create(Path::new("nodes/").join(name.clone()).join("meta.toml")) @@ -31,7 +30,7 @@ pub fn create_node(node: Node) -> Result<(), String> { .write_all(meta_toml.as_bytes()) .map_err(|e| e.to_string())?; - let env_hash = meta.impls[0].clone().1; + let env_hash = meta.versions[0].clone().env.hash(); create_dir( Path::new("nodes/") .join(name.clone()) @@ -43,7 +42,7 @@ pub fn create_node(node: Node) -> Result<(), String> { Path::new("nodes/") .join(name) .join(env_hash) - .join("node.bin"), + .join(format!("{}.bin", meta.versions[0].clone().version)), ) .map_err(|e| e.to_string())?; node_file.write_all(&node_bin).map_err(|e| e.to_string())?; diff --git a/extern/backend/src/modules/nms/modify.rs b/extern/backend/src/modules/nms/modify.rs deleted file mode 100644 index e69de29..0000000 diff --git a/extern/backend/src/modules/utils.rs b/extern/backend/src/modules/utils.rs index 7678b79..7be22c0 100644 --- a/extern/backend/src/modules/utils.rs +++ b/extern/backend/src/modules/utils.rs @@ -8,7 +8,6 @@ pub mod node; pub mod param; pub mod save_node; pub mod save_param; -pub mod search; pub mod prelude { pub use super::container::*; @@ -23,7 +22,4 @@ pub mod prelude { pub use super::super::save_node::*; pub use super::super::save_param::*; } - pub mod search { - pub use super::super::search::*; - } } diff --git a/extern/backend/src/modules/utils/metadata.rs b/extern/backend/src/modules/utils/metadata.rs index 2da4384..284e5d5 100644 --- a/extern/backend/src/modules/utils/metadata.rs +++ b/extern/backend/src/modules/utils/metadata.rs @@ -2,13 +2,19 @@ use super::prelude::*; use derive_builder::Builder; use serde::{Deserialize, Serialize}; // -------------------- METADATA -------------------- // +#[derive(PartialEq, Builder, Clone, Serialize, Deserialize)] +pub struct Version { + pub version: String, + pub env: Environment, +} + #[derive(Builder, Serialize, Deserialize)] pub struct Metadata { pub name: String, pub description: String, pub author: String, pub date: Date, - pub impls: Vec<(Environment, String)>, + pub versions: Vec, } impl From for Metadata { @@ -18,10 +24,10 @@ impl From for Metadata { .description(node.description.clone()) .author(node.author.clone()) .date(node.date) - .impls(vec![( - node.clone().get_full_env().clone(), - node.clone().get_full_env().hash(), - )]) + .versions(vec![Version { + version: node.version.version.clone(), + env: node.get_full_env(), + }]) .build() .expect("Internal error") } diff --git a/extern/backend/src/modules/utils/node.rs b/extern/backend/src/modules/utils/node.rs index b5f1e67..f95bf43 100644 --- a/extern/backend/src/modules/utils/node.rs +++ b/extern/backend/src/modules/utils/node.rs @@ -16,17 +16,17 @@ pub type WeakNode = WeakContext; pub struct Node { pub name: String, pub params: Vec, + pub version: Version, pub kind: NodeKind, pub description: String, pub author: String, pub compiled: Option, // or and bytes... - pub environment: Environment, pub date: Date, } impl Node { pub fn get_full_env(self) -> Environment { - let mut env = self.environment; + let mut env = self.version.env; if let NodeKind::Bundled { bundle } = self.kind { for context in bundle.tree.iter() { let node: Node = context.context.try_lock().unwrap().to_owned(); @@ -80,7 +80,10 @@ impl From for Node { .description(node.description) .author(node.author) .compiled(node.compiled) - .environment(node.environment) + .version(Version { + version: node.version.version, + env: node.version.env, + }) .date(node.date) .params(params); diff --git a/extern/backend/src/modules/utils/save_node.rs b/extern/backend/src/modules/utils/save_node.rs index 5db4f9c..8ec1833 100644 --- a/extern/backend/src/modules/utils/save_node.rs +++ b/extern/backend/src/modules/utils/save_node.rs @@ -16,7 +16,7 @@ pub struct SaveNode { pub description: String, pub author: String, pub compiled: Option, - pub environment: Environment, + pub version: Version, pub date: Date, } @@ -39,7 +39,10 @@ impl From for SaveNode { .description(node.description.clone()) .author(node.author.clone()) .compiled(node.compiled.clone()) - .environment(node.clone().get_full_env()) + .version(Version { + version: node.version.version.clone(), + env: node.clone().get_full_env(), + }) .date(node.date); if let NodeKind::Code { code } = node.kind { diff --git a/extern/backend/src/modules/utils/search.rs b/extern/backend/src/modules/utils/search.rs deleted file mode 100644 index 9b2e449..0000000 --- a/extern/backend/src/modules/utils/search.rs +++ /dev/null @@ -1,23 +0,0 @@ -use super::prelude::*; -use chrono::Utc; -/// This function searches through all available Nodes and returns a NodeContainer containing all Nodes available for the inferred environment. -pub fn search(query: String) -> NodeContainer { - // TODO: implement search function here and add a node container parameter to infer the - // environment - - // TODO: remove this: - let mut c = NodeContainer::new(); - c.push(Node { - name: "test_code_node".to_string(), - params: vec![], - kind: NodeKind::Code { - code: "fn main() { println!(\"Hello, world!\"); }".to_string(), - }, - description: "A simple code node".to_string(), - author: "Author".to_string(), - compiled: None, - environment: Environment { deps: vec![] }, - date: Utc::now(), - }); - c -} diff --git a/extern/backend/tests/create.rs b/extern/backend/tests/create.rs index 3998136..d73948e 100644 --- a/extern/backend/tests/create.rs +++ b/extern/backend/tests/create.rs @@ -1,5 +1,5 @@ use chrono::Utc; -use sai_backend::nms::create::create_node; +use sai_backend::nms::create::save_node; use sai_backend::utils::prelude::*; use uuid::Uuid; @@ -14,11 +14,14 @@ fn test_create_code_node() { description: "A simple code node".to_string(), author: "Author".to_string(), compiled: None, - environment: Environment { deps: vec![] }, + version: Version { + version: String::from("0.0.1"), + env: Environment { deps: vec![] }, + }, date: Utc::now(), }; - let res = create_node(node); + let res = save_node(node); println!("{:?}", res); assert!(res.is_ok()); @@ -35,7 +38,10 @@ fn test_create_bundled_node() { description: "First code node".to_string(), author: "Author".to_string(), compiled: None, - environment: Environment { deps: vec![] }, + version: Version { + version: String::from("0.0.1"), + env: Environment { deps: vec![] }, + }, date: Utc::now(), }; @@ -48,7 +54,10 @@ fn test_create_bundled_node() { description: "Second code node".to_string(), author: "Author".to_string(), compiled: None, - environment: Environment { deps: vec![] }, + version: Version { + version: String::from("0.0.1"), + env: Environment { deps: vec![] }, + }, date: Utc::now(), }; @@ -63,11 +72,14 @@ fn test_create_bundled_node() { description: "A bundled node".to_string(), author: "Author".to_string(), compiled: None, - environment: Environment { deps: vec![] }, + version: Version { + version: String::from("0.0.1"), + env: Environment { deps: vec![] }, + }, date: Utc::now(), }; - let res = create_node(bundled_node); + let res = save_node(bundled_node); println!("{:?}", res); @@ -116,12 +128,15 @@ fn test_create_complex_bundled_node() { description: "A complex code node".to_string(), author: "Author".to_string(), compiled: None, - environment: Environment { - deps: vec![Dependency { - name: "serde".to_string(), - versions: vec!["1.0".to_string()], - lib: true, - }], + version: Version { + version: String::from("0.0.1"), + env: Environment { + deps: vec![Dependency { + name: "serde".to_string(), + versions: vec!["1.0".to_string()], + lib: true, + }], + }, }, date: Utc::now(), }; @@ -136,11 +151,14 @@ fn test_create_complex_bundled_node() { description: "A complex bundled node".to_string(), author: "Author".to_string(), compiled: None, - environment: Environment { deps: vec![] }, + version: Version { + version: String::from("0.0.1"), + env: Environment { deps: vec![] }, + }, date: Utc::now(), }; - let res = create_node(bundled_node); + let res = save_node(bundled_node); println!("{:?}", res); assert!(res.is_ok()); From 8e8760aa78b015622b2d68e1472c5806001892a4 Mon Sep 17 00:00:00 2001 From: Malte Rauschenbach Date: Mon, 10 Mar 2025 09:32:47 +0100 Subject: [PATCH 04/12] Write query logic --- extern/backend/Cargo.toml | 2 + extern/backend/src/modules/nms.rs | 2 +- extern/backend/src/modules/nms/create.rs | 51 ------------------- extern/backend/src/modules/utils.rs | 2 + extern/backend/src/modules/utils/container.rs | 30 +++++++++++ 5 files changed, 35 insertions(+), 52 deletions(-) delete mode 100644 extern/backend/src/modules/nms/create.rs diff --git a/extern/backend/Cargo.toml b/extern/backend/Cargo.toml index 12161ab..1fc0f13 100644 --- a/extern/backend/Cargo.toml +++ b/extern/backend/Cargo.toml @@ -21,3 +21,5 @@ sha2 = { version = "0.10.8" } uuid = { version = "1.15.1", features = ["v4"] } bincode = { version = "1.1.3" } tokio = { version = "1.43.0", features = ["sync"] } +fuzzy-matcher = "0.3.7" +walkdir = "2.5.0" diff --git a/extern/backend/src/modules/nms.rs b/extern/backend/src/modules/nms.rs index 970c49c..e6cc05a 100644 --- a/extern/backend/src/modules/nms.rs +++ b/extern/backend/src/modules/nms.rs @@ -1,6 +1,6 @@ -pub mod create; pub mod delete; pub mod query; +pub mod save; fn check_name(name: String) -> bool { name.chars() diff --git a/extern/backend/src/modules/nms/create.rs b/extern/backend/src/modules/nms/create.rs deleted file mode 100644 index 75801e5..0000000 --- a/extern/backend/src/modules/nms/create.rs +++ /dev/null @@ -1,51 +0,0 @@ -use crate::nms::check_name; -use crate::utils::prelude::{save::*, *}; -use anyhow::Result; -use std::fs::{create_dir, File}; -use std::io::Write; -use std::path::Path; - -// #[cfg(feature = "desktop")] -pub fn save_node(node: Node) -> Result<(), String> { - let name = node.name.clone(); - - if !check_name(name.clone()) { - return Err(format!( - "Node name {} is not allowed! Please only use letters, dashes and underscores.", - name - )); - } - if !Path::new("nodes/").exists() { - create_dir(Path::new("nodes/")).map_err(|e| e.to_string())?; - } - if !Path::new("nodes/").join(name.clone()).exists() { - create_dir(Path::new("nodes/").join(name.clone())).map_err(|e| e.to_string())?; - } - - let meta: Metadata = node.clone().into(); - let meta_toml = toml::to_string(&meta).unwrap(); - let mut meta_file = File::create(Path::new("nodes/").join(name.clone()).join("meta.toml")) - .map_err(|e| e.to_string())?; - meta_file - .write_all(meta_toml.as_bytes()) - .map_err(|e| e.to_string())?; - - let env_hash = meta.versions[0].clone().env.hash(); - create_dir( - Path::new("nodes/") - .join(name.clone()) - .join(env_hash.clone()), - ) - .map_err(|e| e.to_string())?; - let node_bin = bincode::serialize(&SaveNode::from(node)).map_err(|e| e.to_string())?; - let mut node_file = File::create( - Path::new("nodes/") - .join(name) - .join(env_hash) - .join(format!("{}.bin", meta.versions[0].clone().version)), - ) - .map_err(|e| e.to_string())?; - node_file.write_all(&node_bin).map_err(|e| e.to_string())?; - - Ok(()) -} diff --git a/extern/backend/src/modules/utils.rs b/extern/backend/src/modules/utils.rs index 7be22c0..ee12bdd 100644 --- a/extern/backend/src/modules/utils.rs +++ b/extern/backend/src/modules/utils.rs @@ -6,6 +6,7 @@ pub mod environment; pub mod metadata; pub mod node; pub mod param; +pub mod query_filter; pub mod save_node; pub mod save_param; @@ -18,6 +19,7 @@ pub mod prelude { pub use super::metadata::*; pub use super::node::*; pub use super::param::*; + pub use super::query_filter::*; pub mod save { pub use super::super::save_node::*; pub use super::super::save_param::*; diff --git a/extern/backend/src/modules/utils/container.rs b/extern/backend/src/modules/utils/container.rs index 78d735a..107593b 100644 --- a/extern/backend/src/modules/utils/container.rs +++ b/extern/backend/src/modules/utils/container.rs @@ -24,6 +24,36 @@ impl Default for Container { } } +pub struct ContainerIter<'a, T> { + iter: std::slice::Iter<'a, StrongContext>, +} + +impl Container { + pub fn iter(&self) -> ContainerIter { + ContainerIter { + iter: self.tree.iter(), + } + } +} + +impl<'a, T> Iterator for ContainerIter<'a, T> { + type Item = &'a StrongContext; + + fn next(&mut self) -> Option { + self.iter.next() + } +} + +impl FromIterator> for Container { + fn from_iter>>(iter: I) -> Self { + let mut container = Container::new(); + for item in iter { + container.push_context(item); + } + container + } +} + // -------------------- NODE CONTAINER -------------------- // pub type NodeContainer = Container; From 068a015576b7eea3b3a9c558da5357527df793a9 Mon Sep 17 00:00:00 2001 From: Malte Rauschenbach Date: Mon, 10 Mar 2025 09:33:02 +0100 Subject: [PATCH 05/12] Recommit --- extern/backend/src/modules/nms/query.rs | 48 ++++++++++++++ extern/backend/src/modules/nms/save.rs | 64 +++++++++++++++++++ .../backend/src/modules/utils/query_filter.rs | 30 +++++++++ 3 files changed, 142 insertions(+) create mode 100644 extern/backend/src/modules/nms/query.rs create mode 100644 extern/backend/src/modules/nms/save.rs create mode 100644 extern/backend/src/modules/utils/query_filter.rs diff --git a/extern/backend/src/modules/nms/query.rs b/extern/backend/src/modules/nms/query.rs new file mode 100644 index 0000000..7a65bf3 --- /dev/null +++ b/extern/backend/src/modules/nms/query.rs @@ -0,0 +1,48 @@ +use std::path::Path; + +use crate::utils::prelude::{save::*, *}; +use walkdir::WalkDir; + +pub fn get_all_nodes() -> Result { + let nodes_dir = Path::new("nodes"); + if !nodes_dir.exists() { + return Ok(NodeContainer::default()); + } + + let mut nc = NodeContainer::default(); + + for entry in WalkDir::new(nodes_dir) + .into_iter() + .filter_map(Result::ok) + .filter(|e| e.path().extension().is_some_and(|ext| ext == "bin")) + { + let path = entry.path(); + let data = + std::fs::read(path).map_err(|e| format!("Failed to read {}: {}", path.display(), e))?; + + let save_node: SaveNode = bincode::deserialize(&data) + .map_err(|e| format!("Failed to deserialize {}: {}", path.display(), e))?; + + let node = Node::from(save_node); + nc.push_context(StrongNode::from(node)); + } + + Ok(nc) +} + +/// This function searches through all available Nodes and returns a NodeContainer containing all Nodes available for the inferred environment. +pub fn query(query_filter: Vec) -> NodeContainer { + let all_nodes = get_all_nodes().expect("Error walking directory!"); + + all_nodes + .iter() + .filter(|node| { + query_filter.iter().all(|filter| { + filter + .clone() + .is_ok(node.context.try_lock().unwrap().to_owned()) + }) + }) + .cloned() + .collect() +} diff --git a/extern/backend/src/modules/nms/save.rs b/extern/backend/src/modules/nms/save.rs new file mode 100644 index 0000000..f4df651 --- /dev/null +++ b/extern/backend/src/modules/nms/save.rs @@ -0,0 +1,64 @@ +use crate::nms::check_name; +use crate::utils::prelude::{save::*, *}; +use anyhow::Result; +use std::fs::{create_dir, create_dir_all, File}; +use std::io::Write; +use std::path::Path; + +// #[cfg(feature = "desktop")] +pub fn save_node(node: Node) -> Result<(), String> { + let name = node.name.clone(); + + if !check_name(name.clone()) { + return Err(format!( + "Node name {} is not allowed! Please only use letters, dashes and underscores.", + name + )); + } + + let node_path = Path::new("nodes/").join(&name); + if !node_path.exists() { + create_dir_all(&node_path).map_err(|e| e.to_string())?; + } + + let meta_path = node_path.join("meta.toml"); + let mut meta: Metadata = if meta_path.exists() { + let meta_content = std::fs::read_to_string(&meta_path).map_err(|e| e.to_string())?; + toml::from_str(&meta_content).map_err(|e| e.to_string())? + } else { + Metadata::from(node.clone()) + }; + + let new_version = Version { + version: node.version.version.clone(), + env: node.clone().get_full_env(), + }; + + if !meta + .versions + .iter() + .any(|v| v.version == new_version.version) + { + meta.versions.push(new_version.clone()); + } + + let meta_toml = toml::to_string(&meta).unwrap(); + let mut meta_file = File::create(&meta_path).map_err(|e| e.to_string())?; + meta_file + .write_all(meta_toml.as_bytes()) + .map_err(|e| e.to_string())?; + + let env_hash = new_version.env.hash(); + let env_path = node_path.join(&env_hash); + if !env_path.exists() { + create_dir(&env_path).map_err(|e| e.to_string())?; + } + + let bin_path = env_path.join(format!("{}.bin", new_version.version)); + + let node_bin = bincode::serialize(&SaveNode::from(node)).map_err(|e| e.to_string())?; + let mut node_file = File::create(bin_path).map_err(|e| e.to_string())?; + node_file.write_all(&node_bin).map_err(|e| e.to_string())?; + + Ok(()) +} diff --git a/extern/backend/src/modules/utils/query_filter.rs b/extern/backend/src/modules/utils/query_filter.rs new file mode 100644 index 0000000..71cd99c --- /dev/null +++ b/extern/backend/src/modules/utils/query_filter.rs @@ -0,0 +1,30 @@ +use crate::utils::prelude::*; +use fuzzy_matcher::{skim::SkimMatcherV2, FuzzyMatcher}; + +// ---------------- QUERY FILTER ---------------- // +#[derive(Clone)] +pub enum QueryFilter { + Older { date: Date }, + Newer { date: Date }, + Author { author: String }, + Environment { env: Environment }, + Name { name: String }, +} + +impl QueryFilter { + pub fn is_ok(self, node: Node) -> bool { + match self { + QueryFilter::Name { name } => { + let matcher = SkimMatcherV2::default(); + matcher.fuzzy_match(&node.name, &name).is_some() + } + QueryFilter::Older { date } => date > node.date, + QueryFilter::Newer { date } => date < node.date, + QueryFilter::Author { author } => { + let matcher = SkimMatcherV2::default(); + matcher.fuzzy_match(&node.author, &author).is_some() + } + QueryFilter::Environment { env } => env.merge(&node.version.env).is_ok(), + } + } +} From c9ce682590a09b969ade5ee6df79a21c4016b840 Mon Sep 17 00:00:00 2001 From: Malte Rauschenbach Date: Mon, 10 Mar 2025 19:04:57 +0100 Subject: [PATCH 06/12] Start NMS delete --- .../{node.bin => 0.0.1.bin} | Bin 473 -> 473 bytes extern/backend/nodes/bundled_node/meta.toml | 2 +- .../0.0.1.bin | Bin 0 -> 671 bytes .../node.bin | Bin 671 -> 0 bytes .../0.0.2.bin | Bin 0 -> 737 bytes .../nodes/complex_bundled_node/meta.toml | 15 +++- .../{node.bin => 0.0.1.bin} | Bin 182 -> 182 bytes extern/backend/nodes/test_code_node/meta.toml | 2 +- extern/backend/src/modules/nms/delete.rs | 69 ++++++++++++++++++ extern/backend/src/modules/nms/save.rs | 61 ++++++++++++++-- extern/backend/tests/create.rs | 51 ++++++++++++- 11 files changed, 188 insertions(+), 12 deletions(-) rename extern/backend/nodes/bundled_node/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/{node.bin => 0.0.1.bin} (62%) create mode 100644 extern/backend/nodes/complex_bundled_node/347d4e7d76b463a7b8415486415c698bf2c792ee6384f96eca96e1d45a2f3986/0.0.1.bin delete mode 100644 extern/backend/nodes/complex_bundled_node/347d4e7d76b463a7b8415486415c698bf2c792ee6384f96eca96e1d45a2f3986/node.bin create mode 100644 extern/backend/nodes/complex_bundled_node/815883006474706806af1b7768d3919fd65e95346e36534e1aa355e910521de1/0.0.2.bin rename extern/backend/nodes/test_code_node/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/{node.bin => 0.0.1.bin} (70%) diff --git a/extern/backend/nodes/bundled_node/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/node.bin b/extern/backend/nodes/bundled_node/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/0.0.1.bin similarity index 62% rename from extern/backend/nodes/bundled_node/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/node.bin rename to extern/backend/nodes/bundled_node/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/0.0.1.bin index 9106cf993dd79950500ea60c9c7373bc4b48a2fd..e37784e901163c86a1506bc18d82baa95c7633b8 100644 GIT binary patch delta 70 zcmcb~e3N;?UO_`MD^p`DBO^TvOCt+I6BFZ!=Vl0@3Yr=k8BVTX^brlP Du4)m# delta 70 zcmcb~e3N;?UO@wMD+41dLvuYtOLJorV-xd<=Vl0@30fMMOs-(`6Gj!bFgLS^0syTf B5yJog diff --git a/extern/backend/nodes/bundled_node/meta.toml b/extern/backend/nodes/bundled_node/meta.toml index d2c5e6b..80c3777 100644 --- a/extern/backend/nodes/bundled_node/meta.toml +++ b/extern/backend/nodes/bundled_node/meta.toml @@ -1,7 +1,7 @@ name = "bundled_node" description = "A bundled node" author = "Author" -date = "2025-03-10T07:02:17.197348768Z" +date = "2025-03-10T12:33:26.326778746Z" [[versions]] version = "0.0.1" diff --git a/extern/backend/nodes/complex_bundled_node/347d4e7d76b463a7b8415486415c698bf2c792ee6384f96eca96e1d45a2f3986/0.0.1.bin b/extern/backend/nodes/complex_bundled_node/347d4e7d76b463a7b8415486415c698bf2c792ee6384f96eca96e1d45a2f3986/0.0.1.bin new file mode 100644 index 0000000000000000000000000000000000000000..5b4b9087bc3b1a2bd9e404efb75502136400d64b GIT binary patch literal 671 zcmWe(fPm!u+=86ciuk0`yp){Ol=!^-lvGBj91oN(E=erOOpY%|EK1B3f{HmRKtvV5 zqNydRMIc>hI?57rN>kZ^;(2Ap>7PD`>{#YI{eeh!!Bmi1m@R@(6Jah%2D$+33?`@q zACxXC%`3^wO@+9_P#7xer~nm5xCAQ0zyPv(v;X1CS)I?Otn=U5&CD_P23FIIBw?oI z<(Fin7GXCN?CPYj&XqaEwmTlVUiN;LWAX}Qhep^J+Yc7e^A9?A*6$G4HwPJ}4mB|? zPa!ukGfzWPp<1D!C^N4lCr?pB$r%#t3VuM(Drs6P)FQkC4F?5KI4FRkgAHnuV`)i7 zeh~vJlxv`8pl1jRM3`W4Y7rv-n4u~S^$Zy0pll-pBU4=iV_ido5JNL7Q)4S5BRvaC fBMWm=OB2H=F_=|A+rjBV0h%u8=nxB26Qd{qgVd6N literal 0 HcmV?d00001 diff --git a/extern/backend/nodes/complex_bundled_node/347d4e7d76b463a7b8415486415c698bf2c792ee6384f96eca96e1d45a2f3986/node.bin b/extern/backend/nodes/complex_bundled_node/347d4e7d76b463a7b8415486415c698bf2c792ee6384f96eca96e1d45a2f3986/node.bin deleted file mode 100644 index 4c66ac29f51f217ad468e67147b1b56df44393de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 671 zcmWe(fPm!u+=86ciuk0`yp){Ol=!^-lvGBj91oN(E=erOOpY%|EK1B3f{HmRKtvV5 zqNydRMIc>hI?57rN>kZ^;?v!Pu1x(}xH`u}(9176C;_AvW{V)yM3_sGfi3_$g9$3Z z2c?Tj^GY&vQz7m!6o!gADnP{%E`iE0Fo3Ln96kG-cP;m%5YP2L8zz`=U^UH15@uRn zeo01Z5q2}duKu*L`Wo|W?a89vekSXm%iIFlQC1oMdb7H1ce-c7^&bcKZvz>o4mB|? zPa!ukGfzWPp<1D!C^N4lCr?pB$r%#t3VuM(Drs6P)FQkC4F?5KI4FRkgAHnuV`)i7 zeh~vJlxv`8pl1jRM3`W4Y7rv-n4u~S^$Zy0pll-pBU4=iV_ido5Cd~710yR#b3H># eb7ON$V`IxGF_=|A+rjBV0h%u8=@3gZqbL9~pph&9 diff --git a/extern/backend/nodes/complex_bundled_node/815883006474706806af1b7768d3919fd65e95346e36534e1aa355e910521de1/0.0.2.bin b/extern/backend/nodes/complex_bundled_node/815883006474706806af1b7768d3919fd65e95346e36534e1aa355e910521de1/0.0.2.bin new file mode 100644 index 0000000000000000000000000000000000000000..11db0f617c2550f834f138cbea487d254912c208 GIT binary patch literal 737 zcmWe(fPm!u+=86ciuk0`yp){Ol=!^-lvGBj91oN(E=erOOpY%|EK1B3f{HmRKtvV5 zqNydRMIc>hI?57rN>kZ^;$}wz&VT;BW5ol%@|79Tx8v>fGp5w_}2p&O4A{>QEEY z@)U9tGxIbw6{-~qiZb&`a`F^4l$;^KuHXmstdgd+LM_5O&~Q)yg@XbpI@q8lIhK}W z) -> Result<(), String> { + let node_path = Path::new("nodes/").join(&name); + let meta_path = node_path.join("meta.toml"); + + if !node_path.exists() { + return Err(format!("Node '{}' does not exist.", name)); + } + + if !meta_path.exists() { + fs::remove_dir_all(&node_path).map_err(|e| e.to_string())?; + return Ok(()); + } + + let meta_content = std::fs::read_to_string(&meta_path).map_err(|e| e.to_string())?; + let mut meta: Metadata = toml::from_str(&meta_content).map_err(|e| e.to_string())?; + + if let Some(ver) = version { + let version_index = meta.versions.iter().position(|v| v.version == ver); + if let Some(index) = version_index { + let env_hash = meta.versions[index].env.hash(); + let bin_path = node_path.join(&env_hash).join(format!("{}.bin", ver)); + + if bin_path.exists() { + fs::remove_file(&bin_path).map_err(|e| e.to_string())?; + } + + // Remove empty environment folder + let env_path = node_path.join(&env_hash); + if env_path + .read_dir() + .map_err(|e| e.to_string())? + .next() + .is_none() + { + fs::remove_dir(&env_path).map_err(|e| e.to_string())?; + } + + meta.versions.remove(index); + } else { + return Err(format!("Version '{}' not found for node '{}'.", ver, name)); + } + } else { + // Delete the entire node + fs::remove_dir_all(&node_path).map_err(|e| e.to_string())?; + return Ok(()); + } + + if meta.versions.is_empty() { + fs::remove_dir_all(&node_path).map_err(|e| e.to_string())?; + } else { + let meta_toml = toml::to_string(&meta).map_err(|e| e.to_string())?; + let tmp_meta_path = node_path.join("meta.toml.tmp"); + + let mut tmp_meta_file = File::create(&tmp_meta_path).map_err(|e| e.to_string())?; + tmp_meta_file + .write_all(meta_toml.as_bytes()) + .map_err(|e| e.to_string())?; + + fs::rename(&tmp_meta_path, &meta_path).map_err(|e| e.to_string())?; + } + + Ok(()) +} diff --git a/extern/backend/src/modules/nms/save.rs b/extern/backend/src/modules/nms/save.rs index f4df651..5d5a398 100644 --- a/extern/backend/src/modules/nms/save.rs +++ b/extern/backend/src/modules/nms/save.rs @@ -1,9 +1,10 @@ use crate::nms::check_name; use crate::utils::prelude::{save::*, *}; use anyhow::Result; -use std::fs::{create_dir, create_dir_all, File}; +use std::fs::{self, create_dir, create_dir_all, File}; use std::io::Write; use std::path::Path; +use toml; // #[cfg(feature = "desktop")] pub fn save_node(node: Node) -> Result<(), String> { @@ -34,20 +35,54 @@ pub fn save_node(node: Node) -> Result<(), String> { env: node.clone().get_full_env(), }; - if !meta + let existing_index = meta .versions .iter() - .any(|v| v.version == new_version.version) - { + .position(|v| v.version == new_version.version); + + if let Some(index) = existing_index { + let existing_env_hash = meta.versions[index].env.hash(); + let new_env_hash = new_version.env.hash(); + + if existing_env_hash != new_env_hash { + // Remove old binary + let old_bin_path = node_path + .join(&existing_env_hash) + .join(format!("{}.bin", new_version.version)); + if old_bin_path.exists() { + fs::remove_file(&old_bin_path).map_err(|e| e.to_string())?; + } + + // Remove empty env folder + let old_env_path = node_path.join(&existing_env_hash); + if old_env_path.exists() + && old_env_path + .read_dir() + .map_err(|e| e.to_string())? + .next() + .is_none() + { + fs::remove_dir(&old_env_path).map_err(|e| e.to_string())?; + } + + // Update the existing entry + meta.versions[index] = new_version.clone(); + } + } else { meta.versions.push(new_version.clone()); } - let meta_toml = toml::to_string(&meta).unwrap(); - let mut meta_file = File::create(&meta_path).map_err(|e| e.to_string())?; - meta_file + let meta_toml = toml::to_string(&meta).map_err(|e| e.to_string())?; + let tmp_meta_path = node_path.join("meta.toml.tmp"); + + let mut tmp_meta_file = File::create(&tmp_meta_path).map_err(|e| e.to_string())?; + tmp_meta_file .write_all(meta_toml.as_bytes()) .map_err(|e| e.to_string())?; + // Atomically replace the old meta file + fs::rename(&tmp_meta_path, &meta_path).map_err(|e| e.to_string())?; + let env_hash = new_version.env.hash(); let env_path = node_path.join(&env_hash); if !env_path.exists() { @@ -57,8 +92,18 @@ pub fn save_node(node: Node) -> Result<(), String> { let bin_path = env_path.join(format!("{}.bin", new_version.version)); let node_bin = bincode::serialize(&SaveNode::from(node)).map_err(|e| e.to_string())?; - let mut node_file = File::create(bin_path).map_err(|e| e.to_string())?; + let mut node_file = File::create(&bin_path).map_err(|e| e.to_string())?; node_file.write_all(&node_bin).map_err(|e| e.to_string())?; + // Remove empty node folder if necessary + if node_path + .read_dir() + .map_err(|e| e.to_string())? + .next() + .is_none() + { + fs::remove_dir(&node_path).map_err(|e| e.to_string())?; + } + Ok(()) } diff --git a/extern/backend/tests/create.rs b/extern/backend/tests/create.rs index d73948e..f2500a4 100644 --- a/extern/backend/tests/create.rs +++ b/extern/backend/tests/create.rs @@ -1,5 +1,5 @@ use chrono::Utc; -use sai_backend::nms::create::save_node; +use sai_backend::nms::save::save_node; use sai_backend::utils::prelude::*; use uuid::Uuid; @@ -141,9 +141,41 @@ fn test_create_complex_bundled_node() { date: Utc::now(), }; + let code_node2 = Node { + name: "complex_code_node".to_string(), + params: vec![runtime_param1.clone(), runtime_param2.clone()], + kind: NodeKind::Code { + code: "fn main() { println!(\"Complex Node\"); }".to_string(), + }, + description: "A complex code node".to_string(), + author: "Author".to_string(), + compiled: None, + version: Version { + version: String::from("0.0.2"), + env: Environment { + deps: vec![ + Dependency { + name: "serde".to_string(), + versions: vec!["1.0".to_string()], + lib: true, + }, + Dependency { + name: "torch".to_string(), + versions: vec!["2.0".to_string()], + lib: true, + }, + ], + }, + }, + date: Utc::now(), + }; + let mut nc: NodeContainer = NodeContainer::new(); nc.push_context(StrongContext::from(code_node)); + let mut nc2: NodeContainer = NodeContainer::new(); + nc2.push_context(StrongContext::from(code_node2)); + let bundled_node = Node { name: "complex_bundled_node".to_string(), params: vec![static_param.clone()], @@ -158,8 +190,25 @@ fn test_create_complex_bundled_node() { date: Utc::now(), }; + let bundled_node2 = Node { + name: "complex_bundled_node".to_string(), + params: vec![static_param.clone()], + kind: NodeKind::Bundled { bundle: nc2 }, + description: "A complex bundled node".to_string(), + author: "Author".to_string(), + compiled: None, + version: Version { + version: String::from("0.0.2"), + env: Environment { deps: vec![] }, + }, + date: Utc::now(), + }; + let res = save_node(bundled_node); + let res2 = save_node(bundled_node2); println!("{:?}", res); + println!("{:?}", res2); assert!(res.is_ok()); + assert!(res2.is_ok()); } From ef09916e1afb2899394fd1ffe42c4bd32636c727 Mon Sep 17 00:00:00 2001 From: Malte Rauschenbach Date: Mon, 10 Mar 2025 19:11:42 +0100 Subject: [PATCH 07/12] Add delete test --- .../1.0.0.bin | Bin 0 -> 208 bytes .../test_delete_invalid_version/meta.toml | 10 ++ .../2.0.0.bin | Bin 0 -> 194 bytes .../nodes/test_delete_version/meta.toml | 10 ++ extern/backend/tests/delete.rs | 121 ++++++++++++++++++ 5 files changed, 141 insertions(+) create mode 100644 extern/backend/nodes/test_delete_invalid_version/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/1.0.0.bin create mode 100644 extern/backend/nodes/test_delete_invalid_version/meta.toml create mode 100644 extern/backend/nodes/test_delete_version/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/2.0.0.bin create mode 100644 extern/backend/nodes/test_delete_version/meta.toml create mode 100644 extern/backend/tests/delete.rs diff --git a/extern/backend/nodes/test_delete_invalid_version/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/1.0.0.bin b/extern/backend/nodes/test_delete_invalid_version/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/1.0.0.bin new file mode 100644 index 0000000000000000000000000000000000000000..be8033da0de9e9be3c2bba0d2d82156ab15c3bfd GIT binary patch literal 208 zcmX|&u?oUK5Jc1HPbjjcN)W^Cg@B2bUtnWp69QSy!nr5O84>Z{1znwH=E0j;^i7~4 z)Gav*RI`kYP@)U9tGxIbw6{-~qiZb&`a`F^4 zl)@ky6pWNKtrcozp=uo!^72zs70NS9G8A%4b4oG`a#9tbW*4);6qS}_+On!phLl%D_m^)X>P%%)r>hI0^uPQYeK0 literal 0 HcmV?d00001 diff --git a/extern/backend/nodes/test_delete_version/meta.toml b/extern/backend/nodes/test_delete_version/meta.toml new file mode 100644 index 0000000..f83aea5 --- /dev/null +++ b/extern/backend/nodes/test_delete_version/meta.toml @@ -0,0 +1,10 @@ +name = "test_delete_version" +description = "A node with multiple versions" +author = "Author" +date = "2025-03-10T18:11:02.512959856Z" + +[[versions]] +version = "2.0.0" + +[versions.env] +deps = [] diff --git a/extern/backend/tests/delete.rs b/extern/backend/tests/delete.rs new file mode 100644 index 0000000..6379244 --- /dev/null +++ b/extern/backend/tests/delete.rs @@ -0,0 +1,121 @@ +use std::path::Path; + +use chrono::Utc; +use sai_backend::{ + nms::{delete::delete_node, save::save_node}, + utils::prelude::*, +}; + +#[test] +fn test_delete_entire_node() { + let node = Node { + name: "test_delete_node".to_string(), + params: vec![], + kind: NodeKind::Code { + code: "fn main() { println!(\"Delete me\"); }".to_string(), + }, + description: "A node to be deleted".to_string(), + author: "Author".to_string(), + compiled: None, + version: Version { + version: String::from("1.0.0"), + env: Environment { deps: vec![] }, + }, + date: Utc::now(), + }; + + let res = save_node(node.clone()); + assert!(res.is_ok()); + + let del_res = delete_node(String::from("test_delete_node"), None); + assert!(del_res.is_ok()); + + let node_path = Path::new("nodes/").join("test_delete_node"); + assert!(!node_path.exists(), "Node folder should be deleted"); +} + +#[test] +fn test_delete_specific_version() { + let node_v1 = Node { + name: "test_delete_version".to_string(), + params: vec![], + kind: NodeKind::Code { + code: "fn main() { println!(\"Version 1\"); }".to_string(), + }, + description: "A node with multiple versions".to_string(), + author: "Author".to_string(), + compiled: None, + version: Version { + version: String::from("1.0.0"), + env: Environment { deps: vec![] }, + }, + date: Utc::now(), + }; + + let node_v2 = Node { + name: "test_delete_version".to_string(), + params: vec![], + kind: NodeKind::Code { + code: "fn main() { println!(\"Version 2\"); }".to_string(), + }, + description: "A node with multiple versions".to_string(), + author: "Author".to_string(), + compiled: None, + version: Version { + version: String::from("2.0.0"), + env: Environment { deps: vec![] }, + }, + date: Utc::now(), + }; + + assert!(save_node(node_v1.clone()).is_ok()); + assert!(save_node(node_v2.clone()).is_ok()); + + let del_res = delete_node( + String::from("test_delete_version"), + Some(String::from("1.0.0")), + ); + assert!(del_res.is_ok()); + + let meta_path = Path::new("nodes/test_delete_version/meta.toml"); + assert!(meta_path.exists(), "Meta file should still exist"); + + let meta_content = std::fs::read_to_string(meta_path).unwrap(); + let meta: Metadata = toml::from_str(&meta_content).unwrap(); + + assert_eq!(meta.versions.len(), 1); + assert_eq!(meta.versions[0].version, "2.0.0"); +} + +#[test] +fn test_delete_nonexistent_node() { + let del_res = delete_node(String::from("nonexistent_node"), None); + assert!(del_res.is_err()); +} + +#[test] +fn test_delete_nonexistent_version() { + let node = Node { + name: "test_delete_invalid_version".to_string(), + params: vec![], + kind: NodeKind::Code { + code: "fn main() { println!(\"Only one version\"); }".to_string(), + }, + description: "A node with a single version".to_string(), + author: "Author".to_string(), + compiled: None, + version: Version { + version: String::from("1.0.0"), + env: Environment { deps: vec![] }, + }, + date: Utc::now(), + }; + + assert!(save_node(node.clone()).is_ok()); + + let del_res = delete_node( + String::from("test_delete_invalid_version"), + Some(String::from("2.0.0")), + ); + assert!(del_res.is_err()); +} From de9b2aee6beca5725e6f09f158fcf2d9ab8a99af Mon Sep 17 00:00:00 2001 From: Malte Rauschenbach Date: Mon, 10 Mar 2025 19:16:38 +0100 Subject: [PATCH 08/12] Fix rust.yml --- .github/workflows/rust.yml | 3 +-- .../0.0.1.bin | Bin 473 -> 473 bytes .../0.0.1.bin | Bin 671 -> 671 bytes .../0.0.2.bin | Bin 737 -> 737 bytes .../0.0.1.bin | Bin 182 -> 182 bytes .../1.0.0.bin | Bin 208 -> 208 bytes .../2.0.0.bin | Bin 194 -> 194 bytes 7 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 38ac38b..31ab940 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -11,12 +11,11 @@ env: jobs: build: - runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Build - run: cargo build --verbose + run: build --release --features "desktop" - name: Run tests run: cargo test --verbose diff --git a/extern/backend/nodes/bundled_node/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/0.0.1.bin b/extern/backend/nodes/bundled_node/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/0.0.1.bin index e37784e901163c86a1506bc18d82baa95c7633b8..91eb49c0d9a320cdec53ccad47ca3897dd7d6d9d 100644 GIT binary patch delta 66 zcmcb~e3N;?K7I=;Lo+Kwb3GGNBSUjji-~7v38DyDniv{Su3+>RLKd|!votl20swCi B5d;7L delta 66 zcmcb~e3N;?K7KPRQ)4S5BRvaCBMURLKZbLv@|r00swA% B5cmK9 diff --git a/extern/backend/nodes/complex_bundled_node/347d4e7d76b463a7b8415486415c698bf2c792ee6384f96eca96e1d45a2f3986/0.0.1.bin b/extern/backend/nodes/complex_bundled_node/347d4e7d76b463a7b8415486415c698bf2c792ee6384f96eca96e1d45a2f3986/0.0.1.bin index 5b4b9087bc3b1a2bd9e404efb75502136400d64b..901dca44d2e12c66298fedfc10caa28f9d82c945 100644 GIT binary patch delta 128 zcmbQwI-hkyo_{lLU@-m9gwO;&V_!Ua|P_#Gei- z3l=T;7_Sr36YM|TBQtfM>#_w*#GF`7Gop+OC8BYkBS(zGJ85!wW ZSQ=TFo12&!Pc~zkDTE?wVQFR*1pxn5Ggbfq diff --git a/extern/backend/nodes/test_code_node/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/0.0.1.bin b/extern/backend/nodes/test_code_node/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/0.0.1.bin index 230946b1ed7716130835851760c8318aa658d86b..fb384a606321a848ab563e47d9fd9e7c2f806a4b 100644 GIT binary patch delta 25 gcmdnSxQ%hb5+MsKLo+Kwb3GGNBSS+I17q_j0AH^Lg8%>k delta 25 gcmdnSxQ%hb5+O4yQ)4S5BRvaCBMWnLBV&Uo0ALvgkpKVy diff --git a/extern/backend/nodes/test_delete_invalid_version/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/1.0.0.bin b/extern/backend/nodes/test_delete_invalid_version/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/1.0.0.bin index be8033da0de9e9be3c2bba0d2d82156ab15c3bfd..f577f0465027d34e660670521e5a5125d24e5dbc 100644 GIT binary patch delta 22 dcmcb>c!6=kL4GqULvuY7Q&V#j3o~=`C;(GK21oz^ delta 22 dcmcb>c!6=kL4HFk10y|CLnBLLV?#^BC;(DY1}Xpm diff --git a/extern/backend/nodes/test_delete_version/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/2.0.0.bin b/extern/backend/nodes/test_delete_version/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/2.0.0.bin index 115f415aef2f4b15d32c2164cd1254dcdd3ceee5..4751d17277e91dffaf4bdf6732e963080656148b 100644 GIT binary patch delta 22 dcmX@ac!+VrW_~j(LvuY7Q&V#bLsJurC;(6M1{eSU delta 22 dcmX@ac!+VrW`08}10y|CLnBKw17j28C;(3w1^)m5 From a8b6c484623a8ab927781053b42b7bf6843d3ccd Mon Sep 17 00:00:00 2001 From: Malte Rauschenbach Date: Mon, 10 Mar 2025 19:17:36 +0100 Subject: [PATCH 09/12] Fix rust.yml again --- .github/workflows/rust.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 31ab940..0cb776a 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -16,6 +16,6 @@ jobs: steps: - uses: actions/checkout@v4 - name: Build - run: build --release --features "desktop" + run: cargo build --release --features "desktop" - name: Run tests run: cargo test --verbose From 972f2de33588d84b671cfa5f5602e5e9eaca823d Mon Sep 17 00:00:00 2001 From: Malte Rauschenbach Date: Mon, 10 Mar 2025 19:19:58 +0100 Subject: [PATCH 10/12] Add glib --- .github/workflows/rust.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 0cb776a..0f29a27 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -15,6 +15,8 @@ jobs: steps: - uses: actions/checkout@v4 + - name: Install system packages + run: sudo apt-get install libglib2.0-dev - name: Build run: cargo build --release --features "desktop" - name: Run tests From ad1234741a8be29f0ab95562847beb99a756cd95 Mon Sep 17 00:00:00 2001 From: Malte Rauschenbach Date: Mon, 10 Mar 2025 19:22:05 +0100 Subject: [PATCH 11/12] Add gtk --- .github/workflows/rust.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 0f29a27..b47e82e 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -16,7 +16,7 @@ jobs: steps: - uses: actions/checkout@v4 - name: Install system packages - run: sudo apt-get install libglib2.0-dev + run: sudo apt-get install libglib2.0-dev && sudo apt-get install libgtk-3-dev - name: Build run: cargo build --release --features "desktop" - name: Run tests From adfb01f5e25760076c19bfc9db585696220fea7b Mon Sep 17 00:00:00 2001 From: Malte Rauschenbach Date: Mon, 10 Mar 2025 19:25:37 +0100 Subject: [PATCH 12/12] Add libsoup-3.0 --- .github/workflows/rust.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index b47e82e..b8db10d 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -16,7 +16,7 @@ jobs: steps: - uses: actions/checkout@v4 - name: Install system packages - run: sudo apt-get install libglib2.0-dev && sudo apt-get install libgtk-3-dev + run: sudo apt-get install libglib2.0-dev libgtk-3-dev libsoup-3.0 - name: Build run: cargo build --release --features "desktop" - name: Run tests