mirror of
https://github.com/taigrr/wails.git
synced 2026-04-14 10:50:53 -07:00
* feat: attempt to support Zorin * chore: bump version * Add support for Gentoo * docs: update contributors * feat: test support for Fedora * chore: version bump * Update README.md * feat: major refactor * fix: config errors * fix: capitalisation and binding fix * fix: lint * fix: linting * config: eslint * fix: more lint fixes * fix: linting for hound * Even more fixes * chore: bump version * fix: eslintrc config * fix: renamed global logger * fix: Print stdout on error :rolleyes: * fix: add promises polyfill for the windows target * style: replace double quotes with single quotes * Update contributors * feat: significant overhaul of runtime * chore: Version Bump * Fix Masterminds/semver reference import path (case-sensitivity) * drop lsb_release Signed-off-by: Chronophylos <nikolai@chronophylos.com> * change DistributionID to NAME= Signed-off-by: Chronophylos <nikolai@chronophylos.com> * show distro id when creating a issue Signed-off-by: Chronophylos <nikolai@chronophylos.com> * fix assumption Signed-off-by: Chronophylos <nikolai@chronophylos.com> * docs: updated contributors * fix: add support back for ubuntu, redhat * chore: version bump * fix(linux): fedora & centos support * feat: gcc,npm,node versions on issues * linux working * darwin working * feat: show gcc, node, npm version on issue report * Delete npm-debug.log * fix: crashing typo * trim gcc string * chore: version bump * fix: gitbash fixes * chore: hotfix * fix: issue report * fix: typo * chore: hotfix version bump * 179 parrot distributionsupport (#181) * feat: parrot support && git push * feat: parrot support * feat: parrot support * fix: arch support * fix: gentoos support * Update README.md * Update README.md * chore: bump version * Linux db (#182) * feat: refactor linux distro detection * linux db updates * feat: add gccversioncommand + windows support * fix: build-essential * chore: linter fixes (#185) * 182 linux bd (#183) * fix: linuxdb.yaml entries * fix: typo * fix: yaml syntax error * 188 support distribution linux mint (#189) * chore: update linux db * chore: bump version * chore: merge webview back in * chore: rename webview for clarity * chore: add stale issue bot config * chore: add inprogress label * Azure Pipelines (#192) * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * test: azure pipeline * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * feat: azure pipelines * chore: remove unused mewn file * chore: deduplicate library verificaation code * Update contributors * fix: undefined: webview during build * feat: VoidLinux support * Yaml bug (#207) * test: azure pipeline * fix: azure pipeline yaml * feat: elementary support * feat: opensuse support * fix: 0_setup.go line 27 * fix: 0_setup.go line 27 * fix: opensuse yaml * fix: opensuse yaml * fix: opensuse yaml * fix: opensuse yaml * fix: opensuse yaml * fix: opensuse yaml * fix: yaml * fix: yaml * fix: yaml * fix: opensuse yaml * fix: opensuse * fix: opensuse * fix: opensuse * fix: opensuse * fix: string trim os osRelease field NAME * fix: 0_setup.go if err typo * test * test * fix: typo in linux.go * test: remove quotes from opensuse case * test: revert * test: "" * test: "" * test: "" * test: "" * fix: replace trim with replace * fix: drop 0_setup.go and run checks by system.go * fix: elementary os yaml name * fix: open suse yaml entry * fix: commented out result.Release = version * fix: commented out result.Release = version * fix: revert Replace to Trim * fix: Linux Mint yaml entry * fix: capitalize distros entries * fix: capitalize distros entries * fix: capitalize distros entries * test * test * fix: open suse yaml entry * fix: yaml entris * test * test * test * test * test * test * branch changing * fix: bug in setup process * debugging * debugging * debugging * debugging * fix: yaml entries & err == nil bug * Update prerequisites.go * fix: bug * fix: 0_setup.go * fix: yaml bug * fix: yaml bug * chore: bump version * Elementary support + readme update (#210) * test: azure pipeline * fix: azure pipeline yaml * feat: elementary support+readme udpate * fix: upgrade eslint * 215 support distribution kali (#219) * test: azure pipeline * fix: azure pipeline yaml * feat: kali linux support * feat: kali linux support * fix: allow 0 return types * duplicate code spotted (#221) * fix: duplicate code * chore: release v0.17.14-pre * chore: remove debug output * (FIX) 215 support distribution kali (#224) * fix: kali support * docs: add Mattn * feat: KDE neon support (#234) * chore: version bump * chore: remove some debug output * fix: binding more than one struct method (#245) * feat: add runtime typings * fix: multiple runtime fixes * manjaro (#248) * manjaro * Update go.mod * chore: version bump * fix: update runtime * chore: version bump * cmd/wails: report error status code to OS (#252) Fixes #251. * Update CONTRIBUTORS.md * chore: version bump * fix: importing runtime (#254) * chore: supress warnings * Patch for file dialog on OSX (#258) * Patch for file dialog on OSX * Update CONTRIBUTORS.md * 262 add wails shutdown method (#264) * feat: support close in bridge mode * feat: WailsShutdown callback Now handles proper shutdown through: * runtime.Window.Close() * Killing the main window * Ctrl-C * chore: version bump * fix: force install when node_modules missing (#268) * fix: detect encoding on windows (#266) * fix: linting * chore: bump version * Migrate tool (#270) Experimental migration tool for projects < v1.0.0 * chore: version bump * fix: add flag to fix windows builds (#272) * Bump version to v0.18.9-pre * 261 korean fonts (#273) * fix: linting * chore: bump version * fix: unicode text for Windows * release v0.18.10-pre * 274 support spaces in windows paths (#275) * fix: escape windows commands * fix: allow spaces in path to windres * Update go.mod * release v0.18.11-pre * 261 korean fonts (#276) * fix: linting * chore: bump version * fix: unicode text for Windows * fix: re-add webview_set_title * release v0.18.12-pre * hotfix: build issue for windows * fix: npm/node version reporting * fix: debug build should use terminal * fix: make binary name more os specific * Backport (#283) * Develop (#265) * Patch for file dialog on OSX * Update CONTRIBUTORS.md * 262 add wails shutdown method (#264) * feat: support close in bridge mode * feat: WailsShutdown callback Now handles proper shutdown through: * runtime.Window.Close() * Killing the main window * Ctrl-C * chore: version bump * chore: version bump * feat: adjust binary name for OS * fix: allow spaces in gcc path * feat: migrate command * fix: npm/node versions * fix: allow IE for serve * feat: go build script * fix: make runtime ES2015 compliant * fix: remove invoke patch * fix: allow any line endings * chore: remove legacy bridge files * chore: latest assets * v0.18.15-pre * fix: remove unicode flag * chore: bump version * release v0.19.0
409 lines
10 KiB
Go
409 lines
10 KiB
Go
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"log"
|
|
"os"
|
|
"path/filepath"
|
|
"regexp"
|
|
"strings"
|
|
|
|
"github.com/Masterminds/semver"
|
|
"github.com/leaanthony/spinner"
|
|
"github.com/wailsapp/wails/cmd"
|
|
)
|
|
|
|
// Constants
|
|
var checkSpinner = spinner.NewSpinner()
|
|
var migrateProjectOptions = &cmd.ProjectOptions{}
|
|
var migrateFS = cmd.NewFSHelper()
|
|
var migrateGithub = cmd.NewGitHubHelper()
|
|
var programHelper = cmd.NewProgramHelper()
|
|
var lessThanV1 *semver.Constraints
|
|
|
|
// The user's go.mod
|
|
var goMod string
|
|
var goModFile string
|
|
|
|
// The user's main.js
|
|
var mainJSFile string
|
|
var mainJSContents string
|
|
|
|
// Frontend directory
|
|
var frontEndDir string
|
|
|
|
func init() {
|
|
|
|
var dryrun bool
|
|
var err error
|
|
|
|
lessThanV1, err = semver.NewConstraint("< v1.0.0")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
// var forceRebuild = false
|
|
checkSpinner.SetSpinSpeed(50)
|
|
|
|
commandDescription := `EXPERIMENTAL - This command attempts to migrate projects to the latest Wails version.`
|
|
updateCmd := app.Command("migrate", "Migrate projects to latest Wails release").
|
|
LongDescription(commandDescription).
|
|
BoolFlag("dryrun", "Only display what would be done", &dryrun)
|
|
|
|
updateCmd.Action(func() error {
|
|
|
|
message := "Migrate Project"
|
|
logger.PrintSmallBanner(message)
|
|
logger.Red("WARNING: This is an experimental command. Ensure you have backups of your project!")
|
|
logger.Red("It currently only supports npm based projects.")
|
|
fmt.Println()
|
|
|
|
// Check project directory
|
|
err := checkProjectDirectory()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// Find Wails version from go.mod
|
|
wailsVersion, err := getWailsVersion()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// Get latest stable version
|
|
var latestVersion *semver.Version
|
|
latestVersion, err = getLatestWailsVersion()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
var canMigrate bool
|
|
canMigrate, err = canMigrateVersion(wailsVersion, latestVersion)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if !canMigrate {
|
|
return nil
|
|
}
|
|
|
|
// Check for wailsbridge
|
|
wailsBridge, err := checkWailsBridge()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// Is main.js using bridge.Init()
|
|
canUpdateMainJS, err := checkMainJS()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// TODO: Check if we are using legacy js runtime
|
|
|
|
// Operations
|
|
logger.Yellow("Operations to perform:")
|
|
|
|
logger.Yellowf(" - Update to Wails v%s\n", latestVersion)
|
|
|
|
if len(wailsBridge) > 0 {
|
|
logger.Yellow(" - Delete wailsbridge.js")
|
|
}
|
|
|
|
if canUpdateMainJS {
|
|
logger.Yellow(" - Patch main.js")
|
|
}
|
|
|
|
logger.Yellow(" - Ensure '@wailsapp/runtime` module is installed")
|
|
|
|
if dryrun {
|
|
logger.White("Exiting: Dry Run")
|
|
return nil
|
|
}
|
|
|
|
logger.Red("*WARNING* About to modify your project!")
|
|
logger.Red("Type 'YES' to continue: ")
|
|
scanner := bufio.NewScanner(os.Stdin)
|
|
scanner.Scan()
|
|
input := scanner.Text()
|
|
if input != "YES" {
|
|
logger.Red("ABORTED!")
|
|
return nil
|
|
}
|
|
|
|
logger.Yellow("Let's do this!")
|
|
|
|
err = updateWailsVersion(wailsVersion, latestVersion)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if len(wailsBridge) > 0 {
|
|
err = deleteWailsBridge(wailsBridge)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
if canUpdateMainJS {
|
|
err = patchMainJS()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
// Install runtime
|
|
err = installWailsRuntime()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
fmt.Println()
|
|
logger.Yellow("Migration complete! Check project by running `wails build`.")
|
|
return nil
|
|
})
|
|
}
|
|
|
|
func checkProjectDirectory() error {
|
|
// Get versions
|
|
checkSpinner.Start("Check Project Directory")
|
|
|
|
// Check we are in project directory
|
|
err := migrateProjectOptions.LoadConfig(migrateFS.Cwd())
|
|
if err != nil {
|
|
checkSpinner.Error()
|
|
return fmt.Errorf("Unable to find 'project.json'. Please check you are in a Wails project directory")
|
|
}
|
|
|
|
checkSpinner.Success()
|
|
return nil
|
|
}
|
|
|
|
func getWailsVersion() (*semver.Version, error) {
|
|
checkSpinner.Start("Get Wails Version")
|
|
var result *semver.Version
|
|
|
|
// Load file
|
|
var err error
|
|
goModFile, err = filepath.Abs(filepath.Join(".", "go.mod"))
|
|
if err != nil {
|
|
checkSpinner.Error()
|
|
return nil, fmt.Errorf("Unable to load go.mod at %s", goModFile)
|
|
}
|
|
goMod, err = migrateFS.LoadAsString(goModFile)
|
|
if err != nil {
|
|
checkSpinner.Error()
|
|
return nil, fmt.Errorf("Unable to load go.mod")
|
|
}
|
|
|
|
// Find wails version
|
|
versionRegexp := regexp.MustCompile(`.*github.com/wailsapp/wails.*(v\d+.\d+.\d+)`)
|
|
versions := versionRegexp.FindStringSubmatch(goMod)
|
|
|
|
if len(versions) != 2 {
|
|
return nil, fmt.Errorf("Unable to determine Wails version")
|
|
}
|
|
|
|
version := versions[1]
|
|
result, err = semver.NewVersion(version)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("Unable to parse Wails version: %s", version)
|
|
}
|
|
checkSpinner.Success("Found Wails Version: " + version)
|
|
return result, nil
|
|
|
|
}
|
|
|
|
func canMigrateVersion(wailsVersion *semver.Version, latestVersion *semver.Version) (bool, error) {
|
|
checkSpinner.Start("Checking ability to Migrate")
|
|
|
|
// Check if we are at the latest version!!!!
|
|
if wailsVersion.Equal(latestVersion) || wailsVersion.GreaterThan(latestVersion) {
|
|
checkSpinner.Errorf("Checking ability to Migrate: No! (v%s >= v%s)", wailsVersion, latestVersion)
|
|
return false, nil
|
|
}
|
|
|
|
// Check for < v1.0.0
|
|
if lessThanV1.Check(wailsVersion) {
|
|
checkSpinner.Successf("Checking ability to Migrate: Yes! (v%s < v1.0.0)", wailsVersion)
|
|
return true, nil
|
|
}
|
|
checkSpinner.Error("Unable to migrate")
|
|
return false, fmt.Errorf("No migration rules for version %s", wailsVersion)
|
|
}
|
|
|
|
func checkWailsBridge() (string, error) {
|
|
checkSpinner.Start("Checking if legacy Wails Bridge present")
|
|
|
|
// Check frontend dir is available
|
|
if migrateProjectOptions.FrontEnd == nil ||
|
|
len(migrateProjectOptions.FrontEnd.Dir) == 0 ||
|
|
!migrateFS.DirExists(migrateProjectOptions.FrontEnd.Dir) {
|
|
checkSpinner.Error("Unable to determine frontend directory")
|
|
return "", fmt.Errorf("Unable to determine frontend directory")
|
|
}
|
|
|
|
frontEndDir = migrateProjectOptions.FrontEnd.Dir
|
|
|
|
wailsBridgePath, err := filepath.Abs(filepath.Join(".", frontEndDir, "src", "wailsbridge.js"))
|
|
if err != nil {
|
|
checkSpinner.Error(err.Error())
|
|
return "", err
|
|
}
|
|
|
|
// If it doesn't exist, return blank string
|
|
if !migrateFS.FileExists(wailsBridgePath) {
|
|
checkSpinner.Success("Checking if legacy Wails Bridge present: No")
|
|
return "", nil
|
|
}
|
|
|
|
checkSpinner.Success("Checking if legacy Wails Bridge present: Yes")
|
|
return wailsBridgePath, nil
|
|
|
|
}
|
|
|
|
// This function determines if the main.js file using wailsbridge can be auto-updated
|
|
func checkMainJS() (bool, error) {
|
|
|
|
checkSpinner.Start("Checking if main.js can be migrated")
|
|
var err error
|
|
|
|
// Check main.js is there
|
|
if migrateProjectOptions.FrontEnd == nil ||
|
|
len(migrateProjectOptions.FrontEnd.Dir) == 0 ||
|
|
!migrateFS.DirExists(migrateProjectOptions.FrontEnd.Dir) {
|
|
checkSpinner.Error("Unable to determine frontend directory")
|
|
return false, fmt.Errorf("Unable to determine frontend directory")
|
|
}
|
|
|
|
frontEndDir = migrateProjectOptions.FrontEnd.Dir
|
|
|
|
mainJSFile, err = filepath.Abs(filepath.Join(".", frontEndDir, "src", "main.js"))
|
|
if err != nil {
|
|
checkSpinner.Error("Unable to find main.js")
|
|
return false, err
|
|
}
|
|
|
|
mainJSContents, err = migrateFS.LoadAsString(mainJSFile)
|
|
if err != nil {
|
|
checkSpinner.Error("Unable to load main.js")
|
|
return false, err
|
|
}
|
|
|
|
// Check we have a line like: import Bridge from "./wailsbridge";
|
|
if strings.Index(mainJSContents, `import Bridge from "./wailsbridge";`) == -1 {
|
|
checkSpinner.Success("Checking if main.js can be migrated: No - Cannot find `import Bridge`")
|
|
return false, nil
|
|
}
|
|
|
|
// Check we have a line like: Bridge.Start(() => {
|
|
if strings.Index(mainJSContents, `Bridge.Start(`) == -1 {
|
|
checkSpinner.Success("Checking if main.js can be migrated: No - Cannot find `Bridge.Start`")
|
|
return false, nil
|
|
}
|
|
checkSpinner.Success("Checking if main.js can be migrated: Yes")
|
|
return true, nil
|
|
}
|
|
|
|
func getLatestWailsVersion() (*semver.Version, error) {
|
|
checkSpinner.Start("Checking GitHub for latest Wails version")
|
|
version, err := migrateGithub.GetLatestStableRelease()
|
|
if err != nil {
|
|
checkSpinner.Error("Checking GitHub for latest Wails version: Failed")
|
|
return nil, err
|
|
}
|
|
|
|
checkSpinner.Successf("Checking GitHub for latest Wails version: v%s", version)
|
|
return version.Version, nil
|
|
}
|
|
|
|
func updateWailsVersion(currentVersion, latestVersion *semver.Version) error {
|
|
// Patch go.mod
|
|
checkSpinner.Start("Patching go.mod")
|
|
|
|
wailsModule := "github.com/wailsapp/wails"
|
|
old := fmt.Sprintf("%s v%s", wailsModule, currentVersion)
|
|
new := fmt.Sprintf("%s v%s", wailsModule, latestVersion)
|
|
|
|
goMod = strings.Replace(goMod, old, new, -1)
|
|
err := ioutil.WriteFile(goModFile, []byte(goMod), 0600)
|
|
if err != nil {
|
|
checkSpinner.Error()
|
|
return err
|
|
}
|
|
|
|
checkSpinner.Success()
|
|
return nil
|
|
}
|
|
|
|
func deleteWailsBridge(bridgeFilename string) error {
|
|
// Patch go.mod
|
|
checkSpinner.Start("Delete legacy wailsbridge.js")
|
|
|
|
err := migrateFS.RemoveFile(bridgeFilename)
|
|
if err != nil {
|
|
checkSpinner.Error()
|
|
return err
|
|
}
|
|
|
|
checkSpinner.Success()
|
|
return nil
|
|
}
|
|
|
|
func patchMainJS() error {
|
|
// Patch main.js
|
|
checkSpinner.Start("Patching main.js")
|
|
|
|
// Patch import line
|
|
oldImportLine := `import Bridge from "./wailsbridge";`
|
|
newImportLine := `import * as Wails from "@wailsapp/runtime";`
|
|
mainJSContents = strings.Replace(mainJSContents, oldImportLine, newImportLine, -1)
|
|
|
|
// Patch Start line
|
|
oldStartLine := `Bridge.Start`
|
|
newStartLine := `Wails.Init`
|
|
mainJSContents = strings.Replace(mainJSContents, oldStartLine, newStartLine, -1)
|
|
|
|
err := ioutil.WriteFile(mainJSFile, []byte(mainJSContents), 0600)
|
|
if err != nil {
|
|
checkSpinner.Error()
|
|
return err
|
|
}
|
|
|
|
checkSpinner.Success()
|
|
return nil
|
|
}
|
|
|
|
func installWailsRuntime() error {
|
|
|
|
checkSpinner.Start("Installing @wailsapp/runtime module")
|
|
|
|
// Change to the frontend directory
|
|
err := os.Chdir(frontEndDir)
|
|
if err != nil {
|
|
checkSpinner.Error()
|
|
return nil
|
|
}
|
|
|
|
// Determine package manager
|
|
packageManager, err := migrateProjectOptions.GetNPMBinaryName()
|
|
if err != nil {
|
|
checkSpinner.Error()
|
|
return nil
|
|
}
|
|
|
|
switch packageManager {
|
|
case cmd.NPM:
|
|
// npm install --save @wailsapp/runtime
|
|
programHelper.InstallNPMPackage("@wailsapp/runtime", true)
|
|
default:
|
|
checkSpinner.Error()
|
|
return fmt.Errorf("Unknown package manager")
|
|
}
|
|
|
|
checkSpinner.Success()
|
|
return nil
|
|
}
|