From af6de70154b42d48e358f3bbee950d11ad64d107 Mon Sep 17 00:00:00 2001 From: Machiste Quintana Date: Thu, 23 Apr 2015 17:34:41 -0400 Subject: [PATCH 001/335] :arrow_up: encoding-selector@0.20.0, spell-check@0.56.0, symbols-view@0.95.0 --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index f94ea35a5..ed4edd847 100644 --- a/package.json +++ b/package.json @@ -92,7 +92,7 @@ "command-palette": "0.35.0", "deprecation-cop": "0.40.0", "dev-live-reload": "0.45.0", - "encoding-selector": "0.19.0", + "encoding-selector": "0.20.0", "exception-reporting": "0.24.0", "feedback": "0.38.0", "find-and-replace": "0.160.0", @@ -112,10 +112,10 @@ "release-notes": "0.52.0", "settings-view": "0.195.0", "snippets": "0.88.0", - "spell-check": "0.55.0", + "spell-check": "0.56.0", "status-bar": "0.69.0", "styleguide": "0.44.0", - "symbols-view": "0.94.0", + "symbols-view": "0.95.0", "tabs": "0.67.0", "timecop": "0.31.0", "tree-view": "0.171.0", From f2a4acdaaee696c3d23f8ad42d5d5ec444974a23 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 23 Apr 2015 15:44:17 -0700 Subject: [PATCH 002/335] :arrow_up: language-javascript@0.75 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f94ea35a5..3ea6e8d91 100644 --- a/package.json +++ b/package.json @@ -134,7 +134,7 @@ "language-html": "0.32.0", "language-hyperlink": "0.12.2", "language-java": "0.14.0", - "language-javascript": "0.74.0", + "language-javascript": "0.75.0", "language-json": "0.14.0", "language-less": "0.26.0", "language-make": "0.14.0", From 3bd0093eb32c4e9552bf4f548895fab610eddbac Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 23 Apr 2015 16:10:06 -0700 Subject: [PATCH 003/335] Update scrollbar style spec for new library API --- spec/workspace-view-spec.coffee | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/spec/workspace-view-spec.coffee b/spec/workspace-view-spec.coffee index 586e72fe8..a160cdb39 100644 --- a/spec/workspace-view-spec.coffee +++ b/spec/workspace-view-spec.coffee @@ -242,10 +242,15 @@ describe "WorkspaceView", -> describe "the scrollbar visibility class", -> it "has a class based on the style of the scrollbar", -> + style = 'legacy' scrollbarStyle = require 'scrollbar-style' - scrollbarStyle.emitValue 'legacy' + spyOn(scrollbarStyle, 'getPreferredScrollbarStyle').andCallFake -> style + + atom.workspaceView.element.observeScrollbarStyle() expect(atom.workspaceView).toHaveClass 'scrollbars-visible-always' - scrollbarStyle.emitValue 'overlay' + + style = 'overlay' + atom.workspaceView.element.observeScrollbarStyle() expect(atom.workspaceView).toHaveClass 'scrollbars-visible-when-scrolling' describe "editor font styling", -> From 0b243070969cf1740c86392b6bab1491af0ff97d Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 22 Apr 2015 09:38:02 -0700 Subject: [PATCH 004/335] Mark atom.notifications public --- src/atom.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/atom.coffee b/src/atom.coffee index e2544640d..1cf63b397 100644 --- a/src/atom.coffee +++ b/src/atom.coffee @@ -151,7 +151,7 @@ class Atom extends Model # Public: A {TooltipManager} instance tooltips: null - # Experimental: A {NotificationManager} instance + # Public: A {NotificationManager} instance notifications: null # Public: A {Project} instance From 1cd5bb0f8d7a63642025cf383ffcafbb8e9ec44b Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 22 Apr 2015 09:38:15 -0700 Subject: [PATCH 005/335] Mark NotificationManager public and add docs --- src/notification-manager.coffee | 35 +++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/src/notification-manager.coffee b/src/notification-manager.coffee index f811a501f..b1f71fe68 100644 --- a/src/notification-manager.coffee +++ b/src/notification-manager.coffee @@ -1,8 +1,8 @@ {Emitter, Disposable} = require 'event-kit' Notification = require '../src/notification' -# Experimental: Allows messaging the user. This will likely change, dont use -# quite yet! +# Public: A notification manager used to create {Notification}s to be shown +# to the user. module.exports = class NotificationManager constructor: -> @@ -13,6 +13,12 @@ class NotificationManager Section: Events ### + # Public: Invoke the given callback after a notification has been added. + # + # * `callback` {Function} to be called after the notification is added. + # * `notification` The {Notification} that was added. + # + # Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. onDidAddNotification: (callback) -> @emitter.on 'did-add-notification', callback @@ -20,18 +26,43 @@ class NotificationManager Section: Adding Notifications ### + # Public: Add a success notification. + # + # * `message` A {String} message + # * `options` An options {Object} with optional keys such as: + # * `detail` A {String} with additional details about the notification addSuccess: (message, options) -> @addNotification(new Notification('success', message, options)) + # Public: Add an informational notification. + # + # * `message` A {String} message + # * `options` An options {Object} with optional keys such as: + # * `detail` A {String} with additional details about the notification addInfo: (message, options) -> @addNotification(new Notification('info', message, options)) + # Public: Add a warning notification. + # + # * `message` A {String} message + # * `options` An options {Object} with optional keys such as: + # * `detail` A {String} with additional details about the notification addWarning: (message, options) -> @addNotification(new Notification('warning', message, options)) + # Public: Add an error notification. + # + # * `message` A {String} message + # * `options` An options {Object} with optional keys such as: + # * `detail` A {String} with additional details about the notification addError: (message, options) -> @addNotification(new Notification('error', message, options)) + # Public: Add a fatal error notification. + # + # * `message` A {String} message + # * `options` An options {Object} with optional keys such as: + # * `detail` A {String} with additional details about the notification addFatalError: (message, options) -> @addNotification(new Notification('fatal', message, options)) From d4c1775cf7f5306af193643e2a1a9b0c9adc4363 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 22 Apr 2015 09:38:37 -0700 Subject: [PATCH 006/335] Mark Notification public and add docs --- src/notification.coffee | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/notification.coffee b/src/notification.coffee index 43044c182..5e962fea7 100644 --- a/src/notification.coffee +++ b/src/notification.coffee @@ -1,6 +1,6 @@ {Emitter} = require 'event-kit' -# Experimental: This will likely change, do not use. +# Public: A notification to the user containing a message and type. module.exports = class Notification constructor: (@type, @message, @options={}) -> @@ -18,8 +18,10 @@ class Notification getOptions: -> @options + # Public: Retrieves the {String} notification type. getType: -> @type + # Public: Retrieves the {String} notification message. getMessage: -> @message getTimestamp: -> @timestamp From 05fdc852828cccffecb4884e7b4e60034c17bbf6 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 22 Apr 2015 09:41:50 -0700 Subject: [PATCH 007/335] Mark getNotifications as public and return an array copy --- src/notification-manager.coffee | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/notification-manager.coffee b/src/notification-manager.coffee index b1f71fe68..f4ebd97db 100644 --- a/src/notification-manager.coffee +++ b/src/notification-manager.coffee @@ -78,7 +78,10 @@ class NotificationManager Section: Getting Notifications ### - getNotifications: -> @notifications + # Public: Get all the notifications. + # + # Returns an {Array} of {Notifications}s. + getNotifications: -> @notifications.slice() ### Section: Managing Notifications From ec9310e94f18926f5603d41d21db3251e4e9fffd Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 22 Apr 2015 16:20:31 -0700 Subject: [PATCH 008/335] :memo: Drop redundant notification --- src/notification.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/notification.coffee b/src/notification.coffee index 5e962fea7..9dfffc59a 100644 --- a/src/notification.coffee +++ b/src/notification.coffee @@ -18,10 +18,10 @@ class Notification getOptions: -> @options - # Public: Retrieves the {String} notification type. + # Public: Retrieves the {String} type. getType: -> @type - # Public: Retrieves the {String} notification message. + # Public: Retrieves the {String} message. getMessage: -> @message getTimestamp: -> @timestamp From cc8bbde6dc881cf67585c384c714948c2b98b1e0 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 23 Apr 2015 16:59:02 -0700 Subject: [PATCH 009/335] Mention twitter account --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index cafeca707..c33ca7e0e 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,8 @@ Atom is a hackable text editor for the 21st century, built on [Electron](https:/ Visit [atom.io](https://atom.io) to learn more or visit the [Atom forum](https://discuss.atom.io). +:bird: Follow [@AtomEditor](https://twitter.com/atomeditor) on Twitter. :bird: + Visit [issue #3684](https://github.com/atom/atom/issues/3684) to learn more about the Atom 1.0 roadmap. From 59a4ce35bbe7c8646e05d508fcd74d7c3cc6fd3a Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 23 Apr 2015 17:03:37 -0700 Subject: [PATCH 010/335] Mention Twitter is for important stuff --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c33ca7e0e..8958f303d 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,8 @@ Atom is a hackable text editor for the 21st century, built on [Electron](https:/ Visit [atom.io](https://atom.io) to learn more or visit the [Atom forum](https://discuss.atom.io). -:bird: Follow [@AtomEditor](https://twitter.com/atomeditor) on Twitter. :bird: +Follow [@AtomEditor](https://twitter.com/atomeditor) on Twitter for important +announcements. Visit [issue #3684](https://github.com/atom/atom/issues/3684) to learn more about the Atom 1.0 roadmap. From 9510db03d4e509817a6cd98bb42f2ca9c5ee5ce7 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Fri, 24 Apr 2015 13:19:04 +0800 Subject: [PATCH 011/335] :arrow_up: apm@0.162.0 --- apm/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apm/package.json b/apm/package.json index 3cd607758..a3f6fae96 100644 --- a/apm/package.json +++ b/apm/package.json @@ -6,6 +6,6 @@ "url": "https://github.com/atom/atom.git" }, "dependencies": { - "atom-package-manager": "0.161.0" + "atom-package-manager": "0.162.0" } } From 07f80bcb8a1192f913c0111a55e75b0d91c7d5f6 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Fri, 24 Apr 2015 13:19:29 +0800 Subject: [PATCH 012/335] :arrow_up: asar@0.5.0 --- build/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/package.json b/build/package.json index 82feaad92..c60bdbae5 100644 --- a/build/package.json +++ b/build/package.json @@ -6,7 +6,7 @@ "url": "https://github.com/atom/atom.git" }, "dependencies": { - "asar": "^0.4.4", + "asar": "^0.5.0", "async": "~0.2.9", "donna": "1.0.10", "formidable": "~1.0.14", From 0c25184624b3bccdf35635e8d1d162ca60e55930 Mon Sep 17 00:00:00 2001 From: Ivan Zuzak Date: Fri, 24 Apr 2015 16:54:41 +0200 Subject: [PATCH 013/335] Add package name to Grim.deprecate call for activationEvents --- src/package.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/package.coffee b/src/package.coffee index 8003d2d8d..4c1b296a1 100644 --- a/src/package.coffee +++ b/src/package.coffee @@ -465,7 +465,7 @@ class Package @activationCommands[selector].push(commands...) if includeDeprecatedAPIs and @metadata.activationEvents? - deprecate """ + deprecate(""" Use `activationCommands` instead of `activationEvents` in your package.json Commands should be grouped by selector as follows: ```json @@ -474,7 +474,7 @@ class Package "atom-text-editor": ["foo:quux"] } ``` - """ + """, {packageName: @name}) if _.isArray(@metadata.activationEvents) for eventName in @metadata.activationEvents @activationCommands['atom-workspace'] ?= [] From d75d2704264d9d383bab254bc79b8b62bda36f5f Mon Sep 17 00:00:00 2001 From: Ivan Zuzak Date: Fri, 24 Apr 2015 17:02:48 +0200 Subject: [PATCH 014/335] Add package name to Grim.deprecate call for configDefaults --- src/package.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/package.coffee b/src/package.coffee index 4c1b296a1..a395dfb14 100644 --- a/src/package.coffee +++ b/src/package.coffee @@ -161,9 +161,9 @@ class Package if @mainModule.config? and typeof @mainModule.config is 'object' atom.config.setSchema @name, {type: 'object', properties: @mainModule.config} else if includeDeprecatedAPIs and @mainModule.configDefaults? and typeof @mainModule.configDefaults is 'object' - deprecate """Use a config schema instead. See the configuration section + deprecate("""Use a config schema instead. See the configuration section of https://atom.io/docs/latest/hacking-atom-package-word-count and - https://atom.io/docs/api/latest/Config for more details""" + https://atom.io/docs/api/latest/Config for more details""", {packageName: @name}) atom.config.setDefaults(@name, @mainModule.configDefaults) @mainModule.activateConfig?() @configActivated = true From b90310f12f4f61858dd93e63dd279ffa8ea4bb01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=C5=BDu=C5=BEak?= Date: Sat, 25 Apr 2015 12:14:03 +0200 Subject: [PATCH 015/335] :arrow_up: language-shellscript@0.14.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 63b903d3c..b8e6a2331 100644 --- a/package.json +++ b/package.json @@ -147,7 +147,7 @@ "language-ruby": "0.52.0", "language-ruby-on-rails": "0.21.0", "language-sass": "0.36.0", - "language-shellscript": "0.13.0", + "language-shellscript": "0.14.0", "language-source": "0.9.0", "language-sql": "0.15.0", "language-text": "0.6.0", From c771959ea0e71cba87536a7b9c27edd5006cfbd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=C5=BDu=C5=BEak?= Date: Sun, 26 Apr 2015 09:17:51 +0200 Subject: [PATCH 016/335] :arrow_up: one-dark-ui@0.7.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b8e6a2331..6d6a1ad83 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "atom-light-ui": "0.41.0", "base16-tomorrow-dark-theme": "0.25.0", "base16-tomorrow-light-theme": "0.8.0", - "one-dark-ui": "0.6.3", + "one-dark-ui": "0.7.0", "one-dark-syntax": "0.3.0", "one-light-syntax": "0.4.0", "one-light-ui": "0.5.3", From 44e03fd5365df2f86610b32438090452ed0a2b68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=C5=BDu=C5=BEak?= Date: Sun, 26 Apr 2015 09:18:34 +0200 Subject: [PATCH 017/335] :arrow_up: one-dark-syntax@0.4.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6d6a1ad83..897a96d67 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "base16-tomorrow-dark-theme": "0.25.0", "base16-tomorrow-light-theme": "0.8.0", "one-dark-ui": "0.7.0", - "one-dark-syntax": "0.3.0", + "one-dark-syntax": "0.4.0", "one-light-syntax": "0.4.0", "one-light-ui": "0.5.3", "solarized-dark-syntax": "0.32.0", From bf3707feabe5add02c8f021cc76dc79d37788f0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=C5=BDu=C5=BEak?= Date: Sun, 26 Apr 2015 09:19:39 +0200 Subject: [PATCH 018/335] :arrow_up: one-light-syntax@0.5.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 897a96d67..4f746cd8c 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "base16-tomorrow-light-theme": "0.8.0", "one-dark-ui": "0.7.0", "one-dark-syntax": "0.4.0", - "one-light-syntax": "0.4.0", + "one-light-syntax": "0.5.0", "one-light-ui": "0.5.3", "solarized-dark-syntax": "0.32.0", "solarized-light-syntax": "0.19.0", From 14161a63fe1b56aed834050bd8bb56180e6acfb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=C5=BDu=C5=BEak?= Date: Sun, 26 Apr 2015 09:21:09 +0200 Subject: [PATCH 019/335] :arrow_up: one-light-ui@0.6.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4f746cd8c..5709941fb 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "one-dark-ui": "0.7.0", "one-dark-syntax": "0.4.0", "one-light-syntax": "0.5.0", - "one-light-ui": "0.5.3", + "one-light-ui": "0.6.0", "solarized-dark-syntax": "0.32.0", "solarized-light-syntax": "0.19.0", "archive-view": "0.55.0", From cfdf5f1bcc2127cd6c2a934600950904abb998bb Mon Sep 17 00:00:00 2001 From: Ivan Zuzak Date: Sun, 26 Apr 2015 11:22:07 +0200 Subject: [PATCH 020/335] Move Grim.deprecate call so that it can be correctly attributed --- src/package.coffee | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/package.coffee b/src/package.coffee index a395dfb14..b16e76ba0 100644 --- a/src/package.coffee +++ b/src/package.coffee @@ -191,7 +191,20 @@ class Package for [menuPath, map] in @menus when map['context-menu']? try - @activationDisposables.add(atom.contextMenu.add(map['context-menu'])) + itemsBySelector = map['context-menu'] + + if includeDeprecatedAPIs + # Detect deprecated format for items object + for key, value of itemsBySelector + unless _.isArray(value) + deprecate(""" + The context menu CSON format has changed. Please see + https://atom.io/docs/api/latest/ContextMenuManager#context-menu-cson-format + for more info. + """, {packageName: @name}) + itemsBySelector = atom.contextMenu.convertLegacyItemsBySelector(itemsBySelector) + + @activationDisposables.add(atom.contextMenu.add(itemsBySelector)) catch error if error.code is 'EBADSELECTOR' error.message += " in #{menuPath}" From 46ab8e7f6320c1b93fc0fd65fb3b12ce3230c681 Mon Sep 17 00:00:00 2001 From: Ivan Zuzak Date: Sun, 26 Apr 2015 11:23:13 +0200 Subject: [PATCH 021/335] Link to section in API docs for ContextMenuManager::add --- src/context-menu-manager.coffee | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/context-menu-manager.coffee b/src/context-menu-manager.coffee index bd5ff943e..0fdcf4ab6 100644 --- a/src/context-menu-manager.coffee +++ b/src/context-menu-manager.coffee @@ -105,9 +105,9 @@ class ContextMenuManager # Detect deprecated file path as first argument if itemsBySelector? and typeof itemsBySelector isnt 'object' Grim.deprecate """ - ContextMenuManager::add has changed to take a single object as its + `ContextMenuManager::add` has changed to take a single object as its argument. Please see - https://atom.io/docs/api/latest/ContextMenuManager for more info. + https://atom.io/docs/api/latest/ContextMenuManager#context-menu-cson-format for more info. """ itemsBySelector = arguments[1] devMode = arguments[2]?.devMode @@ -116,9 +116,9 @@ class ContextMenuManager for key, value of itemsBySelector unless _.isArray(value) Grim.deprecate """ - ContextMenuManager::add has changed to take a single object as its + `ContextMenuManager::add` has changed to take a single object as its argument. Please see - https://atom.io/docs/api/latest/ContextMenuManager for more info. + https://atom.io/docs/api/latest/ContextMenuManager#context-menu-cson-format for more info. """ itemsBySelector = @convertLegacyItemsBySelector(itemsBySelector, devMode) From 21ad8f9807bc8ad19780b35c2269bf404f0c116b Mon Sep 17 00:00:00 2001 From: Lee Dohm Date: Sun, 26 Apr 2015 19:08:19 -0700 Subject: [PATCH 022/335] :bug: Put a limit of 100 on max font size This will prevent Atom from crashing, but still allow folks who need large font sizes for visual impairments to have them. Fix #4880 --- src/config-schema.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config-schema.coffee b/src/config-schema.coffee index ba8150a26..f181e0149 100644 --- a/src/config-schema.coffee +++ b/src/config-schema.coffee @@ -108,6 +108,7 @@ module.exports = type: 'integer' default: 16 minimum: 1 + maximum: 100 lineHeight: type: ['string', 'number'] default: 1.3 From 415898d597e9f6e4663031d881d7dacab653c1dd Mon Sep 17 00:00:00 2001 From: Machiste Quintana Date: Sun, 26 Apr 2015 23:52:48 -0400 Subject: [PATCH 023/335] Add font size commands to View menu --- menus/darwin.cson | 4 ++++ menus/linux.cson | 4 ++++ menus/win32.cson | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/menus/darwin.cson b/menus/darwin.cson index effd19197..f95479d99 100644 --- a/menus/darwin.cson +++ b/menus/darwin.cson @@ -168,6 +168,10 @@ ] } { type: 'separator' } + { label: 'Increase Font Size', command: 'window:increase-font-size' } + { label: 'Decrease Font Size', command: 'window:decrease-font-size' } + { label: 'Reset Font Size', command: 'window:reset-font-size' } + { type: 'separator' } { label: 'Toggle Soft Wrap', command: 'editor:toggle-soft-wrap' } ] } diff --git a/menus/linux.cson b/menus/linux.cson index 2cfb17871..5d10aa933 100644 --- a/menus/linux.cson +++ b/menus/linux.cson @@ -125,6 +125,10 @@ ] } { type: 'separator' } + { label: '&Increase Font Size', command: 'window:increase-font-size' } + { label: '&Decrease Font Size', command: 'window:decrease-font-size' } + { label: '&Reset Font Size', command: 'window:reset-font-size' } + { type: 'separator' } { label: 'Toggle Soft &Wrap', command: 'editor:toggle-soft-wrap' } ] } diff --git a/menus/win32.cson b/menus/win32.cson index 2bd013ce3..de3f7257d 100644 --- a/menus/win32.cson +++ b/menus/win32.cson @@ -124,6 +124,10 @@ ] } { type: 'separator' } + { label: '&Increase Font Size', command: 'window:increase-font-size' } + { label: '&Decrease Font Size', command: 'window:decrease-font-size' } + { label: '&Reset Font Size', command: 'window:reset-font-size' } + { type: 'separator' } { label: 'Toggle Soft &Wrap', command: 'editor:toggle-soft-wrap' } ] } From 608f5fa656ff85fce0fd0597fd722aed6251faa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=C5=BDu=C5=BEak?= Date: Mon, 27 Apr 2015 17:47:15 +0200 Subject: [PATCH 024/335] :arrow_up: language-gfm@0.70.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5709941fb..4853be60b 100644 --- a/package.json +++ b/package.json @@ -128,7 +128,7 @@ "language-coffee-script": "0.39.0", "language-csharp": "0.5.0", "language-css": "0.28.0", - "language-gfm": "0.69.0", + "language-gfm": "0.70.0", "language-git": "0.10.0", "language-go": "0.25.0", "language-html": "0.32.0", From 3c2acdcf9acdad4e255f8311dfd2b18a487d8f47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=C5=BDu=C5=BEak?= Date: Mon, 27 Apr 2015 18:57:33 +0200 Subject: [PATCH 025/335] :arrow_up: tabs@0.68.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4853be60b..513b16c61 100644 --- a/package.json +++ b/package.json @@ -116,7 +116,7 @@ "status-bar": "0.69.0", "styleguide": "0.44.0", "symbols-view": "0.95.0", - "tabs": "0.67.0", + "tabs": "0.68.0", "timecop": "0.31.0", "tree-view": "0.171.0", "update-package-dependencies": "0.9.0", From 67e7acebbd6337c255c45d78225f7882afd0033e Mon Sep 17 00:00:00 2001 From: "Machiste N. Quintana" Date: Mon, 27 Apr 2015 13:20:39 -0400 Subject: [PATCH 026/335] &R -> &s --- menus/linux.cson | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/menus/linux.cson b/menus/linux.cson index 5d10aa933..a826ab6b5 100644 --- a/menus/linux.cson +++ b/menus/linux.cson @@ -127,7 +127,7 @@ { type: 'separator' } { label: '&Increase Font Size', command: 'window:increase-font-size' } { label: '&Decrease Font Size', command: 'window:decrease-font-size' } - { label: '&Reset Font Size', command: 'window:reset-font-size' } + { label: 'Re&set Font Size', command: 'window:reset-font-size' } { type: 'separator' } { label: 'Toggle Soft &Wrap', command: 'editor:toggle-soft-wrap' } ] From d586b57fef2466ab25f9a7870faecfb0d16a4952 Mon Sep 17 00:00:00 2001 From: "Machiste N. Quintana" Date: Mon, 27 Apr 2015 13:21:09 -0400 Subject: [PATCH 027/335] &R -> &s --- menus/win32.cson | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/menus/win32.cson b/menus/win32.cson index de3f7257d..cbefc1e5c 100644 --- a/menus/win32.cson +++ b/menus/win32.cson @@ -126,7 +126,7 @@ { type: 'separator' } { label: '&Increase Font Size', command: 'window:increase-font-size' } { label: '&Decrease Font Size', command: 'window:decrease-font-size' } - { label: '&Reset Font Size', command: 'window:reset-font-size' } + { label: 'Re&set Font Size', command: 'window:reset-font-size' } { type: 'separator' } { label: 'Toggle Soft &Wrap', command: 'editor:toggle-soft-wrap' } ] From e8bd0dc7102ca2ee029c2caba5b164958659e4a0 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 27 Apr 2015 15:10:36 -0700 Subject: [PATCH 028/335] :arrow_up: apm@0.163 --- apm/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apm/package.json b/apm/package.json index a3f6fae96..e0656472b 100644 --- a/apm/package.json +++ b/apm/package.json @@ -6,6 +6,6 @@ "url": "https://github.com/atom/atom.git" }, "dependencies": { - "atom-package-manager": "0.162.0" + "atom-package-manager": "0.163.0" } } From 3cd33f69728cb329500134175872309b3ba9139b Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 27 Apr 2015 15:15:56 -0700 Subject: [PATCH 029/335] :arrow_up: dev-live-reload@0.46 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 513b16c61..6d44eeac6 100644 --- a/package.json +++ b/package.json @@ -91,7 +91,7 @@ "bracket-matcher": "0.73.0", "command-palette": "0.35.0", "deprecation-cop": "0.40.0", - "dev-live-reload": "0.45.0", + "dev-live-reload": "0.46.0", "encoding-selector": "0.20.0", "exception-reporting": "0.24.0", "feedback": "0.38.0", From a50f572eec167b41f31756db727de72325d26314 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Mon, 27 Apr 2015 16:55:26 -0600 Subject: [PATCH 030/335] :arrow_up: git-diff --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6d44eeac6..e1c87a200 100644 --- a/package.json +++ b/package.json @@ -97,7 +97,7 @@ "feedback": "0.38.0", "find-and-replace": "0.160.0", "fuzzy-finder": "0.81.0", - "git-diff": "0.54.0", + "git-diff": "0.55.0", "go-to-line": "0.30.0", "grammar-selector": "0.46.0", "image-view": "0.54.0", From da598b4c0ae407ec889cc77c96f53c480f522ec0 Mon Sep 17 00:00:00 2001 From: Daniel Hengeveld Date: Mon, 27 Apr 2015 15:55:34 -0700 Subject: [PATCH 031/335] Add a scopeless access token to public Travis config. It may seem strange to commit an access token to a public repository but this one has been granted no scopes, so it doesn't have access to *do* anything, and is simply used to avoid the GH API's unauthed rate limiting when fetching public assets. This path was chosen on the advice of the GH platform team. --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 993787aee..6f8ff353d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,6 +3,7 @@ git: env: - NODE_VERSION=0.12 + - ATOM_ACCESS_TOKEN=da809a6077bb1b0aa7c5623f7b2d5f1fec2faae4 os: - linux From 201078828a540a6ba27cbe76b6120356ce04bd58 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 27 Apr 2015 16:25:06 -0700 Subject: [PATCH 032/335] :arrow_up: fuzzy-finder@0.82 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e1c87a200..1abe8428c 100644 --- a/package.json +++ b/package.json @@ -96,7 +96,7 @@ "exception-reporting": "0.24.0", "feedback": "0.38.0", "find-and-replace": "0.160.0", - "fuzzy-finder": "0.81.0", + "fuzzy-finder": "0.82.0", "git-diff": "0.55.0", "go-to-line": "0.30.0", "grammar-selector": "0.46.0", From 14b0e70a001f3e7bcf072c1cf6ebb086eaa73ed1 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Mon, 27 Apr 2015 18:11:55 -0700 Subject: [PATCH 033/335] :arrow_up: language-html@0.33.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1abe8428c..ff062e0db 100644 --- a/package.json +++ b/package.json @@ -131,7 +131,7 @@ "language-gfm": "0.70.0", "language-git": "0.10.0", "language-go": "0.25.0", - "language-html": "0.32.0", + "language-html": "0.33.0", "language-hyperlink": "0.12.2", "language-java": "0.14.0", "language-javascript": "0.75.0", From d04f3e2f1765f40b80399f557ccd4cb53ad5d36c Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Tue, 28 Apr 2015 08:59:22 +0200 Subject: [PATCH 034/335] :green_heart: Remove ATOM_ACCESS_TOKEN from build matrix --- .travis.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6f8ff353d..56e966354 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,8 +2,11 @@ git: depth: 10 env: - - NODE_VERSION=0.12 - - ATOM_ACCESS_TOKEN=da809a6077bb1b0aa7c5623f7b2d5f1fec2faae4 + matrix: + - NODE_VERSION=0.12 + + global: + - ATOM_ACCESS_TOKEN=da809a6077bb1b0aa7c5623f7b2d5f1fec2faae4 os: - linux From 5d07713e28ac5b1faaefa84cf8b45ed72bcb28a1 Mon Sep 17 00:00:00 2001 From: Heather Date: Tue, 28 Apr 2015 11:16:36 +0400 Subject: [PATCH 035/335] add missing keybindings to show specific item on windows related issue on discuss: https://discuss.atom.io/t/ctrl-x-tab-selection/13615 --- keymaps/win32.cson | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/keymaps/win32.cson b/keymaps/win32.cson index 656d9ec8e..5d3629386 100644 --- a/keymaps/win32.cson +++ b/keymaps/win32.cson @@ -77,6 +77,15 @@ 'ctrl-k ctrl-down': 'window:focus-pane-below' 'ctrl-k ctrl-left': 'window:focus-pane-on-left' 'ctrl-k ctrl-right': 'window:focus-pane-on-right' + 'alt-1': 'pane:show-item-1' + 'alt-2': 'pane:show-item-2' + 'alt-3': 'pane:show-item-3' + 'alt-4': 'pane:show-item-4' + 'alt-5': 'pane:show-item-5' + 'alt-6': 'pane:show-item-6' + 'alt-7': 'pane:show-item-7' + 'alt-8': 'pane:show-item-8' + 'alt-9': 'pane:show-item-9' 'atom-workspace atom-text-editor': # Platform Bindings From b9a3b0a8bca820bb460de339b9a7b8ccee476976 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Tue, 28 Apr 2015 11:13:21 +0200 Subject: [PATCH 036/335] :art: --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 56e966354..ab65307ae 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,11 +2,11 @@ git: depth: 10 env: - matrix: - - NODE_VERSION=0.12 - global: - ATOM_ACCESS_TOKEN=da809a6077bb1b0aa7c5623f7b2d5f1fec2faae4 + + matrix: + - NODE_VERSION=0.12 os: - linux From 324bc316f70e0c97c7d3b83581be6166b953fff1 Mon Sep 17 00:00:00 2001 From: "Machiste N. Quintana" Date: Tue, 28 Apr 2015 06:11:20 -0400 Subject: [PATCH 037/335] :arrow_up: bracket-matcher@0.74.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ff062e0db..b702c8828 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "autosave": "0.20.0", "background-tips": "0.24.0", "bookmarks": "0.35.0", - "bracket-matcher": "0.73.0", + "bracket-matcher": "0.74.0", "command-palette": "0.35.0", "deprecation-cop": "0.40.0", "dev-live-reload": "0.46.0", From f4b228c9087a8fdc2a9ce6f9c13e74c50069afae Mon Sep 17 00:00:00 2001 From: Machiste Quintana Date: Mon, 27 Apr 2015 18:25:01 -0400 Subject: [PATCH 038/335] Reset font size to window's starting font size --- spec/workspace-spec.coffee | 13 +++++++++++++ src/workspace.coffee | 6 ++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/spec/workspace-spec.coffee b/spec/workspace-spec.coffee index dac2849c0..7d8ea03b3 100644 --- a/spec/workspace-spec.coffee +++ b/spec/workspace-spec.coffee @@ -425,6 +425,19 @@ describe "Workspace", -> expect(atom.config.get('editor.fontSize')).toBe 1 workspace.decreaseFontSize() expect(atom.config.get('editor.fontSize')).toBe 1 + describe "::resetFontSize()", -> + it "resets the font size to the window's starting font size", -> + originalFontSize = 6 + + atom.config.set('editor.fontSize', originalFontSize) + workspace.increaseFontSize() + expect(atom.config.get('editor.fontSize')).toBe originalFontSize + 1 + workspace.resetFontSize() + expect(atom.config.get('editor.fontSize')).toBe originalFontSize + workspace.decreaseFontSize() + expect(atom.config.get('editor.fontSize')).toBe originalFontSize - 1 + workspace.resetFontSize() + expect(atom.config.get('editor.fontSize')).toBe originalFontSize describe "::openLicense()", -> it "opens the license as plain-text in a buffer", -> diff --git a/src/workspace.coffee b/src/workspace.coffee index 50c4117fb..7d460add0 100644 --- a/src/workspace.coffee +++ b/src/workspace.coffee @@ -612,16 +612,18 @@ class Workspace extends Model # Increase the editor font size by 1px. increaseFontSize: -> + @originalFontSize ?= atom.config.get("editor.fontSize") atom.config.set("editor.fontSize", atom.config.get("editor.fontSize") + 1) # Decrease the editor font size by 1px. decreaseFontSize: -> + @originalFontSize ?= atom.config.get("editor.fontSize") fontSize = atom.config.get("editor.fontSize") atom.config.set("editor.fontSize", fontSize - 1) if fontSize > 1 - # Restore to a default editor font size. + # Restore to the window's original editor font size. resetFontSize: -> - atom.config.unset("editor.fontSize") + atom.config.set("editor.fontSize", @originalFontSize) # Removes the item's uri from the list of potential items to reopen. itemOpened: (item) -> From 12b59cf610e08aefa22872ef76eaa8fce3ccb6d0 Mon Sep 17 00:00:00 2001 From: Machiste Quintana Date: Tue, 28 Apr 2015 05:49:22 -0400 Subject: [PATCH 039/335] Only reset font size if font size has been changed --- spec/workspace-spec.coffee | 8 ++++++++ src/workspace.coffee | 3 ++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/spec/workspace-spec.coffee b/spec/workspace-spec.coffee index 7d8ea03b3..61da334bb 100644 --- a/spec/workspace-spec.coffee +++ b/spec/workspace-spec.coffee @@ -425,6 +425,7 @@ describe "Workspace", -> expect(atom.config.get('editor.fontSize')).toBe 1 workspace.decreaseFontSize() expect(atom.config.get('editor.fontSize')).toBe 1 + describe "::resetFontSize()", -> it "resets the font size to the window's starting font size", -> originalFontSize = 6 @@ -439,6 +440,13 @@ describe "Workspace", -> workspace.resetFontSize() expect(atom.config.get('editor.fontSize')).toBe originalFontSize + it "does nothing if the font size has not been changed", -> + originalFontSize = 6 + + atom.config.set('editor.fontSize', originalFontSize) + workspace.resetFontSize() + expect(atom.config.get('editor.fontSize')).toBe originalFontSize + describe "::openLicense()", -> it "opens the license as plain-text in a buffer", -> waitsForPromise -> workspace.openLicense() diff --git a/src/workspace.coffee b/src/workspace.coffee index 7d460add0..2f70e4316 100644 --- a/src/workspace.coffee +++ b/src/workspace.coffee @@ -623,7 +623,8 @@ class Workspace extends Model # Restore to the window's original editor font size. resetFontSize: -> - atom.config.set("editor.fontSize", @originalFontSize) + if @originalFontSize + atom.config.set("editor.fontSize", @originalFontSize) # Removes the item's uri from the list of potential items to reopen. itemOpened: (item) -> From 0b150fc6a82137f42a83bef857675964a7a5d9ed Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 27 Apr 2015 16:40:02 -0700 Subject: [PATCH 040/335] Add --profile-startup --- src/browser/main.coffee | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/browser/main.coffee b/src/browser/main.coffee index 469d53fae..e73bb4c40 100644 --- a/src/browser/main.coffee +++ b/src/browser/main.coffee @@ -110,6 +110,7 @@ parseCommandLine = -> options.alias('h', 'help').boolean('h').describe('h', 'Print this usage message.') options.alias('l', 'log-file').string('l').describe('l', 'Log all output to file.') options.alias('n', 'new-window').boolean('n').describe('n', 'Open a new window.') + options.boolean('profile-startup').describe('profile-startup', 'Create a profile of startup execution time.') options.alias('r', 'resource-path').string('r').describe('r', 'Set the path to the Atom source directory and enable dev-mode.') options.alias('s', 'spec-directory').string('s').describe('s', 'Set the directory from which to run package specs (default: Atom\'s spec directory).') options.boolean('safe').describe('safe', 'Do not load packages from ~/.atom/packages or ~/.atom/dev/packages.') @@ -139,6 +140,7 @@ parseCommandLine = -> pidToKillWhenClosed = args['pid'] if args['wait'] logFile = args['log-file'] socketPath = args['socket-path'] + profileStartup = args['profile-startup'] if args['resource-path'] devMode = true @@ -165,6 +167,6 @@ parseCommandLine = -> {resourcePath, pathsToOpen, executedFrom, test, version, pidToKillWhenClosed, devMode, apiPreviewMode, safeMode, newWindow, specDirectory, logFile, - socketPath} + socketPath, profileStartup} start() From 6b1c7f7a04e63bc34ebfc3374c75b427b342d767 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 27 Apr 2015 16:40:28 -0700 Subject: [PATCH 041/335] :memo: Add missing the --- src/browser/main.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/browser/main.coffee b/src/browser/main.coffee index e73bb4c40..e35632104 100644 --- a/src/browser/main.coffee +++ b/src/browser/main.coffee @@ -110,7 +110,7 @@ parseCommandLine = -> options.alias('h', 'help').boolean('h').describe('h', 'Print this usage message.') options.alias('l', 'log-file').string('l').describe('l', 'Log all output to file.') options.alias('n', 'new-window').boolean('n').describe('n', 'Open a new window.') - options.boolean('profile-startup').describe('profile-startup', 'Create a profile of startup execution time.') + options.boolean('profile-startup').describe('profile-startup', 'Create a profile of the startup execution time.') options.alias('r', 'resource-path').string('r').describe('r', 'Set the path to the Atom source directory and enable dev-mode.') options.alias('s', 'spec-directory').string('s').describe('s', 'Set the directory from which to run package specs (default: Atom\'s spec directory).') options.boolean('safe').describe('safe', 'Do not load packages from ~/.atom/packages or ~/.atom/dev/packages.') From 9c7f9f74a172df70fe6e61319c44a61e96b3847a Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 27 Apr 2015 18:13:01 -0700 Subject: [PATCH 042/335] Thread through profileStartup load setting --- src/browser/atom-application.coffee | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/browser/atom-application.coffee b/src/browser/atom-application.coffee index dbe29caab..178755786 100644 --- a/src/browser/atom-application.coffee +++ b/src/browser/atom-application.coffee @@ -85,15 +85,16 @@ class AtomApplication else @loadState() or @openPath(options) - openWithOptions: ({pathsToOpen, urlsToOpen, test, pidToKillWhenClosed, devMode, safeMode, apiPreviewMode, newWindow, specDirectory, logFile}) -> + openWithOptions: ({pathsToOpen, urlsToOpen, test, pidToKillWhenClosed, devMode, safeMode, apiPreviewMode, newWindow, specDirectory, logFile, profileStartup}) -> if test @runSpecs({exitWhenDone: true, @resourcePath, specDirectory, logFile}) else if pathsToOpen.length > 0 - @openPaths({pathsToOpen, pidToKillWhenClosed, newWindow, devMode, safeMode, apiPreviewMode}) + @openPaths({pathsToOpen, pidToKillWhenClosed, newWindow, devMode, safeMode, apiPreviewMode, profileStartup}) else if urlsToOpen.length > 0 @openUrl({urlToOpen, devMode, safeMode, apiPreviewMode}) for urlToOpen in urlsToOpen else - @openPath({pidToKillWhenClosed, newWindow, devMode, safeMode, apiPreviewMode}) # Always open a editor window if this is the first instance of Atom. + # Always open a editor window if this is the first instance of Atom. + @openPath({pidToKillWhenClosed, newWindow, devMode, safeMode, apiPreviewMode, profileStartup}) # Public: Removes the {AtomWindow} from the global window list. removeWindow: (window) -> @@ -343,9 +344,10 @@ class AtomApplication # :devMode - Boolean to control the opened window's dev mode. # :safeMode - Boolean to control the opened window's safe mode. # :apiPreviewMode - Boolean to control the opened window's 1.0 API preview mode. + # :profileStartup - Boolean to control creating a profile of the startup time. # :window - {AtomWindow} to open file paths in. - openPath: ({pathToOpen, pidToKillWhenClosed, newWindow, devMode, safeMode, apiPreviewMode, window}) -> - @openPaths({pathsToOpen: [pathToOpen], pidToKillWhenClosed, newWindow, devMode, safeMode, apiPreviewMode, window}) + openPath: ({pathToOpen, pidToKillWhenClosed, newWindow, devMode, safeMode, apiPreviewMode, profileStartup, window}) -> + @openPaths({pathsToOpen: [pathToOpen], pidToKillWhenClosed, newWindow, devMode, safeMode, apiPreviewMode, profileStartup, window}) # Public: Opens multiple paths, in existing windows if possible. # @@ -358,7 +360,7 @@ class AtomApplication # :apiPreviewMode - Boolean to control the opened window's 1.0 API preview mode. # :windowDimensions - Object with height and width keys. # :window - {AtomWindow} to open file paths in. - openPaths: ({pathsToOpen, pidToKillWhenClosed, newWindow, devMode, safeMode, apiPreviewMode, windowDimensions, window}={}) -> + openPaths: ({pathsToOpen, pidToKillWhenClosed, newWindow, devMode, safeMode, apiPreviewMode, windowDimensions, profileStartup, window}={}) -> pathsToOpen = (fs.normalize(pathToOpen) for pathToOpen in pathsToOpen) locationsToOpen = (@locationForPathToOpen(pathToOpen) for pathToOpen in pathsToOpen) @@ -388,7 +390,7 @@ class AtomApplication bootstrapScript ?= require.resolve('../window-bootstrap') resourcePath ?= @resourcePath - openedWindow = new AtomWindow({locationsToOpen, bootstrapScript, resourcePath, devMode, safeMode, apiPreviewMode, windowDimensions}) + openedWindow = new AtomWindow({locationsToOpen, bootstrapScript, resourcePath, devMode, safeMode, apiPreviewMode, windowDimensions, profileStartup}) if pidToKillWhenClosed? @pidsToOpenWindows[pidToKillWhenClosed] = openedWindow From 3cc99d5662b6895046e8a9a1b2252395b8ea36fc Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 27 Apr 2015 18:13:35 -0700 Subject: [PATCH 043/335] Handle profile startup option on load --- static/index.js | 92 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 61 insertions(+), 31 deletions(-) diff --git a/static/index.js b/static/index.js index 2db98a382..c0d031d3d 100644 --- a/static/index.js +++ b/static/index.js @@ -32,46 +32,58 @@ window.onload = function() { var devMode = loadSettings.devMode || !loadSettings.resourcePath.startsWith(process.resourcesPath + path.sep); - setupCoffeeCache(cacheDir); - - ModuleCache = require('../src/module-cache'); - ModuleCache.register(loadSettings); - ModuleCache.add(loadSettings.resourcePath); - - require('grim').includeDeprecatedAPIs = !loadSettings.apiPreviewMode; - - // Start the crash reporter before anything else. - require('crash-reporter').start({ - productName: 'Atom', - companyName: 'GitHub', - // By explicitly passing the app version here, we could save the call - // of "require('remote').require('app').getVersion()". - extra: {_version: loadSettings.appVersion} - }); - - setupVmCompatibility(); - setupCsonCache(cacheDir); - setupSourceMapCache(cacheDir); - setupBabel(cacheDir); - setupTypeScript(cacheDir); - - require(loadSettings.bootstrapScript); - require('ipc').sendChannel('window-command', 'window:loaded'); + if (loadSettings.profileStartup) { + profileStartup(cacheDir, loadSettings); + } else { + setupWindow(cacheDir, loadSettings); + } if (global.atom) { global.atom.loadTime = Date.now() - startTime; console.log('Window load time: ' + global.atom.getWindowLoadTime() + 'ms'); } } catch (error) { - var currentWindow = require('remote').getCurrentWindow(); - currentWindow.setSize(800, 600); - currentWindow.center(); - currentWindow.show(); - currentWindow.openDevTools(); - console.error(error.stack || error); + handleSetupError(error); } } +var handleSetupError = function(error) { + var currentWindow = require('remote').getCurrentWindow(); + currentWindow.setSize(800, 600); + currentWindow.center(); + currentWindow.show(); + currentWindow.openDevTools(); + console.error(error.stack || error); +} + +var setupWindow = function(cacheDir, loadSettings) { + setupCoffeeCache(cacheDir); + + ModuleCache = require('../src/module-cache'); + ModuleCache.register(loadSettings); + ModuleCache.add(loadSettings.resourcePath); + + require('grim').includeDeprecatedAPIs = !loadSettings.apiPreviewMode; + + // Start the crash reporter before anything else. + require('crash-reporter').start({ + productName: 'Atom', + companyName: 'GitHub', + // By explicitly passing the app version here, we could save the call + // of "require('remote').require('app').getVersion()". + extra: {_version: loadSettings.appVersion} + }); + + setupVmCompatibility(); + setupCsonCache(cacheDir); + setupSourceMapCache(cacheDir); + setupBabel(cacheDir); + setupTypeScript(cacheDir); + + require(loadSettings.bootstrapScript); + require('ipc').sendChannel('window-command', 'window:loaded'); +} + var setupCoffeeCache = function(cacheDir) { var CoffeeCache = require('coffee-cash'); CoffeeCache.setCacheDirectory(path.join(cacheDir, 'coffee')); @@ -121,3 +133,21 @@ var setupVmCompatibility = function() { if (!vm.Script.createContext) vm.Script.createContext = vm.createContext; } + +var profileStartup = function(cacheDir, loadSettings) { + var currentWindow = require('remote').getCurrentWindow(); + currentWindow.openDevTools(); + currentWindow.once('devtools-opened', function() { + setTimeout(function() { + console.profile('startup'); + try { + setupWindow(cacheDir, loadSettings); + } catch (error) { + handleSetupError(error); + } finally { + console.profileEnd('startup'); + console.log("Switch to the Profiles tab to view the startup profile") + } + }, 100); + }); +} From b5839a8960c28a03ad965e6ca0d8bf9f73d9cd72 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 27 Apr 2015 18:19:25 -0700 Subject: [PATCH 044/335] Add created to profile message --- static/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/index.js b/static/index.js index c0d031d3d..e7971d9b9 100644 --- a/static/index.js +++ b/static/index.js @@ -146,7 +146,7 @@ var profileStartup = function(cacheDir, loadSettings) { handleSetupError(error); } finally { console.profileEnd('startup'); - console.log("Switch to the Profiles tab to view the startup profile") + console.log("Switch to the Profiles tab to view the created startup profile") } }, 100); }); From 313c8a73ce1cecf8ee852b8d4100a553c5065cfd Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 27 Apr 2015 18:28:29 -0700 Subject: [PATCH 045/335] Only pen dev tools when not already open --- static/index.js | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/static/index.js b/static/index.js index e7971d9b9..140dee8f3 100644 --- a/static/index.js +++ b/static/index.js @@ -135,19 +135,25 @@ var setupVmCompatibility = function() { } var profileStartup = function(cacheDir, loadSettings) { + var profile = function() { + console.profile('startup'); + try { + setupWindow(cacheDir, loadSettings); + } catch (error) { + handleSetupError(error); + } finally { + console.profileEnd('startup'); + console.log("Switch to the Profiles tab to view the created startup profile") + } + }; + var currentWindow = require('remote').getCurrentWindow(); - currentWindow.openDevTools(); - currentWindow.once('devtools-opened', function() { - setTimeout(function() { - console.profile('startup'); - try { - setupWindow(cacheDir, loadSettings); - } catch (error) { - handleSetupError(error); - } finally { - console.profileEnd('startup'); - console.log("Switch to the Profiles tab to view the created startup profile") - } - }, 100); - }); + if (currentWindow.devToolsWebContents) { + profile(); + } else { + currentWindow.openDevTools(); + currentWindow.once('devtools-opened', function() { + setTimeout(profile, 100); + }); + } } From 753a8023868d7b5a5b4929dc9ca30c75fe961ef8 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 28 Apr 2015 09:52:40 -0700 Subject: [PATCH 046/335] :arrow_up: grim@1.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b702c8828..18b15548e 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "fstream": "0.1.24", "fuzzaldrin": "^2.1", "git-utils": "^3.0.0", - "grim": "1.2.2", + "grim": "1.3.0", "jasmine-json": "~0.0", "jasmine-tagged": "^1.1.4", "jquery": "^2.1.1", From 536421287c4e0a722272add8851b51c6c3c7429a Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 28 Apr 2015 09:56:48 -0700 Subject: [PATCH 047/335] :arrow_up: deprecation-cop@0.41 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 18b15548e..3af4021b6 100644 --- a/package.json +++ b/package.json @@ -90,7 +90,7 @@ "bookmarks": "0.35.0", "bracket-matcher": "0.74.0", "command-palette": "0.35.0", - "deprecation-cop": "0.40.0", + "deprecation-cop": "0.41.0", "dev-live-reload": "0.46.0", "encoding-selector": "0.20.0", "exception-reporting": "0.24.0", From 83b10d624b3768a08fb6b26f95ae5fcd396390ab Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 28 Apr 2015 12:53:29 -0700 Subject: [PATCH 048/335] :arrow_up: notifications@0.42 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3af4021b6..170bb9da8 100644 --- a/package.json +++ b/package.json @@ -106,7 +106,7 @@ "link": "0.30.0", "markdown-preview": "0.148.0", "metrics": "0.45.0", - "notifications": "0.41.0", + "notifications": "0.42.0", "open-on-github": "0.36.0", "package-generator": "0.38.0", "release-notes": "0.52.0", From 6169ba2845c42efffd648cad948b7a128a9e851d Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 28 Apr 2015 13:13:03 -0700 Subject: [PATCH 049/335] :arrow_up: keybinding-resolver@0.32 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 170bb9da8..6bf6f15a3 100644 --- a/package.json +++ b/package.json @@ -102,7 +102,7 @@ "grammar-selector": "0.46.0", "image-view": "0.54.0", "incompatible-packages": "0.24.0", - "keybinding-resolver": "0.31.0", + "keybinding-resolver": "0.32.0", "link": "0.30.0", "markdown-preview": "0.148.0", "metrics": "0.45.0", From bd70637b5f5149e176518639da280e7c314c8390 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 28 Apr 2015 13:30:58 -0700 Subject: [PATCH 050/335] :arrow_up: archive-view@0.56 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6bf6f15a3..2f39bb6a0 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "one-light-ui": "0.6.0", "solarized-dark-syntax": "0.32.0", "solarized-light-syntax": "0.19.0", - "archive-view": "0.55.0", + "archive-view": "0.56.0", "autocomplete": "0.44.0", "autoflow": "0.22.0", "autosave": "0.20.0", From 7afa830e864f02404c3b79223ec967b995d5b48e Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 28 Apr 2015 13:48:30 -0700 Subject: [PATCH 051/335] :arrow_up: deprecation-cop@0.42 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2f39bb6a0..9802310d0 100644 --- a/package.json +++ b/package.json @@ -90,7 +90,7 @@ "bookmarks": "0.35.0", "bracket-matcher": "0.74.0", "command-palette": "0.35.0", - "deprecation-cop": "0.41.0", + "deprecation-cop": "0.42.0", "dev-live-reload": "0.46.0", "encoding-selector": "0.20.0", "exception-reporting": "0.24.0", From 3b542f0cbf317d352bdb8974d5ee81d053a3291e Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Tue, 28 Apr 2015 14:49:00 -0700 Subject: [PATCH 052/335] :arrow_up: language-html@0.34.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9802310d0..7f502a7f1 100644 --- a/package.json +++ b/package.json @@ -131,7 +131,7 @@ "language-gfm": "0.70.0", "language-git": "0.10.0", "language-go": "0.25.0", - "language-html": "0.33.0", + "language-html": "0.34.0", "language-hyperlink": "0.12.2", "language-java": "0.14.0", "language-javascript": "0.75.0", From 89166749207edd40c9fc92d2b2e3f6da2b439009 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Tue, 28 Apr 2015 15:34:36 -0700 Subject: [PATCH 053/335] :arrow_up: language-todo@0.19.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7f502a7f1..d80dbb534 100644 --- a/package.json +++ b/package.json @@ -151,7 +151,7 @@ "language-source": "0.9.0", "language-sql": "0.15.0", "language-text": "0.6.0", - "language-todo": "0.18.0", + "language-todo": "0.19.0", "language-toml": "0.15.0", "language-xml": "0.28.0", "language-yaml": "0.22.0" From a115a0328914dbc38bdc88147afd1ee0aecceac2 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 28 Apr 2015 14:04:11 -0700 Subject: [PATCH 054/335] :arrow_up: find-and-replace@0.161 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d80dbb534..a8af0fdba 100644 --- a/package.json +++ b/package.json @@ -95,7 +95,7 @@ "encoding-selector": "0.20.0", "exception-reporting": "0.24.0", "feedback": "0.38.0", - "find-and-replace": "0.160.0", + "find-and-replace": "0.161.0", "fuzzy-finder": "0.82.0", "git-diff": "0.55.0", "go-to-line": "0.30.0", From 9711e941332e788846d0798362161f6547a16a85 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 28 Apr 2015 17:13:54 -0700 Subject: [PATCH 055/335] :arrow_up: grim@1.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a8af0fdba..3a0e7190e 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "fstream": "0.1.24", "fuzzaldrin": "^2.1", "git-utils": "^3.0.0", - "grim": "1.3.0", + "grim": "1.4.0", "jasmine-json": "~0.0", "jasmine-tagged": "^1.1.4", "jquery": "^2.1.1", From d9afa425500c7cf48e714d70b87f5c50d10e3636 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 28 Apr 2015 17:14:06 -0700 Subject: [PATCH 056/335] :arrow_up: deprecation-cop@0.43 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3a0e7190e..8d8140862 100644 --- a/package.json +++ b/package.json @@ -90,7 +90,7 @@ "bookmarks": "0.35.0", "bracket-matcher": "0.74.0", "command-palette": "0.35.0", - "deprecation-cop": "0.42.0", + "deprecation-cop": "0.43.0", "dev-live-reload": "0.46.0", "encoding-selector": "0.20.0", "exception-reporting": "0.24.0", From 0d9d9e1056794743877652956292fd6b98dee6f9 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 28 Apr 2015 17:42:15 -0700 Subject: [PATCH 057/335] Track load time when profiling startup --- static/index.js | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/static/index.js b/static/index.js index 140dee8f3..0cc17d1e8 100644 --- a/static/index.js +++ b/static/index.js @@ -33,20 +33,23 @@ window.onload = function() { var devMode = loadSettings.devMode || !loadSettings.resourcePath.startsWith(process.resourcesPath + path.sep); if (loadSettings.profileStartup) { - profileStartup(cacheDir, loadSettings); + profileStartup(cacheDir, loadSettings, Date.now() - startTime); } else { setupWindow(cacheDir, loadSettings); - } - - if (global.atom) { - global.atom.loadTime = Date.now() - startTime; - console.log('Window load time: ' + global.atom.getWindowLoadTime() + 'ms'); + setLoadTime(Date.now() - startTime); } } catch (error) { handleSetupError(error); } } +var setLoadTime = function(loadTime) { + if (global.atom) { + global.atom.loadTime = loadTime; + console.log('Window load time: ' + global.atom.getWindowLoadTime() + 'ms'); + } +} + var handleSetupError = function(error) { var currentWindow = require('remote').getCurrentWindow(); currentWindow.setSize(800, 600); @@ -134,15 +137,17 @@ var setupVmCompatibility = function() { vm.Script.createContext = vm.createContext; } -var profileStartup = function(cacheDir, loadSettings) { +var profileStartup = function(cacheDir, loadSettings, initialTime) { var profile = function() { console.profile('startup'); try { + var startTime = Date.now() setupWindow(cacheDir, loadSettings); } catch (error) { handleSetupError(error); } finally { console.profileEnd('startup'); + setLoadTime(Date.now() - startTime + initialTime); console.log("Switch to the Profiles tab to view the created startup profile") } }; From df2b0664a12f60ad150494be92ee983198c52bff Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 28 Apr 2015 17:43:16 -0700 Subject: [PATCH 058/335] Catch errors setting load time --- static/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/index.js b/static/index.js index 0cc17d1e8..0a377044e 100644 --- a/static/index.js +++ b/static/index.js @@ -143,11 +143,11 @@ var profileStartup = function(cacheDir, loadSettings, initialTime) { try { var startTime = Date.now() setupWindow(cacheDir, loadSettings); + setLoadTime(Date.now() - startTime + initialTime); } catch (error) { handleSetupError(error); } finally { console.profileEnd('startup'); - setLoadTime(Date.now() - startTime + initialTime); console.log("Switch to the Profiles tab to view the created startup profile") } }; From d7045c3cc819d0d97b88ea11c49f949ec0667550 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Tue, 28 Apr 2015 19:57:33 -0600 Subject: [PATCH 059/335] Make TextEditor params object optional --- src/text-editor.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/text-editor.coffee b/src/text-editor.coffee index 861f6231e..8241cc8c9 100644 --- a/src/text-editor.coffee +++ b/src/text-editor.coffee @@ -75,7 +75,7 @@ class TextEditor extends Model 'autoDecreaseIndentForBufferRow', 'toggleLineCommentForBufferRow', 'toggleLineCommentsForBufferRows', toProperty: 'languageMode' - constructor: ({@softTabs, initialLine, initialColumn, tabLength, softWrapped, @displayBuffer, buffer, registerEditor, suppressCursorCreation, @mini, @placeholderText, lineNumberGutterVisible}) -> + constructor: ({@softTabs, initialLine, initialColumn, tabLength, softWrapped, @displayBuffer, buffer, registerEditor, suppressCursorCreation, @mini, @placeholderText, lineNumberGutterVisible}={}) -> super @emitter = new Emitter From 192997c8cf4479c4cae155207ad3b175c0ee9498 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Tue, 28 Apr 2015 20:05:07 -0600 Subject: [PATCH 060/335] Clear line numbers from previous usages of the gutter element MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In adding custom gutter APIs, I suggested to @jssln that we associate the gutter model objects with DOM nodes in the view registry to make it easy for package authors to get at the view layer for a particular gutter. She also applied this treatment to the line numbers gutter, which makes sense. However, using the view registry opened up an unexpected wrinkle… When you detach an editor, we need to tear down all the associated view logic because at that point, we don’t know whether the element is about to be reattached or whether it’s going to get garbage collected. In the case where we reattach, we end up constructing a new TextEditorComponent for the element. When this happens, the gutter component requests a DOM node for the gutter from the view registry. Except in this case the DOM element isn’t empty because it was already used by a different component for the same element before it was detached. The fix is simply to always clear out the line numbers to ensure we start in a clean state. @jssln: You should apply this same fix to custom gutters or we’ll see the same issues. --- spec/text-editor-element-spec.coffee | 14 ++++++++++++++ src/line-number-gutter-component.coffee | 1 + 2 files changed, 15 insertions(+) diff --git a/spec/text-editor-element-spec.coffee b/spec/text-editor-element-spec.coffee index ba71cb236..418e0367d 100644 --- a/spec/text-editor-element-spec.coffee +++ b/spec/text-editor-element-spec.coffee @@ -65,6 +65,20 @@ describe "TextEditorElement", -> element.getModel().destroy() expect(component.mounted).toBe false + describe "when the editor is detached from the DOM and then reattached", -> + it "does not render duplicate line numbers", -> + editor = new TextEditor + editor.setText('1\n2\n3') + element = atom.views.getView(editor) + + jasmine.attachToDOM(element) + + initialCount = element.shadowRoot.querySelectorAll('.line-number').length + + element.remove() + jasmine.attachToDOM(element) + expect(element.shadowRoot.querySelectorAll('.line-number').length).toBe initialCount + describe "focus and blur handling", -> describe "when the editor.useShadowDOM config option is true", -> it "proxies focus/blur events to/from the hidden input inside the shadow root", -> diff --git a/src/line-number-gutter-component.coffee b/src/line-number-gutter-component.coffee index 9c77b6647..c026d2d37 100644 --- a/src/line-number-gutter-component.coffee +++ b/src/line-number-gutter-component.coffee @@ -13,6 +13,7 @@ class LineNumberGutterComponent @domNode = atom.views.getView(@gutter) @lineNumbersNode = @domNode.firstChild + @lineNumbersNode.innerHTML = '' @domNode.addEventListener 'click', @onClick @domNode.addEventListener 'mousedown', @onMouseDown From 2bd7cc9a99895c8392d3a6e4909cc95724b890a1 Mon Sep 17 00:00:00 2001 From: Machiste Quintana Date: Tue, 28 Apr 2015 22:58:35 -0400 Subject: [PATCH 061/335] Reset font size if editor.fontSize is changed from anywhere --- spec/workspace-spec.coffee | 14 ++++++++++++-- src/workspace.coffee | 8 ++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/spec/workspace-spec.coffee b/spec/workspace-spec.coffee index 61da334bb..9b8ce4d50 100644 --- a/spec/workspace-spec.coffee +++ b/spec/workspace-spec.coffee @@ -428,7 +428,7 @@ describe "Workspace", -> describe "::resetFontSize()", -> it "resets the font size to the window's starting font size", -> - originalFontSize = 6 + originalFontSize = atom.config.get('editor.fontSize') atom.config.set('editor.fontSize', originalFontSize) workspace.increaseFontSize() @@ -441,12 +441,22 @@ describe "Workspace", -> expect(atom.config.get('editor.fontSize')).toBe originalFontSize it "does nothing if the font size has not been changed", -> - originalFontSize = 6 + originalFontSize = atom.config.get('editor.fontSize') atom.config.set('editor.fontSize', originalFontSize) workspace.resetFontSize() expect(atom.config.get('editor.fontSize')).toBe originalFontSize + it "resets the font size when the editor's font size changes", -> + originalFontSize = atom.config.get('editor.fontSize') + + atom.config.set('editor.fontSize', originalFontSize + 1) + workspace.resetFontSize() + expect(atom.config.get('editor.fontSize')).toBe originalFontSize + atom.config.set('editor.fontSize', originalFontSize - 1) + workspace.resetFontSize() + expect(atom.config.get('editor.fontSize')).toBe originalFontSize + describe "::openLicense()", -> it "opens the license as plain-text in a buffer", -> waitsForPromise -> workspace.openLicense() diff --git a/src/workspace.coffee b/src/workspace.coffee index 2f70e4316..07040463b 100644 --- a/src/workspace.coffee +++ b/src/workspace.coffee @@ -75,6 +75,8 @@ class Workspace extends Model atom.views.addViewProvider Panel, (model) -> new PanelElement().initialize(model) + @subscribeToFontSize() + # Called by the Serializable mixin during deserialization deserializeParams: (params) -> for packageName in params.packagesWithActiveGrammars ? [] @@ -612,12 +614,10 @@ class Workspace extends Model # Increase the editor font size by 1px. increaseFontSize: -> - @originalFontSize ?= atom.config.get("editor.fontSize") atom.config.set("editor.fontSize", atom.config.get("editor.fontSize") + 1) # Decrease the editor font size by 1px. decreaseFontSize: -> - @originalFontSize ?= atom.config.get("editor.fontSize") fontSize = atom.config.get("editor.fontSize") atom.config.set("editor.fontSize", fontSize - 1) if fontSize > 1 @@ -626,6 +626,10 @@ class Workspace extends Model if @originalFontSize atom.config.set("editor.fontSize", @originalFontSize) + subscribeToFontSize: -> + atom.config.onDidChange 'editor.fontSize', ({newValue, oldValue}) => + @originalFontSize ?= oldValue + # Removes the item's uri from the list of potential items to reopen. itemOpened: (item) -> if typeof item.getURI is 'function' From a76205256d2cbee2a51c221001d0d8489d1fde95 Mon Sep 17 00:00:00 2001 From: Machiste Quintana Date: Tue, 28 Apr 2015 23:09:31 -0400 Subject: [PATCH 062/335] Only need oldValue --- src/workspace.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/workspace.coffee b/src/workspace.coffee index 07040463b..0e6fb7e40 100644 --- a/src/workspace.coffee +++ b/src/workspace.coffee @@ -627,7 +627,7 @@ class Workspace extends Model atom.config.set("editor.fontSize", @originalFontSize) subscribeToFontSize: -> - atom.config.onDidChange 'editor.fontSize', ({newValue, oldValue}) => + atom.config.onDidChange 'editor.fontSize', ({oldValue}) => @originalFontSize ?= oldValue # Removes the item's uri from the list of potential items to reopen. From 1d238dd92738f1ca7ccd7f7e18493d42dab4392e Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Tue, 28 Apr 2015 22:22:32 -0600 Subject: [PATCH 063/335] Fix scroll width calculation when longest line is folded With the presenter we started clipping screen positions prior to translating them to pixel positions. This interacts with the current clipping behavior on folded lines (which should change) where the cursor is always clipped to 0. So when the longest line was also folded we were miscalculating the width. :see_no_evil:! The removal of clipping also causes us to calculate the width based on the trailing whitespace of soft-wrapped lines, which I actually think is an improvement but it is slightly different. --- spec/text-editor-presenter-spec.coffee | 5 +++++ src/text-editor-component.coffee | 8 ++++---- src/text-editor-presenter.coffee | 9 ++++++++- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/spec/text-editor-presenter-spec.coffee b/spec/text-editor-presenter-spec.coffee index 5a50a49a9..9bee4a72e 100644 --- a/spec/text-editor-presenter-spec.coffee +++ b/spec/text-editor-presenter-spec.coffee @@ -498,6 +498,11 @@ describe "TextEditorPresenter", -> expect(presenter.getState().content.scrollWidth).toBe 10 * editor.getMaxScreenLineLength() + 1 + it "isn't clipped to 0 when the longest line is folded (regression)", -> + presenter = buildPresenter(contentFrameWidth: 50, baseCharacterWidth: 10) + editor.foldBufferRow(0) + expect(presenter.getState().content.scrollWidth).toBe 10 * editor.getMaxScreenLineLength() + 1 + describe ".scrollTop", -> it "tracks the value of ::scrollTop", -> presenter = buildPresenter(scrollTop: 10, lineHeight: 10, explicitHeight: 20) diff --git a/src/text-editor-component.coffee b/src/text-editor-component.coffee index e284516fa..8d728ded6 100644 --- a/src/text-editor-component.coffee +++ b/src/text-editor-component.coffee @@ -349,15 +349,15 @@ class TextEditorComponent if Math.abs(wheelDeltaX) > Math.abs(wheelDeltaY) # Scrolling horizontally - previousScrollLeft = @editor.getScrollLeft() + previousScrollLeft = @presenter.getScrollLeft() @presenter.setScrollLeft(previousScrollLeft - Math.round(wheelDeltaX * @scrollSensitivity)) - event.preventDefault() unless previousScrollLeft is @editor.getScrollLeft() + event.preventDefault() unless previousScrollLeft is @presenter.getScrollLeft() else # Scrolling vertically @presenter.setMouseWheelScreenRow(@screenRowForNode(event.target)) - previousScrollTop = @presenter.scrollTop + previousScrollTop = @presenter.getScrollTop() @presenter.setScrollTop(previousScrollTop - Math.round(wheelDeltaY * @scrollSensitivity)) - event.preventDefault() unless previousScrollTop is @editor.getScrollTop() + event.preventDefault() unless previousScrollTop is @presenter.getScrollTop() onScrollViewScroll: => if @mounted diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index 55b88f2b8..d27dd6484 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -541,7 +541,8 @@ class TextEditorPresenter if @baseCharacterWidth? oldContentWidth = @contentWidth - @contentWidth = @pixelPositionForScreenPosition([@model.getLongestScreenRow(), Infinity]).left + clip = @model.tokenizedLineForScreenRow(@model.getLongestScreenRow())?.isSoftWrapped() + @contentWidth = @pixelPositionForScreenPosition([@model.getLongestScreenRow(), @model.getMaxScreenLineLength()], clip).left @contentWidth += 1 unless @model.isSoftWrapped() # account for cursor width if @contentHeight isnt oldContentHeight @@ -691,6 +692,9 @@ class TextEditorPresenter @updateCustomGutterDecorationState() @updateOverlaysState() + getScrollTop: -> + @scrollTop + didStartScrolling: -> if @stoppedScrollingTimeoutId? clearTimeout(@stoppedScrollingTimeoutId) @@ -720,6 +724,9 @@ class TextEditorPresenter @updateCursorsState() unless oldScrollLeft? @updateOverlaysState() + getScrollLeft: -> + @scrollLeft + setHorizontalScrollbarHeight: (horizontalScrollbarHeight) -> unless @measuredHorizontalScrollbarHeight is horizontalScrollbarHeight oldHorizontalScrollbarHeight = @measuredHorizontalScrollbarHeight From cb712fa9d3fb9ed804f4c338537371d5a85c415a Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Tue, 28 Apr 2015 23:31:28 +0200 Subject: [PATCH 064/335] :art: Start refactoring batched operations --- src/text-editor-presenter.coffee | 48 ++++++++++++++++---------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index 55b88f2b8..9e41bf85c 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -100,34 +100,34 @@ class TextEditorPresenter @disposables.add @model.onDidChange => @updateContentDimensions() @updateEndRow() - @updateHeightState() - @updateVerticalScrollState() - @updateHorizontalScrollState() - @updateScrollbarsState() - @updateContentState() - @updateDecorations() - @updateLinesState() - @updateLineNumberGutterState() - @updateLineNumbersState() - @updateGutterOrderState() - @updateCustomGutterDecorationState() + @shouldUpdateHeightState = true + @shouldUpdateVerticalScrollState = true + @shouldUpdateHorizontalScrollState = true + @shouldUpdateScrollbarsState = true + @shouldUpdateContentState = true + @shouldUpdateDecorations = true + @shouldUpdateLinesState = true + @shouldUpdateLineNumberGutterState = true + @shouldUpdateLineNumbersState = true + @shouldUpdateGutterOrderState = true + @updateCustomGutterDecorationState() # FIXME: use `shouldUpdate...` @disposables.add @model.onDidChangeGrammar(@didChangeGrammar.bind(this)) @disposables.add @model.onDidChangePlaceholderText(@updateContentState.bind(this)) @disposables.add @model.onDidChangeMini => - @updateScrollbarDimensions() - @updateScrollbarsState() - @updateContentState() - @updateDecorations() - @updateLinesState() - @updateLineNumberGutterState() - @updateLineNumbersState() - @updateCommonGutterState() - @updateGutterOrderState() - @updateCustomGutterDecorationState() + @shouldUpdateScrollbarDimensions = true + @shouldUpdateScrollbarsState = true + @shouldUpdateContentState = true + @shouldUpdateDecorations = true + @shouldUpdateLinesState = true + @shouldUpdateLineNumberGutterState = true + @shouldUpdateLineNumbersState = true + @updateCommonGutterState() # TODO: check out later... + @updateGutterOrderState() # FIXME: use `shouldUpdate...` + @updateCustomGutterDecorationState() # FIXME: use `shouldUpdate...` @disposables.add @model.onDidChangeLineNumberGutterVisible => - @updateLineNumberGutterState() - @updateCommonGutterState() - @updateGutterOrderState() + @shouldUpdateLineNumberGutterState = true + @updateCommonGutterState() # TODO: check out later... + @updateGutterOrderState() # FIXME: use `shouldUpdate...` @disposables.add @model.onDidAddDecoration(@didAddDecoration.bind(this)) @disposables.add @model.onDidAddCursor(@didAddCursor.bind(this)) @disposables.add @model.onDidChangeScrollTop(@setScrollTop.bind(this)) From 110e73da876b073d1f5c4f4bd322bbfbc72f8f4c Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Tue, 28 Apr 2015 23:52:30 +0200 Subject: [PATCH 065/335] :art: Use booleans to track batched functions --- src/text-editor-presenter.coffee | 282 +++++++++++++++++++------------ 1 file changed, 174 insertions(+), 108 deletions(-) diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index 9e41bf85c..169d95541 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -94,6 +94,8 @@ class TextEditorPresenter @updateCustomGutterDecorationState() if @shouldUpdateCustomGutterDecorationState @updating = false + throw new Error("Reset @shouldUpdateBlaBla variables to `false`!!!") + @state observeModel: -> @@ -110,24 +112,30 @@ class TextEditorPresenter @shouldUpdateLineNumberGutterState = true @shouldUpdateLineNumbersState = true @shouldUpdateGutterOrderState = true - @updateCustomGutterDecorationState() # FIXME: use `shouldUpdate...` + @shouldUpdateCustomGutterDecorationState = true + + @emitDidUpdateState() @disposables.add @model.onDidChangeGrammar(@didChangeGrammar.bind(this)) @disposables.add @model.onDidChangePlaceholderText(@updateContentState.bind(this)) @disposables.add @model.onDidChangeMini => - @shouldUpdateScrollbarDimensions = true + @updateScrollbarDimensions() @shouldUpdateScrollbarsState = true @shouldUpdateContentState = true @shouldUpdateDecorations = true @shouldUpdateLinesState = true @shouldUpdateLineNumberGutterState = true @shouldUpdateLineNumbersState = true + @shouldUpdateGutterOrderState = true + @shouldUpdateCustomGutterDecorationState = true @updateCommonGutterState() # TODO: check out later... - @updateGutterOrderState() # FIXME: use `shouldUpdate...` - @updateCustomGutterDecorationState() # FIXME: use `shouldUpdate...` + + @emitDidUpdateState() @disposables.add @model.onDidChangeLineNumberGutterVisible => @shouldUpdateLineNumberGutterState = true + @shouldUpdateGutterOrderState = true @updateCommonGutterState() # TODO: check out later... - @updateGutterOrderState() # FIXME: use `shouldUpdate...` + + @emitDidUpdateState() @disposables.add @model.onDidAddDecoration(@didAddDecoration.bind(this)) @disposables.add @model.onDidAddCursor(@didAddCursor.bind(this)) @disposables.add @model.onDidChangeScrollTop(@setScrollTop.bind(this)) @@ -153,24 +161,32 @@ class TextEditorPresenter @configDisposables.add atom.config.onDidChange 'editor.showIndentGuide', configParams, ({newValue}) => @showIndentGuide = newValue - @updateContentState() + @shouldUpdateContentState = true + + @emitDidUpdateState() @configDisposables.add atom.config.onDidChange 'editor.scrollPastEnd', configParams, ({newValue}) => @scrollPastEnd = newValue + @shouldUpdateVerticalScrollState = true + @shouldUpdateScrollbarsState = true @updateScrollHeight() - @updateVerticalScrollState() - @updateScrollbarsState() + + @emitDidUpdateState() @configDisposables.add atom.config.onDidChange 'editor.showLineNumbers', configParams, ({newValue}) => @showLineNumbers = newValue - @updateLineNumberGutterState() - @updateCommonGutterState() - @updateGutterOrderState() + @shouldUpdateLineNumberGutterState = true + @shouldUpdateGutterOrderState = true + @updateCommonGutterState() # TODO: check this out + + @emitDidUpdateState() didChangeGrammar: -> @observeConfig() - @updateContentState() - @updateLineNumberGutterState() - @updateCommonGutterState() - @updateGutterOrderState() + @shouldUpdateContentState = true + @shouldUpdateLineNumberGutterState = true + @shouldUpdateGutterOrderState = true + @updateCommonGutterState() # TODO: check this out + + @emitDidUpdateState() buildState: -> @state = @@ -395,18 +411,24 @@ class TextEditorPresenter didAddGutter: (gutter) -> gutterDisposables = new CompositeDisposable gutterDisposables.add gutter.onDidChangeVisible => - @updateGutterOrderState() - @updateCustomGutterDecorationState() + @shouldUpdateGutterOrderState = true + @shouldUpdateCustomGutterDecorationState = true + + @emitDidUpdateState() gutterDisposables.add gutter.onDidDestroy => @disposables.remove(gutterDisposables) gutterDisposables.dispose() - @updateGutterOrderState() + @shouldUpdateGutterOrderState = true + + @emitDidUpdateState() # It is not necessary to @updateCustomGutterDecorationState here. # The destroyed gutter will be removed from the list of gutters in @state, # and thus will be removed from the DOM. @disposables.add(gutterDisposables) - @updateGutterOrderState() - @updateCustomGutterDecorationState() + @shouldUpdateGutterOrderState = true + @shouldUpdateCustomGutterDecorationState = true + + @emitDidUpdateState() updateGutterOrderState: -> @batch "shouldUpdateGutterOrderState", -> @@ -670,8 +692,10 @@ class TextEditorPresenter @startBlinkingCursors() else @stopBlinkingCursors(false) - @updateFocusedState() - @updateHiddenInputState() + @shouldUpdateFocusedState = true + @shouldUpdateHiddenInputState = true + + @emitDidUpdateState() setScrollTop: (scrollTop) -> scrollTop = @constrainScrollTop(scrollTop) @@ -682,14 +706,16 @@ class TextEditorPresenter @updateStartRow() @updateEndRow() @didStartScrolling() - @updateVerticalScrollState() - @updateHiddenInputState() - @updateDecorations() - @updateLinesState() - @updateCursorsState() - @updateLineNumbersState() - @updateCustomGutterDecorationState() - @updateOverlaysState() + @shouldUpdateVerticalScrollState = true + @shouldUpdateHiddenInputState = true + @shouldUpdateDecorations = true + @shouldUpdateLinesState = true + @shouldUpdateCursorsState = true + @shouldUpdateLineNumbersState = true + @shouldUpdateCustomGutterDecorationState = true + @shouldUpdateOverlaysState = true + + @emitDidUpdateState() didStartScrolling: -> if @stoppedScrollingTimeoutId? @@ -703,11 +729,11 @@ class TextEditorPresenter @state.content.scrollingVertically = false if @mouseWheelScreenRow? @mouseWheelScreenRow = null - @updateLinesState() - @updateLineNumbersState() + @shouldUpdateLinesState = true + @shouldUpdateLineNumbersState = true @updateCustomGutterDecorationState() - else - @emitDidUpdateState() + + @emitDidUpdateState() setScrollLeft: (scrollLeft) -> scrollLeft = @constrainScrollLeft(scrollLeft) @@ -715,10 +741,12 @@ class TextEditorPresenter oldScrollLeft = @scrollLeft @scrollLeft = scrollLeft @model.setScrollLeft(scrollLeft) - @updateHorizontalScrollState() - @updateHiddenInputState() - @updateCursorsState() unless oldScrollLeft? - @updateOverlaysState() + @shouldUpdateHorizontalScrollState = true + @shouldUpdateHiddenInputState = true + @shouldUpdateCursorsState = true unless oldScrollLeft? + @shouldUpdateOverlaysState = true + + @emitDidUpdateState() setHorizontalScrollbarHeight: (horizontalScrollbarHeight) -> unless @measuredHorizontalScrollbarHeight is horizontalScrollbarHeight @@ -726,10 +754,12 @@ class TextEditorPresenter @measuredHorizontalScrollbarHeight = horizontalScrollbarHeight @model.setHorizontalScrollbarHeight(horizontalScrollbarHeight) @updateScrollbarDimensions() - @updateScrollbarsState() - @updateVerticalScrollState() - @updateHorizontalScrollState() - @updateCursorsState() unless oldHorizontalScrollbarHeight? + @shouldUpdateScrollbarsState = true + @shouldUpdateVerticalScrollState = true + @shouldUpdateHorizontalScrollState = true + @shouldUpdateCursorsState = true unless oldHorizontalScrollbarHeight? + + @emitDidUpdateState() setVerticalScrollbarWidth: (verticalScrollbarWidth) -> unless @measuredVerticalScrollbarWidth is verticalScrollbarWidth @@ -737,28 +767,34 @@ class TextEditorPresenter @measuredVerticalScrollbarWidth = verticalScrollbarWidth @model.setVerticalScrollbarWidth(verticalScrollbarWidth) @updateScrollbarDimensions() - @updateScrollbarsState() - @updateVerticalScrollState() - @updateHorizontalScrollState() - @updateCursorsState() unless oldVerticalScrollbarWidth? + @shouldUpdateScrollbarsState = true + @shouldUpdateVerticalScrollState = true + @shouldUpdateHorizontalScrollState = true + @shouldUpdateCursorsState = true unless oldVerticalScrollbarWidth? + + @emitDidUpdateState() setAutoHeight: (autoHeight) -> unless @autoHeight is autoHeight @autoHeight = autoHeight - @updateHeightState() + @shouldUpdateHeightState = true + + @emitDidUpdateState() setExplicitHeight: (explicitHeight) -> unless @explicitHeight is explicitHeight @explicitHeight = explicitHeight @model.setHeight(explicitHeight) @updateHeight() - @updateVerticalScrollState() - @updateScrollbarsState() - @updateDecorations() - @updateLinesState() - @updateCursorsState() - @updateLineNumbersState() - @updateCustomGutterDecorationState() + @shouldUpdateVerticalScrollState = true + @shouldUpdateScrollbarsState = true + @shouldUpdateDecorations = true + @shouldUpdateLinesState = true + @shouldUpdateCursorsState = true + @shouldUpdateLineNumbersState = true + @shouldUpdateCustomGutterDecorationState = true + + @emitDidUpdateState() updateHeight: -> height = @explicitHeight ? @contentHeight @@ -776,18 +812,22 @@ class TextEditorPresenter @model.setWidth(contentFrameWidth) @updateScrollbarDimensions() @updateClientWidth() - @updateVerticalScrollState() - @updateHorizontalScrollState() - @updateScrollbarsState() - @updateContentState() - @updateDecorations() - @updateLinesState() - @updateCursorsState() unless oldContentFrameWidth? + @shouldUpdateVerticalScrollState = true + @shouldUpdateHorizontalScrollState = true + @shouldUpdateScrollbarsState = true + @shouldUpdateContentState = true + @shouldUpdateDecorations = true + @shouldUpdateLinesState = true + @shouldUpdateCursorsState = true unless oldContentFrameWidth? + + @emitDidUpdateState() setBoundingClientRect: (boundingClientRect) -> unless @clientRectsEqual(@boundingClientRect, boundingClientRect) @boundingClientRect = boundingClientRect - @updateOverlaysState() + @shouldUpdateOverlaysState = true + + @emitDidUpdateState() clientRectsEqual: (clientRectA, clientRectB) -> clientRectA? and clientRectB? and @@ -800,22 +840,28 @@ class TextEditorPresenter if @windowWidth isnt width or @windowHeight isnt height @windowWidth = width @windowHeight = height - @updateOverlaysState() + @shouldUpdateOverlaysState = true + + @emitDidUpdateState() setBackgroundColor: (backgroundColor) -> unless @backgroundColor is backgroundColor @backgroundColor = backgroundColor - @updateContentState() - @updateLineNumberGutterState() + @shouldUpdateContentState = true + @shouldUpdateLineNumberGutterState = true @updateCommonGutterState() - @updateGutterOrderState() + @shouldUpdateGutterOrderState = true + + @emitDidUpdateState() setGutterBackgroundColor: (gutterBackgroundColor) -> unless @gutterBackgroundColor is gutterBackgroundColor @gutterBackgroundColor = gutterBackgroundColor - @updateLineNumberGutterState() + @shouldUpdateLineNumberGutterState = true @updateCommonGutterState() - @updateGutterOrderState() + @shouldUpdateGutterOrderState = true + + @emitDidUpdateState() setLineHeight: (lineHeight) -> unless @lineHeight is lineHeight @@ -826,17 +872,19 @@ class TextEditorPresenter @updateHeight() @updateStartRow() @updateEndRow() - @updateHeightState() - @updateHorizontalScrollState() - @updateVerticalScrollState() - @updateScrollbarsState() - @updateHiddenInputState() - @updateDecorations() - @updateLinesState() - @updateCursorsState() - @updateLineNumbersState() - @updateCustomGutterDecorationState() - @updateOverlaysState() + @shouldUpdateHeightState = true + @shouldUpdateHorizontalScrollState = true + @shouldUpdateVerticalScrollState = true + @shouldUpdateScrollbarsState = true + @shouldUpdateHiddenInputState = true + @shouldUpdateDecorations = true + @shouldUpdateLinesState = true + @shouldUpdateCursorsState = true + @shouldUpdateLineNumbersState = true + @shouldUpdateCustomGutterDecorationState = true + @shouldUpdateOverlaysState = true + + @emitDidUpdateState() setMouseWheelScreenRow: (mouseWheelScreenRow) -> unless @mouseWheelScreenRow is mouseWheelScreenRow @@ -876,15 +924,17 @@ class TextEditorPresenter characterWidthsChanged: -> @updateContentDimensions() - @updateHorizontalScrollState() - @updateVerticalScrollState() - @updateScrollbarsState() - @updateHiddenInputState() - @updateContentState() - @updateDecorations() - @updateLinesState() - @updateCursorsState() - @updateOverlaysState() + @shouldUpdateHorizontalScrollState = true + @shouldUpdateVerticalScrollState = true + @shouldUpdateScrollbarsState = true + @shouldUpdateHiddenInputState = true + @shouldUpdateContentState = true + @shouldUpdateDecorations = true + @shouldUpdateLinesState = true + @shouldUpdateCursorsState = true + @shouldUpdateOverlaysState = true + + @emitDidUpdateState() clearScopedCharacterWidths: -> @characterWidthsByScope = {} @@ -972,11 +1022,11 @@ class TextEditorPresenter intersectsVisibleRowRange = true if intersectsVisibleRowRange - @updateLinesState() if decoration.isType('line') + @shouldUpdateLinesState = true if decoration.isType('line') if decoration.isType('line-number') - @updateLineNumbersState() + @shouldUpdateLineNumbersState = true else if decoration.isType('gutter') - @updateCustomGutterDecorationState() + @shouldUpdateCustomGutterDecorationState = true if decoration.isType('highlight') return if change.textChanged @@ -984,7 +1034,9 @@ class TextEditorPresenter @updateHighlightState(decoration) if decoration.isType('overlay') - @updateOverlaysState() + @shouldUpdateOverlaysState = true + + @emitDidUpdateState() decorationPropertiesDidChange: (decoration, event) -> {oldProperties} = event @@ -995,29 +1047,33 @@ class TextEditorPresenter decoration.getMarker().getScreenRange()) @addToLineDecorationCaches(decoration, decoration.getMarker().getScreenRange()) if decoration.isType('line') or Decoration.isType(oldProperties, 'line') - @updateLinesState() + @shouldUpdateLinesState = true if decoration.isType('line-number') or Decoration.isType(oldProperties, 'line-number') - @updateLineNumbersState() + @shouldUpdateLineNumbersState = true if (decoration.isType('gutter') and not decoration.isType('line-number')) or (Decoration.isType(oldProperties, 'gutter') and not Decoration.isType(oldProperties, 'line-number')) - @updateCustomGutterDecorationState() + @shouldUpdateCustomGutterDecorationState = true else if decoration.isType('overlay') - @updateOverlaysState() + @shouldUpdateOverlaysState = true else if decoration.isType('highlight') @updateHighlightState(decoration, event) + @emitDidUpdateState() + didDestroyDecoration: (decoration) -> if decoration.isType('line') or decoration.isType('gutter') @removeFromLineDecorationCaches(decoration, decoration.getMarker().getScreenRange()) - @updateLinesState() if decoration.isType('line') + @shouldUpdateLinesState = true if decoration.isType('line') if decoration.isType('line-number') - @updateLineNumbersState() + @shouldUpdateLineNumbersState = true else if decoration.isType('gutter') - @updateCustomGutterDecorationState(decoration.getProperties().gutterName) + @shouldUpdateCustomGutterDecorationState = true if decoration.isType('highlight') @updateHighlightState(decoration) if decoration.isType('overlay') - @updateOverlaysState() + @shouldUpdateOverlaysState = true + + @emitDidUpdateState() highlightDidFlash: (decoration) -> flash = decoration.consumeNextFlash() @@ -1032,15 +1088,17 @@ class TextEditorPresenter if decoration.isType('line') or decoration.isType('gutter') @addToLineDecorationCaches(decoration, decoration.getMarker().getScreenRange()) - @updateLinesState() if decoration.isType('line') + @shouldUpdateLinesState = true if decoration.isType('line') if decoration.isType('line-number') - @updateLineNumbersState() + @shouldUpdateLineNumbersState = true else if decoration.isType('gutter') - @updateCustomGutterDecorationState() + @shouldUpdateCustomGutterDecorationState = true else if decoration.isType('highlight') @updateHighlightState(decoration) else if decoration.isType('overlay') - @updateOverlaysState() + @shouldUpdateOverlaysState = true + + @emitDidUpdateState() updateDecorations: -> @batch "shouldUpdateDecorations", -> @lineDecorationsByScreenRow = {} @@ -1197,14 +1255,18 @@ class TextEditorPresenter overlayState.itemWidth = itemWidth overlayState.itemHeight = itemHeight overlayState.contentMargin = contentMargin - @updateOverlaysState() + @shouldUpdateOverlaysState = true + + @emitDidUpdateState() observeCursor: (cursor) -> didChangePositionDisposable = cursor.onDidChangePosition => - @updateHiddenInputState() if cursor.isLastCursor() + @shouldUpdateHiddenInputState = true if cursor.isLastCursor() @pauseCursorBlinking() @updateCursorState(cursor) + @emitDidUpdateState() + didChangeVisibilityDisposable = cursor.onDidChangeVisibility => @updateCursorState(cursor) @@ -1212,19 +1274,23 @@ class TextEditorPresenter @disposables.remove(didChangePositionDisposable) @disposables.remove(didChangeVisibilityDisposable) @disposables.remove(didDestroyDisposable) - @updateHiddenInputState() + @shouldUpdateHiddenInputState = true @updateCursorState(cursor, true) + @emitDidUpdateState() + @disposables.add(didChangePositionDisposable) @disposables.add(didChangeVisibilityDisposable) @disposables.add(didDestroyDisposable) didAddCursor: (cursor) -> @observeCursor(cursor) - @updateHiddenInputState() + @shouldUpdateHiddenInputState = true @pauseCursorBlinking() @updateCursorState(cursor) + @emitDidUpdateState() + startBlinkingCursors: -> unless @toggleCursorBlinkHandle @state.content.cursorsVisible = true From 319d54782a18dc2ad4c4e98cdc87b44cda217ec0 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Wed, 29 Apr 2015 08:53:28 +0200 Subject: [PATCH 066/335] Reset shouldUpdate... variables --- src/text-editor-presenter.coffee | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index 169d95541..0078077bb 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -94,10 +94,27 @@ class TextEditorPresenter @updateCustomGutterDecorationState() if @shouldUpdateCustomGutterDecorationState @updating = false - throw new Error("Reset @shouldUpdateBlaBla variables to `false`!!!") + @resetShouldUpdateStates() @state + resetShouldUpdateStates: -> + @shouldUpdateFocusedState = false + @shouldUpdateHeightState = false + @shouldUpdateVerticalScrollState = false + @shouldUpdateHorizontalScrollState = false + @shouldUpdateScrollbarsState = false + @shouldUpdateHiddenInputState = false + @shouldUpdateContentState = false + @shouldUpdateDecorations = false + @shouldUpdateLinesState = false + @shouldUpdateCursorsState = false + @shouldUpdateOverlaysState = false + @shouldUpdateLineNumberGutterState = false + @shouldUpdateLineNumbersState = false + @shouldUpdateGutterOrderState = false + @shouldUpdateCustomGutterDecorationState = false + observeModel: -> @disposables.add @model.onDidChange => @updateContentDimensions() @@ -229,6 +246,8 @@ class TextEditorPresenter @updateGutterOrderState() @updateCustomGutterDecorationState() + @resetShouldUpdateStates() + updateFocusedState: -> @batch "shouldUpdateFocusedState", -> @state.focused = @focused From 611ede4cc9ad44befb3295fabf740155c37fd45d Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Wed, 29 Apr 2015 08:59:00 +0200 Subject: [PATCH 067/335] :fire: Remove `@batch` from TextEditorPresenter Please note that we will preserve the batching behavior but we will now simply use booleans to track functions that ought to be called during `@getState`. This (hopefully) expresses intent better, drawing a clear line between batched functions and "realtime" ones. --- src/text-editor-presenter.coffee | 89 ++++++++++++++------------------ 1 file changed, 39 insertions(+), 50 deletions(-) diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index 0078077bb..26c9627da 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -55,18 +55,6 @@ class TextEditorPresenter isBatching: -> @updating is false - # Private: Executes `fn` if `isBatching()` is false, otherwise sets `@[flagName]` to `true` for later processing. In either cases, it calls `emitDidUpdateState`. - # * `flagName` {String} name of a property of this presenter - # * `fn` {Function} to call when not batching. - batch: (flagName, fn) -> - if @isBatching() - @[flagName] = true - else - fn.apply(this) - @[flagName] = false - - @emitDidUpdateState() - # Public: Gets this presenter's state, updating it just in time before returning from this function. # Returns a state {Object}, useful for rendering to screen. getState: -> @@ -133,7 +121,10 @@ class TextEditorPresenter @emitDidUpdateState() @disposables.add @model.onDidChangeGrammar(@didChangeGrammar.bind(this)) - @disposables.add @model.onDidChangePlaceholderText(@updateContentState.bind(this)) + @disposables.add @model.onDidChangePlaceholderText => + @shouldUpdateContentState = true + + @emitDidUpdateState() @disposables.add @model.onDidChangeMini => @updateScrollbarDimensions() @shouldUpdateScrollbarsState = true @@ -248,16 +239,16 @@ class TextEditorPresenter @resetShouldUpdateStates() - updateFocusedState: -> @batch "shouldUpdateFocusedState", -> + updateFocusedState: -> @state.focused = @focused - updateHeightState: -> @batch "shouldUpdateHeightState", -> + updateHeightState: -> if @autoHeight @state.height = @contentHeight else @state.height = null - updateVerticalScrollState: -> @batch "shouldUpdateVerticalScrollState", -> + updateVerticalScrollState: -> @state.content.scrollHeight = @scrollHeight @state.gutters.scrollHeight = @scrollHeight @state.verticalScrollbar.scrollHeight = @scrollHeight @@ -266,14 +257,14 @@ class TextEditorPresenter @state.gutters.scrollTop = @scrollTop @state.verticalScrollbar.scrollTop = @scrollTop - updateHorizontalScrollState: -> @batch "shouldUpdateHorizontalScrollState", -> + updateHorizontalScrollState: -> @state.content.scrollWidth = @scrollWidth @state.horizontalScrollbar.scrollWidth = @scrollWidth @state.content.scrollLeft = @scrollLeft @state.horizontalScrollbar.scrollLeft = @scrollLeft - updateScrollbarsState: -> @batch "shouldUpdateScrollbarsState", -> + updateScrollbarsState: -> @state.horizontalScrollbar.visible = @horizontalScrollbarHeight > 0 @state.horizontalScrollbar.height = @measuredHorizontalScrollbarHeight @state.horizontalScrollbar.right = @verticalScrollbarWidth @@ -282,7 +273,7 @@ class TextEditorPresenter @state.verticalScrollbar.width = @measuredVerticalScrollbarWidth @state.verticalScrollbar.bottom = @horizontalScrollbarHeight - updateHiddenInputState: -> @batch "shouldUpdateHiddenInputState", -> + updateHiddenInputState: -> return unless lastCursor = @model.getLastCursor() {top, left, height, width} = @pixelRectForScreenRange(lastCursor.getScreenRange()) @@ -299,14 +290,14 @@ class TextEditorPresenter @state.hiddenInput.height = height @state.hiddenInput.width = Math.max(width, 2) - updateContentState: -> @batch "shouldUpdateContentState", -> + updateContentState: -> @state.content.scrollWidth = @scrollWidth @state.content.scrollLeft = @scrollLeft @state.content.indentGuidesVisible = not @model.isMini() and @showIndentGuide @state.content.backgroundColor = if @model.isMini() then null else @backgroundColor @state.content.placeholderText = if @model.isEmpty() then @model.getPlaceholderText() else null - updateLinesState: -> @batch "shouldUpdateLinesState", -> + updateLinesState: -> return unless @startRow? and @endRow? and @lineHeight? visibleLineIds = {} @@ -351,7 +342,7 @@ class TextEditorPresenter top: row * @lineHeight decorationClasses: @lineDecorationClassesForRow(row) - updateCursorsState: -> @batch "shouldUpdateCursorsState", -> + updateCursorsState: -> @state.content.cursors = {} @updateCursorState(cursor) for cursor in @model.cursors # using property directly to avoid allocation return @@ -369,7 +360,7 @@ class TextEditorPresenter @emitDidUpdateState() - updateOverlaysState: -> @batch "shouldUpdateOverlaysState", -> + updateOverlaysState: -> return unless @hasOverlayPositionRequirements() visibleDecorationIds = {} @@ -418,7 +409,7 @@ class TextEditorPresenter return - updateLineNumberGutterState: -> @batch "shouldUpdateLineNumberGutterState", -> + updateLineNumberGutterState: -> @state.gutters.lineNumberGutter.maxLineNumberDigits = @model.getLineCount().toString().length updateCommonGutterState: -> @@ -450,13 +441,12 @@ class TextEditorPresenter @emitDidUpdateState() updateGutterOrderState: -> - @batch "shouldUpdateGutterOrderState", -> - @state.gutters.sortedDescriptions = [] - if @model.isMini() - return - for gutter in @model.getGutters() - isVisible = @gutterIsVisible(gutter) - @state.gutters.sortedDescriptions.push({gutter, visible: isVisible}) + @state.gutters.sortedDescriptions = [] + if @model.isMini() + return + for gutter in @model.getGutters() + isVisible = @gutterIsVisible(gutter) + @state.gutters.sortedDescriptions.push({gutter, visible: isVisible}) # Updates the decoration state for the gutter with the given gutterName. # @state.gutters.customDecorations is an {Object}, with the form: @@ -469,25 +459,24 @@ class TextEditorPresenter # } # } updateCustomGutterDecorationState: -> - @batch 'shouldUpdateCustomGutterDecorationState', => - return unless @startRow? and @endRow? and @lineHeight? + return unless @startRow? and @endRow? and @lineHeight? - @state.gutters.customDecorations = {} - return if @model.isMini() + @state.gutters.customDecorations = {} + return if @model.isMini() - for gutter in @model.getGutters() - gutterName = gutter.name - @state.gutters.customDecorations[gutterName] = {} - return if not @gutterIsVisible(gutter) + for gutter in @model.getGutters() + gutterName = gutter.name + @state.gutters.customDecorations[gutterName] = {} + return if not @gutterIsVisible(gutter) - relevantDecorations = @customGutterDecorationsInRange(gutterName, @startRow, @endRow - 1) - relevantDecorations.forEach (decoration) => - decorationRange = decoration.getMarker().getScreenRange() - @state.gutters.customDecorations[gutterName][decoration.id] = - top: @lineHeight * decorationRange.start.row - height: @lineHeight * decorationRange.getRowCount() - item: decoration.getProperties().item - class: decoration.getProperties().class + relevantDecorations = @customGutterDecorationsInRange(gutterName, @startRow, @endRow - 1) + relevantDecorations.forEach (decoration) => + decorationRange = decoration.getMarker().getScreenRange() + @state.gutters.customDecorations[gutterName][decoration.id] = + top: @lineHeight * decorationRange.start.row + height: @lineHeight * decorationRange.getRowCount() + item: decoration.getProperties().item + class: decoration.getProperties().class gutterIsVisible: (gutterModel) -> isVisible = gutterModel.isVisible() @@ -495,7 +484,7 @@ class TextEditorPresenter isVisible = isVisible and @showLineNumbers isVisible - updateLineNumbersState: -> @batch "shouldUpdateLineNumbersState", -> + updateLineNumbersState: -> return unless @startRow? and @endRow? and @lineHeight? visibleLineNumberIds = {} @@ -750,7 +739,7 @@ class TextEditorPresenter @mouseWheelScreenRow = null @shouldUpdateLinesState = true @shouldUpdateLineNumbersState = true - @updateCustomGutterDecorationState() + @shouldUpdateCustomGutterDecorationState = true @emitDidUpdateState() @@ -1119,7 +1108,7 @@ class TextEditorPresenter @emitDidUpdateState() - updateDecorations: -> @batch "shouldUpdateDecorations", -> + updateDecorations: -> @lineDecorationsByScreenRow = {} @lineNumberDecorationsByScreenRow = {} @customGutterDecorationsByGutterNameAndScreenRow = {} From e1d5485516553cf830e38c49e01db436de064125 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Wed, 29 Apr 2015 09:13:27 +0200 Subject: [PATCH 068/335] :art: --- src/text-editor-presenter.coffee | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index 26c9627da..d698b04d8 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -82,11 +82,11 @@ class TextEditorPresenter @updateCustomGutterDecorationState() if @shouldUpdateCustomGutterDecorationState @updating = false - @resetShouldUpdateStates() + @resetTrackedUpdates() @state - resetShouldUpdateStates: -> + resetTrackedUpdates: -> @shouldUpdateFocusedState = false @shouldUpdateHeightState = false @shouldUpdateVerticalScrollState = false @@ -126,7 +126,6 @@ class TextEditorPresenter @emitDidUpdateState() @disposables.add @model.onDidChangeMini => - @updateScrollbarDimensions() @shouldUpdateScrollbarsState = true @shouldUpdateContentState = true @shouldUpdateDecorations = true @@ -135,13 +134,14 @@ class TextEditorPresenter @shouldUpdateLineNumbersState = true @shouldUpdateGutterOrderState = true @shouldUpdateCustomGutterDecorationState = true - @updateCommonGutterState() # TODO: check out later... + @updateScrollbarDimensions() + @updateCommonGutterState() @emitDidUpdateState() @disposables.add @model.onDidChangeLineNumberGutterVisible => @shouldUpdateLineNumberGutterState = true @shouldUpdateGutterOrderState = true - @updateCommonGutterState() # TODO: check out later... + @updateCommonGutterState() @emitDidUpdateState() @disposables.add @model.onDidAddDecoration(@didAddDecoration.bind(this)) @@ -183,7 +183,7 @@ class TextEditorPresenter @showLineNumbers = newValue @shouldUpdateLineNumberGutterState = true @shouldUpdateGutterOrderState = true - @updateCommonGutterState() # TODO: check this out + @updateCommonGutterState() @emitDidUpdateState() @@ -192,7 +192,7 @@ class TextEditorPresenter @shouldUpdateContentState = true @shouldUpdateLineNumberGutterState = true @shouldUpdateGutterOrderState = true - @updateCommonGutterState() # TODO: check this out + @updateCommonGutterState() @emitDidUpdateState() @@ -237,7 +237,7 @@ class TextEditorPresenter @updateGutterOrderState() @updateCustomGutterDecorationState() - @resetShouldUpdateStates() + @resetTrackedUpdates() updateFocusedState: -> @state.focused = @focused From 52f06a619eded6bbc7ea44e7202c1884ea995292 Mon Sep 17 00:00:00 2001 From: simurai Date: Wed, 29 Apr 2015 16:59:24 +0900 Subject: [PATCH 069/335] Add DejaVu Sans Mono to font stack Should fix font issues on Linux #4201 --- static/text-editor-light.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/text-editor-light.less b/static/text-editor-light.less index 3ba4e8313..b51995dc4 100644 --- a/static/text-editor-light.less +++ b/static/text-editor-light.less @@ -4,7 +4,7 @@ atom-text-editor { display: block; - font-family: Inconsolata, Monaco, Consolas, 'Courier New', Courier; + font-family: Inconsolata, Monaco, Consolas, 'DejaVu Sans Mono', 'Courier New', Courier; line-height: 1.3; } From d97f67095e555c874ff6aaa511c1807884b6a0d0 Mon Sep 17 00:00:00 2001 From: simurai Date: Wed, 29 Apr 2015 20:02:54 +0900 Subject: [PATCH 070/335] Add better fallback font See comment https://github.com/atom/atom/pull/6567#commitcomment-10960397 --- static/text-editor-light.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/text-editor-light.less b/static/text-editor-light.less index b51995dc4..9d87c61ca 100644 --- a/static/text-editor-light.less +++ b/static/text-editor-light.less @@ -4,7 +4,7 @@ atom-text-editor { display: block; - font-family: Inconsolata, Monaco, Consolas, 'DejaVu Sans Mono', 'Courier New', Courier; + font-family: Inconsolata, Monaco, Consolas, 'DejaVu Sans Mono', monospace; line-height: 1.3; } From 5e766b6eee31c9d4abb2235f98c9a6395822d5ed Mon Sep 17 00:00:00 2001 From: Jess Lin Date: Wed, 29 Apr 2015 08:53:04 -0700 Subject: [PATCH 071/335] [Gutter] Clear custom gutter decorations from previous usages of a custom gutter element --- spec/text-editor-element-spec.coffee | 15 +++++++++++++++ src/custom-gutter-component.coffee | 2 ++ 2 files changed, 17 insertions(+) diff --git a/spec/text-editor-element-spec.coffee b/spec/text-editor-element-spec.coffee index 418e0367d..435b3a4a5 100644 --- a/spec/text-editor-element-spec.coffee +++ b/spec/text-editor-element-spec.coffee @@ -79,6 +79,21 @@ describe "TextEditorElement", -> jasmine.attachToDOM(element) expect(element.shadowRoot.querySelectorAll('.line-number').length).toBe initialCount + it "does not render duplicate decorations in custom gutters", -> + editor = new TextEditor + editor.setText('1\n2\n3') + editor.addGutter({name: 'test-gutter'}) + marker = editor.markBufferRange([[0,0],[2,0]]) + editor.decorateMarker(marker, {type: 'gutter', gutterName: 'test-gutter'}) + element = atom.views.getView(editor) + + jasmine.attachToDOM(element) + initialDecorationCount = element.shadowRoot.querySelectorAll('.decoration').length + + element.remove() + jasmine.attachToDOM(element) + expect(element.shadowRoot.querySelectorAll('.decoration').length).toBe initialDecorationCount + describe "focus and blur handling", -> describe "when the editor.useShadowDOM config option is true", -> it "proxies focus/blur events to/from the hidden input inside the shadow root", -> diff --git a/src/custom-gutter-component.coffee b/src/custom-gutter-component.coffee index 380322e8b..1321c8990 100644 --- a/src/custom-gutter-component.coffee +++ b/src/custom-gutter-component.coffee @@ -13,6 +13,8 @@ class CustomGutterComponent @domNode = atom.views.getView(@gutter) @decorationsNode = @domNode.firstChild + # Clear the contents in case the domNode is being reused. + @decorationsNode.innerHTML = '' getDomNode: -> @domNode From e6887fd2120c234177422e3b4060a41afc46ad32 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 29 Apr 2015 09:05:35 -0700 Subject: [PATCH 072/335] :arrow_up: language-java@0.15 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8d8140862..2d9ade0e1 100644 --- a/package.json +++ b/package.json @@ -133,7 +133,7 @@ "language-go": "0.25.0", "language-html": "0.34.0", "language-hyperlink": "0.12.2", - "language-java": "0.14.0", + "language-java": "0.15.0", "language-javascript": "0.75.0", "language-json": "0.14.0", "language-less": "0.26.0", From 213e6fd6112f2a95b3f87c87d769d42fd92271e5 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 28 Apr 2015 11:44:56 -0700 Subject: [PATCH 073/335] Check process before killing --- src/buffered-process.coffee | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/buffered-process.coffee b/src/buffered-process.coffee index 9748e5557..44c870a93 100644 --- a/src/buffered-process.coffee +++ b/src/buffered-process.coffee @@ -164,6 +164,8 @@ class BufferedProcess # This is required since killing the cmd.exe does not terminate child # processes. killOnWindows: -> + return unless @process? + parentPid = @process.pid cmd = 'wmic' args = [ From a67d9615a81318f4ec2103b0a2e7d0a75e947eb0 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 28 Apr 2015 11:46:04 -0700 Subject: [PATCH 074/335] Extract error handling helper --- src/buffered-process.coffee | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/buffered-process.coffee b/src/buffered-process.coffee index 44c870a93..809618817 100644 --- a/src/buffered-process.coffee +++ b/src/buffered-process.coffee @@ -102,17 +102,7 @@ class BufferedProcess processExited = true triggerExitCallback() - @process.on 'error', (error) => - handled = false - handle = -> handled = true - - @emitter.emit 'will-throw-error', {error, handle} - - if error.code is 'ENOENT' and error.syscall.indexOf('spawn') is 0 - error = new Error("Failed to spawn command `#{command}`. Make sure `#{command}` is installed and on your PATH", error.path) - error.name = 'BufferedProcessError' - - throw error unless handled + @process.on 'error', (error) => @handleError(error) ### Section: Event Subscription @@ -222,3 +212,15 @@ class BufferedProcess @killProcess() undefined + + handleError: (error) -> + handled = false + handle = -> handled = true + + @emitter.emit 'will-throw-error', {error, handle} + + if error.code is 'ENOENT' and error.syscall.indexOf('spawn') is 0 + error = new Error("Failed to spawn command `#{command}`. Make sure `#{command}` is installed and on your PATH", error.path) + error.name = 'BufferedProcessError' + + throw error unless handled From 99e40a788bfe643210f844c2ce0a42fb0742a656 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 28 Apr 2015 11:50:28 -0700 Subject: [PATCH 075/335] Handle errors thrown by child_process.spawn --- src/buffered-process.coffee | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/buffered-process.coffee b/src/buffered-process.coffee index 809618817..b96416850 100644 --- a/src/buffered-process.coffee +++ b/src/buffered-process.coffee @@ -69,9 +69,9 @@ class BufferedProcess cmdArgs = ['/s', '/c', "\"#{cmdArgs.join(' ')}\""] cmdOptions = _.clone(options) cmdOptions.windowsVerbatimArguments = true - @process = ChildProcess.spawn(@getCmdPath(), cmdArgs, cmdOptions) + @process = @spawn(@getCmdPath(), cmdArgs, cmdOptions) else - @process = ChildProcess.spawn(command, args, options) + @process = @spawn(command, args, options) @killed = false stdoutClosed = true @@ -213,6 +213,13 @@ class BufferedProcess undefined + spawn: (command, args, options) -> + try + process = ChildProcess.spawn(command, args, options) + catch spawnError + process.nextTick => @handleError(spawnError) + process + handleError: (error) -> handled = false handle = -> handled = true From fd84c5ff04d8122f84aa35b67838cd65abc7bd88 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 28 Apr 2015 11:53:18 -0700 Subject: [PATCH 076/335] Extract handle events helper --- src/buffered-process.coffee | 64 ++++++++++++++++++++----------------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/src/buffered-process.coffee b/src/buffered-process.coffee index b96416850..4302a0de7 100644 --- a/src/buffered-process.coffee +++ b/src/buffered-process.coffee @@ -72,37 +72,9 @@ class BufferedProcess @process = @spawn(@getCmdPath(), cmdArgs, cmdOptions) else @process = @spawn(command, args, options) + @killed = false - - stdoutClosed = true - stderrClosed = true - processExited = true - exitCode = 0 - triggerExitCallback = -> - return if @killed - if stdoutClosed and stderrClosed and processExited - exit?(exitCode) - - if stdout - stdoutClosed = false - @bufferStream @process.stdout, stdout, -> - stdoutClosed = true - triggerExitCallback() - - if stderr - stderrClosed = false - @bufferStream @process.stderr, stderr, -> - stderrClosed = true - triggerExitCallback() - - if exit - processExited = false - @process.on 'exit', (code) -> - exitCode = code - processExited = true - triggerExitCallback() - - @process.on 'error', (error) => @handleError(error) + @handeEvents(stdout, stderr, exit) if @process? ### Section: Event Subscription @@ -220,6 +192,38 @@ class BufferedProcess process.nextTick => @handleError(spawnError) process + handleEvents: (stdout, stderr, exit) -> + stdoutClosed = true + stderrClosed = true + processExited = true + exitCode = 0 + triggerExitCallback = -> + return if @killed + if stdoutClosed and stderrClosed and processExited + exit?(exitCode) + + if stdout + stdoutClosed = false + @bufferStream @process.stdout, stdout, -> + stdoutClosed = true + triggerExitCallback() + + if stderr + stderrClosed = false + @bufferStream @process.stderr, stderr, -> + stderrClosed = true + triggerExitCallback() + + if exit + processExited = false + @process.on 'exit', (code) -> + exitCode = code + processExited = true + triggerExitCallback() + + @process.on 'error', (error) => @handleError(error) + return + handleError: (error) -> handled = false handle = -> handled = true From 920def7eb0e3281ef23decf0cc36c159baf0442a Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 28 Apr 2015 12:03:31 -0700 Subject: [PATCH 077/335] Add spec for thrown spawn error --- spec/buffered-process-spec.coffee | 47 +++++++++++++++++++++++-------- src/buffered-process.coffee | 4 +-- 2 files changed, 37 insertions(+), 14 deletions(-) diff --git a/spec/buffered-process-spec.coffee b/spec/buffered-process-spec.coffee index ea9abe001..963460054 100644 --- a/spec/buffered-process-spec.coffee +++ b/spec/buffered-process-spec.coffee @@ -13,21 +13,44 @@ describe "BufferedProcess", -> window.onerror = oldOnError describe "when there is an error handler specified", -> - it "calls the error handler and does not throw an exception", -> - process = new BufferedProcess - command: 'bad-command-nope' - args: ['nothing'] - options: {} + describe "when an error event is emitted by the process", -> + it "calls the error handler and does not throw an exception", -> + process = new BufferedProcess + command: 'bad-command-nope' + args: ['nothing'] + options: {} - errorSpy = jasmine.createSpy().andCallFake (error) -> error.handle() - process.onWillThrowError(errorSpy) + errorSpy = jasmine.createSpy().andCallFake (error) -> error.handle() + process.onWillThrowError(errorSpy) - waitsFor -> errorSpy.callCount > 0 + waitsFor -> errorSpy.callCount > 0 - runs -> - expect(window.onerror).not.toHaveBeenCalled() - expect(errorSpy).toHaveBeenCalled() - expect(errorSpy.mostRecentCall.args[0].error.message).toContain 'spawn bad-command-nope ENOENT' + runs -> + expect(window.onerror).not.toHaveBeenCalled() + expect(errorSpy).toHaveBeenCalled() + expect(errorSpy.mostRecentCall.args[0].error.message).toContain 'spawn bad-command-nope ENOENT' + + describe "when an error is thrown spawning the process", -> + it "calls the error handler and does not throw an exception", -> + spyOn(ChildProcess, 'spawn').andCallFake -> + error = new Error('Something is really wrong') + error.code = 'EAGAIN' + throw error + + process = new BufferedProcess + command: 'ls' + args: [] + options: {} + + errorSpy = jasmine.createSpy().andCallFake (error) -> error.handle() + process.onWillThrowError(errorSpy) + + waitsFor -> errorSpy.callCount > 0 + + runs -> + expect(window.onerror).not.toHaveBeenCalled() + expect(errorSpy).toHaveBeenCalled() + expect(errorSpy.mostRecentCall.args[0].error.message).toContain 'Something is really wrong' describe "when there is not an error handler specified", -> it "calls the error handler and does not throw an exception", -> diff --git a/src/buffered-process.coffee b/src/buffered-process.coffee index 4302a0de7..95492449f 100644 --- a/src/buffered-process.coffee +++ b/src/buffered-process.coffee @@ -187,10 +187,10 @@ class BufferedProcess spawn: (command, args, options) -> try - process = ChildProcess.spawn(command, args, options) + spawned = ChildProcess.spawn(command, args, options) catch spawnError process.nextTick => @handleError(spawnError) - process + spawned handleEvents: (stdout, stderr, exit) -> stdoutClosed = true From 96f0916ddd19ed20d0543342cd51e7e9763d8b07 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 28 Apr 2015 18:07:09 -0700 Subject: [PATCH 078/335] Add missing l --- src/buffered-process.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/buffered-process.coffee b/src/buffered-process.coffee index 95492449f..b50e1a22e 100644 --- a/src/buffered-process.coffee +++ b/src/buffered-process.coffee @@ -74,7 +74,7 @@ class BufferedProcess @process = @spawn(command, args, options) @killed = false - @handeEvents(stdout, stderr, exit) if @process? + @handleEvents(stdout, stderr, exit) if @process? ### Section: Event Subscription From 78d2c868f79f6b6a535c78b1cbe83394535c08f5 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 28 Apr 2015 18:08:13 -0700 Subject: [PATCH 079/335] Assign process ivar from within spawn --- src/buffered-process.coffee | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/buffered-process.coffee b/src/buffered-process.coffee index b50e1a22e..030d952f5 100644 --- a/src/buffered-process.coffee +++ b/src/buffered-process.coffee @@ -69,9 +69,9 @@ class BufferedProcess cmdArgs = ['/s', '/c', "\"#{cmdArgs.join(' ')}\""] cmdOptions = _.clone(options) cmdOptions.windowsVerbatimArguments = true - @process = @spawn(@getCmdPath(), cmdArgs, cmdOptions) + @spawn(@getCmdPath(), cmdArgs, cmdOptions) else - @process = @spawn(command, args, options) + @spawn(command, args, options) @killed = false @handleEvents(stdout, stderr, exit) if @process? @@ -187,10 +187,9 @@ class BufferedProcess spawn: (command, args, options) -> try - spawned = ChildProcess.spawn(command, args, options) + @process = ChildProcess.spawn(command, args, options) catch spawnError process.nextTick => @handleError(spawnError) - spawned handleEvents: (stdout, stderr, exit) -> stdoutClosed = true From a9806d63ebc6c17085aed059eae7cfd5bead2079 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 28 Apr 2015 18:08:44 -0700 Subject: [PATCH 080/335] Check for process from within handleEvents --- src/buffered-process.coffee | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/buffered-process.coffee b/src/buffered-process.coffee index 030d952f5..c735509ab 100644 --- a/src/buffered-process.coffee +++ b/src/buffered-process.coffee @@ -74,7 +74,7 @@ class BufferedProcess @spawn(command, args, options) @killed = false - @handleEvents(stdout, stderr, exit) if @process? + @handleEvents(stdout, stderr, exit) ### Section: Event Subscription @@ -192,6 +192,8 @@ class BufferedProcess process.nextTick => @handleError(spawnError) handleEvents: (stdout, stderr, exit) -> + return unless @process? + stdoutClosed = true stderrClosed = true processExited = true From 63bfee1096f47ffdc3329dee0eed6a16d1eaf00f Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 28 Apr 2015 18:35:55 -0700 Subject: [PATCH 081/335] Use the command ivar --- src/buffered-process.coffee | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/buffered-process.coffee b/src/buffered-process.coffee index c735509ab..cfb0d3703 100644 --- a/src/buffered-process.coffee +++ b/src/buffered-process.coffee @@ -48,6 +48,7 @@ class BufferedProcess constructor: ({command, args, options, stdout, stderr, exit}={}) -> @emitter = new Emitter options ?= {} + @command = command # Related to joyent/node#2318 if process.platform is 'win32' # Quote all arguments and escapes inner quotes @@ -232,7 +233,7 @@ class BufferedProcess @emitter.emit 'will-throw-error', {error, handle} if error.code is 'ENOENT' and error.syscall.indexOf('spawn') is 0 - error = new Error("Failed to spawn command `#{command}`. Make sure `#{command}` is installed and on your PATH", error.path) + error = new Error("Failed to spawn command `#{@command}`. Make sure `#{@command}` is installed and on your PATH", error.path) error.name = 'BufferedProcessError' throw error unless handled From c95d6b2c6023d51a0f696f1e81a3ab69cb0cb121 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 28 Apr 2015 18:36:38 -0700 Subject: [PATCH 082/335] Catch wmic spawn errors --- src/buffered-process.coffee | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/buffered-process.coffee b/src/buffered-process.coffee index cfb0d3703..c7097d711 100644 --- a/src/buffered-process.coffee +++ b/src/buffered-process.coffee @@ -139,7 +139,12 @@ class BufferedProcess 'processid' ] - wmicProcess = ChildProcess.spawn(cmd, args) + try + wmicProcess = ChildProcess.spawn(cmd, args) + catch spawnError + @killProcess() + return + wmicProcess.on 'error', -> # ignore errors output = '' wmicProcess.stdout.on 'data', (data) -> output += data From da0c087675db8e5bfd1b66560ba51fdead7d8db1 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 29 Apr 2015 09:43:41 -0700 Subject: [PATCH 083/335] Add BufferedProcess spec for invoking callbacks --- spec/buffered-process-spec.coffee | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/spec/buffered-process-spec.coffee b/spec/buffered-process-spec.coffee index 963460054..04cff0b6d 100644 --- a/spec/buffered-process-spec.coffee +++ b/spec/buffered-process-spec.coffee @@ -96,3 +96,21 @@ describe "BufferedProcess", -> expect(ChildProcess.spawn.argsForCall[0][1][0]).toBe '/s' expect(ChildProcess.spawn.argsForCall[0][1][1]).toBe '/c' expect(ChildProcess.spawn.argsForCall[0][1][2]).toBe '"dir"' + + it "calls the specified stdout, stderr, and exit callbacks ", -> + stdout = '' + stderr = '' + exitCallback = jasmine.createSpy('exit callback') + process = new BufferedProcess + command: atom.packages.getApmPath() + args: ['-h'] + options: {} + stdout: (lines) -> stdout += lines + stderr: (lines) -> stderr += lines + exit: exitCallback + + waitsFor -> exitCallback.callCount is 1 + + runs -> + expect(stderr).toContain 'apm - Atom Package Manager' + expect(stdout).toEqual '' From 37efbe0b3510cfd1391b7e2b0bfd7a036db10af2 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 29 Apr 2015 10:03:28 -0700 Subject: [PATCH 084/335] :arrow_up: language-hyperlink@0.13 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2d9ade0e1..704e735c7 100644 --- a/package.json +++ b/package.json @@ -132,7 +132,7 @@ "language-git": "0.10.0", "language-go": "0.25.0", "language-html": "0.34.0", - "language-hyperlink": "0.12.2", + "language-hyperlink": "0.13.0", "language-java": "0.15.0", "language-javascript": "0.75.0", "language-json": "0.14.0", From be51cc09b37b32b844834a968848af40b4a3aa99 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 29 Apr 2015 14:25:21 -0700 Subject: [PATCH 085/335] :arrow_up: language-javasript@0.76 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 704e735c7..1620601b4 100644 --- a/package.json +++ b/package.json @@ -134,7 +134,7 @@ "language-html": "0.34.0", "language-hyperlink": "0.13.0", "language-java": "0.15.0", - "language-javascript": "0.75.0", + "language-javascript": "0.76.0", "language-json": "0.14.0", "language-less": "0.26.0", "language-make": "0.14.0", From d3ef6c91af8d145de4671a73f5ab9ae6e1316987 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Wed, 29 Apr 2015 15:47:44 -0700 Subject: [PATCH 086/335] Measure gutterWidth, and pass to presenter --- spec/text-editor-presenter-spec.coffee | 11 ++++++----- src/text-editor-component.coffee | 1 + src/text-editor-presenter.coffee | 10 +++++++--- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/spec/text-editor-presenter-spec.coffee b/spec/text-editor-presenter-spec.coffee index 5a50a49a9..8091728a5 100644 --- a/spec/text-editor-presenter-spec.coffee +++ b/spec/text-editor-presenter-spec.coffee @@ -32,6 +32,7 @@ describe "TextEditorPresenter", -> windowWidth: 500 windowHeight: 130 boundingClientRect: {left: 0, top: 0, width: 500, height: 130} + gutterWidth: 0 lineHeight: 10 baseCharacterWidth: 10 horizontalScrollbarHeight: 10 @@ -1628,7 +1629,7 @@ describe "TextEditorPresenter", -> marker = editor.markBufferPosition([0, 26], invalidate: 'never') decoration = editor.decorateMarker(marker, {type: 'overlay', item}) - presenter = buildPresenter({scrollLeft, windowWidth, windowHeight, contentFrameWidth, boundingClientRect}) + presenter = buildPresenter({scrollLeft, windowWidth, windowHeight, contentFrameWidth, boundingClientRect, gutterWidth}) expectStateUpdate presenter, -> presenter.setOverlayDimensions(decoration.id, itemWidth, itemHeight, contentMargin) @@ -1654,7 +1655,7 @@ describe "TextEditorPresenter", -> marker = editor.markBufferPosition([5, 0], invalidate: 'never') decoration = editor.decorateMarker(marker, {type: 'overlay', item}) - presenter = buildPresenter({scrollTop, windowWidth, windowHeight, contentFrameWidth, boundingClientRect}) + presenter = buildPresenter({scrollTop, windowWidth, windowHeight, contentFrameWidth, boundingClientRect, gutterWidth}) expectStateUpdate presenter, -> presenter.setOverlayDimensions(decoration.id, itemWidth, itemHeight, contentMargin) @@ -1682,7 +1683,7 @@ describe "TextEditorPresenter", -> marker = cursor.marker decoration = editor.decorateMarker(marker, {type: 'overlay', item}) - presenter = buildPresenter({windowWidth, windowHeight, contentFrameWidth, boundingClientRect}) + presenter = buildPresenter({windowWidth, windowHeight, contentFrameWidth, boundingClientRect, gutterWidth}) expectStateUpdate presenter, -> presenter.setOverlayDimensions(decoration.id, itemWidth, itemHeight, contentMargin) @@ -1715,7 +1716,7 @@ describe "TextEditorPresenter", -> marker = editor.markBufferPosition([1, 0], invalidate: 'never') decoration = editor.decorateMarker(marker, {type: 'overlay', item}) - presenter = buildPresenter({windowWidth, windowHeight, contentFrameWidth, boundingClientRect}) + presenter = buildPresenter({windowWidth, windowHeight, contentFrameWidth, boundingClientRect, gutterWidth}) expectStateUpdate presenter, -> presenter.setOverlayDimensions(decoration.id, itemWidth, itemHeight, contentMargin) @@ -1736,7 +1737,7 @@ describe "TextEditorPresenter", -> marker = editor.markBufferPosition([0, 0], invalidate: 'never') decoration = editor.decorateMarker(marker, {type: 'overlay', item}) - presenter = buildPresenter({windowWidth, windowHeight, contentFrameWidth, boundingClientRect}) + presenter = buildPresenter({windowWidth, windowHeight, contentFrameWidth, boundingClientRect, gutterWidth}) expectStateUpdate presenter, -> presenter.setOverlayDimensions(decoration.id, itemWidth, itemHeight, contentMargin) diff --git a/src/text-editor-component.coffee b/src/text-editor-component.coffee index e284516fa..84d84cdbf 100644 --- a/src/text-editor-component.coffee +++ b/src/text-editor-component.coffee @@ -619,6 +619,7 @@ class TextEditorComponent if clientWidth > 0 @presenter.setContentFrameWidth(clientWidth) + @presenter.setGutterWidth(@gutterContainerComponent?.getDomNode().offsetWidth ? 0) @presenter.setBoundingClientRect(@hostElement.getBoundingClientRect()) measureWindowSize: -> diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index 55b88f2b8..71bf52e7f 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -13,7 +13,7 @@ class TextEditorPresenter overlayDimensions: {} constructor: (params) -> - {@model, @autoHeight, @explicitHeight, @contentFrameWidth, @scrollTop, @scrollLeft, @boundingClientRect, @windowWidth, @windowHeight} = params + {@model, @autoHeight, @explicitHeight, @contentFrameWidth, @scrollTop, @scrollLeft, @boundingClientRect, @windowWidth, @windowHeight, @gutterWidth} = params {horizontalScrollbarHeight, verticalScrollbarWidth} = params {@lineHeight, @baseCharacterWidth, @lineOverdrawMargin, @backgroundColor, @gutterBackgroundColor} = params {@cursorBlinkPeriod, @cursorBlinkResumeDelay, @stoppedScrollingDelay, @focused} = params @@ -351,10 +351,9 @@ class TextEditorPresenter pixelPosition = @pixelPositionForScreenPosition(screenPosition) {scrollTop, scrollLeft} = @state.content - gutterWidth = @boundingClientRect.width - @contentFrameWidth top = pixelPosition.top + @lineHeight - scrollTop - left = pixelPosition.left + gutterWidth - scrollLeft + left = pixelPosition.left + @gutterWidth - scrollLeft if overlayDimensions = @overlayDimensions[decoration.id] {itemWidth, itemHeight, contentMargin} = overlayDimensions @@ -817,6 +816,11 @@ class TextEditorPresenter @updateCommonGutterState() @updateGutterOrderState() + setGutterWidth: (gutterWidth) -> + if @gutterWidth isnt gutterWidth + @gutterWidth = gutterWidth + @updateOverlaysState() + setLineHeight: (lineHeight) -> unless @lineHeight is lineHeight @lineHeight = lineHeight From 41143c7801d201739eccb49ceac1261e9eab6874 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Wed, 29 Apr 2015 15:54:55 -0700 Subject: [PATCH 087/335] Default `gutterWidth` to 0 in the presenter. --- src/text-editor-presenter.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index 71bf52e7f..6007f1961 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -19,6 +19,7 @@ class TextEditorPresenter {@cursorBlinkPeriod, @cursorBlinkResumeDelay, @stoppedScrollingDelay, @focused} = params @measuredHorizontalScrollbarHeight = horizontalScrollbarHeight @measuredVerticalScrollbarWidth = verticalScrollbarWidth + @gutterWidth ?= 0 @disposables = new CompositeDisposable @emitter = new Emitter From a8283c3c9b4727c7e37eb29eea6ae6a1b3f50a39 Mon Sep 17 00:00:00 2001 From: CaptSaltyJack Date: Tue, 24 Mar 2015 17:50:16 -0700 Subject: [PATCH 088/335] Added delete-to-next/previous-word-boundary This is better behavior for alt-del/backspace operations, is less "greedy" and doesn't eat up excess characters. Also set default key mappings to these, feel free to trash my changes to keymaps/darwin.cson. Though I do feel this should be default behavior, personally. --- keymaps/darwin.cson | 4 +-- menus/darwin.cson | 2 ++ spec/text-editor-spec.coffee | 55 ++++++++++++++++++++++++++++++++++ src/selection.coffee | 22 ++++++++++++++ src/text-editor-element.coffee | 2 ++ src/text-editor.coffee | 8 +++++ 6 files changed, 91 insertions(+), 2 deletions(-) diff --git a/keymaps/darwin.cson b/keymaps/darwin.cson index 34d18e159..c29d9de45 100644 --- a/keymaps/darwin.cson +++ b/keymaps/darwin.cson @@ -119,8 +119,8 @@ 'cmd-right': 'editor:move-to-end-of-screen-line' 'cmd-shift-left': 'editor:select-to-first-character-of-line' 'cmd-shift-right': 'editor:select-to-end-of-line' - 'alt-backspace': 'editor:delete-to-beginning-of-word' - 'alt-delete': 'editor:delete-to-end-of-word' + 'alt-backspace': 'editor:delete-to-previous-word-boundary' + 'alt-delete': 'editor:delete-to-next-word-boundary' 'ctrl-a': 'editor:move-to-first-character-of-line' 'ctrl-e': 'editor:move-to-end-of-line' 'ctrl-k': 'editor:cut-to-end-of-line' diff --git a/menus/darwin.cson b/menus/darwin.cson index f95479d99..17072e14f 100644 --- a/menus/darwin.cson +++ b/menus/darwin.cson @@ -81,6 +81,8 @@ { label: 'Lower Case', command: 'editor:lower-case' } { type: 'separator' } { label: 'Delete to End of Word', command: 'editor:delete-to-end-of-word' } + { label: 'Delete to Previous Word Boundary', command: 'editor:delete-to-previous-word-boundary' } + { label: 'Delete to Next Word Boundary', command: 'editor:delete-to-next-word-boundary' } { label: 'Delete Line', command: 'editor:delete-line' } { type: 'separator' } { label: 'Transpose', command: 'editor:transpose' } diff --git a/spec/text-editor-spec.coffee b/spec/text-editor-spec.coffee index 4e990b914..2c58c6018 100644 --- a/spec/text-editor-spec.coffee +++ b/spec/text-editor-spec.coffee @@ -2343,6 +2343,61 @@ describe "TextEditor", -> editor.backspace() expect(editor.lineTextForBufferRow(0)).toBe 'var = () {' + describe ".deleteToPreviousWordBoundary()", -> + describe "when no text is selected", -> + it "deletes to the previous word boundary", -> + editor.setCursorBufferPosition([0, 16]) + editor.addCursorAtBufferPosition([1, 21]) + [cursor1, cursor2] = editor.getCursors() + + editor.deleteToPreviousWordBoundary() + expect(buffer.lineForRow(1)).toBe 'var quicksort =function () {' + expect(buffer.lineForRow(2)).toBe ' var sort = (items) {' + expect(cursor1.getBufferPosition()).toEqual [0, 15] + expect(cursor2.getBufferPosition()).toEqual [1, 13] + + editor.deleteToPreviousWordBoundary() + expect(buffer.lineForRow(1)).toBe 'var quicksort function () {' + expect(buffer.lineForRow(2)).toBe ' var sort =(items) {' + expect(cursor1.getBufferPosition()).toEqual [0, 14] + expect(cursor2.getBufferPosition()).toEqual [1, 12] + + describe "when text is selected", -> + it "deletes only selected text", -> + editor.setSelectedBufferRange([[1, 24], [1, 27]]) + editor.deleteToEndOfWord() + expect(buffer.lineForRow(1)).toBe ' var sort = function(it) {' + + describe ".deleteToNextWordBoundary()", -> + describe "when no text is selected", -> + it "deletes to the next word boundary", -> + editor.setCursorBufferPosition([0, 15]) + editor.addCursorAtBufferPosition([1, 24]) + [cursor1, cursor2] = editor.getCursors() + + editor.deleteToNextWordBoundary() + expect(buffer.lineForRow(1)).toBe 'var quicksort =function () {' + expect(buffer.lineForRow(2)).toBe ' var sort = function(it) {' + expect(cursor1.getBufferPosition()).toEqual [0, 15] + expect(cursor2.getBufferPosition()).toEqual [1, 24] + + editor.deleteToNextWordBoundary() + expect(buffer.lineForRow(1)).toBe 'var quicksort = () {' + expect(buffer.lineForRow(2)).toBe ' var sort = function(it {' + expect(cursor1.getBufferPosition()).toEqual [1, 24] + + editor.deleteToNextWordBoundary() + expect(buffer.lineForRow(1)).toBe 'var quicksort = () {' + expect(buffer.lineForRow(2)).toBe ' var sort = function(it {' + expect(cursor1.getBufferPosition()).toEqual [1, 24] + expect(cursor2.getBufferPosition()).toEqual [2, 5] + + describe "when text is selected", -> + it "deletes only selected text", -> + editor.setSelectedBufferRange([[1, 24], [1, 27]]) + editor.deleteToEndOfWord() + expect(buffer.lineForRow(1)).toBe ' var sort = function(it) {' + describe ".deleteToBeginningOfWord()", -> describe "when no text is selected", -> it "deletes all text between the cursor and the beginning of the word", -> diff --git a/src/selection.coffee b/src/selection.coffee index f806acf43..658a50b17 100644 --- a/src/selection.coffee +++ b/src/selection.coffee @@ -404,6 +404,28 @@ class Selection extends Model @selectLeft() if @isEmpty() and not @editor.isFoldedAtScreenRow(@cursor.getScreenRow()) @deleteSelectedText() + # Deprecated: Use {::deleteToBeginningOfWord} instead. + backspaceToBeginningOfWord: -> + deprecate("Use Selection::deleteToBeginningOfWord() instead") + @deleteToBeginningOfWord() + + # Deprecated: Use {::deleteToBeginningOfLine} instead. + backspaceToBeginningOfLine: -> + deprecate("Use Selection::deleteToBeginningOfLine() instead") + @deleteToBeginningOfLine() + + # Public: Removes the selection or all characters from the start of the + # selection back to the previous word boundary if nothing is selected. + deleteToPreviousWordBoundary: -> + @selectToPreviousWordBoundary() if @isEmpty() + @deleteSelectedText() + + # Public: Removes the selection or all characters from the start of the + # selection up to the next word boundary if nothing is selected. + deleteToNextWordBoundary: -> + @selectToNextWordBoundary() if @isEmpty() + @deleteSelectedText() + # Public: Removes from the start of the selection to the beginning of the # current word if the selection is empty otherwise it deletes the selection. deleteToBeginningOfWord: -> diff --git a/src/text-editor-element.coffee b/src/text-editor-element.coffee index 95c60f9a0..ab18be8bf 100644 --- a/src/text-editor-element.coffee +++ b/src/text-editor-element.coffee @@ -281,6 +281,8 @@ atom.commands.add 'atom-text-editor', stopEventPropagationAndGroupUndo( 'core:cut': -> @cutSelectedText() 'core:copy': -> @copySelectedText() 'core:paste': -> @pasteText() + 'editor:delete-to-previous-word-boundary': -> @deleteToPreviousWordBoundary() + 'editor:delete-to-next-word-boundary': -> @deleteToNextWordBoundary() 'editor:delete-to-beginning-of-word': -> @deleteToBeginningOfWord() 'editor:delete-to-beginning-of-line': -> @deleteToBeginningOfLine() 'editor:delete-to-end-of-line': -> @deleteToEndOfLine() diff --git a/src/text-editor.coffee b/src/text-editor.coffee index 8241cc8c9..886d628d9 100644 --- a/src/text-editor.coffee +++ b/src/text-editor.coffee @@ -1057,6 +1057,14 @@ class TextEditor extends Model deleteToBeginningOfWord: -> @mutateSelectedText (selection) -> selection.deleteToBeginningOfWord() + # Similar to above, but deletes back to the previous word boundary + deleteToPreviousWordBoundary: -> + @mutateSelectedText (selection) -> selection.deleteToPreviousWordBoundary() + + # Similar to above, but deletes up to the next word boundary + deleteToNextWordBoundary: -> + @mutateSelectedText (selection) -> selection.deleteToNextWordBoundary() + # Extended: For each selection, if the selection is empty, delete all characters # of the containing line that precede the cursor. Otherwise delete the # selected text. From 45d46a726af31ad0355a390c55d59f7cb5c28066 Mon Sep 17 00:00:00 2001 From: CaptSaltyJack Date: Wed, 29 Apr 2015 16:52:09 -0700 Subject: [PATCH 089/335] Added menu items to Linux/Windows --- menus/linux.cson | 2 ++ menus/win32.cson | 2 ++ 2 files changed, 4 insertions(+) diff --git a/menus/linux.cson b/menus/linux.cson index a826ab6b5..9363d02e5 100644 --- a/menus/linux.cson +++ b/menus/linux.cson @@ -55,6 +55,8 @@ { label: '&Lower Case', command: 'editor:lower-case' } { type: 'separator' } { label: 'Delete to End of &Word', command: 'editor:delete-to-end-of-word' } + { label: 'Delete to Previous Word Boundary', command: 'editor:delete-to-previous-word-boundary' } + { label: 'Delete to Next Word Boundary', command: 'editor:delete-to-next-word-boundary' } { label: '&Delete Line', command: 'editor:delete-line' } { type: 'separator' } { label: '&Transpose', command: 'editor:transpose' } diff --git a/menus/win32.cson b/menus/win32.cson index cbefc1e5c..068817888 100644 --- a/menus/win32.cson +++ b/menus/win32.cson @@ -62,6 +62,8 @@ { label: '&Lower Case', command: 'editor:lower-case' } { type: 'separator' } { label: 'Delete to End of &Word', command: 'editor:delete-to-end-of-word' } + { label: 'Delete to Previous Word Boundary', command: 'editor:delete-to-previous-word-boundary' } + { label: 'Delete to Next Word Boundary', command: 'editor:delete-to-next-word-boundary' } { label: '&Delete Line', command: 'editor:delete-line' } { type: 'separator' } { label: '&Transpose', command: 'editor:transpose' } From adb017851be0627b7ffe88d9db5f157a10e2da25 Mon Sep 17 00:00:00 2001 From: CaptSaltyJack Date: Wed, 29 Apr 2015 17:09:32 -0700 Subject: [PATCH 090/335] Fixed glaring mistake in test spec --- spec/text-editor-spec.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/text-editor-spec.coffee b/spec/text-editor-spec.coffee index 2c58c6018..a51ac901d 100644 --- a/spec/text-editor-spec.coffee +++ b/spec/text-editor-spec.coffee @@ -2365,7 +2365,7 @@ describe "TextEditor", -> describe "when text is selected", -> it "deletes only selected text", -> editor.setSelectedBufferRange([[1, 24], [1, 27]]) - editor.deleteToEndOfWord() + editor.deleteToPreviousWordBoundary() expect(buffer.lineForRow(1)).toBe ' var sort = function(it) {' describe ".deleteToNextWordBoundary()", -> @@ -2395,7 +2395,7 @@ describe "TextEditor", -> describe "when text is selected", -> it "deletes only selected text", -> editor.setSelectedBufferRange([[1, 24], [1, 27]]) - editor.deleteToEndOfWord() + editor.deleteToNextWordBoundary() expect(buffer.lineForRow(1)).toBe ' var sort = function(it) {' describe ".deleteToBeginningOfWord()", -> From 15b4cefcf4ee7ec37bda0da08bc0dd391581e2c6 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 29 Apr 2015 17:29:04 -0700 Subject: [PATCH 091/335] :arrow_up: coffeestack@1.1.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1620601b4..3ad9ecc9d 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "clear-cut": "^2.0.1", "coffee-cash": "0.8.0", "coffee-script": "1.8.0", - "coffeestack": "^1.1.1", + "coffeestack": "^1.1.2", "color": "^0.7.3", "delegato": "^1", "emissary": "^1.3.3", From 22c915a8fd9f0c2912d5e0412d66568020a9b88b Mon Sep 17 00:00:00 2001 From: Lee Dohm Date: Wed, 29 Apr 2015 17:52:38 -0700 Subject: [PATCH 092/335] Fix most of the specs --- spec/text-editor-spec.coffee | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/spec/text-editor-spec.coffee b/spec/text-editor-spec.coffee index a51ac901d..7e362a5b2 100644 --- a/spec/text-editor-spec.coffee +++ b/spec/text-editor-spec.coffee @@ -2343,7 +2343,7 @@ describe "TextEditor", -> editor.backspace() expect(editor.lineTextForBufferRow(0)).toBe 'var = () {' - describe ".deleteToPreviousWordBoundary()", -> + fdescribe ".deleteToPreviousWordBoundary()", -> describe "when no text is selected", -> it "deletes to the previous word boundary", -> editor.setCursorBufferPosition([0, 16]) @@ -2351,14 +2351,14 @@ describe "TextEditor", -> [cursor1, cursor2] = editor.getCursors() editor.deleteToPreviousWordBoundary() - expect(buffer.lineForRow(1)).toBe 'var quicksort =function () {' - expect(buffer.lineForRow(2)).toBe ' var sort = (items) {' + expect(buffer.lineForRow(0)).toBe 'var quicksort =function () {' + expect(buffer.lineForRow(1)).toBe ' var sort = (items) {' expect(cursor1.getBufferPosition()).toEqual [0, 15] expect(cursor2.getBufferPosition()).toEqual [1, 13] editor.deleteToPreviousWordBoundary() - expect(buffer.lineForRow(1)).toBe 'var quicksort function () {' - expect(buffer.lineForRow(2)).toBe ' var sort =(items) {' + expect(buffer.lineForRow(0)).toBe 'var quicksort function () {' + expect(buffer.lineForRow(1)).toBe ' var sort =(items) {' expect(cursor1.getBufferPosition()).toEqual [0, 14] expect(cursor2.getBufferPosition()).toEqual [1, 12] @@ -2368,7 +2368,7 @@ describe "TextEditor", -> editor.deleteToPreviousWordBoundary() expect(buffer.lineForRow(1)).toBe ' var sort = function(it) {' - describe ".deleteToNextWordBoundary()", -> + fdescribe ".deleteToNextWordBoundary()", -> describe "when no text is selected", -> it "deletes to the next word boundary", -> editor.setCursorBufferPosition([0, 15]) @@ -2376,21 +2376,22 @@ describe "TextEditor", -> [cursor1, cursor2] = editor.getCursors() editor.deleteToNextWordBoundary() - expect(buffer.lineForRow(1)).toBe 'var quicksort =function () {' - expect(buffer.lineForRow(2)).toBe ' var sort = function(it) {' + expect(buffer.lineForRow(0)).toBe 'var quicksort =function () {' + expect(buffer.lineForRow(1)).toBe ' var sort = function(it) {' expect(cursor1.getBufferPosition()).toEqual [0, 15] expect(cursor2.getBufferPosition()).toEqual [1, 24] editor.deleteToNextWordBoundary() - expect(buffer.lineForRow(1)).toBe 'var quicksort = () {' - expect(buffer.lineForRow(2)).toBe ' var sort = function(it {' - expect(cursor1.getBufferPosition()).toEqual [1, 24] + expect(buffer.lineForRow(0)).toBe 'var quicksort = () {' + expect(buffer.lineForRow(1)).toBe ' var sort = function(it {' + expect(cursor1.getBufferPosition()).toEqual [0, 15] + expect(cursor2.getBufferPosition()).toEqual [1, 24] editor.deleteToNextWordBoundary() - expect(buffer.lineForRow(1)).toBe 'var quicksort = () {' - expect(buffer.lineForRow(2)).toBe ' var sort = function(it {' - expect(cursor1.getBufferPosition()).toEqual [1, 24] - expect(cursor2.getBufferPosition()).toEqual [2, 5] + expect(buffer.lineForRow(0)).toBe 'var quicksort = () {' + expect(buffer.lineForRow(1)).toBe ' var sort = function(it {' + expect(cursor1.getBufferPosition()).toEqual [0, 15] + expect(cursor2.getBufferPosition()).toEqual [1, 24] describe "when text is selected", -> it "deletes only selected text", -> From eda1b743d76bbff29f45e6a27530f0b0649595bc Mon Sep 17 00:00:00 2001 From: Lee Dohm Date: Wed, 29 Apr 2015 18:14:16 -0700 Subject: [PATCH 093/335] Fix spec to expect whitespace to be removed --- spec/text-editor-spec.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/text-editor-spec.coffee b/spec/text-editor-spec.coffee index 7e362a5b2..bf1b9a8c0 100644 --- a/spec/text-editor-spec.coffee +++ b/spec/text-editor-spec.coffee @@ -2388,8 +2388,8 @@ describe "TextEditor", -> expect(cursor2.getBufferPosition()).toEqual [1, 24] editor.deleteToNextWordBoundary() - expect(buffer.lineForRow(0)).toBe 'var quicksort = () {' - expect(buffer.lineForRow(1)).toBe ' var sort = function(it {' + expect(buffer.lineForRow(0)).toBe 'var quicksort =() {' + expect(buffer.lineForRow(1)).toBe ' var sort = function(it{' expect(cursor1.getBufferPosition()).toEqual [0, 15] expect(cursor2.getBufferPosition()).toEqual [1, 24] From be2e3404123b9b309fe3fb090d2df83109a919cc Mon Sep 17 00:00:00 2001 From: Lee Dohm Date: Wed, 29 Apr 2015 18:16:49 -0700 Subject: [PATCH 094/335] Remove focus --- spec/text-editor-spec.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/text-editor-spec.coffee b/spec/text-editor-spec.coffee index bf1b9a8c0..dd6b69f26 100644 --- a/spec/text-editor-spec.coffee +++ b/spec/text-editor-spec.coffee @@ -2343,7 +2343,7 @@ describe "TextEditor", -> editor.backspace() expect(editor.lineTextForBufferRow(0)).toBe 'var = () {' - fdescribe ".deleteToPreviousWordBoundary()", -> + describe ".deleteToPreviousWordBoundary()", -> describe "when no text is selected", -> it "deletes to the previous word boundary", -> editor.setCursorBufferPosition([0, 16]) @@ -2368,7 +2368,7 @@ describe "TextEditor", -> editor.deleteToPreviousWordBoundary() expect(buffer.lineForRow(1)).toBe ' var sort = function(it) {' - fdescribe ".deleteToNextWordBoundary()", -> + describe ".deleteToNextWordBoundary()", -> describe "when no text is selected", -> it "deletes to the next word boundary", -> editor.setCursorBufferPosition([0, 15]) From 70a8b54e50a216bee93004e245dc5a9ee432b5ea Mon Sep 17 00:00:00 2001 From: Lee Dohm Date: Wed, 29 Apr 2015 18:27:09 -0700 Subject: [PATCH 095/335] Delete bad merge artifacts and reword docs --- src/selection.coffee | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/src/selection.coffee b/src/selection.coffee index 658a50b17..6ec874203 100644 --- a/src/selection.coffee +++ b/src/selection.coffee @@ -404,24 +404,16 @@ class Selection extends Model @selectLeft() if @isEmpty() and not @editor.isFoldedAtScreenRow(@cursor.getScreenRow()) @deleteSelectedText() - # Deprecated: Use {::deleteToBeginningOfWord} instead. - backspaceToBeginningOfWord: -> - deprecate("Use Selection::deleteToBeginningOfWord() instead") - @deleteToBeginningOfWord() - - # Deprecated: Use {::deleteToBeginningOfLine} instead. - backspaceToBeginningOfLine: -> - deprecate("Use Selection::deleteToBeginningOfLine() instead") - @deleteToBeginningOfLine() - - # Public: Removes the selection or all characters from the start of the - # selection back to the previous word boundary if nothing is selected. + # Public: Removes the selection or, if nothing is selected, then all + # characters from the start of the selection back to the previous word + # boundary. deleteToPreviousWordBoundary: -> @selectToPreviousWordBoundary() if @isEmpty() @deleteSelectedText() - # Public: Removes the selection or all characters from the start of the - # selection up to the next word boundary if nothing is selected. + # Public: Removes the selection or, if nothing is selected, then all + # characters from the start of the selection up to the next word + # boundary. deleteToNextWordBoundary: -> @selectToNextWordBoundary() if @isEmpty() @deleteSelectedText() From 943897bb7fa379260c4d374e37a23d31c77eb41b Mon Sep 17 00:00:00 2001 From: Lee Dohm Date: Wed, 29 Apr 2015 18:29:57 -0700 Subject: [PATCH 096/335] Revert keymap change --- keymaps/darwin.cson | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keymaps/darwin.cson b/keymaps/darwin.cson index c29d9de45..34d18e159 100644 --- a/keymaps/darwin.cson +++ b/keymaps/darwin.cson @@ -119,8 +119,8 @@ 'cmd-right': 'editor:move-to-end-of-screen-line' 'cmd-shift-left': 'editor:select-to-first-character-of-line' 'cmd-shift-right': 'editor:select-to-end-of-line' - 'alt-backspace': 'editor:delete-to-previous-word-boundary' - 'alt-delete': 'editor:delete-to-next-word-boundary' + 'alt-backspace': 'editor:delete-to-beginning-of-word' + 'alt-delete': 'editor:delete-to-end-of-word' 'ctrl-a': 'editor:move-to-first-character-of-line' 'ctrl-e': 'editor:move-to-end-of-line' 'ctrl-k': 'editor:cut-to-end-of-line' From 08a615eec3cbb10cfb6973eec465cc09f9e2878a Mon Sep 17 00:00:00 2001 From: Lee Dohm Date: Wed, 29 Apr 2015 18:40:16 -0700 Subject: [PATCH 097/335] Fix up docs with Extended tag and rewording --- src/text-editor.coffee | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/text-editor.coffee b/src/text-editor.coffee index 886d628d9..ac7c7d4f2 100644 --- a/src/text-editor.coffee +++ b/src/text-editor.coffee @@ -1057,11 +1057,13 @@ class TextEditor extends Model deleteToBeginningOfWord: -> @mutateSelectedText (selection) -> selection.deleteToBeginningOfWord() - # Similar to above, but deletes back to the previous word boundary + # Extended: Similar to {::deleteToBeginningOfWord}, but deletes only back to the + # previous word boundary. deleteToPreviousWordBoundary: -> @mutateSelectedText (selection) -> selection.deleteToPreviousWordBoundary() - # Similar to above, but deletes up to the next word boundary + # Extended: Similar to {::deleteToEndOfWord}, but deletes only up to the + # next word boundary. deleteToNextWordBoundary: -> @mutateSelectedText (selection) -> selection.deleteToNextWordBoundary() From 363817d7a7a342367af7160cee7181a3f4143c87 Mon Sep 17 00:00:00 2001 From: LEDfan Date: Thu, 30 Apr 2015 14:33:54 +0200 Subject: [PATCH 098/335] NodeJS-devel is required on OpenSUSE --- docs/build-instructions/linux.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/build-instructions/linux.md b/docs/build-instructions/linux.md index 7b95e8a17..4874489ab 100644 --- a/docs/build-instructions/linux.md +++ b/docs/build-instructions/linux.md @@ -38,7 +38,7 @@ Ubuntu LTS 12.04 64-bit is the recommended platform. ### openSUSE -* `sudo zypper install nodejs make gcc gcc-c++ glibc-devel git-core libgnome-keyring-devel rpmdevtools` +* `sudo zypper install nodejs nodejs-devel make gcc gcc-c++ glibc-devel git-core libgnome-keyring-devel rpmdevtools` ## Instructions From e54a2e527593b58cf7ac83b7832d6071a9f49866 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 30 Apr 2015 09:27:07 -0700 Subject: [PATCH 099/335] :arrow_up: language-coffee-script@0.40 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3ad9ecc9d..a7852741f 100644 --- a/package.json +++ b/package.json @@ -125,7 +125,7 @@ "wrap-guide": "0.32.0", "language-c": "0.44.0", "language-clojure": "0.14.0", - "language-coffee-script": "0.39.0", + "language-coffee-script": "0.40.0", "language-csharp": "0.5.0", "language-css": "0.28.0", "language-gfm": "0.70.0", From 8ad9e6faf152146d2bf81f9296306557cf3e26be Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 30 Apr 2015 10:16:53 -0700 Subject: [PATCH 100/335] :arrow_up: fuzzy-finder@0.83 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a7852741f..3037f0724 100644 --- a/package.json +++ b/package.json @@ -96,7 +96,7 @@ "exception-reporting": "0.24.0", "feedback": "0.38.0", "find-and-replace": "0.161.0", - "fuzzy-finder": "0.82.0", + "fuzzy-finder": "0.83.0", "git-diff": "0.55.0", "go-to-line": "0.30.0", "grammar-selector": "0.46.0", From cf1e8c8706380f99761a3973983bb24a3f95d14b Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 30 Apr 2015 10:25:20 -0700 Subject: [PATCH 101/335] :arrow_up: settings-view@0.196 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3037f0724..f48057c33 100644 --- a/package.json +++ b/package.json @@ -110,7 +110,7 @@ "open-on-github": "0.36.0", "package-generator": "0.38.0", "release-notes": "0.52.0", - "settings-view": "0.195.0", + "settings-view": "0.196.0", "snippets": "0.88.0", "spell-check": "0.56.0", "status-bar": "0.69.0", From 4fb58317ec69cd5eda65e0a88315c0ccc088382c Mon Sep 17 00:00:00 2001 From: Machiste Quintana Date: Thu, 30 Apr 2015 13:41:47 -0400 Subject: [PATCH 102/335] :fire: Redundant lines --- spec/workspace-spec.coffee | 2 -- 1 file changed, 2 deletions(-) diff --git a/spec/workspace-spec.coffee b/spec/workspace-spec.coffee index 9b8ce4d50..0b32ff31f 100644 --- a/spec/workspace-spec.coffee +++ b/spec/workspace-spec.coffee @@ -430,7 +430,6 @@ describe "Workspace", -> it "resets the font size to the window's starting font size", -> originalFontSize = atom.config.get('editor.fontSize') - atom.config.set('editor.fontSize', originalFontSize) workspace.increaseFontSize() expect(atom.config.get('editor.fontSize')).toBe originalFontSize + 1 workspace.resetFontSize() @@ -443,7 +442,6 @@ describe "Workspace", -> it "does nothing if the font size has not been changed", -> originalFontSize = atom.config.get('editor.fontSize') - atom.config.set('editor.fontSize', originalFontSize) workspace.resetFontSize() expect(atom.config.get('editor.fontSize')).toBe originalFontSize From 9dfd1ac5aaaea92480e0bbcfdaeaf31ea4a3c7a5 Mon Sep 17 00:00:00 2001 From: Jessica Lord Date: Thu, 30 Apr 2015 11:22:52 -0700 Subject: [PATCH 103/335] Normalize repository short urls --- package.json | 1 + src/package.coffee | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/package.json b/package.json index f48057c33..59a678693 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,7 @@ "fuzzaldrin": "^2.1", "git-utils": "^3.0.0", "grim": "1.4.0", + "hosted-git-info": "^2.1.2", "jasmine-json": "~0.0", "jasmine-tagged": "^1.1.4", "jquery": "^2.1.1", diff --git a/src/package.coffee b/src/package.coffee index b16e76ba0..41b621d02 100644 --- a/src/package.coffee +++ b/src/package.coffee @@ -1,4 +1,5 @@ path = require 'path' +hostedGitInfo = require 'hosted-git-info' _ = require 'underscore-plus' async = require 'async' @@ -24,6 +25,20 @@ class Package @resourcePathWithTrailingSlash ?= "#{atom.packages.resourcePath}#{path.sep}" packagePath?.startsWith(@resourcePathWithTrailingSlash) + @normalizeMetadata: (metadata) -> + if typeof metadata.repository is 'string' + metadata.repository = + type: 'git' + url: metadata.repository + + repoUrl = metadata.repository?.url + if repoUrl + info = hostedGitInfo.fromUrl(repoUrl) + if info.getDefaultRepresentation() is 'shortcut' + metadata.repository.url = info.https().replace(/^git\+/, '') + else + metadata.repository.url = info.toString() + @loadMetadata: (packagePath, ignoreErrors=false) -> packageName = path.basename(packagePath) if @isBundledPackagePath(packagePath) @@ -34,8 +49,10 @@ class Package metadata = CSON.readFileSync(metadataPath) catch error throw error unless ignoreErrors + metadata ?= {} metadata.name = packageName + @normalizeMetadata(metadata) if includeDeprecatedAPIs and metadata.stylesheetMain? deprecate("Use the `mainStyleSheet` key instead of `stylesheetMain` in the `package.json` of `#{packageName}`", {packageName}) From c228c3fcf7d0e5320ff1c9ee00864f756abf9a3c Mon Sep 17 00:00:00 2001 From: Jessica Lord Date: Thu, 30 Apr 2015 11:23:11 -0700 Subject: [PATCH 104/335] Add spec and feature to test normalizing repository short urls --- .../package-with-short-url-package-json/package.json | 4 ++++ spec/package-manager-spec.coffee | 5 +++++ 2 files changed, 9 insertions(+) create mode 100644 spec/fixtures/packages/package-with-short-url-package-json/package.json diff --git a/spec/fixtures/packages/package-with-short-url-package-json/package.json b/spec/fixtures/packages/package-with-short-url-package-json/package.json new file mode 100644 index 000000000..5da40ab08 --- /dev/null +++ b/spec/fixtures/packages/package-with-short-url-package-json/package.json @@ -0,0 +1,4 @@ +{ + "name": "package-with-short-url-package-json", + "repository": "example/repo" +} diff --git a/spec/package-manager-spec.coffee b/spec/package-manager-spec.coffee index 8dcc6bc37..ebdd1f57a 100644 --- a/spec/package-manager-spec.coffee +++ b/spec/package-manager-spec.coffee @@ -41,6 +41,11 @@ describe "PackageManager", -> expect(addErrorHandler.callCount).toBe 1 expect(addErrorHandler.argsForCall[0][0].message).toContain("Failed to load the package-with-broken-package-json package") + it "normalizes short repository urls in package.json", -> + {metadata} = atom.packages.loadPackage("package-with-short-url-package-json") + expect(metadata.repository.type).toBe "git" + expect(metadata.repository.url).toBe "https://github.com/example/repo.git" + it "returns null if the package is not found in any package directory", -> spyOn(console, 'warn') expect(atom.packages.loadPackage("this-package-cannot-be-found")).toBeNull() From df8c462a20a694cea08286a13423b0bd786eb913 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 30 Apr 2015 11:33:49 -0700 Subject: [PATCH 105/335] :arrow_up: apm@0.164 --- apm/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apm/package.json b/apm/package.json index e0656472b..b09eb087a 100644 --- a/apm/package.json +++ b/apm/package.json @@ -6,6 +6,6 @@ "url": "https://github.com/atom/atom.git" }, "dependencies": { - "atom-package-manager": "0.163.0" + "atom-package-manager": "0.164.0" } } From 4771435b84dde0158a0ac5e5ad873d96a1ae17c4 Mon Sep 17 00:00:00 2001 From: Jessica Lord Date: Thu, 30 Apr 2015 11:41:57 -0700 Subject: [PATCH 106/335] Only normalize short urls --- src/package.coffee | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/package.coffee b/src/package.coffee index 41b621d02..05be6c79f 100644 --- a/src/package.coffee +++ b/src/package.coffee @@ -36,8 +36,6 @@ class Package info = hostedGitInfo.fromUrl(repoUrl) if info.getDefaultRepresentation() is 'shortcut' metadata.repository.url = info.https().replace(/^git\+/, '') - else - metadata.repository.url = info.toString() @loadMetadata: (packagePath, ignoreErrors=false) -> packageName = path.basename(packagePath) From d30c1facb95e9001f3147643782263a0b2645a2a Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 30 Apr 2015 12:57:08 -0700 Subject: [PATCH 107/335] Prepare 0.196 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f48057c33..99a9d4bf6 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "atom", "productName": "Atom", - "version": "0.195.0", + "version": "0.196.0", "description": "A hackable text editor for the 21st Century.", "main": "./src/browser/main.js", "repository": { From cf9b00cc8c67b6884487cc9b9bb82c5821fc1922 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 30 Apr 2015 13:36:42 -0700 Subject: [PATCH 108/335] :arrow_down: language-html@0.32 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 99a9d4bf6..0f2eafc81 100644 --- a/package.json +++ b/package.json @@ -131,7 +131,7 @@ "language-gfm": "0.70.0", "language-git": "0.10.0", "language-go": "0.25.0", - "language-html": "0.34.0", + "language-html": "0.32.0", "language-hyperlink": "0.13.0", "language-java": "0.15.0", "language-javascript": "0.76.0", From 1781159470d91e3327062e70ac0ea465e8deb142 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 30 Apr 2015 13:49:21 -0700 Subject: [PATCH 109/335] Prepare 0.197 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0f2eafc81..0ce9d81a2 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "atom", "productName": "Atom", - "version": "0.196.0", + "version": "0.197.0", "description": "A hackable text editor for the 21st Century.", "main": "./src/browser/main.js", "repository": { From afbc353615d1d7b651b3234d9db1ab9d1581c00c Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Thu, 30 Apr 2015 14:46:36 -0700 Subject: [PATCH 110/335] :arrow_up: language-html0.35.0 Closes #6584 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0ce9d81a2..8fd437aee 100644 --- a/package.json +++ b/package.json @@ -131,7 +131,7 @@ "language-gfm": "0.70.0", "language-git": "0.10.0", "language-go": "0.25.0", - "language-html": "0.32.0", + "language-html": "0.35.0", "language-hyperlink": "0.13.0", "language-java": "0.15.0", "language-javascript": "0.76.0", From f8047ba4fc8406aadd82ff5ea37af90db7876f0a Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Thu, 30 Apr 2015 17:50:03 -0700 Subject: [PATCH 111/335] :arrow_up: language-html@0.36.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5e768e844..f451e3510 100644 --- a/package.json +++ b/package.json @@ -132,7 +132,7 @@ "language-gfm": "0.70.0", "language-git": "0.10.0", "language-go": "0.25.0", - "language-html": "0.35.0", + "language-html": "0.36.0", "language-hyperlink": "0.13.0", "language-java": "0.15.0", "language-javascript": "0.76.0", From 725f3d1edf9833e832576c86be383428debc17ad Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Fri, 1 May 2015 11:04:10 -0700 Subject: [PATCH 112/335] :arrow_up: language-gfm@0.71 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f451e3510..1e7d94f27 100644 --- a/package.json +++ b/package.json @@ -129,7 +129,7 @@ "language-coffee-script": "0.40.0", "language-csharp": "0.5.0", "language-css": "0.28.0", - "language-gfm": "0.70.0", + "language-gfm": "0.71.0", "language-git": "0.10.0", "language-go": "0.25.0", "language-html": "0.36.0", From 7ec14b5be5a0d83a8649574befef6c2c354d9a4c Mon Sep 17 00:00:00 2001 From: Jessica Lord Date: Fri, 1 May 2015 11:45:38 -0700 Subject: [PATCH 113/335] Remove completions from Settings --- src/config-schema.coffee | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/config-schema.coffee b/src/config-schema.coffee index f181e0149..548b35fa8 100644 --- a/src/config-schema.coffee +++ b/src/config-schema.coffee @@ -98,9 +98,6 @@ module.exports = type: ['string', 'null'] # These can be used as globals or scoped, thus defaults. - completions: - type: ['array', 'object'] - default: [] fontFamily: type: 'string' default: '' From 81075739d54be33e6f41ff82be3627e787704ff7 Mon Sep 17 00:00:00 2001 From: Jessica Lord Date: Fri, 1 May 2015 13:19:07 -0700 Subject: [PATCH 114/335] Just remove default, leave type --- src/config-schema.coffee | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/config-schema.coffee b/src/config-schema.coffee index 548b35fa8..89d7034ba 100644 --- a/src/config-schema.coffee +++ b/src/config-schema.coffee @@ -98,6 +98,8 @@ module.exports = type: ['string', 'null'] # These can be used as globals or scoped, thus defaults. + completions: + type: ['array', 'object'] fontFamily: type: 'string' default: '' From bc0e5ad4c33c1a72470680b3478715513b6c0b46 Mon Sep 17 00:00:00 2001 From: simurai Date: Sun, 3 May 2015 00:08:03 +0900 Subject: [PATCH 115/335] :arrow_up: one-dark/light-ui@0.8.0 Skipping a version in one-light-ui from 0.6.0 -> 0.8.0 so it matches with the dark version --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 1e7d94f27..36ebaa55a 100644 --- a/package.json +++ b/package.json @@ -77,10 +77,10 @@ "atom-light-ui": "0.41.0", "base16-tomorrow-dark-theme": "0.25.0", "base16-tomorrow-light-theme": "0.8.0", - "one-dark-ui": "0.7.0", + "one-dark-ui": "0.8.0", "one-dark-syntax": "0.4.0", "one-light-syntax": "0.5.0", - "one-light-ui": "0.6.0", + "one-light-ui": "0.8.0", "solarized-dark-syntax": "0.32.0", "solarized-light-syntax": "0.19.0", "archive-view": "0.56.0", From 70bd04f7df37b80a4e622586b3a1ab49c6f61347 Mon Sep 17 00:00:00 2001 From: Ivan Zuzak Date: Mon, 4 May 2015 13:36:18 +0200 Subject: [PATCH 116/335] Allow 0 to be passed as initialLine --- src/browser/atom-application.coffee | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/browser/atom-application.coffee b/src/browser/atom-application.coffee index 178755786..c3e97defb 100644 --- a/src/browser/atom-application.coffee +++ b/src/browser/atom-application.coffee @@ -518,11 +518,11 @@ class AtomApplication [fileToOpen, initialLine, initialColumn] = path.basename(pathToOpen).split(':') return {pathToOpen} unless initialLine - return {pathToOpen} unless parseInt(initialLine) > 0 + return {pathToOpen} unless parseInt(initialLine) >= 0 # Convert line numbers to a base of 0 - initialLine -= 1 if initialLine - initialColumn -= 1 if initialColumn + initialLine = Math.max(0, initialLine - 1) if initialLine + initialColumn = Math.max(0, initialColumn - 1) if initialColumn pathToOpen = path.join(path.dirname(pathToOpen), fileToOpen) {pathToOpen, initialLine, initialColumn} From b12126a628a15a12e38f834a6f9e07e024a71f7a Mon Sep 17 00:00:00 2001 From: Jessica Lord Date: Mon, 4 May 2015 14:16:20 -0700 Subject: [PATCH 117/335] Revert "Just remove default, leave type" This reverts commit 81075739d54be33e6f41ff82be3627e787704ff7. --- src/config-schema.coffee | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/config-schema.coffee b/src/config-schema.coffee index 89d7034ba..548b35fa8 100644 --- a/src/config-schema.coffee +++ b/src/config-schema.coffee @@ -98,8 +98,6 @@ module.exports = type: ['string', 'null'] # These can be used as globals or scoped, thus defaults. - completions: - type: ['array', 'object'] fontFamily: type: 'string' default: '' From 97ad2f30e028eb24320f86390aadb3a4b8bd09d2 Mon Sep 17 00:00:00 2001 From: Jessica Lord Date: Mon, 4 May 2015 15:04:03 -0700 Subject: [PATCH 118/335] normalize all of package.json MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit use different module, catch throws, and still remove the ‘git’ prefix from urls. --- package.json | 2 +- src/package.coffee | 15 ++++----------- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 36ebaa55a..689050b05 100644 --- a/package.json +++ b/package.json @@ -38,13 +38,13 @@ "fuzzaldrin": "^2.1", "git-utils": "^3.0.0", "grim": "1.4.0", - "hosted-git-info": "^2.1.2", "jasmine-json": "~0.0", "jasmine-tagged": "^1.1.4", "jquery": "^2.1.1", "less-cache": "0.22", "marked": "^0.3.3", "mixto": "^1", + "normalize-package-data": "^2.0.0", "nslog": "^2.0.0", "oniguruma": "^4.1", "optimist": "0.4.0", diff --git a/src/package.coffee b/src/package.coffee index 05be6c79f..473b5dc33 100644 --- a/src/package.coffee +++ b/src/package.coffee @@ -1,5 +1,5 @@ path = require 'path' -hostedGitInfo = require 'hosted-git-info' +normalizePackageData = require 'normalize-package-data' _ = require 'underscore-plus' async = require 'async' @@ -27,15 +27,8 @@ class Package @normalizeMetadata: (metadata) -> if typeof metadata.repository is 'string' - metadata.repository = - type: 'git' - url: metadata.repository - - repoUrl = metadata.repository?.url - if repoUrl - info = hostedGitInfo.fromUrl(repoUrl) - if info.getDefaultRepresentation() is 'shortcut' - metadata.repository.url = info.https().replace(/^git\+/, '') + normalizePackageData(metadata) + metadata.repository.url = metadata.repository.url.replace(/^git\+/, '') @loadMetadata: (packagePath, ignoreErrors=false) -> packageName = path.basename(packagePath) @@ -45,12 +38,12 @@ class Package if metadataPath = CSON.resolve(path.join(packagePath, 'package')) try metadata = CSON.readFileSync(metadataPath) + @normalizeMetadata(metadata) catch error throw error unless ignoreErrors metadata ?= {} metadata.name = packageName - @normalizeMetadata(metadata) if includeDeprecatedAPIs and metadata.stylesheetMain? deprecate("Use the `mainStyleSheet` key instead of `stylesheetMain` in the `package.json` of `#{packageName}`", {packageName}) From 3d4a4abd2262350a0e32901b449c03e7d761ed1b Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Mon, 4 May 2015 16:41:48 -0700 Subject: [PATCH 119/335] :arrow_up: snippets@0.89.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 36ebaa55a..54745a3e9 100644 --- a/package.json +++ b/package.json @@ -112,7 +112,7 @@ "package-generator": "0.38.0", "release-notes": "0.52.0", "settings-view": "0.196.0", - "snippets": "0.88.0", + "snippets": "0.89.0", "spell-check": "0.56.0", "status-bar": "0.69.0", "styleguide": "0.44.0", From bc1f190c2f233c84fbaee35574ebd8c4af76e687 Mon Sep 17 00:00:00 2001 From: Jonas Gebhardt Date: Tue, 5 May 2015 11:22:14 -0700 Subject: [PATCH 120/335] remove babel compatibility option for legacy react versions --- src/babel.coffee | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/babel.coffee b/src/babel.coffee index 286ee45ef..7058c85c2 100644 --- a/src/babel.coffee +++ b/src/babel.coffee @@ -32,11 +32,6 @@ defaultOptions = # Target a version of the regenerator runtime that # supports yield so the transpiled code is cleaner/smaller. 'asyncToGenerator' - - # Because Atom is currently packaged with a fork of React v0.11, - # it makes sense to use the reactCompat transform so the React - # JSX transformer produces pre-v0.12 code. - 'reactCompat' ] # Includes support for es7 features listed at: From 5d7161acd76837076d7d9d28883f431693a40588 Mon Sep 17 00:00:00 2001 From: Jessica Lord Date: Tue, 5 May 2015 15:26:29 -0700 Subject: [PATCH 121/335] Don't need to replace now, use module directly --- src/package.coffee | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/package.coffee b/src/package.coffee index 473b5dc33..8c67af2d9 100644 --- a/src/package.coffee +++ b/src/package.coffee @@ -25,11 +25,6 @@ class Package @resourcePathWithTrailingSlash ?= "#{atom.packages.resourcePath}#{path.sep}" packagePath?.startsWith(@resourcePathWithTrailingSlash) - @normalizeMetadata: (metadata) -> - if typeof metadata.repository is 'string' - normalizePackageData(metadata) - metadata.repository.url = metadata.repository.url.replace(/^git\+/, '') - @loadMetadata: (packagePath, ignoreErrors=false) -> packageName = path.basename(packagePath) if @isBundledPackagePath(packagePath) @@ -38,7 +33,7 @@ class Package if metadataPath = CSON.resolve(path.join(packagePath, 'package')) try metadata = CSON.readFileSync(metadataPath) - @normalizeMetadata(metadata) + normalizePackageData(metadata) catch error throw error unless ignoreErrors From e8ca3745b13db049b437470903a51c36918a0538 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Tue, 5 May 2015 15:27:09 -0700 Subject: [PATCH 122/335] :arrow_up: language-css@0.29.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 54745a3e9..26dadd7fc 100644 --- a/package.json +++ b/package.json @@ -128,7 +128,7 @@ "language-clojure": "0.14.0", "language-coffee-script": "0.40.0", "language-csharp": "0.5.0", - "language-css": "0.28.0", + "language-css": "0.29.0", "language-gfm": "0.71.0", "language-git": "0.10.0", "language-go": "0.25.0", From b563eabd7a70eac5a8228c08b764c361cdb5b992 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Tue, 5 May 2015 15:27:24 -0700 Subject: [PATCH 123/335] :arrow_up: language-less@0.27.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 26dadd7fc..95d6460e9 100644 --- a/package.json +++ b/package.json @@ -137,7 +137,7 @@ "language-java": "0.15.0", "language-javascript": "0.76.0", "language-json": "0.14.0", - "language-less": "0.26.0", + "language-less": "0.27.0", "language-make": "0.14.0", "language-mustache": "0.11.0", "language-objective-c": "0.15.0", From 3c6e6e4538466d38d36f7ceac120bba384080192 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Tue, 5 May 2015 15:27:38 -0700 Subject: [PATCH 124/335] :arrow_up: language-sass@0.37.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 95d6460e9..585e1b451 100644 --- a/package.json +++ b/package.json @@ -147,7 +147,7 @@ "language-python": "0.34.0", "language-ruby": "0.52.0", "language-ruby-on-rails": "0.21.0", - "language-sass": "0.36.0", + "language-sass": "0.37.0", "language-shellscript": "0.14.0", "language-source": "0.9.0", "language-sql": "0.15.0", From fc5927a596af05f49ef596882451dbf4f8e6905d Mon Sep 17 00:00:00 2001 From: Jessica Lord Date: Tue, 5 May 2015 16:19:50 -0700 Subject: [PATCH 125/335] :arrow_up: settings-view@0.197.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 585e1b451..5fa296cb4 100644 --- a/package.json +++ b/package.json @@ -111,7 +111,7 @@ "open-on-github": "0.36.0", "package-generator": "0.38.0", "release-notes": "0.52.0", - "settings-view": "0.196.0", + "settings-view": "0.197.0", "snippets": "0.89.0", "spell-check": "0.56.0", "status-bar": "0.69.0", From 8e8e82738806f0aa8b8e0e04b51215181b8a1bc2 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 6 May 2015 09:34:59 -0700 Subject: [PATCH 126/335] :arrow_up: language-javascript@0.77 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 585e1b451..205b6945a 100644 --- a/package.json +++ b/package.json @@ -135,7 +135,7 @@ "language-html": "0.36.0", "language-hyperlink": "0.13.0", "language-java": "0.15.0", - "language-javascript": "0.76.0", + "language-javascript": "0.77.0", "language-json": "0.14.0", "language-less": "0.27.0", "language-make": "0.14.0", From 61a0927b26a33630875382cec1744c7497a72957 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 6 May 2015 09:56:32 -0700 Subject: [PATCH 127/335] Use apiPreviewMode value when running specs --- src/browser/atom-application.coffee | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/browser/atom-application.coffee b/src/browser/atom-application.coffee index 178755786..a825b0d34 100644 --- a/src/browser/atom-application.coffee +++ b/src/browser/atom-application.coffee @@ -87,7 +87,7 @@ class AtomApplication openWithOptions: ({pathsToOpen, urlsToOpen, test, pidToKillWhenClosed, devMode, safeMode, apiPreviewMode, newWindow, specDirectory, logFile, profileStartup}) -> if test - @runSpecs({exitWhenDone: true, @resourcePath, specDirectory, logFile}) + @runSpecs({exitWhenDone: true, @resourcePath, specDirectory, logFile, apiPreviewMode}) else if pathsToOpen.length > 0 @openPaths({pathsToOpen, pidToKillWhenClosed, newWindow, devMode, safeMode, apiPreviewMode, profileStartup}) else if urlsToOpen.length > 0 @@ -486,7 +486,7 @@ class AtomApplication # :specPath - The directory to load specs from. # :safeMode - A Boolean that, if true, won't run specs from ~/.atom/packages # and ~/.atom/dev/packages, defaults to false. - runSpecs: ({exitWhenDone, resourcePath, specDirectory, logFile, safeMode}) -> + runSpecs: ({exitWhenDone, resourcePath, specDirectory, logFile, safeMode, apiPreviewMode}) -> if resourcePath isnt @resourcePath and not fs.existsSync(resourcePath) resourcePath = @resourcePath @@ -498,7 +498,8 @@ class AtomApplication isSpec = true devMode = true safeMode ?= false - new AtomWindow({bootstrapScript, resourcePath, exitWhenDone, isSpec, devMode, specDirectory, logFile, safeMode}) + apiPreviewMode ?= false + new AtomWindow({bootstrapScript, resourcePath, exitWhenDone, isSpec, devMode, specDirectory, logFile, safeMode, apiPreviewMode}) runBenchmarks: ({exitWhenDone, specDirectory}={}) -> try From aa1dbf3c5eea00d9cc0eed12dea9545025f9558a Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 6 May 2015 10:09:55 -0700 Subject: [PATCH 128/335] :arrow_up: apm@0.165 --- apm/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apm/package.json b/apm/package.json index b09eb087a..52f42c0af 100644 --- a/apm/package.json +++ b/apm/package.json @@ -6,6 +6,6 @@ "url": "https://github.com/atom/atom.git" }, "dependencies": { - "atom-package-manager": "0.164.0" + "atom-package-manager": "0.165.0" } } From 11fe07d5d82ecc061bb8872b1388c984fc88bd1d Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 6 May 2015 10:20:10 -0700 Subject: [PATCH 129/335] :arrow_up: symbols-view@0.96 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 205b6945a..542bd7d37 100644 --- a/package.json +++ b/package.json @@ -116,7 +116,7 @@ "spell-check": "0.56.0", "status-bar": "0.69.0", "styleguide": "0.44.0", - "symbols-view": "0.95.0", + "symbols-view": "0.96.0", "tabs": "0.68.0", "timecop": "0.31.0", "tree-view": "0.171.0", From 75289ee3ddce2406bbd64717f100462ae256da9d Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Wed, 6 May 2015 10:29:34 -0700 Subject: [PATCH 130/335] Fix some integration test flakiness --- spec/integration/helpers/start-atom.coffee | 28 +++++++++++++++------- spec/integration/startup-spec.coffee | 2 ++ 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/spec/integration/helpers/start-atom.coffee b/spec/integration/helpers/start-atom.coffee index 0de6644b3..646281171 100644 --- a/spec/integration/helpers/start-atom.coffee +++ b/spec/integration/helpers/start-atom.coffee @@ -15,15 +15,23 @@ ChromedriverPort = 9515 ChromedriverURLBase = "/wd/hub" ChromedriverStatusURL = "http://localhost:#{ChromedriverPort}#{ChromedriverURLBase}/status" -pollChromeDriver = (done) -> +chromeDriverUp = (done) -> checkStatus = -> - http.get(ChromedriverStatusURL, (response) -> - if response.statusCode is 200 - done() - else - pollChromeDriver(done) - ).on("error", -> pollChromeDriver(done)) + http + .get ChromedriverStatusURL, (response) -> + if response.statusCode is 200 + done() + else + chromeDriverUp(done) + .on("error", -> chromeDriverUp(done)) + setTimeout(checkStatus, 100) +chromeDriverDown = (done) -> + checkStatus = -> + http + .get ChromedriverStatusURL, (response) -> + chromeDriverDown(done) + .on("error", done) setTimeout(checkStatus, 100) buildAtomClient = (args, env) -> @@ -137,9 +145,9 @@ module.exports = (args, env, fn) -> chromedriver.stderr.on "close", -> resolve(errorCode) - waitsFor("webdriver to start", pollChromeDriver, 15000) + waitsFor("webdriver to start", chromeDriverUp, 15000) - waitsFor("webdriver to finish", (done) -> + waitsFor("tests to run", (done) -> finish = once -> client .simulateQuit() @@ -162,3 +170,5 @@ module.exports = (args, env, fn) -> fn(client.init()).then(finish) , 30000) + + waitsFor("webdriver to stop", chromeDriverDown, 15000) diff --git a/spec/integration/startup-spec.coffee b/spec/integration/startup-spec.coffee index b20427954..828193e4d 100644 --- a/spec/integration/startup-spec.coffee +++ b/spec/integration/startup-spec.coffee @@ -150,10 +150,12 @@ describe "Starting Atom", -> .waitForWindowCount(2, 10000) .then ({value: windowHandles}) -> @window(windowHandles[0]) + .waitForExist("atom-workspace") .treeViewRootDirectories() .then ({value: directories}) -> windowProjectPaths.push(directories) .window(windowHandles[1]) + .waitForExist("atom-workspace") .treeViewRootDirectories() .then ({value: directories}) -> windowProjectPaths.push(directories) From 4c2f48792910b5b2026ad468395938f3250c81ed Mon Sep 17 00:00:00 2001 From: Jessica Lord Date: Wed, 6 May 2015 11:55:22 -0700 Subject: [PATCH 131/335] :arrow_up: autocomplete@0.45.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5fa296cb4..74d9a7344 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "solarized-dark-syntax": "0.32.0", "solarized-light-syntax": "0.19.0", "archive-view": "0.56.0", - "autocomplete": "0.44.0", + "autocomplete": "0.45.0", "autoflow": "0.22.0", "autosave": "0.20.0", "background-tips": "0.24.0", From 06844ed60a66748802ca7c58c2f3af1d88190926 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Wed, 6 May 2015 13:14:10 -0700 Subject: [PATCH 132/335] :arrow_up: autocomplete@0.46.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 542bd7d37..1b5c01480 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "solarized-dark-syntax": "0.32.0", "solarized-light-syntax": "0.19.0", "archive-view": "0.56.0", - "autocomplete": "0.44.0", + "autocomplete": "0.46.0", "autoflow": "0.22.0", "autosave": "0.20.0", "background-tips": "0.24.0", From 9c34e2273fd4c88fc5882d81f808b35b9782b978 Mon Sep 17 00:00:00 2001 From: Jessica Lord Date: Wed, 6 May 2015 13:14:58 -0700 Subject: [PATCH 133/335] Revert ":arrow_up: autocomplete@0.45.0" This reverts commit 4c2f48792910b5b2026ad468395938f3250c81ed. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 74d9a7344..5fa296cb4 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "solarized-dark-syntax": "0.32.0", "solarized-light-syntax": "0.19.0", "archive-view": "0.56.0", - "autocomplete": "0.45.0", + "autocomplete": "0.44.0", "autoflow": "0.22.0", "autosave": "0.20.0", "background-tips": "0.24.0", From 186448fd530102452dfb627794db2d0b2f6ee0eb Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Wed, 6 May 2015 17:35:53 -0700 Subject: [PATCH 134/335] :arrow_up: notifications --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9d5e66e79..2a43b70c6 100644 --- a/package.json +++ b/package.json @@ -107,7 +107,7 @@ "link": "0.30.0", "markdown-preview": "0.148.0", "metrics": "0.45.0", - "notifications": "0.42.0", + "notifications": "0.43.0", "open-on-github": "0.36.0", "package-generator": "0.38.0", "release-notes": "0.52.0", From b5c130ed18b71de369e5c697231b6f9fc0422c23 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 6 May 2015 18:02:11 -0700 Subject: [PATCH 135/335] :arrow_up: apm@0.166 --- apm/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apm/package.json b/apm/package.json index 52f42c0af..423e31a12 100644 --- a/apm/package.json +++ b/apm/package.json @@ -6,6 +6,6 @@ "url": "https://github.com/atom/atom.git" }, "dependencies": { - "atom-package-manager": "0.165.0" + "atom-package-manager": "0.166.0" } } From a79a8fa60456a0c41d63c517fdff785b0f4f0a0a Mon Sep 17 00:00:00 2001 From: simurai Date: Thu, 7 May 2015 10:18:41 +0900 Subject: [PATCH 136/335] :arrow_up: one-dark/light-ui@0.8.1 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 2a43b70c6..90e15cfcd 100644 --- a/package.json +++ b/package.json @@ -77,10 +77,10 @@ "atom-light-ui": "0.41.0", "base16-tomorrow-dark-theme": "0.25.0", "base16-tomorrow-light-theme": "0.8.0", - "one-dark-ui": "0.8.0", + "one-dark-ui": "0.8.1", "one-dark-syntax": "0.4.0", "one-light-syntax": "0.5.0", - "one-light-ui": "0.8.0", + "one-light-ui": "0.8.1", "solarized-dark-syntax": "0.32.0", "solarized-light-syntax": "0.19.0", "archive-view": "0.56.0", From 4fd114a1b4c589effbe43b37dde55ada172b8c4a Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 May 2015 09:38:09 -0700 Subject: [PATCH 137/335] Prepare 0.198 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 90e15cfcd..65fd5780b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "atom", "productName": "Atom", - "version": "0.197.0", + "version": "0.198.0", "description": "A hackable text editor for the 21st Century.", "main": "./src/browser/main.js", "repository": { From 4f5e9b114d6ecac8762c69ef58bb42fd002670fb Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Thu, 7 May 2015 10:31:21 -0700 Subject: [PATCH 138/335] :arrow_up: language-html@0.37.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 65fd5780b..98bffd420 100644 --- a/package.json +++ b/package.json @@ -132,7 +132,7 @@ "language-gfm": "0.71.0", "language-git": "0.10.0", "language-go": "0.25.0", - "language-html": "0.36.0", + "language-html": "0.37.0", "language-hyperlink": "0.13.0", "language-java": "0.15.0", "language-javascript": "0.77.0", From a2dcdda972ae07566930063a09f9d856982da5b6 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 May 2015 10:58:44 -0700 Subject: [PATCH 139/335] Prepare 0.199 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 98bffd420..f38754551 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "atom", "productName": "Atom", - "version": "0.198.0", + "version": "0.199.0", "description": "A hackable text editor for the 21st Century.", "main": "./src/browser/main.js", "repository": { From edf0d6f2380f9af1dc0ea267b954468e0cc8b7a0 Mon Sep 17 00:00:00 2001 From: Johnston Jiaa Date: Thu, 7 May 2015 14:18:03 -0400 Subject: [PATCH 140/335] :arrow_up: fs-plus@2.8.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f38754551..a62460413 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "emissary": "^1.3.3", "event-kit": "^1.1", "first-mate": "^3.1", - "fs-plus": "^2.7.1", + "fs-plus": "^2.8.0", "fstream": "0.1.24", "fuzzaldrin": "^2.1", "git-utils": "^3.0.0", From 4300ba6bb3155eb4340eb9bda42a5ab171bd24c4 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Thu, 7 May 2015 11:35:16 -0700 Subject: [PATCH 141/335] Make 'atom' command w/ no args reopen previous windows --- src/browser/main.coffee | 1 - 1 file changed, 1 deletion(-) diff --git a/src/browser/main.coffee b/src/browser/main.coffee index e35632104..746055ea4 100644 --- a/src/browser/main.coffee +++ b/src/browser/main.coffee @@ -133,7 +133,6 @@ parseCommandLine = -> safeMode = args['safe'] apiPreviewMode = args['one'] pathsToOpen = args._ - pathsToOpen = [executedFrom] if executedFrom and pathsToOpen.length is 0 test = args['test'] specDirectory = args['spec-directory'] newWindow = args['new-window'] From 5b8262bd96a9889b880bc1b54b72514c6a753f66 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Thu, 7 May 2015 12:56:29 -0700 Subject: [PATCH 142/335] :racehorse: Avoid repeated array allocation in ::getDecorations --- src/display-buffer.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/display-buffer.coffee b/src/display-buffer.coffee index d86fd13be..db39eb432 100644 --- a/src/display-buffer.coffee +++ b/src/display-buffer.coffee @@ -886,7 +886,7 @@ class DisplayBuffer extends Model getDecorations: (propertyFilter) -> allDecorations = [] for markerId, decorations of @decorationsByMarkerId - allDecorations = allDecorations.concat(decorations) if decorations? + allDecorations.push(decorations...) if decorations? if propertyFilter? allDecorations = allDecorations.filter (decoration) -> for key, value of propertyFilter From b7dddeebfe71f710cf495ed7d34e16d4a238df5d Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 May 2015 13:23:14 -0700 Subject: [PATCH 143/335] Guard against no hosted git info Closes #6693 --- .../package-with-invalid-url-package-json/package.json | 4 ++++ spec/package-manager-spec.coffee | 4 ++++ src/package.coffee | 2 +- 3 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 spec/fixtures/packages/package-with-invalid-url-package-json/package.json diff --git a/spec/fixtures/packages/package-with-invalid-url-package-json/package.json b/spec/fixtures/packages/package-with-invalid-url-package-json/package.json new file mode 100644 index 000000000..cc119ffaa --- /dev/null +++ b/spec/fixtures/packages/package-with-invalid-url-package-json/package.json @@ -0,0 +1,4 @@ +{ + "name": "package-with-invalid-url-package-json", + "repository": "foo" +} diff --git a/spec/package-manager-spec.coffee b/spec/package-manager-spec.coffee index ebdd1f57a..92dc21a13 100644 --- a/spec/package-manager-spec.coffee +++ b/spec/package-manager-spec.coffee @@ -46,6 +46,10 @@ describe "PackageManager", -> expect(metadata.repository.type).toBe "git" expect(metadata.repository.url).toBe "https://github.com/example/repo.git" + {metadata} = atom.packages.loadPackage("package-with-invalid-url-package-json") + expect(metadata.repository.type).toBe "git" + expect(metadata.repository.url).toBe "foo" + it "returns null if the package is not found in any package directory", -> spyOn(console, 'warn') expect(atom.packages.loadPackage("this-package-cannot-be-found")).toBeNull() diff --git a/src/package.coffee b/src/package.coffee index 05be6c79f..8f5baf44a 100644 --- a/src/package.coffee +++ b/src/package.coffee @@ -34,7 +34,7 @@ class Package repoUrl = metadata.repository?.url if repoUrl info = hostedGitInfo.fromUrl(repoUrl) - if info.getDefaultRepresentation() is 'shortcut' + if info?.getDefaultRepresentation() is 'shortcut' metadata.repository.url = info.https().replace(/^git\+/, '') @loadMetadata: (packagePath, ignoreErrors=false) -> From db3cd61344e2587410988370eb88ffc3838a4321 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 May 2015 14:35:17 -0700 Subject: [PATCH 144/335] :arrow_up: settings-view@0.198 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a62460413..6a9d42176 100644 --- a/package.json +++ b/package.json @@ -111,7 +111,7 @@ "open-on-github": "0.36.0", "package-generator": "0.38.0", "release-notes": "0.52.0", - "settings-view": "0.197.0", + "settings-view": "0.198.0", "snippets": "0.89.0", "spell-check": "0.56.0", "status-bar": "0.69.0", From 55c0be05f718d57d31a8940a823940f6bf85b75b Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 May 2015 14:35:55 -0700 Subject: [PATCH 145/335] :arrow_up: language-gfm@0.72 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6a9d42176..953c69800 100644 --- a/package.json +++ b/package.json @@ -129,7 +129,7 @@ "language-coffee-script": "0.40.0", "language-csharp": "0.5.0", "language-css": "0.29.0", - "language-gfm": "0.71.0", + "language-gfm": "0.72.0", "language-git": "0.10.0", "language-go": "0.25.0", "language-html": "0.37.0", From 858fc53a0cb52a6ed665bb09ea5017f691b83e05 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Thu, 7 May 2015 15:42:32 -0700 Subject: [PATCH 146/335] :arrow_up: event-kit --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 953c69800..19e5acf9f 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "color": "^0.7.3", "delegato": "^1", "emissary": "^1.3.3", - "event-kit": "^1.1", + "event-kit": "^1.1.1", "first-mate": "^3.1", "fs-plus": "^2.8.0", "fstream": "0.1.24", From 523171061b14620a4b8156be1e687799b31f390f Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 7 May 2015 15:57:58 -0700 Subject: [PATCH 147/335] Stop resize if detached or if siblings are missing Closes #6630 --- spec/pane-container-element-spec.coffee | 22 ++++++++++++++++++++++ src/pane-resize-handle-element.coffee | 4 ++++ 2 files changed, 26 insertions(+) diff --git a/spec/pane-container-element-spec.coffee b/spec/pane-container-element-spec.coffee index 0a5b11b39..400904f5c 100644 --- a/spec/pane-container-element-spec.coffee +++ b/spec/pane-container-element-spec.coffee @@ -132,3 +132,25 @@ describe "PaneContainerElement", -> # dynamically close pane, the pane's flexscale will recorver to origin value lowerPane.close() expectPaneScale [leftPane, 0.5], [rightPane, 1.5] + + it "unsubscribes from mouse events when the pane is detached", -> + container.getActivePane().splitRight() + element = getResizeElement(0) + spyOn(document, 'addEventListener').andCallThrough() + spyOn(document, 'removeEventListener').andCallThrough() + spyOn(element, 'resizeStopped').andCallThrough() + + element.dispatchEvent(new MouseEvent('mousedown', + view: window + bubbles: true + button: 0 + )) + + waitsFor -> + document.addEventListener.callCount is 2 + + runs -> + expect(element.resizeStopped.callCount).toBe 0 + container.destroy() + expect(element.resizeStopped.callCount).toBe 1 + expect(document.removeEventListener.callCount).toBe 2 diff --git a/src/pane-resize-handle-element.coffee b/src/pane-resize-handle-element.coffee index 47548bc60..078bb44ac 100644 --- a/src/pane-resize-handle-element.coffee +++ b/src/pane-resize-handle-element.coffee @@ -12,6 +12,9 @@ class PaneResizeHandleElement extends HTMLElement @isHorizontal = @parentElement.classList.contains("horizontal") @classList.add if @isHorizontal then 'horizontal' else 'vertical' + detachedCallback: -> + @resizeStopped() + resizeToFitContent: -> # clear flex-grow css style of both pane @previousSibling.model.setFlexScale(1) @@ -43,6 +46,7 @@ class PaneResizeHandleElement extends HTMLElement resizePane: ({clientX, clientY, which}) -> return @resizeStopped() unless which is 1 + return @resizeStopped() unless @previousSibling? and @nextSibling? if @isHorizontal totalWidth = @previousSibling.clientWidth + @nextSibling.clientWidth From 5f40ee37fa2d32da7e0d6d11e1d883a71a76f770 Mon Sep 17 00:00:00 2001 From: simurai Date: Fri, 8 May 2015 11:46:57 +0900 Subject: [PATCH 148/335] :arrow_up: atom-dark-syntax@0.27.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 19e5acf9f..ffb6c5259 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "underscore-plus": "^1.6.6" }, "packageDependencies": { - "atom-dark-syntax": "0.26.0", + "atom-dark-syntax": "0.27.0", "atom-dark-ui": "0.49.0", "atom-light-syntax": "0.26.0", "atom-light-ui": "0.41.0", From 14b112cf20e78929cc8f723a9a56d91d1fc4c4ce Mon Sep 17 00:00:00 2001 From: simurai Date: Fri, 8 May 2015 11:48:09 +0900 Subject: [PATCH 149/335] :arrow_up: atom-light-syntax@0.28.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ffb6c5259..78bdd028b 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,7 @@ "packageDependencies": { "atom-dark-syntax": "0.27.0", "atom-dark-ui": "0.49.0", - "atom-light-syntax": "0.26.0", + "atom-light-syntax": "0.28.0", "atom-light-ui": "0.41.0", "base16-tomorrow-dark-theme": "0.25.0", "base16-tomorrow-light-theme": "0.8.0", From bff5c8496313eae3c2dd0f594f9a096364ff5b65 Mon Sep 17 00:00:00 2001 From: simurai Date: Fri, 8 May 2015 11:49:12 +0900 Subject: [PATCH 150/335] :arrow_up: base16-tomorrow-dark-theme@0.26.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 78bdd028b..d5f157c05 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ "atom-dark-ui": "0.49.0", "atom-light-syntax": "0.28.0", "atom-light-ui": "0.41.0", - "base16-tomorrow-dark-theme": "0.25.0", + "base16-tomorrow-dark-theme": "0.26.0", "base16-tomorrow-light-theme": "0.8.0", "one-dark-ui": "0.8.1", "one-dark-syntax": "0.4.0", From 2dde7501572454e7d8ad2bf96868237680b97efc Mon Sep 17 00:00:00 2001 From: simurai Date: Fri, 8 May 2015 11:50:14 +0900 Subject: [PATCH 151/335] :arrow_up: base16-tomorrow-light-theme@0.9.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d5f157c05..588a0163d 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "atom-light-syntax": "0.28.0", "atom-light-ui": "0.41.0", "base16-tomorrow-dark-theme": "0.26.0", - "base16-tomorrow-light-theme": "0.8.0", + "base16-tomorrow-light-theme": "0.9.0", "one-dark-ui": "0.8.1", "one-dark-syntax": "0.4.0", "one-light-syntax": "0.5.0", From 1f5dda1ecd7884c6926d3bcafa37627d524fb23d Mon Sep 17 00:00:00 2001 From: simurai Date: Fri, 8 May 2015 11:51:15 +0900 Subject: [PATCH 152/335] :arrow_up: one-dark-syntax@0.5.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 588a0163d..802c30191 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "base16-tomorrow-dark-theme": "0.26.0", "base16-tomorrow-light-theme": "0.9.0", "one-dark-ui": "0.8.1", - "one-dark-syntax": "0.4.0", + "one-dark-syntax": "0.5.0", "one-light-syntax": "0.5.0", "one-light-ui": "0.8.1", "solarized-dark-syntax": "0.32.0", From 99a30dedf8c9ecde62af49fe44261e0866617bf5 Mon Sep 17 00:00:00 2001 From: simurai Date: Fri, 8 May 2015 11:52:29 +0900 Subject: [PATCH 153/335] :arrow_up: one-light-syntax@0.6.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 802c30191..381fe7038 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "base16-tomorrow-light-theme": "0.9.0", "one-dark-ui": "0.8.1", "one-dark-syntax": "0.5.0", - "one-light-syntax": "0.5.0", + "one-light-syntax": "0.6.0", "one-light-ui": "0.8.1", "solarized-dark-syntax": "0.32.0", "solarized-light-syntax": "0.19.0", From bd33d8d5281f7a99c4613576a29029019ed87aaa Mon Sep 17 00:00:00 2001 From: simurai Date: Fri, 8 May 2015 11:58:26 +0900 Subject: [PATCH 154/335] :arrow_up: solarized-dark-syntax@0.35.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 381fe7038..60a86cfcf 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "one-dark-syntax": "0.5.0", "one-light-syntax": "0.6.0", "one-light-ui": "0.8.1", - "solarized-dark-syntax": "0.32.0", + "solarized-dark-syntax": "0.35.0", "solarized-light-syntax": "0.19.0", "archive-view": "0.56.0", "autocomplete": "0.46.0", From fabfd2a68fbd2a0c3bf8a62b44d1d4317d19d92a Mon Sep 17 00:00:00 2001 From: simurai Date: Fri, 8 May 2015 12:01:24 +0900 Subject: [PATCH 155/335] :arrow_up: solarized-light-syntax@0.21.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 60a86cfcf..144981d45 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "one-light-syntax": "0.6.0", "one-light-ui": "0.8.1", "solarized-dark-syntax": "0.35.0", - "solarized-light-syntax": "0.19.0", + "solarized-light-syntax": "0.21.0", "archive-view": "0.56.0", "autocomplete": "0.46.0", "autoflow": "0.22.0", From 6a7d5e69459cfd6dc14c2d4e25c97353f84c49c9 Mon Sep 17 00:00:00 2001 From: Ivan Zuzak Date: Fri, 8 May 2015 18:05:45 +0200 Subject: [PATCH 156/335] Ignore trailing colons and whitespace when opening files from command line --- src/browser/atom-application.coffee | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/browser/atom-application.coffee b/src/browser/atom-application.coffee index 6f7f0ac4b..8adba81f2 100644 --- a/src/browser/atom-application.coffee +++ b/src/browser/atom-application.coffee @@ -517,6 +517,8 @@ class AtomApplication return {pathToOpen} unless pathToOpen return {pathToOpen} if fs.existsSync(pathToOpen) + pathToOpen = pathToOpen.replace(/[:\s]+$/, '') + [fileToOpen, initialLine, initialColumn] = path.basename(pathToOpen).split(':') return {pathToOpen} unless initialLine return {pathToOpen} unless parseInt(initialLine) >= 0 From 0d310c767f1c9e82d07b410ed342cf7125be6ead Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Fri, 8 May 2015 00:54:31 +0200 Subject: [PATCH 157/335] Splice in new DisplayBuffer lines in chunks to avoid stack overflows --- src/display-buffer.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/display-buffer.coffee b/src/display-buffer.coffee index db39eb432..f4c078b17 100644 --- a/src/display-buffer.coffee +++ b/src/display-buffer.coffee @@ -1120,7 +1120,7 @@ class DisplayBuffer extends Model {screenLines, regions} = @buildScreenLines(startBufferRow, endBufferRow + bufferDelta) screenDelta = screenLines.length - (endScreenRow - startScreenRow) - @screenLines[startScreenRow...endScreenRow] = screenLines + _.spliceWithArray(@screenLines, startScreenRow, endScreenRow - startScreenRow, screenLines, 10000) @rowMap.spliceRegions(startBufferRow, endBufferRow - startBufferRow, regions) @findMaxLineLength(startScreenRow, endScreenRow, screenLines, screenDelta) From c9046a6cfae6e401da39a324d1c2da2578f016a3 Mon Sep 17 00:00:00 2001 From: Jessica Lord Date: Fri, 8 May 2015 11:16:19 -0700 Subject: [PATCH 158/335] Add error message to Jasmine output --- spec/spec-helper.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/spec-helper.coffee b/spec/spec-helper.coffee index 0112042e2..e21876e8d 100644 --- a/spec/spec-helper.coffee +++ b/spec/spec-helper.coffee @@ -311,7 +311,7 @@ window.waitsForPromise = (args...) -> else promise.then(moveOn) promise.catch.call promise, (error) -> - jasmine.getEnv().currentSpec.fail("Expected promise to be resolved, but it was rejected with #{jasmine.pp(error)}") + jasmine.getEnv().currentSpec.fail("Expected promise to be resolved, but it was rejected with: #{error?.message} #{jasmine.pp(error)}") moveOn() window.resetTimeouts = -> From b8cd0a06283f1bac3b2c51b667f6df3d5ae2b37f Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Fri, 8 May 2015 11:19:51 -0700 Subject: [PATCH 159/335] Don't persist dev/safe/api-preview mode settings of windows --- src/browser/atom-application.coffee | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/browser/atom-application.coffee b/src/browser/atom-application.coffee index 6f7f0ac4b..46af91ed0 100644 --- a/src/browser/atom-application.coffee +++ b/src/browser/atom-application.coffee @@ -424,12 +424,7 @@ class AtomApplication for window in @windows if loadSettings = window.getLoadSettings() unless loadSettings.isSpec - states.push(_.pick(loadSettings, - 'initialPaths' - 'devMode' - 'safeMode' - 'apiPreviewMode' - )) + states.push(initialPaths: loadSettings.initialPaths) @storageFolder.store('application.json', states) loadState: -> @@ -438,9 +433,9 @@ class AtomApplication @openWithOptions({ pathsToOpen: state.initialPaths urlsToOpen: [] - devMode: state.devMode - safeMode: state.safeMode - apiPreviewMode: state.apiPreviewMode + devMode: @devMode + safeMode: @safeMode + apiPreviewMode: @apiPreviewMode }) true else From 01221bd4ad248c92818339c02be43def354a0333 Mon Sep 17 00:00:00 2001 From: Jessica Lord Date: Fri, 8 May 2015 11:32:20 -0700 Subject: [PATCH 160/335] Normalize bundled package data Warn if contains incomplete package.json data --- build/tasks/compile-packages-slug-task.coffee | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build/tasks/compile-packages-slug-task.coffee b/build/tasks/compile-packages-slug-task.coffee index a56ed6e18..cf0861462 100644 --- a/build/tasks/compile-packages-slug-task.coffee +++ b/build/tasks/compile-packages-slug-task.coffee @@ -2,6 +2,7 @@ path = require 'path' CSON = require 'season' fs = require 'fs-plus' _ = require 'underscore-plus' +normalizePackageData = require 'normalize-package-data' OtherPlatforms = ['darwin', 'freebsd', 'linux', 'sunos', 'win32'].filter (platform) -> platform isnt process.platform @@ -40,6 +41,8 @@ module.exports = (grunt) -> metadata = grunt.file.readJSON(metadataPath) continue unless metadata?.engines?.atom? + normalizePackageData metadata, (msg) -> console.error(metadata.name, msg) + moduleCache = metadata._atomModuleCache ? {} rm metadataPath From 8f80e1db13ecf6b5c945d92ece3a8805dece88da Mon Sep 17 00:00:00 2001 From: Jessica Lord Date: Fri, 8 May 2015 12:24:43 -0700 Subject: [PATCH 161/335] Only normalize unpublished packages Packages published to APM are normalized already, this catches locally linked/developed packages. --- src/package.coffee | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/package.coffee b/src/package.coffee index 8c67af2d9..664060457 100644 --- a/src/package.coffee +++ b/src/package.coffee @@ -1,5 +1,5 @@ path = require 'path' -normalizePackageData = require 'normalize-package-data' +normalizePackageData = null _ = require 'underscore-plus' async = require 'async' @@ -25,6 +25,11 @@ class Package @resourcePathWithTrailingSlash ?= "#{atom.packages.resourcePath}#{path.sep}" packagePath?.startsWith(@resourcePathWithTrailingSlash) + @normalizeMetadata: (metadata) -> + unless metadata?._id + normalizePackageData ?= require 'normalize-package-data' + normalizePackageData(metadata) + @loadMetadata: (packagePath, ignoreErrors=false) -> packageName = path.basename(packagePath) if @isBundledPackagePath(packagePath) @@ -33,7 +38,7 @@ class Package if metadataPath = CSON.resolve(path.join(packagePath, 'package')) try metadata = CSON.readFileSync(metadataPath) - normalizePackageData(metadata) + @normalizeMetadata(metadata) catch error throw error unless ignoreErrors From 78307d5b9d1b6dc441c8c6254d8703010d5cdcd5 Mon Sep 17 00:00:00 2001 From: Jessica Lord Date: Fri, 8 May 2015 12:26:26 -0700 Subject: [PATCH 162/335] Fail when bundled packages have bad metadata --- build/tasks/compile-packages-slug-task.coffee | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/build/tasks/compile-packages-slug-task.coffee b/build/tasks/compile-packages-slug-task.coffee index cf0861462..102c97053 100644 --- a/build/tasks/compile-packages-slug-task.coffee +++ b/build/tasks/compile-packages-slug-task.coffee @@ -33,6 +33,7 @@ module.exports = (grunt) -> modulesDirectory = path.join(appDir, 'node_modules') packages = {} + invalidPackages = false for moduleDirectory in fs.listSync(modulesDirectory) continue if path.basename(moduleDirectory) is '.bin' @@ -41,7 +42,10 @@ module.exports = (grunt) -> metadata = grunt.file.readJSON(metadataPath) continue unless metadata?.engines?.atom? - normalizePackageData metadata, (msg) -> console.error(metadata.name, msg) + reportPackageError = (msg) -> + invalidPackages = true + grunt.log.error("#{metadata.name}: #{msg}") + normalizePackageData metadata, reportPackageError, true moduleCache = metadata._atomModuleCache ? {} @@ -82,3 +86,4 @@ module.exports = (grunt) -> metadata._atomKeymaps = getKeymaps(appDir) grunt.file.write(path.join(appDir, 'package.json'), JSON.stringify(metadata)) + not invalidPackages From 9a85164090dd84515e4034c0da8560fce5cf48f4 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Fri, 8 May 2015 13:04:42 -0700 Subject: [PATCH 163/335] Add spec for file path with trailing colon/whitespace --- spec/integration/startup-spec.coffee | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/spec/integration/startup-spec.coffee b/spec/integration/startup-spec.coffee index 828193e4d..e0e0e32d1 100644 --- a/spec/integration/startup-spec.coffee +++ b/spec/integration/startup-spec.coffee @@ -41,6 +41,22 @@ describe "Starting Atom", -> .then ({value}) -> expect(value).toBe "Hello!" .dispatchCommand("editor:delete-line") + it "removes all trailing whitespace and colons from the specified path", -> + runAtom [path.join(tempDirPath, "new-file: ")], {ATOM_HOME: atomHome}, (client) -> + client + .waitForWindowCount(1, 1000) + .waitForExist("atom-workspace", 5000) + .waitForPaneItemCount(1, 1000) + + .treeViewRootDirectories() + .then ({value}) -> expect(value).toEqual([tempDirPath]) + + .waitForExist("atom-text-editor", 5000) + .then (exists) -> expect(exists).toBe true + .click("atom-text-editor") + .execute -> atom.workspace.getActiveTextEditor().getPath() + .then ({value}) -> expect(value).toBe path.join(tempDirPath, "new-file") + describe "when there is already a window open", -> it "reuses that window when opening files, but not when opening directories", -> tempFilePath = path.join(temp.mkdirSync("a-third-dir"), "a-file") From 1e567b62e2ca22e4963df237d74b2ab56f679776 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Fri, 8 May 2015 13:23:28 -0700 Subject: [PATCH 164/335] Add spec for opening file to line number --- spec/integration/startup-spec.coffee | 42 +++++++++++++++++++++------- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/spec/integration/startup-spec.coffee b/spec/integration/startup-spec.coffee index e0e0e32d1..94a489021 100644 --- a/spec/integration/startup-spec.coffee +++ b/spec/integration/startup-spec.coffee @@ -1,10 +1,10 @@ # These tests are excluded by default. To run them from the command line: # # ATOM_INTEGRATION_TESTS_ENABLED=true apm test -return unless process.env.ATOM_INTEGRATION_TESTS_ENABLED +# return unless process.env.ATOM_INTEGRATION_TESTS_ENABLED # Integration tests require a fast machine and, for now, we cannot afford to # run them on Travis. -return if process.env.TRAVIS +# return if process.env.TRAVIS fs = require "fs" path = require "path" @@ -41,21 +41,43 @@ describe "Starting Atom", -> .then ({value}) -> expect(value).toBe "Hello!" .dispatchCommand("editor:delete-line") - it "removes all trailing whitespace and colons from the specified path", -> - runAtom [path.join(tempDirPath, "new-file: ")], {ATOM_HOME: atomHome}, (client) -> + it "opens the parent directory and creates an empty text editor", -> + filePath = path.join(fs.realpathSync(tempDirPath), "new-file") + fs.writeFileSync filePath, """ + 1 + 2 + 3 + 4 + """ + + runAtom ["#{filePath}:3"], {ATOM_HOME: atomHome}, (client) -> client .waitForWindowCount(1, 1000) .waitForExist("atom-workspace", 5000) .waitForPaneItemCount(1, 1000) - - .treeViewRootDirectories() - .then ({value}) -> expect(value).toEqual([tempDirPath]) - .waitForExist("atom-text-editor", 5000) .then (exists) -> expect(exists).toBe true - .click("atom-text-editor") + .execute -> atom.workspace.getActiveTextEditor().getPath() - .then ({value}) -> expect(value).toBe path.join(tempDirPath, "new-file") + .then ({value}) -> expect(value).toBe filePath + + .execute -> atom.workspace.getActiveTextEditor().getCursorBufferPosition() + .then ({value}) -> + expect(value.row).toBe 2 + expect(value.column).toBe 0 + + it "removes all trailing whitespace and colons from the specified path", -> + filePath = path.join(tempDirPath, "new-file") + runAtom ["#{filePath}: "], {ATOM_HOME: atomHome}, (client) -> + client + .waitForWindowCount(1, 1000) + .waitForExist("atom-workspace", 5000) + .waitForPaneItemCount(1, 1000) + .waitForExist("atom-text-editor", 5000) + .then (exists) -> expect(exists).toBe true + + .execute -> atom.workspace.getActiveTextEditor().getPath() + .then ({value}) -> expect(value).toBe filePath describe "when there is already a window open", -> it "reuses that window when opening files, but not when opening directories", -> From 75ac785e77647ca64b40eb78743a8681209f924d Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Fri, 8 May 2015 13:24:48 -0700 Subject: [PATCH 165/335] Add spec for opening to line and column --- spec/integration/startup-spec.coffee | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/spec/integration/startup-spec.coffee b/spec/integration/startup-spec.coffee index 94a489021..c2730eaa5 100644 --- a/spec/integration/startup-spec.coffee +++ b/spec/integration/startup-spec.coffee @@ -41,7 +41,7 @@ describe "Starting Atom", -> .then ({value}) -> expect(value).toBe "Hello!" .dispatchCommand("editor:delete-line") - it "opens the parent directory and creates an empty text editor", -> + it "opens the file to the specified line number", -> filePath = path.join(fs.realpathSync(tempDirPath), "new-file") fs.writeFileSync filePath, """ 1 @@ -66,6 +66,31 @@ describe "Starting Atom", -> expect(value.row).toBe 2 expect(value.column).toBe 0 + it "opens the file to the specified line number and column number", -> + filePath = path.join(fs.realpathSync(tempDirPath), "new-file") + fs.writeFileSync filePath, """ + 1 + 2 + 3 + 4 + """ + + runAtom ["#{filePath}:2:2"], {ATOM_HOME: atomHome}, (client) -> + client + .waitForWindowCount(1, 1000) + .waitForExist("atom-workspace", 5000) + .waitForPaneItemCount(1, 1000) + .waitForExist("atom-text-editor", 5000) + .then (exists) -> expect(exists).toBe true + + .execute -> atom.workspace.getActiveTextEditor().getPath() + .then ({value}) -> expect(value).toBe filePath + + .execute -> atom.workspace.getActiveTextEditor().getCursorBufferPosition() + .then ({value}) -> + expect(value.row).toBe 1 + expect(value.column).toBe 1 + it "removes all trailing whitespace and colons from the specified path", -> filePath = path.join(tempDirPath, "new-file") runAtom ["#{filePath}: "], {ATOM_HOME: atomHome}, (client) -> From 02d1e0be563db5d8889b4b754270e1fbf7d24ba9 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Fri, 8 May 2015 13:25:54 -0700 Subject: [PATCH 166/335] Uncomment env conditionals --- spec/integration/startup-spec.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/integration/startup-spec.coffee b/spec/integration/startup-spec.coffee index c2730eaa5..f1c76c04e 100644 --- a/spec/integration/startup-spec.coffee +++ b/spec/integration/startup-spec.coffee @@ -1,10 +1,10 @@ # These tests are excluded by default. To run them from the command line: # # ATOM_INTEGRATION_TESTS_ENABLED=true apm test -# return unless process.env.ATOM_INTEGRATION_TESTS_ENABLED +return unless process.env.ATOM_INTEGRATION_TESTS_ENABLED # Integration tests require a fast machine and, for now, we cannot afford to # run them on Travis. -# return if process.env.TRAVIS +return if process.env.TRAVIS fs = require "fs" path = require "path" From 2c23d6f3ab976042f67ed57a47c975b859c7bdcd Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Fri, 8 May 2015 13:33:30 -0700 Subject: [PATCH 167/335] :art: --- spec/integration/startup-spec.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/integration/startup-spec.coffee b/spec/integration/startup-spec.coffee index f1c76c04e..54817fedc 100644 --- a/spec/integration/startup-spec.coffee +++ b/spec/integration/startup-spec.coffee @@ -9,7 +9,7 @@ return if process.env.TRAVIS fs = require "fs" path = require "path" temp = require("temp").track() -runAtom = require("./helpers/start-atom") +runAtom = require "./helpers/start-atom" describe "Starting Atom", -> [tempDirPath, otherTempDirPath, atomHome] = [] From 29a4ab139671e3c4996f260e83f2e851d7d11c72 Mon Sep 17 00:00:00 2001 From: Ivan Zuzak Date: Sun, 10 May 2015 09:26:46 +0200 Subject: [PATCH 168/335] Electron uses 'Plus' instead of '+' in accelerators --- src/browser/application-menu.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/browser/application-menu.coffee b/src/browser/application-menu.coffee index d88314c89..793d6347f 100644 --- a/src/browser/application-menu.coffee +++ b/src/browser/application-menu.coffee @@ -163,7 +163,7 @@ class ApplicationMenu return null unless firstKeystroke modifiers = firstKeystroke.split('-') - key = modifiers.pop() + key = modifiers.pop().toUpperCase().replace('+', 'Plus') modifiers = modifiers.map (modifier) -> modifier.replace(/shift/ig, "Shift") @@ -171,5 +171,5 @@ class ApplicationMenu .replace(/ctrl/ig, "Ctrl") .replace(/alt/ig, "Alt") - keys = modifiers.concat([key.toUpperCase()]) + keys = modifiers.concat([key]) keys.join("+") From 71fba995405e2940a0ef53f9c4e8169a6c64acb0 Mon Sep 17 00:00:00 2001 From: Ivan Zuzak Date: Sun, 10 May 2015 09:46:45 +0200 Subject: [PATCH 169/335] Dont split keystrokes on trailing dashes --- src/browser/application-menu.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/browser/application-menu.coffee b/src/browser/application-menu.coffee index 793d6347f..a845c682f 100644 --- a/src/browser/application-menu.coffee +++ b/src/browser/application-menu.coffee @@ -162,7 +162,7 @@ class ApplicationMenu firstKeystroke = keystrokesByCommand[command]?[0] return null unless firstKeystroke - modifiers = firstKeystroke.split('-') + modifiers = firstKeystroke.split(/-(?=.)/) key = modifiers.pop().toUpperCase().replace('+', 'Plus') modifiers = modifiers.map (modifier) -> From a64ceadad46ee569dec0df6ed30b64228aabffbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Machist=C3=A9=20N=2E=20Quintana?= Date: Mon, 11 May 2015 07:14:31 -0400 Subject: [PATCH 170/335] Use /usr/bin/env bash in hashbang From https://github.com/atom/apm/issues/282#issuecomment-100289741 --- atom.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/atom.sh b/atom.sh index ecd7da052..236f49ff6 100755 --- a/atom.sh +++ b/atom.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash if [ "$(uname)" == 'Darwin' ]; then OS='Mac' From 80c24f240a1ca9dce9814b04d6e7541f8abb2d5a Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 May 2015 08:44:04 -0700 Subject: [PATCH 171/335] Run package specs in API preview mode --- build/tasks/spec-task.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/tasks/spec-task.coffee b/build/tasks/spec-task.coffee index 2367c9a5f..02ee09878 100644 --- a/build/tasks/spec-task.coffee +++ b/build/tasks/spec-task.coffee @@ -54,14 +54,14 @@ module.exports = (grunt) -> if process.platform in ['darwin', 'linux'] options = cmd: appPath - args: ['--test', "--resource-path=#{resourcePath}", "--spec-directory=#{path.join(packagePath, 'spec')}"] + args: ['--one', '--test', "--resource-path=#{resourcePath}", "--spec-directory=#{path.join(packagePath, 'spec')}"] opts: cwd: packagePath env: _.extend({}, process.env, ATOM_PATH: rootDir) else if process.platform is 'win32' options = cmd: process.env.comspec - args: ['/c', appPath, '--test', "--resource-path=#{resourcePath}", "--spec-directory=#{path.join(packagePath, 'spec')}", "--log-file=ci.log"] + args: ['/c', appPath, '--one', '--test', "--resource-path=#{resourcePath}", "--spec-directory=#{path.join(packagePath, 'spec')}", "--log-file=ci.log"] opts: cwd: packagePath env: _.extend({}, process.env, ATOM_PATH: rootDir) From d46b7c6a369185c1050c320f4093096f51fca77c Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 May 2015 08:49:56 -0700 Subject: [PATCH 172/335] :arrow_up: language-todo@0.20 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 144981d45..512d16ca5 100644 --- a/package.json +++ b/package.json @@ -152,7 +152,7 @@ "language-source": "0.9.0", "language-sql": "0.15.0", "language-text": "0.6.0", - "language-todo": "0.19.0", + "language-todo": "0.20.0", "language-toml": "0.15.0", "language-xml": "0.28.0", "language-yaml": "0.22.0" From ab3be668347709b07c54ec8f6f45fc9feff42a7e Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 May 2015 08:58:04 -0700 Subject: [PATCH 173/335] Remove --one flag from package spec command --- build/tasks/spec-task.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/tasks/spec-task.coffee b/build/tasks/spec-task.coffee index 02ee09878..2367c9a5f 100644 --- a/build/tasks/spec-task.coffee +++ b/build/tasks/spec-task.coffee @@ -54,14 +54,14 @@ module.exports = (grunt) -> if process.platform in ['darwin', 'linux'] options = cmd: appPath - args: ['--one', '--test', "--resource-path=#{resourcePath}", "--spec-directory=#{path.join(packagePath, 'spec')}"] + args: ['--test', "--resource-path=#{resourcePath}", "--spec-directory=#{path.join(packagePath, 'spec')}"] opts: cwd: packagePath env: _.extend({}, process.env, ATOM_PATH: rootDir) else if process.platform is 'win32' options = cmd: process.env.comspec - args: ['/c', appPath, '--one', '--test', "--resource-path=#{resourcePath}", "--spec-directory=#{path.join(packagePath, 'spec')}", "--log-file=ci.log"] + args: ['/c', appPath, '--test', "--resource-path=#{resourcePath}", "--spec-directory=#{path.join(packagePath, 'spec')}", "--log-file=ci.log"] opts: cwd: packagePath env: _.extend({}, process.env, ATOM_PATH: rootDir) From d7021fedce99882402aee5b9e887adf2697c4b64 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 May 2015 09:02:16 -0700 Subject: [PATCH 174/335] :arrow_up: language-go@0.26 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 512d16ca5..f4dd352f7 100644 --- a/package.json +++ b/package.json @@ -131,7 +131,7 @@ "language-css": "0.29.0", "language-gfm": "0.72.0", "language-git": "0.10.0", - "language-go": "0.25.0", + "language-go": "0.26.0", "language-html": "0.37.0", "language-hyperlink": "0.13.0", "language-java": "0.15.0", From 6d833b53a164674b43e62b391903050dc13faf72 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 May 2015 09:15:37 -0700 Subject: [PATCH 175/335] :arrow_up: status-bar@0.70 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f4dd352f7..5babfcdc4 100644 --- a/package.json +++ b/package.json @@ -114,7 +114,7 @@ "settings-view": "0.198.0", "snippets": "0.89.0", "spell-check": "0.56.0", - "status-bar": "0.69.0", + "status-bar": "0.70.0", "styleguide": "0.44.0", "symbols-view": "0.96.0", "tabs": "0.68.0", From c68af1b6d494f4c4f7349a5ace4308c9531aff8b Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 May 2015 09:19:53 -0700 Subject: [PATCH 176/335] :arrow_up: status-bar@0.71 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5babfcdc4..748de2f3e 100644 --- a/package.json +++ b/package.json @@ -114,7 +114,7 @@ "settings-view": "0.198.0", "snippets": "0.89.0", "spell-check": "0.56.0", - "status-bar": "0.70.0", + "status-bar": "0.71.0", "styleguide": "0.44.0", "symbols-view": "0.96.0", "tabs": "0.68.0", From 44723401eb1de00813b6f3d3bdb158e7b9f93f65 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 May 2015 09:35:06 -0700 Subject: [PATCH 177/335] :arrow_up: language-sass@0.38 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 748de2f3e..66a237bef 100644 --- a/package.json +++ b/package.json @@ -147,7 +147,7 @@ "language-python": "0.34.0", "language-ruby": "0.52.0", "language-ruby-on-rails": "0.21.0", - "language-sass": "0.37.0", + "language-sass": "0.38.0", "language-shellscript": "0.14.0", "language-source": "0.9.0", "language-sql": "0.15.0", From 7f4240bf96667f2ae5067326866d53ea69d209f4 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 May 2015 10:18:49 -0700 Subject: [PATCH 178/335] :arrow_up: wrap-guide@0.33 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 66a237bef..553ce9576 100644 --- a/package.json +++ b/package.json @@ -123,7 +123,7 @@ "update-package-dependencies": "0.9.0", "welcome": "0.27.0", "whitespace": "0.29.0", - "wrap-guide": "0.32.0", + "wrap-guide": "0.33.0", "language-c": "0.44.0", "language-clojure": "0.14.0", "language-coffee-script": "0.40.0", From d7c4986d2491b0f470d505c59e21ffe9f6452fe9 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 May 2015 11:19:20 -0700 Subject: [PATCH 179/335] :arrow_up: deprecation-cop@0.44 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 553ce9576..a3eb53322 100644 --- a/package.json +++ b/package.json @@ -91,7 +91,7 @@ "bookmarks": "0.35.0", "bracket-matcher": "0.74.0", "command-palette": "0.35.0", - "deprecation-cop": "0.43.0", + "deprecation-cop": "0.44.0", "dev-live-reload": "0.46.0", "encoding-selector": "0.20.0", "exception-reporting": "0.24.0", From 6b7a6538f2ef9954b19815094a2a68fb35dcce0d Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 May 2015 11:19:43 -0700 Subject: [PATCH 180/335] :arrow_up: deprecation-cop@0.45 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a3eb53322..efde6d87b 100644 --- a/package.json +++ b/package.json @@ -91,7 +91,7 @@ "bookmarks": "0.35.0", "bracket-matcher": "0.74.0", "command-palette": "0.35.0", - "deprecation-cop": "0.44.0", + "deprecation-cop": "0.45.0", "dev-live-reload": "0.46.0", "encoding-selector": "0.20.0", "exception-reporting": "0.24.0", From 34b10c2eb8430f9bc66e98c82072cf7441e9f548 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 May 2015 11:27:10 -0700 Subject: [PATCH 181/335] :arrow_up: language-perl@0.24 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index efde6d87b..8b5d82b59 100644 --- a/package.json +++ b/package.json @@ -141,7 +141,7 @@ "language-make": "0.14.0", "language-mustache": "0.11.0", "language-objective-c": "0.15.0", - "language-perl": "0.23.0", + "language-perl": "0.24.0", "language-php": "0.22.0", "language-property-list": "0.8.0", "language-python": "0.34.0", From cbf32acd471b5041286d7c32aa0a6abc5d01bb60 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 May 2015 14:43:53 -0700 Subject: [PATCH 182/335] Don't pack spellchecker into asar archive --- build/tasks/generate-asar-task.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/build/tasks/generate-asar-task.coffee b/build/tasks/generate-asar-task.coffee index a71d88dfe..3de5f73b6 100644 --- a/build/tasks/generate-asar-task.coffee +++ b/build/tasks/generate-asar-task.coffee @@ -14,6 +14,7 @@ module.exports = (grunt) -> 'ctags-darwin' 'ctags-linux' 'ctags-win32.exe' + '**/node_modules/spellchecker/**' ] unpack = "{#{unpack.join(',')}}" From f0ee01964983757b4024549235795ef6e86335e1 Mon Sep 17 00:00:00 2001 From: Jessica Lord Date: Mon, 11 May 2015 15:02:54 -0700 Subject: [PATCH 183/335] :bump_up: language-toml@0.16.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8b5d82b59..d876683f2 100644 --- a/package.json +++ b/package.json @@ -153,7 +153,7 @@ "language-sql": "0.15.0", "language-text": "0.6.0", "language-todo": "0.20.0", - "language-toml": "0.15.0", + "language-toml": "0.16.0", "language-xml": "0.28.0", "language-yaml": "0.22.0" }, From 24d08c0c3ce8f92e1b550fd10d717d4be4784c5f Mon Sep 17 00:00:00 2001 From: Jessica Lord Date: Mon, 11 May 2015 15:06:32 -0700 Subject: [PATCH 184/335] :bump_up: spell-check@0.57.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d876683f2..ed8a224f3 100644 --- a/package.json +++ b/package.json @@ -113,7 +113,7 @@ "release-notes": "0.52.0", "settings-view": "0.198.0", "snippets": "0.89.0", - "spell-check": "0.56.0", + "spell-check": "0.57.0", "status-bar": "0.71.0", "styleguide": "0.44.0", "symbols-view": "0.96.0", From c856aea60b86ee1eacb05d31a712ee0cc43f8e53 Mon Sep 17 00:00:00 2001 From: Jessica Lord Date: Mon, 11 May 2015 15:29:01 -0700 Subject: [PATCH 185/335] :arrow_up: archive-view@0.57.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ed8a224f3..de826e197 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,7 @@ "one-light-ui": "0.8.1", "solarized-dark-syntax": "0.35.0", "solarized-light-syntax": "0.21.0", - "archive-view": "0.56.0", + "archive-view": "0.57.0", "autocomplete": "0.46.0", "autoflow": "0.22.0", "autosave": "0.20.0", From 9377bf59e097733e8c1e9ca0343ee9c857f02013 Mon Sep 17 00:00:00 2001 From: Jessica Lord Date: Mon, 11 May 2015 15:30:40 -0700 Subject: [PATCH 186/335] :arrow_up: autocomplete@0.47.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index de826e197..74de2bd21 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "solarized-dark-syntax": "0.35.0", "solarized-light-syntax": "0.21.0", "archive-view": "0.57.0", - "autocomplete": "0.46.0", + "autocomplete": "0.47.0", "autoflow": "0.22.0", "autosave": "0.20.0", "background-tips": "0.24.0", From 8e8ebbe898b358b33ee3d538fb57a1630a41a531 Mon Sep 17 00:00:00 2001 From: Jessica Lord Date: Mon, 11 May 2015 15:31:51 -0700 Subject: [PATCH 187/335] :arrow_up: autoflow@0.23.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 74de2bd21..b56bed38b 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,7 @@ "solarized-light-syntax": "0.21.0", "archive-view": "0.57.0", "autocomplete": "0.47.0", - "autoflow": "0.22.0", + "autoflow": "0.23.0", "autosave": "0.20.0", "background-tips": "0.24.0", "bookmarks": "0.35.0", From 88995fe7b093bb70e4a758b6e8f92516dfd15ec6 Mon Sep 17 00:00:00 2001 From: Jessica Lord Date: Mon, 11 May 2015 15:32:58 -0700 Subject: [PATCH 188/335] :bump_up: language-gfm@0.73.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b56bed38b..fab691218 100644 --- a/package.json +++ b/package.json @@ -129,7 +129,7 @@ "language-coffee-script": "0.40.0", "language-csharp": "0.5.0", "language-css": "0.29.0", - "language-gfm": "0.72.0", + "language-gfm": "0.73.0", "language-git": "0.10.0", "language-go": "0.26.0", "language-html": "0.37.0", From 3e73eadb6c88527b785d789673236d37ecc9d5a4 Mon Sep 17 00:00:00 2001 From: Jessica Lord Date: Mon, 11 May 2015 16:08:44 -0700 Subject: [PATCH 189/335] Correct semver by adding 3rd digit --- .../package-with-incompatible-native-module/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/fixtures/packages/package-with-incompatible-native-module/package.json b/spec/fixtures/packages/package-with-incompatible-native-module/package.json index eec67175a..857bc7221 100644 --- a/spec/fixtures/packages/package-with-incompatible-native-module/package.json +++ b/spec/fixtures/packages/package-with-incompatible-native-module/package.json @@ -1,5 +1,5 @@ { "name": "package-with-incompatible-native-module", - "version": "1.0", + "version": "1.0.0", "main": "./main.js" } From 9b767528278ad769996afcd323a5b93f637789c6 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 May 2015 17:18:07 -0700 Subject: [PATCH 190/335] :arrow_up: spell-check@0.57 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8b5d82b59..ecaa97285 100644 --- a/package.json +++ b/package.json @@ -113,7 +113,7 @@ "release-notes": "0.52.0", "settings-view": "0.198.0", "snippets": "0.89.0", - "spell-check": "0.56.0", + "spell-check": "0.57.0", "status-bar": "0.71.0", "styleguide": "0.44.0", "symbols-view": "0.96.0", From fa4312d37ccbde7482a24a97cc69fd31617adb9b Mon Sep 17 00:00:00 2001 From: Jessica Lord Date: Mon, 11 May 2015 18:03:21 -0700 Subject: [PATCH 191/335] :arrow_up: grammar-selector@0.47.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fab691218..ddc175b71 100644 --- a/package.json +++ b/package.json @@ -100,7 +100,7 @@ "fuzzy-finder": "0.83.0", "git-diff": "0.55.0", "go-to-line": "0.30.0", - "grammar-selector": "0.46.0", + "grammar-selector": "0.47.0", "image-view": "0.54.0", "incompatible-packages": "0.24.0", "keybinding-resolver": "0.32.0", From 250670be23b589c01bec26fc1eff79ee1c0ba23d Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 May 2015 17:58:46 -0700 Subject: [PATCH 192/335] Guard against missing tooltip data --- src/tooltip-manager.coffee | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/tooltip-manager.coffee b/src/tooltip-manager.coffee index afde69db9..ee2054b5a 100644 --- a/src/tooltip-manager.coffee +++ b/src/tooltip-manager.coffee @@ -87,8 +87,9 @@ class TooltipManager new Disposable -> tooltip = $target.data('bs.tooltip') - tooltip.leave(currentTarget: target) - tooltip.hide() + if tooltip? + tooltip.leave(currentTarget: target) + tooltip.hide() $target.tooltip('destroy') humanizeKeystrokes = (keystroke) -> From 209ed2fe13ef49a4f7ab4fef815b8a6bb725c4fc Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 May 2015 18:17:37 -0700 Subject: [PATCH 193/335] Stop shipping the feedback package --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index ddc175b71..361f98eed 100644 --- a/package.json +++ b/package.json @@ -95,7 +95,6 @@ "dev-live-reload": "0.46.0", "encoding-selector": "0.20.0", "exception-reporting": "0.24.0", - "feedback": "0.38.0", "find-and-replace": "0.161.0", "fuzzy-finder": "0.83.0", "git-diff": "0.55.0", From ccc6b170896d525a357fe2742fca9d698b94dd3f Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 May 2015 18:19:46 -0700 Subject: [PATCH 194/335] :arrow_up: spell-check@0.58 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 361f98eed..26ed4da96 100644 --- a/package.json +++ b/package.json @@ -112,7 +112,7 @@ "release-notes": "0.52.0", "settings-view": "0.198.0", "snippets": "0.89.0", - "spell-check": "0.57.0", + "spell-check": "0.58.0", "status-bar": "0.71.0", "styleguide": "0.44.0", "symbols-view": "0.96.0", From b2dd8835b3359148d980ef208a02d86ba92a9cce Mon Sep 17 00:00:00 2001 From: Ivan Zuzak Date: Tue, 12 May 2015 12:54:15 +0200 Subject: [PATCH 195/335] Remove extra function wrapper --- src/decoration.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/decoration.coffee b/src/decoration.coffee index ca239421e..bc3a21748 100644 --- a/src/decoration.coffee +++ b/src/decoration.coffee @@ -201,6 +201,6 @@ if Grim.includeDeprecatedAPIs Grim.deprecate 'Use Decoration::getProperties instead' @getProperties() - Decoration::update = -> (newProperties) -> + Decoration::update = (newProperties) -> Grim.deprecate 'Use Decoration::setProperties instead' @setProperties(newProperties) From fbeae41f436a4dbe58ee7a85ac31be4e72a8ae16 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 May 2015 08:32:23 -0700 Subject: [PATCH 196/335] :arrow_up: deprecation-cop@0.46 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 26ed4da96..42e7edb3e 100644 --- a/package.json +++ b/package.json @@ -91,7 +91,7 @@ "bookmarks": "0.35.0", "bracket-matcher": "0.74.0", "command-palette": "0.35.0", - "deprecation-cop": "0.45.0", + "deprecation-cop": "0.46.0", "dev-live-reload": "0.46.0", "encoding-selector": "0.20.0", "exception-reporting": "0.24.0", From bbc212674ade7f93feaf99fd6727c181d37640a0 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 May 2015 08:37:33 -0700 Subject: [PATCH 197/335] :arrow_up: settings-view@0.199 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 42e7edb3e..7ef2568dc 100644 --- a/package.json +++ b/package.json @@ -110,7 +110,7 @@ "open-on-github": "0.36.0", "package-generator": "0.38.0", "release-notes": "0.52.0", - "settings-view": "0.198.0", + "settings-view": "0.199.0", "snippets": "0.89.0", "spell-check": "0.58.0", "status-bar": "0.71.0", From 0fe9de25a6568139056edc321ca0a2426da8d88e Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 May 2015 08:46:47 -0700 Subject: [PATCH 198/335] :arrow_up: package-generator@0.39 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7ef2568dc..4f1c9f0c0 100644 --- a/package.json +++ b/package.json @@ -108,7 +108,7 @@ "metrics": "0.45.0", "notifications": "0.43.0", "open-on-github": "0.36.0", - "package-generator": "0.38.0", + "package-generator": "0.39.0", "release-notes": "0.52.0", "settings-view": "0.199.0", "snippets": "0.89.0", From 9fccb0dc427d1fdfe4d5c2bd82b90c6e3e3012c1 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 May 2015 08:47:42 -0700 Subject: [PATCH 199/335] Run core package specs in 1.0 API preview mode --- build/tasks/spec-task.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/tasks/spec-task.coffee b/build/tasks/spec-task.coffee index 2367c9a5f..a3c9bbe79 100644 --- a/build/tasks/spec-task.coffee +++ b/build/tasks/spec-task.coffee @@ -54,14 +54,14 @@ module.exports = (grunt) -> if process.platform in ['darwin', 'linux'] options = cmd: appPath - args: ['--test', "--resource-path=#{resourcePath}", "--spec-directory=#{path.join(packagePath, 'spec')}"] + args: ['--test', "--resource-path=#{resourcePath}", "--spec-directory=#{path.join(packagePath, 'spec')}", '--one'] opts: cwd: packagePath env: _.extend({}, process.env, ATOM_PATH: rootDir) else if process.platform is 'win32' options = cmd: process.env.comspec - args: ['/c', appPath, '--test', "--resource-path=#{resourcePath}", "--spec-directory=#{path.join(packagePath, 'spec')}", "--log-file=ci.log"] + args: ['/c', appPath, '--test', "--resource-path=#{resourcePath}", "--spec-directory=#{path.join(packagePath, 'spec')}", "--log-file=ci.log", '--one'] opts: cwd: packagePath env: _.extend({}, process.env, ATOM_PATH: rootDir) From 4b9718f5cf719a847666cd5e6c8480dad1a2d393 Mon Sep 17 00:00:00 2001 From: Jessica Lord Date: Tue, 12 May 2015 11:54:39 -0700 Subject: [PATCH 200/335] Remove 'git+' prefix --- build/tasks/compile-packages-slug-task.coffee | 1 + src/package.coffee | 2 ++ 2 files changed, 3 insertions(+) diff --git a/build/tasks/compile-packages-slug-task.coffee b/build/tasks/compile-packages-slug-task.coffee index 102c97053..0cf7347ec 100644 --- a/build/tasks/compile-packages-slug-task.coffee +++ b/build/tasks/compile-packages-slug-task.coffee @@ -46,6 +46,7 @@ module.exports = (grunt) -> invalidPackages = true grunt.log.error("#{metadata.name}: #{msg}") normalizePackageData metadata, reportPackageError, true + metadata.repository.url ?= metadata.repository.url?.replace(/^git\+/, '') moduleCache = metadata._atomModuleCache ? {} diff --git a/src/package.coffee b/src/package.coffee index 664060457..02749f5a6 100644 --- a/src/package.coffee +++ b/src/package.coffee @@ -29,6 +29,8 @@ class Package unless metadata?._id normalizePackageData ?= require 'normalize-package-data' normalizePackageData(metadata) + metadata.repository.url = metadata.repository.url.replace(/^git\+/, '') + metadata @loadMetadata: (packagePath, ignoreErrors=false) -> packageName = path.basename(packagePath) From d7aa2fc2c452a587c84a117a65223b9e02b75d9c Mon Sep 17 00:00:00 2001 From: Jessica Lord Date: Tue, 12 May 2015 12:13:14 -0700 Subject: [PATCH 201/335] Only remove 'git+' if 'git' type matches --- build/tasks/compile-packages-slug-task.coffee | 3 ++- src/package.coffee | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/build/tasks/compile-packages-slug-task.coffee b/build/tasks/compile-packages-slug-task.coffee index 0cf7347ec..715012db6 100644 --- a/build/tasks/compile-packages-slug-task.coffee +++ b/build/tasks/compile-packages-slug-task.coffee @@ -46,7 +46,8 @@ module.exports = (grunt) -> invalidPackages = true grunt.log.error("#{metadata.name}: #{msg}") normalizePackageData metadata, reportPackageError, true - metadata.repository.url ?= metadata.repository.url?.replace(/^git\+/, '') + if metadata.repository.type is 'git' + metadata.repository.url ?= metadata.repository.url?.replace(/^git\+/, '') moduleCache = metadata._atomModuleCache ? {} diff --git a/src/package.coffee b/src/package.coffee index 02749f5a6..78b19bed6 100644 --- a/src/package.coffee +++ b/src/package.coffee @@ -29,7 +29,8 @@ class Package unless metadata?._id normalizePackageData ?= require 'normalize-package-data' normalizePackageData(metadata) - metadata.repository.url = metadata.repository.url.replace(/^git\+/, '') + if metadata.repository.type is 'git' + metadata.repository.url = metadata.repository.url.replace(/^git\+/, '') metadata @loadMetadata: (packagePath, ignoreErrors=false) -> From c9d12bc130e608fc716a67909f059823fab42bf1 Mon Sep 17 00:00:00 2001 From: Jessica Lord Date: Tue, 12 May 2015 12:33:30 -0700 Subject: [PATCH 202/335] Remove `?` --- build/tasks/compile-packages-slug-task.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/tasks/compile-packages-slug-task.coffee b/build/tasks/compile-packages-slug-task.coffee index 715012db6..75b9206c0 100644 --- a/build/tasks/compile-packages-slug-task.coffee +++ b/build/tasks/compile-packages-slug-task.coffee @@ -47,7 +47,7 @@ module.exports = (grunt) -> grunt.log.error("#{metadata.name}: #{msg}") normalizePackageData metadata, reportPackageError, true if metadata.repository.type is 'git' - metadata.repository.url ?= metadata.repository.url?.replace(/^git\+/, '') + metadata.repository.url = metadata.repository.url?.replace(/^git\+/, '') moduleCache = metadata._atomModuleCache ? {} From d03153fab5cf5eab4c42cde02a1c5e7b1554ea12 Mon Sep 17 00:00:00 2001 From: Jessica Lord Date: Tue, 12 May 2015 12:58:50 -0700 Subject: [PATCH 203/335] No spaces in package.json name --- .../package-with-empty-activation-commands/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/fixtures/packages/package-with-empty-activation-commands/package.json b/spec/fixtures/packages/package-with-empty-activation-commands/package.json index 8b58333ab..8102a5af3 100644 --- a/spec/fixtures/packages/package-with-empty-activation-commands/package.json +++ b/spec/fixtures/packages/package-with-empty-activation-commands/package.json @@ -1,5 +1,5 @@ { - "name": "no events", + "name": "noevents", "version": "0.1.0", "activationCommands": {"atom-workspace": []} } From e64c6dfd2f54846edc416e18d3278f20ed5ee9b1 Mon Sep 17 00:00:00 2001 From: Jessica Lord Date: Tue, 12 May 2015 15:00:40 -0700 Subject: [PATCH 204/335] Check for repository, log error (temp) --- src/package.coffee | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/package.coffee b/src/package.coffee index 78b19bed6..bf36b9d72 100644 --- a/src/package.coffee +++ b/src/package.coffee @@ -29,7 +29,7 @@ class Package unless metadata?._id normalizePackageData ?= require 'normalize-package-data' normalizePackageData(metadata) - if metadata.repository.type is 'git' + if metadata.repository?.type is 'git' metadata.repository.url = metadata.repository.url.replace(/^git\+/, '') metadata @@ -43,6 +43,7 @@ class Package metadata = CSON.readFileSync(metadataPath) @normalizeMetadata(metadata) catch error + console.log("Thew Error", metadata.name, error) throw error unless ignoreErrors metadata ?= {} From e8a20bb6b0a8619c1417d780669d3d107b5cf1f9 Mon Sep 17 00:00:00 2001 From: Jessica Lord Date: Tue, 12 May 2015 15:15:35 -0700 Subject: [PATCH 205/335] Check for repository data --- build/tasks/compile-packages-slug-task.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/tasks/compile-packages-slug-task.coffee b/build/tasks/compile-packages-slug-task.coffee index 75b9206c0..d0ed51fd6 100644 --- a/build/tasks/compile-packages-slug-task.coffee +++ b/build/tasks/compile-packages-slug-task.coffee @@ -46,7 +46,7 @@ module.exports = (grunt) -> invalidPackages = true grunt.log.error("#{metadata.name}: #{msg}") normalizePackageData metadata, reportPackageError, true - if metadata.repository.type is 'git' + if metadata.repository?.type is 'git' metadata.repository.url = metadata.repository.url?.replace(/^git\+/, '') moduleCache = metadata._atomModuleCache ? {} From 8a89054545ab52d67ba82dfea75e37c3ef54ad07 Mon Sep 17 00:00:00 2001 From: Jessica Lord Date: Tue, 12 May 2015 15:16:15 -0700 Subject: [PATCH 206/335] Fixture name to match fixture dir --- .../package-with-empty-activation-commands/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/fixtures/packages/package-with-empty-activation-commands/package.json b/spec/fixtures/packages/package-with-empty-activation-commands/package.json index 8102a5af3..d00fa8404 100644 --- a/spec/fixtures/packages/package-with-empty-activation-commands/package.json +++ b/spec/fixtures/packages/package-with-empty-activation-commands/package.json @@ -1,5 +1,5 @@ { - "name": "noevents", + "name": "package-with-consumed-services", "version": "0.1.0", "activationCommands": {"atom-workspace": []} } From b8c0c661eade13ca0ff179e74b002e837d52c33f Mon Sep 17 00:00:00 2001 From: Jessica Lord Date: Tue, 12 May 2015 16:57:50 -0700 Subject: [PATCH 207/335] Correct package name, remove log --- .../package-with-empty-activation-commands/package.json | 2 +- src/package.coffee | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/spec/fixtures/packages/package-with-empty-activation-commands/package.json b/spec/fixtures/packages/package-with-empty-activation-commands/package.json index d00fa8404..46741f3e3 100644 --- a/spec/fixtures/packages/package-with-empty-activation-commands/package.json +++ b/spec/fixtures/packages/package-with-empty-activation-commands/package.json @@ -1,5 +1,5 @@ { - "name": "package-with-consumed-services", + "name": "package-with-empty-activation-commands", "version": "0.1.0", "activationCommands": {"atom-workspace": []} } diff --git a/src/package.coffee b/src/package.coffee index bf36b9d72..7578ce66e 100644 --- a/src/package.coffee +++ b/src/package.coffee @@ -43,7 +43,6 @@ class Package metadata = CSON.readFileSync(metadataPath) @normalizeMetadata(metadata) catch error - console.log("Thew Error", metadata.name, error) throw error unless ignoreErrors metadata ?= {} From 3dbff720f2b36e7db881ff1e6974ddf0334acba4 Mon Sep 17 00:00:00 2001 From: Jessica Lord Date: Tue, 12 May 2015 16:59:27 -0700 Subject: [PATCH 208/335] Check for url before replacing --- src/package.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/package.coffee b/src/package.coffee index 7578ce66e..95f769e49 100644 --- a/src/package.coffee +++ b/src/package.coffee @@ -30,7 +30,7 @@ class Package normalizePackageData ?= require 'normalize-package-data' normalizePackageData(metadata) if metadata.repository?.type is 'git' - metadata.repository.url = metadata.repository.url.replace(/^git\+/, '') + metadata.repository.url = metadata.repository.url?.replace(/^git\+/, '') metadata @loadMetadata: (packagePath, ignoreErrors=false) -> From 3081e840304e43d19d1bd815cc38887dc84f9827 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 May 2015 17:31:50 -0700 Subject: [PATCH 209/335] :arrow_up: apm@0.167 --- apm/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apm/package.json b/apm/package.json index 423e31a12..1dce7e90b 100644 --- a/apm/package.json +++ b/apm/package.json @@ -6,6 +6,6 @@ "url": "https://github.com/atom/atom.git" }, "dependencies": { - "atom-package-manager": "0.166.0" + "atom-package-manager": "0.167.0" } } From 6f5e7cdd5c6dfd10e5d8ce740e9587f90c33fd2f Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Tue, 12 May 2015 18:02:17 -0700 Subject: [PATCH 210/335] :arrow_up: find-and-replace --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4f1c9f0c0..56f8bf7c5 100644 --- a/package.json +++ b/package.json @@ -95,7 +95,7 @@ "dev-live-reload": "0.46.0", "encoding-selector": "0.20.0", "exception-reporting": "0.24.0", - "find-and-replace": "0.161.0", + "find-and-replace": "0.162.0", "fuzzy-finder": "0.83.0", "git-diff": "0.55.0", "go-to-line": "0.30.0", From 34a3ee1be9ed5d35d61a51a4d31524a567558e1e Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Tue, 12 May 2015 16:57:02 -0700 Subject: [PATCH 211/335] :arrow_up: text-buffer --- package.json | 2 +- spec/text-editor-component-spec.coffee | 6 ++--- src/display-buffer.coffee | 31 +++++--------------------- src/marker.coffee | 12 ---------- 4 files changed, 10 insertions(+), 41 deletions(-) diff --git a/package.json b/package.json index 56f8bf7c5..3c10667d3 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "space-pen": "3.8.2", "stacktrace-parser": "0.1.1", "temp": "0.8.1", - "text-buffer": "^5.2", + "text-buffer": "6.0.0-beta.1", "theorist": "^1.0.2", "typescript-simple": "1.0.0", "underscore-plus": "^1.6.6" diff --git a/spec/text-editor-component-spec.coffee b/spec/text-editor-component-spec.coffee index a89bee1fc..12d189035 100644 --- a/spec/text-editor-component-spec.coffee +++ b/spec/text-editor-component-spec.coffee @@ -2266,13 +2266,13 @@ describe "TextEditorComponent", -> editor.setText("") componentNode.dispatchEvent(buildTextInputEvent(data: 'x', target: inputNode)) - currentTime += 99 + currentTime += 100 componentNode.dispatchEvent(buildTextInputEvent(data: 'y', target: inputNode)) - currentTime += 99 + currentTime += 100 componentNode.dispatchEvent(new CustomEvent('editor:duplicate-lines', bubbles: true, cancelable: true)) - currentTime += 100 + currentTime += 101 componentNode.dispatchEvent(new CustomEvent('editor:duplicate-lines', bubbles: true, cancelable: true)) expect(editor.getText()).toBe "xy\nxy\nxy" diff --git a/src/display-buffer.coffee b/src/display-buffer.coffee index f4c078b17..bca978cac 100644 --- a/src/display-buffer.coffee +++ b/src/display-buffer.coffee @@ -39,7 +39,6 @@ class DisplayBuffer extends Model @decorationsByMarkerId = {} @disposables.add @tokenizedBuffer.observeGrammar @subscribeToScopedConfigSettings @disposables.add @tokenizedBuffer.onDidChange @handleTokenizedBufferChange - @disposables.add @buffer.onDidUpdateMarkers @handleBufferMarkersUpdated @disposables.add @buffer.onDidCreateMarker @handleBufferMarkerCreated @updateAllScreenLines() @createFoldForMarker(marker) for marker in @buffer.findMarkers(@getFoldMarkerAttributes()) @@ -153,12 +152,12 @@ class DisplayBuffer extends Model @emitter.on 'did-update-markers', callback emitDidChange: (eventProperties, refreshMarkers=true) -> - if refreshMarkers - @pauseMarkerChangeEvents() - @refreshMarkerScreenPositions() @emit 'changed', eventProperties if Grim.includeDeprecatedAPIs @emitter.emit 'did-change', eventProperties - @resumeMarkerChangeEvents() + if refreshMarkers + @refreshMarkerScreenPositions() + @emit 'markers-updated' if Grim.includeDeprecatedAPIs + @emitter.emit 'did-update-markers' updateWrappedScreenLines: -> start = 0 @@ -1078,15 +1077,6 @@ class DisplayBuffer extends Model getFoldMarkerAttributes: (attributes={}) -> _.extend(attributes, class: 'fold', displayBufferId: @id) - pauseMarkerChangeEvents: -> - marker.pauseChangeEvents() for marker in @getMarkers() - return - - resumeMarkerChangeEvents: -> - marker.resumeChangeEvents() for marker in @getMarkers() - @emit 'markers-updated' if Grim.includeDeprecatedAPIs - @emitter.emit 'did-update-markers' - refreshMarkerScreenPositions: -> for marker in @getMarkers() marker.notifyObservers(textChanged: false) @@ -1109,7 +1099,7 @@ class DisplayBuffer extends Model handleTokenizedBufferChange: (tokenizedBufferChange) => {start, end, delta, bufferChange} = tokenizedBufferChange - @updateScreenLines(start, end + 1, delta, delayChangeEvent: bufferChange?) + @updateScreenLines(start, end + 1, delta, refreshMarkers: false) @setScrollTop(Math.min(@getScrollTop(), @getMaxScrollTop())) if delta < 0 updateScreenLines: (startBufferRow, endBufferRow, bufferDelta=0, options={}) -> @@ -1132,11 +1122,7 @@ class DisplayBuffer extends Model screenDelta: screenDelta bufferDelta: bufferDelta - if options.delayChangeEvent - @pauseMarkerChangeEvents() - @pendingChangeEvent = changeEvent - else - @emitDidChange(changeEvent, options.refreshMarkers) + @emitDidChange(changeEvent, options.refreshMarkers) buildScreenLines: (startBufferRow, endBufferRow) -> screenLines = [] @@ -1216,11 +1202,6 @@ class DisplayBuffer extends Model @scrollWidth += 1 unless @isSoftWrapped() @setScrollLeft(Math.min(@getScrollLeft(), @getMaxScrollLeft())) - handleBufferMarkersUpdated: => - if event = @pendingChangeEvent - @pendingChangeEvent = null - @emitDidChange(event, false) - handleBufferMarkerCreated: (textBufferMarker) => @createFoldForMarker(textBufferMarker) if textBufferMarker.matchesParams(@getFoldMarkerAttributes()) if marker = @getMarker(textBufferMarker.id) diff --git a/src/marker.coffee b/src/marker.coffee index 5d1e35570..813ca78e5 100644 --- a/src/marker.coffee +++ b/src/marker.coffee @@ -359,18 +359,6 @@ class Marker @oldTailScreenPosition = newTailScreenPosition @wasValid = isValid - pauseChangeEvents: -> - @deferredChangeEvents = [] - - resumeChangeEvents: -> - if deferredChangeEvents = @deferredChangeEvents - @deferredChangeEvents = null - - for event in deferredChangeEvents - @emit 'changed', event if Grim.includeDeprecatedAPIs - @emitter.emit 'did-change', event - return - getPixelRange: -> @displayBuffer.pixelRangeForScreenRange(@getScreenRange(), false) From e780925b989d81f7eca865b7c66b6301c50641ee Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Tue, 12 May 2015 18:03:26 -0700 Subject: [PATCH 212/335] :arrow_up: text-buffer --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3c10667d3..75921a02b 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "space-pen": "3.8.2", "stacktrace-parser": "0.1.1", "temp": "0.8.1", - "text-buffer": "6.0.0-beta.1", + "text-buffer": "6.0.0-beta.2", "theorist": "^1.0.2", "typescript-simple": "1.0.0", "underscore-plus": "^1.6.6" From ff91be791a60ebfd37c4a870630ea11b92e12b8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Machist=C3=A9=20N=2E=20Quintana?= Date: Wed, 13 May 2015 11:24:54 -0400 Subject: [PATCH 213/335] :arrow_up: fuzzy-finder@0.84.0 Adds fuzzy match character highlighting --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 56f8bf7c5..e2b294546 100644 --- a/package.json +++ b/package.json @@ -96,7 +96,7 @@ "encoding-selector": "0.20.0", "exception-reporting": "0.24.0", "find-and-replace": "0.162.0", - "fuzzy-finder": "0.83.0", + "fuzzy-finder": "0.84.0", "git-diff": "0.55.0", "go-to-line": "0.30.0", "grammar-selector": "0.47.0", From e455acec5e07062b7f4a68132458fe827e28b00a Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 13 May 2015 08:56:12 -0700 Subject: [PATCH 214/335] :arrow_up: language-gfm@0.74 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 56f8bf7c5..020fd2f2e 100644 --- a/package.json +++ b/package.json @@ -128,7 +128,7 @@ "language-coffee-script": "0.40.0", "language-csharp": "0.5.0", "language-css": "0.29.0", - "language-gfm": "0.73.0", + "language-gfm": "0.74.0", "language-git": "0.10.0", "language-go": "0.26.0", "language-html": "0.37.0", From 4b2e23508f0267fdb8d4af002359d6819e980582 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Fri, 8 May 2015 16:02:01 -0700 Subject: [PATCH 215/335] Add autocomplete-plus into core :tada: --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 020fd2f2e..eeaeed69c 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "solarized-dark-syntax": "0.35.0", "solarized-light-syntax": "0.21.0", "archive-view": "0.57.0", - "autocomplete": "0.47.0", + "autocomplete-plus": "2.13.1", "autoflow": "0.23.0", "autosave": "0.20.0", "background-tips": "0.24.0", From da646e635c170fe3eb18903ad8b14d0036eb035e Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Fri, 8 May 2015 16:02:34 -0700 Subject: [PATCH 216/335] Uninstall any intalled version of autocomplete-plus --- src/package-manager.coffee | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/package-manager.coffee b/src/package-manager.coffee index 8527188d3..1692d477a 100644 --- a/src/package-manager.coffee +++ b/src/package-manager.coffee @@ -303,6 +303,9 @@ class PackageManager # of the first package isn't skewed by being the first to require atom require '../exports/atom' + # TODO: remove after a few atom versions. + @uninstallAutocompletePlus() + packagePaths = @getAvailablePackagePaths() packagePaths = packagePaths.filter (packagePath) => not @isPackageDisabled(path.basename(packagePath)) packagePaths = _.uniq packagePaths, (packagePath) -> path.basename(packagePath) @@ -409,6 +412,18 @@ class PackageManager message = "Failed to load the #{path.basename(packagePath)} package" atom.notifications.addError(message, {stack, detail, dismissable: true}) + # TODO: remove these autocomplete-plus specific helpers after a few versions. + uninstallAutocompletePlus: -> + packageDir = null + devDir = path.join("dev", "packages") + for packageDirPath in @packageDirPaths + packageDir = packageDirPath if not packageDirPath.endsWith(devDir) + + if packageDir? + autocompletePlusPath = path.join(packageDir, 'autocomplete-plus') + fs.isDirectory autocompletePlusPath, (isDir, error) -> + fs.unlink(autocompletePlusPath) if isDir + if Grim.includeDeprecatedAPIs EmitterMixin = require('emissary').Emitter EmitterMixin.includeInto(PackageManager) From 1d9d9f1cf597fc598e22544b0e7a2cc1dd1d5e8b Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Mon, 11 May 2015 15:24:57 -0700 Subject: [PATCH 217/335] Handle deleting autocomplete-plus when symlink and dir --- src/package-manager.coffee | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/package-manager.coffee b/src/package-manager.coffee index 1692d477a..7ee1304c2 100644 --- a/src/package-manager.coffee +++ b/src/package-manager.coffee @@ -421,8 +421,10 @@ class PackageManager if packageDir? autocompletePlusPath = path.join(packageDir, 'autocomplete-plus') - fs.isDirectory autocompletePlusPath, (isDir, error) -> - fs.unlink(autocompletePlusPath) if isDir + if fs.isSymbolicLinkSync(autocompletePlusPath) + fs.unlink(autocompletePlusPath) + else if fs.isDirectorySync(autocompletePlusPath) + fs.remove(autocompletePlusPath, ->) if Grim.includeDeprecatedAPIs EmitterMixin = require('emissary').Emitter From 044c2ec37c33621933b9e1e32bdd5db8d68b46a4 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Mon, 11 May 2015 16:21:17 -0700 Subject: [PATCH 218/335] Bundle autocomplete-css, html and atom-api --- package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/package.json b/package.json index eeaeed69c..07cf9ac55 100644 --- a/package.json +++ b/package.json @@ -84,6 +84,9 @@ "solarized-dark-syntax": "0.35.0", "solarized-light-syntax": "0.21.0", "archive-view": "0.57.0", + "autocomplete-atom-api": "0.9.0", + "autocomplete-css": "0.7.2", + "autocomplete-html": "0.7.1", "autocomplete-plus": "2.13.1", "autoflow": "0.23.0", "autosave": "0.20.0", From e7d921bfbc93b6e05c77d766130d64a165e5e83f Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Mon, 11 May 2015 16:21:35 -0700 Subject: [PATCH 219/335] Add specs for autocomplete deletion --- spec/package-manager-spec.coffee | 33 ++++++++++++++++++++++++++++++++ spec/spec-helper.coffee | 2 ++ 2 files changed, 35 insertions(+) diff --git a/spec/package-manager-spec.coffee b/spec/package-manager-spec.coffee index 92dc21a13..00b05c102 100644 --- a/spec/package-manager-spec.coffee +++ b/spec/package-manager-spec.coffee @@ -824,3 +824,36 @@ describe "PackageManager", -> expect(atom.config.get('core.themes')).not.toContain packageName expect(atom.config.get('core.themes')).not.toContain packageName expect(atom.config.get('core.disabledPackages')).not.toContain packageName + + describe "deleting non-bundled autocomplete packages", -> + [autocompleteCSSPath, autocompletePlusPath] = [] + fs = require 'fs-plus' + path = require 'path' + + beforeEach -> + fixturePath = path.resolve(__dirname, './fixtures/packages') + autocompleteCSSPath = path.join(fixturePath, 'autocomplete-css') + autocompletePlusPath = path.join(fixturePath, 'autocomplete-plus') + + try + fs.mkdirSync(autocompleteCSSPath) + fs.writeFileSync(path.join(autocompleteCSSPath, 'package.json'), '{}') + fs.symlinkSync(path.join(fixturePath, 'package-with-main'), autocompletePlusPath, 'dir') + catch e + ; + + expect(fs.isDirectorySync(autocompleteCSSPath)).toBe true + expect(fs.isSymbolicLinkSync(autocompletePlusPath)).toBe true + + jasmine.unspy(atom.packages, 'uninstallAutocompletePlus') + + it "removes the packages", -> + atom.packages.loadPackages() + + waitsFor -> + not fs.isDirectorySync(autocompleteCSSPath) and + not fs.isSymbolicLinkSync(autocompletePlusPath) + + runs -> + expect(fs.isDirectorySync(autocompleteCSSPath)).toBe false + expect(fs.isSymbolicLinkSync(autocompletePlusPath)).toBe false diff --git a/spec/spec-helper.coffee b/spec/spec-helper.coffee index 0112042e2..2e4355a10 100644 --- a/spec/spec-helper.coffee +++ b/spec/spec-helper.coffee @@ -140,6 +140,8 @@ beforeEach -> spyOn(clipboard, 'writeText').andCallFake (text) -> clipboardContent = text spyOn(clipboard, 'readText').andCallFake -> clipboardContent + spyOn(atom.packages, 'uninstallAutocompletePlus') + addCustomMatchers(this) afterEach -> From b83b9bab074f5628f41513a0f11bf0c1d33be7cb Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Mon, 11 May 2015 16:21:51 -0700 Subject: [PATCH 220/335] Handle deleting multiple directories --- src/package-manager.coffee | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/src/package-manager.coffee b/src/package-manager.coffee index 7ee1304c2..60a6f7f20 100644 --- a/src/package-manager.coffee +++ b/src/package-manager.coffee @@ -417,14 +417,35 @@ class PackageManager packageDir = null devDir = path.join("dev", "packages") for packageDirPath in @packageDirPaths - packageDir = packageDirPath if not packageDirPath.endsWith(devDir) + if not packageDirPath.endsWith(devDir) + packageDir = packageDirPath + break if packageDir? - autocompletePlusPath = path.join(packageDir, 'autocomplete-plus') - if fs.isSymbolicLinkSync(autocompletePlusPath) - fs.unlink(autocompletePlusPath) - else if fs.isDirectorySync(autocompletePlusPath) - fs.remove(autocompletePlusPath, ->) + dirsToRemove = [ + path.join(packageDir, 'autocomplete-plus') + path.join(packageDir, 'autocomplete-atom-api') + path.join(packageDir, 'autocomplete-css') + path.join(packageDir, 'autocomplete-html') + ] + for dirToRemove in dirsToRemove + @uninstallDirectory(dirToRemove) + return + + uninstallDirectory: (directory) -> + symlinkPromise = new Promise (resolve) -> + fs.isSymbolicLink directory, (isSymLink) -> resolve(isSymLink) + + dirPromise = new Promise (resolve) -> + fs.isDirectory directory, (isDir) -> resolve(isDir) + + Promise.all([symlinkPromise, dirPromise]).then (values) -> + [isSymLink, isDir] = values + console.log directory, isSymLink, isDir + if isSymLink + fs.unlink(directory) + else if isDir + fs.remove(directory, ->) if Grim.includeDeprecatedAPIs EmitterMixin = require('emissary').Emitter From c571e3da0caeb43c2192450af44a502681378394 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Mon, 11 May 2015 16:25:23 -0700 Subject: [PATCH 221/335] Remove log line --- src/package-manager.coffee | 1 - 1 file changed, 1 deletion(-) diff --git a/src/package-manager.coffee b/src/package-manager.coffee index 60a6f7f20..32e55aecd 100644 --- a/src/package-manager.coffee +++ b/src/package-manager.coffee @@ -441,7 +441,6 @@ class PackageManager Promise.all([symlinkPromise, dirPromise]).then (values) -> [isSymLink, isDir] = values - console.log directory, isSymLink, isDir if isSymLink fs.unlink(directory) else if isDir From 3b03ef5a0b63d42732d0bd043c2d73bcbd3a4f6c Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Mon, 11 May 2015 16:36:09 -0700 Subject: [PATCH 222/335] :arrow_up: autocomplete-plus@2.14.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 07cf9ac55..9972dca62 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "autocomplete-atom-api": "0.9.0", "autocomplete-css": "0.7.2", "autocomplete-html": "0.7.1", - "autocomplete-plus": "2.13.1", + "autocomplete-plus": "2.14.0", "autoflow": "0.23.0", "autosave": "0.20.0", "background-tips": "0.24.0", From dd45a6f3abda2bd7cb453b465d654daf9c835b6c Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Mon, 11 May 2015 16:42:17 -0700 Subject: [PATCH 223/335] No parens around fn --- src/package-manager.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/package-manager.coffee b/src/package-manager.coffee index 32e55aecd..192c1484e 100644 --- a/src/package-manager.coffee +++ b/src/package-manager.coffee @@ -444,7 +444,7 @@ class PackageManager if isSymLink fs.unlink(directory) else if isDir - fs.remove(directory, ->) + fs.remove directory, -> if Grim.includeDeprecatedAPIs EmitterMixin = require('emissary').Emitter From b0c9a93420886d8fcd3dc13995d83e475efe4ab6 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Mon, 11 May 2015 16:54:14 -0700 Subject: [PATCH 224/335] Fix another lint error --- spec/package-manager-spec.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/package-manager-spec.coffee b/spec/package-manager-spec.coffee index 00b05c102..89e97f219 100644 --- a/spec/package-manager-spec.coffee +++ b/spec/package-manager-spec.coffee @@ -840,7 +840,7 @@ describe "PackageManager", -> fs.writeFileSync(path.join(autocompleteCSSPath, 'package.json'), '{}') fs.symlinkSync(path.join(fixturePath, 'package-with-main'), autocompletePlusPath, 'dir') catch e - ; + undefined expect(fs.isDirectorySync(autocompleteCSSPath)).toBe true expect(fs.isSymbolicLinkSync(autocompletePlusPath)).toBe true From 95ba6d5fa99f0c11c56c2d7ebf25b4ba1d7b1c67 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Mon, 11 May 2015 18:47:42 -0700 Subject: [PATCH 225/335] Bundle autocomplete-snippets --- package.json | 1 + src/package-manager.coffee | 1 + 2 files changed, 2 insertions(+) diff --git a/package.json b/package.json index 9972dca62..dd8c2fff6 100644 --- a/package.json +++ b/package.json @@ -88,6 +88,7 @@ "autocomplete-css": "0.7.2", "autocomplete-html": "0.7.1", "autocomplete-plus": "2.14.0", + "autocomplete-snippets": "1.6.1", "autoflow": "0.23.0", "autosave": "0.20.0", "background-tips": "0.24.0", diff --git a/src/package-manager.coffee b/src/package-manager.coffee index 192c1484e..75005fe11 100644 --- a/src/package-manager.coffee +++ b/src/package-manager.coffee @@ -427,6 +427,7 @@ class PackageManager path.join(packageDir, 'autocomplete-atom-api') path.join(packageDir, 'autocomplete-css') path.join(packageDir, 'autocomplete-html') + path.join(packageDir, 'autocomplete-snippets') ] for dirToRemove in dirsToRemove @uninstallDirectory(dirToRemove) From a99d9bf24b936624f878d07e805261f12308e62b Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Mon, 11 May 2015 18:48:00 -0700 Subject: [PATCH 226/335] :arrow_up: autocomplete-plus@2.14.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index dd8c2fff6..c3c76d599 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "autocomplete-atom-api": "0.9.0", "autocomplete-css": "0.7.2", "autocomplete-html": "0.7.1", - "autocomplete-plus": "2.14.0", + "autocomplete-plus": "2.14.1", "autocomplete-snippets": "1.6.1", "autoflow": "0.23.0", "autosave": "0.20.0", From 326255e6ef98cb02fd629d75a04e1618a182b94d Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Tue, 12 May 2015 09:57:46 -0700 Subject: [PATCH 227/335] Add callback to unlink --- src/package-manager.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/package-manager.coffee b/src/package-manager.coffee index 75005fe11..7789d7590 100644 --- a/src/package-manager.coffee +++ b/src/package-manager.coffee @@ -443,7 +443,7 @@ class PackageManager Promise.all([symlinkPromise, dirPromise]).then (values) -> [isSymLink, isDir] = values if isSymLink - fs.unlink(directory) + fs.unlink directory, -> else if isDir fs.remove directory, -> From ef224e39dba2e44ce7ce00154cd1b7eb01fb072a Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Tue, 12 May 2015 09:57:50 -0700 Subject: [PATCH 228/335] Remove catch --- spec/package-manager-spec.coffee | 2 -- 1 file changed, 2 deletions(-) diff --git a/spec/package-manager-spec.coffee b/spec/package-manager-spec.coffee index 89e97f219..1cd961936 100644 --- a/spec/package-manager-spec.coffee +++ b/spec/package-manager-spec.coffee @@ -839,8 +839,6 @@ describe "PackageManager", -> fs.mkdirSync(autocompleteCSSPath) fs.writeFileSync(path.join(autocompleteCSSPath, 'package.json'), '{}') fs.symlinkSync(path.join(fixturePath, 'package-with-main'), autocompletePlusPath, 'dir') - catch e - undefined expect(fs.isDirectorySync(autocompleteCSSPath)).toBe true expect(fs.isSymbolicLinkSync(autocompletePlusPath)).toBe true From 4a2c3e90ba332beb37ed32266181e52cdd9dc4ab Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Tue, 12 May 2015 10:24:29 -0700 Subject: [PATCH 229/335] Bundle autocomplete-emojis --- package.json | 1 + src/package-manager.coffee | 1 + 2 files changed, 2 insertions(+) diff --git a/package.json b/package.json index c3c76d599..4261d4f29 100644 --- a/package.json +++ b/package.json @@ -86,6 +86,7 @@ "archive-view": "0.57.0", "autocomplete-atom-api": "0.9.0", "autocomplete-css": "0.7.2", + "autocomplete-emojis": "2.2.2", "autocomplete-html": "0.7.1", "autocomplete-plus": "2.14.1", "autocomplete-snippets": "1.6.1", diff --git a/src/package-manager.coffee b/src/package-manager.coffee index 7789d7590..1262aa59e 100644 --- a/src/package-manager.coffee +++ b/src/package-manager.coffee @@ -427,6 +427,7 @@ class PackageManager path.join(packageDir, 'autocomplete-atom-api') path.join(packageDir, 'autocomplete-css') path.join(packageDir, 'autocomplete-html') + path.join(packageDir, 'autocomplete-emojis') path.join(packageDir, 'autocomplete-snippets') ] for dirToRemove in dirsToRemove From 400fb0cf6d0b2a73aaa1a88f8253d47d8386096f Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Tue, 12 May 2015 16:00:48 -0700 Subject: [PATCH 230/335] :arrow_up: autocomplete-plus@2.14.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4261d4f29..a92f48caf 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "autocomplete-css": "0.7.2", "autocomplete-emojis": "2.2.2", "autocomplete-html": "0.7.1", - "autocomplete-plus": "2.14.1", + "autocomplete-plus": "2.14.2", "autocomplete-snippets": "1.6.1", "autoflow": "0.23.0", "autosave": "0.20.0", From d72376aac0bc560983bc489972d7ada420242136 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Wed, 13 May 2015 09:16:53 -0700 Subject: [PATCH 231/335] :arrow_up: autocomplete-plus@2.15.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a92f48caf..b03c372e7 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "autocomplete-css": "0.7.2", "autocomplete-emojis": "2.2.2", "autocomplete-html": "0.7.1", - "autocomplete-plus": "2.14.2", + "autocomplete-plus": "2.15.0", "autocomplete-snippets": "1.6.1", "autoflow": "0.23.0", "autosave": "0.20.0", From f5078a16e3f7fd532e7b21c1c43834034821c009 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 May 2015 11:20:41 -0700 Subject: [PATCH 232/335] Remove default background style --- static/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/index.html b/static/index.html index 5559058dc..062a2db29 100644 --- a/static/index.html +++ b/static/index.html @@ -1,5 +1,5 @@ - + From 87db62a70b005969b84139f49eea23cd3da774aa Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 May 2015 11:20:56 -0700 Subject: [PATCH 233/335] Remove empty title element --- static/index.html | 2 -- 1 file changed, 2 deletions(-) diff --git a/static/index.html b/static/index.html index 062a2db29..84e8d57d4 100644 --- a/static/index.html +++ b/static/index.html @@ -1,8 +1,6 @@ - - From 22544688559761e48c38eaaa0293cf8e678e5e12 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 May 2015 11:21:25 -0700 Subject: [PATCH 234/335] Show window as early as possible --- src/atom.coffee | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/atom.coffee b/src/atom.coffee index 1cf63b397..c14e5517d 100644 --- a/src/atom.coffee +++ b/src/atom.coffee @@ -196,6 +196,10 @@ class Atom extends Model # # Call after this instance has been assigned to the `atom` global. initialize: -> + dimensions = @restoreWindowDimensions() + maximize = dimensions?.maximized and process.platform isnt 'darwin' + @displayWindow({maximize}) + sourceMapCache = {} window.onerror = => @@ -483,7 +487,10 @@ class Atom extends Model # Extended: Set the full screen state of the current window. setFullScreen: (fullScreen=false) -> ipc.send('call-window-method', 'setFullScreen', fullScreen) - if fullScreen then document.body.classList.add("fullscreen") else document.body.classList.remove("fullscreen") + if fullScreen + document.body.classList.add("fullscreen") + else + document.body.classList.remove("fullscreen") # Extended: Toggle the full screen state of the current window. toggleFullScreen: -> @@ -494,8 +501,9 @@ class Atom extends Model # This is done in a next tick to prevent a white flicker from occurring # if called synchronously. displayWindow: ({maximize}={}) -> + @show() + setImmediate => - @show() @focus() @setFullScreen(true) if @workspace.fullScreen @maximize() if maximize @@ -582,7 +590,6 @@ class Atom extends Model CommandInstaller.installApmCommand false, (error) -> console.warn error.message if error? - dimensions = @restoreWindowDimensions() @loadConfig() @keymaps.loadBundledKeymaps() @themes.loadBaseStylesheets() @@ -602,9 +609,6 @@ class Atom extends Model @openInitialEmptyEditorIfNecessary() - maximize = dimensions?.maximized and process.platform isnt 'darwin' - @displayWindow({maximize}) - unloadEditorWindow: -> return if not @project From 943df493005531e4bae0a8bd635357f8e17fa5b7 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 May 2015 11:53:04 -0700 Subject: [PATCH 235/335] Read/write window background in local storage --- src/atom.coffee | 12 ++++++++++-- static/index.js | 24 ++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/atom.coffee b/src/atom.coffee index c14e5517d..7ce43df66 100644 --- a/src/atom.coffee +++ b/src/atom.coffee @@ -282,7 +282,9 @@ class Atom extends Model deprecate "The atom.syntax global is deprecated. Use atom.grammars instead." @grammars - @disposables.add @packages.onDidActivateInitialPackages => @watchThemes() + @disposables.add @packages.onDidActivateInitialPackages => + @watchThemes() + @storeWindowBackground() Project = require './project' TextBuffer = require 'text-buffer' @@ -580,6 +582,11 @@ class Atom extends Model dimensions = @getWindowDimensions() @state.windowDimensions = dimensions if @isValidDimensions(dimensions) + storeWindowBackground: -> + workspaceElement = @views?.getView(@workspace) + backgroundColor = window.getComputedStyle(workspaceElement)['background-color'] + window.localStorage.setItem('atom:window-background-color', backgroundColor) + # Call this method when establishing a real application window. startEditorWindow: -> {safeMode} = @getLoadSettings() @@ -751,7 +758,8 @@ class Atom extends Model # Only reload stylesheets from non-theme packages for pack in @packages.getActivePackages() when pack.getType() isnt 'theme' pack.reloadStylesheets?() - null + @storeWindowBackground() + return # Notify the browser project of the window's current project path watchProjectPath: -> diff --git a/static/index.js b/static/index.js index 0a377044e..b2e580c80 100644 --- a/static/index.js +++ b/static/index.js @@ -43,6 +43,7 @@ window.onload = function() { } } + var setLoadTime = function(loadTime) { if (global.atom) { global.atom.loadTime = loadTime; @@ -162,3 +163,26 @@ var profileStartup = function(cacheDir, loadSettings, initialTime) { }); } } + +var setupWindowBackground = function() { + var backgroundColor = window.localStorage.getItem('atom:window-background-color'); + if (!backgroundColor) { + return; + } + + var backgroundStylesheet = document.createElement('style'); + backgroundStylesheet.type = 'text/css'; + backgroundStylesheet.innerText = 'html, body { background: ' + backgroundColor + ' }'; + document.head.appendChild(backgroundStylesheet); + + // Remove once the page loads + window.addEventListener("load", function loadWindow() { + window.removeEventListener("load", loadWindow, false); + setTimeout(function() { + backgroundStylesheet.remove(); + backgroundStylesheet = null; + }, 1000); + }, false); +} + +setupWindowBackground(); From ded24387008d0ef9d4d19397202f90ade5ae286e Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 May 2015 16:15:26 -0700 Subject: [PATCH 236/335] Add ; to inline style --- static/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/index.js b/static/index.js index b2e580c80..63fa503ee 100644 --- a/static/index.js +++ b/static/index.js @@ -172,7 +172,7 @@ var setupWindowBackground = function() { var backgroundStylesheet = document.createElement('style'); backgroundStylesheet.type = 'text/css'; - backgroundStylesheet.innerText = 'html, body { background: ' + backgroundColor + ' }'; + backgroundStylesheet.innerText = 'html, body { background: ' + backgroundColor + '; }'; document.head.appendChild(backgroundStylesheet); // Remove once the page loads From 87fd2ec188d80ea8148edcbe71b33f7d0e345542 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 May 2015 16:19:33 -0700 Subject: [PATCH 237/335] Store background on unload --- src/atom.coffee | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/atom.coffee b/src/atom.coffee index 7ce43df66..6b9beb64c 100644 --- a/src/atom.coffee +++ b/src/atom.coffee @@ -282,9 +282,7 @@ class Atom extends Model deprecate "The atom.syntax global is deprecated. Use atom.grammars instead." @grammars - @disposables.add @packages.onDidActivateInitialPackages => - @watchThemes() - @storeWindowBackground() + @disposables.add @packages.onDidActivateInitialPackages => @watchThemes() Project = require './project' TextBuffer = require 'text-buffer' @@ -619,6 +617,7 @@ class Atom extends Model unloadEditorWindow: -> return if not @project + @storeWindowBackground() @state.grammars = @grammars.serialize() @state.project = @project.serialize() @state.workspace = @workspace.serialize() @@ -758,7 +757,6 @@ class Atom extends Model # Only reload stylesheets from non-theme packages for pack in @packages.getActivePackages() when pack.getType() isnt 'theme' pack.reloadStylesheets?() - @storeWindowBackground() return # Notify the browser project of the window's current project path From a0abd9ebe438cd478f7925378ebbdc0c5fa0cd11 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 May 2015 16:20:17 -0700 Subject: [PATCH 238/335] :art: --- static/index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/static/index.js b/static/index.js index 63fa503ee..c00fe4c14 100644 --- a/static/index.js +++ b/static/index.js @@ -43,7 +43,6 @@ window.onload = function() { } } - var setLoadTime = function(loadTime) { if (global.atom) { global.atom.loadTime = loadTime; From 88c1c8404e0ac4fe6bfcab9dcef948d1d7399088 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 May 2015 16:22:31 -0700 Subject: [PATCH 239/335] Display window after wiring up windor.onerror --- src/atom.coffee | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/atom.coffee b/src/atom.coffee index 6b9beb64c..eec652f39 100644 --- a/src/atom.coffee +++ b/src/atom.coffee @@ -196,10 +196,6 @@ class Atom extends Model # # Call after this instance has been assigned to the `atom` global. initialize: -> - dimensions = @restoreWindowDimensions() - maximize = dimensions?.maximized and process.platform isnt 'darwin' - @displayWindow({maximize}) - sourceMapCache = {} window.onerror = => @@ -227,6 +223,10 @@ class Atom extends Model @disposables?.dispose() @disposables = new CompositeDisposable + dimensions = @restoreWindowDimensions() + maximize = dimensions?.maximized and process.platform isnt 'darwin' + @displayWindow({maximize}) + @setBodyPlatformClass() @loadTime = null From 104bece1191f04d1359df3586ae7662560ae2c07 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 May 2015 16:47:56 -0700 Subject: [PATCH 240/335] Add restoreWindow helper --- src/atom.coffee | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/atom.coffee b/src/atom.coffee index eec652f39..c963cd8a4 100644 --- a/src/atom.coffee +++ b/src/atom.coffee @@ -223,9 +223,8 @@ class Atom extends Model @disposables?.dispose() @disposables = new CompositeDisposable - dimensions = @restoreWindowDimensions() - maximize = dimensions?.maximized and process.platform isnt 'darwin' - @displayWindow({maximize}) + @restoreWindow() + @show() @setBodyPlatformClass() @@ -496,16 +495,17 @@ class Atom extends Model toggleFullScreen: -> @setFullScreen(not @isFullScreen()) - # Schedule the window to be shown and focused on the next tick. + # Restore the window to its previous dimensions. # - # This is done in a next tick to prevent a white flicker from occurring - # if called synchronously. - displayWindow: ({maximize}={}) -> - @show() + # Also restores the full screen and maximized state on the next tick to + # prevent resize glitches. + restoreWindow: -> + dimensions = @restoreWindowDimensions() + maximize = dimensions?.maximized and process.platform isnt 'darwin' setImmediate => @focus() - @setFullScreen(true) if @workspace.fullScreen + @setFullScreen(true) if @workspace?.fullScreen @maximize() if maximize # Get the dimensions of this window. From 10c65b53f98cf76a7c87607d5bc0b5fbb5de3dea Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 May 2015 16:50:29 -0700 Subject: [PATCH 241/335] Don't store background for spec windows --- src/atom.coffee | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/atom.coffee b/src/atom.coffee index c963cd8a4..0e8f85f5e 100644 --- a/src/atom.coffee +++ b/src/atom.coffee @@ -581,6 +581,8 @@ class Atom extends Model @state.windowDimensions = dimensions if @isValidDimensions(dimensions) storeWindowBackground: -> + return if @inSpecMode() + workspaceElement = @views?.getView(@workspace) backgroundColor = window.getComputedStyle(workspaceElement)['background-color'] window.localStorage.setItem('atom:window-background-color', backgroundColor) From 8439099a06b97cd667aac1186f41e896aa714c3e Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 May 2015 16:54:01 -0700 Subject: [PATCH 242/335] Call show from within restoreWindow --- src/atom.coffee | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/atom.coffee b/src/atom.coffee index 0e8f85f5e..c8b9c718f 100644 --- a/src/atom.coffee +++ b/src/atom.coffee @@ -224,7 +224,6 @@ class Atom extends Model @disposables = new CompositeDisposable @restoreWindow() - @show() @setBodyPlatformClass() @@ -501,6 +500,8 @@ class Atom extends Model # prevent resize glitches. restoreWindow: -> dimensions = @restoreWindowDimensions() + @show() + maximize = dimensions?.maximized and process.platform isnt 'darwin' setImmediate => From 2707b09f00a55d3e8f52e9714c4682f27488a84b Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 May 2015 16:54:48 -0700 Subject: [PATCH 243/335] restoreWindow -> displayWindow --- src/atom.coffee | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/atom.coffee b/src/atom.coffee index c8b9c718f..b33461034 100644 --- a/src/atom.coffee +++ b/src/atom.coffee @@ -223,7 +223,7 @@ class Atom extends Model @disposables?.dispose() @disposables = new CompositeDisposable - @restoreWindow() + @displayWindow() @setBodyPlatformClass() @@ -494,11 +494,11 @@ class Atom extends Model toggleFullScreen: -> @setFullScreen(not @isFullScreen()) - # Restore the window to its previous dimensions. + # Restore the window to its previous dimensions and show it. # # Also restores the full screen and maximized state on the next tick to # prevent resize glitches. - restoreWindow: -> + displayWindow: -> dimensions = @restoreWindowDimensions() @show() From 1f9f17f9ff24d95e5234c40a9c9c7e4991b022e9 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 May 2015 17:41:00 -0700 Subject: [PATCH 244/335] Don't display window in spec mode --- src/atom.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/atom.coffee b/src/atom.coffee index b33461034..36e40e923 100644 --- a/src/atom.coffee +++ b/src/atom.coffee @@ -223,7 +223,7 @@ class Atom extends Model @disposables?.dispose() @disposables = new CompositeDisposable - @displayWindow() + @displayWindow() unless @inSpecMode() @setBodyPlatformClass() From 42004ce770c2d6f64c972ce68651e28752d2b011 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 May 2015 17:48:40 -0700 Subject: [PATCH 245/335] Remove unneeded ? --- src/atom.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/atom.coffee b/src/atom.coffee index 36e40e923..702973cd9 100644 --- a/src/atom.coffee +++ b/src/atom.coffee @@ -584,7 +584,7 @@ class Atom extends Model storeWindowBackground: -> return if @inSpecMode() - workspaceElement = @views?.getView(@workspace) + workspaceElement = @views.getView(@workspace) backgroundColor = window.getComputedStyle(workspaceElement)['background-color'] window.localStorage.setItem('atom:window-background-color', backgroundColor) From fff546a1e5abeeda2542cba4cbbd6463903d31fe Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 13 May 2015 09:47:10 -0700 Subject: [PATCH 246/335] Don't set background of spec windows --- static/index.js | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/static/index.js b/static/index.js index c00fe4c14..a656ac501 100644 --- a/static/index.js +++ b/static/index.js @@ -1,6 +1,9 @@ var fs = require('fs'); var path = require('path'); +var loadSettings = null; +var loadSettingsError = null; + window.onload = function() { try { var startTime = Date.now(); @@ -18,18 +21,13 @@ window.onload = function() { cacheDir = path.join(cacheDir, 'root'); } - var rawLoadSettings = decodeURIComponent(location.hash.substr(1)); - var loadSettings; - try { - loadSettings = JSON.parse(rawLoadSettings); - } catch (error) { - console.error("Failed to parse load settings: " + rawLoadSettings); - throw error; - } - // Normalize to make sure drive letter case is consistent on Windows process.resourcesPath = path.normalize(process.resourcesPath); + if (loadSettingsError) { + throw loadSettingsError; + } + var devMode = loadSettings.devMode || !loadSettings.resourcePath.startsWith(process.resourcesPath + path.sep); if (loadSettings.profileStartup) { @@ -163,7 +161,24 @@ var profileStartup = function(cacheDir, loadSettings, initialTime) { } } +var parseLoadSettings = function() { + var rawLoadSettings = decodeURIComponent(location.hash.substr(1)); + try { + loadSettings = JSON.parse(rawLoadSettings); + } catch (error) { + loadSettingsError = error; + } + + if (!loadSettings || typeof loadSettings !== 'object') { + loadSettings = {}; + } +} + var setupWindowBackground = function() { + if (loadSettings.isSpec) { + return; + } + var backgroundColor = window.localStorage.getItem('atom:window-background-color'); if (!backgroundColor) { return; @@ -184,4 +199,5 @@ var setupWindowBackground = function() { }, false); } +parseLoadSettings(); setupWindowBackground(); From f989981d194743dc860ba9009a17a1ecee23c081 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 13 May 2015 09:50:11 -0700 Subject: [PATCH 247/335] Extract getCacheDirectory helper --- static/index.js | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/static/index.js b/static/index.js index a656ac501..7d9bf4467 100644 --- a/static/index.js +++ b/static/index.js @@ -15,12 +15,6 @@ window.onload = function() { // Ensure ATOM_HOME is always set before anything else is required setupAtomHome(); - var cacheDir = path.join(process.env.ATOM_HOME, 'compile-cache'); - // Use separate compile cache when sudo'ing as root to avoid permission issues - if (process.env.USER === 'root' && process.env.SUDO_USER && process.env.SUDO_USER !== process.env.USER) { - cacheDir = path.join(cacheDir, 'root'); - } - // Normalize to make sure drive letter case is consistent on Windows process.resourcesPath = path.normalize(process.resourcesPath); @@ -31,9 +25,9 @@ window.onload = function() { var devMode = loadSettings.devMode || !loadSettings.resourcePath.startsWith(process.resourcesPath + path.sep); if (loadSettings.profileStartup) { - profileStartup(cacheDir, loadSettings, Date.now() - startTime); + profileStartup(loadSettings, Date.now() - startTime); } else { - setupWindow(cacheDir, loadSettings); + setupWindow(loadSettings); setLoadTime(Date.now() - startTime); } } catch (error) { @@ -41,6 +35,15 @@ window.onload = function() { } } +var getCacheDirectory = function() { + var cacheDir = path.join(process.env.ATOM_HOME, 'compile-cache'); + // Use separate compile cache when sudo'ing as root to avoid permission issues + if (process.env.USER === 'root' && process.env.SUDO_USER && process.env.SUDO_USER !== process.env.USER) { + cacheDir = path.join(cacheDir, 'root'); + } + return cacheDir; +} + var setLoadTime = function(loadTime) { if (global.atom) { global.atom.loadTime = loadTime; @@ -57,7 +60,9 @@ var handleSetupError = function(error) { console.error(error.stack || error); } -var setupWindow = function(cacheDir, loadSettings) { +var setupWindow = function(loadSettings) { + var cacheDir = getCacheDirectory(); + setupCoffeeCache(cacheDir); ModuleCache = require('../src/module-cache'); @@ -131,16 +136,17 @@ var setupSourceMapCache = function(cacheDir) { var setupVmCompatibility = function() { var vm = require('vm'); - if (!vm.Script.createContext) + if (!vm.Script.createContext) { vm.Script.createContext = vm.createContext; + } } -var profileStartup = function(cacheDir, loadSettings, initialTime) { +var profileStartup = function(loadSettings, initialTime) { var profile = function() { console.profile('startup'); try { var startTime = Date.now() - setupWindow(cacheDir, loadSettings); + setupWindow(loadSettings); setLoadTime(Date.now() - startTime + initialTime); } catch (error) { handleSetupError(error); From f2c50bfd9e6a9a7f12af73afc8c692dbbe4f2292 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 13 May 2015 10:00:34 -0700 Subject: [PATCH 248/335] Remove unneeded loadSettings validation --- static/index.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/static/index.js b/static/index.js index 7d9bf4467..b0dd1c3c1 100644 --- a/static/index.js +++ b/static/index.js @@ -174,14 +174,10 @@ var parseLoadSettings = function() { } catch (error) { loadSettingsError = error; } - - if (!loadSettings || typeof loadSettings !== 'object') { - loadSettings = {}; - } } var setupWindowBackground = function() { - if (loadSettings.isSpec) { + if (loadSettings && loadSettings.isSpec) { return; } From 41d3764189d1d9737eb5b4408231be624e3997eb Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 13 May 2015 10:09:34 -0700 Subject: [PATCH 249/335] :art: --- src/atom.coffee | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/atom.coffee b/src/atom.coffee index 702973cd9..0d029b61d 100644 --- a/src/atom.coffee +++ b/src/atom.coffee @@ -502,12 +502,10 @@ class Atom extends Model dimensions = @restoreWindowDimensions() @show() - maximize = dimensions?.maximized and process.platform isnt 'darwin' - setImmediate => @focus() @setFullScreen(true) if @workspace?.fullScreen - @maximize() if maximize + @maximize() if dimensions?.maximized and process.platform isnt 'darwin' # Get the dimensions of this window. # From 9f2faa086b5de07e13620ad3fab8142cec3e4f1a Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 13 May 2015 10:11:46 -0700 Subject: [PATCH 250/335] Add back raw load settings logging --- static/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/static/index.js b/static/index.js index b0dd1c3c1..ef61e8bce 100644 --- a/static/index.js +++ b/static/index.js @@ -172,6 +172,7 @@ var parseLoadSettings = function() { try { loadSettings = JSON.parse(rawLoadSettings); } catch (error) { + console.error("Failed to parse load settings: " + rawLoadSettings); loadSettingsError = error; } } From ef6c16de76a8f646266494639cc6ddd4879ee36b Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Wed, 13 May 2015 10:24:03 -0700 Subject: [PATCH 251/335] :fire: dead code for handling deferred marker change events --- src/marker.coffee | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/src/marker.coffee b/src/marker.coffee index 813ca78e5..942e25606 100644 --- a/src/marker.coffee +++ b/src/marker.coffee @@ -48,7 +48,6 @@ class Marker oldTailBufferPosition: null oldTailScreenPosition: null wasValid: true - deferredChangeEvents: null ### Section: Construction and Destruction @@ -332,11 +331,11 @@ class Marker newTailScreenPosition = @getTailScreenPosition() isValid = @isValid() - return if _.isEqual(isValid, @wasValid) and - _.isEqual(newHeadBufferPosition, @oldHeadBufferPosition) and - _.isEqual(newHeadScreenPosition, @oldHeadScreenPosition) and - _.isEqual(newTailBufferPosition, @oldTailBufferPosition) and - _.isEqual(newTailScreenPosition, @oldTailScreenPosition) + return if isValid is @wasValid and + newHeadBufferPosition.isEqual(@oldHeadBufferPosition) and + newHeadScreenPosition.isEqual(@oldHeadScreenPosition) and + newTailBufferPosition.isEqual(@oldTailBufferPosition) and + newTailScreenPosition.isEqual(@oldTailScreenPosition) changeEvent = { @oldHeadScreenPosition, newHeadScreenPosition, @@ -347,11 +346,8 @@ class Marker isValid } - if @deferredChangeEvents? - @deferredChangeEvents.push(changeEvent) - else - @emit 'changed', changeEvent if Grim.includeDeprecatedAPIs - @emitter.emit 'did-change', changeEvent + @emit 'changed', changeEvent if Grim.includeDeprecatedAPIs + @emitter.emit 'did-change', changeEvent @oldHeadBufferPosition = newHeadBufferPosition @oldHeadScreenPosition = newHeadScreenPosition From 1edeb7b56869f9489b51bfd3fd4a5ddae3c7bd76 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Thu, 7 May 2015 09:50:12 -0700 Subject: [PATCH 252/335] Save list of open windows as windows are added/removed --- src/browser/atom-application.coffee | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/browser/atom-application.coffee b/src/browser/atom-application.coffee index 0e7ff9f4d..20ebf84f9 100644 --- a/src/browser/atom-application.coffee +++ b/src/browser/atom-application.coffee @@ -100,6 +100,7 @@ class AtomApplication removeWindow: (window) -> @windows.splice @windows.indexOf(window), 1 @applicationMenu?.enableWindowSpecificItems(false) if @windows.length is 0 + @saveState() # Public: Adds the {AtomWindow} to the global window list. addWindow: (window) -> @@ -114,6 +115,7 @@ class AtomApplication window.browserWindow.once 'closed', => @lastFocusedWindow = null if window is @lastFocusedWindow window.browserWindow.removeListener 'focus', focusHandler + window.browserWindow.webContents.once 'did-finish-load', => @saveState() # Creates server to listen for additional atom application launches. # @@ -202,9 +204,6 @@ class AtomApplication app.on 'window-all-closed', -> app.quit() if process.platform in ['win32', 'linux'] - app.on 'before-quit', => - @saveState() - app.on 'will-quit', => @killAllProcesses() @deleteSocketFile() From 725a564e626eb98802c54f82c618aea3dd784507 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Thu, 7 May 2015 10:44:58 -0700 Subject: [PATCH 253/335] Avoid saving windows state when quitting on windows/linux --- src/browser/atom-application.coffee | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/browser/atom-application.coffee b/src/browser/atom-application.coffee index 20ebf84f9..3a36b8b72 100644 --- a/src/browser/atom-application.coffee +++ b/src/browser/atom-application.coffee @@ -99,7 +99,11 @@ class AtomApplication # Public: Removes the {AtomWindow} from the global window list. removeWindow: (window) -> @windows.splice @windows.indexOf(window), 1 - @applicationMenu?.enableWindowSpecificItems(false) if @windows.length is 0 + if @windows.length is 0 + @applicationMenu?.enableWindowSpecificItems(false) + if process.platform in ['win32', 'linux'] + app.quit() + return @saveState() # Public: Adds the {AtomWindow} to the global window list. @@ -201,9 +205,6 @@ class AtomApplication @openPathOnEvent('application:open-your-stylesheet', 'atom://.atom/stylesheet') @openPathOnEvent('application:open-license', path.join(process.resourcesPath, 'LICENSE.md')) - app.on 'window-all-closed', -> - app.quit() if process.platform in ['win32', 'linux'] - app.on 'will-quit', => @killAllProcesses() @deleteSocketFile() From 62c406f4507c768eebae78ed6ae766517ebe482b Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Thu, 7 May 2015 11:10:01 -0700 Subject: [PATCH 254/335] Save open window state when a window loses focus --- src/browser/atom-application.coffee | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/browser/atom-application.coffee b/src/browser/atom-application.coffee index 3a36b8b72..d7a8b0b5b 100644 --- a/src/browser/atom-application.coffee +++ b/src/browser/atom-application.coffee @@ -115,10 +115,13 @@ class AtomApplication unless window.isSpec focusHandler = => @lastFocusedWindow = window + blurHandler = => @saveState() window.browserWindow.on 'focus', focusHandler + window.browserWindow.on 'blur', blurHandler window.browserWindow.once 'closed', => @lastFocusedWindow = null if window is @lastFocusedWindow window.browserWindow.removeListener 'focus', focusHandler + window.browserWindow.removeListener 'blur', blurHandler window.browserWindow.webContents.once 'did-finish-load', => @saveState() # Creates server to listen for additional atom application launches. From 8ddfa8690b9c8825409627990abc9311853eb96f Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Thu, 7 May 2015 15:31:44 -0700 Subject: [PATCH 255/335] Save window state when atom.exit() is called --- src/browser/atom-application.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/src/browser/atom-application.coffee b/src/browser/atom-application.coffee index d7a8b0b5b..deccae4ee 100644 --- a/src/browser/atom-application.coffee +++ b/src/browser/atom-application.coffee @@ -213,6 +213,7 @@ class AtomApplication @deleteSocketFile() app.on 'will-exit', => + @saveState() @killAllProcesses() @deleteSocketFile() From 6026c78d9e0acf2a67e56dca4eba81fb97f1dd70 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Mon, 11 May 2015 09:20:07 -0700 Subject: [PATCH 256/335] Don't save window state when closing spec windows --- src/browser/atom-application.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/browser/atom-application.coffee b/src/browser/atom-application.coffee index deccae4ee..b423544cc 100644 --- a/src/browser/atom-application.coffee +++ b/src/browser/atom-application.coffee @@ -104,7 +104,7 @@ class AtomApplication if process.platform in ['win32', 'linux'] app.quit() return - @saveState() + @saveState() unless window.isSpec # Public: Adds the {AtomWindow} to the global window list. addWindow: (window) -> From dabf5b5f693545bfb3cad36f82595d3515e4d040 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Wed, 13 May 2015 10:46:14 -0700 Subject: [PATCH 257/335] Don't save windows state when apm test finishes --- src/browser/atom-application.coffee | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/browser/atom-application.coffee b/src/browser/atom-application.coffee index b423544cc..af6a45763 100644 --- a/src/browser/atom-application.coffee +++ b/src/browser/atom-application.coffee @@ -213,7 +213,7 @@ class AtomApplication @deleteSocketFile() app.on 'will-exit', => - @saveState() + @saveState() unless @windows.every (window) -> window.isSpec @killAllProcesses() @deleteSocketFile() @@ -426,8 +426,8 @@ class AtomApplication saveState: -> states = [] for window in @windows - if loadSettings = window.getLoadSettings() - unless loadSettings.isSpec + unless window.isSpec + if loadSettings = window.getLoadSettings() states.push(initialPaths: loadSettings.initialPaths) @storageFolder.store('application.json', states) From 8fc6d2049308a576459999d7a4ffd1cbab6e90fd Mon Sep 17 00:00:00 2001 From: Jess Lin Date: Tue, 12 May 2015 15:03:38 -0700 Subject: [PATCH 258/335] [Gutter] Create separate state for shared gutter styles, and copy into @state.gutters.sortedDescriptions --- src/text-editor-presenter.coffee | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index ac6d0c363..9253c4b5f 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -213,6 +213,9 @@ class TextEditorPresenter customDecorations: {} lineNumberGutter: lineNumbers: {} + # Shared state that is copied into ``@state.gutters`. + @sharedGutterStyles = {} + @updateState() updateState: -> @@ -251,11 +254,13 @@ class TextEditorPresenter updateVerticalScrollState: -> @state.content.scrollHeight = @scrollHeight - @state.gutters.scrollHeight = @scrollHeight + @state.gutters.scrollHeight = @scrollHeight # TODO jssln Remove + @sharedGutterStyles.scrollHeight = @scrollHeight @state.verticalScrollbar.scrollHeight = @scrollHeight @state.content.scrollTop = @scrollTop - @state.gutters.scrollTop = @scrollTop + @state.gutters.scrollTop = @scrollTop # TODO jssln Remove + @sharedGutterStyles.scrollTop = @scrollTop @state.verticalScrollbar.scrollTop = @scrollTop updateHorizontalScrollState: -> @@ -413,10 +418,11 @@ class TextEditorPresenter @state.gutters.lineNumberGutter.maxLineNumberDigits = @model.getLineCount().toString().length updateCommonGutterState: -> - @state.gutters.backgroundColor = if @gutterBackgroundColor isnt "rgba(0, 0, 0, 0)" + @sharedGutterStyles.backgroundColor = if @gutterBackgroundColor isnt "rgba(0, 0, 0, 0)" @gutterBackgroundColor else @backgroundColor + @state.gutters.backgroundColor = @sharedGutterStyles.backgroundColor # TODO jssln Remove didAddGutter: (gutter) -> gutterDisposables = new CompositeDisposable @@ -446,7 +452,11 @@ class TextEditorPresenter return for gutter in @model.getGutters() isVisible = @gutterIsVisible(gutter) - @state.gutters.sortedDescriptions.push({gutter, visible: isVisible}) + @state.gutters.sortedDescriptions.push({ + gutter, + visible: isVisible, + styles: @sharedGutterStyles + }) # Updates the decoration state for the gutter with the given gutterName. # @state.gutters.customDecorations is an {Object}, with the form: From 75edb9a5f192a0424c6b27a733aa0850c303d8a2 Mon Sep 17 00:00:00 2001 From: Jess Lin Date: Tue, 12 May 2015 15:14:27 -0700 Subject: [PATCH 259/335] [Gutter] Add dedicated `customGutterDecorations` state --- src/text-editor-presenter.coffee | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index 9253c4b5f..1fcd85de2 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -215,6 +215,7 @@ class TextEditorPresenter lineNumbers: {} # Shared state that is copied into ``@state.gutters`. @sharedGutterStyles = {} + @customGutterDecorations = {} @updateState() @@ -457,9 +458,10 @@ class TextEditorPresenter visible: isVisible, styles: @sharedGutterStyles }) + @state.gutters.customDecorations = @customGutterDecorations # TODO jssln Remove # Updates the decoration state for the gutter with the given gutterName. - # @state.gutters.customDecorations is an {Object}, with the form: + # @customGutterDecorations is an {Object}, with the form: # * gutterName : { # decoration.id : { # top: # of pixels from top @@ -471,18 +473,18 @@ class TextEditorPresenter updateCustomGutterDecorationState: -> return unless @startRow? and @endRow? and @lineHeight? - @state.gutters.customDecorations = {} + @customGutterDecorations = {} return if @model.isMini() for gutter in @model.getGutters() gutterName = gutter.name - @state.gutters.customDecorations[gutterName] = {} + @customGutterDecorations[gutterName] = {} return if not @gutterIsVisible(gutter) relevantDecorations = @customGutterDecorationsInRange(gutterName, @startRow, @endRow - 1) relevantDecorations.forEach (decoration) => decorationRange = decoration.getMarker().getScreenRange() - @state.gutters.customDecorations[gutterName][decoration.id] = + @customGutterDecorations[gutterName][decoration.id] = top: @lineHeight * decorationRange.start.row height: @lineHeight * decorationRange.getRowCount() item: decoration.getProperties().item From da360b59e7834079016f5160f10110f21df5df66 Mon Sep 17 00:00:00 2001 From: Jess Lin Date: Tue, 12 May 2015 15:44:38 -0700 Subject: [PATCH 260/335] [Gutter] Clear custom gutter decoration state objects instead of reassigning to new objects --- src/text-editor-presenter.coffee | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index 1fcd85de2..a224f21a8 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -473,12 +473,20 @@ class TextEditorPresenter updateCustomGutterDecorationState: -> return unless @startRow? and @endRow? and @lineHeight? - @customGutterDecorations = {} - return if @model.isMini() + if @model.isMini() + # Mini editors have no gutter decorations. + # We clear instead of reassigning to preserve the reference. + @clearAllCustomGutterDecorations() for gutter in @model.getGutters() gutterName = gutter.name - @customGutterDecorations[gutterName] = {} + gutterDecorations = @customGutterDecorations[gutterName] + if not gutterDecorations + @customGutterDecorations[gutterName] = {} + else + # Clear the gutter decorations; they are rebuilt. + # We clear instead of reassigning to preserve the reference. + @clearDecorationsForCustomGutterName(gutterName) return if not @gutterIsVisible(gutter) relevantDecorations = @customGutterDecorationsInRange(gutterName, @startRow, @endRow - 1) @@ -490,6 +498,18 @@ class TextEditorPresenter item: decoration.getProperties().item class: decoration.getProperties().class + clearAllCustomGutterDecorations: -> + allGutterNames = Object.keys(@customGutterDecorations) + for gutterName in allGutterNames + @clearDecorationsForCustomGutterName(gutterName) + + clearDecorationsForCustomGutterName: (gutterName) -> + gutterDecorations = @customGutterDecorations[gutterName] + if gutterDecorations + allDecorationIds = Object.keys(gutterDecorations) + for decorationId in allDecorationIds + delete gutterDecorations[decorationId] + gutterIsVisible: (gutterModel) -> isVisible = gutterModel.isVisible() if gutterModel.name is 'line-number' From 02aacef02b6dec38add1e39c70f1df954e4cac35 Mon Sep 17 00:00:00 2001 From: Jess Lin Date: Wed, 13 May 2015 08:31:47 -0700 Subject: [PATCH 261/335] [Gutter] Create dedicated `lineNumberGutter` state --- src/text-editor-presenter.coffee | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index a224f21a8..8ced5ae61 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -216,6 +216,8 @@ class TextEditorPresenter # Shared state that is copied into ``@state.gutters`. @sharedGutterStyles = {} @customGutterDecorations = {} + @lineNumberGutter = + lineNumbers: {} @updateState() @@ -416,7 +418,7 @@ class TextEditorPresenter return updateLineNumberGutterState: -> - @state.gutters.lineNumberGutter.maxLineNumberDigits = @model.getLineCount().toString().length + @lineNumberGutter.maxLineNumberDigits = @model.getLineCount().toString().length updateCommonGutterState: -> @sharedGutterStyles.backgroundColor = if @gutterBackgroundColor isnt "rgba(0, 0, 0, 0)" @@ -459,6 +461,7 @@ class TextEditorPresenter styles: @sharedGutterStyles }) @state.gutters.customDecorations = @customGutterDecorations # TODO jssln Remove + @state.gutters.lineNumberGutter = @lineNumberGutter # TODO jssln Remove # Updates the decoration state for the gutter with the given gutterName. # @customGutterDecorations is an {Object}, with the form: @@ -546,7 +549,7 @@ class TextEditorPresenter decorationClasses = @lineNumberDecorationClassesForRow(screenRow) foldable = @model.isFoldableAtScreenRow(screenRow) - @state.gutters.lineNumberGutter.lineNumbers[id] = {screenRow, bufferRow, softWrapped, top, decorationClasses, foldable} + @lineNumberGutter.lineNumbers[id] = {screenRow, bufferRow, softWrapped, top, decorationClasses, foldable} visibleLineNumberIds[id] = true if @mouseWheelScreenRow? @@ -556,8 +559,8 @@ class TextEditorPresenter id += '-' + wrapCount if wrapCount > 0 visibleLineNumberIds[id] = true - for id of @state.gutters.lineNumberGutter.lineNumbers - delete @state.gutters.lineNumberGutter.lineNumbers[id] unless visibleLineNumberIds[id] + for id of @lineNumberGutter.lineNumbers + delete @lineNumberGutter.lineNumbers[id] unless visibleLineNumberIds[id] return From 03657b3ef9fdb710c505d0af1f155b474befb66f Mon Sep 17 00:00:00 2001 From: Jess Lin Date: Wed, 13 May 2015 08:38:56 -0700 Subject: [PATCH 262/335] [Gutter] Insert gutter 'content' into 'sortedDescriptions' --- src/text-editor-presenter.coffee | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index 8ced5ae61..be2982db1 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -455,10 +455,16 @@ class TextEditorPresenter return for gutter in @model.getGutters() isVisible = @gutterIsVisible(gutter) + if gutter.name is 'line-number' + content = @lineNumberGutter + else + @customGutterDecorations[gutter.name] ?= {} + content = @customGutterDecorations[gutter.name] @state.gutters.sortedDescriptions.push({ gutter, visible: isVisible, - styles: @sharedGutterStyles + styles: @sharedGutterStyles, + content, }) @state.gutters.customDecorations = @customGutterDecorations # TODO jssln Remove @state.gutters.lineNumberGutter = @lineNumberGutter # TODO jssln Remove From 0a7f6ae18743d76a40c567dc2cd893ad702c72f3 Mon Sep 17 00:00:00 2001 From: Jess Lin Date: Wed, 13 May 2015 09:26:06 -0700 Subject: [PATCH 263/335] [Gutter] Migrate LineNumberGutterComponent to consume new state format --- src/gutter-container-component.coffee | 13 +++++++++++-- src/line-number-gutter-component.coffee | 16 +++++++++++----- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/gutter-container-component.coffee b/src/gutter-container-component.coffee index e7fec35d5..ff85edd09 100644 --- a/src/gutter-container-component.coffee +++ b/src/gutter-container-component.coffee @@ -1,3 +1,4 @@ +_ = require 'underscore-plus' CustomGutterComponent = require './custom-gutter-component' LineNumberGutterComponent = require './line-number-gutter-component' @@ -30,7 +31,7 @@ class GutterContainerComponent newGutterComponents = [] newGutterComponentsByGutterName = {} - for {gutter, visible} in newState + for {gutter, visible, styles, content} in newState gutterComponent = @gutterComponentsByGutterName[gutter.name] if not gutterComponent if gutter.name is 'line-number' @@ -39,7 +40,15 @@ class GutterContainerComponent else gutterComponent = new CustomGutterComponent({gutter}) if visible then gutterComponent.showNode() else gutterComponent.hideNode() - gutterComponent.updateSync(state) + if gutter.name is 'line-number' + # Pass the gutter only the state that it needs. + # For ease of use in the gutter component, set the shared 'styles' as a + # field under the 'content'. + gutterSubstate = _.clone(content) + gutterSubstate.styles = styles + gutterComponent.updateSync(gutterSubstate) + else + gutterComponent.updateSync(state) newGutterComponents.push({ name: gutter.name, component: gutterComponent, diff --git a/src/line-number-gutter-component.coffee b/src/line-number-gutter-component.coffee index c026d2d37..351275f63 100644 --- a/src/line-number-gutter-component.coffee +++ b/src/line-number-gutter-component.coffee @@ -31,19 +31,25 @@ class LineNumberGutterComponent @domNode.style.removeProperty('display') @visible = true + # `state` is a subset of the TextEditorPresenter state that is specific + # to this line number gutter. updateSync: (state) -> - @newState = state.gutters.lineNumberGutter - @oldState ?= {lineNumbers: {}} + @newState = state + @oldState ?= + lineNumbers: {} + styles: {} @appendDummyLineNumber() unless @dummyLineNumberNode? - newDimensionsAndBackgroundState = state.gutters - setDimensionsAndBackground(@oldState, newDimensionsAndBackgroundState, @lineNumbersNode) + setDimensionsAndBackground(@oldState.styles, @newState.styles, @lineNumbersNode) if @newState.maxLineNumberDigits isnt @oldState.maxLineNumberDigits @updateDummyLineNumber() node.remove() for id, node of @lineNumberNodesById - @oldState = {maxLineNumberDigits: @newState.maxLineNumberDigits, lineNumbers: {}} + @oldState = + maxLineNumberDigits: @newState.maxLineNumberDigits + lineNumbers: {} + styles: {} @lineNumberNodesById = {} @updateLineNumbers() From c128788a3b7def898379aff65b8dec8e143e72ad Mon Sep 17 00:00:00 2001 From: Jess Lin Date: Wed, 13 May 2015 10:01:59 -0700 Subject: [PATCH 264/335] [Gutter] Migrate CustomGutterComponent to consume new state format --- src/custom-gutter-component.coffee | 7 ++++--- src/gutter-container-component.coffee | 14 +++++++++----- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/custom-gutter-component.coffee b/src/custom-gutter-component.coffee index 1321c8990..39f5a80a1 100644 --- a/src/custom-gutter-component.coffee +++ b/src/custom-gutter-component.coffee @@ -29,13 +29,14 @@ class CustomGutterComponent @domNode.style.removeProperty('display') @visible = true + # `state` is a subset of the TextEditorPresenter state that is specific + # to this line number gutter. updateSync: (state) -> @oldDimensionsAndBackgroundState ?= {} - newDimensionsAndBackgroundState = state.gutters - setDimensionsAndBackground(@oldDimensionsAndBackgroundState, newDimensionsAndBackgroundState, @decorationsNode) + setDimensionsAndBackground(@oldDimensionsAndBackgroundState, state.styles, @decorationsNode) @oldDecorationPositionState ?= {} - decorationState = state.gutters.customDecorations[@gutter.name] + decorationState = state.content updatedDecorationIds = new Set for decorationId, decorationInfo of decorationState diff --git a/src/gutter-container-component.coffee b/src/gutter-container-component.coffee index ff85edd09..5dbbcd040 100644 --- a/src/gutter-container-component.coffee +++ b/src/gutter-container-component.coffee @@ -39,16 +39,20 @@ class GutterContainerComponent @lineNumberGutterComponent = gutterComponent else gutterComponent = new CustomGutterComponent({gutter}) + if visible then gutterComponent.showNode() else gutterComponent.hideNode() + # Pass the gutter only the state that it needs. if gutter.name is 'line-number' - # Pass the gutter only the state that it needs. - # For ease of use in the gutter component, set the shared 'styles' as a - # field under the 'content'. + # For ease of use in the line number gutter component, set the shared + # 'styles' as a field under the 'content'. gutterSubstate = _.clone(content) gutterSubstate.styles = styles - gutterComponent.updateSync(gutterSubstate) else - gutterComponent.updateSync(state) + # Custom gutter 'content' is keyed on gutter name, so we cannot set + # 'styles' as a subfield directly under it. + gutterSubstate = {content, styles} + gutterComponent.updateSync(gutterSubstate) + newGutterComponents.push({ name: gutter.name, component: gutterComponent, From 733e9947a4453cf358a50ee94535291403cc622d Mon Sep 17 00:00:00 2001 From: Jess Lin Date: Wed, 13 May 2015 10:13:15 -0700 Subject: [PATCH 265/335] [Gutter] Kill old (now unused) state hanging off @state.gutters --- src/text-editor-presenter.coffee | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index be2982db1..bb6e05818 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -210,9 +210,6 @@ class TextEditorPresenter overlays: {} gutters: sortedDescriptions: [] - customDecorations: {} - lineNumberGutter: - lineNumbers: {} # Shared state that is copied into ``@state.gutters`. @sharedGutterStyles = {} @customGutterDecorations = {} @@ -257,12 +254,10 @@ class TextEditorPresenter updateVerticalScrollState: -> @state.content.scrollHeight = @scrollHeight - @state.gutters.scrollHeight = @scrollHeight # TODO jssln Remove @sharedGutterStyles.scrollHeight = @scrollHeight @state.verticalScrollbar.scrollHeight = @scrollHeight @state.content.scrollTop = @scrollTop - @state.gutters.scrollTop = @scrollTop # TODO jssln Remove @sharedGutterStyles.scrollTop = @scrollTop @state.verticalScrollbar.scrollTop = @scrollTop @@ -425,7 +420,6 @@ class TextEditorPresenter @gutterBackgroundColor else @backgroundColor - @state.gutters.backgroundColor = @sharedGutterStyles.backgroundColor # TODO jssln Remove didAddGutter: (gutter) -> gutterDisposables = new CompositeDisposable @@ -466,8 +460,6 @@ class TextEditorPresenter styles: @sharedGutterStyles, content, }) - @state.gutters.customDecorations = @customGutterDecorations # TODO jssln Remove - @state.gutters.lineNumberGutter = @lineNumberGutter # TODO jssln Remove # Updates the decoration state for the gutter with the given gutterName. # @customGutterDecorations is an {Object}, with the form: From 957424f987ed4b29ca37287f5e1e56280cea550e Mon Sep 17 00:00:00 2001 From: Jess Lin Date: Wed, 13 May 2015 10:45:50 -0700 Subject: [PATCH 266/335] [Gutter] @state.gutter.sortedDescriptions -> @state.gutters --- src/gutter-container-component.coffee | 2 +- src/text-editor-component.coffee | 4 ++-- src/text-editor-presenter.coffee | 7 +++---- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/gutter-container-component.coffee b/src/gutter-container-component.coffee index 5dbbcd040..5fa2f85f4 100644 --- a/src/gutter-container-component.coffee +++ b/src/gutter-container-component.coffee @@ -27,7 +27,7 @@ class GutterContainerComponent updateSync: (state) -> # The GutterContainerComponent expects the gutters to be sorted in the order # they should appear. - newState = state.gutters.sortedDescriptions + newState = state.gutters newGutterComponents = [] newGutterComponentsByGutterName = {} diff --git a/src/text-editor-component.coffee b/src/text-editor-component.coffee index 4c6480510..eb01e0f23 100644 --- a/src/text-editor-component.coffee +++ b/src/text-editor-component.coffee @@ -70,7 +70,7 @@ class TextEditorComponent @scrollViewNode.classList.add('scroll-view') @domNode.appendChild(@scrollViewNode) - @mountGutterContainerComponent() if @presenter.getState().gutters.sortedDescriptions.length + @mountGutterContainerComponent() if @presenter.getState().gutters.length @hiddenInputComponent = new InputComponent @scrollViewNode.appendChild(@hiddenInputComponent.getDomNode()) @@ -137,7 +137,7 @@ class TextEditorComponent else @domNode.style.height = '' - if @newState.gutters.sortedDescriptions.length + if @newState.gutters.length @mountGutterContainerComponent() unless @gutterContainerComponent? @gutterContainerComponent.updateSync(@newState) else diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index bb6e05818..27966ff7a 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -208,8 +208,7 @@ class TextEditorPresenter lines: {} highlights: {} overlays: {} - gutters: - sortedDescriptions: [] + gutters: [] # Shared state that is copied into ``@state.gutters`. @sharedGutterStyles = {} @customGutterDecorations = {} @@ -444,7 +443,7 @@ class TextEditorPresenter @emitDidUpdateState() updateGutterOrderState: -> - @state.gutters.sortedDescriptions = [] + @state.gutters = [] if @model.isMini() return for gutter in @model.getGutters() @@ -454,7 +453,7 @@ class TextEditorPresenter else @customGutterDecorations[gutter.name] ?= {} content = @customGutterDecorations[gutter.name] - @state.gutters.sortedDescriptions.push({ + @state.gutters.push({ gutter, visible: isVisible, styles: @sharedGutterStyles, From 1abca560cd62c27d555f4268891b054433984085 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Wed, 13 May 2015 11:26:56 -0700 Subject: [PATCH 267/335] :arrow_up: autocomplete-plus@2.15.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b03c372e7..3614b5f26 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "autocomplete-css": "0.7.2", "autocomplete-emojis": "2.2.2", "autocomplete-html": "0.7.1", - "autocomplete-plus": "2.15.0", + "autocomplete-plus": "2.15.1", "autocomplete-snippets": "1.6.1", "autoflow": "0.23.0", "autosave": "0.20.0", From a937dc2fd4c87c06f7fbf25244564c07905b580a Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Wed, 13 May 2015 11:30:35 -0700 Subject: [PATCH 268/335] Dont remove symlinked autocomplete-plus packages --- spec/package-manager-spec.coffee | 9 ++++++--- src/package-manager.coffee | 4 +--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/spec/package-manager-spec.coffee b/spec/package-manager-spec.coffee index 1cd961936..1244ab984 100644 --- a/spec/package-manager-spec.coffee +++ b/spec/package-manager-spec.coffee @@ -845,13 +845,16 @@ describe "PackageManager", -> jasmine.unspy(atom.packages, 'uninstallAutocompletePlus') + afterEach -> + try + fs.unlink autocompletePlusPath, -> + it "removes the packages", -> atom.packages.loadPackages() waitsFor -> - not fs.isDirectorySync(autocompleteCSSPath) and - not fs.isSymbolicLinkSync(autocompletePlusPath) + not fs.isDirectorySync(autocompleteCSSPath) runs -> expect(fs.isDirectorySync(autocompleteCSSPath)).toBe false - expect(fs.isSymbolicLinkSync(autocompletePlusPath)).toBe false + expect(fs.isSymbolicLinkSync(autocompletePlusPath)).toBe true diff --git a/src/package-manager.coffee b/src/package-manager.coffee index 1262aa59e..606f72eda 100644 --- a/src/package-manager.coffee +++ b/src/package-manager.coffee @@ -443,9 +443,7 @@ class PackageManager Promise.all([symlinkPromise, dirPromise]).then (values) -> [isSymLink, isDir] = values - if isSymLink - fs.unlink directory, -> - else if isDir + if not isSymLink and isDir fs.remove directory, -> if Grim.includeDeprecatedAPIs From 27319c43003a4bd03abd53262e6846210ca754e1 Mon Sep 17 00:00:00 2001 From: Jess Lin Date: Wed, 13 May 2015 10:52:25 -0700 Subject: [PATCH 269/335] [Gutter] Fix CustomGutterComponent spec --- spec/custom-gutter-component-spec.coffee | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/spec/custom-gutter-component-spec.coffee b/spec/custom-gutter-component-spec.coffee index 21db68653..4b7d81fba 100644 --- a/spec/custom-gutter-component-spec.coffee +++ b/spec/custom-gutter-component-spec.coffee @@ -30,15 +30,12 @@ describe "CustomGutterComponent", -> buildTestState = (customDecorations) -> mockTestState = - gutters: + content: if customDecorations then customDecorations else {} + styles: scrollHeight: 100 scrollTop: 10 backgroundColor: 'black' - sortedDescriptions: [{gutter, visible: true}] - customDecorations: customDecorations - lineNumberGutter: - maxLineNumberDigits: 10 - lineNumbers: {} + mockTestState it "sets the custom-decoration wrapper's scrollHeight, scrollTop, and background color", -> @@ -53,7 +50,7 @@ describe "CustomGutterComponent", -> expect(decorationsWrapperNode.style.backgroundColor).not.toBe '' it "creates a new DOM node for a new decoration and adds it to the gutter at the right place", -> - customDecorations = 'test-gutter': + customDecorations = 'decoration-id-1': top: 0 height: 10 @@ -75,7 +72,7 @@ describe "CustomGutterComponent", -> expect(decorationItem).toBe decorationItem1 it "updates the existing DOM node for a decoration that existed but has new properties", -> - initialCustomDecorations = 'test-gutter': + initialCustomDecorations = 'decoration-id-1': top: 0 height: 10 @@ -86,7 +83,7 @@ describe "CustomGutterComponent", -> # Change the dimensions and item, remove the class. decorationItem2 = document.createElement('div') - changedCustomDecorations = 'test-gutter': + changedCustomDecorations = 'decoration-id-1': top: 10 height: 20 @@ -103,7 +100,7 @@ describe "CustomGutterComponent", -> expect(decorationItem).toBe decorationItem2 # Remove the item, add a class. - changedCustomDecorations = 'test-gutter': + changedCustomDecorations = 'decoration-id-1': top: 10 height: 20 @@ -118,7 +115,7 @@ describe "CustomGutterComponent", -> expect(changedDecorationNode.children.length).toBe 0 it "removes any decorations that existed previously but aren't in the latest update", -> - customDecorations = 'test-gutter': + customDecorations = 'decoration-id-1': top: 0 height: 10 @@ -127,6 +124,6 @@ describe "CustomGutterComponent", -> decorationsWrapperNode = gutterComponent.getDomNode().children.item(0) expect(decorationsWrapperNode.children.length).toBe 1 - emptyCustomDecorations = 'test-gutter': {} + emptyCustomDecorations = {} gutterComponent.updateSync(buildTestState(emptyCustomDecorations)) expect(decorationsWrapperNode.children.length).toBe 0 From a84c79c65034e9bf0d9674a6b1e186afc46c9bb6 Mon Sep 17 00:00:00 2001 From: Jess Lin Date: Wed, 13 May 2015 12:01:00 -0700 Subject: [PATCH 270/335] [Gutter] Fix GutterContainerComponent spec --- spec/gutter-container-component-spec.coffee | 57 ++++++++++----------- 1 file changed, 27 insertions(+), 30 deletions(-) diff --git a/spec/gutter-container-component-spec.coffee b/spec/gutter-container-component-spec.coffee index 218d8aae2..5d815fea8 100644 --- a/spec/gutter-container-component-spec.coffee +++ b/spec/gutter-container-component-spec.coffee @@ -5,17 +5,20 @@ describe "GutterContainerComponent", -> [gutterContainerComponent] = [] mockGutterContainer = {} - buildTestState = (sortedDescriptions) -> - mockTestState = - gutters: - scrollHeight: 100 - scrollTop: 10 - backgroundColor: 'black' - sortedDescriptions: sortedDescriptions - customDecorations: {} - lineNumberGutter: - maxLineNumberDigits: 10 - lineNumbers: {} + buildTestState = (gutters) -> + styles = + scrollHeight: 100 + scrollTop: 10 + backgroundColor: 'black' + + mockTestState = {gutters: []} + for gutter in gutters + if gutter.name is 'line-number' + content = {maxLineNumberDigits: 10, lineNumbers: {}} + else + content = {} + mockTestState.gutters.push({gutter, styles, content, visible: gutter.visible}) + mockTestState beforeEach -> @@ -30,7 +33,7 @@ describe "GutterContainerComponent", -> describe "when updated with state that contains a new line-number gutter", -> it "adds a LineNumberGutterComponent to its children", -> lineNumberGutter = new Gutter(mockGutterContainer, {name: 'line-number'}) - testState = buildTestState([{gutter: lineNumberGutter, visible: true}]) + testState = buildTestState([lineNumberGutter]) expect(gutterContainerComponent.getDomNode().children.length).toBe 0 gutterContainerComponent.updateSync(testState) @@ -45,7 +48,7 @@ describe "GutterContainerComponent", -> describe "when updated with state that contains a new custom gutter", -> it "adds a CustomGutterComponent to its children", -> customGutter = new Gutter(mockGutterContainer, {name: 'custom'}) - testState = buildTestState([{gutter: customGutter, visible: true}]) + testState = buildTestState([customGutter]) expect(gutterContainerComponent.getDomNode().children.length).toBe 0 gutterContainerComponent.updateSync(testState) @@ -57,15 +60,16 @@ describe "GutterContainerComponent", -> describe "when updated with state that contains a new gutter that is not visible", -> it "creates the gutter view but hides it, and unhides it when it is later updated to be visible", -> - customGutter = new Gutter(mockGutterContainer, {name: 'custom'}) - testState = buildTestState([{gutter: customGutter, visible: false}]) + customGutter = new Gutter(mockGutterContainer, {name: 'custom', visible: false}) + testState = buildTestState([customGutter]) gutterContainerComponent.updateSync(testState) expect(gutterContainerComponent.getDomNode().children.length).toBe 1 expectedCustomGutterNode = gutterContainerComponent.getDomNode().children.item(0) expect(expectedCustomGutterNode.style.display).toBe 'none' - testState = buildTestState([{gutter: customGutter, visible: true}]) + customGutter.show() + testState = buildTestState([customGutter]) gutterContainerComponent.updateSync(testState) expect(gutterContainerComponent.getDomNode().children.length).toBe 1 expectedCustomGutterNode = gutterContainerComponent.getDomNode().children.item(0) @@ -74,20 +78,20 @@ describe "GutterContainerComponent", -> describe "when updated with a gutter that already exists", -> it "reuses the existing gutter view, instead of recreating it", -> customGutter = new Gutter(mockGutterContainer, {name: 'custom'}) - testState = buildTestState([{gutter: customGutter, visible: true}]) + testState = buildTestState([customGutter]) gutterContainerComponent.updateSync(testState) expect(gutterContainerComponent.getDomNode().children.length).toBe 1 expectedCustomGutterNode = gutterContainerComponent.getDomNode().children.item(0) - testState = buildTestState([{gutter: customGutter, visible: true}]) + testState = buildTestState([customGutter]) gutterContainerComponent.updateSync(testState) expect(gutterContainerComponent.getDomNode().children.length).toBe 1 expect(gutterContainerComponent.getDomNode().children.item(0)).toBe expectedCustomGutterNode it "removes a gutter from the DOM if it does not appear in the latest state update", -> lineNumberGutter = new Gutter(mockGutterContainer, {name: 'line-number'}) - testState = buildTestState([{gutter: lineNumberGutter, visible: true}]) + testState = buildTestState([lineNumberGutter]) gutterContainerComponent.updateSync(testState) expect(gutterContainerComponent.getDomNode().children.length).toBe 1 @@ -99,7 +103,7 @@ describe "GutterContainerComponent", -> it "positions (and repositions) the gutters to match the order they appear in each state update", -> lineNumberGutter = new Gutter(mockGutterContainer, {name: 'line-number'}) customGutter1 = new Gutter(mockGutterContainer, {name: 'custom', priority: -100}) - testState = buildTestState([{gutter: customGutter1, visible: true}, {gutter: lineNumberGutter, visible: true}]) + testState = buildTestState([customGutter1, lineNumberGutter]) gutterContainerComponent.updateSync(testState) expect(gutterContainerComponent.getDomNode().children.length).toBe 2 @@ -110,11 +114,7 @@ describe "GutterContainerComponent", -> # Add a gutter. customGutter2 = new Gutter(mockGutterContainer, {name: 'custom2', priority: -10}) - testState = buildTestState([ - {gutter: customGutter1, visible: true}, - {gutter: customGutter2, visible: true}, - {gutter: lineNumberGutter, visible: true} - ]) + testState = buildTestState([customGutter1, customGutter2, lineNumberGutter]) gutterContainerComponent.updateSync(testState) expect(gutterContainerComponent.getDomNode().children.length).toBe 3 expectedCustomGutterNode1 = gutterContainerComponent.getDomNode().children.item(0) @@ -125,12 +125,9 @@ describe "GutterContainerComponent", -> expect(expectedLineNumbersNode).toBe atom.views.getView(lineNumberGutter) # Hide one gutter, reposition one gutter, remove one gutter; and add a new gutter. + customGutter2.hide() customGutter3 = new Gutter(mockGutterContainer, {name: 'custom3', priority: 100}) - testState = buildTestState([ - {gutter: customGutter2, visible: false}, - {gutter: customGutter1, visible: true}, - {gutter: customGutter3, visible: true} - ]) + testState = buildTestState([customGutter2, customGutter1, customGutter3]) gutterContainerComponent.updateSync(testState) expect(gutterContainerComponent.getDomNode().children.length).toBe 3 expectedCustomGutterNode2 = gutterContainerComponent.getDomNode().children.item(0) From bcd20a7cd27f8efb795485efa641c6c84808fd94 Mon Sep 17 00:00:00 2001 From: Michael Bolin Date: Wed, 13 May 2015 15:06:23 -0700 Subject: [PATCH 271/335] Do not create an AutoUpdateManager when in test mode. --- src/browser/atom-application.coffee | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/browser/atom-application.coffee b/src/browser/atom-application.coffee index af6a45763..3e1f19f17 100644 --- a/src/browser/atom-application.coffee +++ b/src/browser/atom-application.coffee @@ -1,7 +1,6 @@ AtomWindow = require './atom-window' ApplicationMenu = require './application-menu' AtomProtocolHandler = require './atom-protocol-handler' -AutoUpdateManager = require './auto-update-manager' BrowserWindow = require 'browser-window' StorageFolder = require '../storage-folder' Menu = require 'menu' @@ -71,7 +70,9 @@ class AtomApplication @pathsToOpen ?= [] @windows = [] - @autoUpdateManager = new AutoUpdateManager(@version) + unless options.test + AutoUpdateManager = require './auto-update-manager' + @autoUpdateManager = new AutoUpdateManager(@version) @applicationMenu = new ApplicationMenu(@version) @atomProtocolHandler = new AtomProtocolHandler(@resourcePath, @safeMode) @@ -110,8 +111,9 @@ class AtomApplication addWindow: (window) -> @windows.push window @applicationMenu?.addWindow(window.browserWindow) - window.once 'window:loaded', => - @autoUpdateManager.emitUpdateAvailableEvent(window) + if @autoUpdateManager + window.once 'window:loaded', => + @autoUpdateManager.emitUpdateAvailableEvent(window) unless window.isSpec focusHandler = => @lastFocusedWindow = window @@ -185,8 +187,8 @@ class AtomApplication @on 'application:report-issue', -> require('shell').openExternal('https://github.com/atom/atom/blob/master/CONTRIBUTING.md#submitting-issues') @on 'application:search-issues', -> require('shell').openExternal('https://github.com/issues?q=+is%3Aissue+user%3Aatom') - @on 'application:install-update', -> @autoUpdateManager.install() - @on 'application:check-for-update', => @autoUpdateManager.check() + @on 'application:install-update', -> @autoUpdateManager?.install() + @on 'application:check-for-update', => @autoUpdateManager?.check() if process.platform is 'darwin' @on 'application:about', -> Menu.sendActionToFirstResponder('orderFrontStandardAboutPanel:') From 356fa4ac24888221063d39657f938c867ea6f2f2 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 13 May 2015 15:21:20 -0700 Subject: [PATCH 272/335] :art: --- src/browser/atom-application.coffee | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/browser/atom-application.coffee b/src/browser/atom-application.coffee index 3e1f19f17..0080e3639 100644 --- a/src/browser/atom-application.coffee +++ b/src/browser/atom-application.coffee @@ -73,6 +73,7 @@ class AtomApplication unless options.test AutoUpdateManager = require './auto-update-manager' @autoUpdateManager = new AutoUpdateManager(@version) + @applicationMenu = new ApplicationMenu(@version) @atomProtocolHandler = new AtomProtocolHandler(@resourcePath, @safeMode) @@ -111,7 +112,8 @@ class AtomApplication addWindow: (window) -> @windows.push window @applicationMenu?.addWindow(window.browserWindow) - if @autoUpdateManager + + if @autoUpdateManager? window.once 'window:loaded', => @autoUpdateManager.emitUpdateAvailableEvent(window) @@ -187,8 +189,9 @@ class AtomApplication @on 'application:report-issue', -> require('shell').openExternal('https://github.com/atom/atom/blob/master/CONTRIBUTING.md#submitting-issues') @on 'application:search-issues', -> require('shell').openExternal('https://github.com/issues?q=+is%3Aissue+user%3Aatom') - @on 'application:install-update', -> @autoUpdateManager?.install() - @on 'application:check-for-update', => @autoUpdateManager?.check() + if @autoUpdateManager? + @on 'application:install-update', => @autoUpdateManager.install() + @on 'application:check-for-update', => @autoUpdateManager.check() if process.platform is 'darwin' @on 'application:about', -> Menu.sendActionToFirstResponder('orderFrontStandardAboutPanel:') From 720deff1cdb30c426a73ebaca0ab5e28d48e8155 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 13 May 2015 15:26:23 -0700 Subject: [PATCH 273/335] :arrow_up: grim@1.4.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3614b5f26..855256bfb 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "fstream": "0.1.24", "fuzzaldrin": "^2.1", "git-utils": "^3.0.0", - "grim": "1.4.0", + "grim": "1.4.1", "hosted-git-info": "^2.1.2", "jasmine-json": "~0.0", "jasmine-tagged": "^1.1.4", From c8d6d883f3356d1fdb1d78c672054e6693337265 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 13 May 2015 15:30:00 -0700 Subject: [PATCH 274/335] :arrow_up: deprecation-cop@0.47 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 855256bfb..19b6a19e8 100644 --- a/package.json +++ b/package.json @@ -96,7 +96,7 @@ "bookmarks": "0.35.0", "bracket-matcher": "0.74.0", "command-palette": "0.35.0", - "deprecation-cop": "0.46.0", + "deprecation-cop": "0.47.0", "dev-live-reload": "0.46.0", "encoding-selector": "0.20.0", "exception-reporting": "0.24.0", From 2195b1a38d7e28b291199b21e0f3a6595b8ca59c Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 13 May 2015 15:33:56 -0700 Subject: [PATCH 275/335] Pass auto update manager into application menu --- src/browser/application-menu.coffee | 7 +++---- src/browser/atom-application.coffee | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/browser/application-menu.coffee b/src/browser/application-menu.coffee index a845c682f..7fc548892 100644 --- a/src/browser/application-menu.coffee +++ b/src/browser/application-menu.coffee @@ -9,11 +9,10 @@ _ = require 'underscore-plus' # and maintain the state of all menu items. module.exports = class ApplicationMenu - constructor: (@version) -> + constructor: (@version, @autoUpdateManager) -> @windowTemplates = new WeakMap() @setActiveTemplate(@getDefaultTemplate()) - global.atomApplication.autoUpdateManager.on 'state-changed', (state) => - @showUpdateMenuItem(state) + @autoUpdateManager?.on 'state-changed', (state) => @showUpdateMenuItem(state) # Public: Updates the entire menu with the given keybindings. # @@ -33,7 +32,7 @@ class ApplicationMenu @menu = Menu.buildFromTemplate(_.deepClone(template)) Menu.setApplicationMenu(@menu) - @showUpdateMenuItem(global.atomApplication.autoUpdateManager.getState()) + @showUpdateMenuItem(@autoUpdateManager.getState()) if @autoUpdateManager? # Register a BrowserWindow with this application menu. addWindow: (window) -> diff --git a/src/browser/atom-application.coffee b/src/browser/atom-application.coffee index 0080e3639..0dc269080 100644 --- a/src/browser/atom-application.coffee +++ b/src/browser/atom-application.coffee @@ -74,7 +74,7 @@ class AtomApplication AutoUpdateManager = require './auto-update-manager' @autoUpdateManager = new AutoUpdateManager(@version) - @applicationMenu = new ApplicationMenu(@version) + @applicationMenu = new ApplicationMenu(@version, @autoUpdateManager) @atomProtocolHandler = new AtomProtocolHandler(@resourcePath, @safeMode) @listenForArgumentsFromNewProcess() From d319d17dcdf6ce86dbd29adda226f240a9142a16 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 13 May 2015 15:35:27 -0700 Subject: [PATCH 276/335] Always call showUpdateMenuItem --- src/browser/application-menu.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/browser/application-menu.coffee b/src/browser/application-menu.coffee index 7fc548892..e3885de00 100644 --- a/src/browser/application-menu.coffee +++ b/src/browser/application-menu.coffee @@ -32,7 +32,7 @@ class ApplicationMenu @menu = Menu.buildFromTemplate(_.deepClone(template)) Menu.setApplicationMenu(@menu) - @showUpdateMenuItem(@autoUpdateManager.getState()) if @autoUpdateManager? + @showUpdateMenuItem(@autoUpdateManager?.getState()) # Register a BrowserWindow with this application menu. addWindow: (window) -> From cb223fa03e9015fbfb5bb8a46a535d12d4690d7c Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 13 May 2015 15:55:17 -0700 Subject: [PATCH 277/335] Don't check for updates in test mode --- src/browser/application-menu.coffee | 4 ++-- src/browser/atom-application.coffee | 16 ++++++---------- src/browser/auto-update-manager.coffee | 4 ++-- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/src/browser/application-menu.coffee b/src/browser/application-menu.coffee index e3885de00..74da80e43 100644 --- a/src/browser/application-menu.coffee +++ b/src/browser/application-menu.coffee @@ -12,7 +12,7 @@ class ApplicationMenu constructor: (@version, @autoUpdateManager) -> @windowTemplates = new WeakMap() @setActiveTemplate(@getDefaultTemplate()) - @autoUpdateManager?.on 'state-changed', (state) => @showUpdateMenuItem(state) + @autoUpdateManager.on 'state-changed', (state) => @showUpdateMenuItem(state) # Public: Updates the entire menu with the given keybindings. # @@ -32,7 +32,7 @@ class ApplicationMenu @menu = Menu.buildFromTemplate(_.deepClone(template)) Menu.setApplicationMenu(@menu) - @showUpdateMenuItem(@autoUpdateManager?.getState()) + @showUpdateMenuItem(@autoUpdateManager.getState()) # Register a BrowserWindow with this application menu. addWindow: (window) -> diff --git a/src/browser/atom-application.coffee b/src/browser/atom-application.coffee index 0dc269080..09738b452 100644 --- a/src/browser/atom-application.coffee +++ b/src/browser/atom-application.coffee @@ -1,6 +1,7 @@ AtomWindow = require './atom-window' ApplicationMenu = require './application-menu' AtomProtocolHandler = require './atom-protocol-handler' +AutoUpdateManager = require './auto-update-manager' BrowserWindow = require 'browser-window' StorageFolder = require '../storage-folder' Menu = require 'menu' @@ -70,10 +71,7 @@ class AtomApplication @pathsToOpen ?= [] @windows = [] - unless options.test - AutoUpdateManager = require './auto-update-manager' - @autoUpdateManager = new AutoUpdateManager(@version) - + @autoUpdateManager = new AutoUpdateManager(@version, options.test) @applicationMenu = new ApplicationMenu(@version, @autoUpdateManager) @atomProtocolHandler = new AtomProtocolHandler(@resourcePath, @safeMode) @@ -113,9 +111,8 @@ class AtomApplication @windows.push window @applicationMenu?.addWindow(window.browserWindow) - if @autoUpdateManager? - window.once 'window:loaded', => - @autoUpdateManager.emitUpdateAvailableEvent(window) + window.once 'window:loaded', => + @autoUpdateManager.emitUpdateAvailableEvent(window) unless window.isSpec focusHandler = => @lastFocusedWindow = window @@ -189,9 +186,8 @@ class AtomApplication @on 'application:report-issue', -> require('shell').openExternal('https://github.com/atom/atom/blob/master/CONTRIBUTING.md#submitting-issues') @on 'application:search-issues', -> require('shell').openExternal('https://github.com/issues?q=+is%3Aissue+user%3Aatom') - if @autoUpdateManager? - @on 'application:install-update', => @autoUpdateManager.install() - @on 'application:check-for-update', => @autoUpdateManager.check() + @on 'application:install-update', => @autoUpdateManager.install() + @on 'application:check-for-update', => @autoUpdateManager.check() if process.platform is 'darwin' @on 'application:about', -> Menu.sendActionToFirstResponder('orderFrontStandardAboutPanel:') diff --git a/src/browser/auto-update-manager.coffee b/src/browser/auto-update-manager.coffee index 358390889..7c8613be5 100644 --- a/src/browser/auto-update-manager.coffee +++ b/src/browser/auto-update-manager.coffee @@ -15,7 +15,7 @@ module.exports = class AutoUpdateManager _.extend @prototype, EventEmitter.prototype - constructor: (@version) -> + constructor: (@version, @testMode) -> @state = IdleState if process.platform is 'win32' # Squirrel for Windows can't handle query params @@ -80,7 +80,7 @@ class AutoUpdateManager autoUpdater.once 'update-not-available', @onUpdateNotAvailable autoUpdater.once 'error', @onUpdateError - autoUpdater.checkForUpdates() + autoUpdater.checkForUpdates() unless @testMode install: -> autoUpdater.quitAndInstall() From 2bbdd9446db83c21fc3198f8e5749fa547aa193e Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 13 May 2015 15:55:56 -0700 Subject: [PATCH 278/335] :art: --- src/browser/atom-application.coffee | 1 - 1 file changed, 1 deletion(-) diff --git a/src/browser/atom-application.coffee b/src/browser/atom-application.coffee index 09738b452..afc811144 100644 --- a/src/browser/atom-application.coffee +++ b/src/browser/atom-application.coffee @@ -110,7 +110,6 @@ class AtomApplication addWindow: (window) -> @windows.push window @applicationMenu?.addWindow(window.browserWindow) - window.once 'window:loaded', => @autoUpdateManager.emitUpdateAvailableEvent(window) From 6c81f7233b33505d1377b6e84a9318e2e2408d2d Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 13 May 2015 15:58:14 -0700 Subject: [PATCH 279/335] Don't quit and install in test mode --- src/browser/auto-update-manager.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/browser/auto-update-manager.coffee b/src/browser/auto-update-manager.coffee index 7c8613be5..654a8de67 100644 --- a/src/browser/auto-update-manager.coffee +++ b/src/browser/auto-update-manager.coffee @@ -83,7 +83,7 @@ class AutoUpdateManager autoUpdater.checkForUpdates() unless @testMode install: -> - autoUpdater.quitAndInstall() + autoUpdater.quitAndInstall() unless @testMode onUpdateNotAvailable: => autoUpdater.removeListener 'error', @onUpdateError From ddc603e4b8bf6c1d7aa3c11b8cd6682d9d73d176 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Wed, 13 May 2015 16:31:19 -0700 Subject: [PATCH 280/335] :arrow_up: autocomplete-html@0.7.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 19b6a19e8..5cfd5b6d0 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "autocomplete-atom-api": "0.9.0", "autocomplete-css": "0.7.2", "autocomplete-emojis": "2.2.2", - "autocomplete-html": "0.7.1", + "autocomplete-html": "0.7.2", "autocomplete-plus": "2.15.1", "autocomplete-snippets": "1.6.1", "autoflow": "0.23.0", From fdb696f4dc2305b98d002caee745108db25ac410 Mon Sep 17 00:00:00 2001 From: Jess Lin Date: Wed, 13 May 2015 14:21:27 -0700 Subject: [PATCH 281/335] [Gutter] Fix line-number gutter tests in TextEditorPresenter specs --- spec/text-editor-presenter-spec.coffee | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/spec/text-editor-presenter-spec.coffee b/spec/text-editor-presenter-spec.coffee index de2dd780d..5f82a64bc 100644 --- a/spec/text-editor-presenter-spec.coffee +++ b/spec/text-editor-presenter-spec.coffee @@ -1772,15 +1772,22 @@ describe "TextEditorPresenter", -> pixelPosition: {top: 10, left: 0} } - describe ".lineNumberGutter", -> + # TODO jssln Move this under '.gutters' + describe "when the gutter is the line-number gutter", -> + getLineNumberGutterState = (presenter) -> + gutterDescriptions = presenter.getState().gutters + for description in gutterDescriptions + gutter = description.gutter + return description if gutter.name is 'line-number' + describe ".maxLineNumberDigits", -> it "is set to the number of digits used by the greatest line number", -> presenter = buildPresenter() expect(editor.getLastBufferRow()).toBe 12 - expect(presenter.getState().gutters.lineNumberGutter.maxLineNumberDigits).toBe 2 + expect(getLineNumberGutterState(presenter).content.maxLineNumberDigits).toBe 2 editor.setText("1\n2\n3") - expect(presenter.getState().gutters.lineNumberGutter.maxLineNumberDigits).toBe 1 + expect(getLineNumberGutterState(presenter).content.maxLineNumberDigits).toBe 1 describe ".lineNumbers", -> lineNumberStateForScreenRow = (presenter, screenRow) -> @@ -1792,7 +1799,7 @@ describe "TextEditorPresenter", -> else key = bufferRow - presenter.getState().gutters.lineNumberGutter.lineNumbers[key] + getLineNumberGutterState(presenter).content.lineNumbers[key] it "contains states for line numbers that are visible on screen, plus and minus the overdraw margin", -> editor.foldBufferRow(4) @@ -2025,13 +2032,14 @@ describe "TextEditorPresenter", -> presenter = buildPresenter() marker = editor.markBufferRange([[0, 0], [0, 0]]) decoration = editor.decorateMarker(marker, type: 'line-number', class: 'a') - expect(lineNumberStateForScreenRow(presenter, 0).decorationClasses).toBeNull() + # A mini editor will have no gutters. + expect(getLineNumberGutterState(presenter)).toBeUndefined() expectStateUpdate presenter, -> editor.setMini(false) expect(lineNumberStateForScreenRow(presenter, 0).decorationClasses).toEqual ['cursor-line', 'cursor-line-no-selection', 'a'] expectStateUpdate presenter, -> editor.setMini(true) - expect(lineNumberStateForScreenRow(presenter, 0).decorationClasses).toBeNull() + expect(getLineNumberGutterState(presenter)).toBeUndefined() it "only applies line-number decorations to screen rows that are spanned by their marker when lines are soft-wrapped", -> editor.setText("a line that wraps, ok") From b6055f3a675439d8c5dcc4072a405c2d05751b81 Mon Sep 17 00:00:00 2001 From: Jess Lin Date: Wed, 13 May 2015 14:46:53 -0700 Subject: [PATCH 282/335] [Gutter] Fix shared gutter styles tests in TextEditorPresenter specs --- spec/text-editor-presenter-spec.coffee | 188 ++++++++++++++++--------- 1 file changed, 119 insertions(+), 69 deletions(-) diff --git a/spec/text-editor-presenter-spec.coffee b/spec/text-editor-presenter-spec.coffee index 5f82a64bc..371bb1c6c 100644 --- a/spec/text-editor-presenter-spec.coffee +++ b/spec/text-editor-presenter-spec.coffee @@ -2114,97 +2114,147 @@ describe "TextEditorPresenter", -> expect(presenter.getState().focused).toBe false describe ".gutters", -> - describe ".scrollHeight", -> - it "is initialized based on ::lineHeight, the number of lines, and ::explicitHeight", -> - presenter = buildPresenter() - expect(presenter.getState().gutters.scrollHeight).toBe editor.getScreenLineCount() * 10 + getStateForGutterWithName = (presenter, gutterName) -> + gutterDescriptions = presenter.getState().gutters + for description in gutterDescriptions + gutter = description.gutter + return description if gutter.name is gutterName - presenter = buildPresenter(explicitHeight: 500) - expect(presenter.getState().gutters.scrollHeight).toBe 500 + it "is an array with gutter descriptions appearing in order from left to right", -> + # TODO - it "updates when the ::lineHeight changes", -> - presenter = buildPresenter() - expectStateUpdate presenter, -> presenter.setLineHeight(20) - expect(presenter.getState().gutters.scrollHeight).toBe editor.getScreenLineCount() * 20 + describe "when gutter description corresponds to a custom gutter", -> + # TODO - it "updates when the line count changes", -> - presenter = buildPresenter() - expectStateUpdate presenter, -> editor.getBuffer().append("\n\n\n") - expect(presenter.getState().gutters.scrollHeight).toBe editor.getScreenLineCount() * 10 + describe "regardless of what kind of gutter a gutter description corresponds to", -> + [customGutter] = [] - it "updates when ::explicitHeight changes", -> - presenter = buildPresenter() - expectStateUpdate presenter, -> presenter.setExplicitHeight(500) - expect(presenter.getState().gutters.scrollHeight).toBe 500 + getStylesForGutterWithName = (presenter, gutterName) -> + fullState = getStateForGutterWithName(presenter, gutterName) + return fullState.styles if fullState - it "adds the computed clientHeight to the computed scrollHeight if editor.scrollPastEnd is true", -> - presenter = buildPresenter(scrollTop: 10, explicitHeight: 50, horizontalScrollbarHeight: 10) - expectStateUpdate presenter, -> presenter.setScrollTop(300) - expect(presenter.getState().gutters.scrollHeight).toBe presenter.contentHeight + beforeEach -> + customGutter = editor.addGutter({name: 'test-gutter', priority: -1, visible: true}) - expectStateUpdate presenter, -> atom.config.set("editor.scrollPastEnd", true) - expect(presenter.getState().gutters.scrollHeight).toBe presenter.contentHeight + presenter.clientHeight - (presenter.lineHeight * 3) + afterEach => + customGutter.destroy() - expectStateUpdate presenter, -> atom.config.set("editor.scrollPastEnd", false) - expect(presenter.getState().gutters.scrollHeight).toBe presenter.contentHeight + describe ".scrollHeight", -> + it "is initialized based on ::lineHeight, the number of lines, and ::explicitHeight", -> + presenter = buildPresenter() + expect(getStylesForGutterWithName(presenter, 'line-number').scrollHeight).toBe editor.getScreenLineCount() * 10 + expect(getStylesForGutterWithName(presenter, 'test-gutter').scrollHeight).toBe editor.getScreenLineCount() * 10 - describe ".scrollTop", -> - it "tracks the value of ::scrollTop", -> - presenter = buildPresenter(scrollTop: 10, explicitHeight: 20) - expect(presenter.getState().gutters.scrollTop).toBe 10 - expectStateUpdate presenter, -> presenter.setScrollTop(50) - expect(presenter.getState().gutters.scrollTop).toBe 50 + presenter = buildPresenter(explicitHeight: 500) + expect(getStylesForGutterWithName(presenter, 'line-number').scrollHeight).toBe 500 + expect(getStylesForGutterWithName(presenter, 'test-gutter').scrollHeight).toBe 500 - it "never exceeds the computed scrollHeight minus the computed clientHeight", -> - presenter = buildPresenter(scrollTop: 10, explicitHeight: 50, horizontalScrollbarHeight: 10) - expectStateUpdate presenter, -> presenter.setScrollTop(100) - expect(presenter.getState().gutters.scrollTop).toBe presenter.scrollHeight - presenter.clientHeight + it "updates when the ::lineHeight changes", -> + presenter = buildPresenter() + expectStateUpdate presenter, -> presenter.setLineHeight(20) + expect(getStylesForGutterWithName(presenter, 'line-number').scrollHeight).toBe editor.getScreenLineCount() * 20 + expect(getStylesForGutterWithName(presenter, 'test-gutter').scrollHeight).toBe editor.getScreenLineCount() * 20 - expectStateUpdate presenter, -> presenter.setExplicitHeight(60) - expect(presenter.getState().gutters.scrollTop).toBe presenter.scrollHeight - presenter.clientHeight + it "updates when the line count changes", -> + presenter = buildPresenter() + expectStateUpdate presenter, -> editor.getBuffer().append("\n\n\n") + expect(getStylesForGutterWithName(presenter, 'line-number').scrollHeight).toBe editor.getScreenLineCount() * 10 + expect(getStylesForGutterWithName(presenter, 'test-gutter').scrollHeight).toBe editor.getScreenLineCount() * 10 - expectStateUpdate presenter, -> presenter.setHorizontalScrollbarHeight(5) - expect(presenter.getState().gutters.scrollTop).toBe presenter.scrollHeight - presenter.clientHeight + it "updates when ::explicitHeight changes", -> + presenter = buildPresenter() + expectStateUpdate presenter, -> presenter.setExplicitHeight(500) + expect(getStylesForGutterWithName(presenter, 'line-number').scrollHeight).toBe 500 + expect(getStylesForGutterWithName(presenter, 'test-gutter').scrollHeight).toBe 500 - expectStateUpdate presenter, -> editor.getBuffer().delete([[8, 0], [12, 0]]) - expect(presenter.getState().gutters.scrollTop).toBe presenter.scrollHeight - presenter.clientHeight + it "adds the computed clientHeight to the computed scrollHeight if editor.scrollPastEnd is true", -> + presenter = buildPresenter(scrollTop: 10, explicitHeight: 50, horizontalScrollbarHeight: 10) + expectStateUpdate presenter, -> presenter.setScrollTop(300) + expect(getStylesForGutterWithName(presenter, 'line-number').scrollHeight).toBe presenter.contentHeight + expect(getStylesForGutterWithName(presenter, 'test-gutter').scrollHeight).toBe presenter.contentHeight - # Scroll top only gets smaller when needed as dimensions change, never bigger - scrollTopBefore = presenter.getState().verticalScrollbar.scrollTop - expectStateUpdate presenter, -> editor.getBuffer().insert([9, Infinity], '\n\n\n') - expect(presenter.getState().gutters.scrollTop).toBe scrollTopBefore + expectStateUpdate presenter, -> atom.config.set("editor.scrollPastEnd", true) + expect(getStylesForGutterWithName(presenter, 'line-number').scrollHeight).toBe presenter.contentHeight + presenter.clientHeight - (presenter.lineHeight * 3) + expect(getStylesForGutterWithName(presenter, 'test-gutter').scrollHeight).toBe presenter.contentHeight + presenter.clientHeight - (presenter.lineHeight * 3) - it "never goes negative", -> - presenter = buildPresenter(scrollTop: 10, explicitHeight: 50, horizontalScrollbarHeight: 10) - expectStateUpdate presenter, -> presenter.setScrollTop(-100) - expect(presenter.getState().gutters.scrollTop).toBe 0 + expectStateUpdate presenter, -> atom.config.set("editor.scrollPastEnd", false) + expect(getStylesForGutterWithName(presenter, 'line-number').scrollHeight).toBe presenter.contentHeight + expect(getStylesForGutterWithName(presenter, 'test-gutter').scrollHeight).toBe presenter.contentHeight - it "adds the computed clientHeight to the computed scrollHeight if editor.scrollPastEnd is true", -> - presenter = buildPresenter(scrollTop: 10, explicitHeight: 50, horizontalScrollbarHeight: 10) - expectStateUpdate presenter, -> presenter.setScrollTop(300) - expect(presenter.getState().gutters.scrollTop).toBe presenter.contentHeight - presenter.clientHeight + describe ".scrollTop", -> + it "tracks the value of ::scrollTop", -> + presenter = buildPresenter(scrollTop: 10, explicitHeight: 20) + expect(getStylesForGutterWithName(presenter, 'line-number').scrollTop).toBe 10 + expect(getStylesForGutterWithName(presenter, 'test-gutter').scrollTop).toBe 10 + expectStateUpdate presenter, -> presenter.setScrollTop(50) + expect(getStylesForGutterWithName(presenter, 'line-number').scrollTop).toBe 50 + expect(getStylesForGutterWithName(presenter, 'test-gutter').scrollTop).toBe 50 - atom.config.set("editor.scrollPastEnd", true) - expectStateUpdate presenter, -> presenter.setScrollTop(300) - expect(presenter.getState().gutters.scrollTop).toBe presenter.contentHeight - (presenter.lineHeight * 3) + it "never exceeds the computed scrollHeight minus the computed clientHeight", -> + presenter = buildPresenter(scrollTop: 10, explicitHeight: 50, horizontalScrollbarHeight: 10) + expectStateUpdate presenter, -> presenter.setScrollTop(100) + expect(getStylesForGutterWithName(presenter, 'line-number').scrollTop).toBe presenter.scrollHeight - presenter.clientHeight + expect(getStylesForGutterWithName(presenter, 'test-gutter').scrollTop).toBe presenter.scrollHeight - presenter.clientHeight - expectStateUpdate presenter, -> atom.config.set("editor.scrollPastEnd", false) - expect(presenter.getState().gutters.scrollTop).toBe presenter.contentHeight - presenter.clientHeight + expectStateUpdate presenter, -> presenter.setExplicitHeight(60) + expect(getStylesForGutterWithName(presenter, 'line-number').scrollTop).toBe presenter.scrollHeight - presenter.clientHeight + expect(getStylesForGutterWithName(presenter, 'test-gutter').scrollTop).toBe presenter.scrollHeight - presenter.clientHeight - describe ".backgroundColor", -> - it "is assigned to ::gutterBackgroundColor if present, and to ::backgroundColor otherwise", -> - presenter = buildPresenter(backgroundColor: "rgba(255, 0, 0, 0)", gutterBackgroundColor: "rgba(0, 255, 0, 0)") - expect(presenter.getState().gutters.backgroundColor).toBe "rgba(0, 255, 0, 0)" + expectStateUpdate presenter, -> presenter.setHorizontalScrollbarHeight(5) + expect(getStylesForGutterWithName(presenter, 'line-number').scrollTop).toBe presenter.scrollHeight - presenter.clientHeight + expect(getStylesForGutterWithName(presenter, 'test-gutter').scrollTop).toBe presenter.scrollHeight - presenter.clientHeight - expectStateUpdate presenter, -> presenter.setGutterBackgroundColor("rgba(0, 0, 255, 0)") - expect(presenter.getState().gutters.backgroundColor).toBe "rgba(0, 0, 255, 0)" + expectStateUpdate presenter, -> editor.getBuffer().delete([[8, 0], [12, 0]]) + expect(getStylesForGutterWithName(presenter, 'line-number').scrollTop).toBe presenter.scrollHeight - presenter.clientHeight + expect(getStylesForGutterWithName(presenter, 'test-gutter').scrollTop).toBe presenter.scrollHeight - presenter.clientHeight - expectStateUpdate presenter, -> presenter.setGutterBackgroundColor("rgba(0, 0, 0, 0)") - expect(presenter.getState().gutters.backgroundColor).toBe "rgba(255, 0, 0, 0)" + # Scroll top only gets smaller when needed as dimensions change, never bigger + scrollTopBefore = presenter.getState().verticalScrollbar.scrollTop + expectStateUpdate presenter, -> editor.getBuffer().insert([9, Infinity], '\n\n\n') + expect(getStylesForGutterWithName(presenter, 'line-number').scrollTop).toBe scrollTopBefore + expect(getStylesForGutterWithName(presenter, 'test-gutter').scrollTop).toBe scrollTopBefore - expectStateUpdate presenter, -> presenter.setBackgroundColor("rgba(0, 0, 255, 0)") - expect(presenter.getState().gutters.backgroundColor).toBe "rgba(0, 0, 255, 0)" + it "never goes negative", -> + presenter = buildPresenter(scrollTop: 10, explicitHeight: 50, horizontalScrollbarHeight: 10) + expectStateUpdate presenter, -> presenter.setScrollTop(-100) + expect(getStylesForGutterWithName(presenter, 'line-number').scrollTop).toBe 0 + expect(getStylesForGutterWithName(presenter, 'test-gutter').scrollTop).toBe 0 + it "adds the computed clientHeight to the computed scrollHeight if editor.scrollPastEnd is true", -> + presenter = buildPresenter(scrollTop: 10, explicitHeight: 50, horizontalScrollbarHeight: 10) + expectStateUpdate presenter, -> presenter.setScrollTop(300) + expect(getStylesForGutterWithName(presenter, 'line-number').scrollTop).toBe presenter.contentHeight - presenter.clientHeight + expect(getStylesForGutterWithName(presenter, 'test-gutter').scrollTop).toBe presenter.contentHeight - presenter.clientHeight + + atom.config.set("editor.scrollPastEnd", true) + expectStateUpdate presenter, -> presenter.setScrollTop(300) + expect(getStylesForGutterWithName(presenter, 'line-number').scrollTop).toBe presenter.contentHeight - (presenter.lineHeight * 3) + expect(getStylesForGutterWithName(presenter, 'test-gutter').scrollTop).toBe presenter.contentHeight - (presenter.lineHeight * 3) + + expectStateUpdate presenter, -> atom.config.set("editor.scrollPastEnd", false) + expect(getStylesForGutterWithName(presenter, 'line-number').scrollTop).toBe presenter.contentHeight - presenter.clientHeight + expect(getStylesForGutterWithName(presenter, 'test-gutter').scrollTop).toBe presenter.contentHeight - presenter.clientHeight + + describe ".backgroundColor", -> + it "is assigned to ::gutterBackgroundColor if present, and to ::backgroundColor otherwise", -> + presenter = buildPresenter(backgroundColor: "rgba(255, 0, 0, 0)", gutterBackgroundColor: "rgba(0, 255, 0, 0)") + expect(getStylesForGutterWithName(presenter, 'line-number').backgroundColor).toBe "rgba(0, 255, 0, 0)" + expect(getStylesForGutterWithName(presenter, 'test-gutter').backgroundColor).toBe "rgba(0, 255, 0, 0)" + + expectStateUpdate presenter, -> presenter.setGutterBackgroundColor("rgba(0, 0, 255, 0)") + expect(getStylesForGutterWithName(presenter, 'line-number').backgroundColor).toBe "rgba(0, 0, 255, 0)" + expect(getStylesForGutterWithName(presenter, 'test-gutter').backgroundColor).toBe "rgba(0, 0, 255, 0)" + + expectStateUpdate presenter, -> presenter.setGutterBackgroundColor("rgba(0, 0, 0, 0)") + expect(getStylesForGutterWithName(presenter, 'line-number').backgroundColor).toBe "rgba(255, 0, 0, 0)" + expect(getStylesForGutterWithName(presenter, 'test-gutter').backgroundColor).toBe "rgba(255, 0, 0, 0)" + + expectStateUpdate presenter, -> presenter.setBackgroundColor("rgba(0, 0, 255, 0)") + expect(getStylesForGutterWithName(presenter, 'line-number').backgroundColor).toBe "rgba(0, 0, 255, 0)" + expect(getStylesForGutterWithName(presenter, 'test-gutter').backgroundColor).toBe "rgba(0, 0, 255, 0)" + + + # TODO describe ".sortedDescriptions", -> gutterDescriptionWithName = (presenter, name) -> for gutterDesc in presenter.getState().gutters.sortedDescriptions From cd806ee7641852ceb1e2e5390d76cd401aa87485 Mon Sep 17 00:00:00 2001 From: Jess Lin Date: Wed, 13 May 2015 15:32:25 -0700 Subject: [PATCH 283/335] [Gutter] Fix former .sortedDescription tests in TextEditorPresenter specs --- spec/text-editor-presenter-spec.coffee | 133 ++++++++++++------------- 1 file changed, 61 insertions(+), 72 deletions(-) diff --git a/spec/text-editor-presenter-spec.coffee b/spec/text-editor-presenter-spec.coffee index 371bb1c6c..601539894 100644 --- a/spec/text-editor-presenter-spec.coffee +++ b/spec/text-editor-presenter-spec.coffee @@ -1780,7 +1780,43 @@ describe "TextEditorPresenter", -> gutter = description.gutter return description if gutter.name is 'line-number' - describe ".maxLineNumberDigits", -> + describe ".visible", -> + it "is true iff the editor isn't mini, ::isLineNumberGutterVisible is true on the editor, and the 'editor.showLineNumbers' config is enabled", -> + presenter = buildPresenter() + + expect(editor.isLineNumberGutterVisible()).toBe true + expect(getLineNumberGutterState(presenter).visible).toBe true + + expectStateUpdate presenter, -> editor.setMini(true) + expect(getLineNumberGutterState(presenter)).toBeUndefined() + + expectStateUpdate presenter, -> editor.setMini(false) + expect(getLineNumberGutterState(presenter).visible).toBe true + + expectStateUpdate presenter, -> editor.setLineNumberGutterVisible(false) + expect(getLineNumberGutterState(presenter).visible).toBe false + + expectStateUpdate presenter, -> editor.setLineNumberGutterVisible(true) + expect(getLineNumberGutterState(presenter).visible).toBe true + + expectStateUpdate presenter, -> atom.config.set('editor.showLineNumbers', false) + expect(getLineNumberGutterState(presenter).visible).toBe false + + it "gets updated when the editor's grammar changes", -> + presenter = buildPresenter() + + atom.config.set('editor.showLineNumbers', false, scopeSelector: '.source.js') + expect(getLineNumberGutterState(presenter).visible).toBe true + stateUpdated = false + presenter.onDidUpdateState -> stateUpdated = true + + waitsForPromise -> atom.packages.activatePackage('language-javascript') + + runs -> + expect(stateUpdated).toBe true + expect(getLineNumberGutterState(presenter).visible).toBe false + + describe ".content.maxLineNumberDigits", -> it "is set to the number of digits used by the greatest line number", -> presenter = buildPresenter() expect(editor.getLastBufferRow()).toBe 12 @@ -1789,7 +1825,7 @@ describe "TextEditorPresenter", -> editor.setText("1\n2\n3") expect(getLineNumberGutterState(presenter).content.maxLineNumberDigits).toBe 1 - describe ".lineNumbers", -> + describe ".content.lineNumbers", -> lineNumberStateForScreenRow = (presenter, screenRow) -> editor = presenter.model bufferRow = editor.bufferRowForScreenRow(screenRow) @@ -2120,8 +2156,29 @@ describe "TextEditorPresenter", -> gutter = description.gutter return description if gutter.name is gutterName - it "is an array with gutter descriptions appearing in order from left to right", -> - # TODO + describe "the array itself", -> + it "updates when gutters are added to the editor model, and keeps the gutters sorted by priority", -> + presenter = buildPresenter() + gutter1 = editor.addGutter({name: 'test-gutter-1', priority: -100, visible: true}) + gutter2 = editor.addGutter({name: 'test-gutter-2', priority: 100, visible: false}) + + expectedGutterOrder = [gutter1, editor.gutterWithName('line-number'), gutter2] + for gutterDescription, index in presenter.getState().gutters + expect(gutterDescription.gutter).toEqual expectedGutterOrder[index] + + it "updates when the visibility of a gutter changes", -> + presenter = buildPresenter() + gutter = editor.addGutter({name: 'test-gutter', visible: true}) + expect(getStateForGutterWithName(presenter, 'test-gutter').visible).toBe true + gutter.hide() + expect(getStateForGutterWithName(presenter, 'test-gutter').visible).toBe false + + it "updates when a gutter is removed", -> + presenter = buildPresenter() + gutter = editor.addGutter({name: 'test-gutter', visible: true}) + expect(getStateForGutterWithName(presenter, 'test-gutter').visible).toBe true + gutter.destroy() + expect(getStateForGutterWithName(presenter, 'test-gutter')).toBeUndefined() describe "when gutter description corresponds to a custom gutter", -> # TODO @@ -2253,75 +2310,7 @@ describe "TextEditorPresenter", -> expect(getStylesForGutterWithName(presenter, 'line-number').backgroundColor).toBe "rgba(0, 0, 255, 0)" expect(getStylesForGutterWithName(presenter, 'test-gutter').backgroundColor).toBe "rgba(0, 0, 255, 0)" - # TODO - describe ".sortedDescriptions", -> - gutterDescriptionWithName = (presenter, name) -> - for gutterDesc in presenter.getState().gutters.sortedDescriptions - return gutterDesc if gutterDesc.gutter.name is name - undefined - - describe "the line-number gutter", -> - it "is present iff the editor isn't mini, ::isLineNumberGutterVisible is true on the editor, and 'editor.showLineNumbers' is enabled in config", -> - presenter = buildPresenter() - - expect(editor.isLineNumberGutterVisible()).toBe true - expect(gutterDescriptionWithName(presenter, 'line-number').visible).toBe true - - expectStateUpdate presenter, -> editor.setMini(true) - expect(gutterDescriptionWithName(presenter, 'line-number')).toBeUndefined() - - expectStateUpdate presenter, -> editor.setMini(false) - expect(gutterDescriptionWithName(presenter, 'line-number').visible).toBe true - - expectStateUpdate presenter, -> editor.setLineNumberGutterVisible(false) - expect(gutterDescriptionWithName(presenter, 'line-number').visible).toBe false - - expectStateUpdate presenter, -> editor.setLineNumberGutterVisible(true) - expect(gutterDescriptionWithName(presenter, 'line-number').visible).toBe true - - expectStateUpdate presenter, -> atom.config.set('editor.showLineNumbers', false) - expect(gutterDescriptionWithName(presenter, 'line-number').visible).toBe false - - it "gets updated when the editor's grammar changes", -> - presenter = buildPresenter() - - atom.config.set('editor.showLineNumbers', false, scopeSelector: '.source.js') - expect(gutterDescriptionWithName(presenter, 'line-number').visible).toBe true - stateUpdated = false - presenter.onDidUpdateState -> stateUpdated = true - - waitsForPromise -> atom.packages.activatePackage('language-javascript') - - runs -> - expect(stateUpdated).toBe true - expect(gutterDescriptionWithName(presenter, 'line-number').visible).toBe false - - it "updates when gutters are added to the editor model, and keeps the gutters sorted by priority", -> - presenter = buildPresenter() - gutter1 = editor.addGutter({name: 'test-gutter-1', priority: -100, visible: true}) - gutter2 = editor.addGutter({name: 'test-gutter-2', priority: 100, visible: false}) - expectedState = [ - {gutter: gutter1, visible: true}, - {gutter: editor.gutterWithName('line-number'), visible: true}, - {gutter: gutter2, visible: false}, - ] - expect(presenter.getState().gutters.sortedDescriptions).toEqual expectedState - - it "updates when the visibility of a gutter changes", -> - presenter = buildPresenter() - gutter = editor.addGutter({name: 'test-gutter', visible: true}) - expect(gutterDescriptionWithName(presenter, 'test-gutter').visible).toBe true - gutter.hide() - expect(gutterDescriptionWithName(presenter, 'test-gutter').visible).toBe false - - it "updates when a gutter is removed", -> - presenter = buildPresenter() - gutter = editor.addGutter({name: 'test-gutter', visible: true}) - expect(gutterDescriptionWithName(presenter, 'test-gutter').visible).toBe true - gutter.destroy() - expect(gutterDescriptionWithName(presenter, 'test-gutter')).toBeUndefined() - describe ".customDecorations", -> [presenter, gutter, decorationItem, decorationParams] = [] [marker1, decoration1, marker2, decoration2, marker3, decoration3] = [] From e34dfc636c6728fafbeeb4ae030e6882b30c2f8e Mon Sep 17 00:00:00 2001 From: Jess Lin Date: Wed, 13 May 2015 16:31:20 -0700 Subject: [PATCH 284/335] [Gutter] Fix custom decorations tests in TextEditorPresenter specs --- spec/text-editor-presenter-spec.coffee | 468 ++++++++++++------------- 1 file changed, 233 insertions(+), 235 deletions(-) diff --git a/spec/text-editor-presenter-spec.coffee b/spec/text-editor-presenter-spec.coffee index 601539894..8a991e34c 100644 --- a/spec/text-editor-presenter-spec.coffee +++ b/spec/text-editor-presenter-spec.coffee @@ -2156,7 +2156,7 @@ describe "TextEditorPresenter", -> gutter = description.gutter return description if gutter.name is gutterName - describe "the array itself", -> + describe "the array itself, an array of gutter descriptions", -> it "updates when gutters are added to the editor model, and keeps the gutters sorted by priority", -> presenter = buildPresenter() gutter1 = editor.addGutter({name: 'test-gutter-1', priority: -100, visible: true}) @@ -2180,8 +2180,238 @@ describe "TextEditorPresenter", -> gutter.destroy() expect(getStateForGutterWithName(presenter, 'test-gutter')).toBeUndefined() - describe "when gutter description corresponds to a custom gutter", -> - # TODO + describe "for a gutter description that corresponds to a custom gutter", -> + describe ".content", -> + getContentForGutterWithName = (presenter, gutterName) -> + fullState = getStateForGutterWithName(presenter, gutterName) + return fullState.content if fullState + + [presenter, gutter, decorationItem, decorationParams] = [] + [marker1, decoration1, marker2, decoration2, marker3, decoration3] = [] + + # Set the scrollTop to 0 to show the very top of the file. + # Set the explicitHeight to make 10 lines visible. + scrollTop = 0 + lineHeight = 10 + explicitHeight = lineHeight * 10 + lineOverdrawMargin = 1 + + beforeEach -> + # At the beginning of each test, decoration1 and decoration2 are in visible range, + # but not decoration3. + presenter = buildPresenter({explicitHeight, scrollTop, lineHeight, lineOverdrawMargin}) + gutter = editor.addGutter({name: 'test-gutter', visible: true}) + decorationItem = document.createElement('div') + decorationItem.class = 'decoration-item' + decorationParams = + type: 'gutter' + gutterName: 'test-gutter' + class: 'test-class' + item: decorationItem + marker1 = editor.markBufferRange([[0,0],[1,0]]) + decoration1 = editor.decorateMarker(marker1, decorationParams) + marker2 = editor.markBufferRange([[9,0],[12,0]]) + decoration2 = editor.decorateMarker(marker2, decorationParams) + marker3 = editor.markBufferRange([[13,0],[14,0]]) + decoration3 = editor.decorateMarker(marker3, decorationParams) + + # Clear any batched state updates. + presenter.getState() + + it "contains all decorations within the visible buffer range", -> + decorationState = getContentForGutterWithName(presenter, 'test-gutter') + expect(decorationState[decoration1.id].top).toBe lineHeight * marker1.getScreenRange().start.row + expect(decorationState[decoration1.id].height).toBe lineHeight * marker1.getScreenRange().getRowCount() + expect(decorationState[decoration1.id].item).toBe decorationItem + expect(decorationState[decoration1.id].class).toBe 'test-class' + + expect(decorationState[decoration2.id].top).toBe lineHeight * marker2.getScreenRange().start.row + expect(decorationState[decoration2.id].height).toBe lineHeight * marker2.getScreenRange().getRowCount() + expect(decorationState[decoration2.id].item).toBe decorationItem + expect(decorationState[decoration2.id].class).toBe 'test-class' + + expect(decorationState[decoration3.id]).toBeUndefined() + + it "updates when ::scrollTop changes", -> + # This update will scroll decoration1 out of view, and decoration3 into view. + expectStateUpdate presenter, -> presenter.setScrollTop(scrollTop + lineHeight * 5) + + decorationState = getContentForGutterWithName(presenter, 'test-gutter') + expect(decorationState[decoration1.id]).toBeUndefined() + expect(decorationState[decoration2.id].top).toBeDefined() + expect(decorationState[decoration3.id].top).toBeDefined() + + it "updates when ::explicitHeight changes", -> + # This update will make all three decorations visible. + expectStateUpdate presenter, -> presenter.setExplicitHeight(explicitHeight + lineHeight * 5) + + decorationState = getContentForGutterWithName(presenter, 'test-gutter') + expect(decorationState[decoration1.id].top).toBeDefined() + expect(decorationState[decoration2.id].top).toBeDefined() + expect(decorationState[decoration3.id].top).toBeDefined() + + it "updates when ::lineHeight changes", -> + # This update will make all three decorations visible. + expectStateUpdate presenter, -> presenter.setLineHeight(Math.ceil(1.0 * explicitHeight / marker3.getBufferRange().end.row)) + + decorationState = getContentForGutterWithName(presenter, 'test-gutter') + expect(decorationState[decoration1.id].top).toBeDefined() + expect(decorationState[decoration2.id].top).toBeDefined() + expect(decorationState[decoration3.id].top).toBeDefined() + + it "updates when the editor's content changes", -> + # This update will add enough lines to push decoration2 out of view. + expectStateUpdate presenter, -> editor.setTextInBufferRange([[8,0],[9,0]],'\n\n\n\n\n') + + decorationState = getContentForGutterWithName(presenter, 'test-gutter') + expect(decorationState[decoration1.id].top).toBeDefined() + expect(decorationState[decoration2.id]).toBeUndefined() + expect(decorationState[decoration3.id]).toBeUndefined() + + it "updates when a decoration's marker is modified", -> + # This update will move decoration1 out of view. + expectStateUpdate presenter, -> + newRange = new Range([13,0],[14,0]) + marker1.setBufferRange(newRange) + + decorationState = getContentForGutterWithName(presenter, 'test-gutter') + expect(decorationState[decoration1.id]).toBeUndefined() + expect(decorationState[decoration2.id].top).toBeDefined() + expect(decorationState[decoration3.id]).toBeUndefined() + + describe "when a decoration's properties are modified", -> + it "updates the item applied to the decoration, if the decoration item is changed", -> + # This changes the decoration class. The visibility of the decoration should not be affected. + newItem = document.createElement('div') + newItem.class = 'new-decoration-item' + newDecorationParams = + type: 'gutter' + gutterName: 'test-gutter' + class: 'test-class' + item: newItem + expectStateUpdate presenter, -> decoration1.setProperties(newDecorationParams) + + decorationState = getContentForGutterWithName(presenter, 'test-gutter') + expect(decorationState[decoration1.id].item).toBe newItem + expect(decorationState[decoration2.id].item).toBe decorationItem + expect(decorationState[decoration3.id]).toBeUndefined() + + it "updates the class applied to the decoration, if the decoration class is changed", -> + # This changes the decoration item. The visibility of the decoration should not be affected. + newDecorationParams = + type: 'gutter' + gutterName: 'test-gutter' + class: 'new-test-class' + item: decorationItem + expectStateUpdate presenter, -> decoration1.setProperties(newDecorationParams) + + decorationState = getContentForGutterWithName(presenter, 'test-gutter') + expect(decorationState[decoration1.id].class).toBe 'new-test-class' + expect(decorationState[decoration2.id].class).toBe 'test-class' + expect(decorationState[decoration3.id]).toBeUndefined() + + it "updates the type of the decoration, if the decoration type is changed", -> + # This changes the type of the decoration. This should remove the decoration from the gutter. + newDecorationParams = + type: 'line' + gutterName: 'test-gutter' # This is an invalid/meaningless option here, but it shouldn't matter. + class: 'test-class' + item: decorationItem + expectStateUpdate presenter, -> decoration1.setProperties(newDecorationParams) + + decorationState = getContentForGutterWithName(presenter, 'test-gutter') + expect(decorationState[decoration1.id]).toBeUndefined() + expect(decorationState[decoration2.id].top).toBeDefined() + expect(decorationState[decoration3.id]).toBeUndefined() + + it "updates the gutter the decoration targets, if the decoration gutterName is changed", -> + # This changes which gutter this decoration applies to. Since this gutter does not exist, + # the decoration should not appear in the customDecorations state. + newDecorationParams = + type: 'gutter' + gutterName: 'test-gutter-2' + class: 'new-test-class' + item: decorationItem + expectStateUpdate presenter, -> decoration1.setProperties(newDecorationParams) + + decorationState = getContentForGutterWithName(presenter, 'test-gutter') + expect(decorationState[decoration1.id]).toBeUndefined() + expect(decorationState[decoration2.id].top).toBeDefined() + expect(decorationState[decoration3.id]).toBeUndefined() + + # After adding the targeted gutter, the decoration will appear in the state for that gutter, + # since it should be visible. + expectStateUpdate presenter, -> editor.addGutter({name: 'test-gutter-2'}) + newGutterDecorationState = getContentForGutterWithName(presenter, 'test-gutter-2') + expect(newGutterDecorationState[decoration1.id].top).toBeDefined() + expect(newGutterDecorationState[decoration2.id]).toBeUndefined() + expect(newGutterDecorationState[decoration3.id]).toBeUndefined() + oldGutterDecorationState = getContentForGutterWithName(presenter, 'test-gutter') + expect(oldGutterDecorationState[decoration1.id]).toBeUndefined() + expect(oldGutterDecorationState[decoration2.id].top).toBeDefined() + expect(oldGutterDecorationState[decoration3.id]).toBeUndefined() + + it "updates when the editor's mini state changes, and is cleared when the editor is mini", -> + expectStateUpdate presenter, -> editor.setMini(true) + decorationState = getContentForGutterWithName(presenter, 'test-gutter') + expect(decorationState).toBeUndefined() + + # The decorations should return to the original state. + expectStateUpdate presenter, -> editor.setMini(false) + decorationState = getContentForGutterWithName(presenter, 'test-gutter') + expect(decorationState[decoration1.id].top).toBeDefined() + expect(decorationState[decoration2.id].top).toBeDefined() + expect(decorationState[decoration3.id]).toBeUndefined() + + it "updates when a gutter's visibility changes, and is cleared when the gutter is not visible", -> + expectStateUpdate presenter, -> gutter.hide() + decorationState = getContentForGutterWithName(presenter, 'test-gutter') + expect(decorationState[decoration1.id]).toBeUndefined() + expect(decorationState[decoration2.id]).toBeUndefined() + expect(decorationState[decoration3.id]).toBeUndefined() + + # The decorations should return to the original state. + expectStateUpdate presenter, -> gutter.show() + decorationState = getContentForGutterWithName(presenter, 'test-gutter') + expect(decorationState[decoration1.id].top).toBeDefined() + expect(decorationState[decoration2.id].top).toBeDefined() + expect(decorationState[decoration3.id]).toBeUndefined() + + it "updates when a gutter is added to the editor", -> + decorationParams = + type: 'gutter' + gutterName: 'test-gutter-2' + class: 'test-class' + marker4 = editor.markBufferRange([[0,0],[1,0]]) + decoration4 = editor.decorateMarker(marker4, decorationParams) + expectStateUpdate presenter, -> editor.addGutter({name: 'test-gutter-2'}) + + decorationState = getContentForGutterWithName(presenter, 'test-gutter-2') + expect(decorationState[decoration1.id]).toBeUndefined() + expect(decorationState[decoration2.id]).toBeUndefined() + expect(decorationState[decoration3.id]).toBeUndefined() + expect(decorationState[decoration4.id].top).toBeDefined() + + it "updates when editor lines are folded", -> + oldDimensionsForDecoration1 = + top: lineHeight * marker1.getScreenRange().start.row + height: lineHeight * marker1.getScreenRange().getRowCount() + oldDimensionsForDecoration2 = + top: lineHeight * marker2.getScreenRange().start.row + height: lineHeight * marker2.getScreenRange().getRowCount() + + # Based on the contents of sample.js, this should affect all but the top + # part of decoration1. + expectStateUpdate presenter, -> editor.foldBufferRow(0) + + decorationState = getContentForGutterWithName(presenter, 'test-gutter') + expect(decorationState[decoration1.id].top).toBe oldDimensionsForDecoration1.top + expect(decorationState[decoration1.id].height).not.toBe oldDimensionsForDecoration1.height + # Due to the issue described here: https://github.com/atom/atom/issues/6454, decoration2 + # will be bumped up to the row that was folded and still made visible, instead of being + # entirely collapsed. (The same thing will happen to decoration3.) + expect(decorationState[decoration2.id].top).not.toBe oldDimensionsForDecoration2.top + expect(decorationState[decoration2.id].height).not.toBe oldDimensionsForDecoration2.height describe "regardless of what kind of gutter a gutter description corresponds to", -> [customGutter] = [] @@ -2310,238 +2540,6 @@ describe "TextEditorPresenter", -> expect(getStylesForGutterWithName(presenter, 'line-number').backgroundColor).toBe "rgba(0, 0, 255, 0)" expect(getStylesForGutterWithName(presenter, 'test-gutter').backgroundColor).toBe "rgba(0, 0, 255, 0)" - # TODO - describe ".customDecorations", -> - [presenter, gutter, decorationItem, decorationParams] = [] - [marker1, decoration1, marker2, decoration2, marker3, decoration3] = [] - - # Set the scrollTop to 0 to show the very top of the file. - # Set the explicitHeight to make 10 lines visible. - scrollTop = 0 - lineHeight = 10 - explicitHeight = lineHeight * 10 - lineOverdrawMargin = 1 - - decorationStateForGutterName = (presenter, gutterName) -> - presenter.getState().gutters.customDecorations[gutterName] - - beforeEach -> - # At the beginning of each test, decoration1 and decoration2 are in visible range, - # but not decoration3. - presenter = buildPresenter({explicitHeight, scrollTop, lineHeight, lineOverdrawMargin}) - gutter = editor.addGutter({name: 'test-gutter', visible: true}) - decorationItem = document.createElement('div') - decorationItem.class = 'decoration-item' - decorationParams = - type: 'gutter' - gutterName: 'test-gutter' - class: 'test-class' - item: decorationItem - marker1 = editor.markBufferRange([[0,0],[1,0]]) - decoration1 = editor.decorateMarker(marker1, decorationParams) - marker2 = editor.markBufferRange([[9,0],[12,0]]) - decoration2 = editor.decorateMarker(marker2, decorationParams) - marker3 = editor.markBufferRange([[13,0],[14,0]]) - decoration3 = editor.decorateMarker(marker3, decorationParams) - - # Clear any batched state updates. - presenter.getState() - - it "contains all decorations within the visible buffer range", -> - decorationState = decorationStateForGutterName(presenter, 'test-gutter') - expect(decorationState[decoration1.id].top).toBe lineHeight * marker1.getScreenRange().start.row - expect(decorationState[decoration1.id].height).toBe lineHeight * marker1.getScreenRange().getRowCount() - expect(decorationState[decoration1.id].item).toBe decorationItem - expect(decorationState[decoration1.id].class).toBe 'test-class' - - expect(decorationState[decoration2.id].top).toBe lineHeight * marker2.getScreenRange().start.row - expect(decorationState[decoration2.id].height).toBe lineHeight * marker2.getScreenRange().getRowCount() - expect(decorationState[decoration2.id].item).toBe decorationItem - expect(decorationState[decoration2.id].class).toBe 'test-class' - - expect(decorationState[decoration3.id]).toBeUndefined() - - it "updates when ::scrollTop changes", -> - # This update will scroll decoration1 out of view, and decoration3 into view. - expectStateUpdate presenter, -> presenter.setScrollTop(scrollTop + lineHeight * 5) - - decorationState = decorationStateForGutterName(presenter, 'test-gutter') - expect(decorationState[decoration1.id]).toBeUndefined() - expect(decorationState[decoration2.id].top).toBeDefined() - expect(decorationState[decoration3.id].top).toBeDefined() - - it "updates when ::explicitHeight changes", -> - # This update will make all three decorations visible. - expectStateUpdate presenter, -> presenter.setExplicitHeight(explicitHeight + lineHeight * 5) - - decorationState = decorationStateForGutterName(presenter, 'test-gutter') - expect(decorationState[decoration1.id].top).toBeDefined() - expect(decorationState[decoration2.id].top).toBeDefined() - expect(decorationState[decoration3.id].top).toBeDefined() - - it "updates when ::lineHeight changes", -> - # This update will make all three decorations visible. - expectStateUpdate presenter, -> presenter.setLineHeight(Math.ceil(1.0 * explicitHeight / marker3.getBufferRange().end.row)) - - decorationState = decorationStateForGutterName(presenter, 'test-gutter') - expect(decorationState[decoration1.id].top).toBeDefined() - expect(decorationState[decoration2.id].top).toBeDefined() - expect(decorationState[decoration3.id].top).toBeDefined() - - it "updates when the editor's content changes", -> - # This update will add enough lines to push decoration2 out of view. - expectStateUpdate presenter, -> editor.setTextInBufferRange([[8,0],[9,0]],'\n\n\n\n\n') - - decorationState = decorationStateForGutterName(presenter, 'test-gutter') - expect(decorationState[decoration1.id].top).toBeDefined() - expect(decorationState[decoration2.id]).toBeUndefined() - expect(decorationState[decoration3.id]).toBeUndefined() - - it "updates when a decoration's marker is modified", -> - # This update will move decoration1 out of view. - expectStateUpdate presenter, -> - newRange = new Range([13,0],[14,0]) - marker1.setBufferRange(newRange) - - decorationState = decorationStateForGutterName(presenter, 'test-gutter') - expect(decorationState[decoration1.id]).toBeUndefined() - expect(decorationState[decoration2.id].top).toBeDefined() - expect(decorationState[decoration3.id]).toBeUndefined() - - describe "when a decoration's properties are modified", -> - it "updates the item applied to the decoration, if the decoration item is changed", -> - # This changes the decoration class. The visibility of the decoration should not be affected. - newItem = document.createElement('div') - newItem.class = 'new-decoration-item' - newDecorationParams = - type: 'gutter' - gutterName: 'test-gutter' - class: 'test-class' - item: newItem - expectStateUpdate presenter, -> decoration1.setProperties(newDecorationParams) - - decorationState = decorationStateForGutterName(presenter, 'test-gutter') - expect(decorationState[decoration1.id].item).toBe newItem - expect(decorationState[decoration2.id].item).toBe decorationItem - expect(decorationState[decoration3.id]).toBeUndefined() - - it "updates the class applied to the decoration, if the decoration class is changed", -> - # This changes the decoration item. The visibility of the decoration should not be affected. - newDecorationParams = - type: 'gutter' - gutterName: 'test-gutter' - class: 'new-test-class' - item: decorationItem - expectStateUpdate presenter, -> decoration1.setProperties(newDecorationParams) - - decorationState = decorationStateForGutterName(presenter, 'test-gutter') - expect(decorationState[decoration1.id].class).toBe 'new-test-class' - expect(decorationState[decoration2.id].class).toBe 'test-class' - expect(decorationState[decoration3.id]).toBeUndefined() - - it "updates the type of the decoration, if the decoration type is changed", -> - # This changes the type of the decoration. This should remove the decoration from the gutter. - newDecorationParams = - type: 'line' - gutterName: 'test-gutter' # This is an invalid/meaningless option here, but it shouldn't matter. - class: 'test-class' - item: decorationItem - expectStateUpdate presenter, -> decoration1.setProperties(newDecorationParams) - - decorationState = decorationStateForGutterName(presenter, 'test-gutter') - expect(decorationState[decoration1.id]).toBeUndefined() - expect(decorationState[decoration2.id].top).toBeDefined() - expect(decorationState[decoration3.id]).toBeUndefined() - - it "updates the gutter the decoration targets, if the decoration gutterName is changed", -> - # This changes which gutter this decoration applies to. Since this gutter does not exist, - # the decoration should not appear in the customDecorations state. - newDecorationParams = - type: 'gutter' - gutterName: 'test-gutter-2' - class: 'new-test-class' - item: decorationItem - expectStateUpdate presenter, -> decoration1.setProperties(newDecorationParams) - - decorationState = decorationStateForGutterName(presenter, 'test-gutter') - expect(decorationState[decoration1.id]).toBeUndefined() - expect(decorationState[decoration2.id].top).toBeDefined() - expect(decorationState[decoration3.id]).toBeUndefined() - - # After adding the targeted gutter, the decoration will appear in the state for that gutter, - # since it should be visible. - expectStateUpdate presenter, -> editor.addGutter({name: 'test-gutter-2'}) - newGutterDecorationState = decorationStateForGutterName(presenter, 'test-gutter-2') - expect(newGutterDecorationState[decoration1.id].top).toBeDefined() - expect(newGutterDecorationState[decoration2.id]).toBeUndefined() - expect(newGutterDecorationState[decoration3.id]).toBeUndefined() - oldGutterDecorationState = decorationStateForGutterName(presenter, 'test-gutter') - expect(oldGutterDecorationState[decoration1.id]).toBeUndefined() - expect(oldGutterDecorationState[decoration2.id].top).toBeDefined() - expect(oldGutterDecorationState[decoration3.id]).toBeUndefined() - - it "updates when the editor's mini state changes, and is cleared when the editor is mini", -> - expectStateUpdate presenter, -> editor.setMini(true) - decorationState = decorationStateForGutterName(presenter, 'test-gutter') - expect(decorationState).toBeUndefined() - - # The decorations should return to the original state. - expectStateUpdate presenter, -> editor.setMini(false) - decorationState = decorationStateForGutterName(presenter, 'test-gutter') - expect(decorationState[decoration1.id].top).toBeDefined() - expect(decorationState[decoration2.id].top).toBeDefined() - expect(decorationState[decoration3.id]).toBeUndefined() - - it "updates when a gutter's visibility changes, and is cleared when the gutter is not visible", -> - expectStateUpdate presenter, -> gutter.hide() - decorationState = decorationStateForGutterName(presenter, 'test-gutter') - expect(decorationState[decoration1.id]).toBeUndefined() - expect(decorationState[decoration2.id]).toBeUndefined() - expect(decorationState[decoration3.id]).toBeUndefined() - - # The decorations should return to the original state. - expectStateUpdate presenter, -> gutter.show() - decorationState = decorationStateForGutterName(presenter, 'test-gutter') - expect(decorationState[decoration1.id].top).toBeDefined() - expect(decorationState[decoration2.id].top).toBeDefined() - expect(decorationState[decoration3.id]).toBeUndefined() - - it "updates when a gutter is added to the editor", -> - decorationParams = - type: 'gutter' - gutterName: 'test-gutter-2' - class: 'test-class' - marker4 = editor.markBufferRange([[0,0],[1,0]]) - decoration4 = editor.decorateMarker(marker4, decorationParams) - expectStateUpdate presenter, -> editor.addGutter({name: 'test-gutter-2'}) - - decorationState = decorationStateForGutterName(presenter, 'test-gutter-2') - expect(decorationState[decoration1.id]).toBeUndefined() - expect(decorationState[decoration2.id]).toBeUndefined() - expect(decorationState[decoration3.id]).toBeUndefined() - expect(decorationState[decoration4.id].top).toBeDefined() - - it "updates when editor lines are folded", -> - oldDimensionsForDecoration1 = - top: lineHeight * marker1.getScreenRange().start.row - height: lineHeight * marker1.getScreenRange().getRowCount() - oldDimensionsForDecoration2 = - top: lineHeight * marker2.getScreenRange().start.row - height: lineHeight * marker2.getScreenRange().getRowCount() - - # Based on the contents of sample.js, this should affect all but the top - # part of decoration1. - expectStateUpdate presenter, -> editor.foldBufferRow(0) - - decorationState = decorationStateForGutterName(presenter, 'test-gutter') - expect(decorationState[decoration1.id].top).toBe oldDimensionsForDecoration1.top - expect(decorationState[decoration1.id].height).not.toBe oldDimensionsForDecoration1.height - # Due to the issue described here: https://github.com/atom/atom/issues/6454, decoration2 - # will be bumped up to the row that was folded and still made visible, instead of being - # entirely collapsed. (The same thing will happen to decoration3.) - expect(decorationState[decoration2.id].top).not.toBe oldDimensionsForDecoration2.top - expect(decorationState[decoration2.id].height).not.toBe oldDimensionsForDecoration2.height - # disabled until we fix an issue with display buffer markers not updating when # they are moved on screen but not in the buffer xdescribe "when the model and view measurements are mutated randomly", -> From 57d08873463b664b9e3c989d5cd95dcab0e4ef26 Mon Sep 17 00:00:00 2001 From: Jess Lin Date: Wed, 13 May 2015 16:35:40 -0700 Subject: [PATCH 285/335] [Gutter] Move line number gutter tests to be under .gutters in TextEditorPresenter specs --- spec/text-editor-presenter-spec.coffee | 701 ++++++++++++------------- 1 file changed, 350 insertions(+), 351 deletions(-) diff --git a/spec/text-editor-presenter-spec.coffee b/spec/text-editor-presenter-spec.coffee index 8a991e34c..f5ed6d90f 100644 --- a/spec/text-editor-presenter-spec.coffee +++ b/spec/text-editor-presenter-spec.coffee @@ -1772,357 +1772,6 @@ describe "TextEditorPresenter", -> pixelPosition: {top: 10, left: 0} } - # TODO jssln Move this under '.gutters' - describe "when the gutter is the line-number gutter", -> - getLineNumberGutterState = (presenter) -> - gutterDescriptions = presenter.getState().gutters - for description in gutterDescriptions - gutter = description.gutter - return description if gutter.name is 'line-number' - - describe ".visible", -> - it "is true iff the editor isn't mini, ::isLineNumberGutterVisible is true on the editor, and the 'editor.showLineNumbers' config is enabled", -> - presenter = buildPresenter() - - expect(editor.isLineNumberGutterVisible()).toBe true - expect(getLineNumberGutterState(presenter).visible).toBe true - - expectStateUpdate presenter, -> editor.setMini(true) - expect(getLineNumberGutterState(presenter)).toBeUndefined() - - expectStateUpdate presenter, -> editor.setMini(false) - expect(getLineNumberGutterState(presenter).visible).toBe true - - expectStateUpdate presenter, -> editor.setLineNumberGutterVisible(false) - expect(getLineNumberGutterState(presenter).visible).toBe false - - expectStateUpdate presenter, -> editor.setLineNumberGutterVisible(true) - expect(getLineNumberGutterState(presenter).visible).toBe true - - expectStateUpdate presenter, -> atom.config.set('editor.showLineNumbers', false) - expect(getLineNumberGutterState(presenter).visible).toBe false - - it "gets updated when the editor's grammar changes", -> - presenter = buildPresenter() - - atom.config.set('editor.showLineNumbers', false, scopeSelector: '.source.js') - expect(getLineNumberGutterState(presenter).visible).toBe true - stateUpdated = false - presenter.onDidUpdateState -> stateUpdated = true - - waitsForPromise -> atom.packages.activatePackage('language-javascript') - - runs -> - expect(stateUpdated).toBe true - expect(getLineNumberGutterState(presenter).visible).toBe false - - describe ".content.maxLineNumberDigits", -> - it "is set to the number of digits used by the greatest line number", -> - presenter = buildPresenter() - expect(editor.getLastBufferRow()).toBe 12 - expect(getLineNumberGutterState(presenter).content.maxLineNumberDigits).toBe 2 - - editor.setText("1\n2\n3") - expect(getLineNumberGutterState(presenter).content.maxLineNumberDigits).toBe 1 - - describe ".content.lineNumbers", -> - lineNumberStateForScreenRow = (presenter, screenRow) -> - editor = presenter.model - bufferRow = editor.bufferRowForScreenRow(screenRow) - wrapCount = screenRow - editor.screenRowForBufferRow(bufferRow) - if wrapCount > 0 - key = bufferRow + '-' + wrapCount - else - key = bufferRow - - getLineNumberGutterState(presenter).content.lineNumbers[key] - - it "contains states for line numbers that are visible on screen, plus and minus the overdraw margin", -> - editor.foldBufferRow(4) - editor.setSoftWrapped(true) - editor.setEditorWidthInChars(50) - presenter = buildPresenter(explicitHeight: 25, scrollTop: 30, lineHeight: 10, lineOverdrawMargin: 1) - - expect(lineNumberStateForScreenRow(presenter, 1)).toBeUndefined() - expectValues lineNumberStateForScreenRow(presenter, 2), {screenRow: 2, bufferRow: 2, softWrapped: false, top: 2 * 10} - expectValues lineNumberStateForScreenRow(presenter, 3), {screenRow: 3, bufferRow: 3, softWrapped: false, top: 3 * 10} - expectValues lineNumberStateForScreenRow(presenter, 4), {screenRow: 4, bufferRow: 3, softWrapped: true, top: 4 * 10} - expectValues lineNumberStateForScreenRow(presenter, 5), {screenRow: 5, bufferRow: 4, softWrapped: false, top: 5 * 10} - expectValues lineNumberStateForScreenRow(presenter, 6), {screenRow: 6, bufferRow: 7, softWrapped: false, top: 6 * 10} - expectValues lineNumberStateForScreenRow(presenter, 7), {screenRow: 7, bufferRow: 8, softWrapped: false, top: 7 * 10} - expect(lineNumberStateForScreenRow(presenter, 8)).toBeUndefined() - - it "includes states for all line numbers if no ::explicitHeight is assigned", -> - presenter = buildPresenter(explicitHeight: null) - expect(lineNumberStateForScreenRow(presenter, 0)).toBeDefined() - expect(lineNumberStateForScreenRow(presenter, 12)).toBeDefined() - - it "updates when ::scrollTop changes", -> - editor.foldBufferRow(4) - editor.setSoftWrapped(true) - editor.setEditorWidthInChars(50) - presenter = buildPresenter(explicitHeight: 25, scrollTop: 30, lineOverdrawMargin: 1) - - expect(lineNumberStateForScreenRow(presenter, 1)).toBeUndefined() - expectValues lineNumberStateForScreenRow(presenter, 2), {bufferRow: 2} - expectValues lineNumberStateForScreenRow(presenter, 7), {bufferRow: 8} - expect(lineNumberStateForScreenRow(presenter, 8)).toBeUndefined() - - expectStateUpdate presenter, -> presenter.setScrollTop(20) - - expect(lineNumberStateForScreenRow(presenter, 0)).toBeUndefined() - expectValues lineNumberStateForScreenRow(presenter, 1), {bufferRow: 1} - expectValues lineNumberStateForScreenRow(presenter, 6), {bufferRow: 7} - expect(lineNumberStateForScreenRow(presenter, 7)).toBeUndefined() - - it "updates when ::explicitHeight changes", -> - editor.foldBufferRow(4) - editor.setSoftWrapped(true) - editor.setEditorWidthInChars(50) - presenter = buildPresenter(explicitHeight: 25, scrollTop: 30, lineOverdrawMargin: 1) - - expect(lineNumberStateForScreenRow(presenter, 1)).toBeUndefined() - expectValues lineNumberStateForScreenRow(presenter, 2), {bufferRow: 2} - expectValues lineNumberStateForScreenRow(presenter, 7), {bufferRow: 8} - expect(lineNumberStateForScreenRow(presenter, 8)).toBeUndefined() - - expectStateUpdate presenter, -> presenter.setExplicitHeight(35) - - expect(lineNumberStateForScreenRow(presenter, 0)).toBeUndefined() - expectValues lineNumberStateForScreenRow(presenter, 2), {bufferRow: 2} - expectValues lineNumberStateForScreenRow(presenter, 8), {bufferRow: 8} - expect(lineNumberStateForScreenRow(presenter, 9)).toBeUndefined() - - it "updates when ::lineHeight changes", -> - editor.foldBufferRow(4) - editor.setSoftWrapped(true) - editor.setEditorWidthInChars(50) - presenter = buildPresenter(explicitHeight: 25, scrollTop: 0, lineOverdrawMargin: 0) - - expectValues lineNumberStateForScreenRow(presenter, 0), {bufferRow: 0} - expectValues lineNumberStateForScreenRow(presenter, 3), {bufferRow: 3} - expect(lineNumberStateForScreenRow(presenter, 4)).toBeUndefined() - - expectStateUpdate presenter, -> presenter.setLineHeight(5) - - expectValues lineNumberStateForScreenRow(presenter, 0), {bufferRow: 0} - expectValues lineNumberStateForScreenRow(presenter, 5), {bufferRow: 4} - expect(lineNumberStateForScreenRow(presenter, 6)).toBeUndefined() - - it "updates when the editor's content changes", -> - editor.foldBufferRow(4) - editor.setSoftWrapped(true) - editor.setEditorWidthInChars(50) - presenter = buildPresenter(explicitHeight: 35, scrollTop: 30, lineOverdrawMargin: 0) - - expect(lineNumberStateForScreenRow(presenter, 2)).toBeUndefined() - expectValues lineNumberStateForScreenRow(presenter, 3), {bufferRow: 3} - expectValues lineNumberStateForScreenRow(presenter, 4), {bufferRow: 3} - expectValues lineNumberStateForScreenRow(presenter, 5), {bufferRow: 4} - expectValues lineNumberStateForScreenRow(presenter, 6), {bufferRow: 7} - expectValues lineNumberStateForScreenRow(presenter, 7), {bufferRow: 8} - expect(lineNumberStateForScreenRow(presenter, 8)).toBeUndefined() - - expectStateUpdate presenter, -> - editor.getBuffer().insert([3, Infinity], new Array(25).join("x ")) - - expect(lineNumberStateForScreenRow(presenter, 2)).toBeUndefined() - expectValues lineNumberStateForScreenRow(presenter, 3), {bufferRow: 3} - expectValues lineNumberStateForScreenRow(presenter, 4), {bufferRow: 3} - expectValues lineNumberStateForScreenRow(presenter, 5), {bufferRow: 3} - expectValues lineNumberStateForScreenRow(presenter, 6), {bufferRow: 4} - expectValues lineNumberStateForScreenRow(presenter, 7), {bufferRow: 7} - expect(lineNumberStateForScreenRow(presenter, 8)).toBeUndefined() - - it "does not remove out-of-view line numbers corresponding to ::mouseWheelScreenRow until ::stoppedScrollingDelay elapses", -> - presenter = buildPresenter(explicitHeight: 25, lineOverdrawMargin: 1, stoppedScrollingDelay: 200) - - expect(lineNumberStateForScreenRow(presenter, 0)).toBeDefined() - expect(lineNumberStateForScreenRow(presenter, 4)).toBeDefined() - expect(lineNumberStateForScreenRow(presenter, 5)).toBeUndefined() - - presenter.setMouseWheelScreenRow(0) - expectStateUpdate presenter, -> presenter.setScrollTop(35) - - expect(lineNumberStateForScreenRow(presenter, 0)).toBeDefined() - expect(lineNumberStateForScreenRow(presenter, 1)).toBeUndefined() - expect(lineNumberStateForScreenRow(presenter, 7)).toBeDefined() - expect(lineNumberStateForScreenRow(presenter, 8)).toBeUndefined() - - expectStateUpdate presenter, -> advanceClock(200) - - expect(lineNumberStateForScreenRow(presenter, 0)).toBeUndefined() - expect(lineNumberStateForScreenRow(presenter, 1)).toBeUndefined() - expect(lineNumberStateForScreenRow(presenter, 7)).toBeDefined() - expect(lineNumberStateForScreenRow(presenter, 8)).toBeUndefined() - - it "correctly handles the first screen line being soft-wrapped", -> - editor.setSoftWrapped(true) - editor.setEditorWidthInChars(30) - presenter = buildPresenter(explicitHeight: 25, scrollTop: 50) - - expectValues lineNumberStateForScreenRow(presenter, 5), {screenRow: 5, bufferRow: 3, softWrapped: true} - expectValues lineNumberStateForScreenRow(presenter, 6), {screenRow: 6, bufferRow: 3, softWrapped: true} - expectValues lineNumberStateForScreenRow(presenter, 7), {screenRow: 7, bufferRow: 4, softWrapped: false} - - describe ".decorationClasses", -> - it "adds decoration classes to the relevant line number state objects, both initially and when decorations change", -> - marker1 = editor.markBufferRange([[4, 0], [6, 2]], invalidate: 'touch') - decoration1 = editor.decorateMarker(marker1, type: 'line-number', class: 'a') - presenter = buildPresenter() - marker2 = editor.markBufferRange([[4, 0], [6, 2]], invalidate: 'touch') - decoration2 = editor.decorateMarker(marker2, type: 'line-number', class: 'b') - - expect(lineNumberStateForScreenRow(presenter, 3).decorationClasses).toBeNull() - expect(lineNumberStateForScreenRow(presenter, 4).decorationClasses).toEqual ['a', 'b'] - expect(lineNumberStateForScreenRow(presenter, 5).decorationClasses).toEqual ['a', 'b'] - expect(lineNumberStateForScreenRow(presenter, 6).decorationClasses).toEqual ['a', 'b'] - expect(lineNumberStateForScreenRow(presenter, 7).decorationClasses).toBeNull() - - expectStateUpdate presenter, -> editor.getBuffer().insert([5, 0], 'x') - expect(marker1.isValid()).toBe false - expect(lineNumberStateForScreenRow(presenter, 4).decorationClasses).toBeNull() - expect(lineNumberStateForScreenRow(presenter, 5).decorationClasses).toBeNull() - expect(lineNumberStateForScreenRow(presenter, 6).decorationClasses).toBeNull() - - expectStateUpdate presenter, -> editor.undo() - expect(lineNumberStateForScreenRow(presenter, 3).decorationClasses).toBeNull() - expect(lineNumberStateForScreenRow(presenter, 4).decorationClasses).toEqual ['a', 'b'] - expect(lineNumberStateForScreenRow(presenter, 5).decorationClasses).toEqual ['a', 'b'] - expect(lineNumberStateForScreenRow(presenter, 6).decorationClasses).toEqual ['a', 'b'] - expect(lineNumberStateForScreenRow(presenter, 7).decorationClasses).toBeNull() - - expectStateUpdate presenter, -> marker1.setBufferRange([[2, 0], [4, 2]]) - expect(lineNumberStateForScreenRow(presenter, 1).decorationClasses).toBeNull() - expect(lineNumberStateForScreenRow(presenter, 2).decorationClasses).toEqual ['a'] - expect(lineNumberStateForScreenRow(presenter, 3).decorationClasses).toEqual ['a'] - expect(lineNumberStateForScreenRow(presenter, 4).decorationClasses).toEqual ['a', 'b'] - expect(lineNumberStateForScreenRow(presenter, 5).decorationClasses).toEqual ['b'] - expect(lineNumberStateForScreenRow(presenter, 6).decorationClasses).toEqual ['b'] - expect(lineNumberStateForScreenRow(presenter, 7).decorationClasses).toBeNull() - - expectStateUpdate presenter, -> decoration1.destroy() - expect(lineNumberStateForScreenRow(presenter, 2).decorationClasses).toBeNull() - expect(lineNumberStateForScreenRow(presenter, 3).decorationClasses).toBeNull() - expect(lineNumberStateForScreenRow(presenter, 4).decorationClasses).toEqual ['b'] - expect(lineNumberStateForScreenRow(presenter, 5).decorationClasses).toEqual ['b'] - expect(lineNumberStateForScreenRow(presenter, 6).decorationClasses).toEqual ['b'] - expect(lineNumberStateForScreenRow(presenter, 7).decorationClasses).toBeNull() - - expectStateUpdate presenter, -> marker2.destroy() - expect(lineNumberStateForScreenRow(presenter, 2).decorationClasses).toBeNull() - expect(lineNumberStateForScreenRow(presenter, 3).decorationClasses).toBeNull() - expect(lineNumberStateForScreenRow(presenter, 4).decorationClasses).toBeNull() - expect(lineNumberStateForScreenRow(presenter, 5).decorationClasses).toBeNull() - expect(lineNumberStateForScreenRow(presenter, 6).decorationClasses).toBeNull() - expect(lineNumberStateForScreenRow(presenter, 7).decorationClasses).toBeNull() - - it "honors the 'onlyEmpty' option on line-number decorations", -> - presenter = buildPresenter() - marker = editor.markBufferRange([[4, 0], [6, 1]]) - decoration = editor.decorateMarker(marker, type: 'line-number', class: 'a', onlyEmpty: true) - - expect(lineNumberStateForScreenRow(presenter, 4).decorationClasses).toBeNull() - expect(lineNumberStateForScreenRow(presenter, 5).decorationClasses).toBeNull() - expect(lineNumberStateForScreenRow(presenter, 6).decorationClasses).toBeNull() - - expectStateUpdate presenter, -> marker.clearTail() - - expect(lineNumberStateForScreenRow(presenter, 4).decorationClasses).toBeNull() - expect(lineNumberStateForScreenRow(presenter, 5).decorationClasses).toBeNull() - expect(lineNumberStateForScreenRow(presenter, 6).decorationClasses).toEqual ['a'] - - it "honors the 'onlyNonEmpty' option on line-number decorations", -> - presenter = buildPresenter() - marker = editor.markBufferRange([[4, 0], [6, 2]]) - decoration = editor.decorateMarker(marker, type: 'line-number', class: 'a', onlyNonEmpty: true) - - expect(lineNumberStateForScreenRow(presenter, 4).decorationClasses).toEqual ['a'] - expect(lineNumberStateForScreenRow(presenter, 5).decorationClasses).toEqual ['a'] - expect(lineNumberStateForScreenRow(presenter, 6).decorationClasses).toEqual ['a'] - - expectStateUpdate presenter, -> marker.clearTail() - - expect(lineNumberStateForScreenRow(presenter, 6).decorationClasses).toBeNull() - - it "honors the 'onlyHead' option on line-number decorations", -> - presenter = buildPresenter() - marker = editor.markBufferRange([[4, 0], [6, 2]]) - decoration = editor.decorateMarker(marker, type: 'line-number', class: 'a', onlyHead: true) - - expect(lineNumberStateForScreenRow(presenter, 4).decorationClasses).toBeNull() - expect(lineNumberStateForScreenRow(presenter, 5).decorationClasses).toBeNull() - expect(lineNumberStateForScreenRow(presenter, 6).decorationClasses).toEqual ['a'] - - it "does not decorate the last line of a non-empty line-number decoration range if it ends at column 0", -> - presenter = buildPresenter() - marker = editor.markBufferRange([[4, 0], [6, 0]]) - decoration = editor.decorateMarker(marker, type: 'line-number', class: 'a') - - expect(lineNumberStateForScreenRow(presenter, 4).decorationClasses).toEqual ['a'] - expect(lineNumberStateForScreenRow(presenter, 5).decorationClasses).toEqual ['a'] - expect(lineNumberStateForScreenRow(presenter, 6).decorationClasses).toBeNull() - - it "does not apply line-number decorations to mini editors", -> - editor.setMini(true) - presenter = buildPresenter() - marker = editor.markBufferRange([[0, 0], [0, 0]]) - decoration = editor.decorateMarker(marker, type: 'line-number', class: 'a') - # A mini editor will have no gutters. - expect(getLineNumberGutterState(presenter)).toBeUndefined() - - expectStateUpdate presenter, -> editor.setMini(false) - expect(lineNumberStateForScreenRow(presenter, 0).decorationClasses).toEqual ['cursor-line', 'cursor-line-no-selection', 'a'] - - expectStateUpdate presenter, -> editor.setMini(true) - expect(getLineNumberGutterState(presenter)).toBeUndefined() - - it "only applies line-number decorations to screen rows that are spanned by their marker when lines are soft-wrapped", -> - editor.setText("a line that wraps, ok") - editor.setSoftWrapped(true) - editor.setEditorWidthInChars(16) - marker = editor.markBufferRange([[0, 0], [0, 2]]) - editor.decorateMarker(marker, type: 'line-number', class: 'a') - presenter = buildPresenter(explicitHeight: 10) - - expect(lineNumberStateForScreenRow(presenter, 0).decorationClasses).toContain 'a' - expect(lineNumberStateForScreenRow(presenter, 1).decorationClasses).toBeNull() - - marker.setBufferRange([[0, 0], [0, Infinity]]) - expect(lineNumberStateForScreenRow(presenter, 0).decorationClasses).toContain 'a' - expect(lineNumberStateForScreenRow(presenter, 1).decorationClasses).toContain 'a' - - describe ".foldable", -> - it "marks line numbers at the start of a foldable region as foldable", -> - presenter = buildPresenter() - expect(lineNumberStateForScreenRow(presenter, 0).foldable).toBe true - expect(lineNumberStateForScreenRow(presenter, 1).foldable).toBe true - expect(lineNumberStateForScreenRow(presenter, 2).foldable).toBe false - expect(lineNumberStateForScreenRow(presenter, 3).foldable).toBe false - expect(lineNumberStateForScreenRow(presenter, 4).foldable).toBe true - expect(lineNumberStateForScreenRow(presenter, 5).foldable).toBe false - - it "updates the foldable class on the correct line numbers when the foldable positions change", -> - presenter = buildPresenter() - editor.getBuffer().insert([0, 0], '\n') - expect(lineNumberStateForScreenRow(presenter, 0).foldable).toBe false - expect(lineNumberStateForScreenRow(presenter, 1).foldable).toBe true - expect(lineNumberStateForScreenRow(presenter, 2).foldable).toBe true - expect(lineNumberStateForScreenRow(presenter, 3).foldable).toBe false - expect(lineNumberStateForScreenRow(presenter, 4).foldable).toBe false - expect(lineNumberStateForScreenRow(presenter, 5).foldable).toBe true - expect(lineNumberStateForScreenRow(presenter, 6).foldable).toBe false - - it "updates the foldable class on a line number that becomes foldable", -> - presenter = buildPresenter() - expect(lineNumberStateForScreenRow(presenter, 11).foldable).toBe false - - editor.getBuffer().insert([11, 44], '\n fold me') - expect(lineNumberStateForScreenRow(presenter, 11).foldable).toBe true - - editor.undo() - expect(lineNumberStateForScreenRow(presenter, 11).foldable).toBe false - describe ".height", -> it "tracks the computed content height if ::autoHeight is true so the editor auto-expands vertically", -> presenter = buildPresenter(explicitHeight: null, autoHeight: true) @@ -2180,6 +1829,356 @@ describe "TextEditorPresenter", -> gutter.destroy() expect(getStateForGutterWithName(presenter, 'test-gutter')).toBeUndefined() + describe "for a gutter description that corresponds to the line-number gutter", -> + getLineNumberGutterState = (presenter) -> + gutterDescriptions = presenter.getState().gutters + for description in gutterDescriptions + gutter = description.gutter + return description if gutter.name is 'line-number' + + describe ".visible", -> + it "is true iff the editor isn't mini, ::isLineNumberGutterVisible is true on the editor, and the 'editor.showLineNumbers' config is enabled", -> + presenter = buildPresenter() + + expect(editor.isLineNumberGutterVisible()).toBe true + expect(getLineNumberGutterState(presenter).visible).toBe true + + expectStateUpdate presenter, -> editor.setMini(true) + expect(getLineNumberGutterState(presenter)).toBeUndefined() + + expectStateUpdate presenter, -> editor.setMini(false) + expect(getLineNumberGutterState(presenter).visible).toBe true + + expectStateUpdate presenter, -> editor.setLineNumberGutterVisible(false) + expect(getLineNumberGutterState(presenter).visible).toBe false + + expectStateUpdate presenter, -> editor.setLineNumberGutterVisible(true) + expect(getLineNumberGutterState(presenter).visible).toBe true + + expectStateUpdate presenter, -> atom.config.set('editor.showLineNumbers', false) + expect(getLineNumberGutterState(presenter).visible).toBe false + + it "gets updated when the editor's grammar changes", -> + presenter = buildPresenter() + + atom.config.set('editor.showLineNumbers', false, scopeSelector: '.source.js') + expect(getLineNumberGutterState(presenter).visible).toBe true + stateUpdated = false + presenter.onDidUpdateState -> stateUpdated = true + + waitsForPromise -> atom.packages.activatePackage('language-javascript') + + runs -> + expect(stateUpdated).toBe true + expect(getLineNumberGutterState(presenter).visible).toBe false + + describe ".content.maxLineNumberDigits", -> + it "is set to the number of digits used by the greatest line number", -> + presenter = buildPresenter() + expect(editor.getLastBufferRow()).toBe 12 + expect(getLineNumberGutterState(presenter).content.maxLineNumberDigits).toBe 2 + + editor.setText("1\n2\n3") + expect(getLineNumberGutterState(presenter).content.maxLineNumberDigits).toBe 1 + + describe ".content.lineNumbers", -> + lineNumberStateForScreenRow = (presenter, screenRow) -> + editor = presenter.model + bufferRow = editor.bufferRowForScreenRow(screenRow) + wrapCount = screenRow - editor.screenRowForBufferRow(bufferRow) + if wrapCount > 0 + key = bufferRow + '-' + wrapCount + else + key = bufferRow + + getLineNumberGutterState(presenter).content.lineNumbers[key] + + it "contains states for line numbers that are visible on screen, plus and minus the overdraw margin", -> + editor.foldBufferRow(4) + editor.setSoftWrapped(true) + editor.setEditorWidthInChars(50) + presenter = buildPresenter(explicitHeight: 25, scrollTop: 30, lineHeight: 10, lineOverdrawMargin: 1) + + expect(lineNumberStateForScreenRow(presenter, 1)).toBeUndefined() + expectValues lineNumberStateForScreenRow(presenter, 2), {screenRow: 2, bufferRow: 2, softWrapped: false, top: 2 * 10} + expectValues lineNumberStateForScreenRow(presenter, 3), {screenRow: 3, bufferRow: 3, softWrapped: false, top: 3 * 10} + expectValues lineNumberStateForScreenRow(presenter, 4), {screenRow: 4, bufferRow: 3, softWrapped: true, top: 4 * 10} + expectValues lineNumberStateForScreenRow(presenter, 5), {screenRow: 5, bufferRow: 4, softWrapped: false, top: 5 * 10} + expectValues lineNumberStateForScreenRow(presenter, 6), {screenRow: 6, bufferRow: 7, softWrapped: false, top: 6 * 10} + expectValues lineNumberStateForScreenRow(presenter, 7), {screenRow: 7, bufferRow: 8, softWrapped: false, top: 7 * 10} + expect(lineNumberStateForScreenRow(presenter, 8)).toBeUndefined() + + it "includes states for all line numbers if no ::explicitHeight is assigned", -> + presenter = buildPresenter(explicitHeight: null) + expect(lineNumberStateForScreenRow(presenter, 0)).toBeDefined() + expect(lineNumberStateForScreenRow(presenter, 12)).toBeDefined() + + it "updates when ::scrollTop changes", -> + editor.foldBufferRow(4) + editor.setSoftWrapped(true) + editor.setEditorWidthInChars(50) + presenter = buildPresenter(explicitHeight: 25, scrollTop: 30, lineOverdrawMargin: 1) + + expect(lineNumberStateForScreenRow(presenter, 1)).toBeUndefined() + expectValues lineNumberStateForScreenRow(presenter, 2), {bufferRow: 2} + expectValues lineNumberStateForScreenRow(presenter, 7), {bufferRow: 8} + expect(lineNumberStateForScreenRow(presenter, 8)).toBeUndefined() + + expectStateUpdate presenter, -> presenter.setScrollTop(20) + + expect(lineNumberStateForScreenRow(presenter, 0)).toBeUndefined() + expectValues lineNumberStateForScreenRow(presenter, 1), {bufferRow: 1} + expectValues lineNumberStateForScreenRow(presenter, 6), {bufferRow: 7} + expect(lineNumberStateForScreenRow(presenter, 7)).toBeUndefined() + + it "updates when ::explicitHeight changes", -> + editor.foldBufferRow(4) + editor.setSoftWrapped(true) + editor.setEditorWidthInChars(50) + presenter = buildPresenter(explicitHeight: 25, scrollTop: 30, lineOverdrawMargin: 1) + + expect(lineNumberStateForScreenRow(presenter, 1)).toBeUndefined() + expectValues lineNumberStateForScreenRow(presenter, 2), {bufferRow: 2} + expectValues lineNumberStateForScreenRow(presenter, 7), {bufferRow: 8} + expect(lineNumberStateForScreenRow(presenter, 8)).toBeUndefined() + + expectStateUpdate presenter, -> presenter.setExplicitHeight(35) + + expect(lineNumberStateForScreenRow(presenter, 0)).toBeUndefined() + expectValues lineNumberStateForScreenRow(presenter, 2), {bufferRow: 2} + expectValues lineNumberStateForScreenRow(presenter, 8), {bufferRow: 8} + expect(lineNumberStateForScreenRow(presenter, 9)).toBeUndefined() + + it "updates when ::lineHeight changes", -> + editor.foldBufferRow(4) + editor.setSoftWrapped(true) + editor.setEditorWidthInChars(50) + presenter = buildPresenter(explicitHeight: 25, scrollTop: 0, lineOverdrawMargin: 0) + + expectValues lineNumberStateForScreenRow(presenter, 0), {bufferRow: 0} + expectValues lineNumberStateForScreenRow(presenter, 3), {bufferRow: 3} + expect(lineNumberStateForScreenRow(presenter, 4)).toBeUndefined() + + expectStateUpdate presenter, -> presenter.setLineHeight(5) + + expectValues lineNumberStateForScreenRow(presenter, 0), {bufferRow: 0} + expectValues lineNumberStateForScreenRow(presenter, 5), {bufferRow: 4} + expect(lineNumberStateForScreenRow(presenter, 6)).toBeUndefined() + + it "updates when the editor's content changes", -> + editor.foldBufferRow(4) + editor.setSoftWrapped(true) + editor.setEditorWidthInChars(50) + presenter = buildPresenter(explicitHeight: 35, scrollTop: 30, lineOverdrawMargin: 0) + + expect(lineNumberStateForScreenRow(presenter, 2)).toBeUndefined() + expectValues lineNumberStateForScreenRow(presenter, 3), {bufferRow: 3} + expectValues lineNumberStateForScreenRow(presenter, 4), {bufferRow: 3} + expectValues lineNumberStateForScreenRow(presenter, 5), {bufferRow: 4} + expectValues lineNumberStateForScreenRow(presenter, 6), {bufferRow: 7} + expectValues lineNumberStateForScreenRow(presenter, 7), {bufferRow: 8} + expect(lineNumberStateForScreenRow(presenter, 8)).toBeUndefined() + + expectStateUpdate presenter, -> + editor.getBuffer().insert([3, Infinity], new Array(25).join("x ")) + + expect(lineNumberStateForScreenRow(presenter, 2)).toBeUndefined() + expectValues lineNumberStateForScreenRow(presenter, 3), {bufferRow: 3} + expectValues lineNumberStateForScreenRow(presenter, 4), {bufferRow: 3} + expectValues lineNumberStateForScreenRow(presenter, 5), {bufferRow: 3} + expectValues lineNumberStateForScreenRow(presenter, 6), {bufferRow: 4} + expectValues lineNumberStateForScreenRow(presenter, 7), {bufferRow: 7} + expect(lineNumberStateForScreenRow(presenter, 8)).toBeUndefined() + + it "does not remove out-of-view line numbers corresponding to ::mouseWheelScreenRow until ::stoppedScrollingDelay elapses", -> + presenter = buildPresenter(explicitHeight: 25, lineOverdrawMargin: 1, stoppedScrollingDelay: 200) + + expect(lineNumberStateForScreenRow(presenter, 0)).toBeDefined() + expect(lineNumberStateForScreenRow(presenter, 4)).toBeDefined() + expect(lineNumberStateForScreenRow(presenter, 5)).toBeUndefined() + + presenter.setMouseWheelScreenRow(0) + expectStateUpdate presenter, -> presenter.setScrollTop(35) + + expect(lineNumberStateForScreenRow(presenter, 0)).toBeDefined() + expect(lineNumberStateForScreenRow(presenter, 1)).toBeUndefined() + expect(lineNumberStateForScreenRow(presenter, 7)).toBeDefined() + expect(lineNumberStateForScreenRow(presenter, 8)).toBeUndefined() + + expectStateUpdate presenter, -> advanceClock(200) + + expect(lineNumberStateForScreenRow(presenter, 0)).toBeUndefined() + expect(lineNumberStateForScreenRow(presenter, 1)).toBeUndefined() + expect(lineNumberStateForScreenRow(presenter, 7)).toBeDefined() + expect(lineNumberStateForScreenRow(presenter, 8)).toBeUndefined() + + it "correctly handles the first screen line being soft-wrapped", -> + editor.setSoftWrapped(true) + editor.setEditorWidthInChars(30) + presenter = buildPresenter(explicitHeight: 25, scrollTop: 50) + + expectValues lineNumberStateForScreenRow(presenter, 5), {screenRow: 5, bufferRow: 3, softWrapped: true} + expectValues lineNumberStateForScreenRow(presenter, 6), {screenRow: 6, bufferRow: 3, softWrapped: true} + expectValues lineNumberStateForScreenRow(presenter, 7), {screenRow: 7, bufferRow: 4, softWrapped: false} + + describe ".decorationClasses", -> + it "adds decoration classes to the relevant line number state objects, both initially and when decorations change", -> + marker1 = editor.markBufferRange([[4, 0], [6, 2]], invalidate: 'touch') + decoration1 = editor.decorateMarker(marker1, type: 'line-number', class: 'a') + presenter = buildPresenter() + marker2 = editor.markBufferRange([[4, 0], [6, 2]], invalidate: 'touch') + decoration2 = editor.decorateMarker(marker2, type: 'line-number', class: 'b') + + expect(lineNumberStateForScreenRow(presenter, 3).decorationClasses).toBeNull() + expect(lineNumberStateForScreenRow(presenter, 4).decorationClasses).toEqual ['a', 'b'] + expect(lineNumberStateForScreenRow(presenter, 5).decorationClasses).toEqual ['a', 'b'] + expect(lineNumberStateForScreenRow(presenter, 6).decorationClasses).toEqual ['a', 'b'] + expect(lineNumberStateForScreenRow(presenter, 7).decorationClasses).toBeNull() + + expectStateUpdate presenter, -> editor.getBuffer().insert([5, 0], 'x') + expect(marker1.isValid()).toBe false + expect(lineNumberStateForScreenRow(presenter, 4).decorationClasses).toBeNull() + expect(lineNumberStateForScreenRow(presenter, 5).decorationClasses).toBeNull() + expect(lineNumberStateForScreenRow(presenter, 6).decorationClasses).toBeNull() + + expectStateUpdate presenter, -> editor.undo() + expect(lineNumberStateForScreenRow(presenter, 3).decorationClasses).toBeNull() + expect(lineNumberStateForScreenRow(presenter, 4).decorationClasses).toEqual ['a', 'b'] + expect(lineNumberStateForScreenRow(presenter, 5).decorationClasses).toEqual ['a', 'b'] + expect(lineNumberStateForScreenRow(presenter, 6).decorationClasses).toEqual ['a', 'b'] + expect(lineNumberStateForScreenRow(presenter, 7).decorationClasses).toBeNull() + + expectStateUpdate presenter, -> marker1.setBufferRange([[2, 0], [4, 2]]) + expect(lineNumberStateForScreenRow(presenter, 1).decorationClasses).toBeNull() + expect(lineNumberStateForScreenRow(presenter, 2).decorationClasses).toEqual ['a'] + expect(lineNumberStateForScreenRow(presenter, 3).decorationClasses).toEqual ['a'] + expect(lineNumberStateForScreenRow(presenter, 4).decorationClasses).toEqual ['a', 'b'] + expect(lineNumberStateForScreenRow(presenter, 5).decorationClasses).toEqual ['b'] + expect(lineNumberStateForScreenRow(presenter, 6).decorationClasses).toEqual ['b'] + expect(lineNumberStateForScreenRow(presenter, 7).decorationClasses).toBeNull() + + expectStateUpdate presenter, -> decoration1.destroy() + expect(lineNumberStateForScreenRow(presenter, 2).decorationClasses).toBeNull() + expect(lineNumberStateForScreenRow(presenter, 3).decorationClasses).toBeNull() + expect(lineNumberStateForScreenRow(presenter, 4).decorationClasses).toEqual ['b'] + expect(lineNumberStateForScreenRow(presenter, 5).decorationClasses).toEqual ['b'] + expect(lineNumberStateForScreenRow(presenter, 6).decorationClasses).toEqual ['b'] + expect(lineNumberStateForScreenRow(presenter, 7).decorationClasses).toBeNull() + + expectStateUpdate presenter, -> marker2.destroy() + expect(lineNumberStateForScreenRow(presenter, 2).decorationClasses).toBeNull() + expect(lineNumberStateForScreenRow(presenter, 3).decorationClasses).toBeNull() + expect(lineNumberStateForScreenRow(presenter, 4).decorationClasses).toBeNull() + expect(lineNumberStateForScreenRow(presenter, 5).decorationClasses).toBeNull() + expect(lineNumberStateForScreenRow(presenter, 6).decorationClasses).toBeNull() + expect(lineNumberStateForScreenRow(presenter, 7).decorationClasses).toBeNull() + + it "honors the 'onlyEmpty' option on line-number decorations", -> + presenter = buildPresenter() + marker = editor.markBufferRange([[4, 0], [6, 1]]) + decoration = editor.decorateMarker(marker, type: 'line-number', class: 'a', onlyEmpty: true) + + expect(lineNumberStateForScreenRow(presenter, 4).decorationClasses).toBeNull() + expect(lineNumberStateForScreenRow(presenter, 5).decorationClasses).toBeNull() + expect(lineNumberStateForScreenRow(presenter, 6).decorationClasses).toBeNull() + + expectStateUpdate presenter, -> marker.clearTail() + + expect(lineNumberStateForScreenRow(presenter, 4).decorationClasses).toBeNull() + expect(lineNumberStateForScreenRow(presenter, 5).decorationClasses).toBeNull() + expect(lineNumberStateForScreenRow(presenter, 6).decorationClasses).toEqual ['a'] + + it "honors the 'onlyNonEmpty' option on line-number decorations", -> + presenter = buildPresenter() + marker = editor.markBufferRange([[4, 0], [6, 2]]) + decoration = editor.decorateMarker(marker, type: 'line-number', class: 'a', onlyNonEmpty: true) + + expect(lineNumberStateForScreenRow(presenter, 4).decorationClasses).toEqual ['a'] + expect(lineNumberStateForScreenRow(presenter, 5).decorationClasses).toEqual ['a'] + expect(lineNumberStateForScreenRow(presenter, 6).decorationClasses).toEqual ['a'] + + expectStateUpdate presenter, -> marker.clearTail() + + expect(lineNumberStateForScreenRow(presenter, 6).decorationClasses).toBeNull() + + it "honors the 'onlyHead' option on line-number decorations", -> + presenter = buildPresenter() + marker = editor.markBufferRange([[4, 0], [6, 2]]) + decoration = editor.decorateMarker(marker, type: 'line-number', class: 'a', onlyHead: true) + + expect(lineNumberStateForScreenRow(presenter, 4).decorationClasses).toBeNull() + expect(lineNumberStateForScreenRow(presenter, 5).decorationClasses).toBeNull() + expect(lineNumberStateForScreenRow(presenter, 6).decorationClasses).toEqual ['a'] + + it "does not decorate the last line of a non-empty line-number decoration range if it ends at column 0", -> + presenter = buildPresenter() + marker = editor.markBufferRange([[4, 0], [6, 0]]) + decoration = editor.decorateMarker(marker, type: 'line-number', class: 'a') + + expect(lineNumberStateForScreenRow(presenter, 4).decorationClasses).toEqual ['a'] + expect(lineNumberStateForScreenRow(presenter, 5).decorationClasses).toEqual ['a'] + expect(lineNumberStateForScreenRow(presenter, 6).decorationClasses).toBeNull() + + it "does not apply line-number decorations to mini editors", -> + editor.setMini(true) + presenter = buildPresenter() + marker = editor.markBufferRange([[0, 0], [0, 0]]) + decoration = editor.decorateMarker(marker, type: 'line-number', class: 'a') + # A mini editor will have no gutters. + expect(getLineNumberGutterState(presenter)).toBeUndefined() + + expectStateUpdate presenter, -> editor.setMini(false) + expect(lineNumberStateForScreenRow(presenter, 0).decorationClasses).toEqual ['cursor-line', 'cursor-line-no-selection', 'a'] + + expectStateUpdate presenter, -> editor.setMini(true) + expect(getLineNumberGutterState(presenter)).toBeUndefined() + + it "only applies line-number decorations to screen rows that are spanned by their marker when lines are soft-wrapped", -> + editor.setText("a line that wraps, ok") + editor.setSoftWrapped(true) + editor.setEditorWidthInChars(16) + marker = editor.markBufferRange([[0, 0], [0, 2]]) + editor.decorateMarker(marker, type: 'line-number', class: 'a') + presenter = buildPresenter(explicitHeight: 10) + + expect(lineNumberStateForScreenRow(presenter, 0).decorationClasses).toContain 'a' + expect(lineNumberStateForScreenRow(presenter, 1).decorationClasses).toBeNull() + + marker.setBufferRange([[0, 0], [0, Infinity]]) + expect(lineNumberStateForScreenRow(presenter, 0).decorationClasses).toContain 'a' + expect(lineNumberStateForScreenRow(presenter, 1).decorationClasses).toContain 'a' + + describe ".foldable", -> + it "marks line numbers at the start of a foldable region as foldable", -> + presenter = buildPresenter() + expect(lineNumberStateForScreenRow(presenter, 0).foldable).toBe true + expect(lineNumberStateForScreenRow(presenter, 1).foldable).toBe true + expect(lineNumberStateForScreenRow(presenter, 2).foldable).toBe false + expect(lineNumberStateForScreenRow(presenter, 3).foldable).toBe false + expect(lineNumberStateForScreenRow(presenter, 4).foldable).toBe true + expect(lineNumberStateForScreenRow(presenter, 5).foldable).toBe false + + it "updates the foldable class on the correct line numbers when the foldable positions change", -> + presenter = buildPresenter() + editor.getBuffer().insert([0, 0], '\n') + expect(lineNumberStateForScreenRow(presenter, 0).foldable).toBe false + expect(lineNumberStateForScreenRow(presenter, 1).foldable).toBe true + expect(lineNumberStateForScreenRow(presenter, 2).foldable).toBe true + expect(lineNumberStateForScreenRow(presenter, 3).foldable).toBe false + expect(lineNumberStateForScreenRow(presenter, 4).foldable).toBe false + expect(lineNumberStateForScreenRow(presenter, 5).foldable).toBe true + expect(lineNumberStateForScreenRow(presenter, 6).foldable).toBe false + + it "updates the foldable class on a line number that becomes foldable", -> + presenter = buildPresenter() + expect(lineNumberStateForScreenRow(presenter, 11).foldable).toBe false + + editor.getBuffer().insert([11, 44], '\n fold me') + expect(lineNumberStateForScreenRow(presenter, 11).foldable).toBe true + + editor.undo() + expect(lineNumberStateForScreenRow(presenter, 11).foldable).toBe false + describe "for a gutter description that corresponds to a custom gutter", -> describe ".content", -> getContentForGutterWithName = (presenter, gutterName) -> From fe2cfff7a67c7e5a800d7fd2467ba28621bdce9c Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Wed, 13 May 2015 17:00:30 -0700 Subject: [PATCH 286/335] Allocate fewer objects for fold attributes in DisplayBuffer --- src/display-buffer.coffee | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/display-buffer.coffee b/src/display-buffer.coffee index f4c078b17..37120dd83 100644 --- a/src/display-buffer.coffee +++ b/src/display-buffer.coffee @@ -42,6 +42,7 @@ class DisplayBuffer extends Model @disposables.add @buffer.onDidUpdateMarkers @handleBufferMarkersUpdated @disposables.add @buffer.onDidCreateMarker @handleBufferMarkerCreated @updateAllScreenLines() + @foldMarkerAttributes = Object.freeze({class: 'fold', displayBufferId: @id}) @createFoldForMarker(marker) for marker in @buffer.findMarkers(@getFoldMarkerAttributes()) subscribeToScopedConfigSettings: => @@ -1075,8 +1076,11 @@ class DisplayBuffer extends Model findFoldMarkers: (attributes) -> @buffer.findMarkers(@getFoldMarkerAttributes(attributes)) - getFoldMarkerAttributes: (attributes={}) -> - _.extend(attributes, class: 'fold', displayBufferId: @id) + getFoldMarkerAttributes: (attributes) -> + if attributes + _.extend(attributes, @foldMarkerAttributes) + else + @foldMarkerAttributes pauseMarkerChangeEvents: -> marker.pauseChangeEvents() for marker in @getMarkers() From e73f47dfa30ede157c29605a798cc2a7f87e8b47 Mon Sep 17 00:00:00 2001 From: simurai Date: Thu, 14 May 2015 10:09:30 +0900 Subject: [PATCH 287/335] :arrow_up: status-bar@0.72.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5cfd5b6d0..3c2bf1c69 100644 --- a/package.json +++ b/package.json @@ -118,7 +118,7 @@ "settings-view": "0.199.0", "snippets": "0.89.0", "spell-check": "0.58.0", - "status-bar": "0.71.0", + "status-bar": "0.72.0", "styleguide": "0.44.0", "symbols-view": "0.96.0", "tabs": "0.68.0", From 80d41c70ee355b472ba1ef3202ffd5d4c4469f2f Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Wed, 13 May 2015 18:15:46 -0700 Subject: [PATCH 288/335] :arrow_up: metrics@0.46.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3c2bf1c69..33a6811cc 100644 --- a/package.json +++ b/package.json @@ -110,7 +110,7 @@ "keybinding-resolver": "0.32.0", "link": "0.30.0", "markdown-preview": "0.148.0", - "metrics": "0.45.0", + "metrics": "0.46.0", "notifications": "0.43.0", "open-on-github": "0.36.0", "package-generator": "0.39.0", From 0a0c42850b64124a077d3258ead6eade9e878272 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Wed, 13 May 2015 18:18:57 -0700 Subject: [PATCH 289/335] :arrow_up: autocomplete-plus@2.15.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 33a6811cc..c2bdb47f5 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "autocomplete-css": "0.7.2", "autocomplete-emojis": "2.2.2", "autocomplete-html": "0.7.2", - "autocomplete-plus": "2.15.1", + "autocomplete-plus": "2.15.2", "autocomplete-snippets": "1.6.1", "autoflow": "0.23.0", "autosave": "0.20.0", From 19d905606b8572397c22e9ec8aa3194d3f9fdf67 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Wed, 13 May 2015 19:59:25 -0700 Subject: [PATCH 290/335] Avoid double computation of screen lines when opening files Previously, instantiating a TextEditor would always compute compute screen lines twice: once when the DisplayBuffer was instantiated, and once when the 'invisibles' property was set on the DisplayBuffer. --- spec/text-editor-spec.coffee | 10 +++---- spec/tokenized-buffer-spec.coffee | 13 +++++---- src/display-buffer.coffee | 11 ++++---- src/text-editor.coffee | 29 ++----------------- src/tokenized-buffer.coffee | 47 +++++++++++++++++++++++-------- 5 files changed, 54 insertions(+), 56 deletions(-) diff --git a/spec/text-editor-spec.coffee b/spec/text-editor-spec.coffee index dd6b69f26..d1d311088 100644 --- a/spec/text-editor-spec.coffee +++ b/spec/text-editor-spec.coffee @@ -36,23 +36,21 @@ describe "TextEditor", -> it "preserves the invisibles setting", -> atom.config.set('editor.showInvisibles', true) - previousInvisibles = editor.displayBuffer.invisibles + previousInvisibles = editor.tokenizedLineForScreenRow(0).invisibles editor2 = editor.testSerialization() - expect(editor2.displayBuffer.invisibles).toEqual previousInvisibles - expect(editor2.displayBuffer.tokenizedBuffer.invisibles).toEqual previousInvisibles + expect(previousInvisibles).toBeDefined() + expect(editor2.displayBuffer.tokenizedLineForScreenRow(0).invisibles).toEqual previousInvisibles it "updates invisibles if the settings have changed between serialization and deserialization", -> atom.config.set('editor.showInvisibles', true) - previousInvisibles = editor.displayBuffer.invisibles state = editor.serialize() atom.config.set('editor.invisibles', eol: '?') editor2 = TextEditor.deserialize(state) - expect(editor2.displayBuffer.invisibles.eol).toBe '?' - expect(editor2.displayBuffer.tokenizedBuffer.invisibles.eol).toBe '?' + expect(editor.tokenizedLineForScreenRow(0).invisibles.eol).toBe '?' describe "when the editor is constructed with an initialLine option", -> it "positions the cursor on the specified line", -> diff --git a/spec/tokenized-buffer-spec.coffee b/spec/tokenized-buffer-spec.coffee index 3cd776c2b..9d92335af 100644 --- a/spec/tokenized-buffer-spec.coffee +++ b/spec/tokenized-buffer-spec.coffee @@ -611,7 +611,8 @@ describe "TokenizedBuffer", -> tokenizedBuffer = new TokenizedBuffer({buffer}) fullyTokenize(tokenizedBuffer) - tokenizedBuffer.setInvisibles(space: 'S', tab: 'T') + atom.config.set("editor.showInvisibles", true) + atom.config.set("editor.invisibles", space: 'S', tab: 'T') fullyTokenize(tokenizedBuffer) expect(tokenizedBuffer.tokenizedLineForRow(0).text).toBe "SST Sa line with tabsTand T spacesSTS" @@ -623,7 +624,7 @@ describe "TokenizedBuffer", -> tokenizedBuffer = new TokenizedBuffer({buffer}) atom.config.set('editor.showInvisibles', true) - tokenizedBuffer.setInvisibles(cr: 'R', eol: 'N') + atom.config.set("editor.invisibles", cr: 'R', eol: 'N') fullyTokenize(tokenizedBuffer) expect(tokenizedBuffer.tokenizedLineForRow(0).endOfLineInvisibles).toEqual ['R', 'N'] @@ -634,7 +635,7 @@ describe "TokenizedBuffer", -> expect(left.endOfLineInvisibles).toBe null expect(right.endOfLineInvisibles).toEqual ['R', 'N'] - tokenizedBuffer.setInvisibles(cr: 'R', eol: false) + atom.config.set("editor.invisibles", cr: 'R', eol: false) expect(tokenizedBuffer.tokenizedLineForRow(0).endOfLineInvisibles).toEqual ['R'] expect(tokenizedBuffer.tokenizedLineForRow(1).endOfLineInvisibles).toEqual [] @@ -688,7 +689,8 @@ describe "TokenizedBuffer", -> it "sets leading and trailing whitespace correctly on a line with invisible characters that is copied", -> buffer.setText(" \t a line with tabs\tand \tspaces \t ") - tokenizedBuffer.setInvisibles(space: 'S', tab: 'T') + atom.config.set("editor.showInvisibles", true) + atom.config.set("editor.invisibles", space: 'S', tab: 'T') fullyTokenize(tokenizedBuffer) line = tokenizedBuffer.tokenizedLineForRow(0).copy() @@ -696,7 +698,8 @@ describe "TokenizedBuffer", -> expect(line.tokens[line.tokens.length - 1].firstTrailingWhitespaceIndex).toBe 0 it "sets the ::firstNonWhitespaceIndex and ::firstTrailingWhitespaceIndex correctly when tokens are split for soft-wrapping", -> - tokenizedBuffer.setInvisibles(space: 'S') + atom.config.set("editor.showInvisibles", true) + atom.config.set("editor.invisibles", space: 'S') buffer.setText(" token ") fullyTokenize(tokenizedBuffer) token = tokenizedBuffer.tokenizedLines[0].tokens[0] diff --git a/src/display-buffer.coffee b/src/display-buffer.coffee index 37120dd83..d5a893fe3 100644 --- a/src/display-buffer.coffee +++ b/src/display-buffer.coffee @@ -24,13 +24,13 @@ class DisplayBuffer extends Model horizontalScrollMargin: 6 scopedCharacterWidthsChangeCount: 0 - constructor: ({tabLength, @editorWidthInChars, @tokenizedBuffer, buffer, @invisibles}={}) -> + constructor: ({tabLength, @editorWidthInChars, @tokenizedBuffer, buffer, ignoreInvisibles}={}) -> super @emitter = new Emitter @disposables = new CompositeDisposable - @tokenizedBuffer ?= new TokenizedBuffer({tabLength, buffer, @invisibles}) + @tokenizedBuffer ?= new TokenizedBuffer({tabLength, buffer, ignoreInvisibles}) @buffer = @tokenizedBuffer.buffer @charWidthsByScope = {} @markers = {} @@ -87,14 +87,13 @@ class DisplayBuffer extends Model scrollTop: @scrollTop scrollLeft: @scrollLeft tokenizedBuffer: @tokenizedBuffer.serialize() - invisibles: _.clone(@invisibles) deserializeParams: (params) -> params.tokenizedBuffer = TokenizedBuffer.deserialize(params.tokenizedBuffer) params copy: -> - newDisplayBuffer = new DisplayBuffer({@buffer, tabLength: @getTabLength(), @invisibles}) + newDisplayBuffer = new DisplayBuffer({@buffer, tabLength: @getTabLength()}) newDisplayBuffer.setScrollTop(@getScrollTop()) newDisplayBuffer.setScrollLeft(@getScrollLeft()) @@ -429,8 +428,8 @@ class DisplayBuffer extends Model setTabLength: (tabLength) -> @tokenizedBuffer.setTabLength(tabLength) - setInvisibles: (@invisibles) -> - @tokenizedBuffer.setInvisibles(@invisibles) + setIgnoreInvisibles: (ignoreInvisibles) -> + @tokenizedBuffer.setIgnoreInvisibles(ignoreInvisibles) setSoftWrapped: (softWrapped) -> if softWrapped isnt @softWrapped diff --git a/src/text-editor.coffee b/src/text-editor.coffee index ac7c7d4f2..d2bd77522 100644 --- a/src/text-editor.coffee +++ b/src/text-editor.coffee @@ -84,12 +84,10 @@ class TextEditor extends Model @selections = [] buffer ?= new TextBuffer - @displayBuffer ?= new DisplayBuffer({buffer, tabLength, softWrapped}) + @displayBuffer ?= new DisplayBuffer({buffer, tabLength, softWrapped, ignoreInvisibles: @mini}) @buffer = @displayBuffer.buffer @softTabs = @usesSoftTabs() ? @softTabs ? atom.config.get('editor.softTabs') ? true - @updateInvisibles() - for marker in @findMarkers(@getSelectionMarkerAttributes()) marker.setProperties(preserveFolds: true) @addSelection(marker) @@ -170,21 +168,9 @@ class TextEditor extends Model @subscribe @displayBuffer.onDidAddDecoration (decoration) => @emit 'decoration-added', decoration @subscribe @displayBuffer.onDidRemoveDecoration (decoration) => @emit 'decoration-removed', decoration - @subscribeToScopedConfigSettings() - - subscribeToScopedConfigSettings: -> - @scopedConfigSubscriptions?.dispose() - @scopedConfigSubscriptions = subscriptions = new CompositeDisposable - - scopeDescriptor = @getRootScopeDescriptor() - - subscriptions.add atom.config.onDidChange 'editor.showInvisibles', scope: scopeDescriptor, => @updateInvisibles() - subscriptions.add atom.config.onDidChange 'editor.invisibles', scope: scopeDescriptor, => @updateInvisibles() - destroyed: -> @unsubscribe() if includeDeprecatedAPIs @disposables.dispose() - @scopedConfigSubscriptions.dispose() selection.destroy() for selection in @getSelections() @buffer.release() @displayBuffer.destroy() @@ -488,7 +474,7 @@ class TextEditor extends Model setMini: (mini) -> if mini isnt @mini @mini = mini - @updateInvisibles() + @displayBuffer.setIgnoreInvisibles(@mini) @emitter.emit 'did-change-mini', @mini @mini @@ -2779,15 +2765,6 @@ class TextEditor extends Model shouldAutoIndentOnPaste: -> atom.config.get("editor.autoIndentOnPaste", scope: @getRootScopeDescriptor()) - shouldShowInvisibles: -> - not @mini and atom.config.get('editor.showInvisibles', scope: @getRootScopeDescriptor()) - - updateInvisibles: -> - if @shouldShowInvisibles() - @displayBuffer.setInvisibles(atom.config.get('editor.invisibles', scope: @getRootScopeDescriptor())) - else - @displayBuffer.setInvisibles(null) - ### Section: Event Handlers ### @@ -2796,8 +2773,6 @@ class TextEditor extends Model @softTabs = @usesSoftTabs() ? @softTabs handleGrammarChange: -> - @updateInvisibles() - @subscribeToScopedConfigSettings() @unfoldAll() @emit 'grammar-changed' if includeDeprecatedAPIs @emitter.emit 'did-change-grammar', @getGrammar() diff --git a/src/tokenized-buffer.coffee b/src/tokenized-buffer.coffee index d9f1bcba7..b72e712a1 100644 --- a/src/tokenized-buffer.coffee +++ b/src/tokenized-buffer.coffee @@ -20,8 +20,9 @@ class TokenizedBuffer extends Model chunkSize: 50 invalidRows: null visible: false + configSettings: null - constructor: ({@buffer, @tabLength, @invisibles}) -> + constructor: ({@buffer, @tabLength, @ignoreInvisibles}) -> @emitter = new Emitter @disposables = new CompositeDisposable @@ -39,7 +40,7 @@ class TokenizedBuffer extends Model serializeParams: -> bufferPath: @buffer.getPath() tabLength: @tabLength - invisibles: _.clone(@invisibles) + ignoreInvisibles: @ignoreInvisibles deserializeParams: (params) -> params.buffer = atom.project.bufferForPathSync(params.bufferPath) @@ -76,13 +77,28 @@ class TokenizedBuffer extends Model @grammarUpdateDisposable = @grammar.onDidUpdate => @retokenizeLines() @disposables.add(@grammarUpdateDisposable) - @configSettings = tabLength: atom.config.get('editor.tabLength', scope: @rootScopeDescriptor) + scopeOptions = {scope: @rootScopeDescriptor} + @configSettings = + tabLength: atom.config.get('editor.tabLength', scopeOptions) + invisibles: atom.config.get('editor.invisibles', scopeOptions) + showInvisibles: atom.config.get('editor.showInvisibles', scopeOptions) - @grammarTabLengthSubscription?.dispose() - @grammarTabLengthSubscription = atom.config.onDidChange 'editor.tabLength', scope: @rootScopeDescriptor, ({newValue}) => + if @configSubscriptions? + @configSubscriptions.dispose() + @disposables.remove(@configSubscriptions) + @configSubscriptions = new CompositeDisposable + @configSubscriptions.add atom.config.onDidChange 'editor.tabLength', scopeOptions, ({newValue}) => @configSettings.tabLength = newValue @retokenizeLines() - @disposables.add(@grammarTabLengthSubscription) + @configSubscriptions.add atom.config.onDidChange 'editor.invisibles', scopeOptions, ({newValue}) => + oldInvisibles = @getInvisiblesToShow() + @configSettings.invisibles = newValue + @retokenizeLines() unless _.isEqual(@getInvisiblesToShow(), oldInvisibles) + @configSubscriptions.add atom.config.onDidChange 'editor.showInvisibles', scopeOptions, ({newValue}) => + oldInvisibles = @getInvisiblesToShow() + @configSettings.showInvisibles = newValue + @retokenizeLines() unless _.isEqual(@getInvisiblesToShow(), oldInvisibles) + @disposables.add(@configSubscriptions) @retokenizeLines() @@ -123,10 +139,11 @@ class TokenizedBuffer extends Model @tabLength = tabLength @retokenizeLines() - setInvisibles: (invisibles) -> - unless _.isEqual(invisibles, @invisibles) - @invisibles = invisibles - @retokenizeLines() + setIgnoreInvisibles: (ignoreInvisibles) -> + if ignoreInvisibles isnt @ignoreInvisibles + @ignoreInvisibles = ignoreInvisibles + if @configSettings.showInvisibles and @configSettings.invisibles? + @retokenizeLines() tokenizeInBackground: -> return if not @visible or @pendingChunk or not @isAlive() @@ -302,7 +319,7 @@ class TokenizedBuffer extends Model tabLength = @getTabLength() indentLevel = @indentLevelForRow(row) lineEnding = @buffer.lineEndingForRow(row) - new TokenizedLine({tokens, tabLength, indentLevel, @invisibles, lineEnding}) + new TokenizedLine({tokens, tabLength, indentLevel, invisibles: @getInvisiblesToShow(), lineEnding}) buildTokenizedLineForRow: (row, ruleStack) -> @buildTokenizedLineForRowWithText(row, @buffer.lineForRow(row), ruleStack) @@ -312,7 +329,13 @@ class TokenizedBuffer extends Model tabLength = @getTabLength() indentLevel = @indentLevelForRow(row) {tokens, ruleStack} = @grammar.tokenizeLine(line, ruleStack, row is 0) - new TokenizedLine({tokens, ruleStack, tabLength, lineEnding, indentLevel, @invisibles}) + new TokenizedLine({tokens, ruleStack, tabLength, lineEnding, indentLevel, invisibles: @getInvisiblesToShow()}) + + getInvisiblesToShow: -> + if @configSettings.showInvisibles and not @ignoreInvisibles + @configSettings.invisibles + else + null tokenizedLineForRow: (bufferRow) -> @tokenizedLines[bufferRow] From 31c1ac412b4343b33ffc15befd374a8e8ae76edf Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Wed, 13 May 2015 21:23:20 -0700 Subject: [PATCH 291/335] :art: remove duplication in TokenizedBuffer::setGrammar --- src/tokenized-buffer.coffee | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/tokenized-buffer.coffee b/src/tokenized-buffer.coffee index b72e712a1..6d8f0c018 100644 --- a/src/tokenized-buffer.coffee +++ b/src/tokenized-buffer.coffee @@ -90,14 +90,11 @@ class TokenizedBuffer extends Model @configSubscriptions.add atom.config.onDidChange 'editor.tabLength', scopeOptions, ({newValue}) => @configSettings.tabLength = newValue @retokenizeLines() - @configSubscriptions.add atom.config.onDidChange 'editor.invisibles', scopeOptions, ({newValue}) => - oldInvisibles = @getInvisiblesToShow() - @configSettings.invisibles = newValue - @retokenizeLines() unless _.isEqual(@getInvisiblesToShow(), oldInvisibles) - @configSubscriptions.add atom.config.onDidChange 'editor.showInvisibles', scopeOptions, ({newValue}) => - oldInvisibles = @getInvisiblesToShow() - @configSettings.showInvisibles = newValue - @retokenizeLines() unless _.isEqual(@getInvisiblesToShow(), oldInvisibles) + ['invisibles', 'showInvisibles'].forEach (key) => + @configSubscriptions.add atom.config.onDidChange "editor.#{key}", scopeOptions, ({newValue}) => + oldInvisibles = @getInvisiblesToShow() + @configSettings[key] = newValue + @retokenizeLines() unless _.isEqual(@getInvisiblesToShow(), oldInvisibles) @disposables.add(@configSubscriptions) @retokenizeLines() From 44f6c70101b6f7c2ba0001a5d78ef44dbbbba5ea Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 14 May 2015 08:58:04 -0700 Subject: [PATCH 292/335] :arrow_up: notifications@0.44 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c2bdb47f5..8ffda89eb 100644 --- a/package.json +++ b/package.json @@ -111,7 +111,7 @@ "link": "0.30.0", "markdown-preview": "0.148.0", "metrics": "0.46.0", - "notifications": "0.43.0", + "notifications": "0.44.0", "open-on-github": "0.36.0", "package-generator": "0.39.0", "release-notes": "0.52.0", From 64573904f93064ca68bf99ab2bb0a8055e047944 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 14 May 2015 09:12:23 -0700 Subject: [PATCH 293/335] :arrow_up: metrics@0.47 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4b728f95c..072279196 100644 --- a/package.json +++ b/package.json @@ -110,7 +110,7 @@ "keybinding-resolver": "0.32.0", "link": "0.30.0", "markdown-preview": "0.148.0", - "metrics": "0.46.0", + "metrics": "0.47.0", "notifications": "0.44.0", "open-on-github": "0.36.0", "package-generator": "0.39.0", From 1a0d99621bfe8bd46dda2dc6072a21c777e2d5a1 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Thu, 14 May 2015 09:36:12 -0700 Subject: [PATCH 294/335] Avoid saving window state when closing windows after quitting --- src/browser/atom-application.coffee | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/browser/atom-application.coffee b/src/browser/atom-application.coffee index afc811144..d81660a49 100644 --- a/src/browser/atom-application.coffee +++ b/src/browser/atom-application.coffee @@ -56,6 +56,7 @@ class AtomApplication atomProtocolHandler: null resourcePath: null version: null + quitting: false exit: (status) -> app.exit(status) @@ -104,7 +105,7 @@ class AtomApplication if process.platform in ['win32', 'linux'] app.quit() return - @saveState() unless window.isSpec + @saveState() unless window.isSpec or @quitting # Public: Adds the {AtomWindow} to the global window list. addWindow: (window) -> @@ -208,6 +209,9 @@ class AtomApplication @openPathOnEvent('application:open-your-stylesheet', 'atom://.atom/stylesheet') @openPathOnEvent('application:open-license', path.join(process.resourcesPath, 'LICENSE.md')) + app.on 'before-quit', => + @quitting = true + app.on 'will-quit', => @killAllProcesses() @deleteSocketFile() From ff56c1f0bb4d5132dd8c01e0c05f5cb0a2118e75 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 14 May 2015 09:49:04 -0700 Subject: [PATCH 295/335] :arrow_up: metrics@0.48 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 072279196..cdc464084 100644 --- a/package.json +++ b/package.json @@ -110,7 +110,7 @@ "keybinding-resolver": "0.32.0", "link": "0.30.0", "markdown-preview": "0.148.0", - "metrics": "0.47.0", + "metrics": "0.48.0", "notifications": "0.44.0", "open-on-github": "0.36.0", "package-generator": "0.39.0", From c4d7df9e991a5743c130cd9c495ce49ca9cfe981 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 14 May 2015 09:54:22 -0700 Subject: [PATCH 296/335] Prevent global variables from leaking out of index.js --- spec/atom-spec.coffee | 2 +- static/index.js | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/spec/atom-spec.coffee b/spec/atom-spec.coffee index 99a7f432e..c5c4255e3 100644 --- a/spec/atom-spec.coffee +++ b/spec/atom-spec.coffee @@ -20,7 +20,7 @@ describe "the `atom` global", -> afterEach -> atom.setSize(originalSize.width, originalSize.height) - it 'sets the size of the window, and can retrieve the size just set', -> + fit 'sets the size of the window, and can retrieve the size just set', -> atom.setSize(100, 400) expect(atom.getSize()).toEqual width: 100, height: 400 diff --git a/static/index.js b/static/index.js index ef61e8bce..f41d41cd9 100644 --- a/static/index.js +++ b/static/index.js @@ -1,3 +1,5 @@ +(function() { + var fs = require('fs'); var path = require('path'); @@ -204,3 +206,5 @@ var setupWindowBackground = function() { parseLoadSettings(); setupWindowBackground(); + +})(); From b2ee37ab2925a44b840417e68427d923d5eaa197 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 14 May 2015 10:01:06 -0700 Subject: [PATCH 297/335] Unfocus spec --- spec/atom-spec.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/atom-spec.coffee b/spec/atom-spec.coffee index c5c4255e3..99a7f432e 100644 --- a/spec/atom-spec.coffee +++ b/spec/atom-spec.coffee @@ -20,7 +20,7 @@ describe "the `atom` global", -> afterEach -> atom.setSize(originalSize.width, originalSize.height) - fit 'sets the size of the window, and can retrieve the size just set', -> + it 'sets the size of the window, and can retrieve the size just set', -> atom.setSize(100, 400) expect(atom.getSize()).toEqual width: 100, height: 400 From 827595fcda21c399d2129a631ab2bbacde3489f8 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 14 May 2015 10:07:42 -0700 Subject: [PATCH 298/335] :arrow_up: fuzzy-finder@0.85 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cdc464084..c8f726ed7 100644 --- a/package.json +++ b/package.json @@ -101,7 +101,7 @@ "encoding-selector": "0.20.0", "exception-reporting": "0.24.0", "find-and-replace": "0.162.0", - "fuzzy-finder": "0.84.0", + "fuzzy-finder": "0.85.0", "git-diff": "0.55.0", "go-to-line": "0.30.0", "grammar-selector": "0.47.0", From 26f3fd3cdf8cb657326e14bf036b07d51f3b3c91 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 14 May 2015 10:08:47 -0700 Subject: [PATCH 299/335] :arrow_up: deprecation-cop@0.48 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c8f726ed7..61e1826f9 100644 --- a/package.json +++ b/package.json @@ -96,7 +96,7 @@ "bookmarks": "0.35.0", "bracket-matcher": "0.74.0", "command-palette": "0.35.0", - "deprecation-cop": "0.47.0", + "deprecation-cop": "0.48.0", "dev-live-reload": "0.46.0", "encoding-selector": "0.20.0", "exception-reporting": "0.24.0", From c9302e06f0ca3c4afd354e8c007e12a71064d97f Mon Sep 17 00:00:00 2001 From: Jessica Lord Date: Thu, 14 May 2015 10:10:55 -0700 Subject: [PATCH 300/335] Bump version of autocomplete-plus@2.16.0 Add license filed for passing tests and standardization. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cf4634cf6..4dfe23c0f 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "autocomplete-css": "0.7.2", "autocomplete-emojis": "2.2.2", "autocomplete-html": "0.7.2", - "autocomplete-plus": "2.15.2", + "autocomplete-plus": "2.16.0", "autocomplete-snippets": "1.6.1", "autoflow": "0.23.0", "autosave": "0.20.0", From 372fdc2ae0e4cda064d93d0a6633f30e15d0cbcf Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 14 May 2015 10:14:28 -0700 Subject: [PATCH 301/335] :arrow_up: update-package-dependencies@0.10 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 61e1826f9..a960b10a0 100644 --- a/package.json +++ b/package.json @@ -124,7 +124,7 @@ "tabs": "0.68.0", "timecop": "0.31.0", "tree-view": "0.171.0", - "update-package-dependencies": "0.9.0", + "update-package-dependencies": "0.10.0", "welcome": "0.27.0", "whitespace": "0.29.0", "wrap-guide": "0.33.0", From 881001b15adeea6cb2bb2234132d9c05b80c08c5 Mon Sep 17 00:00:00 2001 From: Jess Lin Date: Thu, 14 May 2015 10:19:25 -0700 Subject: [PATCH 302/335] [Gutter][easy] Reverse a conditional to get rid of a 'not' --- src/text-editor-presenter.coffee | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index 27966ff7a..70c26a1a3 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -481,12 +481,12 @@ class TextEditorPresenter for gutter in @model.getGutters() gutterName = gutter.name gutterDecorations = @customGutterDecorations[gutterName] - if not gutterDecorations - @customGutterDecorations[gutterName] = {} - else + if gutterDecorations # Clear the gutter decorations; they are rebuilt. # We clear instead of reassigning to preserve the reference. @clearDecorationsForCustomGutterName(gutterName) + else + @customGutterDecorations[gutterName] = {} return if not @gutterIsVisible(gutter) relevantDecorations = @customGutterDecorationsInRange(gutterName, @startRow, @endRow - 1) From a78bd1b774e98f4e9790f534e6ef4e6418467309 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Thu, 14 May 2015 10:20:51 -0700 Subject: [PATCH 303/335] :arrow_up: autocomplete-plus@2.16.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a960b10a0..b7fd6f2a2 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "autocomplete-css": "0.7.2", "autocomplete-emojis": "2.2.2", "autocomplete-html": "0.7.2", - "autocomplete-plus": "2.15.2", + "autocomplete-plus": "2.16.1", "autocomplete-snippets": "1.6.1", "autoflow": "0.23.0", "autosave": "0.20.0", From 36b93069b13d869e17c31b93f9a4a89b68168678 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 14 May 2015 10:27:19 -0700 Subject: [PATCH 304/335] :arrow_up: command-palette@0.36 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b7fd6f2a2..b108fb291 100644 --- a/package.json +++ b/package.json @@ -95,7 +95,7 @@ "background-tips": "0.24.0", "bookmarks": "0.35.0", "bracket-matcher": "0.74.0", - "command-palette": "0.35.0", + "command-palette": "0.36.0", "deprecation-cop": "0.48.0", "dev-live-reload": "0.46.0", "encoding-selector": "0.20.0", From 1c0aceaaa3aeab610b902d61214b6dde878f96e7 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 14 May 2015 10:32:11 -0700 Subject: [PATCH 305/335] :arrow_up: notifications@0.45 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b108fb291..e09744896 100644 --- a/package.json +++ b/package.json @@ -111,7 +111,7 @@ "link": "0.30.0", "markdown-preview": "0.148.0", "metrics": "0.48.0", - "notifications": "0.44.0", + "notifications": "0.45.0", "open-on-github": "0.36.0", "package-generator": "0.39.0", "release-notes": "0.52.0", From 4f8dc77fb4e35fed099438d02190f9889d81d21f Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 14 May 2015 10:35:32 -0700 Subject: [PATCH 306/335] :arrow_up: find-and-replace@0.163 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e09744896..ed3279ef1 100644 --- a/package.json +++ b/package.json @@ -100,7 +100,7 @@ "dev-live-reload": "0.46.0", "encoding-selector": "0.20.0", "exception-reporting": "0.24.0", - "find-and-replace": "0.162.0", + "find-and-replace": "0.163.0", "fuzzy-finder": "0.85.0", "git-diff": "0.55.0", "go-to-line": "0.30.0", From ccaf6220ceda7bf77605f6aed99b4d7ceaacb320 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 14 May 2015 10:39:07 -0700 Subject: [PATCH 307/335] Add missing fs-plus require --- spec/default-directory-provider-spec.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/spec/default-directory-provider-spec.coffee b/spec/default-directory-provider-spec.coffee index 236283d27..69370a77b 100644 --- a/spec/default-directory-provider-spec.coffee +++ b/spec/default-directory-provider-spec.coffee @@ -1,5 +1,6 @@ DefaultDirectoryProvider = require "../src/default-directory-provider" path = require "path" +fs = require 'fs-plus' temp = require "temp" describe "DefaultDirectoryProvider", -> From f1b5834c2fb96226590e94527bec3058cc542c98 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 14 May 2015 10:46:38 -0700 Subject: [PATCH 308/335] :arrow_up: notifications@0.46 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ed3279ef1..38553406b 100644 --- a/package.json +++ b/package.json @@ -111,7 +111,7 @@ "link": "0.30.0", "markdown-preview": "0.148.0", "metrics": "0.48.0", - "notifications": "0.45.0", + "notifications": "0.46.0", "open-on-github": "0.36.0", "package-generator": "0.39.0", "release-notes": "0.52.0", From 70e326d556b963637f28177ce94111ab12c5dff0 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 14 May 2015 10:53:11 -0700 Subject: [PATCH 309/335] :arrow_up: autocomplete-plus@2.16.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 38553406b..caff33ac2 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "autocomplete-css": "0.7.2", "autocomplete-emojis": "2.2.2", "autocomplete-html": "0.7.2", - "autocomplete-plus": "2.16.1", + "autocomplete-plus": "2.16.2", "autocomplete-snippets": "1.6.1", "autoflow": "0.23.0", "autosave": "0.20.0", From b5d4eebe2ab7f3b2cdcfafc8710662b4c63efbd3 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Thu, 14 May 2015 11:07:54 -0700 Subject: [PATCH 310/335] :arrow_up: autocomplete-plus@2.16.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index caff33ac2..2609c065d 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "autocomplete-css": "0.7.2", "autocomplete-emojis": "2.2.2", "autocomplete-html": "0.7.2", - "autocomplete-plus": "2.16.2", + "autocomplete-plus": "2.16.3", "autocomplete-snippets": "1.6.1", "autoflow": "0.23.0", "autosave": "0.20.0", From 5dd4a2a1dc03480121355ede3f3b51106f599b86 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 14 May 2015 11:29:39 -0700 Subject: [PATCH 311/335] Remove metadata return --- src/package.coffee | 1 - 1 file changed, 1 deletion(-) diff --git a/src/package.coffee b/src/package.coffee index 95f769e49..c8c530bed 100644 --- a/src/package.coffee +++ b/src/package.coffee @@ -31,7 +31,6 @@ class Package normalizePackageData(metadata) if metadata.repository?.type is 'git' metadata.repository.url = metadata.repository.url?.replace(/^git\+/, '') - metadata @loadMetadata: (packagePath, ignoreErrors=false) -> packageName = path.basename(packagePath) From 117080b16d9d4c2a33bad05eb26931397c033904 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 14 May 2015 11:30:41 -0700 Subject: [PATCH 312/335] Check that url is string before replacing prefix --- src/package.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/package.coffee b/src/package.coffee index c8c530bed..b48ed8014 100644 --- a/src/package.coffee +++ b/src/package.coffee @@ -29,8 +29,8 @@ class Package unless metadata?._id normalizePackageData ?= require 'normalize-package-data' normalizePackageData(metadata) - if metadata.repository?.type is 'git' - metadata.repository.url = metadata.repository.url?.replace(/^git\+/, '') + if metadata.repository?.type is 'git' and typeof metadata.repository.url is 'string' + metadata.repository.url = metadata.repository.url.replace(/^git\+/, '') @loadMetadata: (packagePath, ignoreErrors=false) -> packageName = path.basename(packagePath) From b006169ae70a6a747176f8f61eb1342cf64076ee Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 14 May 2015 12:29:00 -0700 Subject: [PATCH 313/335] Unship autocomplete-emojis until Windows/Linux support --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index 4f33d15e9..f74118ca2 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,6 @@ "archive-view": "0.57.0", "autocomplete-atom-api": "0.9.0", "autocomplete-css": "0.7.2", - "autocomplete-emojis": "2.2.2", "autocomplete-html": "0.7.2", "autocomplete-plus": "2.16.3", "autocomplete-snippets": "1.6.1", From f48351ed6a762995406ea5604fda2b7d6d761405 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 14 May 2015 12:31:38 -0700 Subject: [PATCH 314/335] Remove uninstalling of autocomplete-emojis --- src/package-manager.coffee | 1 - 1 file changed, 1 deletion(-) diff --git a/src/package-manager.coffee b/src/package-manager.coffee index 606f72eda..8d2f4d663 100644 --- a/src/package-manager.coffee +++ b/src/package-manager.coffee @@ -427,7 +427,6 @@ class PackageManager path.join(packageDir, 'autocomplete-atom-api') path.join(packageDir, 'autocomplete-css') path.join(packageDir, 'autocomplete-html') - path.join(packageDir, 'autocomplete-emojis') path.join(packageDir, 'autocomplete-snippets') ] for dirToRemove in dirsToRemove From 9bb1b14d86218c3988eac8caf6ab3669b5dd3e44 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 14 May 2015 12:59:28 -0700 Subject: [PATCH 315/335] Prepare 0.200 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f74118ca2..4bf5e6d76 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "atom", "productName": "Atom", - "version": "0.199.0", + "version": "0.200.0", "description": "A hackable text editor for the 21st Century.", "main": "./src/browser/main.js", "repository": { From e838f0b29748c31e8364c46319b5f42d3c6e4b3f Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Thu, 14 May 2015 14:28:46 -0700 Subject: [PATCH 316/335] :arrow_up: text-buffer to 6.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 75921a02b..515116973 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "space-pen": "3.8.2", "stacktrace-parser": "0.1.1", "temp": "0.8.1", - "text-buffer": "6.0.0-beta.2", + "text-buffer": "6.0.0", "theorist": "^1.0.2", "typescript-simple": "1.0.0", "underscore-plus": "^1.6.6" From d9e4aa16d2a4b40315659441b27751a48b3f2364 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Thu, 14 May 2015 15:37:23 -0700 Subject: [PATCH 317/335] Run package specs from the active item's project folder --- spec/workspace-element-spec.coffee | 44 ++++++++++++++++++++++++++++++ src/workspace-element.coffee | 5 +++- 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 spec/workspace-element-spec.coffee diff --git a/spec/workspace-element-spec.coffee b/spec/workspace-element-spec.coffee new file mode 100644 index 000000000..1771b2363 --- /dev/null +++ b/spec/workspace-element-spec.coffee @@ -0,0 +1,44 @@ +ipc = require 'ipc' +path = require 'path' +temp = require('temp').track() + +describe "WorkspaceElement", -> + workspaceElement = null + + beforeEach -> + workspaceElement = atom.views.getView(atom.workspace) + + describe "the 'window:run-package-specs' command", -> + it "runs the package specs for the active item's project path, or the first project path", -> + spyOn(ipc, 'send') + + # No project paths. Don't try to run specs. + atom.commands.dispatch(workspaceElement, "window:run-package-specs") + expect(ipc.send).not.toHaveBeenCalledWith("run-package-specs") + + projectPaths = [temp.mkdirSync("dir1-"), temp.mkdirSync("dir2-")] + atom.project.setPaths(projectPaths) + + # No active item. Use first project directory. + atom.commands.dispatch(workspaceElement, "window:run-package-specs") + expect(ipc.send).toHaveBeenCalledWith("run-package-specs", path.join(projectPaths[0], "spec")) + ipc.send.reset() + + # Active item doesn't implement ::getPath(). Use first project directory. + item = document.createElement("div") + atom.workspace.getActivePane().activateItem(item) + atom.commands.dispatch(workspaceElement, "window:run-package-specs") + expect(ipc.send).toHaveBeenCalledWith("run-package-specs", path.join(projectPaths[0], "spec")) + ipc.send.reset() + + # Active item has no path. Use first project directory. + item.getPath = -> null + atom.commands.dispatch(workspaceElement, "window:run-package-specs") + expect(ipc.send).toHaveBeenCalledWith("run-package-specs", path.join(projectPaths[0], "spec")) + ipc.send.reset() + + # Active item has path. Use project path for item path. + item.getPath = -> path.join(projectPaths[1], "a-file.txt") + atom.commands.dispatch(workspaceElement, "window:run-package-specs") + expect(ipc.send).toHaveBeenCalledWith("run-package-specs", path.join(projectPaths[1], "spec")) + ipc.send.reset() diff --git a/src/workspace-element.coffee b/src/workspace-element.coffee index 2d0cb4e49..4f5dd6c5d 100644 --- a/src/workspace-element.coffee +++ b/src/workspace-element.coffee @@ -113,7 +113,10 @@ class WorkspaceElement extends HTMLElement focusPaneViewOnRight: -> @paneContainer.focusPaneViewOnRight() runPackageSpecs: -> - [projectPath] = atom.project.getPaths() + if activePath = atom.workspace.getActivePaneItem()?.getPath?() + [projectPath] = atom.project.relativizePath(activePath) + else + [projectPath] = atom.project.getPaths() ipc.send('run-package-specs', path.join(projectPath, 'spec')) if projectPath atom.commands.add 'atom-workspace', From 4dc109c077c8309a11d6fb82309cc9199421b3cf Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 14 May 2015 16:33:24 -0700 Subject: [PATCH 318/335] :arrow_up: language-todo@0.21 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a09157ff3..424ba2019 100644 --- a/package.json +++ b/package.json @@ -155,7 +155,7 @@ "language-source": "0.9.0", "language-sql": "0.15.0", "language-text": "0.6.0", - "language-todo": "0.20.0", + "language-todo": "0.21.0", "language-toml": "0.16.0", "language-xml": "0.28.0", "language-yaml": "0.22.0" From 3a51c44b559ea8e5c59a4f953d98e3c0c2d98cb5 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 14 May 2015 17:03:30 -0700 Subject: [PATCH 319/335] :shirt: Use skinny arrow for afterEach --- spec/text-editor-presenter-spec.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/text-editor-presenter-spec.coffee b/spec/text-editor-presenter-spec.coffee index f5ed6d90f..7da866ab4 100644 --- a/spec/text-editor-presenter-spec.coffee +++ b/spec/text-editor-presenter-spec.coffee @@ -2422,7 +2422,7 @@ describe "TextEditorPresenter", -> beforeEach -> customGutter = editor.addGutter({name: 'test-gutter', priority: -1, visible: true}) - afterEach => + afterEach -> customGutter.destroy() describe ".scrollHeight", -> From 6ca8e1113d025905d79f003a93c15c97e1040db1 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 14 May 2015 18:03:05 -0700 Subject: [PATCH 320/335] :arrow_up: symbols-view@0.97 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 424ba2019..beea26143 100644 --- a/package.json +++ b/package.json @@ -119,7 +119,7 @@ "spell-check": "0.58.0", "status-bar": "0.72.0", "styleguide": "0.44.0", - "symbols-view": "0.96.0", + "symbols-view": "0.97.0", "tabs": "0.68.0", "timecop": "0.31.0", "tree-view": "0.171.0", From a879c247d63417e5152f301d4a584a1773c508d0 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Fri, 15 May 2015 09:34:49 -0700 Subject: [PATCH 321/335] :arrow_up: language-gfm@0.75 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index beea26143..ad02f3e27 100644 --- a/package.json +++ b/package.json @@ -132,7 +132,7 @@ "language-coffee-script": "0.40.0", "language-csharp": "0.5.0", "language-css": "0.29.0", - "language-gfm": "0.74.0", + "language-gfm": "0.75.0", "language-git": "0.10.0", "language-go": "0.26.0", "language-html": "0.37.0", From f2491abd49d4ea9198df9ad2819b2ab9905c5cf3 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Fri, 15 May 2015 09:35:01 -0700 Subject: [PATCH 322/335] :arrow_up: language-php@0.23 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ad02f3e27..8545fd9cc 100644 --- a/package.json +++ b/package.json @@ -145,7 +145,7 @@ "language-mustache": "0.11.0", "language-objective-c": "0.15.0", "language-perl": "0.24.0", - "language-php": "0.22.0", + "language-php": "0.23.0", "language-property-list": "0.8.0", "language-python": "0.34.0", "language-ruby": "0.52.0", From f575274c54a786a524a345486a45b4db30a85d26 Mon Sep 17 00:00:00 2001 From: Thomas Johansen Date: Fri, 15 May 2015 19:57:55 +0200 Subject: [PATCH 323/335] :arrow_up: markdown-preview@0.149.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index beea26143..2a115ed10 100644 --- a/package.json +++ b/package.json @@ -108,7 +108,7 @@ "incompatible-packages": "0.24.0", "keybinding-resolver": "0.32.0", "link": "0.30.0", - "markdown-preview": "0.148.0", + "markdown-preview": "0.149.0", "metrics": "0.48.0", "notifications": "0.46.0", "open-on-github": "0.36.0", From 1a8ebd561fc5f9c314b91a35fddf8f2f99ba9d49 Mon Sep 17 00:00:00 2001 From: simurai Date: Sat, 16 May 2015 14:26:01 +0900 Subject: [PATCH 324/335] :arrow_up: find-and-replace@v0.164.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 956aded57..bb8935277 100644 --- a/package.json +++ b/package.json @@ -99,7 +99,7 @@ "dev-live-reload": "0.46.0", "encoding-selector": "0.20.0", "exception-reporting": "0.24.0", - "find-and-replace": "0.163.0", + "find-and-replace": "0.164.0", "fuzzy-finder": "0.85.0", "git-diff": "0.55.0", "go-to-line": "0.30.0", From 6431807a960b2b8444079b2c56f5b6040300dc62 Mon Sep 17 00:00:00 2001 From: simurai Date: Sat, 16 May 2015 15:29:14 +0900 Subject: [PATCH 325/335] :arrow_up: find-and-replace@v0.165.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bb8935277..2fa31e17d 100644 --- a/package.json +++ b/package.json @@ -99,7 +99,7 @@ "dev-live-reload": "0.46.0", "encoding-selector": "0.20.0", "exception-reporting": "0.24.0", - "find-and-replace": "0.164.0", + "find-and-replace": "0.165.0", "fuzzy-finder": "0.85.0", "git-diff": "0.55.0", "go-to-line": "0.30.0", From aaf1e24c5da6b2b1578df8d5c420546f2afd9761 Mon Sep 17 00:00:00 2001 From: Thomas Johansen Date: Sat, 16 May 2015 09:29:17 +0200 Subject: [PATCH 326/335] :arrow_up: language-python@0.35.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2fa31e17d..24a740778 100644 --- a/package.json +++ b/package.json @@ -147,7 +147,7 @@ "language-perl": "0.24.0", "language-php": "0.23.0", "language-property-list": "0.8.0", - "language-python": "0.34.0", + "language-python": "0.35.0", "language-ruby": "0.52.0", "language-ruby-on-rails": "0.21.0", "language-sass": "0.38.0", From e9c4a87f88e943a74dea73a8bc9825057f21477a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Machist=C3=A9=20N=2E=20Quintana?= Date: Sun, 17 May 2015 08:26:41 -0400 Subject: [PATCH 327/335] :arrow_up: find-and-replace@0.166.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2fa31e17d..3d0aa9656 100644 --- a/package.json +++ b/package.json @@ -99,7 +99,7 @@ "dev-live-reload": "0.46.0", "encoding-selector": "0.20.0", "exception-reporting": "0.24.0", - "find-and-replace": "0.165.0", + "find-and-replace": "0.166.0", "fuzzy-finder": "0.85.0", "git-diff": "0.55.0", "go-to-line": "0.30.0", From 77396466998322acb687b2a6a04846ca5d1b2a76 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 May 2015 09:00:15 -0700 Subject: [PATCH 328/335] Check for updates every 30 minutes --- src/browser/auto-update-manager.coffee | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/browser/auto-update-manager.coffee b/src/browser/auto-update-manager.coffee index 654a8de67..0fd5bb792 100644 --- a/src/browser/auto-update-manager.coffee +++ b/src/browser/auto-update-manager.coffee @@ -53,7 +53,11 @@ class AutoUpdateManager @emitUpdateAvailableEvent(@getWindows()...) # Only released versions should check for updates. - @check(hidePopups: true) unless /\w{7}/.test(@version) + unless /\w{7}/.test(@version) + checkForUpdates = => @check(hidePopups: true) + thirtyMinutes = 1000 * 60 * 30 + setInterval(checkForUpdates, thirtyMinutes) + checkForUpdates() switch process.platform when 'win32' From 672cb89e848c5b04ec8d6f9dd12c0d30167e15d7 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 13 May 2015 08:30:51 -0700 Subject: [PATCH 329/335] Extract schedule update check helper --- src/browser/auto-update-manager.coffee | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/browser/auto-update-manager.coffee b/src/browser/auto-update-manager.coffee index 0fd5bb792..5bd945310 100644 --- a/src/browser/auto-update-manager.coffee +++ b/src/browser/auto-update-manager.coffee @@ -53,11 +53,7 @@ class AutoUpdateManager @emitUpdateAvailableEvent(@getWindows()...) # Only released versions should check for updates. - unless /\w{7}/.test(@version) - checkForUpdates = => @check(hidePopups: true) - thirtyMinutes = 1000 * 60 * 30 - setInterval(checkForUpdates, thirtyMinutes) - checkForUpdates() + @scheduleUpdateCheck() unless /\w{7}/.test(@version) switch process.platform when 'win32' @@ -79,6 +75,12 @@ class AutoUpdateManager getState: -> @state + scheduleUpdateCheck: -> + checkForUpdates = => @check(hidePopups: true) + thirtyMinutes = 1000 * 60 * 30 + setInterval(checkForUpdates, thirtyMinutes) + checkForUpdates() + check: ({hidePopups}={}) -> unless hidePopups autoUpdater.once 'update-not-available', @onUpdateNotAvailable From 655ce1af77b289da481e074d309ad42d4965b207 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Fri, 15 May 2015 11:33:22 -0700 Subject: [PATCH 330/335] 30 minutes -> 4 hours --- src/browser/auto-update-manager.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/browser/auto-update-manager.coffee b/src/browser/auto-update-manager.coffee index 5bd945310..a2c239789 100644 --- a/src/browser/auto-update-manager.coffee +++ b/src/browser/auto-update-manager.coffee @@ -77,8 +77,8 @@ class AutoUpdateManager scheduleUpdateCheck: -> checkForUpdates = => @check(hidePopups: true) - thirtyMinutes = 1000 * 60 * 30 - setInterval(checkForUpdates, thirtyMinutes) + fourHours = 1000 * 60 * 60 * 4 + setInterval(checkForUpdates, fourHours) checkForUpdates() check: ({hidePopups}={}) -> From 9c13120c798b87fa2dd4fd577221a76512d7e3d4 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 18 May 2015 09:25:42 -0700 Subject: [PATCH 331/335] :arrow_up: open-on-github@0.37 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ce58fe9dc..28e35df4f 100644 --- a/package.json +++ b/package.json @@ -111,7 +111,7 @@ "markdown-preview": "0.149.0", "metrics": "0.48.0", "notifications": "0.46.0", - "open-on-github": "0.36.0", + "open-on-github": "0.37.0", "package-generator": "0.39.0", "release-notes": "0.52.0", "settings-view": "0.199.0", From 4dc1dfd4fabe080fe7145aa873b5c63df691e9ab Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 18 May 2015 09:27:38 -0700 Subject: [PATCH 332/335] :arrow_up: language-clojure@0.15 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 28e35df4f..12d6d2b89 100644 --- a/package.json +++ b/package.json @@ -128,7 +128,7 @@ "whitespace": "0.29.0", "wrap-guide": "0.33.0", "language-c": "0.44.0", - "language-clojure": "0.14.0", + "language-clojure": "0.15.0", "language-coffee-script": "0.40.0", "language-csharp": "0.5.0", "language-css": "0.29.0", From abebdb5a35a0207c00b69a9dc6d96fe79acaca7f Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 18 May 2015 09:32:20 -0700 Subject: [PATCH 333/335] :arrow_up: notifications@0.47 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 12d6d2b89..4249db43f 100644 --- a/package.json +++ b/package.json @@ -110,7 +110,7 @@ "link": "0.30.0", "markdown-preview": "0.149.0", "metrics": "0.48.0", - "notifications": "0.46.0", + "notifications": "0.47.0", "open-on-github": "0.37.0", "package-generator": "0.39.0", "release-notes": "0.52.0", From dde59f5c6bbc79d04f17a04600b814d44e72eedf Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 18 May 2015 09:34:25 -0700 Subject: [PATCH 334/335] :arrow_up: language-ruby@0.53 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4249db43f..e98d5ce2d 100644 --- a/package.json +++ b/package.json @@ -148,7 +148,7 @@ "language-php": "0.23.0", "language-property-list": "0.8.0", "language-python": "0.35.0", - "language-ruby": "0.52.0", + "language-ruby": "0.53.0", "language-ruby-on-rails": "0.21.0", "language-sass": "0.38.0", "language-shellscript": "0.14.0", From 8556f39c6039a2b5b881c2374d1cc2977b2061b8 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Mon, 18 May 2015 13:58:59 -0700 Subject: [PATCH 335/335] :arrow_up: autocomplete-plus --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e98d5ce2d..330117ff3 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "autocomplete-atom-api": "0.9.0", "autocomplete-css": "0.7.2", "autocomplete-html": "0.7.2", - "autocomplete-plus": "2.16.3", + "autocomplete-plus": "2.17.0", "autocomplete-snippets": "1.6.1", "autoflow": "0.23.0", "autosave": "0.20.0",