Support linux in doctor

This commit is contained in:
Lea Anthony 2023-09-04 19:46:07 +10:00
commit 38ddcf59f8
No known key found for this signature in database
GPG key ID: 33DAF7BB90A58405
11 changed files with 66 additions and 143 deletions

View file

@ -118,7 +118,7 @@ func Run() (err error) {
return err
}
pterm.DefaultSection.Println("Operating System")
pterm.DefaultSection.Println("System")
systemTabledata := pterm.TableData{
{pterm.Sprint("Name"), info.Name},

View file

@ -2,74 +2,39 @@
package doctor
import (
"github.com/wailsapp/wails/v3/internal/doctor/packagemanager"
"github.com/wailsapp/wails/v3/internal/operatingsystem"
)
func getInfo() (map[string]string, bool) {
result := make(map[string]string)
/*
pterm.DefaultSection.Println("Dependencies")
ok := true
// Output Dependencies Status
var dependenciesMissing []string
var externalPackages []*packagemanager.Dependency
var dependenciesAvailableRequired = 0
var dependenciesAvailableOptional = 0
info, _ := operatingsystem.Info()
dependenciesTableData := pterm.TableData{
{"Dependency", "Package Name", "Status", "Version"},
}
pm := packagemanager.Find(info.ID)
deps, _ := packagemanager.Dependencies(pm)
for _, dep := range deps {
var status string
hasOptionalDependencies := false
// Loop over dependencies
for _, dependency := range info.Dependencies {
name := dependency.Name
if dependency.Optional {
name = pterm.Gray("*") + name
hasOptionalDependencies = true
}
packageName := "Unknown"
status := pterm.LightRed("Not Found")
// If we found the package
if dependency.PackageName != "" {
packageName = dependency.PackageName
// If it's installed, update the status
if dependency.Installed {
status = pterm.LightGreen("Installed")
} else {
// Generate meaningful status text
status = pterm.LightMagenta("Available")
if dependency.Optional {
dependenciesAvailableOptional++
} else {
dependenciesAvailableRequired++
}
}
switch true {
case !dep.Installed:
if dep.Optional {
status = "[Optional] "
} else {
if !dependency.Optional {
dependenciesMissing = append(dependenciesMissing, dependency.Name)
}
if dependency.External {
externalPackages = append(externalPackages, dependency)
}
ok = false
}
dependenciesTableData = append(dependenciesTableData, []string{name, packageName, status, dependency.Version})
status += "not installed."
if dep.InstallCommand != "" {
status += " Install with: " + dep.InstallCommand
}
case dep.Version != "":
status = dep.Version
}
dependenciesTableString, _ := pterm.DefaultTable.WithHasHeader(true).WithData(dependenciesTableData).Srender()
dependenciesBox := pterm.DefaultBox.WithTitleBottomCenter()
result[dep.Name] = status
}
if hasOptionalDependencies {
dependenciesBox = dependenciesBox.WithTitle(pterm.Gray("*") + " - Optional Dependency")
}
dependenciesBox.Println(dependenciesTableString)
pterm.Println() // Spacer for sponsor message
*/
return result, true
return result, ok
}

View file

@ -3,6 +3,7 @@
package packagemanager
import (
"regexp"
"strings"
)
@ -22,8 +23,8 @@ func NewApt(osid string) *Apt {
// Packages returns the libraries that we need for Wails to compile
// They will potentially differ on different distributions or versions
func (a *Apt) Packages() packagemap {
return packagemap{
func (a *Apt) Packages() Packagemap {
return Packagemap{
"libgtk-3": []*Package{
{Name: "libgtk-3-dev", SystemPackage: true, Library: true},
},
@ -39,12 +40,6 @@ func (a *Apt) Packages() packagemap {
"npm": []*Package{
{Name: "npm", SystemPackage: true},
},
"docker": []*Package{
{Name: "docker.io", SystemPackage: true, Optional: true},
},
"nsis": []*Package{
{Name: "nsis", SystemPackage: true, Optional: true},
},
}
}
@ -73,7 +68,6 @@ func (a *Apt) PackageAvailable(pkg *Package) (bool, error) {
}
output, err := a.listPackage(pkg.Name)
// We add a space to ensure we get a full match, not partial match
output = a.removeEscapeSequences(output)
escapechars, _ := regexp.Compile(`\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])`)
escapechars.ReplaceAllString(output, "")
installed := strings.HasPrefix(output, pkg.Name)

View file

@ -23,8 +23,8 @@ func NewDnf(osid string) *Dnf {
// Packages returns the libraries that we need for Wails to compile
// They will potentially differ on different distributions or versions
func (y *Dnf) Packages() packagemap {
return packagemap{
func (y *Dnf) Packages() Packagemap {
return Packagemap{
"libgtk-3": []*Package{
{Name: "gtk3-devel", SystemPackage: true, Library: true},
},
@ -43,20 +43,6 @@ func (y *Dnf) Packages() packagemap {
{Name: "npm", SystemPackage: true},
{Name: "nodejs-npm", SystemPackage: true},
},
"upx": []*Package{
{Name: "upx", SystemPackage: true, Optional: true},
},
"docker": []*Package{
{
SystemPackage: false,
Optional: true,
InstallCommand: map[string]string{
"centos": "Follow the guide: https://docs.docker.com/engine/install/centos/",
"fedora": "Follow the guide: https://docs.docker.com/engine/install/fedora/",
},
},
{Name: "moby-engine", SystemPackage: true, Optional: true},
},
}
}
@ -95,7 +81,7 @@ func (y *Dnf) PackageAvailable(pkg *Package) (bool, error) {
if pkg.SystemPackage == false {
return false, nil
}
stdout, _, err := execCmd("dnf", "info", pkg.Name)
stdout, err := execCmd("dnf", "info", pkg.Name)
// We add a space to ensure we get a full match, not partial match
if err != nil {
_, ok := err.(*exec.ExitError)

View file

@ -24,8 +24,8 @@ func NewEmerge(osid string) *Emerge {
// Packages returns the libraries that we need for Wails to compile
// They will potentially differ on different distributions or versions
func (e *Emerge) Packages() packagemap {
return packagemap{
func (e *Emerge) Packages() Packagemap {
return Packagemap{
"libgtk-3": []*Package{
{Name: "x11-libs/gtk+", SystemPackage: true, Library: true},
},
@ -41,9 +41,6 @@ func (e *Emerge) Packages() packagemap {
"npm": []*Package{
{Name: "net-libs/nodejs", SystemPackage: true},
},
"docker": []*Package{
{Name: "app-emulation/docker", SystemPackage: true, Optional: true},
},
}
}

View file

@ -25,8 +25,8 @@ func NewEopkg(osid string) *Eopkg {
// Packages returns the packages that we need for Wails to compile
// They will potentially differ on different distributions or versions
func (e *Eopkg) Packages() packagemap {
return packagemap{
func (e *Eopkg) Packages() Packagemap {
return Packagemap{
"libgtk-3": []*Package{
{Name: "libgtk-3-devel", SystemPackage: true, Library: true},
},
@ -42,9 +42,6 @@ func (e *Eopkg) Packages() packagemap {
"npm": []*Package{
{Name: "nodejs", SystemPackage: true},
},
"docker": []*Package{
{Name: "docker", SystemPackage: true, Optional: true},
},
}
}

View file

@ -32,14 +32,14 @@ func NewNixpkgs(osid string) *Nixpkgs {
// Packages returns the libraries that we need for Wails to compile
// They will potentially differ on different distributions or versions
func (n *Nixpkgs) Packages() packagemap {
func (n *Nixpkgs) Packages() Packagemap {
// Currently, only support checking the default channel.
channel := "nixpkgs"
if n.osid == "nixos" {
channel = "nixos"
}
return packagemap{
return Packagemap{
"libgtk-3": []*Package{
{Name: channel + ".gtk3", SystemPackage: true, Library: true},
},
@ -55,15 +55,6 @@ func (n *Nixpkgs) Packages() packagemap {
"npm": []*Package{
{Name: channel + ".nodejs", SystemPackage: true},
},
"upx": []*Package{
{Name: channel + ".upx", SystemPackage: true, Optional: true},
},
"docker": []*Package{
{Name: channel + ".docker", SystemPackage: true, Optional: true},
},
"nsis": []*Package{
{Name: channel + ".nsis", SystemPackage: true, Optional: true},
},
}
}

View file

@ -3,10 +3,11 @@
package packagemanager
import (
"bytes"
"os"
"os/exec"
"sort"
"strings"
"github.com/wailsapp/wails/v2/internal/shell"
)
func execCmd(command string, args ...string) (string, error) {
@ -30,12 +31,21 @@ var pmcommands = []string{
"nix-env",
}
// commandExists returns true if the given command can be found on the shell
func commandExists(name string) bool {
_, err := exec.LookPath(name)
if err != nil {
return false
}
return true
}
// Find will attempt to find the system package manager
func Find(osid string) PackageManager {
// Loop over pmcommands
for _, pmname := range pmcommands {
if shell.CommandExists(pmname) {
if commandExists(pmname) {
return newPackageManager(pmname, osid)
}
}
@ -124,10 +134,6 @@ func AppVersion(name string) string {
return npmVersion()
}
if name == "docker" {
return dockerVersion()
}
return ""
}
@ -138,13 +144,13 @@ func gccVersion() string {
var err error
// Try "-dumpfullversion"
version, _, err = shell.RunCommand(".", "gcc", "-dumpfullversion")
version, err = execCmd("gcc", "-dumpfullversion")
if err != nil {
// Try -dumpversion
// We ignore the error as this function is not for testing whether the
// application exists, only that we can get the version number
dumpversion, _, err := shell.RunCommand(".", "gcc", "-dumpversion")
dumpversion, err := execCmd("gcc", "-dumpversion")
if err == nil {
version = dumpversion
}
@ -153,19 +159,11 @@ func gccVersion() string {
}
func pkgConfigVersion() string {
version, _, _ := shell.RunCommand(".", "pkg-config", "--version")
version, _ := execCmd("pkg-config", "--version")
return strings.TrimSpace(version)
}
func npmVersion() string {
version, _, _ := shell.RunCommand(".", "npm", "--version")
version, _ := execCmd("npm", "--version")
return strings.TrimSpace(version)
}
func dockerVersion() string {
version, _, _ := shell.RunCommand(".", "docker", "--version")
version = strings.TrimPrefix(version, "Docker version ")
version = strings.ReplaceAll(version, ", build ", " (")
version = strings.TrimSpace(version) + ")"
return version
}

View file

@ -24,8 +24,8 @@ func NewPacman(osid string) *Pacman {
// Packages returns the libraries that we need for Wails to compile
// They will potentially differ on different distributions or versions
func (p *Pacman) Packages() packagemap {
return packagemap{
func (p *Pacman) Packages() Packagemap {
return Packagemap{
"libgtk-3": []*Package{
{Name: "gtk3", SystemPackage: true, Library: true},
},
@ -41,9 +41,6 @@ func (p *Pacman) Packages() packagemap {
"npm": []*Package{
{Name: "npm", SystemPackage: true},
},
"docker": []*Package{
{Name: "docker", SystemPackage: true, Optional: true},
},
}
}

View file

@ -25,8 +25,8 @@ func NewZypper(osid string) *Zypper {
// Packages returns the libraries that we need for Wails to compile
// They will potentially differ on different distributions or versions
func (z *Zypper) Packages() packagemap {
return packagemap{
func (z *Zypper) Packages() Packagemap {
return Packagemap{
"libgtk-3": []*Package{
{Name: "gtk3-devel", SystemPackage: true, Library: true},
},
@ -44,9 +44,6 @@ func (z *Zypper) Packages() packagemap {
"npm": []*Package{
{Name: "npm10", SystemPackage: true},
},
"docker": []*Package{
{Name: "docker", SystemPackage: true, Optional: true},
},
}
}
@ -60,7 +57,7 @@ func (z *Zypper) PackageInstalled(pkg *Package) (bool, error) {
if pkg.SystemPackage == false {
return false, nil
}
stdout, err := cmdExec("zypper", "info", pkg.Name)
stdout, err := execCmd("zypper", "info", pkg.Name)
if err != nil {
_, ok := err.(*exec.ExitError)
if ok {
@ -83,8 +80,7 @@ func (z *Zypper) PackageAvailable(pkg *Package) (bool, error) {
if pkg.SystemPackage == false {
return false, nil
}
var env []string
stdout, err := cmdExec("zypper", "info", pkg.Name)
stdout, err := execCmd("zypper", "info", pkg.Name)
// We add a space to ensure we get a full match, not partial match
if err != nil {
_, ok := err.(*exec.ExitError)

View file

@ -40,11 +40,13 @@ func parseOsRelease(osRelease string) *OS {
}
switch splitLine[0] {
case "ID":
result.ID = strings.ToLower(strings.Trim(splitLine[1], "\""))
result.ID = strings.ToLower(strings.Trim(splitLine[1], `"`))
case "NAME":
result.Name = strings.Trim(splitLine[1], "\"")
result.Name = strings.Trim(splitLine[1], `"`)
case "VERSION_ID":
result.Version = strings.Trim(splitLine[1], "\"")
result.Version = strings.Trim(splitLine[1], `"`)
case "VERSION":
result.Branding = strings.Trim(splitLine[1], `"`)
}
}
return &result