Skip to content

Commit 52ce982

Browse files
committed
fix(task): preserve inherited extend task includes
1 parent 73a705b commit 52ce982

4 files changed

Lines changed: 48 additions & 71 deletions

File tree

e2e/tasks/test_task_includes_mode_extend

Lines changed: 39 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,5 @@
11
#!/usr/bin/env bash
22

3-
assert_output_contains() {
4-
local output="$1"
5-
local expected="$2"
6-
7-
if [[ $output == *"$expected"* ]]; then
8-
ok "'$expected' is in output"
9-
else
10-
fail "expected '$expected' to be in '$output'"
11-
fi
12-
}
13-
14-
assert_output_not_contains() {
15-
local output="$1"
16-
local expected="$2"
17-
18-
if [[ $output != *"$expected"* ]]; then
19-
ok "'$expected' is not in output"
20-
else
21-
fail "expected '$expected' not to be in '$output'"
22-
fi
23-
}
24-
253
cat <<'TOML' >mise.toml
264
[task_config]
275
includes = ["tasks.toml", "root-tasks"]
@@ -64,37 +42,50 @@ echo "local dir task"
6442
SCRIPT
6543
chmod +x local-tasks/local-dir-task
6644

67-
tasks="$(mise tasks ls)"
68-
assert_output_not_contains "$tasks" "default-task"
69-
assert_output_contains "$tasks" "root-file-task"
70-
assert_output_contains "$tasks" "root-dir-task"
71-
assert_output_contains "$tasks" "local-file-task"
72-
assert_output_contains "$tasks" "local-dir-task"
45+
mise tasks ls >tasks.out
46+
assert_not_contains "cat tasks.out" "default-task"
47+
assert_contains "cat tasks.out" "root-file-task"
48+
assert_contains "cat tasks.out" "root-dir-task"
49+
assert_contains "cat tasks.out" "local-file-task"
50+
assert_contains "cat tasks.out" "local-dir-task"
7351

7452
cat <<'TOML' >mise.local.toml
7553
[task_config]
7654
includes = ["tasks.local.toml", "local-tasks"]
7755
TOML
7856

79-
tasks="$(mise tasks ls)"
80-
assert_output_not_contains "$tasks" "default-task"
81-
assert_output_not_contains "$tasks" "root-file-task"
82-
assert_output_not_contains "$tasks" "root-dir-task"
83-
assert_output_contains "$tasks" "local-file-task"
84-
assert_output_contains "$tasks" "local-dir-task"
57+
mise tasks ls >tasks.out
58+
assert_not_contains "cat tasks.out" "default-task"
59+
assert_not_contains "cat tasks.out" "root-file-task"
60+
assert_not_contains "cat tasks.out" "root-dir-task"
61+
assert_contains "cat tasks.out" "local-file-task"
62+
assert_contains "cat tasks.out" "local-dir-task"
8563

8664
cat <<'TOML' >mise.toml
8765
[task_config]
8866
includes = ["tasks.toml", "root-tasks"]
8967
includes_mode = "extend"
9068
TOML
9169

92-
tasks="$(mise tasks ls)"
93-
assert_output_not_contains "$tasks" "default-task"
94-
assert_output_not_contains "$tasks" "root-file-task"
95-
assert_output_not_contains "$tasks" "root-dir-task"
96-
assert_output_contains "$tasks" "local-file-task"
97-
assert_output_contains "$tasks" "local-dir-task"
70+
mise tasks ls >tasks.out
71+
assert_not_contains "cat tasks.out" "default-task"
72+
assert_not_contains "cat tasks.out" "root-file-task"
73+
assert_not_contains "cat tasks.out" "root-dir-task"
74+
assert_contains "cat tasks.out" "local-file-task"
75+
assert_contains "cat tasks.out" "local-dir-task"
76+
77+
cat <<'TOML' >mise.local.toml
78+
[task_config]
79+
includes = ["tasks.local.toml", "local-tasks"]
80+
includes_mode = "extend"
81+
TOML
82+
83+
mise tasks ls >tasks.out
84+
assert_contains "cat tasks.out" "default-task"
85+
assert_contains "cat tasks.out" "root-file-task"
86+
assert_contains "cat tasks.out" "root-dir-task"
87+
assert_contains "cat tasks.out" "local-file-task"
88+
assert_contains "cat tasks.out" "local-dir-task"
9889

