mirror of
https://github.com/wailsapp/wails.git
synced 2026-03-14 14:45:49 +01:00
Support linux in doctor
This commit is contained in:
parent
4a62b6a5c7
commit
38ddcf59f8
11 changed files with 66 additions and 143 deletions
|
|
@ -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},
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue