Skip to content

Commit 27748e0

Browse files
committed
Namespace aliases like task names to avoid collisions
1 parent 8771d1e commit 27748e0

2 files changed

Lines changed: 51 additions & 1 deletion

File tree

taskfile/includes.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,16 @@ func makeTaskDirAbsolute(task *Task, fileDir string) {
439439
}
440440

441441
func namespaceLocalReferences(task *Task, included *includedConfig) {
442+
// Aliases are namespaced like the task name so two included files can
443+
// each declare the same bare alias (e.g. `up`) without colliding in the
444+
// runner's global alias map.
445+
if len(task.Aliases) > 0 {
446+
aliases := make(StringList, len(task.Aliases))
447+
for i, alias := range task.Aliases {
448+
aliases[i] = included.Namespace + ":" + alias
449+
}
450+
task.Aliases = aliases
451+
}
442452
for i, dep := range task.Deps {
443453
if hasTask(included.Tasks, dep.Task) {
444454
task.Deps[i].Task = included.Namespace + ":" + dep.Task

taskfile/parse_test.go

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,50 @@ tasks:
6262

6363
task, ok = tf.Tasks["cli:github"]
6464
require.True(t, ok)
65-
assert.Equal(t, StringList{"gh"}, task.Aliases)
65+
// Aliases are namespaced like the task name so two included files can
66+
// reuse the same bare alias without colliding.
67+
assert.Equal(t, StringList{"cli:gh"}, task.Aliases)
6668
assert.Equal(t, "GitHub helper", task.Desc)
6769
}
6870

71+
func TestLoadWithIncludesNamespacesAliases(t *testing.T) {
72+
// Two sibling includes can reuse the same bare alias: each alias is
73+
// namespaced like its task, so `up` becomes `proxy:up` / `stats:up`
74+
// instead of colliding in the runner's global alias map.
75+
dir := t.TempDir()
76+
writeFiles(t, dir, map[string]string{
77+
"gogo.yaml": `version: "1"
78+
includes:
79+
- proxy
80+
- stats
81+
`,
82+
"proxy/gogo.yaml": `version: "1"
83+
tasks:
84+
serve:
85+
aliases: up
86+
cmd: serve proxy
87+
`,
88+
"stats/gogo.yaml": `version: "1"
89+
tasks:
90+
serve:
91+
aliases: up
92+
cmd: serve stats
93+
`,
94+
})
95+
96+
tf, err := LoadWithIncludes(dir)
97+
require.NoError(t, err)
98+
99+
assert.Equal(t, StringList{"proxy:up"}, tf.Tasks["proxy:serve"].Aliases)
100+
assert.Equal(t, StringList{"stats:up"}, tf.Tasks["stats:serve"].Aliases)
101+
102+
// The collision that used to fail NewRunner is gone.
103+
runner, err := NewRunner(tf, dir)
104+
require.NoError(t, err)
105+
assert.Equal(t, "proxy:serve", runner.aliases["proxy:up"])
106+
assert.Equal(t, "stats:serve", runner.aliases["stats:up"])
107+
}
108+
69109
func TestLoadWithIncludesNested(t *testing.T) {
70110
dir := t.TempDir()
71111
writeFiles(t, dir, map[string]string{

0 commit comments

Comments
 (0)