9990
cat <<'TOML' >mise.toml
10091
[env]
@@ -132,12 +123,11 @@ includes = ["tasks.local.toml", "local-tasks"]
132123
includes_mode = "extend"
133124
TOML
134125

135-
# FIXME: This should be ci + local when the MISE_ENV include precedence bug is fixed.
136-
tasks="$(MISE_ENV=prod,ci mise tasks ls)"
137-
assert_output_not_contains "$tasks" "default-task"
138-
assert_output_not_contains "$tasks" "root-file-task"
139-
assert_output_not_contains "$tasks" "root-dir-task"
140-
assert_output_contains "$tasks" "prod-dir-task"
141-
assert_output_not_contains "$tasks" "ci-dir-task"
142-
assert_output_contains "$tasks" "local-file-task"
143-
assert_output_contains "$tasks" "local-dir-task"
126+
MISE_ENV=prod,ci mise tasks ls >tasks.out
127+
assert_not_contains "cat tasks.out" "default-task"
128+
assert_not_contains "cat tasks.out" "root-file-task"
129+
assert_not_contains "cat tasks.out" "root-dir-task"
130+
assert_not_contains "cat tasks.out" "prod-dir-task"
131+
assert_contains "cat tasks.out" "ci-dir-task"
132+
assert_not_contains "cat tasks.out" "local-file-task"
133+
assert_not_contains "cat tasks.out" "local-dir-task"

schema/mise.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2154,6 +2154,11 @@
21542154
"type": "string"
21552155
},
21562156
"type": "array"
2157+
},
2158+
"includes_mode": {
2159+
"description": "controls whether task_config.includes replaces or extends inherited task includes",
2160+
"enum": ["replace", "extend"],
2161+
"type": "string"
21572162
}
21582163
}
21592164
},

src/config/config_file/mod.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -612,7 +612,6 @@ impl Hash for dyn ConfigFile {
612612
pub enum TaskIncludesMode {
613613
#[default]
614614
Replace,
615-
#[serde(alias = "additive")]
616615
Extend,
617616
}
618617

src/config/mod.rs

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2409,27 +2409,10 @@ fn selected_task_include_config<'a>(
24092409
configs: &[&'a Arc<dyn ConfigFile>],
24102410
exclude_paths: &[PathBuf],
24112411
) -> Option<&'a Arc<dyn ConfigFile>> {
2412-
configs
2413-
.iter()
2414-
.copied()
2415-
.find(|cf| {
2416-
cf.task_config().includes.is_some()
2417-
&& !exclude_paths.iter().any(|path| cf.get_path() == path)
2418-
&& is_plain_local_config(cf.get_path())
2419-
})
2420-
.or_else(|| {
2421-
configs.iter().copied().find(|cf| {
2422-
cf.task_config().includes.is_some()
2423-
&& !exclude_paths.iter().any(|path| cf.get_path() == path)
2424-
})
2425-
})
2426-
}
2427-
2428-
fn is_plain_local_config(path: &Path) -> bool {
2429-
matches!(
2430-
path.file_name().and_then(|name| name.to_str()),
2431-
Some("config.local.toml" | "mise.local.toml" | ".mise.local.toml" | ".rtx.local.toml")
2432-
)
2412+
configs.iter().copied().find(|cf| {
2413+
cf.task_config().includes.is_some()
2414+
&& !exclude_paths.iter().any(|path| cf.get_path() == path)
2415+
})
24332416
}
24342417

24352418
fn task_include_specs_for_config(cf: &Arc<dyn ConfigFile>) -> Vec<(PathBuf, String)> {

0 commit comments

Comments
 (0)