Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions pkg/controller/exec/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"io"
"log/slog"
"os"
"os/exec"
"runtime"
"time"

Expand All @@ -28,6 +29,7 @@ type Controller struct {
policyReader PolicyReader
enabledXSysExec bool
vacuum Vacuum
lookPath func(exeName string) (string, error)
}

type Vacuum interface {
Expand All @@ -50,6 +52,7 @@ func New(pkgInstaller Installer, whichCtrl WhichController, executor Executor, o
fs: fs,
policyReader: policyReader,
vacuum: vacuum,
lookPath: exec.LookPath,
}
}

Expand Down
22 changes: 21 additions & 1 deletion pkg/controller/exec/exec.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"errors"
"fmt"
"log/slog"
"strings"
"time"

"github.com/aquaproj/aqua/v2/pkg/checksum"
Expand Down Expand Up @@ -69,8 +70,27 @@ func (c *Controller) Exec(ctx context.Context, logger *slog.Logger, param *confi
if err := c.updateTimestamp(findResult.Package); err != nil {
slogerr.WithError(logger, err).Warn("update the last used datetime")
}
exeName, exePath, args, err := c.wrapExec(exeName, findResult.ExePath, args...)
if err != nil {
return err
}

return c.execCommandWithRetry(ctx, logger, exePath, exeName, args...)
}

return c.execCommandWithRetry(ctx, logger, findResult.ExePath, exeName, args...)
func (c *Controller) wrapExec(exeName, exePath string, args ...string) (string, string, []string, error) {
return wrapExec(c.lookPath, exeName, exePath, args...)
}

func wrapExec(lookPath func(exeName string) (string, error), exeName, exePath string, args ...string) (string, string, []string, error) {
if !strings.HasSuffix(exePath, ".jar") {
return exeName, exePath, args, nil
}
p, err := lookPath("java")
if err != nil {
return "", "", nil, fmt.Errorf("look up java to execute jar: %w", err)
}
return "java", p, append([]string{"-jar", exePath}, args...), nil
}

func (c *Controller) updateTimestamp(pkg *config.Package) error {
Expand Down
74 changes: 74 additions & 0 deletions pkg/controller/exec/exec_internal_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package exec
import (
"log/slog"
"os"
"slices"
"testing"

"github.com/aquaproj/aqua/v2/pkg/osexec"
Expand Down Expand Up @@ -43,3 +44,76 @@ func TestController_execCommand(t *testing.T) {
})
}
}

func Test_wrapExec(t *testing.T) { //nolint:funlen
t.Parallel()
data := []struct {
title string
lookPath func(exeName string) (string, error)
exeName string
exePath string
args []string
expExeName string
expExePath string
expArgs []string
isErr bool
}{
{
title: "non jar",
exeName: "foo",
exePath: "/usr/bin/foo",
args: []string{"--help"},
expExeName: "foo",
expExePath: "/usr/bin/foo",
expArgs: []string{"--help"},
},
{
title: "jar",
lookPath: func(string) (string, error) {
return "/usr/bin/java", nil
},
exeName: "app",
exePath: "/path/to/app.jar",
args: []string{"arg1"},
expExeName: "java",
expExePath: "/usr/bin/java",
expArgs: []string{"-jar", "/path/to/app.jar", "arg1"},
},
{
title: "jar without args",
lookPath: func(string) (string, error) {
return "/usr/bin/java", nil
},
exeName: "app",
exePath: "/path/to/app.jar",
args: []string{},
expExeName: "java",
expExePath: "/usr/bin/java",
expArgs: []string{"-jar", "/path/to/app.jar"},
},
}
for _, d := range data {
t.Run(d.title, func(t *testing.T) {
t.Parallel()
exeName, exePath, args, err := wrapExec(d.lookPath, d.exeName, d.exePath, d.args...)
if err != nil {
if !d.isErr {
t.Fatalf("unexpected error: %v", err)
}
return
}
if d.isErr {
t.Fatalf("expected error, but got none")
}
if exeName != d.expExeName {
t.Fatalf("exeName = %s, want %s", exeName, d.expExeName)
}
if exePath != d.expExePath {
t.Fatalf("exePath = %s, want %s", exePath, d.expExePath)
}
if !slices.Equal(args, d.expArgs) {
t.Fatalf("args = %v, want %v", args, d.expArgs)
}
})
}
}
Loading