heroagent/pkg/sal/packagemanager/packagemanager.go
2025-04-23 04:18:28 +02:00

126 lines
2.9 KiB
Go

package packagemanager
import (
"fmt"
"os/exec"
"runtime"
"strings"
)
// PackageManager handles package installation across different platforms
type PackageManager struct {
platform string
}
// NewPackageManager creates a new package manager instance
func NewPackageManager() *PackageManager {
return &PackageManager{
platform: runtime.GOOS,
}
}
// InstallPackage installs a package using the appropriate package manager
func (pm *PackageManager) InstallPackage(packageName string) (string, error) {
var cmd *exec.Cmd
switch pm.platform {
case "darwin":
// macOS - use Homebrew
cmd = exec.Command("brew", "install", packageName)
case "linux":
// Linux - use apt
cmd = exec.Command("apt", "install", "-y", packageName)
case "windows":
// Windows - use scoop
cmd = exec.Command("scoop", "install", packageName)
default:
return "", fmt.Errorf("unsupported platform: %s", pm.platform)
}
output, err := cmd.CombinedOutput()
return string(output), err
}
// UninstallPackage removes a package
func (pm *PackageManager) UninstallPackage(packageName string) (string, error) {
var cmd *exec.Cmd
switch pm.platform {
case "darwin":
cmd = exec.Command("brew", "uninstall", packageName)
case "linux":
cmd = exec.Command("apt", "remove", "-y", packageName)
case "windows":
cmd = exec.Command("scoop", "uninstall", packageName)
default:
return "", fmt.Errorf("unsupported platform: %s", pm.platform)
}
output, err := cmd.CombinedOutput()
return string(output), err
}
// ListInstalledPackages returns a list of installed packages
func (pm *PackageManager) ListInstalledPackages() ([]string, error) {
var cmd *exec.Cmd
switch pm.platform {
case "darwin":
cmd = exec.Command("brew", "list")
case "linux":
cmd = exec.Command("apt", "list", "--installed")
case "windows":
cmd = exec.Command("scoop", "list")
default:
return nil, fmt.Errorf("unsupported platform: %s", pm.platform)
}
output, err := cmd.CombinedOutput()
if err != nil {
return nil, err
}
// Parse output into a list of packages
packages := strings.Split(string(output), "\n")
var result []string
for _, pkg := range packages {
if pkg = strings.TrimSpace(pkg); pkg != "" {
result = append(result, pkg)
}
}
return result, nil
}
// SearchPackage searches for a package
func (pm *PackageManager) SearchPackage(query string) ([]string, error) {
var cmd *exec.Cmd
switch pm.platform {
case "darwin":
cmd = exec.Command("brew", "search", query)
case "linux":
cmd = exec.Command("apt", "search", query)
case "windows":
cmd = exec.Command("scoop", "search", query)
default:
return nil, fmt.Errorf("unsupported platform: %s", pm.platform)
}
output, err := cmd.CombinedOutput()
if err != nil {
return nil, err
}
// Parse output into a list of packages
packages := strings.Split(string(output), "\n")
var result []string
for _, pkg := range packages {
if pkg = strings.TrimSpace(pkg); pkg != "" {
result = append(result, pkg)
}
}
return result, nil
}