Skip to content

Commit

Permalink
feat(update): directly use versions repo (#2211)
Browse files Browse the repository at this point in the history
  • Loading branch information
daiyam authored Jan 24, 2025
1 parent 7fab58a commit 11f3d7c
Show file tree
Hide file tree
Showing 5 changed files with 227 additions and 77 deletions.
File renamed without changes.
226 changes: 226 additions & 0 deletions patches/version-1-update.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,226 @@
diff --git a/src/vs/platform/update/common/update.ts b/src/vs/platform/update/common/update.ts
index 199f433..a6cbb10 100644
--- a/src/vs/platform/update/common/update.ts
+++ b/src/vs/platform/update/common/update.ts
@@ -51,3 +51,4 @@ export const enum UpdateType {
Archive,
- Snap
+ Snap,
+ WindowsInstaller,
}
@@ -110 +111,38 @@ export interface IUpdateService {
}
+
+export type Architecture =
+ | "arm"
+ | "arm64"
+ | "ia32"
+ | "loong64"
+ | "mips"
+ | "mipsel"
+ | "ppc"
+ | "ppc64"
+ | "riscv64"
+ | "s390"
+ | "s390x"
+ | "x64";
+
+export type Platform =
+ | "aix"
+ | "android"
+ | "darwin"
+ | "freebsd"
+ | "haiku"
+ | "linux"
+ | "openbsd"
+ | "sunos"
+ | "win32"
+ | "cygwin"
+ | "netbsd";
+
+export type Quality =
+ | "insider"
+ | "stable";
+
+export type Target =
+ | "archive"
+ | "msi"
+ | "system"
+ | "user";
\ No newline at end of file
diff --git a/src/vs/platform/update/electron-main/abstractUpdateService.ts b/src/vs/platform/update/electron-main/abstractUpdateService.ts
index 48638aa..8f738e7 100644
--- a/src/vs/platform/update/electron-main/abstractUpdateService.ts
+++ b/src/vs/platform/update/electron-main/abstractUpdateService.ts
@@ -14,6 +14,10 @@ import { IProductService } from '../../product/common/productService.js';
import { IRequestService } from '../../request/common/request.js';
-import { AvailableForDownload, DisablementReason, IUpdateService, State, StateType, UpdateType } from '../common/update.js';
+import { Architecture, AvailableForDownload, DisablementReason, IUpdateService, Platform, State, StateType, Target, UpdateType } from '../common/update.js';

-export function createUpdateURL(platform: string, quality: string, productService: IProductService): string {
- return `${productService.updateUrl}/api/update/${platform}/${quality}/${productService.commit}`;
+export function createUpdateURL(productService: IProductService, quality: string, platform: Platform, architecture: Architecture, target?: Target): string {
+ if (target) {
+ return `${productService.updateUrl}/${quality}/${platform}/${architecture}/${target}/latest.json`;
+ } else {
+ return `${productService.updateUrl}/${quality}/${platform}/${architecture}/latest.json`;
+ }
}
diff --git a/src/vs/platform/update/electron-main/updateService.darwin.ts b/src/vs/platform/update/electron-main/updateService.darwin.ts
index d3f27d3..4622c99 100644
--- a/src/vs/platform/update/electron-main/updateService.darwin.ts
+++ b/src/vs/platform/update/electron-main/updateService.darwin.ts
@@ -15,3 +15,3 @@ import { ILogService } from '../../log/common/log.js';
import { IProductService } from '../../product/common/productService.js';
-import { IRequestService } from '../../request/common/request.js';
+import { IRequestService, asJson } from '../../request/common/request.js';
import { ITelemetryService } from '../../telemetry/common/telemetry.js';
@@ -19,2 +19,4 @@ import { IUpdate, State, StateType, UpdateType } from '../common/update.js';
import { AbstractUpdateService, createUpdateURL, UpdateErrorClassification, UpdateNotAvailableClassification } from './abstractUpdateService.js';
+import { CancellationToken } from '../../../base/common/cancellation.js';
+import * as semver from 'semver';

@@ -76,9 +78,3 @@ export class DarwinUpdateService extends AbstractUpdateService implements IRelau
protected buildUpdateFeedUrl(quality: string): string | undefined {
- let assetID: string;
- if (!this.productService.darwinUniversalAssetId) {
- assetID = process.arch === 'x64' ? 'darwin' : 'darwin-arm64';
- } else {
- assetID = this.productService.darwinUniversalAssetId;
- }
- const url = createUpdateURL(assetID, quality, this.productService);
+ const url = createUpdateURL(this.productService, quality, process.platform, process.arch);
try {
@@ -94,4 +90,23 @@ export class DarwinUpdateService extends AbstractUpdateService implements IRelau
protected doCheckForUpdates(context: any): void {
+ if (!this.url) {
+ return;
+ }
+
this.setState(State.CheckingForUpdates(context));
- electron.autoUpdater.checkForUpdates();
+
+ this.requestService.request({ url: this.url }, CancellationToken.None)
+ .then<IUpdate | null>(asJson)
+ .then(update => {
+ if (!update || !update.url || !update.version || !update.productVersion) {
+ this.setState(State.Idle(UpdateType.Setup));
+ }
+ else if(semver.compareBuild(update.productVersion.replace(/(\d+\.\d+\.\d+)(?:\.(\d+))(?:\-\w+)?/, '$1+$2'), `${this.productService.version}+${this.productService.release}`) >= 0) {
+ this.setState(State.Idle(UpdateType.Setup));
+ }
+ else {
+ electron.autoUpdater.checkForUpdates();
+ }
+
+ return Promise.resolve(null);
+ })
}
diff --git a/src/vs/platform/update/electron-main/updateService.linux.ts b/src/vs/platform/update/electron-main/updateService.linux.ts
index 6e076c7..81556b6 100644
--- a/src/vs/platform/update/electron-main/updateService.linux.ts
+++ b/src/vs/platform/update/electron-main/updateService.linux.ts
@@ -33,3 +33,3 @@ export class LinuxUpdateService extends AbstractUpdateService {
protected buildUpdateFeedUrl(quality: string): string {
- return createUpdateURL(`linux-${process.arch}`, quality, this.productService);
+ return createUpdateURL(this.productService, quality, process.platform, process.arch);
}
diff --git a/src/vs/platform/update/electron-main/updateService.win32.ts b/src/vs/platform/update/electron-main/updateService.win32.ts
index 61109e5..2581f3b 100644
--- a/src/vs/platform/update/electron-main/updateService.win32.ts
+++ b/src/vs/platform/update/electron-main/updateService.win32.ts
@@ -11,3 +11,2 @@ import { CancellationToken } from '../../../base/common/cancellation.js';
import { memoize } from '../../../base/common/decorators.js';
-import { hash } from '../../../base/common/hash.js';
import * as path from '../../../base/common/path.js';
@@ -25,4 +24,5 @@ import { asJson, IRequestService } from '../../request/common/request.js';
import { ITelemetryService } from '../../telemetry/common/telemetry.js';
-import { AvailableForDownload, DisablementReason, IUpdate, State, StateType, UpdateType } from '../common/update.js';
-import { AbstractUpdateService, createUpdateURL, UpdateErrorClassification, UpdateNotAvailableClassification } from './abstractUpdateService.js';
+import { AvailableForDownload, DisablementReason, IUpdate, State, StateType, Target, UpdateType } from '../common/update.js';
+import { AbstractUpdateService, createUpdateURL} from './abstractUpdateService.js';
+import * as semver from 'semver';

@@ -42,5 +42,9 @@ function getUpdateType(): UpdateType {
if (typeof _updateType === 'undefined') {
- _updateType = fs.existsSync(path.join(path.dirname(process.execPath), 'unins000.exe'))
- ? UpdateType.Setup
- : UpdateType.Archive;
+ if (fs.existsSync(path.join(path.dirname(process.execPath), 'unins000.exe'))) {
+ _updateType = UpdateType.Setup;
+ } else if (path.basename(path.normalize(path.join(process.execPath, '..', '..'))) === 'Program Files') {
+ _updateType = UpdateType.WindowsInstaller;
+ } else {
+ _updateType = UpdateType.Archive;
+ }
}
@@ -63,2 +67,3 @@ export class Win32UpdateService extends AbstractUpdateService implements IRelaun
@IConfigurationService configurationService: IConfigurationService,
+ // @ts-expect-error
@ITelemetryService private readonly telemetryService: ITelemetryService,
@@ -102,11 +107,21 @@ export class Win32UpdateService extends AbstractUpdateService implements IRelaun
protected buildUpdateFeedUrl(quality: string): string | undefined {
- let platform = `win32-${process.arch}`;
-
- if (getUpdateType() === UpdateType.Archive) {
- platform += '-archive';
- } else if (this.productService.target === 'user') {
- platform += '-user';
+ let target: Target;
+
+ switch (getUpdateType()) {
+ case UpdateType.Archive:
+ target = "archive"
+ break;
+ case UpdateType.WindowsInstaller:
+ target = "msi"
+ break;
+ default:
+ if (this.productService.target === 'user') {
+ target = "user"
+ }
+ else {
+ target = "system"
+ }
}

- return createUpdateURL(platform, quality, this.productService);
+ return createUpdateURL(this.productService, quality, process.platform, process.arch, target);
}
@@ -126,4 +141,7 @@ export class Win32UpdateService extends AbstractUpdateService implements IRelaun
if (!update || !update.url || !update.version || !update.productVersion) {
- this.telemetryService.publicLog2<{ explicit: boolean }, UpdateNotAvailableClassification>('update:notAvailable', { explicit: !!context });
+ this.setState(State.Idle(updateType));
+ return Promise.resolve(null);
+ }

+ if(semver.compareBuild(update.productVersion.replace(/(\d+\.\d+\.\d+)(?:\.(\d+))(?:\-\w+)?/, '$1+$2'), `${this.productService.version}+${this.productService.release}`) >= 0) {
this.setState(State.Idle(updateType));
@@ -158,3 +176,3 @@ export class Win32UpdateService extends AbstractUpdateService implements IRelaun

- const fastUpdatesEnabled = this.configurationService.getValue('update.enableWindowsBackgroundUpdates');
+ const fastUpdatesEnabled = getUpdateType() == UpdateType.Setup && this.configurationService.getValue('update.enableWindowsBackgroundUpdates');
if (fastUpdatesEnabled) {
@@ -170,3 +188,2 @@ export class Win32UpdateService extends AbstractUpdateService implements IRelaun
.then(undefined, err => {
- this.telemetryService.publicLog2<{ messageHash: string }, UpdateErrorClassification>('update:error', { messageHash: String(hash(String(err))) });
this.logService.error(err);
@@ -254,6 +271,14 @@ export class Win32UpdateService extends AbstractUpdateService implements IRelaun
} else {
- spawn(this.availableUpdate.packagePath, ['/silent', '/log', '/mergetasks=runcode,!desktopicon,!quicklaunchicon'], {
- detached: true,
- stdio: ['ignore', 'ignore', 'ignore']
- });
+ const type = getUpdateType();
+ if (type == UpdateType.WindowsInstaller) {
+ spawn('msiexec.exe', ['/i', this.availableUpdate.packagePath], {
+ detached: true,
+ stdio: ['ignore', 'ignore', 'ignore']
+ });
+ } else {
+ spawn(this.availableUpdate.packagePath, ['/silent', '/log', '/mergetasks=runcode,!desktopicon,!quicklaunchicon'], {
+ detached: true,
+ stdio: ['ignore', 'ignore', 'ignore']
+ });
+ }
}
9 changes: 0 additions & 9 deletions patches/windows/update-msi.patch

This file was deleted.

67 changes: 0 additions & 67 deletions patches/windows/update.patch

This file was deleted.

2 changes: 1 addition & 1 deletion prepare_vscode.sh
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ setpath "product" "tipsAndTricksUrl" "https://go.microsoft.com/fwlink/?linkid=85
setpath "product" "twitterUrl" "https://go.microsoft.com/fwlink/?LinkID=533687"

if [[ "${DISABLE_UPDATE}" != "yes" ]]; then
setpath "product" "updateUrl" "https://vscodium.now.sh"
setpath "product" "updateUrl" "https://raw.githubusercontent.com/VSCodium/versions/refs/heads/master"
setpath "product" "downloadUrl" "https://github.com/VSCodium/vscodium/releases"
fi

Expand Down

0 comments on commit 11f3d7c

Please sign in to comment.