Add Electron upgrade feature with UI and backend fixes
Introduces an Electron upgrade section in settings, allowing users to check for and upgrade to the latest stable or nightly Electron versions. Implements backend logic to read the installed Electron version directly from package.json, properly handles switching between stable and nightly builds, and improves error handling and UI feedback during upgrade operations. Includes documentation of the upgrade process and bug fixes related to version display and upgrade reliability.
This commit is contained in:
@@ -0,0 +1,94 @@
|
||||
# Electron Upgrade Feature - Bug Fixes
|
||||
|
||||
## Problem Identified
|
||||
The upgrade feature was downloading and installing new Electron versions successfully, but the app always showed the old version (1.0.0) after restart because:
|
||||
|
||||
1. **Version Source Issue**: The app was reading `app.getVersion()` which gets the version from `package.json` at startup time
|
||||
2. **Package.json Not Re-read**: Even after npm installed a new Electron version, the app didn't re-read the updated `package.json`
|
||||
3. **Runtime Display**: The About tab showed the bundled Electron version (37.x) which is baked into the binary at build time
|
||||
|
||||
## Solutions Implemented
|
||||
|
||||
### 1. **New Helper Function: `getInstalledElectronVersion()`**
|
||||
- Reads `package.json` directly every time it's called (not cached)
|
||||
- Extracts the actual installed Electron version from `devDependencies`
|
||||
- Handles both stable (`electron`) and nightly (`electron-nightly`) packages
|
||||
- Strips version specifiers (^, ~, etc.) to get the clean version number
|
||||
- Falls back to `app.getVersion()` if reading fails
|
||||
|
||||
```javascript
|
||||
function getInstalledElectronVersion() {
|
||||
try {
|
||||
const packageJsonPath = path.join(__dirname, 'package.json');
|
||||
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
||||
|
||||
const electronDep = packageJson.devDependencies?.electron;
|
||||
const electronNightlyDep = packageJson.devDependencies?.['electron-nightly'];
|
||||
|
||||
if (electronDep) {
|
||||
return electronDep.replace(/^\D+/, '');
|
||||
}
|
||||
if (electronNightlyDep) {
|
||||
return electronNightlyDep.replace(/^\D+/, '');
|
||||
}
|
||||
return app.getVersion();
|
||||
} catch (err) {
|
||||
return app.getVersion();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. **Updated `get-electron-versions` Handler**
|
||||
- Now uses `getInstalledElectronVersion()` instead of `app.getVersion()`
|
||||
- Returns the actual installed version that was modified by npm
|
||||
- Performs fresh version checks each time (no caching)
|
||||
|
||||
### 3. **Improved `upgrade-electron` Handler**
|
||||
- Increased `maxBuffer` to handle large npm output
|
||||
- Added cleanup logic to remove the old Electron variant when switching types
|
||||
- Removes `electron` when upgrading to `nightly`
|
||||
- Removes `electron-nightly` when upgrading to `stable`
|
||||
- Better error logging to debug npm failures
|
||||
- Returns clearer messages about installation status
|
||||
|
||||
### 4. **Enhanced UI/UX in settings.js**
|
||||
- Added more descriptive status text ("Downloading and installing..." instead of just "Upgrading...")
|
||||
- Disables all controls during upgrade to prevent multiple clicks
|
||||
- Reduced restart delay from 2000ms to 1500ms for faster feedback
|
||||
- Better error handling with proper cleanup of disabled states
|
||||
|
||||
## How It Works Now
|
||||
|
||||
1. **User clicks "Check for Updates"**
|
||||
- Queries npm registry for latest version
|
||||
- Uses `getInstalledElectronVersion()` to read current version from `package.json`
|
||||
- Compares versions and shows if update is available
|
||||
|
||||
2. **User clicks "Upgrade Electron"**
|
||||
- Confirms action
|
||||
- Runs `npm install --save-dev electron@latest` (or `electron-nightly@latest`)
|
||||
- npm downloads and installs new version
|
||||
- Handler removes the other Electron variant from `package.json` if needed
|
||||
- Shows success message
|
||||
|
||||
3. **App Restarts**
|
||||
- Uses `app.relaunch()` and `app.quit()`
|
||||
- When app relaunches, it:
|
||||
- Loads new Electron binary from `node_modules`
|
||||
- Runs new Electron version
|
||||
- Settings page shows correct new version on next check
|
||||
|
||||
## Testing Recommendations
|
||||
|
||||
1. Test upgrading from stable to nightly version
|
||||
2. Test upgrading from nightly back to stable
|
||||
3. Verify version display updates after restart
|
||||
4. Check that old variant is removed from `package.json`
|
||||
5. Verify app runs stably with new Electron version
|
||||
|
||||
## Notes for Future Development
|
||||
|
||||
- The About tab displays `process.versions.electron` which is the bundled Chromium version, not the Electron framework version
|
||||
- The Electron version we display in the upgrade section comes from `package.json` which is the actual framework version
|
||||
- When building with electron-builder, the bundled version becomes fixed until next rebuild
|
||||
- For development/testing, the upgrade feature reads live from `package.json`
|
||||
Reference in New Issue
Block a user