Files

94 lines
2.8 KiB
Go

// Copyright (C) 2025, Lux Industries Inc. All rights reserved.
// See the file LICENSE for licensing terms.
package warp
import (
"fmt"
"io"
"os"
"os/exec"
"strings"
"github.com/luxfi/cli/v2/pkg/utils"
"github.com/luxfi/cli/v2/pkg/ux"
)
var (
foundryVersion = "v0.2.1"
foundryupPath = utils.ExpandHome("~/.foundry/bin/foundryup")
defaultForgePath = utils.ExpandHome("~/.foundry/bin/forge")
)
func FoundryIsInstalled() bool {
_, err := GetForgePath()
return err == nil
}
func GetForgePath() (string, error) {
if utils.FileExists(defaultForgePath) {
return defaultForgePath, nil
}
out, err := exec.Command("which", "forge").CombinedOutput()
if err == nil {
return string(out), nil
}
return "", fmt.Errorf("forge is not installed")
}
func InstallFoundry() error {
ux.Logger.PrintToUser("Installing Foundry")
downloadCmd := exec.Command(
"curl",
"-L",
fmt.Sprintf("https://raw.githubusercontent.com/luxfi/foundry/%s/foundryup/install", foundryVersion),
)
cmdsEnv := append(os.Environ(), "XDG_CONFIG_HOME=")
installCmd := exec.Command("bash")
installCmd.Env = cmdsEnv
var downloadOutbuf, downloadErrbuf strings.Builder
downloadCmdStdoutPipe, err := downloadCmd.StdoutPipe()
if err != nil {
return err
}
downloadCmd.Stderr = &downloadErrbuf
installCmd.Stdin = io.TeeReader(downloadCmdStdoutPipe, &downloadOutbuf)
var installOutbuf, installErrbuf strings.Builder
installCmd.Stdout = &installOutbuf
installCmd.Stderr = &installErrbuf
if err := installCmd.Start(); err != nil {
return err
}
if err := downloadCmd.Run(); err != nil {
if downloadOutbuf.String() != "" {
ux.Logger.PrintToUser(strings.TrimSuffix(downloadOutbuf.String(), "\n"))
}
if downloadErrbuf.String() != "" {
ux.Logger.PrintToUser(strings.TrimSuffix(downloadErrbuf.String(), "\n"))
}
return err
}
if err := installCmd.Wait(); err != nil {
if installOutbuf.String() != "" {
ux.Logger.PrintToUser(strings.TrimSuffix(installOutbuf.String(), "\n"))
}
if installErrbuf.String() != "" {
ux.Logger.PrintToUser(strings.TrimSuffix(installErrbuf.String(), "\n"))
}
ux.Logger.PrintToUser("installation failed: %s", err.Error())
return err
}
ux.Logger.PrintToUser(strings.TrimSuffix(installOutbuf.String(), "\n"))
foundryupCmd := exec.Command(foundryupPath, "-v", foundryVersion)
foundryupCmd.Env = cmdsEnv
out, err := foundryupCmd.CombinedOutput()
ux.Logger.PrintToUser(string(out))
if err != nil {
ux.Logger.PrintToUser("")
ux.Logger.PrintToUser("Foundry toolset is not available and couldn't automatically be installed. It is a necessary dependency for CLI to compile smart contracts.")
ux.Logger.PrintToUser("")
ux.Logger.PrintToUser("Please follow install instructions at https://book.getfoundry.sh/getting-started/installation and try again")
ux.Logger.PrintToUser("")
}
return err
}