From c2242e46c24def201b2a5d3eff26f429391543c1 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Wed, 23 Mar 2016 10:31:26 +0100 Subject: [PATCH 1/5] =?UTF-8?q?Read=20state=20from=20StorageFolder=20when?= =?UTF-8?q?=20it=20can=E2=80=99t=20be=20found=20in=20StateStore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- spec/atom-environment-spec.coffee | 28 ++++++++++++++++++++++++++++ src/atom-environment.coffee | 11 ++++++++++- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/spec/atom-environment-spec.coffee b/spec/atom-environment-spec.coffee index 3283b63d6..2ba0164e6 100644 --- a/spec/atom-environment-spec.coffee +++ b/spec/atom-environment-spec.coffee @@ -4,6 +4,7 @@ temp = require 'temp' Package = require '../src/package' ThemeManager = require '../src/theme-manager' AtomEnvironment = require '../src/atom-environment' +StorageFolder = require '../src/storage-folder' describe "AtomEnvironment", -> describe 'window sizing methods', -> @@ -179,6 +180,33 @@ describe "AtomEnvironment", -> atom.loadState().then (state) -> expect(state).toEqual({stuff: 'cool'}) + it "loads state from the storage folder when it can't be found in atom.stateStore", -> + jasmine.useRealClock() + + storageFolderState = {foo: 1, bar: 2} + serializedState = {someState: 42} + loadSettings = _.extend(atom.getLoadSettings(), {initialPaths: [temp.mkdirSync("project-directory")]}) + spyOn(atom, 'getLoadSettings').andReturn(loadSettings) + spyOn(atom, 'serialize').andReturn(serializedState) + spyOn(atom, 'getConfigDirPath').andReturn(temp.mkdirSync("config-directory")) + atom.project.setPaths(atom.getLoadSettings().initialPaths) + + waitsForPromise -> + atom.stateStore.connect() + + runs -> + storageFolder = new StorageFolder(atom.getConfigDirPath()) + storageFolder.storeSync(atom.getStateKey(loadSettings.initialPaths), storageFolderState) + + waitsForPromise -> + atom.loadState().then (state) -> expect(state).toEqual(storageFolderState) + + waitsForPromise -> + atom.saveState() + + waitsForPromise -> + atom.loadState().then (state) -> expect(state).toEqual(serializedState) + it "saves state on keydown, mousedown, and when the editor window unloads", -> spyOn(atom, 'saveState') diff --git a/src/atom-environment.coffee b/src/atom-environment.coffee index 8c79d66f6..a34065bbd 100644 --- a/src/atom-environment.coffee +++ b/src/atom-environment.coffee @@ -11,6 +11,7 @@ Model = require './model' WindowEventHandler = require './window-event-handler' StylesElement = require './styles-element' StateStore = require './state-store' +StorageFolder = require './storage-folder' {getWindowLoadSettings, setWindowLoadSettings} = require './window-load-settings-helpers' registerDefaultCommands = require './register-default-commands' @@ -853,7 +854,12 @@ class AtomEnvironment extends Model loadState: -> if @enablePersistence if stateKey = @getStateKey(@getLoadSettings().initialPaths) - @stateStore.load(stateKey) + @stateStore.load(stateKey).then (state) => + if state + state + else + # TODO: remove this when every user has migrated to the IndexedDb state store. + @getStorageFolder().load(stateKey) else @applicationDelegate.getTemporaryWindowState() else @@ -882,6 +888,9 @@ class AtomEnvironment extends Model else null + getStorageFolder: -> + @storageFolder ?= new StorageFolder(@getConfigDirPath()) + getConfigDirPath: -> @configDirPath ?= process.env.ATOM_HOME From 80146ae631411e0fd5d6d276c2c4a105c1c147ff Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Wed, 23 Mar 2016 10:52:34 +0100 Subject: [PATCH 2/5] Assign the supplied configDirPath to an instance variable --- src/atom-environment.coffee | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/atom-environment.coffee b/src/atom-environment.coffee index a34065bbd..f4dc49060 100644 --- a/src/atom-environment.coffee +++ b/src/atom-environment.coffee @@ -128,7 +128,7 @@ class AtomEnvironment extends Model # Call .loadOrCreate instead constructor: (params={}) -> - {@blobStore, @applicationDelegate, @window, @document, configDirPath, @enablePersistence, onlyLoadBaseStyleSheets} = params + {@blobStore, @applicationDelegate, @window, @document, @configDirPath, @enablePersistence, onlyLoadBaseStyleSheets} = params @unloaded = false @loadTime = null @@ -148,10 +148,10 @@ class AtomEnvironment extends Model @notifications = new NotificationManager - @config = new Config({configDirPath, resourcePath, notificationManager: @notifications, @enablePersistence}) + @config = new Config({@configDirPath, resourcePath, notificationManager: @notifications, @enablePersistence}) @setConfigSchema() - @keymaps = new KeymapManager({configDirPath, resourcePath, notificationManager: @notifications}) + @keymaps = new KeymapManager({@configDirPath, resourcePath, notificationManager: @notifications}) @tooltips = new TooltipManager(keymapManager: @keymaps) @@ -160,16 +160,16 @@ class AtomEnvironment extends Model @grammars = new GrammarRegistry({@config}) - @styles = new StyleManager({configDirPath}) + @styles = new StyleManager({@configDirPath}) @packages = new PackageManager({ - devMode, configDirPath, resourcePath, safeMode, @config, styleManager: @styles, + devMode, @configDirPath, resourcePath, safeMode, @config, styleManager: @styles, commandRegistry: @commands, keymapManager: @keymaps, notificationManager: @notifications, grammarRegistry: @grammars, deserializerManager: @deserializers, viewRegistry: @views }) @themes = new ThemeManager({ - packageManager: @packages, configDirPath, resourcePath, safeMode, @config, + packageManager: @packages, @configDirPath, resourcePath, safeMode, @config, styleManager: @styles, notificationManager: @notifications, viewRegistry: @views }) From 25a4c4c293e61ca0971ff1f5a86af68f299c8cfe Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Wed, 23 Mar 2016 10:53:37 +0100 Subject: [PATCH 3/5] Clear StorageFolder when --clear-window-state is supplied --- src/atom-environment.coffee | 4 +++- src/storage-folder.coffee | 8 ++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/atom-environment.coffee b/src/atom-environment.coffee index f4dc49060..6ef46dc2a 100644 --- a/src/atom-environment.coffee +++ b/src/atom-environment.coffee @@ -139,7 +139,9 @@ class AtomEnvironment extends Model @stateStore = new StateStore('AtomEnvironments', 1) - @stateStore.clear() if clearWindowState + if clearWindowState + @getStorageFolder().clear() + @stateStore.clear() @deserializers = new DeserializerManager(this) @deserializeTimings = {} diff --git a/src/storage-folder.coffee b/src/storage-folder.coffee index 06beae56a..327697672 100644 --- a/src/storage-folder.coffee +++ b/src/storage-folder.coffee @@ -6,6 +6,14 @@ class StorageFolder constructor: (containingPath) -> @path = path.join(containingPath, "storage") if containingPath? + clear: -> + return unless @path? + + try + fs.removeSync(@path) + catch error + console.warn "Error deleting #{statePath}", error.stack, error + storeSync: (name, object) -> return unless @path? From f69c5bdee436f44ac5b71f0761968a180570b726 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Wed, 23 Mar 2016 12:11:27 +0100 Subject: [PATCH 4/5] Oops. --- src/storage-folder.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/storage-folder.coffee b/src/storage-folder.coffee index 327697672..280eb8b5c 100644 --- a/src/storage-folder.coffee +++ b/src/storage-folder.coffee @@ -12,7 +12,7 @@ class StorageFolder try fs.removeSync(@path) catch error - console.warn "Error deleting #{statePath}", error.stack, error + console.warn "Error deleting #{@path}", error.stack, error storeSync: (name, object) -> return unless @path? From cbb911cde8652d7aff6c2a0080d7ca9e5bac7641 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Wed, 23 Mar 2016 13:43:54 +0100 Subject: [PATCH 5/5] :green_heart: --- spec/atom-environment-spec.coffee | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/spec/atom-environment-spec.coffee b/spec/atom-environment-spec.coffee index 2ba0164e6..5fd4b11f1 100644 --- a/spec/atom-environment-spec.coffee +++ b/spec/atom-environment-spec.coffee @@ -173,7 +173,7 @@ describe "AtomEnvironment", -> waitsForPromise -> atom.saveState().then -> atom.loadState().then (state) -> - expect(state).toBeNull() + expect(state).toBeFalsy() waitsForPromise -> loadSettings.initialPaths = [dir2, dir1] @@ -188,15 +188,14 @@ describe "AtomEnvironment", -> loadSettings = _.extend(atom.getLoadSettings(), {initialPaths: [temp.mkdirSync("project-directory")]}) spyOn(atom, 'getLoadSettings').andReturn(loadSettings) spyOn(atom, 'serialize').andReturn(serializedState) - spyOn(atom, 'getConfigDirPath').andReturn(temp.mkdirSync("config-directory")) + spyOn(atom, 'getStorageFolder').andReturn(new StorageFolder(temp.mkdirSync("config-directory"))) atom.project.setPaths(atom.getLoadSettings().initialPaths) waitsForPromise -> atom.stateStore.connect() runs -> - storageFolder = new StorageFolder(atom.getConfigDirPath()) - storageFolder.storeSync(atom.getStateKey(loadSettings.initialPaths), storageFolderState) + atom.getStorageFolder().storeSync(atom.getStateKey(loadSettings.initialPaths), storageFolderState) waitsForPromise -> atom.loadState().then (state) -> expect(state).toEqual(storageFolderState)