mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-17 02:51:36 -05:00
Show a background task when upgrading python packages. (#7649)
This commit is contained in:
@@ -109,9 +109,7 @@ export class JupyterServerInstallation {
|
|||||||
try {
|
try {
|
||||||
await this.installPythonPackage(backgroundOperation);
|
await this.installPythonPackage(backgroundOperation);
|
||||||
|
|
||||||
if (this._usingConda) {
|
if (this._usingExistingPython) {
|
||||||
await this.upgradeCondaPackages(false, forceInstall);
|
|
||||||
} else if (this._usingExistingPython) {
|
|
||||||
await this.upgradePythonPackages(false, forceInstall);
|
await this.upgradePythonPackages(false, forceInstall);
|
||||||
} else {
|
} else {
|
||||||
await this.installOfflinePipDependencies();
|
await this.installOfflinePipDependencies();
|
||||||
@@ -391,77 +389,49 @@ export class JupyterServerInstallation {
|
|||||||
* Prompts user to upgrade certain python packages if they're below the minimum expected version.
|
* Prompts user to upgrade certain python packages if they're below the minimum expected version.
|
||||||
*/
|
*/
|
||||||
public promptForPackageUpgrade(): Promise<void> {
|
public promptForPackageUpgrade(): Promise<void> {
|
||||||
if (this._usingConda) {
|
|
||||||
return this.upgradeCondaPackages(true, false);
|
|
||||||
} else {
|
|
||||||
return this.upgradePythonPackages(true, false);
|
return this.upgradePythonPackages(true, false);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
private async upgradePythonPackages(promptForUpgrade: boolean, forceInstall: boolean): Promise<void> {
|
private async upgradePythonPackages(promptForUpgrade: boolean, forceInstall: boolean): Promise<void> {
|
||||||
let installedPackages = await this.getInstalledPipPackages();
|
let expectedCondaPackages: PythonPkgDetails[];
|
||||||
let pkgVersionMap = new Map<string, string>();
|
let expectedPipPackages: PythonPkgDetails[];
|
||||||
installedPackages.forEach(pkg => pkgVersionMap.set(pkg.name, pkg.version));
|
if (this._usingConda) {
|
||||||
|
expectedCondaPackages = this._expectedCondaPackages;
|
||||||
let packagesToInstall: PythonPkgDetails[];
|
expectedPipPackages = this._expectedCondaPipPackages;
|
||||||
if (forceInstall) {
|
|
||||||
packagesToInstall = this._expectedPythonPackages;
|
|
||||||
} else {
|
} else {
|
||||||
packagesToInstall = [];
|
expectedCondaPackages = [];
|
||||||
this._expectedPythonPackages.forEach(expectedPkg => {
|
expectedPipPackages = this._expectedPythonPackages;
|
||||||
let installedPkgVersion = pkgVersionMap.get(expectedPkg.name);
|
|
||||||
if (!installedPkgVersion || utils.comparePackageVersions(installedPkgVersion, expectedPkg.version) < 0) {
|
|
||||||
packagesToInstall.push(expectedPkg);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (packagesToInstall.length > 0) {
|
let condaPackagesToInstall: PythonPkgDetails[];
|
||||||
let doUpgrade: boolean;
|
let pipPackagesToInstall: PythonPkgDetails[];
|
||||||
if (promptForUpgrade) {
|
|
||||||
doUpgrade = await this._prompter.promptSingle<boolean>(<IQuestion>{
|
|
||||||
type: QuestionTypes.confirm,
|
|
||||||
message: localize('confirmPipUpgrade', "Some installed pip packages need to be upgraded. Would you like to upgrade them now?"),
|
|
||||||
default: true
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
doUpgrade = true;
|
|
||||||
}
|
|
||||||
if (doUpgrade) {
|
|
||||||
await this.installPipPackages(packagesToInstall, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private async upgradeCondaPackages(promptForUpgrade: boolean, forceInstall: boolean): Promise<void> {
|
|
||||||
let condaPackagesToInstall: PythonPkgDetails[] = [];
|
|
||||||
let pipPackagesToInstall: PythonPkgDetails[] = [];
|
|
||||||
|
|
||||||
if (forceInstall) {
|
if (forceInstall) {
|
||||||
condaPackagesToInstall = this._expectedCondaPackages;
|
condaPackagesToInstall = expectedCondaPackages;
|
||||||
pipPackagesToInstall = this._expectedCondaPipPackages;
|
pipPackagesToInstall = expectedPipPackages;
|
||||||
} else {
|
} else {
|
||||||
condaPackagesToInstall = [];
|
condaPackagesToInstall = [];
|
||||||
pipPackagesToInstall = [];
|
pipPackagesToInstall = [];
|
||||||
|
|
||||||
// Conda packages
|
// Conda packages
|
||||||
|
if (this._usingConda) {
|
||||||
let installedCondaPackages = await this.getInstalledCondaPackages();
|
let installedCondaPackages = await this.getInstalledCondaPackages();
|
||||||
let condaVersionMap = new Map<string, string>();
|
let condaVersionMap = new Map<string, string>();
|
||||||
installedCondaPackages.forEach(pkg => condaVersionMap.set(pkg.name, pkg.version));
|
installedCondaPackages.forEach(pkg => condaVersionMap.set(pkg.name, pkg.version));
|
||||||
|
|
||||||
this._expectedCondaPackages.forEach(expectedPkg => {
|
expectedCondaPackages.forEach(expectedPkg => {
|
||||||
let installedPkgVersion = condaVersionMap.get(expectedPkg.name);
|
let installedPkgVersion = condaVersionMap.get(expectedPkg.name);
|
||||||
if (!installedPkgVersion || utils.comparePackageVersions(installedPkgVersion, expectedPkg.version) < 0) {
|
if (!installedPkgVersion || utils.comparePackageVersions(installedPkgVersion, expectedPkg.version) < 0) {
|
||||||
condaPackagesToInstall.push(expectedPkg);
|
condaPackagesToInstall.push(expectedPkg);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// Pip packages
|
// Pip packages
|
||||||
let installedPipPackages = await this.getInstalledPipPackages();
|
let installedPipPackages = await this.getInstalledPipPackages();
|
||||||
let pipVersionMap = new Map<string, string>();
|
let pipVersionMap = new Map<string, string>();
|
||||||
installedPipPackages.forEach(pkg => pipVersionMap.set(pkg.name, pkg.version));
|
installedPipPackages.forEach(pkg => pipVersionMap.set(pkg.name, pkg.version));
|
||||||
|
|
||||||
this._expectedCondaPipPackages.forEach(expectedPkg => {
|
expectedPipPackages.forEach(expectedPkg => {
|
||||||
let installedPkgVersion = pipVersionMap.get(expectedPkg.name);
|
let installedPkgVersion = pipVersionMap.get(expectedPkg.name);
|
||||||
if (!installedPkgVersion || utils.comparePackageVersions(installedPkgVersion, expectedPkg.version) < 0) {
|
if (!installedPkgVersion || utils.comparePackageVersions(installedPkgVersion, expectedPkg.version) < 0) {
|
||||||
pipPackagesToInstall.push(expectedPkg);
|
pipPackagesToInstall.push(expectedPkg);
|
||||||
@@ -474,15 +444,51 @@ export class JupyterServerInstallation {
|
|||||||
if (promptForUpgrade) {
|
if (promptForUpgrade) {
|
||||||
doUpgrade = await this._prompter.promptSingle<boolean>(<IQuestion>{
|
doUpgrade = await this._prompter.promptSingle<boolean>(<IQuestion>{
|
||||||
type: QuestionTypes.confirm,
|
type: QuestionTypes.confirm,
|
||||||
message: localize('confirmCondaUpgrade', "Some installed conda and pip packages need to be upgraded. Would you like to upgrade them now?"),
|
message: localize('confirmPackageUpgrade', "Some installed python packages need to be upgraded. Would you like to upgrade them now?"),
|
||||||
default: true
|
default: true
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
doUpgrade = true;
|
doUpgrade = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (doUpgrade) {
|
if (doUpgrade) {
|
||||||
|
let installPromise = new Promise(async resolve => {
|
||||||
|
if (this._usingConda) {
|
||||||
await this.installCondaPackages(condaPackagesToInstall, true);
|
await this.installCondaPackages(condaPackagesToInstall, true);
|
||||||
|
}
|
||||||
await this.installPipPackages(pipPackagesToInstall, true);
|
await this.installPipPackages(pipPackagesToInstall, true);
|
||||||
|
resolve();
|
||||||
|
});
|
||||||
|
|
||||||
|
if (promptForUpgrade) {
|
||||||
|
let packagesStr = condaPackagesToInstall.concat(pipPackagesToInstall).map(pkg => {
|
||||||
|
return `${pkg.name}>=${pkg.version}`;
|
||||||
|
}).join(' ');
|
||||||
|
let taskName = localize('upgradePackages.pipInstall',
|
||||||
|
"Installing {0}",
|
||||||
|
packagesStr);
|
||||||
|
|
||||||
|
let backgroundTaskComplete = new Deferred<void>();
|
||||||
|
this.apiWrapper.startBackgroundOperation({
|
||||||
|
displayName: taskName,
|
||||||
|
description: taskName,
|
||||||
|
isCancelable: false,
|
||||||
|
operation: async op => {
|
||||||
|
try {
|
||||||
|
await installPromise;
|
||||||
|
op.updateStatus(azdata.TaskStatus.Succeeded);
|
||||||
|
backgroundTaskComplete.resolve();
|
||||||
|
} catch (err) {
|
||||||
|
let errorMsg = utils.getErrorMessage(err);
|
||||||
|
op.updateStatus(azdata.TaskStatus.Failed, errorMsg);
|
||||||
|
backgroundTaskComplete.reject(errorMsg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
await backgroundTaskComplete.promise;
|
||||||
|
} else {
|
||||||
|
await installPromise;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user