From e3a9746bec44f2428058c1fa410f113e3b2a1a51 Mon Sep 17 00:00:00 2001 From: Miles Johnson Date: Fri, 11 Oct 2024 23:02:04 -0700 Subject: [PATCH] fix: Fix `moon query projects` issues. (#1688) * Fix query. * Redo query. * Slight rework. * Fix tracking. --- CHANGELOG.md | 5 ++ crates/affected/src/affected.rs | 2 +- crates/affected/src/affected_tracker.rs | 8 +-- crates/app/src/queries/projects.rs | 67 +++++++++---------------- crates/cli/tests/query_test.rs | 2 +- 5 files changed, 35 insertions(+), 49 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8888fef3568..7d20e272ef1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,9 +6,14 @@ - Added a new task option `merge`, that defines the same strategy for all applicable fields. Can be overridden with `mergeX` task options. +- Added a `moon` setting to `.moon/toolchain.yml`, which can be used to customize the update check + process. #### 🐞 Fixes +- Fixed `moon query projects` including dependency projects by default. Can be controlled with + `--upstream`. +- Fixed `moon query projects` regex patterns not working when used in conjunction with affected. - Fixed Bash-based hooks being generated with the wrong path separators on Windows. - Fixed an issue where an inherited task with merge strategy "replace" will accidentally remove task args, deps, and env in inheriting tasks. diff --git a/crates/affected/src/affected.rs b/crates/affected/src/affected.rs index 234be4aa567..af1dce2565d 100644 --- a/crates/affected/src/affected.rs +++ b/crates/affected/src/affected.rs @@ -45,9 +45,9 @@ impl fmt::Display for DownstreamScope { // Dependencies #[derive(Clone, Copy, Debug, Default, PartialEq, ValueEnum)] pub enum UpstreamScope { + #[default] None, Direct, - #[default] Deep, } diff --git a/crates/affected/src/affected_tracker.rs b/crates/affected/src/affected_tracker.rs index 81d5d5610b7..ff4e093fca4 100644 --- a/crates/affected/src/affected_tracker.rs +++ b/crates/affected/src/affected_tracker.rs @@ -32,11 +32,11 @@ impl<'app> AffectedTracker<'app> { project_graph, touched_files, projects: FxHashMap::default(), - project_downstream: DownstreamScope::default(), - project_upstream: UpstreamScope::default(), + project_downstream: DownstreamScope::None, + project_upstream: UpstreamScope::Deep, tasks: FxHashMap::default(), - task_downstream: DownstreamScope::default(), - task_upstream: UpstreamScope::default(), + task_downstream: DownstreamScope::None, + task_upstream: UpstreamScope::Deep, } } diff --git a/crates/app/src/queries/projects.rs b/crates/app/src/queries/projects.rs index 1630abbc38a..91a1c628b5e 100644 --- a/crates/app/src/queries/projects.rs +++ b/crates/app/src/queries/projects.rs @@ -8,7 +8,7 @@ use moon_project::Project; use moon_project_graph::ProjectGraph; use moon_task::Task; use moon_vcs::BoxedVcs; -use rustc_hash::{FxHashMap, FxHashSet}; +use rustc_hash::FxHashSet; use serde::{Deserialize, Serialize}; use starbase::AppResult; use starbase_utils::json; @@ -57,7 +57,9 @@ fn convert_to_regex(field: &str, value: &Option) -> AppResult Ok(None), } @@ -101,32 +103,14 @@ pub async fn load_touched_files(vcs: &BoxedVcs) -> AppResult miette::Result>> { - Ok(project_graph - .query(moon_query::build_query(query)?)? - .into_iter() - .filter_map(|project| { - if options - .affected - .as_ref() - .is_some_and(|affected| !affected.is_project_affected(&project.id)) - { - return None; - } - - Some((project.id.clone(), project.to_owned())) - }) - .collect::>()) +fn load_with_query(project_graph: &ProjectGraph, query: &str) -> miette::Result>> { + project_graph.query(moon_query::build_query(query)?) } fn load_with_regex( project_graph: &ProjectGraph, options: &QueryProjectsOptions, -) -> miette::Result>> { +) -> miette::Result>> { let alias_regex = convert_to_regex("alias", &options.alias)?; let id_regex = convert_to_regex("id", &options.id)?; let language_regex = convert_to_regex("language", &options.language)?; @@ -135,17 +119,9 @@ fn load_with_regex( let tags_regex = convert_to_regex("tags", &options.tags)?; let tasks_regex = convert_to_regex("tasks", &options.tasks)?; let type_regex = convert_to_regex("type", &options.type_of)?; - let mut projects = FxHashMap::default(); + let mut filtered = vec![]; for project in project_graph.get_all()? { - if options - .affected - .as_ref() - .is_some_and(|affected| !affected.is_project_affected(&project.id)) - { - continue; - } - if let Some(regex) = &id_regex { if !regex.is_match(&project.id) { continue; @@ -203,10 +179,10 @@ fn load_with_regex( } } - projects.insert(project.id.clone(), project.to_owned()); + filtered.push(project); } - Ok(projects) + Ok(filtered) } pub async fn query_projects( @@ -216,20 +192,25 @@ pub async fn query_projects( debug!("Querying for projects"); let mut projects = if let Some(query) = &options.query { - load_from_query(project_graph, query, options)? + load_with_query(project_graph, query)? } else { load_with_regex(project_graph, options)? }; if let Some(affected) = &options.affected { - debug!("Including affected projects"); - - for dep_id in affected.projects.keys() { - if !projects.contains_key(dep_id) { - projects.insert(dep_id.to_owned(), project_graph.get(dep_id)?); - } - } + debug!("Filtering based on affected"); + + projects = projects + .into_iter() + .filter_map(|project| { + if affected.is_project_affected(&project.id) { + Some(project) + } else { + None + } + }) + .collect::>(); } - Ok(projects.into_values().collect::>()) + Ok(projects) } diff --git a/crates/cli/tests/query_test.rs b/crates/cli/tests/query_test.rs index 3157ea439ce..f80f95a61d3 100644 --- a/crates/cli/tests/query_test.rs +++ b/crates/cli/tests/query_test.rs @@ -659,7 +659,7 @@ mod projects { let json: QueryProjectsResult = json::parse(assert.output()).unwrap(); let ids: Vec = json.projects.iter().map(|p| p.id.to_string()).collect(); - assert_eq!(ids, string_vec!["advanced", "noConfig"]); + assert_eq!(ids, string_vec!["noConfig"]); assert!(json.options.affected.is_some()); } }