@@ -13,6 +13,7 @@ import (
13
13
"github.com/AkihiroSuda/gomodjail/cmd/gomodjail/commands/pack"
14
14
"github.com/AkihiroSuda/gomodjail/cmd/gomodjail/commands/run"
15
15
"github.com/AkihiroSuda/gomodjail/cmd/gomodjail/version"
16
+ "github.com/AkihiroSuda/gomodjail/pkg/cache"
16
17
"github.com/AkihiroSuda/gomodjail/pkg/env"
17
18
"github.com/AkihiroSuda/gomodjail/pkg/envutil"
18
19
"github.com/AkihiroSuda/gomodjail/pkg/osargs"
@@ -24,19 +25,12 @@ import (
24
25
var logLevel = new (slog.LevelVar )
25
26
26
27
func main () {
27
- exitCode , closer := xmain ()
28
- if closer != nil {
29
- if cErr := closer (); cErr != nil {
30
- slog .Error ("failed to call closer" , "error" , cErr )
31
- }
32
- }
33
- if exitCode != 0 {
28
+ if exitCode := xmain (); exitCode != 0 {
34
29
os .Exit (exitCode )
35
30
}
36
31
}
37
32
38
- func xmain () (int , func () error ) {
39
- var closer func () error
33
+ func xmain () int {
40
34
logHandler := slog .NewTextHandler (os .Stderr , & slog.HandlerOptions {Level : logLevel })
41
35
slog .SetDefault (slog .New (logHandler ))
42
36
rootCmd := newRootCommand ()
@@ -47,13 +41,13 @@ func xmain() (int, func() error) {
47
41
}
48
42
if zr != nil {
49
43
var err error
50
- err , closer = configureSelfExtractMode (rootCmd , zr )
44
+ err = configureSelfExtractMode (rootCmd , zr )
51
45
if cErr := zr .Close (); cErr != nil {
52
46
slog .Error ("failed to call closer" , "error" , cErr )
53
47
}
54
48
if err != nil {
55
49
slog .Error ("exiting with an error while setting up self-extract mode" , "error" , err )
56
- return 1 , closer
50
+ return 1
57
51
}
58
52
}
59
53
}
@@ -72,9 +66,9 @@ func xmain() (int, func() error) {
72
66
} else {
73
67
slog .Debug ("exiting" )
74
68
}
75
- return exitCode , closer
69
+ return exitCode
76
70
}
77
- return 0 , closer
71
+ return 0
78
72
}
79
73
80
74
func newRootCommand () * cobra.Command {
@@ -108,58 +102,54 @@ func newRootCommand() *cobra.Command {
108
102
return cmd
109
103
}
110
104
111
- //nolint:staticcheck // ST1008: error should be returned as the last argument
112
- func configureSelfExtractMode (rootCmd * cobra.Command , zr * zip.ReadCloser ) (error , func () error ) {
105
+ func configureSelfExtractMode (rootCmd * cobra.Command , zr * zip.ReadCloser ) error {
113
106
slog .Debug ("Running in self-extract mode" )
114
107
115
- td , err := os .MkdirTemp ("" , "gomodjail-*" )
108
+ // td must be kept on exit
109
+ // https://github.com/containerd/nerdctl/pull/4012#issuecomment-2840539282
110
+ td , err := cache .ExecutableDir ()
116
111
if err != nil {
117
- return err , nil
112
+ return err
118
113
}
119
- slog .Debug ("created self-extract dir" , "path" , td )
120
- closer := func () error {
121
- slog .Debug ("removing self-extract dir" , "path" , td )
122
- return os .RemoveAll (td )
123
- }
124
-
114
+ slog .Debug ("unpacking self-extract archive" , "dir" , td )
125
115
fis , err := ziputil .Unzip (td , zr )
126
116
if err != nil {
127
- return fmt .Errorf ("failed to unzip to %q: %w" , td , err ), closer
117
+ return fmt .Errorf ("failed to unzip to %q: %w" , td , err )
128
118
}
129
119
var libgomodjailHookFI , progFI , goModFI fs.FileInfo
130
120
switch runtime .GOOS {
131
121
case "darwin" :
132
122
if len (fis ) != 3 {
133
- return fmt .Errorf ("expected an archive to contain 3 files (libgomodjail_hook_darwin.dylib, program and go.mod), got %d files" , len (fis )), closer
123
+ return fmt .Errorf ("expected an archive to contain 3 files (libgomodjail_hook_darwin.dylib, program and go.mod), got %d files" , len (fis ))
134
124
}
135
125
libgomodjailHookFI , progFI , goModFI = fis [0 ], fis [1 ], fis [2 ]
136
126
default :
137
127
if len (fis ) != 2 {
138
- return fmt .Errorf ("expected an archive to contain 2 files (program and go.mod), got %d files" , len (fis )), closer
128
+ return fmt .Errorf ("expected an archive to contain 2 files (program and go.mod), got %d files" , len (fis ))
139
129
}
140
130
progFI , goModFI = fis [0 ], fis [1 ]
141
131
}
142
132
if filepath .Base (progFI .Name ()) != progFI .Name () {
143
- return fmt .Errorf ("unexpected file name: %q" , progFI .Name ()), closer
133
+ return fmt .Errorf ("unexpected file name: %q" , progFI .Name ())
144
134
}
145
135
if goModFI .Name () != "go.mod" {
146
- return fmt .Errorf ("expected \" go.mod\" , got %q" , goModFI .Name ()), closer
136
+ return fmt .Errorf ("expected \" go.mod\" , got %q" , goModFI .Name ())
147
137
}
148
138
prog := filepath .Join (td , progFI .Name ())
149
139
goMod := filepath .Join (td , goModFI .Name ())
150
140
switch runtime .GOOS {
151
141
case "darwin" :
152
142
if libgomodjailHookFI .Name () != "libgomodjail_hook_darwin.dylib" {
153
- return fmt .Errorf ("expected \" libgomodjail_hook_darwin.dylib\" , got %q" , libgomodjailHookFI .Name ()), closer
143
+ return fmt .Errorf ("expected \" libgomodjail_hook_darwin.dylib\" , got %q" , libgomodjailHookFI .Name ())
154
144
}
155
145
libgomodjailHook := filepath .Join (td , libgomodjailHookFI .Name ())
156
146
if err = os .Setenv ("LIBGOMODJAIL_HOOK" , libgomodjailHook ); err != nil {
157
- return err , closer
147
+ return err
158
148
}
159
149
}
160
150
args := append ([]string {os .Args [0 ], "run" , "--go-mod=" + goMod , prog , "--" }, os .Args [1 :]... )
161
151
slog .Debug ("Reconfiguring the top-level command" , "args" , args )
162
152
rootCmd .SetArgs (args [1 :])
163
153
osargs .SetOSArgs (args )
164
- return nil , closer
154
+ return nil
165
155
}
0 commit comments