fix(core): handle filesets with commas (#20483)

This commit is contained in:
Jason Jean 2023-11-29 18:12:52 -05:00 committed by GitHub
parent 7261194da0
commit eb0f16e5e5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 20 additions and 11 deletions

View File

@ -387,7 +387,10 @@ fn find_external_dependency_node_name<'a>(
fn project_file_set_inputs(project_name: &str, file_sets: Vec<&str>) -> Vec<HashInstruction> { fn project_file_set_inputs(project_name: &str, file_sets: Vec<&str>) -> Vec<HashInstruction> {
vec![ vec![
HashInstruction::ProjectFileSet(project_name.to_string(), file_sets.join(",")), HashInstruction::ProjectFileSet(
project_name.to_string(),
file_sets.iter().map(|f| f.to_string()).collect(),
),
HashInstruction::ProjectConfiguration(project_name.to_string()), HashInstruction::ProjectConfiguration(project_name.to_string()),
HashInstruction::TsConfiguration(project_name.to_string()), HashInstruction::TsConfiguration(project_name.to_string()),
] ]

View File

@ -9,7 +9,7 @@ use crate::native::types::FileData;
pub fn hash_project_files( pub fn hash_project_files(
project_name: &str, project_name: &str,
project_root: &str, project_root: &str,
file_sets: &str, file_sets: &[String],
project_file_map: &HashMap<String, Vec<FileData>>, project_file_map: &HashMap<String, Vec<FileData>>,
) -> Result<String> { ) -> Result<String> {
let collected_files = collect_files(project_name, project_root, file_sets, project_file_map)?; let collected_files = collect_files(project_name, project_root, file_sets, project_file_map)?;
@ -24,11 +24,11 @@ pub fn hash_project_files(
fn collect_files<'a>( fn collect_files<'a>(
project_name: &str, project_name: &str,
project_root: &str, project_root: &str,
file_sets: &str, file_sets: &[String],
project_file_map: &'a HashMap<String, Vec<FileData>>, project_file_map: &'a HashMap<String, Vec<FileData>>,
) -> Result<Vec<&'a FileData>> { ) -> Result<Vec<&'a FileData>> {
let globs = file_sets let globs = file_sets
.split(',') .iter()
.map(|f| f.replace("{projectRoot}", project_root)) .map(|f| f.replace("{projectRoot}", project_root))
.collect::<Vec<_>>(); .collect::<Vec<_>>();
let now = std::time::Instant::now(); let now = std::time::Instant::now();
@ -59,7 +59,10 @@ mod tests {
fn test_collect_files() { fn test_collect_files() {
let proj_name = "test_project"; let proj_name = "test_project";
let proj_root = "test/root"; let proj_root = "test/root";
let file_sets = "!{projectRoot}/**/?(*.)+(spec|test).[jt]s?(x)?(.snap),{projectRoot}/**/*"; let file_sets = &[
"!{projectRoot}/**/?(*.)+(spec|test).[jt]s?(x)?(.snap)".to_string(),
"{projectRoot}/**/*".to_string(),
];
let mut file_map = HashMap::new(); let mut file_map = HashMap::new();
let tsfile_1 = FileData { let tsfile_1 = FileData {
file: "test/root/test1.ts".into(), file: "test/root/test1.ts".into(),
@ -94,7 +97,7 @@ mod tests {
let result = collect_files( let result = collect_files(
proj_name, proj_name,
proj_root, proj_root,
"!{projectRoot}/**/*.spec.ts", &["!{projectRoot}/**/*.spec.ts".into()],
&file_map, &file_map,
) )
.unwrap(); .unwrap();
@ -112,7 +115,10 @@ mod tests {
fn should_hash_deterministically() { fn should_hash_deterministically() {
let proj_name = "test_project"; let proj_name = "test_project";
let proj_root = "test/root"; let proj_root = "test/root";
let file_sets = "!{projectRoot}/**/?(*.)+(spec|test).[jt]s?(x)?(.snap),{projectRoot}/**/*"; let file_sets = &[
"!{projectRoot}/**/?(*.)+(spec|test).[jt]s?(x)?(.snap)".to_string(),
"{projectRoot}/**/*".to_string(),
];
let mut file_map = HashMap::new(); let mut file_map = HashMap::new();
let file_data1 = FileData { let file_data1 = FileData {
file: "test/root/test1.ts".into(), file: "test/root/test1.ts".into(),

View File

@ -190,7 +190,7 @@ impl TaskHasher {
trace!(parent: &span, "hash_env: {:?}", now.elapsed()); trace!(parent: &span, "hash_env: {:?}", now.elapsed());
hashed_env hashed_env
} }
HashInstruction::ProjectFileSet(project_name, file_set) => { HashInstruction::ProjectFileSet(project_name, file_sets) => {
let project = self let project = self
.project_graph .project_graph
.nodes .nodes
@ -199,7 +199,7 @@ impl TaskHasher {
let hashed_project_files = hash_project_files( let hashed_project_files = hash_project_files(
project_name, project_name,
&project.root, &project.root,
file_set, file_sets,
&self.project_file_map, &self.project_file_map,
)?; )?;
trace!(parent: &span, "hash_project_files: {:?}", now.elapsed()); trace!(parent: &span, "hash_project_files: {:?}", now.elapsed());

View File

@ -35,7 +35,7 @@ pub enum HashInstruction {
WorkspaceFileSet(String), WorkspaceFileSet(String),
Runtime(String), Runtime(String),
Environment(String), Environment(String),
ProjectFileSet(String, String), ProjectFileSet(String, Vec<String>),
ProjectConfiguration(String), ProjectConfiguration(String),
TsConfiguration(String), TsConfiguration(String),
TaskOutput(String, Vec<String>), TaskOutput(String, Vec<String>),
@ -71,7 +71,7 @@ impl fmt::Display for HashInstruction {
match self { match self {
HashInstruction::AllExternalDependencies => "AllExternalDependencies".to_string(), HashInstruction::AllExternalDependencies => "AllExternalDependencies".to_string(),
HashInstruction::ProjectFileSet(project_name, file_set) => { HashInstruction::ProjectFileSet(project_name, file_set) => {
format!("{project_name}:{file_set}") format!("{project_name}:{}", file_set.join(","))
} }
HashInstruction::WorkspaceFileSet(file_set) => file_set.to_string(), HashInstruction::WorkspaceFileSet(file_set) => file_set.to_string(),
HashInstruction::Runtime(runtime) => format!("runtime:{}", runtime), HashInstruction::Runtime(runtime) => format!("runtime:{}", runtime),