From 7081def4a0372186da31d732980568bb51932475 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 28 Mar 2019 09:37:21 +0100 Subject: [PATCH] storage - remove global storage migration --- src/main.js | 16 -- .../storage/node/storageMainService.ts | 212 +----------------- 2 files changed, 2 insertions(+), 226 deletions(-) diff --git a/src/main.js b/src/main.js index 95390941b16..1ced2cec217 100644 --- a/src/main.js +++ b/src/main.js @@ -11,7 +11,6 @@ const lp = require('./vs/base/node/languagePacks'); perf.mark('main:started'); -const fs = require('fs'); const path = require('path'); const bootstrap = require('./bootstrap'); const paths = require('./paths'); @@ -29,21 +28,6 @@ bootstrap.enableASARSupport(); // Set userData path before app 'ready' event and call to process.chdir const args = parseCLIArgs(); const userDataPath = getUserDataPath(args); - -// global storage migration needs to happen very early before app.on("ready") -// TODO@Ben remove after a while -try { - const globalStorageHome = path.join(userDataPath, 'User', 'globalStorage', 'state.vscdb'); - const localStorageHome = path.join(userDataPath, 'Local Storage'); - const localStorageDB = path.join(localStorageHome, 'file__0.localstorage'); - const localStorageDBBackup = path.join(localStorageHome, 'file__0.vscmig'); - if (!fs.existsSync(globalStorageHome) && fs.existsSync(localStorageDB)) { - fs.renameSync(localStorageDB, localStorageDBBackup); - } -} catch (error) { - console.error(error); -} - app.setPath('userData', userDataPath); // Update cwd based on environment and platform diff --git a/src/vs/platform/storage/node/storageMainService.ts b/src/vs/platform/storage/node/storageMainService.ts index 9845da1cd2f..828fcf6c31b 100644 --- a/src/vs/platform/storage/node/storageMainService.ts +++ b/src/vs/platform/storage/node/storageMainService.ts @@ -10,9 +10,7 @@ import { ILogService, LogLevel } from 'vs/platform/log/common/log'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IStorage, Storage, SQLiteStorageDatabase, ISQLiteStorageDatabaseLoggingOptions, InMemoryStorageDatabase } from 'vs/base/node/storage'; import { join } from 'vs/base/common/path'; -import { exists, readdir } from 'vs/base/node/pfs'; -import { Database } from 'vscode-sqlite3'; -import { endsWith, startsWith } from 'vs/base/common/strings'; +import { exists } from 'vs/base/node/pfs'; export const IStorageMainService = createDecorator('storageMainService'); @@ -140,213 +138,7 @@ export class StorageMainService extends Disposable implements IStorageMainServic this._register(this.storage.onDidChangeStorage(key => this._onDidChangeStorage.fire({ key }))); - return this.storage.init().then(() => { - - // Migrate storage if this is the first start and we are not using in-memory - let migrationPromise: Promise; - if (!useInMemoryStorage && !exists) { - // TODO@Ben remove global storage migration and move Storage creation back to ctor - migrationPromise = this.migrateGlobalStorage().then(() => this.logService.info('[storage] migrated global storage'), error => this.logService.error(`[storage] migration error ${error}`)); - } else { - migrationPromise = Promise.resolve(); - } - - return migrationPromise; - }); - }); - } - - private migrateGlobalStorage(): Promise { - this.logService.info('[storage] migrating global storage from localStorage into SQLite'); - - const localStorageDBBackup = join(this.environmentService.userDataPath, 'Local Storage', 'file__0.vscmig'); - - return exists(localStorageDBBackup).then(exists => { - if (!exists) { - return Promise.resolve(); // return if there is no DB to migrate from - } - - return readdir(this.environmentService.extensionsPath).then(extensions => { - const supportedKeys = new Map(); - [ - 'editorFontInfo', - 'peekViewLayout', - 'expandSuggestionDocs', - 'extensionsIdentifiers/disabled', - 'integrityService', - 'telemetry.lastSessionDate', - 'telemetry.instanceId', - 'telemetry.firstSessionDate', - 'workbench.sidebar.width', - 'workbench.panel.width', - 'workbench.panel.height', - 'workbench.panel.sizeBeforeMaximized', - 'workbench.activity.placeholderViewlets', - 'colorThemeData', - 'iconThemeData', - 'workbench.telemetryOptOutShown', - 'workbench.hide.welcome', - 'releaseNotes/lastVersion', - 'debug.actionswidgetposition', - 'debug.actionswidgety', - 'editor.neverPromptForLargeFiles', - 'menubar/electronFixRecommended', - 'learnMoreDirtyWriteError', - 'extensions.ignoredAutoUpdateExtension', - 'askToInstallRemoteServerExtension', - 'hasNotifiedOfSettingsAutosave', - 'commandPalette.mru.cache', - 'commandPalette.mru.counter', - 'parts-splash-data', - 'terminal.integrated.neverMeasureRenderTime', - 'terminal.integrated.neverSuggestSelectWindowsShell', - 'memento/workbench.parts.editor', - 'memento/workbench.view.search', - 'langugage.update.donotask', - 'extensionsAssistant/languagePackSuggestionIgnore', - 'workbench.panel.pinnedPanels', - 'workbench.activity.pinnedViewlets', - 'extensionsAssistant/ignored_recommendations', - 'extensionsAssistant/recommendations', - 'extensionsAssistant/importantRecommendationsIgnore', - 'extensionsAssistant/fileExtensionsSuggestionIgnore', - 'nps/skipVersion', - 'nps/lastSessionDate', - 'nps/sessionCount', - 'nps/isCandidate', - 'allExperiments', - 'currentOrPreviouslyRunExperiments', - 'update/win32-64bits', - 'update/win32-fast-updates', - 'update/lastKnownVersion', - 'update/updateNotificationTime' - ].forEach(key => supportedKeys.set(key.toLowerCase(), key)); - - // https://github.com/Microsoft/vscode/issues/68468 - const wellKnownPublishers = ['Microsoft', 'GitHub']; - const wellKnownExtensions = ['ms-vscode.Go', 'WallabyJs.quokka-vscode', 'Telerik.nativescript', 'Shan.code-settings-sync', 'ritwickdey.LiveServer', 'PKief.material-icon-theme', 'PeterJausovec.vscode-docker', 'ms-vscode.PowerShell', 'LaurentTreguier.vscode-simple-icons', 'KnisterPeter.vscode-github', 'DotJoshJohnson.xml', 'Dart-Code.dart-code', 'alefragnani.Bookmarks']; - - // Support extension storage as well (always the ID of the extension) - extensions.forEach(extension => { - let extensionId: string; - if (extension.indexOf('-') >= 0) { - extensionId = extension.substring(0, extension.lastIndexOf('-')); // convert "author.extension-0.2.5" => "author.extension" - } else { - extensionId = extension; - } - - if (extensionId) { - for (let i = 0; i < wellKnownPublishers.length; i++) { - const publisher = wellKnownPublishers[i]; - if (startsWith(extensionId, `${publisher.toLowerCase()}.`)) { - extensionId = `${publisher}${extensionId.substr(publisher.length)}`; - break; - } - } - - for (let j = 0; j < wellKnownExtensions.length; j++) { - const wellKnownExtension = wellKnownExtensions[j]; - if (extensionId === wellKnownExtension.toLowerCase()) { - extensionId = wellKnownExtension; - break; - } - } - - supportedKeys.set(extensionId.toLowerCase(), extensionId); - } - }); - - return import('vscode-sqlite3').then(sqlite3 => { - - return new Promise((resolve, reject) => { - const handleSuffixKey = (row: any, key: string, suffix: string) => { - if (endsWith(key, suffix.toLowerCase())) { - const value: string = row.value.toString('utf16le'); - const normalizedKey = key.substring(0, key.length - suffix.length) + suffix; - - this.store(normalizedKey, value); - - return true; - } - - return false; - }; - - const db: Database = new (sqlite3.Database)(localStorageDBBackup, error => { - if (error) { - if (db) { - db.close(); - } - - return reject(error); - } - - db.all('SELECT key, value FROM ItemTable', (error, rows) => { - if (error) { - db.close(); - - return reject(error); - } - - try { - rows.forEach(row => { - let key: string = row.key; - if (key.indexOf('storage://global/') !== 0) { - return; // not a global key - } - - // convert storage://global/colorthemedata => colorthemedata - key = key.substr('storage://global/'.length); - - const supportedKey = supportedKeys.get(key); - if (supportedKey) { - const value: string = row.value.toString('utf16le'); - - this.store(supportedKey, value); - } - - // dynamic values - else if ( - endsWith(key, '.hidden') || - startsWith(key, 'experiments.') - ) { - const value: string = row.value.toString('utf16le'); - - this.store(key, value); - } - - // fix lowercased ".sessionCount" - else if (handleSuffixKey(row, key, '.sessionCount')) { } - - // fix lowercased ".lastSessionDate" - else if (handleSuffixKey(row, key, '.lastSessionDate')) { } - - // fix lowercased ".skipVersion" - else if (handleSuffixKey(row, key, '.skipVersion')) { } - - // fix lowercased ".isCandidate" - else if (handleSuffixKey(row, key, '.isCandidate')) { } - - // fix lowercased ".editedCount" - else if (handleSuffixKey(row, key, '.editedCount')) { } - - // fix lowercased ".editedDate" - else if (handleSuffixKey(row, key, '.editedDate')) { } - }); - - db.close(); - } catch (error) { - db.close(); - - return reject(error); - } - - resolve(); - }); - }); - }); - }); - }); + return this.storage.init(); }); } -- GitLab