diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f1d377..4d948b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## 0.3.0 +- Fix the bug that the default note directory is within packages directory. If it happens, it **deletes** all of existing notes. If you read this before updating the package, please check your note directory before updating it. + ## 0.2.0 - Use DocQuery - Introduce autosave features diff --git a/lib/notational-velocity.coffee b/lib/notational-velocity.coffee index 0d7553a..132ecd5 100644 --- a/lib/notational-velocity.coffee +++ b/lib/notational-velocity.coffee @@ -8,12 +8,12 @@ module.exports = title: 'Note Directory' description: 'The directory to archive notes' type: 'string' - default: process.env.ATOM_HOME + '/packages/notational-velocity/notebook' + default: path.join(process.env.ATOM_HOME, 'notational-velocity-notes') notationalVelocityView: null activate: (state) -> - @rootDirectory = fs.realpathSync(atom.config.get('notational-velocity.directory')) + @rootDirectory = @ensureNoteDirectory() # Events subscribed to in atom's system can be easily cleaned up with a # CompositeDisposable @@ -60,3 +60,25 @@ module.exports = autosaveAll: -> @autosave(paneItem) for paneItem in atom.workspace.getPaneItems() + + ensureNoteDirectory: -> + noteDirectory = atom.config.get('notational-velocity.directory') + packagesDirectory = path.join(process.env.ATOM_HOME, 'packages') + defaultNoteDirectory = path.join(packagesDirectory, 'notational-velocity', 'notebook') + + if noteDirectory.startsWith(packagesDirectory) + storageDirectory = path.join(packagesDirectory, 'storage') + throw new Error(""" + The note directory (#{noteDirectory}) should NOT nest under #{packagesDirectory}. + It is likely that you updated the package to a newer version from v0.1.0. + It is likely that the note directory is overwritten. + Unfortunately, I couldn't find a way to recover overwritten notes. + You might recover partial notes from #{storageDirectory}. + I am extremely sorry. + - Seongjae Lee""") + + if !fs.existsSync(noteDirectory) + fs.makeTreeSync(noteDirectory) + fs.copySync(defaultNoteDirectory, noteDirectory) + + return fs.realpathSync(noteDirectory) diff --git a/spec/notational-velocity-spec.coffee b/spec/notational-velocity-spec.coffee index ff68de3..cfd9e22 100644 --- a/spec/notational-velocity-spec.coffee +++ b/spec/notational-velocity-spec.coffee @@ -1,7 +1,4 @@ -# Use the command `window:run-package-specs` (cmd-alt-ctrl-p) to run specs. -# -# To run a specific `it` or `describe` block add an `f` to the front (e.g. `fit` -# or `fdescribe`). Remove the `f` to unfocus the block. +path = require 'path' describe "NotationalVelocity", -> defaultDirectory = atom.config.get('notational-velocity.directory') @@ -20,8 +17,7 @@ describe "NotationalVelocity", -> it "attaches and then detaches the view", -> expect(workspaceElement.querySelector('.notational-velocity')).not.toExist() - # This is an activation event, triggering it will cause the package to be - # activated. + # This is an activation event, triggering it will cause the package to be activated. atom.commands.dispatch workspaceElement, 'notational-velocity:toggle' waitsForPromise -> @@ -30,3 +26,24 @@ describe "NotationalVelocity", -> runs -> expect(workspaceElement.querySelector('.notational-velocity')).toExist() atom.commands.dispatch workspaceElement, 'notational-velocity:toggle' + + it "checks if we banned the default directory under packages directory", -> + atom.notifications.clear() + + waitsForPromise -> + atom.packages.activatePackage('notifications') + + runs -> + defaultNoteDirectory = path.join(process.env.ATOM_HOME, 'packages', 'notational-velocity', 'notebook') + atom.config.set('notational-velocity.directory', defaultNoteDirectory) + + # This is an activation event, triggering it will cause the package to be activated. + atom.commands.dispatch workspaceElement, 'notational-velocity:toggle' + + waitsForPromise -> + activationPromise + + runs -> + notificationContainer = workspaceElement.querySelector('atom-notifications') + notification = notificationContainer.querySelector('atom-notification.fatal') + expect(notification).toExist()