126 lines
2.9 KiB
Go
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
|
|
}
|