From 288abbc57b85c8379449feec9e55ffeb9ade7785 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Fri, 13 Nov 2015 10:51:31 +0100 Subject: [PATCH 01/53] Add OS X dock menu with 'New Window' option --- src/browser/atom-application.coffee | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/browser/atom-application.coffee b/src/browser/atom-application.coffee index 8bb44349e..56c4ea216 100644 --- a/src/browser/atom-application.coffee +++ b/src/browser/atom-application.coffee @@ -82,6 +82,7 @@ class AtomApplication @listenForArgumentsFromNewProcess() @setupJavaScriptArguments() @handleEvents() + @setupDockMenu() @storageFolder = new StorageFolder(process.env.ATOM_HOME) if options.pathsToOpen?.length > 0 or options.urlsToOpen?.length > 0 or options.test @@ -280,6 +281,13 @@ class AtomApplication ipc.on 'write-to-stderr', (event, output) -> process.stderr.write(output) + setupDockMenu: -> + if process.platform is 'darwin' + dockMenu = Menu.buildFromTemplate [ + {label: 'New Window', click: => @emit('application:new-window')} + ] + app.dock.setMenu dockMenu + # Public: Executes the given command. # # If it isn't handled globally, delegate to the currently focused window. From ade1ef7a4cd275edd81e4ae3a58948891a7e16ef Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Wed, 18 Nov 2015 13:59:17 -0800 Subject: [PATCH 02/53] Load deserializers from files specified in package.json --- .../packages/package-with-deserializers/package.json | 7 +++++++ .../package-with-deserializers/the-deserializer.js | 6 ++++++ spec/package-manager-spec.coffee | 10 ++++++++++ src/package.coffee | 7 +++++++ 4 files changed, 30 insertions(+) create mode 100644 spec/fixtures/packages/package-with-deserializers/package.json create mode 100644 spec/fixtures/packages/package-with-deserializers/the-deserializer.js diff --git a/spec/fixtures/packages/package-with-deserializers/package.json b/spec/fixtures/packages/package-with-deserializers/package.json new file mode 100644 index 000000000..867457e0a --- /dev/null +++ b/spec/fixtures/packages/package-with-deserializers/package.json @@ -0,0 +1,7 @@ +{ + "name": "package-with-deserializers", + "version": "1.0.0", + "atom-deserializers": { + "TheDeserializerName": "./the-deserializer.js" + } +} diff --git a/spec/fixtures/packages/package-with-deserializers/the-deserializer.js b/spec/fixtures/packages/package-with-deserializers/the-deserializer.js new file mode 100644 index 000000000..d70e62bfd --- /dev/null +++ b/spec/fixtures/packages/package-with-deserializers/the-deserializer.js @@ -0,0 +1,6 @@ +module.exports = function (state) { + return { + wasDeserializedBy: 'TheDeserializer', + state: state + } +} diff --git a/spec/package-manager-spec.coffee b/spec/package-manager-spec.coffee index 4b5f3c26d..59e076834 100644 --- a/spec/package-manager-spec.coffee +++ b/spec/package-manager-spec.coffee @@ -79,6 +79,16 @@ describe "PackageManager", -> expect(loadedPackage.name).toBe "package-with-main" + it "registers any deserializers specified in the package's package.json", -> + atom.packages.loadPackage("package-with-deserializers") + + state = {deserializer: 'TheDeserializerName', a: 'b'} + + expect(atom.deserializers.deserialize(state)).toEqual { + wasDeserializedBy: 'TheDeserializer' + state: state + } + describe "::unloadPackage(name)", -> describe "when the package is active", -> it "throws an error", -> diff --git a/src/package.coffee b/src/package.coffee index 4cd6a18fd..b40cabac3 100644 --- a/src/package.coffee +++ b/src/package.coffee @@ -84,6 +84,7 @@ class Package @loadKeymaps() @loadMenus() @loadStylesheets() + @loadDeserializers() @settingsPromise = @loadSettings() @requireMainModule() unless @mainModule? or @activationShouldBeDeferred() catch error @@ -253,6 +254,12 @@ class Package @stylesheets = @getStylesheetPaths().map (stylesheetPath) => [stylesheetPath, @themeManager.loadStylesheet(stylesheetPath, true)] + loadDeserializers: -> + for name, implementationPath of @metadata['atom-deserializers'] + deserialize = require(path.join(@path, implementationPath)) + atom.deserializers.add({name, deserialize}) + return + getStylesheetsPath: -> path.join(@path, 'styles') From 46272cd1927aac453a69397ffa6675c506ba3ac8 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Wed, 18 Nov 2015 14:31:16 -0800 Subject: [PATCH 03/53] Load deserializers lazily --- .../{the-deserializer.js => deserializer-1.js} | 2 +- .../package-with-deserializers/deserializer-2.js | 6 ++++++ .../package-with-deserializers/package.json | 3 ++- spec/package-manager-spec.coffee | 13 +++++++++---- src/package.coffee | 10 ++++++++-- 5 files changed, 26 insertions(+), 8 deletions(-) rename spec/fixtures/packages/package-with-deserializers/{the-deserializer.js => deserializer-1.js} (62%) create mode 100644 spec/fixtures/packages/package-with-deserializers/deserializer-2.js diff --git a/spec/fixtures/packages/package-with-deserializers/the-deserializer.js b/spec/fixtures/packages/package-with-deserializers/deserializer-1.js similarity index 62% rename from spec/fixtures/packages/package-with-deserializers/the-deserializer.js rename to spec/fixtures/packages/package-with-deserializers/deserializer-1.js index d70e62bfd..f4d7a1488 100644 --- a/spec/fixtures/packages/package-with-deserializers/the-deserializer.js +++ b/spec/fixtures/packages/package-with-deserializers/deserializer-1.js @@ -1,6 +1,6 @@ module.exports = function (state) { return { - wasDeserializedBy: 'TheDeserializer', + wasDeserializedBy: 'Deserializer1', state: state } } diff --git a/spec/fixtures/packages/package-with-deserializers/deserializer-2.js b/spec/fixtures/packages/package-with-deserializers/deserializer-2.js new file mode 100644 index 000000000..3099d2b15 --- /dev/null +++ b/spec/fixtures/packages/package-with-deserializers/deserializer-2.js @@ -0,0 +1,6 @@ +module.exports = function (state) { + return { + wasDeserializedBy: 'Deserializer2', + state: state + } +} diff --git a/spec/fixtures/packages/package-with-deserializers/package.json b/spec/fixtures/packages/package-with-deserializers/package.json index 867457e0a..377a5faf8 100644 --- a/spec/fixtures/packages/package-with-deserializers/package.json +++ b/spec/fixtures/packages/package-with-deserializers/package.json @@ -2,6 +2,7 @@ "name": "package-with-deserializers", "version": "1.0.0", "atom-deserializers": { - "TheDeserializerName": "./the-deserializer.js" + "Deserializer1": "./deserializer-1.js", + "Deserializer2": "./deserializer-2.js" } } diff --git a/spec/package-manager-spec.coffee b/spec/package-manager-spec.coffee index 59e076834..843e9a932 100644 --- a/spec/package-manager-spec.coffee +++ b/spec/package-manager-spec.coffee @@ -82,11 +82,16 @@ describe "PackageManager", -> it "registers any deserializers specified in the package's package.json", -> atom.packages.loadPackage("package-with-deserializers") - state = {deserializer: 'TheDeserializerName', a: 'b'} + state1 = {deserializer: 'Deserializer1', a: 'b'} + expect(atom.deserializers.deserialize(state1)).toEqual { + wasDeserializedBy: 'Deserializer1' + state: state1 + } - expect(atom.deserializers.deserialize(state)).toEqual { - wasDeserializedBy: 'TheDeserializer' - state: state + state2 = {deserializer: 'Deserializer2', c: 'd'} + expect(atom.deserializers.deserialize(state2)).toEqual { + wasDeserializedBy: 'Deserializer2' + state: state2 } describe "::unloadPackage(name)", -> diff --git a/src/package.coffee b/src/package.coffee index b40cabac3..f933f93c3 100644 --- a/src/package.coffee +++ b/src/package.coffee @@ -256,8 +256,14 @@ class Package loadDeserializers: -> for name, implementationPath of @metadata['atom-deserializers'] - deserialize = require(path.join(@path, implementationPath)) - atom.deserializers.add({name, deserialize}) + do => + deserializePath = path.join(@path, implementationPath) + deserializeFunction = null + atom.deserializers.add + name: name, + deserialize: -> + deserializeFunction ?= require(deserializePath) + deserializeFunction.apply(this, arguments) return getStylesheetsPath: -> From a0a402c3f89be74fa90569f591a46708c41a6258 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Thu, 19 Nov 2015 14:12:03 -0800 Subject: [PATCH 04/53] Remove 'atom' prefix from deserializers package.json key --- spec/fixtures/packages/package-with-deserializers/package.json | 2 +- src/package.coffee | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/fixtures/packages/package-with-deserializers/package.json b/spec/fixtures/packages/package-with-deserializers/package.json index 377a5faf8..c55e1444a 100644 --- a/spec/fixtures/packages/package-with-deserializers/package.json +++ b/spec/fixtures/packages/package-with-deserializers/package.json @@ -1,7 +1,7 @@ { "name": "package-with-deserializers", "version": "1.0.0", - "atom-deserializers": { + "deserializers": { "Deserializer1": "./deserializer-1.js", "Deserializer2": "./deserializer-2.js" } diff --git a/src/package.coffee b/src/package.coffee index f933f93c3..a49c70868 100644 --- a/src/package.coffee +++ b/src/package.coffee @@ -255,7 +255,7 @@ class Package [stylesheetPath, @themeManager.loadStylesheet(stylesheetPath, true)] loadDeserializers: -> - for name, implementationPath of @metadata['atom-deserializers'] + for name, implementationPath of @metadata.deserializers do => deserializePath = path.join(@path, implementationPath) deserializeFunction = null From 91b651e86c52f48ed2911158369ea8b434ec987c Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Thu, 19 Nov 2015 15:54:47 -0800 Subject: [PATCH 05/53] Make model constructor argument to addViewProvider optional --- spec/view-registry-spec.coffee | 15 ++++++++ src/view-registry.coffee | 66 ++++++++++++++++++++++------------ 2 files changed, 59 insertions(+), 22 deletions(-) diff --git a/spec/view-registry-spec.coffee b/spec/view-registry-spec.coffee index a2b4965a5..16672b25d 100644 --- a/spec/view-registry-spec.coffee +++ b/spec/view-registry-spec.coffee @@ -47,6 +47,21 @@ describe "ViewRegistry", -> expect(view2 instanceof TestView).toBe true expect(view2.model).toBe subclassModel + describe "when a view provider is registered generically, and works with the object", -> + it "constructs a view element and assigns the model on it", -> + model = {a: 'b'} + + registry.addViewProvider (model) -> + if model.a is 'b' + element = document.createElement('div') + element.className = 'test-element' + element + + view = registry.getView({a: 'b'}) + expect(view.className).toBe 'test-element' + + expect(-> registry.getView({a: 'c'})).toThrow() + describe "when no view provider is registered for the object's constructor", -> it "throws an exception", -> expect(-> registry.getView(new Object)).toThrow() diff --git a/src/view-registry.coffee b/src/view-registry.coffee index 0f07600ae..e754a010b 100644 --- a/src/view-registry.coffee +++ b/src/view-registry.coffee @@ -3,6 +3,8 @@ Grim = require 'grim' {Disposable} = require 'event-kit' _ = require 'underscore-plus' +AnyConstructor = Symbol('any-constructor') + # Essential: `ViewRegistry` handles the association between model and view # types in Atom. We call this association a View Provider. As in, for a given # model, this class can provide a view via {::getView}, as long as the @@ -76,16 +78,27 @@ class ViewRegistry # textEditorElement # ``` # - # * `modelConstructor` Constructor {Function} for your model. + # * `modelConstructor` (optional) Constructor {Function} for your model. If + # a constructor is given, the `createView` function will only be used + # for model objects inheriting from that constructor. Otherwise, it will + # will be called for any object. # * `createView` Factory {Function} that is passed an instance of your model - # and must return a subclass of `HTMLElement` or `undefined`. + # and must return a subclass of `HTMLElement` or `undefined`. If it returns + # `undefined`, then the registry will continue to search for other view + # providers. # # Returns a {Disposable} on which `.dispose()` can be called to remove the # added provider. addViewProvider: (modelConstructor, createView) -> if arguments.length is 1 - Grim.deprecate("atom.views.addViewProvider now takes 2 arguments: a model constructor and a createView function. See docs for details.") - provider = modelConstructor + switch typeof modelConstructor + when 'function' + provider = {createView: modelConstructor, modelConstructor: AnyConstructor} + when 'object' + Grim.deprecate("atom.views.addViewProvider now takes 2 arguments: a model constructor and a createView function. See docs for details.") + provider = modelConstructor + else + throw new TypeError("Arguments to addViewProvider must be functions") else provider = {modelConstructor, createView} @@ -153,25 +166,34 @@ class ViewRegistry createView: (object) -> if object instanceof HTMLElement - object - else if object?.element instanceof HTMLElement - object.element - else if object?.jquery - object[0] - else if provider = @findProvider(object) - element = provider.createView?(object, @atomEnvironment) - unless element? - element = new provider.viewConstructor - element.initialize?(object) ? element.setModel?(object) - element - else if viewConstructor = object?.getViewClass?() - view = new viewConstructor(object) - view[0] - else - throw new Error("Can't create a view for #{object.constructor.name} instance. Please register a view provider.") + return object - findProvider: (object) -> - find @providers, ({modelConstructor}) -> object instanceof modelConstructor + if object?.element instanceof HTMLElement + return object.element + + if object?.jquery + return object[0] + + for provider in @providers + if provider.modelConstructor is AnyConstructor + if element = provider.createView(object, @atomEnvironment) + return element + continue + + if object instanceof provider.modelConstructor + if element = provider.createView?(object, @atomEnvironment) + return element + + if viewConstructor = provider.viewConstructor + element = new viewConstructor + element.initialize?(object) ? element.setModel?(object) + return element + + if viewConstructor = object?.getViewClass?() + view = new viewConstructor(object) + return view[0] + + throw new Error("Can't create a view for #{object.constructor.name} instance. Please register a view provider.") updateDocument: (fn) -> @documentWriters.push(fn) From cb2b068d779a7e182c50e0f9ed47998e46f0f992 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Thu, 19 Nov 2015 16:58:08 -0800 Subject: [PATCH 06/53] Load view providers from files specified in package.json --- .../package-with-view-providers/package.json | 8 ++++++++ .../package-with-view-providers/view-provider-1.js | 9 +++++++++ .../package-with-view-providers/view-provider-2.js | 9 +++++++++ spec/package-manager-spec.coffee | 13 +++++++++++++ spec/package-spec.coffee | 1 + src/atom-environment.coffee | 2 +- src/package-manager.coffee | 6 ++++-- src/package.coffee | 8 +++++++- 8 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 spec/fixtures/packages/package-with-view-providers/package.json create mode 100644 spec/fixtures/packages/package-with-view-providers/view-provider-1.js create mode 100644 spec/fixtures/packages/package-with-view-providers/view-provider-2.js diff --git a/spec/fixtures/packages/package-with-view-providers/package.json b/spec/fixtures/packages/package-with-view-providers/package.json new file mode 100644 index 000000000..7f7405c32 --- /dev/null +++ b/spec/fixtures/packages/package-with-view-providers/package.json @@ -0,0 +1,8 @@ +{ + "name": "package-with-view-providers", + "version": "1.0.0", + "viewProviders": [ + "./view-provider-1", + "./view-provider-2" + ] +} diff --git a/spec/fixtures/packages/package-with-view-providers/view-provider-1.js b/spec/fixtures/packages/package-with-view-providers/view-provider-1.js new file mode 100644 index 000000000..e4f0dcc0b --- /dev/null +++ b/spec/fixtures/packages/package-with-view-providers/view-provider-1.js @@ -0,0 +1,9 @@ +'use strict' + +module.exports = function (model) { + if (model.worksWithViewProvider1) { + let element = document.createElement('div') + element.dataset['createdBy'] = 'view-provider-1' + return element + } +} diff --git a/spec/fixtures/packages/package-with-view-providers/view-provider-2.js b/spec/fixtures/packages/package-with-view-providers/view-provider-2.js new file mode 100644 index 000000000..a3b58a3aa --- /dev/null +++ b/spec/fixtures/packages/package-with-view-providers/view-provider-2.js @@ -0,0 +1,9 @@ +'use strict' + +module.exports = function (model) { + if (model.worksWithViewProvider2) { + let element = document.createElement('div') + element.dataset['createdBy'] = 'view-provider-2' + return element + } +} diff --git a/spec/package-manager-spec.coffee b/spec/package-manager-spec.coffee index 843e9a932..169e09b76 100644 --- a/spec/package-manager-spec.coffee +++ b/spec/package-manager-spec.coffee @@ -94,6 +94,19 @@ describe "PackageManager", -> state: state2 } + it "registers any view providers specified in the package's package.json", -> + atom.packages.loadPackage("package-with-view-providers") + + model1 = {worksWithViewProvider1: true} + element1 = atom.views.getView(model1) + expect(element1 instanceof HTMLDivElement).toBe true + expect(element1.dataset.createdBy).toBe 'view-provider-1' + + model2 = {worksWithViewProvider2: true} + element2 = atom.views.getView(model2) + expect(element2 instanceof HTMLDivElement).toBe true + expect(element2.dataset.createdBy).toBe 'view-provider-2' + describe "::unloadPackage(name)", -> describe "when the package is active", -> it "throws an error", -> diff --git a/spec/package-spec.coffee b/spec/package-spec.coffee index 63a80a7db..f49d2ed7c 100644 --- a/spec/package-spec.coffee +++ b/spec/package-spec.coffee @@ -10,6 +10,7 @@ describe "Package", -> keymapManager: atom.keymaps, commandRegistry: atom.command, grammarRegistry: atom.grammars, themeManager: atom.themes, menuManager: atom.menu, contextMenuManager: atom.contextMenu, + deserializerManager: atom.deserializers, viewRegistry: atom.views, devMode: false ) diff --git a/src/atom-environment.coffee b/src/atom-environment.coffee index ac76daf04..c56bcb493 100644 --- a/src/atom-environment.coffee +++ b/src/atom-environment.coffee @@ -151,7 +151,7 @@ class AtomEnvironment extends Model @packages = new PackageManager({ devMode, configDirPath, resourcePath, safeMode, @config, styleManager: @styles, commandRegistry: @commands, keymapManager: @keymaps, notificationManager: @notifications, - grammarRegistry: @grammars + grammarRegistry: @grammars, deserializerManager: @deserializers, viewRegistry: @views }) @themes = new ThemeManager({ diff --git a/src/package-manager.coffee b/src/package-manager.coffee index 789b2eae5..5b0264212 100644 --- a/src/package-manager.coffee +++ b/src/package-manager.coffee @@ -31,7 +31,8 @@ class PackageManager constructor: (params) -> { configDirPath, @devMode, safeMode, @resourcePath, @config, @styleManager, - @notificationManager, @keymapManager, @commandRegistry, @grammarRegistry + @notificationManager, @keymapManager, @commandRegistry, @grammarRegistry, + @deserializerManager, @viewRegistry } = params @emitter = new Emitter @@ -375,7 +376,8 @@ class PackageManager options = { path: packagePath, metadata, packageManager: this, @config, @styleManager, @commandRegistry, @keymapManager, @devMode, @notificationManager, - @grammarRegistry, @themeManager, @menuManager, @contextMenuManager + @grammarRegistry, @themeManager, @menuManager, @contextMenuManager, + @deserializerManager, @viewRegistry } if metadata.theme pack = new ThemePackage(options) diff --git a/src/package.coffee b/src/package.coffee index a49c70868..1d98c8161 100644 --- a/src/package.coffee +++ b/src/package.coffee @@ -33,7 +33,7 @@ class Package { @path, @metadata, @packageManager, @config, @styleManager, @commandRegistry, @keymapManager, @devMode, @notificationManager, @grammarRegistry, @themeManager, - @menuManager, @contextMenuManager + @menuManager, @contextMenuManager, @deserializerManager, @viewRegistry } = params @emitter = new Emitter @@ -85,6 +85,7 @@ class Package @loadMenus() @loadStylesheets() @loadDeserializers() + @loadViewProviders() @settingsPromise = @loadSettings() @requireMainModule() unless @mainModule? or @activationShouldBeDeferred() catch error @@ -266,6 +267,11 @@ class Package deserializeFunction.apply(this, arguments) return + loadViewProviders: -> + for implementationPath in @metadata.viewProviders + @viewRegistry.addViewProvider(require(path.join(@path, implementationPath))) + return + getStylesheetsPath: -> path.join(@path, 'styles') From 4e5912c5453cff723aa93b847569d9d2878d9204 Mon Sep 17 00:00:00 2001 From: joshaber Date: Fri, 20 Nov 2015 13:54:01 -0800 Subject: [PATCH 07/53] Upload to S3 as well. --- build/tasks/publish-build-task.coffee | 34 ++++++++++++++++++++++++--- package.json | 1 + 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/build/tasks/publish-build-task.coffee b/build/tasks/publish-build-task.coffee index fc96121ae..c8da8a895 100644 --- a/build/tasks/publish-build-task.coffee +++ b/build/tasks/publish-build-task.coffee @@ -6,6 +6,7 @@ async = require 'async' fs = require 'fs-plus' GitHub = require 'github-releases' request = require 'request' +AWS = require 'aws-sdk' grunt = null @@ -210,7 +211,7 @@ deleteExistingAssets = (release, assetNames, callback) -> async.parallel(tasks, callback) uploadAssets = (release, buildDir, assets, callback) -> - upload = (release, assetName, assetPath, callback) -> + uploadToReleases = (release, assetName, assetPath, callback) -> options = uri: release.upload_url.replace(/\{.*$/, "?name=#{assetName}") method: 'POST' @@ -221,15 +222,42 @@ uploadAssets = (release, buildDir, assets, callback) -> assetRequest = request options, (error, response, body='') -> if error? or response.statusCode >= 400 - logError("Upload release asset #{assetName} failed", error, body) + logError("Upload release asset #{assetName} to Releases failed", error, body) callback(error ? new Error(response.statusCode)) else callback(null, release) fs.createReadStream(assetPath).pipe(assetRequest) + uploadToS3 = (release, assetName, assetPath, callback) -> + s3Key = process.env.BUILD_ATOM_RELEASES_S3_KEY + s3Secret = process.env.BUILD_ATOM_RELEASES_S3_SECRET + s3Bucket = process.env.BUILD_ATOM_RELEASES_S3_BUCKET + + unless s3Key && s3Secret && s3Bucket + callback(new Error('BUILD_ATOM_RELEASES_S3_KEY, BUILD_ATOM_RELEASES_S3_SECRET, and BUILD_ATOM_RELEASES_S3_BUCKET environment variables must be set.')) + return + + s3Info = + accessKeyId: s3Key + secretAccessKey: s3Secret + s3 = new AWS.S3 s3Info + + uploadParams = + Bucket: s3Bucket + ACL: 'public-read' + Key: "releases/#{assetName}" + Body: fs.createReadStream(assetPath) + s3.upload uploadParams, (error, data) -> + if error? + console.log("Upload release asset #{assetName} to S3 failed", error) + callback(error) + else + callback(null, release) + tasks = [] for {assetName} in assets assetPath = path.join(buildDir, assetName) - tasks.push(upload.bind(this, release, assetName, assetPath)) + tasks.push(uploadToReleases.bind(this, release, assetName, assetPath)) + tasks.push(uploadToS3.bind(this, release, assetName, assetPath)) async.parallel(tasks, callback) diff --git a/package.json b/package.json index 9c9afc546..c11b3345e 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "dependencies": { "async": "0.2.6", "atom-keymap": "^6.1.1", + "aws-sdk": "^2.2.18", "babel-core": "^5.8.21", "bootstrap": "^3.3.4", "cached-run-in-this-context": "0.4.0", From ad7a67d8e4a07987a4602a0f01d77035cbb6c5c3 Mon Sep 17 00:00:00 2001 From: joshaber Date: Fri, 20 Nov 2015 14:05:05 -0800 Subject: [PATCH 08/53] Re-export the variables for the Linux builds. --- script/cibuild-atom-linux | 3 +++ script/cibuild-atom-rpm | 3 +++ 2 files changed, 6 insertions(+) diff --git a/script/cibuild-atom-linux b/script/cibuild-atom-linux index c4e957189..2c3395608 100755 --- a/script/cibuild-atom-linux +++ b/script/cibuild-atom-linux @@ -3,6 +3,9 @@ set -e export ATOM_ACCESS_TOKEN=$BUILD_ATOM_LINUX_ACCESS_TOKEN +export BUILD_ATOM_RELEASES_S3_KEY=$BUILD_ATOM_LINUX_RELEASES_S3_KEY +export BUILD_ATOM_RELEASES_S3_SECRET=$BUILD_ATOM_LINUX_RELEASES_S3_SECRET +export BUILD_ATOM_RELEASES_S3_BUCKET=$BUILD_ATOM_LINUX_RELEASES_S3_BUCKET if [ -d /usr/local/share/nodenv ]; then export NODENV_ROOT=/usr/local/share/nodenv diff --git a/script/cibuild-atom-rpm b/script/cibuild-atom-rpm index a861a068b..2faa89347 100755 --- a/script/cibuild-atom-rpm +++ b/script/cibuild-atom-rpm @@ -8,5 +8,8 @@ docker run \ --env JANKY_SHA1="$JANKY_SHA1" \ --env JANKY_BRANCH="$JANKY_BRANCH" \ --env ATOM_ACCESS_TOKEN="$BUILD_ATOM_RPM_ACCESS_TOKEN" \ + --env BUILD_ATOM_RELEASES_S3_KEY="$BUILD_ATOM_RPM_RELEASES_S3_KEY" \ + --env BUILD_ATOM_RELEASES_S3_SECRET="$BUILD_ATOM_RPM_RELEASES_S3_SECRET" \ + --env BUILD_ATOM_RELEASES_S3_BUCKET="$BUILD_ATOM_RPM_RELEASES_S3_BUCKET" \ atom-rpm /atom/script/rpmbuild docker rmi atom-rpm From 67b713ffb4013f5d60355be30ff10f91d359e951 Mon Sep 17 00:00:00 2001 From: joshaber Date: Fri, 20 Nov 2015 14:08:56 -0800 Subject: [PATCH 09/53] Re-export the variables for Windows too. --- script/cibuild.cmd | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/script/cibuild.cmd b/script/cibuild.cmd index 79197d1b1..a596b7eba 100644 --- a/script/cibuild.cmd +++ b/script/cibuild.cmd @@ -1,3 +1,7 @@ +SET BUILD_ATOM_RELEASES_S3_KEY=%BUILD_ATOM_WIN_RELEASES_S3_KEY% +SET BUILD_ATOM_RELEASES_S3_SECRET=%BUILD_ATOM_WIN_RELEASES_S3_SECRET% +SET BUILD_ATOM_RELEASES_S3_BUCKET=%BUILD_ATOM_WIN_RELEASES_S3_BUCKET% + @IF EXIST "%~dp0\node.exe" ( "%~dp0\node.exe" "%~dp0\cibuild" %* ) ELSE ( From 220b0e67e63b43145f42b1620591469503ae8341 Mon Sep 17 00:00:00 2001 From: joshaber Date: Fri, 20 Nov 2015 14:58:19 -0800 Subject: [PATCH 10/53] Hacks on hacks on hacks to test on test on test --- build/tasks/publish-build-task.coffee | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/build/tasks/publish-build-task.coffee b/build/tasks/publish-build-task.coffee index c8da8a895..910254360 100644 --- a/build/tasks/publish-build-task.coffee +++ b/build/tasks/publish-build-task.coffee @@ -37,8 +37,8 @@ module.exports = (gruntObject) -> isPrerelease = false when 'beta' isPrerelease = true - else - return + # else + # return doneCallback = @async() startTime = Date.now() @@ -55,12 +55,16 @@ module.exports = (gruntObject) -> zipAssets buildDir, assets, (error) -> return done(error) if error? - getAtomDraftRelease isPrerelease, channel, (error, release) -> - return done(error) if error? - assetNames = (asset.assetName for asset in assets) - deleteExistingAssets release, assetNames, (error) -> - return done(error) if error? - uploadAssets(release, buildDir, assets, done) + uploadAssets(null, buildDir, assets, done) + + # zipAssets buildDir, assets, (error) -> + # return done(error) if error? + # getAtomDraftRelease isPrerelease, channel, (error, release) -> + # return done(error) if error? + # assetNames = (asset.assetName for asset in assets) + # deleteExistingAssets release, assetNames, (error) -> + # return done(error) if error? + # uploadAssets(release, buildDir, assets, done) getAssets = -> {cp} = require('./task-helpers')(grunt) @@ -258,6 +262,6 @@ uploadAssets = (release, buildDir, assets, callback) -> tasks = [] for {assetName} in assets assetPath = path.join(buildDir, assetName) - tasks.push(uploadToReleases.bind(this, release, assetName, assetPath)) + # tasks.push(uploadToReleases.bind(this, release, assetName, assetPath)) tasks.push(uploadToS3.bind(this, release, assetName, assetPath)) async.parallel(tasks, callback) From 785da0aa6c5536754fe90732bac9575aba3e9ea1 Mon Sep 17 00:00:00 2001 From: joshaber Date: Fri, 20 Nov 2015 15:33:15 -0800 Subject: [PATCH 11/53] Linty --- build/tasks/publish-build-task.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/tasks/publish-build-task.coffee b/build/tasks/publish-build-task.coffee index 910254360..0a1042766 100644 --- a/build/tasks/publish-build-task.coffee +++ b/build/tasks/publish-build-task.coffee @@ -238,7 +238,7 @@ uploadAssets = (release, buildDir, assets, callback) -> s3Secret = process.env.BUILD_ATOM_RELEASES_S3_SECRET s3Bucket = process.env.BUILD_ATOM_RELEASES_S3_BUCKET - unless s3Key && s3Secret && s3Bucket + unless s3Key and s3Secret and s3Bucket callback(new Error('BUILD_ATOM_RELEASES_S3_KEY, BUILD_ATOM_RELEASES_S3_SECRET, and BUILD_ATOM_RELEASES_S3_BUCKET environment variables must be set.')) return From 00120ef4823e77d07b2bb65c64bdf3669f4d7566 Mon Sep 17 00:00:00 2001 From: joshaber Date: Fri, 20 Nov 2015 16:05:22 -0800 Subject: [PATCH 12/53] Namespace by tag name. --- build/tasks/publish-build-task.coffee | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build/tasks/publish-build-task.coffee b/build/tasks/publish-build-task.coffee index 0a1042766..b0011f921 100644 --- a/build/tasks/publish-build-task.coffee +++ b/build/tasks/publish-build-task.coffee @@ -247,10 +247,11 @@ uploadAssets = (release, buildDir, assets, callback) -> secretAccessKey: s3Secret s3 = new AWS.S3 s3Info + key = "releases/#{release.tag_name}/#{assetName}" uploadParams = Bucket: s3Bucket ACL: 'public-read' - Key: "releases/#{assetName}" + Key: key Body: fs.createReadStream(assetPath) s3.upload uploadParams, (error, data) -> if error? From c08e408a718785c1f09dd8ec74ad5dec72844969 Mon Sep 17 00:00:00 2001 From: joshaber Date: Fri, 20 Nov 2015 16:09:55 -0800 Subject: [PATCH 13/53] Dummy out the tag name for now. --- build/tasks/publish-build-task.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/tasks/publish-build-task.coffee b/build/tasks/publish-build-task.coffee index b0011f921..58e8df9a1 100644 --- a/build/tasks/publish-build-task.coffee +++ b/build/tasks/publish-build-task.coffee @@ -55,7 +55,7 @@ module.exports = (gruntObject) -> zipAssets buildDir, assets, (error) -> return done(error) if error? - uploadAssets(null, buildDir, assets, done) + uploadAssets({tag_name: '1.1'}, buildDir, assets, done) # zipAssets buildDir, assets, (error) -> # return done(error) if error? From 35d9c3dfffa67a3bc3206e533f3b6ff8f35a6baa Mon Sep 17 00:00:00 2001 From: joshaber Date: Fri, 20 Nov 2015 16:33:18 -0800 Subject: [PATCH 14/53] REMOVE ME hacks on hacks on hacks --- build/tasks/set-version-task.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/tasks/set-version-task.coffee b/build/tasks/set-version-task.coffee index 28abb6493..99c147c53 100644 --- a/build/tasks/set-version-task.coffee +++ b/build/tasks/set-version-task.coffee @@ -5,9 +5,9 @@ module.exports = (grunt) -> {spawn} = require('./task-helpers')(grunt) getVersion = (callback) -> - releasableBranches = ['stable', 'beta'] + releasableBranches = ['stable', 'beta', 'upload-to-s3'] channel = grunt.config.get('atom.channel') - shouldUseCommitHash = if channel in releasableBranches then false else true + shouldUseCommitHash = false # if channel in releasableBranches then false else true inRepository = fs.existsSync(path.resolve(__dirname, '..', '..', '.git')) {version} = require(path.join(grunt.config.get('atom.appDir'), 'package.json')) if shouldUseCommitHash and inRepository From 9cd5a0c31c2421aa5e045a6fa882b2d58d7e6e30 Mon Sep 17 00:00:00 2001 From: joshaber Date: Fri, 20 Nov 2015 16:42:37 -0800 Subject: [PATCH 15/53] aws-sdk is a build dependency. --- build/package.json | 1 + package.json | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/build/package.json b/build/package.json index de9053006..40e5b309a 100644 --- a/build/package.json +++ b/build/package.json @@ -8,6 +8,7 @@ "dependencies": { "asar": "^0.8.0", "async": "~0.2.9", + "aws-sdk": "^2.2.18", "donna": "^1.0.13", "formidable": "~1.0.14", "fs-plus": "2.x", diff --git a/package.json b/package.json index c11b3345e..9c9afc546 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,6 @@ "dependencies": { "async": "0.2.6", "atom-keymap": "^6.1.1", - "aws-sdk": "^2.2.18", "babel-core": "^5.8.21", "bootstrap": "^3.3.4", "cached-run-in-this-context": "0.4.0", From f77699694e37b80c7196f4f8d5f8bd3dcdbaffa7 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Fri, 20 Nov 2015 17:15:10 -0800 Subject: [PATCH 16/53] Revert ":arrow_up: text-buffer :racehorse:" This reverts commit fcab30e822e25d2c1d6e0d85c3e9bcecd224b9a5. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cbd79970d..d141f8c71 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "service-hub": "^0.7.0", "source-map-support": "^0.3.2", "temp": "0.8.1", - "text-buffer": "^8.0.5", + "text-buffer": "^8.0.4", "typescript-simple": "1.0.0", "underscore-plus": "^1.6.6", "yargs": "^3.23.0" From 71bdeb5010bd1d40dd8fb1243fb2729353a429ec Mon Sep 17 00:00:00 2001 From: joshaber Date: Fri, 20 Nov 2015 17:32:09 -0800 Subject: [PATCH 17/53] Try copying the Windows vars in cibuild. --- script/cibuild | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/script/cibuild b/script/cibuild index b3f0b3f83..c4fa533d0 100755 --- a/script/cibuild +++ b/script/cibuild @@ -41,6 +41,10 @@ function setEnvironmentVariables() { process.env.CXX = 'clang++'; process.env.npm_config_clang = '1'; } + + process.env.BUILD_ATOM_RELEASES_S3_KEY = process.env.BUILD_ATOM_WIN_RELEASES_S3_KEY + process.env.BUILD_ATOM_RELEASES_S3_SECRET = process.env.BUILD_ATOM_RELEASES_S3_SECRET + process.env.BUILD_ATOM_RELEASES_S3_BUCKET = process.env.BUILD_ATOM_RELEASES_S3_BUCKET } function removeNodeModules() { From 481cacb5d31d28251da8ee276dba6b203753e869 Mon Sep 17 00:00:00 2001 From: joshaber Date: Fri, 20 Nov 2015 17:32:15 -0800 Subject: [PATCH 18/53] Let's see if we get here. --- script/cibuild.cmd | 2 ++ 1 file changed, 2 insertions(+) diff --git a/script/cibuild.cmd b/script/cibuild.cmd index a596b7eba..9065be470 100644 --- a/script/cibuild.cmd +++ b/script/cibuild.cmd @@ -2,6 +2,8 @@ SET BUILD_ATOM_RELEASES_S3_KEY=%BUILD_ATOM_WIN_RELEASES_S3_KEY% SET BUILD_ATOM_RELEASES_S3_SECRET=%BUILD_ATOM_WIN_RELEASES_S3_SECRET% SET BUILD_ATOM_RELEASES_S3_BUCKET=%BUILD_ATOM_WIN_RELEASES_S3_BUCKET% +ECHO Here I go Windowsing again + @IF EXIST "%~dp0\node.exe" ( "%~dp0\node.exe" "%~dp0\cibuild" %* ) ELSE ( From fbf3265f5af7cbcc5d68f9b16b058e0ddf2292a7 Mon Sep 17 00:00:00 2001 From: joshaber Date: Fri, 20 Nov 2015 17:59:59 -0800 Subject: [PATCH 19/53] Revert "Let's see if we get here." This reverts commit 481cacb5d31d28251da8ee276dba6b203753e869. --- script/cibuild.cmd | 2 -- 1 file changed, 2 deletions(-) diff --git a/script/cibuild.cmd b/script/cibuild.cmd index 9065be470..a596b7eba 100644 --- a/script/cibuild.cmd +++ b/script/cibuild.cmd @@ -2,8 +2,6 @@ SET BUILD_ATOM_RELEASES_S3_KEY=%BUILD_ATOM_WIN_RELEASES_S3_KEY% SET BUILD_ATOM_RELEASES_S3_SECRET=%BUILD_ATOM_WIN_RELEASES_S3_SECRET% SET BUILD_ATOM_RELEASES_S3_BUCKET=%BUILD_ATOM_WIN_RELEASES_S3_BUCKET% -ECHO Here I go Windowsing again - @IF EXIST "%~dp0\node.exe" ( "%~dp0\node.exe" "%~dp0\cibuild" %* ) ELSE ( From 0f9cdbec775ccf69834464cedcc53289b0de4a69 Mon Sep 17 00:00:00 2001 From: joshaber Date: Fri, 20 Nov 2015 18:03:14 -0800 Subject: [PATCH 20/53] It helps if you get the names right. --- script/cibuild | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/script/cibuild b/script/cibuild index c4fa533d0..e562b0ea7 100755 --- a/script/cibuild +++ b/script/cibuild @@ -40,11 +40,10 @@ function setEnvironmentVariables() { process.env.CC = 'clang'; process.env.CXX = 'clang++'; process.env.npm_config_clang = '1'; + process.env.BUILD_ATOM_RELEASES_S3_KEY = process.env.BUILD_ATOM_WIN_RELEASES_S3_KEY + process.env.BUILD_ATOM_RELEASES_S3_SECRET = process.env.BUILD_ATOM_WIN_RELEASES_S3_SECRET + process.env.BUILD_ATOM_RELEASES_S3_BUCKET = process.env.BUILD_ATOM_WIN_RELEASES_S3_BUCKET } - - process.env.BUILD_ATOM_RELEASES_S3_KEY = process.env.BUILD_ATOM_WIN_RELEASES_S3_KEY - process.env.BUILD_ATOM_RELEASES_S3_SECRET = process.env.BUILD_ATOM_RELEASES_S3_SECRET - process.env.BUILD_ATOM_RELEASES_S3_BUCKET = process.env.BUILD_ATOM_RELEASES_S3_BUCKET } function removeNodeModules() { From 10628351ea365b42f5748afb031aa3bcefae6c8a Mon Sep 17 00:00:00 2001 From: joshaber Date: Fri, 20 Nov 2015 18:03:21 -0800 Subject: [PATCH 21/53] Only do it on Windows. --- script/cibuild | 1 + 1 file changed, 1 insertion(+) diff --git a/script/cibuild b/script/cibuild index e562b0ea7..860e0a938 100755 --- a/script/cibuild +++ b/script/cibuild @@ -40,6 +40,7 @@ function setEnvironmentVariables() { process.env.CC = 'clang'; process.env.CXX = 'clang++'; process.env.npm_config_clang = '1'; + } else if (process.platform === 'win32') { process.env.BUILD_ATOM_RELEASES_S3_KEY = process.env.BUILD_ATOM_WIN_RELEASES_S3_KEY process.env.BUILD_ATOM_RELEASES_S3_SECRET = process.env.BUILD_ATOM_WIN_RELEASES_S3_SECRET process.env.BUILD_ATOM_RELEASES_S3_BUCKET = process.env.BUILD_ATOM_WIN_RELEASES_S3_BUCKET From 6d20ffc06e31dc88211d49587587cdac7864bc12 Mon Sep 17 00:00:00 2001 From: joshaber Date: Sat, 21 Nov 2015 05:34:39 -0800 Subject: [PATCH 22/53] What you got. --- script/cibuild | 2 ++ 1 file changed, 2 insertions(+) diff --git a/script/cibuild b/script/cibuild index 860e0a938..ae3316cad 100755 --- a/script/cibuild +++ b/script/cibuild @@ -41,6 +41,8 @@ function setEnvironmentVariables() { process.env.CXX = 'clang++'; process.env.npm_config_clang = '1'; } else if (process.platform === 'win32') { + console.log("env:") + console.log(process.env) process.env.BUILD_ATOM_RELEASES_S3_KEY = process.env.BUILD_ATOM_WIN_RELEASES_S3_KEY process.env.BUILD_ATOM_RELEASES_S3_SECRET = process.env.BUILD_ATOM_WIN_RELEASES_S3_SECRET process.env.BUILD_ATOM_RELEASES_S3_BUCKET = process.env.BUILD_ATOM_WIN_RELEASES_S3_BUCKET From bb69ffe015df00d1e0bf01ebaafc518ce8f373fd Mon Sep 17 00:00:00 2001 From: joshaber Date: Sat, 21 Nov 2015 05:47:18 -0800 Subject: [PATCH 23/53] Revert "What you got." This reverts commit 6d20ffc06e31dc88211d49587587cdac7864bc12. --- script/cibuild | 2 -- 1 file changed, 2 deletions(-) diff --git a/script/cibuild b/script/cibuild index ae3316cad..860e0a938 100755 --- a/script/cibuild +++ b/script/cibuild @@ -41,8 +41,6 @@ function setEnvironmentVariables() { process.env.CXX = 'clang++'; process.env.npm_config_clang = '1'; } else if (process.platform === 'win32') { - console.log("env:") - console.log(process.env) process.env.BUILD_ATOM_RELEASES_S3_KEY = process.env.BUILD_ATOM_WIN_RELEASES_S3_KEY process.env.BUILD_ATOM_RELEASES_S3_SECRET = process.env.BUILD_ATOM_WIN_RELEASES_S3_SECRET process.env.BUILD_ATOM_RELEASES_S3_BUCKET = process.env.BUILD_ATOM_WIN_RELEASES_S3_BUCKET From 5648cd633e7f5b511cdc521d19abf34d928961bd Mon Sep 17 00:00:00 2001 From: joshaber Date: Sat, 21 Nov 2015 05:53:57 -0800 Subject: [PATCH 24/53] This is just used for Appveyor, which doesn't need these. --- script/cibuild.cmd | 4 ---- 1 file changed, 4 deletions(-) diff --git a/script/cibuild.cmd b/script/cibuild.cmd index a596b7eba..79197d1b1 100644 --- a/script/cibuild.cmd +++ b/script/cibuild.cmd @@ -1,7 +1,3 @@ -SET BUILD_ATOM_RELEASES_S3_KEY=%BUILD_ATOM_WIN_RELEASES_S3_KEY% -SET BUILD_ATOM_RELEASES_S3_SECRET=%BUILD_ATOM_WIN_RELEASES_S3_SECRET% -SET BUILD_ATOM_RELEASES_S3_BUCKET=%BUILD_ATOM_WIN_RELEASES_S3_BUCKET% - @IF EXIST "%~dp0\node.exe" ( "%~dp0\node.exe" "%~dp0\cibuild" %* ) ELSE ( From cc84246e4ddd0ba9547d1e7955be1f8ef176bb6f Mon Sep 17 00:00:00 2001 From: joshaber Date: Sat, 21 Nov 2015 06:08:13 -0800 Subject: [PATCH 25/53] Revert "REMOVE ME hacks on hacks on hacks" This reverts commit 35d9c3dfffa67a3bc3206e533f3b6ff8f35a6baa. --- build/tasks/set-version-task.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/tasks/set-version-task.coffee b/build/tasks/set-version-task.coffee index 99c147c53..28abb6493 100644 --- a/build/tasks/set-version-task.coffee +++ b/build/tasks/set-version-task.coffee @@ -5,9 +5,9 @@ module.exports = (grunt) -> {spawn} = require('./task-helpers')(grunt) getVersion = (callback) -> - releasableBranches = ['stable', 'beta', 'upload-to-s3'] + releasableBranches = ['stable', 'beta'] channel = grunt.config.get('atom.channel') - shouldUseCommitHash = false # if channel in releasableBranches then false else true + shouldUseCommitHash = if channel in releasableBranches then false else true inRepository = fs.existsSync(path.resolve(__dirname, '..', '..', '.git')) {version} = require(path.join(grunt.config.get('atom.appDir'), 'package.json')) if shouldUseCommitHash and inRepository From 8e79796f3cbbf92aa1615cee14c158a36b924272 Mon Sep 17 00:00:00 2001 From: joshaber Date: Sat, 21 Nov 2015 06:08:48 -0800 Subject: [PATCH 26/53] Revert "Hacks on hacks on hacks to test on test on test" This reverts commit 220b0e67e63b43145f42b1620591469503ae8341. --- build/tasks/publish-build-task.coffee | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/build/tasks/publish-build-task.coffee b/build/tasks/publish-build-task.coffee index 58e8df9a1..d8dffd1ea 100644 --- a/build/tasks/publish-build-task.coffee +++ b/build/tasks/publish-build-task.coffee @@ -37,8 +37,8 @@ module.exports = (gruntObject) -> isPrerelease = false when 'beta' isPrerelease = true - # else - # return + else + return doneCallback = @async() startTime = Date.now() @@ -55,16 +55,12 @@ module.exports = (gruntObject) -> zipAssets buildDir, assets, (error) -> return done(error) if error? - uploadAssets({tag_name: '1.1'}, buildDir, assets, done) - - # zipAssets buildDir, assets, (error) -> - # return done(error) if error? - # getAtomDraftRelease isPrerelease, channel, (error, release) -> - # return done(error) if error? - # assetNames = (asset.assetName for asset in assets) - # deleteExistingAssets release, assetNames, (error) -> - # return done(error) if error? - # uploadAssets(release, buildDir, assets, done) + getAtomDraftRelease isPrerelease, channel, (error, release) -> + return done(error) if error? + assetNames = (asset.assetName for asset in assets) + deleteExistingAssets release, assetNames, (error) -> + return done(error) if error? + uploadAssets(release, buildDir, assets, done) getAssets = -> {cp} = require('./task-helpers')(grunt) @@ -263,6 +259,6 @@ uploadAssets = (release, buildDir, assets, callback) -> tasks = [] for {assetName} in assets assetPath = path.join(buildDir, assetName) - # tasks.push(uploadToReleases.bind(this, release, assetName, assetPath)) + tasks.push(uploadToReleases.bind(this, release, assetName, assetPath)) tasks.push(uploadToS3.bind(this, release, assetName, assetPath)) async.parallel(tasks, callback) From 2d29fd6e79262bd5b8c902f86456ef5a21f224ae Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Fri, 20 Nov 2015 13:28:05 -0800 Subject: [PATCH 27/53] Load config schemas from packages' package.json files --- .../package-with-json-config-schema/package.json | 13 +++++++++++++ spec/package-manager-spec.coffee | 15 +++++++++++++++ src/package.coffee | 13 ++++++++----- 3 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 spec/fixtures/packages/package-with-json-config-schema/package.json diff --git a/spec/fixtures/packages/package-with-json-config-schema/package.json b/spec/fixtures/packages/package-with-json-config-schema/package.json new file mode 100644 index 000000000..960d87fc1 --- /dev/null +++ b/spec/fixtures/packages/package-with-json-config-schema/package.json @@ -0,0 +1,13 @@ +{ + "name": "package-with-json-config-schema", + "configSchema": { + "a": { + "type": "number", + "default": 5 + }, + "b": { + "type": "string", + "default": "five" + } + } +} diff --git a/spec/package-manager-spec.coffee b/spec/package-manager-spec.coffee index 169e09b76..656b4b691 100644 --- a/spec/package-manager-spec.coffee +++ b/spec/package-manager-spec.coffee @@ -194,6 +194,21 @@ describe "PackageManager", -> expect(atom.config.set('package-with-config-schema.numbers.one', '10')).toBe true expect(atom.config.get('package-with-config-schema.numbers.one')).toBe 10 + it "assigns the config schema when the package contains a schema in its package.json", -> + expect(atom.config.get('package-with-json-config-schema')).toBeUndefined() + + waitsForPromise -> + atom.packages.activatePackage('package-with-json-config-schema') + + runs -> + expect(atom.config.getSchema('package-with-json-config-schema')).toEqual { + type: 'object' + properties: { + a: {type: 'number', default: 5} + b: {type: 'string', default: 'five'} + } + } + describe "when the package metadata includes `activationCommands`", -> [mainModule, promise, workspaceCommandListener, registration] = [] diff --git a/src/package.coffee b/src/package.coffee index 1d98c8161..d1354340f 100644 --- a/src/package.coffee +++ b/src/package.coffee @@ -133,11 +133,14 @@ class Package activateConfig: -> return if @configActivated - @requireMainModule() unless @mainModule? - if @mainModule? - if @mainModule.config? and typeof @mainModule.config is 'object' - @config.setSchema @name, {type: 'object', properties: @mainModule.config} - @mainModule.activateConfig?() + if configSchema = @metadata.configSchema + @config.setSchema @name, {type: 'object', properties: configSchema} + else + @requireMainModule() unless @mainModule? + if @mainModule? + if @mainModule.config? and typeof @mainModule.config is 'object' + @config.setSchema @name, {type: 'object', properties: @mainModule.config} + @mainModule.activateConfig?() @configActivated = true activateStylesheets: -> From 5f1947ef1f15393fd25b929914de5fcb6f40c37f Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Fri, 20 Nov 2015 13:42:17 -0800 Subject: [PATCH 28/53] Guard for undefined package.json fields --- src/package.coffee | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/package.coffee b/src/package.coffee index d1354340f..b2a87d1d8 100644 --- a/src/package.coffee +++ b/src/package.coffee @@ -259,21 +259,23 @@ class Package [stylesheetPath, @themeManager.loadStylesheet(stylesheetPath, true)] loadDeserializers: -> - for name, implementationPath of @metadata.deserializers - do => - deserializePath = path.join(@path, implementationPath) - deserializeFunction = null - atom.deserializers.add - name: name, - deserialize: -> - deserializeFunction ?= require(deserializePath) - deserializeFunction.apply(this, arguments) - return + if @metadata.deserializers? + for name, implementationPath of @metadata.deserializers + do => + deserializePath = path.join(@path, implementationPath) + deserializeFunction = null + atom.deserializers.add + name: name, + deserialize: -> + deserializeFunction ?= require(deserializePath) + deserializeFunction.apply(this, arguments) + return loadViewProviders: -> - for implementationPath in @metadata.viewProviders - @viewRegistry.addViewProvider(require(path.join(@path, implementationPath))) - return + if @metadata.viewProviders? + for implementationPath in @metadata.viewProviders + @viewRegistry.addViewProvider(require(path.join(@path, implementationPath))) + return getStylesheetsPath: -> path.join(@path, 'styles') From d6e5ea85642155cf28e224034a558254dd4922fe Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Mon, 23 Nov 2015 16:05:32 -0800 Subject: [PATCH 29/53] Defer requiring packages' main modules if they use new package.json fields --- .../package-with-deserializers/index.js | 3 ++ .../package-with-deserializers/package.json | 1 + .../package-with-view-providers/index.js | 3 ++ .../package-with-view-providers/package.json | 1 + spec/package-manager-spec.coffee | 36 ++++++++-------- src/package.coffee | 43 +++++++++++-------- 6 files changed, 53 insertions(+), 34 deletions(-) create mode 100644 spec/fixtures/packages/package-with-deserializers/index.js create mode 100644 spec/fixtures/packages/package-with-view-providers/index.js diff --git a/spec/fixtures/packages/package-with-deserializers/index.js b/spec/fixtures/packages/package-with-deserializers/index.js new file mode 100644 index 000000000..19bba5ecb --- /dev/null +++ b/spec/fixtures/packages/package-with-deserializers/index.js @@ -0,0 +1,3 @@ +module.exports = { + activate: function() {} +} diff --git a/spec/fixtures/packages/package-with-deserializers/package.json b/spec/fixtures/packages/package-with-deserializers/package.json index c55e1444a..daa5776bf 100644 --- a/spec/fixtures/packages/package-with-deserializers/package.json +++ b/spec/fixtures/packages/package-with-deserializers/package.json @@ -1,6 +1,7 @@ { "name": "package-with-deserializers", "version": "1.0.0", + "main": "./index", "deserializers": { "Deserializer1": "./deserializer-1.js", "Deserializer2": "./deserializer-2.js" diff --git a/spec/fixtures/packages/package-with-view-providers/index.js b/spec/fixtures/packages/package-with-view-providers/index.js new file mode 100644 index 000000000..19bba5ecb --- /dev/null +++ b/spec/fixtures/packages/package-with-view-providers/index.js @@ -0,0 +1,3 @@ +module.exports = { + activate: function() {} +} diff --git a/spec/fixtures/packages/package-with-view-providers/package.json b/spec/fixtures/packages/package-with-view-providers/package.json index 7f7405c32..989473f95 100644 --- a/spec/fixtures/packages/package-with-view-providers/package.json +++ b/spec/fixtures/packages/package-with-view-providers/package.json @@ -1,5 +1,6 @@ { "name": "package-with-view-providers", + "main": "./index", "version": "1.0.0", "viewProviders": [ "./view-provider-1", diff --git a/spec/package-manager-spec.coffee b/spec/package-manager-spec.coffee index 656b4b691..94a6c43c5 100644 --- a/spec/package-manager-spec.coffee +++ b/spec/package-manager-spec.coffee @@ -80,7 +80,7 @@ describe "PackageManager", -> expect(loadedPackage.name).toBe "package-with-main" it "registers any deserializers specified in the package's package.json", -> - atom.packages.loadPackage("package-with-deserializers") + pack = atom.packages.loadPackage("package-with-deserializers") state1 = {deserializer: 'Deserializer1', a: 'b'} expect(atom.deserializers.deserialize(state1)).toEqual { @@ -94,8 +94,10 @@ describe "PackageManager", -> state: state2 } + expect(pack.mainModule).toBeNull() + it "registers any view providers specified in the package's package.json", -> - atom.packages.loadPackage("package-with-view-providers") + pack = atom.packages.loadPackage("package-with-view-providers") model1 = {worksWithViewProvider1: true} element1 = atom.views.getView(model1) @@ -107,6 +109,21 @@ describe "PackageManager", -> expect(element2 instanceof HTMLDivElement).toBe true expect(element2.dataset.createdBy).toBe 'view-provider-2' + expect(pack.mainModule).toBeNull() + + it "registers the config schema in the package's metadata, if present", -> + pack = atom.packages.loadPackage("package-with-json-config-schema") + + expect(atom.config.getSchema('package-with-json-config-schema')).toEqual { + type: 'object' + properties: { + a: {type: 'number', default: 5} + b: {type: 'string', default: 'five'} + } + } + + expect(pack.mainModule).toBeNull() + describe "::unloadPackage(name)", -> describe "when the package is active", -> it "throws an error", -> @@ -194,21 +211,6 @@ describe "PackageManager", -> expect(atom.config.set('package-with-config-schema.numbers.one', '10')).toBe true expect(atom.config.get('package-with-config-schema.numbers.one')).toBe 10 - it "assigns the config schema when the package contains a schema in its package.json", -> - expect(atom.config.get('package-with-json-config-schema')).toBeUndefined() - - waitsForPromise -> - atom.packages.activatePackage('package-with-json-config-schema') - - runs -> - expect(atom.config.getSchema('package-with-json-config-schema')).toEqual { - type: 'object' - properties: { - a: {type: 'number', default: 5} - b: {type: 'string', default: 'five'} - } - } - describe "when the package metadata includes `activationCommands`", -> [mainModule, promise, workspaceCommandListener, registration] = [] diff --git a/src/package.coffee b/src/package.coffee index b2a87d1d8..b97424d04 100644 --- a/src/package.coffee +++ b/src/package.coffee @@ -86,12 +86,22 @@ class Package @loadStylesheets() @loadDeserializers() @loadViewProviders() + @registerConfigSchemaFromMetadata() @settingsPromise = @loadSettings() - @requireMainModule() unless @mainModule? or @activationShouldBeDeferred() + if @shouldRequireMainModuleOnLoad() and not @mainModule? + @requireMainModule() catch error @handleError("Failed to load the #{@name} package", error) this + shouldRequireMainModuleOnLoad: -> + not ( + @metadata.deserializers? or + @metadata.viewProviders? or + @metadata.configSchema? or + @activationShouldBeDeferred() + ) + reset: -> @stylesheets = [] @keymaps = [] @@ -119,9 +129,11 @@ class Package activateNow: -> try - @activateConfig() + @requireMainModule() unless @mainModule? + @registerConfigSchemaFromMainModule() @activateStylesheets() if @mainModule? and not @mainActivated + @mainModule.activateConfig?() @mainModule.activate?(@packageManager.getPackageState(@name) ? {}) @mainActivated = true @activateServices() @@ -130,18 +142,19 @@ class Package @resolveActivationPromise?() - activateConfig: -> - return if @configActivated - + registerConfigSchemaFromMetadata: -> if configSchema = @metadata.configSchema @config.setSchema @name, {type: 'object', properties: configSchema} - else - @requireMainModule() unless @mainModule? - if @mainModule? - if @mainModule.config? and typeof @mainModule.config is 'object' - @config.setSchema @name, {type: 'object', properties: @mainModule.config} - @mainModule.activateConfig?() - @configActivated = true + @configSchemaRegistered = true + + registerConfigSchemaFromMainModule: -> + return if @configSchemaRegistered + + if @mainModule? + if @mainModule.config? and typeof @mainModule.config is 'object' + @config.setSchema @name, {type: 'object', properties: @mainModule.config} + + @configSchemaRegistered = true activateStylesheets: -> return if @stylesheetsActivated @@ -368,20 +381,16 @@ class Package @resolveActivationPromise = null @activationCommandSubscriptions?.dispose() @deactivateResources() - @deactivateConfig() @deactivateKeymaps() if @mainActivated try @mainModule?.deactivate?() + @mainModule?.deactivateConfig?() @mainActivated = false catch e console.error "Error deactivating package '#{@name}'", e.stack @emitter.emit 'did-deactivate' - deactivateConfig: -> - @mainModule?.deactivateConfig?() - @configActivated = false - deactivateResources: -> grammar.deactivate() for grammar in @grammars settings.deactivate() for settings in @settings From 24938c0361366be8715a1a1886e336dfd20dade5 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Mon, 23 Nov 2015 16:28:08 -0800 Subject: [PATCH 30/53] Defer loading view providers until activation or deserializer use Signed-off-by: Nathan Sobo --- .../deserializer.js | 3 + .../package-with-view-providers/package.json | 3 + spec/package-manager-spec.coffee | 59 +++++++++++++++---- src/package.coffee | 11 ++-- 4 files changed, 60 insertions(+), 16 deletions(-) create mode 100644 spec/fixtures/packages/package-with-view-providers/deserializer.js diff --git a/spec/fixtures/packages/package-with-view-providers/deserializer.js b/spec/fixtures/packages/package-with-view-providers/deserializer.js new file mode 100644 index 000000000..334e7b2ab --- /dev/null +++ b/spec/fixtures/packages/package-with-view-providers/deserializer.js @@ -0,0 +1,3 @@ +module.exports = function (state) { + return {state: state} +} diff --git a/spec/fixtures/packages/package-with-view-providers/package.json b/spec/fixtures/packages/package-with-view-providers/package.json index 989473f95..f67477280 100644 --- a/spec/fixtures/packages/package-with-view-providers/package.json +++ b/spec/fixtures/packages/package-with-view-providers/package.json @@ -2,6 +2,9 @@ "name": "package-with-view-providers", "main": "./index", "version": "1.0.0", + "deserializers": { + "DeserializerFromPackageWithViewProviders": "./deserializer" + }, "viewProviders": [ "./view-provider-1", "./view-provider-2" diff --git a/spec/package-manager-spec.coffee b/spec/package-manager-spec.coffee index 94a6c43c5..d82f37acb 100644 --- a/spec/package-manager-spec.coffee +++ b/spec/package-manager-spec.coffee @@ -96,20 +96,57 @@ describe "PackageManager", -> expect(pack.mainModule).toBeNull() - it "registers any view providers specified in the package's package.json", -> - pack = atom.packages.loadPackage("package-with-view-providers") - + describe "when there are view providers specified in the package's package.json", -> model1 = {worksWithViewProvider1: true} - element1 = atom.views.getView(model1) - expect(element1 instanceof HTMLDivElement).toBe true - expect(element1.dataset.createdBy).toBe 'view-provider-1' - model2 = {worksWithViewProvider2: true} - element2 = atom.views.getView(model2) - expect(element2 instanceof HTMLDivElement).toBe true - expect(element2.dataset.createdBy).toBe 'view-provider-2' - expect(pack.mainModule).toBeNull() + afterEach -> + atom.packages.deactivatePackage('package-with-view-providers') + atom.packages.unloadPackage('package-with-view-providers') + + it "does not load the view providers immediately", -> + pack = atom.packages.loadPackage("package-with-view-providers") + expect(pack.mainModule).toBeNull() + + expect(-> atom.views.getView(model1)).toThrow() + expect(-> atom.views.getView(model2)).toThrow() + + it "registers the view providers when the package is activated", -> + pack = atom.packages.loadPackage("package-with-view-providers") + + waitsForPromise -> + atom.packages.activatePackage("package-with-view-providers").then -> + element1 = atom.views.getView(model1) + expect(element1 instanceof HTMLDivElement).toBe true + expect(element1.dataset.createdBy).toBe 'view-provider-1' + + element2 = atom.views.getView(model2) + expect(element2 instanceof HTMLDivElement).toBe true + expect(element2.dataset.createdBy).toBe 'view-provider-2' + + it "registers the view providers when any of the package's deserializers are used", -> + pack = atom.packages.loadPackage("package-with-view-providers") + + spyOn(atom.views, 'addViewProvider').andCallThrough() + atom.deserializers.deserialize({ + deserializer: 'DeserializerFromPackageWithViewProviders', + a: 'b' + }) + expect(atom.views.addViewProvider.callCount).toBe 2 + + atom.deserializers.deserialize({ + deserializer: 'DeserializerFromPackageWithViewProviders', + a: 'b' + }) + expect(atom.views.addViewProvider.callCount).toBe 2 + + element1 = atom.views.getView(model1) + expect(element1 instanceof HTMLDivElement).toBe true + expect(element1.dataset.createdBy).toBe 'view-provider-1' + + element2 = atom.views.getView(model2) + expect(element2 instanceof HTMLDivElement).toBe true + expect(element2.dataset.createdBy).toBe 'view-provider-2' it "registers the config schema in the package's metadata, if present", -> pack = atom.packages.loadPackage("package-with-json-config-schema") diff --git a/src/package.coffee b/src/package.coffee index b97424d04..f437d327a 100644 --- a/src/package.coffee +++ b/src/package.coffee @@ -85,7 +85,6 @@ class Package @loadMenus() @loadStylesheets() @loadDeserializers() - @loadViewProviders() @registerConfigSchemaFromMetadata() @settingsPromise = @loadSettings() if @shouldRequireMainModuleOnLoad() and not @mainModule? @@ -131,6 +130,7 @@ class Package try @requireMainModule() unless @mainModule? @registerConfigSchemaFromMainModule() + @registerViewProviders() @activateStylesheets() if @mainModule? and not @mainActivated @mainModule.activateConfig?() @@ -279,16 +279,17 @@ class Package deserializeFunction = null atom.deserializers.add name: name, - deserialize: -> + deserialize: => + @registerViewProviders() deserializeFunction ?= require(deserializePath) deserializeFunction.apply(this, arguments) return - loadViewProviders: -> - if @metadata.viewProviders? + registerViewProviders: -> + if @metadata.viewProviders? and not @registeredViewProviders for implementationPath in @metadata.viewProviders @viewRegistry.addViewProvider(require(path.join(@path, implementationPath))) - return + @registeredViewProviders = true getStylesheetsPath: -> path.join(@path, 'styles') From 327cf6997bbff1a058d47baa3cdf8ceab90489e5 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Mon, 23 Nov 2015 17:35:38 -0800 Subject: [PATCH 31/53] Remember which packages use atom APIs at main module load time Signed-off-by: Nathan Sobo --- .../package-with-eval-time-api-calls/index.js | 5 ++++ .../package.json | 5 ++++ .../packages/package-with-main/package.cson | 1 + spec/package-manager-spec.coffee | 24 +++++++++++++++++++ spec/package-spec.coffee | 11 +++------ spec/spec-helper.coffee | 6 +++++ src/deserializer-manager.coffee | 3 +++ src/package.coffee | 12 +++++++++- src/view-registry.coffee | 3 +++ 9 files changed, 61 insertions(+), 9 deletions(-) create mode 100644 spec/fixtures/packages/package-with-eval-time-api-calls/index.js create mode 100644 spec/fixtures/packages/package-with-eval-time-api-calls/package.json diff --git a/spec/fixtures/packages/package-with-eval-time-api-calls/index.js b/spec/fixtures/packages/package-with-eval-time-api-calls/index.js new file mode 100644 index 000000000..e16db0743 --- /dev/null +++ b/spec/fixtures/packages/package-with-eval-time-api-calls/index.js @@ -0,0 +1,5 @@ +atom.deserializers.add('MyDeserializer', function (state) { + return {state: state, a: 'b'} +}) + +exports.activate = function () {} diff --git a/spec/fixtures/packages/package-with-eval-time-api-calls/package.json b/spec/fixtures/packages/package-with-eval-time-api-calls/package.json new file mode 100644 index 000000000..7a76abb5f --- /dev/null +++ b/spec/fixtures/packages/package-with-eval-time-api-calls/package.json @@ -0,0 +1,5 @@ +{ + "name": "package-with-eval-time-api-calls", + "version": "1.2.3", + "main": "./index" +} diff --git a/spec/fixtures/packages/package-with-main/package.cson b/spec/fixtures/packages/package-with-main/package.cson index e799f6ca8..75910bbcc 100644 --- a/spec/fixtures/packages/package-with-main/package.cson +++ b/spec/fixtures/packages/package-with-main/package.cson @@ -1 +1,2 @@ 'main': 'main-module.coffee' +'version': '2.3.4' diff --git a/spec/package-manager-spec.coffee b/spec/package-manager-spec.coffee index d82f37acb..4e88a1c2f 100644 --- a/spec/package-manager-spec.coffee +++ b/spec/package-manager-spec.coffee @@ -1,6 +1,7 @@ path = require 'path' Package = require '../src/package' {Disposable} = require 'atom' +{mockLocalStorage} = require './spec-helper' describe "PackageManager", -> workspaceElement = null @@ -161,6 +162,29 @@ describe "PackageManager", -> expect(pack.mainModule).toBeNull() + describe "when a package does not have deserializers, view providers or a config schema in its package.json", -> + beforeEach -> + atom.packages.unloadPackage('package-with-main') + mockLocalStorage() + + it "defers loading the package's main module if the package previously used no Atom APIs when its main module was required", -> + pack1 = atom.packages.loadPackage('package-with-main') + expect(pack1.mainModule).toBeDefined() + + atom.packages.unloadPackage('package-with-main') + + pack2 = atom.packages.loadPackage('package-with-main') + expect(pack2.mainModule).toBeNull() + + it "does not defer loading the package's main module if the package previously used Atom APIs when its main module was required", -> + pack1 = atom.packages.loadPackage('package-with-eval-time-api-calls') + expect(pack1.mainModule).toBeDefined() + + atom.packages.unloadPackage('package-with-eval-time-api-calls') + + pack2 = atom.packages.loadPackage('package-with-eval-time-api-calls') + expect(pack2.mainModule).not.toBeNull() + describe "::unloadPackage(name)", -> describe "when the package is active", -> it "throws an error", -> diff --git a/spec/package-spec.coffee b/spec/package-spec.coffee index f49d2ed7c..92218e749 100644 --- a/spec/package-spec.coffee +++ b/spec/package-spec.coffee @@ -1,6 +1,7 @@ path = require 'path' Package = require '../src/package' ThemePackage = require '../src/theme-package' +{mockLocalStorage} = require './spec-helper' describe "Package", -> build = (constructor, path) -> @@ -20,10 +21,7 @@ describe "Package", -> describe "when the package contains incompatible native modules", -> beforeEach -> - items = {} - spyOn(global.localStorage, 'setItem').andCallFake (key, item) -> items[key] = item; undefined - spyOn(global.localStorage, 'getItem').andCallFake (key) -> items[key] ? null - spyOn(global.localStorage, 'removeItem').andCallFake (key) -> delete items[key]; undefined + mockLocalStorage() it "does not activate it", -> packagePath = atom.project.getDirectories()[0]?.resolve('packages/package-with-incompatible-native-module') @@ -55,10 +53,7 @@ describe "Package", -> describe "::rebuild()", -> beforeEach -> - items = {} - spyOn(global.localStorage, 'setItem').andCallFake (key, item) -> items[key] = item; undefined - spyOn(global.localStorage, 'getItem').andCallFake (key) -> items[key] ? null - spyOn(global.localStorage, 'removeItem').andCallFake (key) -> delete items[key]; undefined + mockLocalStorage() it "returns a promise resolving to the results of `apm rebuild`", -> packagePath = atom.project.getDirectories()[0]?.resolve('packages/package-with-index') diff --git a/spec/spec-helper.coffee b/spec/spec-helper.coffee index f31c67298..67883511b 100644 --- a/spec/spec-helper.coffee +++ b/spec/spec-helper.coffee @@ -265,3 +265,9 @@ window.advanceClock = (delta=1) -> true callback() for callback in callbacks + +exports.mockLocalStorage = -> + items = {} + spyOn(global.localStorage, 'setItem').andCallFake (key, item) -> items[key] = item.toString(); undefined + spyOn(global.localStorage, 'getItem').andCallFake (key) -> items[key] ? null + spyOn(global.localStorage, 'removeItem').andCallFake (key) -> delete items[key]; undefined diff --git a/src/deserializer-manager.coffee b/src/deserializer-manager.coffee index 7f6cb0f65..3c73a0b02 100644 --- a/src/deserializer-manager.coffee +++ b/src/deserializer-manager.coffee @@ -39,6 +39,9 @@ class DeserializerManager delete @deserializers[deserializer.name] for deserializer in deserializers return + getDeserializerCount: -> + Object.keys(@deserializers).length + # Public: Deserialize the state and params. # # * `state` The state {Object} to deserialize. diff --git a/src/package.coffee b/src/package.coffee index f437d327a..5ff008ec7 100644 --- a/src/package.coffee +++ b/src/package.coffee @@ -98,7 +98,8 @@ class Package @metadata.deserializers? or @metadata.viewProviders? or @metadata.configSchema? or - @activationShouldBeDeferred() + @activationShouldBeDeferred() or + localStorage.getItem(@getCanDeferMainModuleRequireStorageKey()) is 'true' ) reset: -> @@ -426,7 +427,13 @@ class Package mainModulePath = @getMainModulePath() if fs.isFileSync(mainModulePath) @mainModuleRequired = true + + previousViewProviderCount = @viewRegistry.getViewProviderCount() + previousDeserializerCount = @deserializerManager.getDeserializerCount() @mainModule = require(mainModulePath) + if (@viewRegistry.getViewProviderCount() is previousViewProviderCount and + @deserializerManager.getDeserializerCount() is previousDeserializerCount) + localStorage.setItem(@getCanDeferMainModuleRequireStorageKey(), 'true') getMainModulePath: -> return @mainModulePath if @resolvedMainModulePath @@ -620,6 +627,9 @@ class Package electronVersion = process.versions['electron'] ? process.versions['atom-shell'] "installed-packages:#{@name}:#{@metadata.version}:electron-#{electronVersion}:incompatible-native-modules" + getCanDeferMainModuleRequireStorageKey: -> + "installed-packages:#{@name}:#{@metadata.version}:can-defer-main-module-require" + # Get the incompatible native modules that this package depends on. # This recurses through all dependencies and requires all modules that # contain a `.node` file. diff --git a/src/view-registry.coffee b/src/view-registry.coffee index e754a010b..ef7151353 100644 --- a/src/view-registry.coffee +++ b/src/view-registry.coffee @@ -106,6 +106,9 @@ class ViewRegistry new Disposable => @providers = @providers.filter (p) -> p isnt provider + getViewProviderCount: -> + @providers.length + # Essential: Get the view associated with an object in the workspace. # # If you're just *using* the workspace, you shouldn't need to access the view From f35dddee2f40a0a5edbd3c7afd0b1c19404ae3b6 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Mon, 23 Nov 2015 18:01:26 -0800 Subject: [PATCH 32/53] Reregister config schema when package is reactivated Signed-off-by: Nathan Sobo --- src/package.coffee | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/package.coffee b/src/package.coffee index 5ff008ec7..08b434583 100644 --- a/src/package.coffee +++ b/src/package.coffee @@ -85,7 +85,7 @@ class Package @loadMenus() @loadStylesheets() @loadDeserializers() - @registerConfigSchemaFromMetadata() + @configSchemaRegisteredOnLoad = @registerConfigSchemaFromMetadata() @settingsPromise = @loadSettings() if @shouldRequireMainModuleOnLoad() and not @mainModule? @requireMainModule() @@ -130,7 +130,7 @@ class Package activateNow: -> try @requireMainModule() unless @mainModule? - @registerConfigSchemaFromMainModule() + @configSchemaRegisteredOnActivate = @registerConfigSchemaFromMainModule() @registerViewProviders() @activateStylesheets() if @mainModule? and not @mainActivated @@ -146,16 +146,16 @@ class Package registerConfigSchemaFromMetadata: -> if configSchema = @metadata.configSchema @config.setSchema @name, {type: 'object', properties: configSchema} - @configSchemaRegistered = true + true + else + false registerConfigSchemaFromMainModule: -> - return if @configSchemaRegistered - - if @mainModule? + if @mainModule? and not @configSchemaRegisteredOnLoad if @mainModule.config? and typeof @mainModule.config is 'object' @config.setSchema @name, {type: 'object', properties: @mainModule.config} - - @configSchemaRegistered = true + return true + false activateStylesheets: -> return if @stylesheetsActivated @@ -382,6 +382,7 @@ class Package @activationPromise = null @resolveActivationPromise = null @activationCommandSubscriptions?.dispose() + @configSchemaRegisteredOnActivate = false @deactivateResources() @deactivateKeymaps() if @mainActivated From 7b976bc689e479995ca1ce40a5f2cc357aa5984a Mon Sep 17 00:00:00 2001 From: joshaber Date: Tue, 24 Nov 2015 13:07:05 -0500 Subject: [PATCH 33/53] Don't cache me bro. --- build/tasks/publish-build-task.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/build/tasks/publish-build-task.coffee b/build/tasks/publish-build-task.coffee index d8dffd1ea..b375123d3 100644 --- a/build/tasks/publish-build-task.coffee +++ b/build/tasks/publish-build-task.coffee @@ -249,6 +249,7 @@ uploadAssets = (release, buildDir, assets, callback) -> ACL: 'public-read' Key: key Body: fs.createReadStream(assetPath) + CacheControl: 'max-age=0' s3.upload uploadParams, (error, data) -> if error? console.log("Upload release asset #{assetName} to S3 failed", error) From 338d429d48cc7491d507f4df2b7ac73dd79e3ee7 Mon Sep 17 00:00:00 2001 From: joshaber Date: Tue, 24 Nov 2015 15:41:28 -0500 Subject: [PATCH 34/53] REVERT ME: Hacks on hacks on hacks to test. --- build/tasks/publish-build-task.coffee | 22 +++++++++++++--------- build/tasks/set-version-task.coffee | 4 ++-- package.json | 2 +- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/build/tasks/publish-build-task.coffee b/build/tasks/publish-build-task.coffee index b375123d3..518ccc77e 100644 --- a/build/tasks/publish-build-task.coffee +++ b/build/tasks/publish-build-task.coffee @@ -37,8 +37,8 @@ module.exports = (gruntObject) -> isPrerelease = false when 'beta' isPrerelease = true - else - return + # else + # return doneCallback = @async() startTime = Date.now() @@ -55,12 +55,16 @@ module.exports = (gruntObject) -> zipAssets buildDir, assets, (error) -> return done(error) if error? - getAtomDraftRelease isPrerelease, channel, (error, release) -> - return done(error) if error? - assetNames = (asset.assetName for asset in assets) - deleteExistingAssets release, assetNames, (error) -> - return done(error) if error? - uploadAssets(release, buildDir, assets, done) + uploadAssets({tag_name: 'v1.1'}, buildDir, assets, done) + + # zipAssets buildDir, assets, (error) -> + # return done(error) if error? + # getAtomDraftRelease isPrerelease, channel, (error, release) -> + # return done(error) if error? + # assetNames = (asset.assetName for asset in assets) + # deleteExistingAssets release, assetNames, (error) -> + # return done(error) if error? + # uploadAssets(release, buildDir, assets, done) getAssets = -> {cp} = require('./task-helpers')(grunt) @@ -260,6 +264,6 @@ uploadAssets = (release, buildDir, assets, callback) -> tasks = [] for {assetName} in assets assetPath = path.join(buildDir, assetName) - tasks.push(uploadToReleases.bind(this, release, assetName, assetPath)) + # tasks.push(uploadToReleases.bind(this, release, assetName, assetPath)) tasks.push(uploadToS3.bind(this, release, assetName, assetPath)) async.parallel(tasks, callback) diff --git a/build/tasks/set-version-task.coffee b/build/tasks/set-version-task.coffee index 28abb6493..99c147c53 100644 --- a/build/tasks/set-version-task.coffee +++ b/build/tasks/set-version-task.coffee @@ -5,9 +5,9 @@ module.exports = (grunt) -> {spawn} = require('./task-helpers')(grunt) getVersion = (callback) -> - releasableBranches = ['stable', 'beta'] + releasableBranches = ['stable', 'beta', 'upload-to-s3'] channel = grunt.config.get('atom.channel') - shouldUseCommitHash = if channel in releasableBranches then false else true + shouldUseCommitHash = false # if channel in releasableBranches then false else true inRepository = fs.existsSync(path.resolve(__dirname, '..', '..', '.git')) {version} = require(path.join(grunt.config.get('atom.appDir'), 'package.json')) if shouldUseCommitHash and inRepository diff --git a/package.json b/package.json index 0ffc69221..2b563bf7c 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "atom", "productName": "Atom", - "version": "1.4.0-dev", + "version": "1.1.0-dev", "description": "A hackable text editor for the 21st Century.", "main": "./src/browser/main.js", "repository": { From 4d21f1418efaefea003161dd6010071ee0a3ac7d Mon Sep 17 00:00:00 2001 From: joshaber Date: Tue, 24 Nov 2015 16:08:01 -0500 Subject: [PATCH 35/53] REVERT ME: Test again --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2b563bf7c..bc4359ae1 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "atom", "productName": "Atom", - "version": "1.1.0-dev", + "version": "1.2.0-dev", "description": "A hackable text editor for the 21st Century.", "main": "./src/browser/main.js", "repository": { From 212afba8b1ca6fd25034a0728376bb366a53a340 Mon Sep 17 00:00:00 2001 From: joshaber Date: Tue, 24 Nov 2015 17:07:05 -0500 Subject: [PATCH 36/53] Revert "REVERT ME: Test again" This reverts commit 4d21f1418efaefea003161dd6010071ee0a3ac7d. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bc4359ae1..2b563bf7c 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "atom", "productName": "Atom", - "version": "1.2.0-dev", + "version": "1.1.0-dev", "description": "A hackable text editor for the 21st Century.", "main": "./src/browser/main.js", "repository": { From 233e6e47818ba740c6da3a0be26608313bd556c1 Mon Sep 17 00:00:00 2001 From: joshaber Date: Tue, 24 Nov 2015 17:07:09 -0500 Subject: [PATCH 37/53] Revert "REVERT ME: Hacks on hacks on hacks to test." This reverts commit 338d429d48cc7491d507f4df2b7ac73dd79e3ee7. --- build/tasks/publish-build-task.coffee | 22 +++++++++------------- build/tasks/set-version-task.coffee | 4 ++-- package.json | 2 +- 3 files changed, 12 insertions(+), 16 deletions(-) diff --git a/build/tasks/publish-build-task.coffee b/build/tasks/publish-build-task.coffee index 518ccc77e..b375123d3 100644 --- a/build/tasks/publish-build-task.coffee +++ b/build/tasks/publish-build-task.coffee @@ -37,8 +37,8 @@ module.exports = (gruntObject) -> isPrerelease = false when 'beta' isPrerelease = true - # else - # return + else + return doneCallback = @async() startTime = Date.now() @@ -55,16 +55,12 @@ module.exports = (gruntObject) -> zipAssets buildDir, assets, (error) -> return done(error) if error? - uploadAssets({tag_name: 'v1.1'}, buildDir, assets, done) - - # zipAssets buildDir, assets, (error) -> - # return done(error) if error? - # getAtomDraftRelease isPrerelease, channel, (error, release) -> - # return done(error) if error? - # assetNames = (asset.assetName for asset in assets) - # deleteExistingAssets release, assetNames, (error) -> - # return done(error) if error? - # uploadAssets(release, buildDir, assets, done) + getAtomDraftRelease isPrerelease, channel, (error, release) -> + return done(error) if error? + assetNames = (asset.assetName for asset in assets) + deleteExistingAssets release, assetNames, (error) -> + return done(error) if error? + uploadAssets(release, buildDir, assets, done) getAssets = -> {cp} = require('./task-helpers')(grunt) @@ -264,6 +260,6 @@ uploadAssets = (release, buildDir, assets, callback) -> tasks = [] for {assetName} in assets assetPath = path.join(buildDir, assetName) - # tasks.push(uploadToReleases.bind(this, release, assetName, assetPath)) + tasks.push(uploadToReleases.bind(this, release, assetName, assetPath)) tasks.push(uploadToS3.bind(this, release, assetName, assetPath)) async.parallel(tasks, callback) diff --git a/build/tasks/set-version-task.coffee b/build/tasks/set-version-task.coffee index 99c147c53..28abb6493 100644 --- a/build/tasks/set-version-task.coffee +++ b/build/tasks/set-version-task.coffee @@ -5,9 +5,9 @@ module.exports = (grunt) -> {spawn} = require('./task-helpers')(grunt) getVersion = (callback) -> - releasableBranches = ['stable', 'beta', 'upload-to-s3'] + releasableBranches = ['stable', 'beta'] channel = grunt.config.get('atom.channel') - shouldUseCommitHash = false # if channel in releasableBranches then false else true + shouldUseCommitHash = if channel in releasableBranches then false else true inRepository = fs.existsSync(path.resolve(__dirname, '..', '..', '.git')) {version} = require(path.join(grunt.config.get('atom.appDir'), 'package.json')) if shouldUseCommitHash and inRepository diff --git a/package.json b/package.json index 2b563bf7c..0ffc69221 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "atom", "productName": "Atom", - "version": "1.1.0-dev", + "version": "1.4.0-dev", "description": "A hackable text editor for the 21st Century.", "main": "./src/browser/main.js", "repository": { From aecc2598f9d3af978334df37df5badddc8b512d0 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Tue, 24 Nov 2015 15:14:39 -0800 Subject: [PATCH 38/53] Restore private activateConfig method to fix settings-view --- src/package.coffee | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/package.coffee b/src/package.coffee index 08b434583..b831b3c55 100644 --- a/src/package.coffee +++ b/src/package.coffee @@ -157,6 +157,9 @@ class Package return true false + # TODO: Remove. Settings view calls this method currently. + activateConfig: -> @registerConfigSchemaFromMainModule() + activateStylesheets: -> return if @stylesheetsActivated From aac52b70206ac4fc2b4224402a23b46c280f7d95 Mon Sep 17 00:00:00 2001 From: Ross Allen Date: Tue, 24 Nov 2015 15:45:11 -0800 Subject: [PATCH 39/53] Correct config.coffee doc references to `scope` The scope selector is referred to with the key `scope` on the options object, not `scopeDescriptor` as the current docs claim. Reference `scope` correctly. Mark `options` as optional for `::observe` because the arguments collection is checked for length, and a length of 2 assumes the second argument is `callback`. `options` is actually optional. --- src/config.coffee | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/config.coffee b/src/config.coffee index 489e16016..d2759fcb4 100644 --- a/src/config.coffee +++ b/src/config.coffee @@ -381,8 +381,8 @@ class Config # ``` # # * `keyPath` {String} name of the key to observe - # * `options` {Object} - # * `scopeDescriptor` (optional) {ScopeDescriptor} describing a path from + # * `options` (optional) {Object} + # * `scope` (optional) {ScopeDescriptor} describing a path from # the root of the syntax tree to a token. Get one by calling # {editor.getLastCursor().getScopeDescriptor()}. See {::get} for examples. # See [the scopes docs](https://atom.io/docs/latest/behind-atom-scoped-settings-scopes-and-scope-descriptors) @@ -412,8 +412,8 @@ class Config # # * `keyPath` (optional) {String} name of the key to observe. Must be # specified if `scopeDescriptor` is specified. - # * `optional` (optional) {Object} - # * `scopeDescriptor` (optional) {ScopeDescriptor} describing a path from + # * `options` (optional) {Object} + # * `scope` (optional) {ScopeDescriptor} describing a path from # the root of the syntax tree to a token. Get one by calling # {editor.getLastCursor().getScopeDescriptor()}. See {::get} for examples. # See [the scopes docs](https://atom.io/docs/latest/behind-atom-scoped-settings-scopes-and-scope-descriptors) From 9bd81d00e9d82e73c8a65d7ab29b217968cf4daf Mon Sep 17 00:00:00 2001 From: joshaber Date: Mon, 30 Nov 2015 10:16:13 -0500 Subject: [PATCH 40/53] Don't use a zero max age anymore. --- build/tasks/publish-build-task.coffee | 1 - 1 file changed, 1 deletion(-) diff --git a/build/tasks/publish-build-task.coffee b/build/tasks/publish-build-task.coffee index b375123d3..d8dffd1ea 100644 --- a/build/tasks/publish-build-task.coffee +++ b/build/tasks/publish-build-task.coffee @@ -249,7 +249,6 @@ uploadAssets = (release, buildDir, assets, callback) -> ACL: 'public-read' Key: key Body: fs.createReadStream(assetPath) - CacheControl: 'max-age=0' s3.upload uploadParams, (error, data) -> if error? console.log("Upload release asset #{assetName} to S3 failed", error) From 1340597c5f78f1bdea7c0ba06a4090b8d3f13b04 Mon Sep 17 00:00:00 2001 From: joshaber Date: Mon, 30 Nov 2015 11:09:45 -0500 Subject: [PATCH 41/53] Revert "Revert "REVERT ME: Hacks on hacks on hacks to test."" This reverts commit 233e6e47818ba740c6da3a0be26608313bd556c1. --- build/tasks/publish-build-task.coffee | 22 +++++++++++++--------- build/tasks/set-version-task.coffee | 4 ++-- package.json | 2 +- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/build/tasks/publish-build-task.coffee b/build/tasks/publish-build-task.coffee index d8dffd1ea..ea1188350 100644 --- a/build/tasks/publish-build-task.coffee +++ b/build/tasks/publish-build-task.coffee @@ -37,8 +37,8 @@ module.exports = (gruntObject) -> isPrerelease = false when 'beta' isPrerelease = true - else - return + # else + # return doneCallback = @async() startTime = Date.now() @@ -55,12 +55,16 @@ module.exports = (gruntObject) -> zipAssets buildDir, assets, (error) -> return done(error) if error? - getAtomDraftRelease isPrerelease, channel, (error, release) -> - return done(error) if error? - assetNames = (asset.assetName for asset in assets) - deleteExistingAssets release, assetNames, (error) -> - return done(error) if error? - uploadAssets(release, buildDir, assets, done) + uploadAssets({tag_name: 'v1.1'}, buildDir, assets, done) + + # zipAssets buildDir, assets, (error) -> + # return done(error) if error? + # getAtomDraftRelease isPrerelease, channel, (error, release) -> + # return done(error) if error? + # assetNames = (asset.assetName for asset in assets) + # deleteExistingAssets release, assetNames, (error) -> + # return done(error) if error? + # uploadAssets(release, buildDir, assets, done) getAssets = -> {cp} = require('./task-helpers')(grunt) @@ -259,6 +263,6 @@ uploadAssets = (release, buildDir, assets, callback) -> tasks = [] for {assetName} in assets assetPath = path.join(buildDir, assetName) - tasks.push(uploadToReleases.bind(this, release, assetName, assetPath)) + # tasks.push(uploadToReleases.bind(this, release, assetName, assetPath)) tasks.push(uploadToS3.bind(this, release, assetName, assetPath)) async.parallel(tasks, callback) diff --git a/build/tasks/set-version-task.coffee b/build/tasks/set-version-task.coffee index 28abb6493..99c147c53 100644 --- a/build/tasks/set-version-task.coffee +++ b/build/tasks/set-version-task.coffee @@ -5,9 +5,9 @@ module.exports = (grunt) -> {spawn} = require('./task-helpers')(grunt) getVersion = (callback) -> - releasableBranches = ['stable', 'beta'] + releasableBranches = ['stable', 'beta', 'upload-to-s3'] channel = grunt.config.get('atom.channel') - shouldUseCommitHash = if channel in releasableBranches then false else true + shouldUseCommitHash = false # if channel in releasableBranches then false else true inRepository = fs.existsSync(path.resolve(__dirname, '..', '..', '.git')) {version} = require(path.join(grunt.config.get('atom.appDir'), 'package.json')) if shouldUseCommitHash and inRepository diff --git a/package.json b/package.json index 4eb575535..d24638a73 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "atom", "productName": "Atom", - "version": "1.4.0-dev", + "version": "1.1.0-dev", "description": "A hackable text editor for the 21st Century.", "main": "./src/browser/main.js", "repository": { From 1fd7267f10d693bdfd1260f5694069d8399f62f8 Mon Sep 17 00:00:00 2001 From: joshaber Date: Mon, 30 Nov 2015 11:34:08 -0500 Subject: [PATCH 42/53] REVERT ME: Tests gonna test --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d24638a73..ed33be9a6 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "atom", "productName": "Atom", - "version": "1.1.0-dev", + "version": "1.2.0-dev", "description": "A hackable text editor for the 21st Century.", "main": "./src/browser/main.js", "repository": { From 9fabac6fde4dd25357ed7998af530e2b77f44f59 Mon Sep 17 00:00:00 2001 From: joshaber Date: Mon, 30 Nov 2015 12:27:05 -0500 Subject: [PATCH 43/53] Revert "REVERT ME: Tests gonna test" This reverts commit 1fd7267f10d693bdfd1260f5694069d8399f62f8. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ed33be9a6..d24638a73 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "atom", "productName": "Atom", - "version": "1.2.0-dev", + "version": "1.1.0-dev", "description": "A hackable text editor for the 21st Century.", "main": "./src/browser/main.js", "repository": { From d223e0738977e5071ba946fe8713151d9f02c4ed Mon Sep 17 00:00:00 2001 From: joshaber Date: Mon, 30 Nov 2015 12:27:09 -0500 Subject: [PATCH 44/53] Revert "Revert "Revert "REVERT ME: Hacks on hacks on hacks to test.""" This reverts commit 1340597c5f78f1bdea7c0ba06a4090b8d3f13b04. --- build/tasks/publish-build-task.coffee | 22 +++++++++------------- build/tasks/set-version-task.coffee | 4 ++-- package.json | 2 +- 3 files changed, 12 insertions(+), 16 deletions(-) diff --git a/build/tasks/publish-build-task.coffee b/build/tasks/publish-build-task.coffee index ea1188350..d8dffd1ea 100644 --- a/build/tasks/publish-build-task.coffee +++ b/build/tasks/publish-build-task.coffee @@ -37,8 +37,8 @@ module.exports = (gruntObject) -> isPrerelease = false when 'beta' isPrerelease = true - # else - # return + else + return doneCallback = @async() startTime = Date.now() @@ -55,16 +55,12 @@ module.exports = (gruntObject) -> zipAssets buildDir, assets, (error) -> return done(error) if error? - uploadAssets({tag_name: 'v1.1'}, buildDir, assets, done) - - # zipAssets buildDir, assets, (error) -> - # return done(error) if error? - # getAtomDraftRelease isPrerelease, channel, (error, release) -> - # return done(error) if error? - # assetNames = (asset.assetName for asset in assets) - # deleteExistingAssets release, assetNames, (error) -> - # return done(error) if error? - # uploadAssets(release, buildDir, assets, done) + getAtomDraftRelease isPrerelease, channel, (error, release) -> + return done(error) if error? + assetNames = (asset.assetName for asset in assets) + deleteExistingAssets release, assetNames, (error) -> + return done(error) if error? + uploadAssets(release, buildDir, assets, done) getAssets = -> {cp} = require('./task-helpers')(grunt) @@ -263,6 +259,6 @@ uploadAssets = (release, buildDir, assets, callback) -> tasks = [] for {assetName} in assets assetPath = path.join(buildDir, assetName) - # tasks.push(uploadToReleases.bind(this, release, assetName, assetPath)) + tasks.push(uploadToReleases.bind(this, release, assetName, assetPath)) tasks.push(uploadToS3.bind(this, release, assetName, assetPath)) async.parallel(tasks, callback) diff --git a/build/tasks/set-version-task.coffee b/build/tasks/set-version-task.coffee index 99c147c53..28abb6493 100644 --- a/build/tasks/set-version-task.coffee +++ b/build/tasks/set-version-task.coffee @@ -5,9 +5,9 @@ module.exports = (grunt) -> {spawn} = require('./task-helpers')(grunt) getVersion = (callback) -> - releasableBranches = ['stable', 'beta', 'upload-to-s3'] + releasableBranches = ['stable', 'beta'] channel = grunt.config.get('atom.channel') - shouldUseCommitHash = false # if channel in releasableBranches then false else true + shouldUseCommitHash = if channel in releasableBranches then false else true inRepository = fs.existsSync(path.resolve(__dirname, '..', '..', '.git')) {version} = require(path.join(grunt.config.get('atom.appDir'), 'package.json')) if shouldUseCommitHash and inRepository diff --git a/package.json b/package.json index d24638a73..4eb575535 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "atom", "productName": "Atom", - "version": "1.1.0-dev", + "version": "1.4.0-dev", "description": "A hackable text editor for the 21st Century.", "main": "./src/browser/main.js", "repository": { From a2f14685fcdfa2970db7658e97f046c9493c2a0a Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Mon, 30 Nov 2015 10:15:16 -0800 Subject: [PATCH 45/53] :arrow_up: autocomplete-snippets --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b488ba3ce..31086502b 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "autocomplete-css": "0.11.0", "autocomplete-html": "0.7.2", "autocomplete-plus": "2.23.0", - "autocomplete-snippets": "1.8.0", + "autocomplete-snippets": "1.9.0", "autoflow": "0.26.0", "autosave": "0.23.0", "background-tips": "0.26.0", From 6cd31f94e9a1f5cca8ea954954ad2f8df808b036 Mon Sep 17 00:00:00 2001 From: joshaber Date: Mon, 30 Nov 2015 13:21:25 -0500 Subject: [PATCH 46/53] Use logError instead of console.log. --- build/tasks/publish-build-task.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/tasks/publish-build-task.coffee b/build/tasks/publish-build-task.coffee index d8dffd1ea..4f8df6336 100644 --- a/build/tasks/publish-build-task.coffee +++ b/build/tasks/publish-build-task.coffee @@ -251,7 +251,7 @@ uploadAssets = (release, buildDir, assets, callback) -> Body: fs.createReadStream(assetPath) s3.upload uploadParams, (error, data) -> if error? - console.log("Upload release asset #{assetName} to S3 failed", error) + logError("Upload release asset #{assetName} to S3 failed", error) callback(error) else callback(null, release) From 228e67838c7705c9e1fca19d84ba8a6bf7000fbd Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Mon, 30 Nov 2015 10:51:03 -0800 Subject: [PATCH 47/53] Suppress false coffeelint error --- spec/workspace-spec.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/workspace-spec.coffee b/spec/workspace-spec.coffee index e150761af..0587a2629 100644 --- a/spec/workspace-spec.coffee +++ b/spec/workspace-spec.coffee @@ -661,7 +661,7 @@ describe "Workspace", -> describe "::isTextEditor(obj)", -> it "returns true when the passed object is an instance of `TextEditor`", -> expect(workspace.isTextEditor(atom.workspace.buildTextEditor())).toBe(true) - expect(workspace.isTextEditor({getText: ->})).toBe(false) + expect(workspace.isTextEditor({getText: -> null})).toBe(false) expect(workspace.isTextEditor(null)).toBe(false) expect(workspace.isTextEditor(undefined)).toBe(false) From f139992585fddd88ffdea3513c64503db6be0516 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Mon, 30 Nov 2015 10:47:40 -0800 Subject: [PATCH 48/53] Avoid infinite recursion in Error.prepareStackTrace Previously, prepareStackTraceWithStackAssignment could end up calling itself when third-party code assigned Error.prepareStackTrace back to its original value. Now, we short-circuit this process if the rawStack property has already been assigned. Signed-off-by: Max Brunsfeld --- spec/compile-cache-spec.coffee | 23 ++++++++++++++++++++++- src/compile-cache.js | 8 ++++++-- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/spec/compile-cache-spec.coffee b/spec/compile-cache-spec.coffee index 8a6cc214e..848da6b49 100644 --- a/spec/compile-cache-spec.coffee +++ b/spec/compile-cache-spec.coffee @@ -81,6 +81,27 @@ describe 'CompileCache', -> waits(1) runs -> error = new Error("Oops again") - console.log error.stack expect(error.stack).toContain('compile-cache-spec.coffee') expect(Array.isArray(error.getRawStack())).toBe true + + it 'does not infinitely loop when the original prepareStackTrace value is reassigned', -> + originalPrepareStackTrace = Error.prepareStackTrace + + Error.prepareStackTrace = -> 'a-stack-trace' + Error.prepareStackTrace = originalPrepareStackTrace + + error = new Error('Oops') + expect(error.stack).toContain('compile-cache-spec.coffee') + expect(Array.isArray(error.getRawStack())).toBe true + + it 'does not infinitely loop when the assigned prepareStackTrace calls the original prepareStackTrace', -> + originalPrepareStackTrace = Error.prepareStackTrace + + Error.prepareStackTrace = (error, stack) -> + error.foo = 'bar' + originalPrepareStackTrace(error, stack) + + error = new Error('Oops') + expect(error.stack).toContain('compile-cache-spec.coffee') + expect(error.foo).toBe('bar') + expect(Array.isArray(error.getRawStack())).toBe true diff --git a/src/compile-cache.js b/src/compile-cache.js index bedbd2549..8da229a50 100644 --- a/src/compile-cache.js +++ b/src/compile-cache.js @@ -163,8 +163,12 @@ var prepareStackTraceWithSourceMapping = Error.prepareStackTrace let prepareStackTrace = prepareStackTraceWithSourceMapping function prepareStackTraceWithRawStackAssignment (error, frames) { - error.rawStack = frames - return prepareStackTrace(error, frames) + if (error.rawStack) { // avoid infinite recursion + return prepareStackTraceWithSourceMapping(error, frames) + } else { + error.rawStack = frames + return prepareStackTrace(error, frames) + } } Object.defineProperty(Error, 'prepareStackTrace', { From 3836b5cbaac4acb6251c402a178ee8018ccffa4b Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 30 Nov 2015 16:14:37 -0800 Subject: [PATCH 49/53] :arrow_up: language-make@0.21 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1a5aa9437..006984454 100644 --- a/package.json +++ b/package.json @@ -130,7 +130,7 @@ "language-javascript": "0.102.2", "language-json": "0.17.1", "language-less": "0.29.0", - "language-make": "0.20.0", + "language-make": "0.21.0", "language-mustache": "0.13.0", "language-objective-c": "0.15.0", "language-perl": "0.31.0", From c26d2be959a1941f51895330cac28b6328370a2e Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 30 Nov 2015 16:43:33 -0800 Subject: [PATCH 50/53] :arrow_up: markdown-preview@0.157 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 006984454..cf099f2d3 100644 --- a/package.json +++ b/package.json @@ -97,7 +97,7 @@ "keybinding-resolver": "0.33.0", "line-ending-selector": "0.3.0", "link": "0.31.0", - "markdown-preview": "0.156.2", + "markdown-preview": "0.157.0", "metrics": "0.53.1", "notifications": "0.62.1", "open-on-github": "0.40.0", From a69f5d54683c3dc86d09dea046016d52d9959c17 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 30 Nov 2015 16:46:00 -0800 Subject: [PATCH 51/53] :arrow_up: language-shellscript@0.21 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cf099f2d3..67a51bbc3 100644 --- a/package.json +++ b/package.json @@ -140,7 +140,7 @@ "language-ruby": "0.64.1", "language-ruby-on-rails": "0.24.0", "language-sass": "0.44.1", - "language-shellscript": "0.20.0", + "language-shellscript": "0.21.0", "language-source": "0.9.0", "language-sql": "0.19.0", "language-text": "0.7.0", From d0cbcdf0703ff570332f32363502c266c1741faa Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 30 Nov 2015 17:03:10 -0800 Subject: [PATCH 52/53] :arrow_up: language-javascript@0.103.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 67a51bbc3..05f14ceaf 100644 --- a/package.json +++ b/package.json @@ -127,7 +127,7 @@ "language-html": "0.42.0", "language-hyperlink": "0.15.0", "language-java": "0.17.0", - "language-javascript": "0.102.2", + "language-javascript": "0.103.0", "language-json": "0.17.1", "language-less": "0.29.0", "language-make": "0.21.0", From 7c9d32d8d62abbcd8a24bc2a3a1ae9690c2693d9 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 30 Nov 2015 17:26:23 -0800 Subject: [PATCH 53/53] :arrow_up: language-html@0.43 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 05f14ceaf..23d7aa55e 100644 --- a/package.json +++ b/package.json @@ -124,7 +124,7 @@ "language-gfm": "0.81.0", "language-git": "0.10.0", "language-go": "0.40.0", - "language-html": "0.42.0", + "language-html": "0.43.0", "language-hyperlink": "0.15.0", "language-java": "0.17.0", "language-javascript": "0.103.0",