@@ -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+
69109func TestLoadWithIncludesNested (t * testing.T ) {
70110 dir := t .TempDir ()
71111 writeFiles (t , dir , map [string ]string {
0 commit comments