@@ -9,12 +9,18 @@ import (
9
9
"os"
10
10
"os/exec"
11
11
"path"
12
+ "sort"
12
13
13
14
"github.com/eleven-sh/agent/config"
14
15
"github.com/eleven-sh/agent/internal/env"
15
16
"github.com/eleven-sh/agent/proto"
16
17
)
17
18
19
+ type runtime struct {
20
+ name string
21
+ version string
22
+ }
23
+
18
24
//go:embed runtimes/*
19
25
var runtimeScripts embed.FS
20
26
@@ -23,12 +29,14 @@ func (*agentServer) InstallRuntimes(
23
29
stream proto.Agent_InstallRuntimesServer ,
24
30
) error {
25
31
26
- for runtime , runtimeVersion := range req .Runtimes {
32
+ sortedRuntimes := sortRuntimes (req .Runtimes )
33
+
34
+ for _ , runtime := range sortedRuntimes {
27
35
err := stream .Send (& proto.InstallRuntimesReply {
28
36
LogLineHeader : fmt .Sprintf (
29
37
"Installing %s@%s" ,
30
- runtime ,
31
- runtimeVersion ,
38
+ runtime . name ,
39
+ runtime . version ,
32
40
),
33
41
})
34
42
@@ -37,7 +45,7 @@ func (*agentServer) InstallRuntimes(
37
45
}
38
46
39
47
installRuntimeScriptFilePath , err := createInstallRuntimeScriptFile (
40
- runtime ,
48
+ runtime . name ,
41
49
)
42
50
43
51
if err != nil {
@@ -48,7 +56,7 @@ func (*agentServer) InstallRuntimes(
48
56
49
57
installRuntimeCmd := buildInstallRuntimeCmd (
50
58
installRuntimeScriptFilePath ,
51
- runtimeVersion ,
59
+ runtime . version ,
52
60
)
53
61
54
62
stdoutReader , err := buildInstallRuntimeCmdStdoutReader (installRuntimeCmd )
@@ -102,8 +110,8 @@ func (*agentServer) InstallRuntimes(
102
110
if err := installRuntimeCmd .Wait (); err != nil {
103
111
return fmt .Errorf (
104
112
"error installing %s@%s (%v)" ,
105
- runtime ,
106
- runtimeVersion ,
113
+ runtime . name ,
114
+ runtime . version ,
107
115
err ,
108
116
)
109
117
}
@@ -125,6 +133,41 @@ func (*agentServer) InstallRuntimes(
125
133
)
126
134
}
127
135
136
+ func sortRuntimes (runtimes map [string ]string ) []runtime {
137
+ runtimeNames := []string {}
138
+ for runtimeName := range runtimes {
139
+ runtimeNames = append (runtimeNames , runtimeName )
140
+ }
141
+ sort .Strings (runtimeNames )
142
+
143
+ sortedRuntimes := []runtime {}
144
+ var rubyRuntime * runtime
145
+
146
+ for _ , runtimeName := range runtimeNames {
147
+ runtimeVersion := runtimes [runtimeName ]
148
+
149
+ if runtimeName == "ruby" {
150
+ rubyRuntime = & runtime {
151
+ name : runtimeName ,
152
+ version : runtimeVersion ,
153
+ }
154
+ continue
155
+ }
156
+
157
+ sortedRuntimes = append (sortedRuntimes , runtime {
158
+ name : runtimeName ,
159
+ version : runtimeVersion ,
160
+ })
161
+ }
162
+
163
+ // RVM needs to be the last change to the $PATH env var
164
+ if rubyRuntime != nil {
165
+ sortedRuntimes = append (sortedRuntimes , * rubyRuntime )
166
+ }
167
+
168
+ return sortedRuntimes
169
+ }
170
+
128
171
func createInstallRuntimeScriptFile (runtime string ) (string , error ) {
129
172
installRuntimeScriptFile , err := os .CreateTemp ("" , "eleven_install_runtime_*" )
130
173
0 commit comments