diff --git a/extensions/notebook/extension.webpack.config.js b/extensions/notebook/extension.webpack.config.js index 949cfb6824..087525ff62 100644 --- a/extensions/notebook/extension.webpack.config.js +++ b/extensions/notebook/extension.webpack.config.js @@ -12,7 +12,8 @@ const fs = require('fs'); const path = require('path'); const externals = { - 'node-fetch': 'commonjs node-fetch' + 'node-fetch': 'commonjs node-fetch', + 'adm-zip': 'commonjs adm-zip' }; // conditionally add ws if we are going to be running in a node environment diff --git a/extensions/notebook/package.json b/extensions/notebook/package.json index a67f60cb8f..a0a2f802a3 100644 --- a/extensions/notebook/package.json +++ b/extensions/notebook/package.json @@ -480,6 +480,9 @@ }, "dependencies": { "@jupyterlab/services": "^3.2.1", + "@types/adm-zip": "^0.4.32", + "@types/tar": "^4.0.3", + "adm-zip": "^0.4.14", "error-ex": "^1.3.1", "fast-glob": "^3.0.4", "figures": "^2.0.0", @@ -487,6 +490,7 @@ "glob": "^7.1.1", "node-fetch": "^2.3.0", "request": "^2.88.0", + "tar": "^6.0.1", "temp-write": "^3.4.0", "vscode-languageclient": "^5.3.0-next.1", "vscode-nls": "^4.0.0", diff --git a/extensions/notebook/src/jupyter/jupyterServerInstallation.ts b/extensions/notebook/src/jupyter/jupyterServerInstallation.ts index 340b132e41..0082a40dd5 100644 --- a/extensions/notebook/src/jupyter/jupyterServerInstallation.ts +++ b/extensions/notebook/src/jupyter/jupyterServerInstallation.ts @@ -8,8 +8,9 @@ import * as path from 'path'; import * as nls from 'vscode-nls'; import * as azdata from 'azdata'; import { ExecOptions } from 'child_process'; -// import * as decompress from 'decompress'; import * as request from 'request'; +import * as zip from 'adm-zip'; +import * as tar from 'tar'; import { ApiWrapper } from '../common/apiWrapper'; import * as constants from '../common/constants'; @@ -22,7 +23,7 @@ import CodeAdapter from '../prompts/adapter'; const localize = nls.loadMessageBundle(); const msgInstallPkgProgress = localize('msgInstallPkgProgress', "Notebook dependencies installation is in progress"); -// const msgPythonDownloadComplete = localize('msgPythonDownloadComplete', "Python download is complete"); +const msgPythonDownloadComplete = localize('msgPythonDownloadComplete', "Python download is complete"); const msgPythonDownloadError = localize('msgPythonDownloadError', "Error while downloading python setup"); const msgPythonDownloadPending = localize('msgPythonDownloadPending', "Downloading python package"); const msgPythonUnpackPending = localize('msgPythonUnpackPending', "Unpacking python package"); @@ -229,22 +230,42 @@ export class JupyterServerInstallation implements IJupyterServerInstallation { return reject(err); } } - // decompress(pythonPackagePathLocal, installPath).then(files => { - // //Delete zip/tar file - // fs.unlink(pythonPackagePathLocal, (err) => { - // if (err) { - // backgroundOperation.updateStatus(azdata.TaskStatus.InProgress, msgPythonUnpackError); - // reject(err); - // } - // }); + if (utils.getOSPlatform() === utils.Platform.Windows) { + try { + let zippedFile = new zip(pythonPackagePathLocal); + zippedFile.extractAllTo(installPath); + } catch (err) { + backgroundOperation.updateStatus(azdata.TaskStatus.InProgress, msgPythonUnpackError); + reject(err); + } + // Delete zip file + fs.unlink(pythonPackagePathLocal, (err) => { + if (err) { + backgroundOperation.updateStatus(azdata.TaskStatus.InProgress, msgPythonUnpackError); + reject(err); + } + }); - // outputChannel.appendLine(msgPythonDownloadComplete); - // backgroundOperation.updateStatus(azdata.TaskStatus.InProgress, msgPythonDownloadComplete); - // resolve(); - // }).catch(err => { - // backgroundOperation.updateStatus(azdata.TaskStatus.InProgress, msgPythonUnpackError); - // reject(err); - // }); + outputChannel.appendLine(msgPythonDownloadComplete); + backgroundOperation.updateStatus(azdata.TaskStatus.InProgress, msgPythonDownloadComplete); + resolve(); + } else { + tar.extract({ file: pythonPackagePathLocal, cwd: installPath }).then(() => { + // Delete tar file + fs.unlink(pythonPackagePathLocal, (err) => { + if (err) { + backgroundOperation.updateStatus(azdata.TaskStatus.InProgress, msgPythonUnpackError); + reject(err); + } + }); + outputChannel.appendLine(msgPythonDownloadComplete); + backgroundOperation.updateStatus(azdata.TaskStatus.InProgress, msgPythonDownloadComplete); + resolve(); + }).catch(err => { + backgroundOperation.updateStatus(azdata.TaskStatus.InProgress, msgPythonUnpackError); + reject(err); + }); + } }) .on('error', (downloadError) => { backgroundOperation.updateStatus(azdata.TaskStatus.InProgress, msgPythonDownloadError); diff --git a/extensions/notebook/yarn.lock b/extensions/notebook/yarn.lock index 272fcf4bc3..97b898627c 100644 --- a/extensions/notebook/yarn.lock +++ b/extensions/notebook/yarn.lock @@ -101,6 +101,13 @@ dependencies: "@phosphor/algorithm" "^1.1.2" +"@types/adm-zip@^0.4.32": + version "0.4.32" + resolved "https://registry.yarnpkg.com/@types/adm-zip/-/adm-zip-0.4.32.tgz#6de01309af60677065d2e52b417a023303220931" + integrity sha512-hv1O7ySn+XvP5OeDQcJFWwVb2v+GFGO1A9aMTQ5B/bzxb7WW21O8iRhVdsKKr8QwuiagzGmPP+gsUAYZ6bRddQ== + dependencies: + "@types/node" "*" + "@types/caseless@*": version "0.12.2" resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.2.tgz#f65d3d6389e01eeb458bd54dc8f52b95a9463bc8" @@ -144,6 +151,13 @@ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== +"@types/minipass@*": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@types/minipass/-/minipass-2.2.0.tgz#51ad404e8eb1fa961f75ec61205796807b6f9651" + integrity sha512-wuzZksN4w4kyfoOv/dlpov4NOunwutLA/q7uc00xU02ZyUY+aoM5PWIXEKBMnm0NHd4a+N71BMjq+x7+2Af1fg== + dependencies: + "@types/node" "*" + "@types/mocha@^5.2.5": version "5.2.6" resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.6.tgz#b8622d50557dd155e9f2f634b7d68fd38de5e94b" @@ -177,6 +191,14 @@ "@types/glob" "*" "@types/node" "*" +"@types/tar@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/tar/-/tar-4.0.3.tgz#e2cce0b8ff4f285293243f5971bd7199176ac489" + integrity sha512-Z7AVMMlkI8NTWF0qGhC4QIX0zkV/+y0J8x7b/RsHrN0310+YNjoJd8UrApCiGBCWtKjxS9QhNqLi2UJNToh5hA== + dependencies: + "@types/minipass" "*" + "@types/node" "*" + "@types/temp-write@^3.3.0": version "3.3.0" resolved "https://registry.yarnpkg.com/@types/temp-write/-/temp-write-3.3.0.tgz#40fe3d1fae6e98a2e40a13abe83e7a1996ea51ee" @@ -206,6 +228,11 @@ abbrev@1.0.x: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" integrity sha1-kbR5JYinc4wl813W9jdSovh3YTU= +adm-zip@^0.4.14: + version "0.4.14" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.14.tgz#2cf312bcc9f8875df835b0f6040bd89be0a727a9" + integrity sha512-/9aQCnQHF+0IiCl0qhXoK7qs//SwYE7zX8lsr/DNk1BRAHYxeLZPL4pguwK29gUEqasYQjqPtEpDRSWEkdHn9g== + ajv@^6.5.5: version "6.9.1" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.9.1.tgz#a4d3683d74abc5670e75f0b16520f70a20ea8dc1" @@ -380,6 +407,11 @@ charenc@~0.0.1: resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= +chownr@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + circular-json@^0.3.1: version "0.3.3" resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" @@ -619,6 +651,13 @@ fs-extra@^5.0.0: jsonfile "^4.0.0" universalify "^0.1.0" +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -983,6 +1022,21 @@ minimist@~1.2.0: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= +minipass@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.1.tgz#7607ce778472a185ad6d89082aa2070f79cedcd5" + integrity sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w== + dependencies: + yallist "^4.0.0" + +minizlib@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.0.tgz#fd52c645301ef09a63a2c209697c294c6ce02cf3" + integrity sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" @@ -990,6 +1044,11 @@ mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@~0.5.1: dependencies: minimist "0.0.8" +mkdirp@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.3.tgz#4cf2e30ad45959dddea53ad97d518b6c8205e1ea" + integrity sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g== + mocha-junit-reporter@^1.17.0: version "1.18.0" resolved "https://registry.yarnpkg.com/mocha-junit-reporter/-/mocha-junit-reporter-1.18.0.tgz#9209a3fba30025ae3ae5e6bfe7f9c5bc3c2e8ee2" @@ -1361,6 +1420,18 @@ supports-color@^3.1.0: dependencies: has-flag "^1.0.0" +tar@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.0.1.tgz#7b3bd6c313cb6e0153770108f8d70ac298607efa" + integrity sha512-bKhKrrz2FJJj5s7wynxy/fyxpE0CmCjmOQ1KV4KkgXFWOgoIT/NbTMnB1n+LFNrNk0SSBVGGxcK5AGsyC+pW5Q== + dependencies: + chownr "^1.1.3" + fs-minipass "^2.0.0" + minipass "^3.0.0" + minizlib "^2.1.0" + mkdirp "^1.0.3" + yallist "^4.0.0" + temp-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" @@ -1568,3 +1639,8 @@ xtend@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==