From 220cbed9e94c605ce6c95ec58b1f47e99bc0dc47 Mon Sep 17 00:00:00 2001 From: Tyler Leonhardt Date: Fri, 26 Jul 2019 17:36:16 -0700 Subject: [PATCH 1/7] prompt to update PowerShell version --- package-lock.json | 92 +++++++++++++++++++- package.json | 9 ++ src/features/UpdatePowerShell.ts | 112 +++++++++++++++++++++++++ src/session.ts | 37 +++++++- src/settings.ts | 3 + test/features/UpdatePowerShell.test.ts | 22 +++++ 6 files changed, 268 insertions(+), 7 deletions(-) create mode 100644 src/features/UpdatePowerShell.ts create mode 100644 test/features/UpdatePowerShell.test.ts diff --git a/package-lock.json b/package-lock.json index 1f95a6be07..1d3a873c76 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,12 +44,27 @@ "integrity": "sha512-yOxFfkN9xUFLyvWaeYj90mlqTJ41CsQzWKS3gXdOMOyPVacUsymejKxJ4/pMW7exouubuEeZLJawGgcNGYlTeg==", "dev": true }, + "@types/node-fetch": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.0.tgz", + "integrity": "sha512-TLFRywthBgL68auWj+ziWu+vnmmcHCDFC/sqCOQf1xTz4hRq8cu79z8CtHU9lncExGBsB8fXA4TiLDLt6xvMzw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/rewire": { "version": "2.5.28", "resolved": "https://registry.npmjs.org/@types/rewire/-/rewire-2.5.28.tgz", "integrity": "sha512-uD0j/AQOa5le7afuK+u+woi8jNKF1vf3DN0H7LCJhft/lNNibUr7VcAesdgtWfEKveZol3ZG1CJqwx2Bhrnl8w==", "dev": true }, + "@types/semver": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-6.0.1.tgz", + "integrity": "sha512-ffCdcrEE5h8DqVxinQjo+2d1q+FV5z7iNtPofw3JsrltSoSVlOGaW0rY8XxtO9XukdTn8TaCGWmk2VFGhI70mg==", + "dev": true + }, "acorn": { "version": "5.7.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", @@ -168,6 +183,13 @@ "requires": { "semver": "^5.3.0", "shimmer": "^1.1.0" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + } } }, "asynckit": { @@ -400,6 +422,13 @@ "async-hook-jl": "^1.7.6", "emitter-listener": "^1.0.1", "semver": "^5.4.1" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + } } }, "co": { @@ -548,6 +577,13 @@ "integrity": "sha1-zJmvlhLCP7H/8TYSxy8sv6qNWhc=", "requires": { "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + } } }, "diagnostic-channel-publishers": { @@ -700,6 +736,14 @@ "strip-json-comments": "~2.0.1", "table": "4.0.2", "text-table": "~0.2.0" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } } }, "eslint-scope": { @@ -1396,6 +1440,11 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + }, "nth-check": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", @@ -1484,6 +1533,14 @@ "dev": true, "requires": { "semver": "^5.1.0" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } } }, "parse5": { @@ -1749,9 +1806,9 @@ "dev": true }, "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, "shebang-command": { "version": "1.2.0", @@ -1953,6 +2010,14 @@ "semver": "^5.3.0", "tslib": "^1.8.0", "tsutils": "^2.29.0" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } } }, "tsutils": { @@ -2104,6 +2169,12 @@ "yazl": "^2.2.2" }, "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + }, "tmp": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.29.tgz", @@ -2128,6 +2199,14 @@ "source-map-support": "^0.5.0", "url-parse": "^1.4.4", "vscode-test": "^0.4.1" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } } }, "vscode-extension-telemetry": { @@ -2150,6 +2229,13 @@ "requires": { "semver": "^5.5.0", "vscode-languageserver-protocol": "3.14.1" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + } } }, "vscode-languageserver-protocol": { diff --git a/package.json b/package.json index 98d0b37466..1928625794 100644 --- a/package.json +++ b/package.json @@ -40,13 +40,17 @@ "onView:PowerShellCommands" ], "dependencies": { + "node-fetch": "^2.6.0", + "semver": "^6.3.0", "vscode-extension-telemetry": "~0.1.2", "vscode-languageclient": "~5.2.1" }, "devDependencies": { "@types/mocha": "~5.2.7", "@types/node": "~10.11.0", + "@types/node-fetch": "^2.5.0", "@types/rewire": "^2.5.28", + "@types/semver": "^6.0.1", "mocha": "~5.2.0", "mocha-junit-reporter": "~1.23.1", "mocha-multi-reporters": "~1.1.7", @@ -575,6 +579,11 @@ "type": "string", "description": "Specifies the PowerShell version name, as displayed by the 'PowerShell: Show Session Menu' command, used when the extension loads e.g \"Windows PowerShell (x86)\" or \"PowerShell Core 6 (x64)\"." }, + "powershell.promptToUpdatePowerShell": { + "type": "boolean", + "description": "Specifies whether you should be prompted to update your version of PowerShell.", + "default": true + }, "powershell.startAutomatically": { "type": "boolean", "default": true, diff --git a/src/features/UpdatePowerShell.ts b/src/features/UpdatePowerShell.ts new file mode 100644 index 0000000000..9dd3b10bff --- /dev/null +++ b/src/features/UpdatePowerShell.ts @@ -0,0 +1,112 @@ +/*--------------------------------------------------------- + * Copyright (C) Microsoft Corporation. All rights reserved. + *--------------------------------------------------------*/ + +import fetch from "node-fetch"; +import { compare, parse, prerelease, SemVer } from "semver"; +import { MessageItem, window } from "vscode"; +import Settings = require("../settings"); +import { EvaluateRequestType } from "./Console"; + +const PowerShellGitHubReleasesUrl = + "https://api.github.com/repos/PowerShell/PowerShell/releases/latest"; +const PowerShellGitHubRPrereleasesUrl = + "https://api.github.com/repos/PowerShell/PowerShell/releases"; + +export class GitHubReleaseInformation { + public static async FetchLatestRelease(preview: boolean): Promise { + // Fetch the latest PowerShell releases from GitHub. + let releaseJson: any; + if (preview) { + // This gets all releases and the first one is the latest prerelease if + // there is a prerelease version. + releaseJson = (await fetch(PowerShellGitHubRPrereleasesUrl) + .then((res) => res.json()))[0]; + } else { + releaseJson = await fetch(PowerShellGitHubReleasesUrl) + .then((res) => res.json()); + } + + return new GitHubReleaseInformation( + releaseJson.tag_name, releaseJson.assets); + } + + public version: SemVer; + public isPreview: boolean = false; + public assets: any[]; + + public constructor(version: string | SemVer, assets: any[] = []) { + this.version = parse(version); + + if (prerelease(this.version)) { + this.isPreview = true; + } + + this.assets = assets; + } +} + +interface IUpdateMessageItem extends MessageItem { + id: number; +} + +export async function InvokePowerShellUpdateCheck( + localVersion: SemVer, arch: string, release: GitHubReleaseInformation) { + const options: IUpdateMessageItem[] = [ + { + id: 0, + title: "Yes!", + }, + { + id: 1, + title: "Not now.", + }, + { + id: 2, + title: "Never...", + }, + ]; + + if (compare(release.version, localVersion) > 0) { + const result = await window.showInformationMessage( + `You have an old version of PowerShell (${ + localVersion.raw + }). The current latest release is ${ + release.version.raw + }. Would you like to update the version?`, ...options); + + // Yes choice. + if (result.id === 0) { + let script: string; + if (process.platform === "win32") { + const msiMatcher = arch === "x86" ? + "win-x86.msi" : "win-x64.msi"; + + const assetUrl = release.assets.filter((asset: any) => + asset.name.indexOf(msiMatcher) >= 0)[0].url; + + // Grab MSI and run it. + // tslint:disable-next-line: max-line-length + script = `$tmpMsiPath = Microsoft.PowerShell.Management\\Join-Path ([System.IO.Path]::GetTempPath()) "pwsh.msi"; +Microsoft.PowerShell.Utility\\Invoke-RestMethod -Uri ${assetUrl} -OutFile $tmpMsiPath; +Microsoft.PowerShell.Management\\Invoke-Item $tmpMsiPath;`; + + } else if (process.platform === "darwin") { + script = "brew cask upgrade powershell"; + if (release.isPreview) { + script = "brew cask upgrade powershell-preview"; + } + } else if (process.platform === "linux") { + window.showWarningMessage( + "Update through VS Code not supported on Linux."); + return; + } + await this.languageServerClient.sendRequest(EvaluateRequestType, { + expression: script, + }); + // Never choice. + } else if (result.id === 2) { + await Settings.change("promptToUpdatePowerShell", false, true); + } + } +} diff --git a/src/session.ts b/src/session.ts index c110b79577..9e494bfaaf 100644 --- a/src/session.ts +++ b/src/session.ts @@ -3,12 +3,11 @@ *--------------------------------------------------------*/ import cp = require("child_process"); -import crypto = require("crypto"); import fs = require("fs"); import net = require("net"); import os = require("os"); import path = require("path"); -import { StringDecoder } from "string_decoder"; +import * as semver from "semver"; import vscode = require("vscode"); import TelemetryReporter from "vscode-extension-telemetry"; import { Message } from "vscode-jsonrpc"; @@ -23,6 +22,7 @@ import { Middleware, NotificationType, RequestType, RequestType0, ResolveCodeLensSignature, RevealOutputChannelOn, StreamInfo } from "vscode-languageclient"; +import { GitHubReleaseInformation, InvokePowerShellUpdateCheck } from "./features/UpdatePowerShell"; import { fixWindowsPowerShellPath, getAvailablePowerShellExes, getDefaultPowerShellPath, getPlatformDetails, IPlatformDetails, OperatingSystem } from "./platform"; @@ -37,8 +37,11 @@ export enum SessionStatus { } export class SessionManager implements Middleware { + private static PowerShellGitHubReleasesUrl = + "https://api.github.com/repos/PowerShell/PowerShell/releases/latest"; + private static PowerShellGitHubRPrereleasesUrl = + "https://api.github.com/repos/PowerShell/PowerShell/releases"; public HostVersion: string; - private ShowSessionMenuCommandName = "PowerShell.ShowSessionMenu"; private editorServicesArgs: string; private powerShellExePath: string = ""; @@ -586,7 +589,7 @@ export class SessionManager implements Middleware { this.languageServerClient .sendRequest(PowerShellVersionRequestType) .then( - (versionDetails) => { + async (versionDetails) => { this.versionDetails = versionDetails; if (!this.inDevelopmentMode) { @@ -599,6 +602,32 @@ export class SessionManager implements Middleware { ? `${this.versionDetails.displayVersion} (${this.versionDetails.architecture})` : this.versionDetails.displayVersion, SessionStatus.Running); + + // If the user opted to not check for updates, then don't. + if (!this.sessionSettings.promptToUpdatePowerShell) { return; } + + try { + const localVersion = semver.parse(this.versionDetails.version); + if (semver.lt(localVersion, "6.0.0")) { + // Skip prompting when using Windows PowerShell for now. + return; + } + + // Fetch the latest PowerShell releases from GitHub. + let release: GitHubReleaseInformation; + if (semver.prerelease(localVersion)) { + // This gets all releases and the first one is the latest prerelease if + // there is a prerelease version. + release = await GitHubReleaseInformation.FetchLatestRelease(true); + } else { + release = await GitHubReleaseInformation.FetchLatestRelease(false); + } + + await InvokePowerShellUpdateCheck( + localVersion, this.versionDetails.architecture, release); + } catch (e) { + // best effort. This probably failed to fetch the data from GitHub. + } }); // Send the new LanguageClient to extension features diff --git a/src/settings.ts b/src/settings.ts index c537b3a98d..dabd15c90e 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -79,6 +79,7 @@ export interface ISettings { powerShellAdditionalExePaths?: IPowerShellAdditionalExePathSettings[]; powerShellDefaultVersion?: string; powerShellExePath?: string; + promptToUpdatePowerShell?: boolean; bundledModulesPath?: string; startAutomatically?: boolean; useX86Host?: boolean; @@ -167,6 +168,8 @@ export function load(): ISettings { configuration.get("powerShellDefaultVersion", undefined), powerShellExePath: configuration.get("powerShellExePath", undefined), + promptToUpdatePowerShell: + configuration.get("promptToUpdatePowerShell", true), bundledModulesPath: "../../modules", useX86Host: diff --git a/test/features/UpdatePowerShell.test.ts b/test/features/UpdatePowerShell.test.ts new file mode 100644 index 0000000000..20b02b501f --- /dev/null +++ b/test/features/UpdatePowerShell.test.ts @@ -0,0 +1,22 @@ +/*--------------------------------------------------------- + * Copyright (C) Microsoft Corporation. All rights reserved. + *--------------------------------------------------------*/ + +import * as assert from "assert"; +import { GitHubReleaseInformation } from "../../src/features/UpdatePowerShell"; + +suite("UpdatePowerShell tests", () => { + test("Can get the latest version", async () => { + const release: GitHubReleaseInformation = await GitHubReleaseInformation.FetchLatestRelease(false); + assert.strictEqual(release.isPreview, false, "expected to not be preview."); + assert.strictEqual(release.version.prerelease.length === 0, true, "expected to not have preview in version."); + assert.strictEqual(release.assets.length > 0, true, "expected to have assets."); + }); + + test("Can get the latest preview version", async () => { + const release: GitHubReleaseInformation = await GitHubReleaseInformation.FetchLatestRelease(true); + assert.strictEqual(release.isPreview, true, "expected to be preview."); + assert.strictEqual(release.version.prerelease.length > 0, true, "expected to have preview in version."); + assert.strictEqual(release.assets.length > 0, true, "expected to have assets."); + }); +}); From d7612e99cad77d32beb492f292d4099241a2eaa2 Mon Sep 17 00:00:00 2001 From: Tyler Leonhardt Date: Tue, 30 Jul 2019 22:54:42 -0700 Subject: [PATCH 2/7] address all feedback --- src/features/UpdatePowerShell.ts | 77 ++++++++++++++++++++++---------- src/session.ts | 22 ++++----- 2 files changed, 62 insertions(+), 37 deletions(-) diff --git a/src/features/UpdatePowerShell.ts b/src/features/UpdatePowerShell.ts index 9dd3b10bff..9c4514e876 100644 --- a/src/features/UpdatePowerShell.ts +++ b/src/features/UpdatePowerShell.ts @@ -5,12 +5,13 @@ import fetch from "node-fetch"; import { compare, parse, prerelease, SemVer } from "semver"; import { MessageItem, window } from "vscode"; +import { LanguageClient } from "vscode-languageclient"; import Settings = require("../settings"); import { EvaluateRequestType } from "./Console"; const PowerShellGitHubReleasesUrl = "https://api.github.com/repos/PowerShell/PowerShell/releases/latest"; -const PowerShellGitHubRPrereleasesUrl = +const PowerShellGitHubPrereleasesUrl = "https://api.github.com/repos/PowerShell/PowerShell/releases"; export class GitHubReleaseInformation { @@ -20,8 +21,8 @@ export class GitHubReleaseInformation { if (preview) { // This gets all releases and the first one is the latest prerelease if // there is a prerelease version. - releaseJson = (await fetch(PowerShellGitHubRPrereleasesUrl) - .then((res) => res.json()))[0]; + releaseJson = (await fetch(PowerShellGitHubPrereleasesUrl) + .then((res) => res.json())).find((release: any) => release.prerelease); } else { releaseJson = await fetch(PowerShellGitHubReleasesUrl) .then((res) => res.json()); @@ -51,7 +52,10 @@ interface IUpdateMessageItem extends MessageItem { } export async function InvokePowerShellUpdateCheck( - localVersion: SemVer, arch: string, release: GitHubReleaseInformation) { + languageServerClient: LanguageClient, + localVersion: SemVer, + arch: string, + release: GitHubReleaseInformation) { const options: IUpdateMessageItem[] = [ { id: 0, @@ -59,7 +63,7 @@ export async function InvokePowerShellUpdateCheck( }, { id: 1, - title: "Not now.", + title: "Not now", }, { id: 2, @@ -67,16 +71,33 @@ export async function InvokePowerShellUpdateCheck( }, ]; - if (compare(release.version, localVersion) > 0) { - const result = await window.showInformationMessage( - `You have an old version of PowerShell (${ - localVersion.raw - }). The current latest release is ${ - release.version.raw - }. Would you like to update the version?`, ...options); + // If our local version is up-to-date, we can return early. + if (compare(localVersion, release.version) >= 0) { + return; + } + + const commonText: string = `You have an old version of PowerShell (${ + localVersion.raw + }). The current latest release is ${ + release.version.raw + }.`; + + if (process.platform === "linux") { + await window.showInformationMessage( + `${commonText} We recommend updating to the latest version.`); + return; + } + + const result = await window.showInformationMessage( + `${commonText} Would you like to update the version?`, ...options); + // If the user cancels the notification. + if (!result) { return; } + + // Yes choice. + switch (result.id) { // Yes choice. - if (result.id === 0) { + case 0: let script: string; if (process.platform === "win32") { const msiMatcher = arch === "x86" ? @@ -87,26 +108,36 @@ export async function InvokePowerShellUpdateCheck( // Grab MSI and run it. // tslint:disable-next-line: max-line-length - script = `$tmpMsiPath = Microsoft.PowerShell.Management\\Join-Path ([System.IO.Path]::GetTempPath()) "pwsh.msi"; -Microsoft.PowerShell.Utility\\Invoke-RestMethod -Uri ${assetUrl} -OutFile $tmpMsiPath; -Microsoft.PowerShell.Management\\Invoke-Item $tmpMsiPath;`; + script = ` +$randomFileName = [System.IO.Path]::GetRandomFileName() +$tmpMsiPath = Microsoft.PowerShell.Management\\Join-Path ([System.IO.Path]::GetTempPath()) "$randomFileName.msi" +Microsoft.PowerShell.Utility\\Invoke-RestMethod -Uri ${assetUrl} -OutFile $tmpMsiPath +try +{ + Microsoft.PowerShell.Management\\Start-Process -Wait -Path $tmpMsiPath +} +finally +{ + Microsoft.PowerShell.Management\\Remove-Item $tmpMsiPath +}`; } else if (process.platform === "darwin") { script = "brew cask upgrade powershell"; if (release.isPreview) { script = "brew cask upgrade powershell-preview"; } - } else if (process.platform === "linux") { - window.showWarningMessage( - "Update through VS Code not supported on Linux."); - return; } - await this.languageServerClient.sendRequest(EvaluateRequestType, { + + await languageServerClient.sendRequest(EvaluateRequestType, { expression: script, }); + break; + // Never choice. - } else if (result.id === 2) { + case 2: await Settings.change("promptToUpdatePowerShell", false, true); - } + break; + default: + break; } } diff --git a/src/session.ts b/src/session.ts index 9e494bfaaf..6b295a2c9a 100644 --- a/src/session.ts +++ b/src/session.ts @@ -37,10 +37,6 @@ export enum SessionStatus { } export class SessionManager implements Middleware { - private static PowerShellGitHubReleasesUrl = - "https://api.github.com/repos/PowerShell/PowerShell/releases/latest"; - private static PowerShellGitHubRPrereleasesUrl = - "https://api.github.com/repos/PowerShell/PowerShell/releases"; public HostVersion: string; private ShowSessionMenuCommandName = "PowerShell.ShowSessionMenu"; private editorServicesArgs: string; @@ -614,18 +610,16 @@ export class SessionManager implements Middleware { } // Fetch the latest PowerShell releases from GitHub. - let release: GitHubReleaseInformation; - if (semver.prerelease(localVersion)) { - // This gets all releases and the first one is the latest prerelease if - // there is a prerelease version. - release = await GitHubReleaseInformation.FetchLatestRelease(true); - } else { - release = await GitHubReleaseInformation.FetchLatestRelease(false); - } + const isPreRelease = !!semver.prerelease(localVersion); + const release: GitHubReleaseInformation = + await GitHubReleaseInformation.FetchLatestRelease(isPreRelease); await InvokePowerShellUpdateCheck( - localVersion, this.versionDetails.architecture, release); - } catch (e) { + this.languageServerClient, + localVersion, + this.versionDetails.architecture, + release); + } catch { // best effort. This probably failed to fetch the data from GitHub. } }); From 3fd99cca9cc37f73faf2f77e9365046119ec7ebd Mon Sep 17 00:00:00 2001 From: Tyler Leonhardt Date: Tue, 30 Jul 2019 23:11:04 -0700 Subject: [PATCH 3/7] say homebrew is used --- src/features/UpdatePowerShell.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/features/UpdatePowerShell.ts b/src/features/UpdatePowerShell.ts index 9c4514e876..b7e3fa307b 100644 --- a/src/features/UpdatePowerShell.ts +++ b/src/features/UpdatePowerShell.ts @@ -67,7 +67,7 @@ export async function InvokePowerShellUpdateCheck( }, { id: 2, - title: "Never...", + title: "Don't show me this notification again...", }, ]; @@ -88,8 +88,11 @@ export async function InvokePowerShellUpdateCheck( return; } + const isMacOS: boolean = process.platform === "darwin"; const result = await window.showInformationMessage( - `${commonText} Would you like to update the version?`, ...options); + `${commonText} Would you like to update the version? ${ + isMacOS ? "(Homebrew is required on macOS)" : "" + }`, ...options); // If the user cancels the notification. if (!result) { return; } @@ -121,7 +124,7 @@ finally Microsoft.PowerShell.Management\\Remove-Item $tmpMsiPath }`; - } else if (process.platform === "darwin") { + } else if (isMacOS) { script = "brew cask upgrade powershell"; if (release.isPreview) { script = "brew cask upgrade powershell-preview"; From ba9f72acfecd7a68576c59a7399a5cf6482b2fd9 Mon Sep 17 00:00:00 2001 From: Tyler James Leonhardt Date: Fri, 2 Aug 2019 16:40:49 -0700 Subject: [PATCH 4/7] Feedback Co-Authored-By: Christoph Bergmeister [MVP] --- src/features/UpdatePowerShell.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/features/UpdatePowerShell.ts b/src/features/UpdatePowerShell.ts index b7e3fa307b..5a58a9a072 100644 --- a/src/features/UpdatePowerShell.ts +++ b/src/features/UpdatePowerShell.ts @@ -59,7 +59,7 @@ export async function InvokePowerShellUpdateCheck( const options: IUpdateMessageItem[] = [ { id: 0, - title: "Yes!", + title: "Yes", }, { id: 1, From 83abb628bfca3db77bcd6ae82073e12c2edb9400 Mon Sep 17 00:00:00 2001 From: Tyler James Leonhardt Date: Fri, 2 Aug 2019 16:41:12 -0700 Subject: [PATCH 5/7] Feedback Co-Authored-By: Christoph Bergmeister [MVP] --- src/features/UpdatePowerShell.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/features/UpdatePowerShell.ts b/src/features/UpdatePowerShell.ts index 5a58a9a072..7122ff18b6 100644 --- a/src/features/UpdatePowerShell.ts +++ b/src/features/UpdatePowerShell.ts @@ -67,7 +67,7 @@ export async function InvokePowerShellUpdateCheck( }, { id: 2, - title: "Don't show me this notification again...", + title: "Do not show this notification again", }, ]; From 108c1404bb57d2196dfa4e04735d2eec86a4e573 Mon Sep 17 00:00:00 2001 From: Tyler Leonhardt Date: Mon, 5 Aug 2019 19:51:10 -0700 Subject: [PATCH 6/7] PR feedback --- src/features/UpdatePowerShell.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/features/UpdatePowerShell.ts b/src/features/UpdatePowerShell.ts index b7e3fa307b..31f5d2c8be 100644 --- a/src/features/UpdatePowerShell.ts +++ b/src/features/UpdatePowerShell.ts @@ -3,10 +3,10 @@ *--------------------------------------------------------*/ import fetch from "node-fetch"; -import { compare, parse, prerelease, SemVer } from "semver"; +import * as semver from "semver"; import { MessageItem, window } from "vscode"; import { LanguageClient } from "vscode-languageclient"; -import Settings = require("../settings"); +import * as Settings from "../settings"; import { EvaluateRequestType } from "./Console"; const PowerShellGitHubReleasesUrl = @@ -32,14 +32,14 @@ export class GitHubReleaseInformation { releaseJson.tag_name, releaseJson.assets); } - public version: SemVer; + public version: semver.SemVer; public isPreview: boolean = false; public assets: any[]; - public constructor(version: string | SemVer, assets: any[] = []) { - this.version = parse(version); + public constructor(version: string | semver.SemVer, assets: any[] = []) { + this.version = semver.parse(version); - if (prerelease(this.version)) { + if (semver.prerelease(this.version)) { this.isPreview = true; } @@ -53,7 +53,7 @@ interface IUpdateMessageItem extends MessageItem { export async function InvokePowerShellUpdateCheck( languageServerClient: LanguageClient, - localVersion: SemVer, + localVersion: semver.SemVer, arch: string, release: GitHubReleaseInformation) { const options: IUpdateMessageItem[] = [ @@ -72,7 +72,7 @@ export async function InvokePowerShellUpdateCheck( ]; // If our local version is up-to-date, we can return early. - if (compare(localVersion, release.version) >= 0) { + if (semver.compare(localVersion, release.version) >= 0) { return; } From e56213ac889204911e8fc431dab06dbb5a4a9309 Mon Sep 17 00:00:00 2001 From: Tyler Leonhardt Date: Tue, 20 Aug 2019 18:37:56 -0700 Subject: [PATCH 7/7] use correct url from github api --- src/features/UpdatePowerShell.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/features/UpdatePowerShell.ts b/src/features/UpdatePowerShell.ts index e288fb14ec..ab7caf5a40 100644 --- a/src/features/UpdatePowerShell.ts +++ b/src/features/UpdatePowerShell.ts @@ -107,7 +107,7 @@ export async function InvokePowerShellUpdateCheck( "win-x86.msi" : "win-x64.msi"; const assetUrl = release.assets.filter((asset: any) => - asset.name.indexOf(msiMatcher) >= 0)[0].url; + asset.name.indexOf(msiMatcher) >= 0)[0].browser_download_url; // Grab MSI and run it. // tslint:disable-next-line: max-line-length