Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 49 additions & 0 deletions crates/turborepo-engine/src/task_definition.rs
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,7 @@ pub fn prepend_global_inputs(
.collect();
global_globs.append(&mut inputs.globs);
inputs.globs = global_globs;
inputs.eager = true;
}

#[cfg(test)]
Expand Down Expand Up @@ -213,6 +214,54 @@ mod tests {
);
}

#[test]
fn test_prepend_global_inputs_marks_jit_only_task_eager() {
let path_to_root = RelativeUnixPathBuf::new("../..").expect("valid path");
let mut inputs = TaskInputs {
globs: vec![],
default: false,
jit_globs: vec!["src/**".to_string()],
jit_default: false,
eager: false,
..Default::default()
};

prepend_global_inputs(
&mut inputs,
true,
&["config.txt".to_string()],
&path_to_root,
);

assert_eq!(inputs.globs, vec!["../../config.txt"]);
assert!(
inputs.eager,
"task is no longer jit only once global inputs are prepended, so the eager pass has \
to run or those globs never get hashed"
);
}

#[test]
fn test_prepend_global_inputs_leaves_jit_only_task_alone_without_global_inputs() {
let path_to_root = RelativeUnixPathBuf::new("../..").expect("valid path");
let mut inputs = TaskInputs {
globs: vec![],
default: false,
jit_globs: vec!["src/**".to_string()],
jit_default: false,
eager: false,
..Default::default()
};

prepend_global_inputs(&mut inputs, true, &[], &path_to_root);

assert!(inputs.globs.is_empty());
assert!(
!inputs.eager,
"a task that is still jit only should not start hashing eagerly"
);
}

#[test]
fn test_prepend_global_inputs_sets_default_when_no_explicit_inputs() {
let path_to_root = RelativeUnixPathBuf::new("../..").expect("valid path");
Expand Down
57 changes: 57 additions & 0 deletions crates/turborepo/tests/global_inputs_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,20 @@ const TURBO_JSON_GLOBAL_INPUTS: &str = r#"{
}
"#;

const TURBO_JSON_GLOBAL_INPUTS_JIT: &str = r#"{
"futureFlags": { "globalConfiguration": true },
"global": {
"inputs": ["config.txt"]
},
"tasks": {
"build": {
"inputs": [{ "mode": "jit", "globs": ["src/**"] }],
"outputs": []
}
}
}
"#;

const TURBO_JSON_GLOBAL_INPUTS_TOPO: &str = r#"{
"futureFlags": { "globalConfiguration": true },
"global": {
Expand Down Expand Up @@ -282,3 +296,46 @@ fn test_global_inputs_exclusion_not_defeated_by_phantom_dependency_tasks() {
"expected app-b cache hit (phantom dep should not defeat negation), got: {combined}"
);
}

/// A task whose only `inputs` are JIT still has `global.inputs` prepended to
/// its eager globs, so a change to a global input file must invalidate it.
#[test]
fn test_global_inputs_invalidate_jit_only_task() {
let tempdir = tempfile::tempdir().unwrap();
setup_fixture(tempdir.path(), TURBO_JSON_GLOBAL_INPUTS_JIT);

let output = run_turbo(
tempdir.path(),
&["build", "-F", "app-a", "--output-logs=hash-only"],
);
assert!(output.status.success());
let combined = combined_output(&output);
assert!(
combined.contains("cache miss"),
"expected cache miss on first run, got: {combined}"
);

let output = run_turbo(
tempdir.path(),
&["build", "-F", "app-a", "--output-logs=hash-only"],
);
assert!(output.status.success());
let combined = combined_output(&output);
assert!(
combined.contains("cache hit"),
"expected cache hit on second run, got: {combined}"
);

fs::write(tempdir.path().join("config.txt"), "changed value").unwrap();

let output = run_turbo(
tempdir.path(),
&["build", "-F", "app-a", "--output-logs=hash-only"],
);
assert!(output.status.success());
let combined = combined_output(&output);
assert!(
combined.contains("cache miss"),
"expected cache miss after changing a global input, got: {combined}"
);
}
Loading