diff --git a/pkg/app/pipedv1/cmd/piped/grpcapi/tool_registry.go b/pkg/app/pipedv1/cmd/piped/grpcapi/tool_registry.go index f83bdbd65d..27d7669537 100644 --- a/pkg/app/pipedv1/cmd/piped/grpcapi/tool_registry.go +++ b/pkg/app/pipedv1/cmd/piped/grpcapi/tool_registry.go @@ -50,6 +50,11 @@ func newToolRegistry(toolsDir string) (*toolRegistry, error) { return nil, fmt.Errorf("failed to create the tools directory: %w", err) } + installedTools, err := loadPreinstalledTools(toolsDir) + if err != nil { + return nil, fmt.Errorf("failed to load installed tools: %w", err) + } + tmpDir, err := os.MkdirTemp("", "tool-registry") if err != nil { return nil, fmt.Errorf("failed to create a temporary directory: %w", err) @@ -57,10 +62,24 @@ func newToolRegistry(toolsDir string) (*toolRegistry, error) { return &toolRegistry{ toolsDir: toolsDir, tmpDir: tmpDir, - installedTools: make(map[string]struct{}), + installedTools: installedTools, }, nil } +func loadPreinstalledTools(toolsDir string) (map[string]struct{}, error) { + tools := make(map[string]struct{}) + entries, err := os.ReadDir(toolsDir) + if err != nil { + return nil, err + } + for _, entry := range entries { + if !entry.IsDir() { + tools[entry.Name()] = struct{}{} + } + } + return tools, nil +} + func (r *toolRegistry) newTmpDir() (string, error) { return os.MkdirTemp(r.tmpDir, "") } @@ -135,6 +154,10 @@ func (r *toolRegistry) installTool(ctx context.Context, name, version, script st return "", fmt.Errorf("failed to move the installed binary: %w, output: %s", err, string(out)) } + if err := os.RemoveAll(filepath.Dir(outPath)); err != nil { + return "", err + } + if err := os.RemoveAll(tmpDir); err != nil { return "", err } diff --git a/pkg/app/pipedv1/cmd/piped/grpcapi/tool_registry_test.go b/pkg/app/pipedv1/cmd/piped/grpcapi/tool_registry_test.go index e805d30e5e..11124f62a1 100644 --- a/pkg/app/pipedv1/cmd/piped/grpcapi/tool_registry_test.go +++ b/pkg/app/pipedv1/cmd/piped/grpcapi/tool_registry_test.go @@ -81,6 +81,27 @@ func TestToolRegistry_InstallTool(t *testing.T) { } } +func TestToolRegistry_LoadPreinstalledTools(t *testing.T) { + t.Parallel() + + ctx := context.Background() + + toolsDir, err := os.MkdirTemp(t.TempDir(), "tools") + require.NoError(t, err) + + toolName := "tool-a" + toolVersion := "1.0.0" + toolPath := toolsDir + "/" + toolName + "-" + toolVersion + require.NoError(t, os.WriteFile(toolPath, []byte("binary"), 0o755)) + + registry, err := newToolRegistry(toolsDir) + require.NoError(t, err) + + out, err := registry.InstallTool(ctx, toolName, toolVersion, "exit 1") + require.NoError(t, err) + assert.Equal(t, toolPath, out) +} + func TestToolRegistry_InstallTool_CacheHit(t *testing.T) { t.Parallel()