From 6f3d2666f8dcfd8cfcecbbb58d00691967c39a77 Mon Sep 17 00:00:00 2001 From: Opender Singh Date: Fri, 26 Feb 2021 12:01:46 +1300 Subject: [PATCH] Add option to disable migrating workspaces (#3108) --- .../app/common/migrate-from-designer.js | 74 ++++++++++--------- .../app/ui/components/wrapper-migration.js | 44 ++++++++--- .../components/toggle-switch.js | 2 +- .../core/migration.test.js | 6 ++ .../insomnia-smoke-test/modules/migration.js | 27 +++++-- 5 files changed, 100 insertions(+), 53 deletions(-) diff --git a/packages/insomnia-app/app/common/migrate-from-designer.js b/packages/insomnia-app/app/common/migrate-from-designer.js index 23cf424012..3918c596f1 100644 --- a/packages/insomnia-app/app/common/migrate-from-designer.js +++ b/packages/insomnia-app/app/common/migrate-from-designer.js @@ -58,7 +58,7 @@ type DBType = { [string]: Array }; export type MigrationOptions = { useDesignerSettings: boolean, copyPlugins: boolean, - copyResponses: boolean, + copyWorkspaces: boolean, designerDataDir: string, coreDataDir: string, }; @@ -149,13 +149,32 @@ export default async function migrateFromDesigner({ designerDataDir, coreDataDir, copyPlugins, - copyResponses, + copyWorkspaces, }: MigrationOptions): Promise { - const modelTypesToIgnore = [ + console.log( + `[db-merge] starting process for migrating from ${designerDataDir} to ${coreDataDir}`, + ); + + const nonWorkspaceModels = [ models.stats.type, // TODO: investigate further any implications that may invalidate collected stats + models.settings.type, ]; - const modelTypesToMerge = difference(models.types(), modelTypesToIgnore); + // Every model except those to ignore and settings is a "workspace" model + const workspaceModels = difference(models.types(), nonWorkspaceModels); + + const modelTypesToMerge = []; + + if (useDesignerSettings) { + modelTypesToMerge.push(models.settings.type); + console.log(`[db-merge] keeping settings from Insomnia Designer`); + } else { + console.log(`[db-merge] keeping settings from Insomnia Core`); + } + + if (copyWorkspaces) { + modelTypesToMerge.push(...workspaceModels); + } let backupDir = ''; @@ -166,36 +185,23 @@ export default async function migrateFromDesigner({ // Load designer database const designerDb: DBType = await loadDesignerDb(modelTypesToMerge, designerDataDir); - // Ensure user is not migrating an existing Insomnia Core repo - const designerSettings: Settings = designerDb[models.settings.type][0]; - if (designerSettings.hasOwnProperty('hasPromptedToMigrateFromDesigner')) { - console.log('[db-merge] cannot merge database'); - return; - } - // For each model, batch upsert entries into the Core database for (const modelType of modelTypesToMerge) { const entries = designerDb[modelType]; - // Decide how to merge settings + // Persist some settings from core if (modelType === models.settings.type) { - if (useDesignerSettings) { - console.log(`[db-merge] keeping settings from Insomnia Designer`); - const coreSettings = await models.settings.getOrCreate(); - const propertiesToPersist = [ - '_id', - 'hasPromptedOnboarding', - 'hasPromptedToMigrateFromDesigner', - ]; - propertiesToPersist.forEach(s => { - if (coreSettings.hasOwnProperty(s)) { - (entries[0]: Settings)[s] = coreSettings[s]; - } - }); - } else { - console.log(`[db-merge] keeping settings from Insomnia Core`); - continue; - } + const coreSettings = await models.settings.getOrCreate(); + const propertiesToPersist = [ + '_id', + 'hasPromptedOnboarding', + 'hasPromptedToMigrateFromDesigner', + ]; + propertiesToPersist.forEach(s => { + if (coreSettings.hasOwnProperty(s)) { + (entries[0]: Settings)[s] = coreSettings[s]; + } + }); } // For each workspace coming from Designer, mark workspace.scope as 'designer' @@ -212,21 +218,17 @@ export default async function migrateFromDesigner({ await db.batchModifyDocs({ upsert: entries, remove: [] }); } - console.log(`[db-merge] migrating version control data from designer to core`); - await copyDirs(['version-control'], designerDataDir, coreDataDir); + if (copyWorkspaces) { + console.log(`[db-merge] migrating version control data from designer to core`); + await copyDirs(['version-control'], designerDataDir, coreDataDir); - if (copyResponses) { console.log(`[db-merge] migrating response cache from designer to core`); await copyDirs(['responses'], designerDataDir, coreDataDir); - } else { - console.log(`[db-merge] not migrating response cache`); } if (copyPlugins) { console.log(`[db-merge] migrating plugins from designer to core`); await migratePlugins(designerDataDir, coreDataDir); - } else { - console.log(`[db-merge] not migrating plugins`); } console.log('[db-merge] done!'); diff --git a/packages/insomnia-app/app/ui/components/wrapper-migration.js b/packages/insomnia-app/app/ui/components/wrapper-migration.js index a9ce0984cd..931950b25b 100644 --- a/packages/insomnia-app/app/ui/components/wrapper-migration.js +++ b/packages/insomnia-app/app/ui/components/wrapper-migration.js @@ -9,6 +9,7 @@ import { getDataDirectory, getDesignerDataDir } from '../../common/misc'; import { useDispatch } from 'react-redux'; import OnboardingContainer from './onboarding-container'; import { goToNextActivity } from '../redux/modules/global'; +import HelpTooltip from './help-tooltip'; type Step = 'options' | 'migrating' | 'results'; @@ -16,7 +17,9 @@ type SettingProps = { label: string, name: $Keys, options: MigrationOptions, + help?: string, }; + type TextSettingProps = SettingProps & { handleChange: (SyntheticEvent) => void, }; @@ -38,17 +41,27 @@ const TextSetting = ({ handleChange, label, name, options }: TextSettingProps) = type BooleanSettingProps = SettingProps & { handleChange: (boolean, Object, string) => void, }; -const BooleanSetting = ({ handleChange, label, name, options }: BooleanSettingProps) => { +const BooleanSetting = ({ handleChange, label, name, options, help }: BooleanSettingProps) => { if (!options.hasOwnProperty(name)) { throw new Error(`Invalid text setting name ${name}`); } + const labelNode = React.useMemo( + () => ( + <> + {label} + {help && {help}} + + ), + [help, label], + ); + return ( ); @@ -58,8 +71,8 @@ type OptionsProps = { start: MigrationOptions => void, cancel: () => void }; const Options = ({ start, cancel }: OptionsProps) => { const [options, setOptions] = React.useState(() => ({ useDesignerSettings: false, - copyResponses: true, - copyPlugins: true, + copyWorkspaces: false, + copyPlugins: false, designerDataDir: getDesignerDataDir(), coreDataDir: getDataDirectory(), })); @@ -72,6 +85,8 @@ const Options = ({ start, cancel }: OptionsProps) => { setOptions(prevOpts => ({ ...prevOpts, [id]: checked })); }, []); + const canStart = options.useDesignerSettings || options.copyWorkspaces || options.copyPlugins; + return ( <>

@@ -83,22 +98,29 @@ const Options = ({ start, cancel }: OptionsProps) => {

Advanced options @@ -118,7 +140,11 @@ const Options = ({ start, cancel }: OptionsProps) => {
-