diff --git a/ceres/src/api_service/mono_api_service.rs b/ceres/src/api_service/mono_api_service.rs index a3fef9e19..291d6ec24 100644 --- a/ceres/src/api_service/mono_api_service.rs +++ b/ceres/src/api_service/mono_api_service.rs @@ -581,6 +581,7 @@ impl MonoApiService { pub async fn get_sorted_changed_file_list( &self, mr_link: &str, + path: Option<&str>, ) -> Result, MegaError> { let mr = self .storage @@ -600,6 +601,13 @@ impl MonoApiService { let file_paths: Vec = sorted_changed_files .iter() .map(|f| f.path().to_string_lossy().to_string()) + .filter(|file_path| { + if let Some(prefix) = path { + file_path.starts_with(prefix) + } else { + true + } + }) .collect(); Ok(file_paths) @@ -965,6 +973,53 @@ mod test { assert_eq!(old_blobs[0].0, PathBuf::from("deleted_file.txt")); } + #[test] + fn test_file_lists_with_roots() { + let all_files = vec![ + "src/main.rs".to_string(), + "src/utils/math.rs".to_string(), + "src/utils/io.rs".to_string(), + "README.md".to_string(), + ]; + + let root: Option<&str> = None; + let filtered_none: Vec = all_files + .iter() + .filter(|file_path| { + if let Some(prefix) = root { + file_path.starts_with(prefix) + } else { + true + } + }) + .cloned() + .collect(); + + assert_eq!(filtered_none.len(), 4); + assert_eq!(filtered_none, all_files); + + let filtered_some: Vec = all_files + .iter() + .filter(|file_path| { + if let Some(prefix) = Some("src/utils") { + file_path.starts_with(prefix) + } else { + true + } + }) + .cloned() + .collect(); + + assert_eq!(filtered_some.len(), 2); + assert_eq!( + filtered_some, + vec![ + "src/utils/math.rs".to_string(), + "src/utils/io.rs".to_string() + ] + ); + } + #[test] fn test_collect_page_blobs_modified_files() { let service = MonoApiService { diff --git a/ceres/src/merge_checker/gpg_signature_checker.rs b/ceres/src/merge_checker/gpg_signature_checker.rs index ff0c81b5b..5d6223a57 100644 --- a/ceres/src/merge_checker/gpg_signature_checker.rs +++ b/ceres/src/merge_checker/gpg_signature_checker.rs @@ -43,7 +43,7 @@ impl Checker for GpgSignatureChecker { } Err(e) => { - res.status = ConditionResult::PASSED; + res.status = ConditionResult::FAILED; res.message = format!("Error during GPG signature verification: {e}"); } }; diff --git a/mono/src/api/mr/model.rs b/mono/src/api/mr/model.rs index 902cc23bf..d3f663af0 100644 --- a/mono/src/api/mr/model.rs +++ b/mono/src/api/mr/model.rs @@ -29,3 +29,4 @@ pub struct ReviewerInfo { pub username: String, pub approved: bool, } + diff --git a/mono/src/api/mr/mr_router.rs b/mono/src/api/mr/mr_router.rs index 91ea9fce3..9e40108b9 100644 --- a/mono/src/api/mr/mr_router.rs +++ b/mono/src/api/mr/mr_router.rs @@ -1,10 +1,11 @@ use std::path::PathBuf; use axum::{ - extract::{Path, State}, + extract::{Path, Query, State}, Json, }; use callisto::sea_orm_active_enums::{ConvTypeEnum, MergeStatusEnum}; +use ceres::model::git::TreeQuery; use common::{ errors::MegaError, model::{CommonPage, CommonResult, PageParams}, @@ -13,8 +14,7 @@ use jupiter::service::mr_service::MRService; use utoipa_axum::{router::OpenApiRouter, routes}; use crate::api::mr::model::{ - ChangeReviewStatePayload, ChangeReviewerStatePayload, ReviewerInfo, ReviewerPayload, - ReviewersResponse, + ChangeReviewStatePayload, ChangeReviewerStatePayload, ReviewerInfo, ReviewerPayload, ReviewersResponse }; use crate::api::{ api_common::{ @@ -271,6 +271,7 @@ async fn mr_detail( get, params( ("link", description = "MR link"), + TreeQuery, ), path = "/{link}/mui-tree", responses( @@ -280,9 +281,12 @@ async fn mr_detail( )] async fn mr_mui_tree( Path(link): Path, + Query(query): Query, state: State, ) -> Result>>, ApiError> { - let files = state.monorepo().get_sorted_changed_file_list(&link).await?; + let path = query.path.clone(); + + let files = state.monorepo().get_sorted_changed_file_list(&link, Some(&path)).await?; let mui_trees = build_forest(files); Ok(Json(CommonResult::success(Some(mui_trees)))) }