@@ -13,6 +13,7 @@ import (
1313 "github.com/AkihiroSuda/gomodjail/cmd/gomodjail/commands/pack"
1414 "github.com/AkihiroSuda/gomodjail/cmd/gomodjail/commands/run"
1515 "github.com/AkihiroSuda/gomodjail/cmd/gomodjail/version"
16+ "github.com/AkihiroSuda/gomodjail/pkg/cache"
1617 "github.com/AkihiroSuda/gomodjail/pkg/env"
1718 "github.com/AkihiroSuda/gomodjail/pkg/envutil"
1819 "github.com/AkihiroSuda/gomodjail/pkg/osargs"
@@ -24,19 +25,12 @@ import (
2425var logLevel = new (slog.LevelVar )
2526
2627func 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 {
3429 os .Exit (exitCode )
3530 }
3631}
3732
38- func xmain () (int , func () error ) {
39- var closer func () error
33+ func xmain () int {
4034 logHandler := slog .NewTextHandler (os .Stderr , & slog.HandlerOptions {Level : logLevel })
4135 slog .SetDefault (slog .New (logHandler ))
4236 rootCmd := newRootCommand ()
@@ -46,14 +40,13 @@ func xmain() (int, func() error) {
4640 slog .Error ("error while detecting self-extract archive" , "error" , err )
4741 }
4842 if zr != nil {
49- var err error
50- err , closer = configureSelfExtractMode (rootCmd , zr )
43+ err := configureSelfExtractMode (rootCmd , zr )
5144 if cErr := zr .Close (); cErr != nil {
5245 slog .Error ("failed to call closer" , "error" , cErr )
5346 }
5447 if err != nil {
5548 slog .Error ("exiting with an error while setting up self-extract mode" , "error" , err )
56- return 1 , closer
49+ return 1
5750 }
5851 }
5952 }
@@ -72,9 +65,9 @@ func xmain() (int, func() error) {
7265 } else {
7366 slog .Debug ("exiting" )
7467 }
75- return exitCode , closer
68+ return exitCode
7669 }
77- return 0 , closer
70+ return 0
7871}
7972
8073func newRootCommand () * cobra.Command {
@@ -108,58 +101,54 @@ func newRootCommand() *cobra.Command {
108101 return cmd
109102}
110103
111- //nolint:staticcheck // ST1008: error should be returned as the last argument
112- func configureSelfExtractMode (rootCmd * cobra.Command , zr * zip.ReadCloser ) (error , func () error ) {
104+ func configureSelfExtractMode (rootCmd * cobra.Command , zr * zip.ReadCloser ) error {
113105 slog .Debug ("Running in self-extract mode" )
114106
115- td , err := os .MkdirTemp ("" , "gomodjail-*" )
107+ // td must be kept on exit
108+ // https://github.com/containerd/nerdctl/pull/4012#issuecomment-2840539282
109+ td , err := cache .ExecutableDir ()
116110 if err != nil {
117- return err , nil
111+ return err
118112 }
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-
113+ slog .Debug ("unpacking self-extract archive" , "dir" , td )
125114 fis , err := ziputil .Unzip (td , zr )
126115 if err != nil {
127- return fmt .Errorf ("failed to unzip to %q: %w" , td , err ), closer
116+ return fmt .Errorf ("failed to unzip to %q: %w" , td , err )
128117 }
129118 var libgomodjailHookFI , progFI , goModFI fs.FileInfo
130119 switch runtime .GOOS {
131120 case "darwin" :
132121 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
122+ return fmt .Errorf ("expected an archive to contain 3 files (libgomodjail_hook_darwin.dylib, program and go.mod), got %d files" , len (fis ))
134123 }
135124 libgomodjailHookFI , progFI , goModFI = fis [0 ], fis [1 ], fis [2 ]
136125 default :
137126 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
127+ return fmt .Errorf ("expected an archive to contain 2 files (program and go.mod), got %d files" , len (fis ))
139128 }
140129 progFI , goModFI = fis [0 ], fis [1 ]
141130 }
142131 if filepath .Base (progFI .Name ()) != progFI .Name () {
143- return fmt .Errorf ("unexpected file name: %q" , progFI .Name ()), closer
132+ return fmt .Errorf ("unexpected file name: %q" , progFI .Name ())
144133 }
145134 if goModFI .Name () != "go.mod" {
146- return fmt .Errorf ("expected \" go.mod\" , got %q" , goModFI .Name ()), closer
135+ return fmt .Errorf ("expected \" go.mod\" , got %q" , goModFI .Name ())
147136 }
148137 prog := filepath .Join (td , progFI .Name ())
149138 goMod := filepath .Join (td , goModFI .Name ())
150139 switch runtime .GOOS {
151140 case "darwin" :
152141 if libgomodjailHookFI .Name () != "libgomodjail_hook_darwin.dylib" {
153- return fmt .Errorf ("expected \" libgomodjail_hook_darwin.dylib\" , got %q" , libgomodjailHookFI .Name ()), closer
142+ return fmt .Errorf ("expected \" libgomodjail_hook_darwin.dylib\" , got %q" , libgomodjailHookFI .Name ())
154143 }
155144 libgomodjailHook := filepath .Join (td , libgomodjailHookFI .Name ())
156145 if err = os .Setenv ("LIBGOMODJAIL_HOOK" , libgomodjailHook ); err != nil {
157- return err , closer
146+ return err
158147 }
159148 }
160149 args := append ([]string {os .Args [0 ], "run" , "--go-mod=" + goMod , prog , "--" }, os .Args [1 :]... )
161150 slog .Debug ("Reconfiguring the top-level command" , "args" , args )
162151 rootCmd .SetArgs (args [1 :])
163152 osargs .SetOSArgs (args )
164- return nil , closer
153+ return nil
165154}
0 commit comments