Merge branch 'master' into as-deserialize-untitled-editors

# Conflicts:
#	package.json
This commit is contained in:
Antonio Scandurra 2015-12-09 08:48:04 +01:00
commit 769b7bcd89
15 changed files with 130 additions and 17 deletions

View File

@ -1,5 +1,10 @@
See https://atom.io/releases See https://atom.io/releases
## 1.4.0
* Switching encoding is now fast also with large files.
* Fixed an issue where disabling and re-enabling a package caused custom keymaps to be overridden.
## 1.3.0 ## 1.3.0
* The tree-view now sorts directory entries more naturally, in a locale-sensitive way. * The tree-view now sorts directory entries more naturally, in a locale-sensitive way.

View File

@ -12,7 +12,7 @@
"donna": "^1.0.13", "donna": "^1.0.13",
"formidable": "~1.0.14", "formidable": "~1.0.14",
"fs-plus": "2.x", "fs-plus": "2.x",
"github-releases": "~0.3.0", "github-releases": "~0.3.1",
"glob": "^5.0.14", "glob": "^5.0.14",
"grunt": "~0.4.1", "grunt": "~0.4.1",
"grunt-babel": "^5.0.1", "grunt-babel": "^5.0.1",

View File

@ -29,6 +29,7 @@ module.exports = (grunt) ->
return return
appDir = grunt.config.get('atom.appDir') appDir = grunt.config.get('atom.appDir')
shellAppDir = grunt.config.get('atom.shellAppDir')
# Replace version field of package.json. # Replace version field of package.json.
packageJsonPath = path.join(appDir, 'package.json') packageJsonPath = path.join(appDir, 'package.json')
@ -39,7 +40,7 @@ module.exports = (grunt) ->
if process.platform is 'darwin' if process.platform is 'darwin'
cmd = 'script/set-version' cmd = 'script/set-version'
args = [grunt.config.get('atom.buildDir'), version] args = [shellAppDir, version]
spawn {cmd, args}, (error, result, code) -> done(error) spawn {cmd, args}, (error, result, code) -> done(error)
else if process.platform is 'win32' else if process.platform is 'win32'
shellAppDir = grunt.config.get('atom.shellAppDir') shellAppDir = grunt.config.get('atom.shellAppDir')

View File

@ -15,7 +15,7 @@
"electronVersion": "0.34.5", "electronVersion": "0.34.5",
"dependencies": { "dependencies": {
"async": "0.2.6", "async": "0.2.6",
"atom-keymap": "^6.1.1", "atom-keymap": "^6.2.0",
"babel-core": "^5.8.21", "babel-core": "^5.8.21",
"bootstrap": "^3.3.4", "bootstrap": "^3.3.4",
"cached-run-in-this-context": "0.4.0", "cached-run-in-this-context": "0.4.0",
@ -52,7 +52,7 @@
"service-hub": "^0.7.0", "service-hub": "^0.7.0",
"source-map-support": "^0.3.2", "source-map-support": "^0.3.2",
"temp": "0.8.1", "temp": "0.8.1",
"text-buffer": "8.1.0", "text-buffer": "8.1.1",
"typescript-simple": "1.0.0", "typescript-simple": "1.0.0",
"underscore-plus": "^1.6.6", "underscore-plus": "^1.6.6",
"yargs": "^3.23.0" "yargs": "^3.23.0"
@ -64,10 +64,10 @@
"atom-light-ui": "0.43.0", "atom-light-ui": "0.43.0",
"base16-tomorrow-dark-theme": "1.0.0", "base16-tomorrow-dark-theme": "1.0.0",
"base16-tomorrow-light-theme": "1.0.0", "base16-tomorrow-light-theme": "1.0.0",
"one-dark-ui": "1.1.7", "one-dark-ui": "1.1.8",
"one-dark-syntax": "1.1.1", "one-dark-syntax": "1.1.1",
"one-light-syntax": "1.1.1", "one-light-syntax": "1.1.1",
"one-light-ui": "1.1.7", "one-light-ui": "1.1.8",
"solarized-dark-syntax": "0.39.0", "solarized-dark-syntax": "0.39.0",
"solarized-light-syntax": "0.23.0", "solarized-light-syntax": "0.23.0",
"about": "1.1.0", "about": "1.1.0",
@ -87,7 +87,7 @@
"dev-live-reload": "0.47.0", "dev-live-reload": "0.47.0",
"encoding-selector": "0.21.0", "encoding-selector": "0.21.0",
"exception-reporting": "0.37.0", "exception-reporting": "0.37.0",
"find-and-replace": "0.192.0", "find-and-replace": "0.194.0",
"fuzzy-finder": "0.93.0", "fuzzy-finder": "0.93.0",
"git-diff": "0.57.0", "git-diff": "0.57.0",
"go-to-line": "0.30.0", "go-to-line": "0.30.0",
@ -116,7 +116,7 @@
"welcome": "0.33.0", "welcome": "0.33.0",
"whitespace": "0.32.1", "whitespace": "0.32.1",
"wrap-guide": "0.38.1", "wrap-guide": "0.38.1",
"language-c": "0.51.0", "language-c": "0.51.1",
"language-clojure": "0.19.0", "language-clojure": "0.19.0",
"language-coffee-script": "0.46.0", "language-coffee-script": "0.46.0",
"language-csharp": "0.11.0", "language-csharp": "0.11.0",
@ -146,7 +146,7 @@
"language-text": "0.7.0", "language-text": "0.7.0",
"language-todo": "0.27.0", "language-todo": "0.27.0",
"language-toml": "0.18.0", "language-toml": "0.18.0",
"language-xml": "0.34.1", "language-xml": "0.34.2",
"language-yaml": "0.25.0" "language-yaml": "0.25.0"
}, },
"private": true, "private": true,

View File

@ -2,10 +2,11 @@
set -e set -e
BUILT_PRODUCTS_DIR=$1 SHELL_APP_DIR=$1
VERSION=$2 VERSION=$2
PLIST_PATH="$BUILT_PRODUCTS_DIR/Atom.app/Contents/Info.plist"
HELPER_PLIST_PATH="$BUILT_PRODUCTS_DIR/Atom.app/Contents/Frameworks/Atom Helper.app/Contents/Info.plist" PLIST_PATH="$SHELL_APP_DIR/Contents/Info.plist"
HELPER_PLIST_PATH="$SHELL_APP_DIR/Contents/Frameworks/Atom Helper.app/Contents/Info.plist"
# Update version # Update version
/usr/libexec/PlistBuddy -c "Set CFBundleShortVersionString $VERSION" "$PLIST_PATH" /usr/libexec/PlistBuddy -c "Set CFBundleShortVersionString $VERSION" "$PLIST_PATH"

View File

@ -679,6 +679,26 @@ describe "Config", ->
writtenConfig = CSON.writeFileSync.argsForCall[0][1] writtenConfig = CSON.writeFileSync.argsForCall[0][1]
expect(writtenConfig).toEqual '*': atom.config.settings expect(writtenConfig).toEqual '*': atom.config.settings
it 'writes properties in alphabetical order', ->
atom.config.set('foo', 1)
atom.config.set('bar', 2)
atom.config.set('baz.foo', 3)
atom.config.set('baz.bar', 4)
CSON.writeFileSync.reset()
atom.config.save()
expect(CSON.writeFileSync.argsForCall[0][0]).toBe atom.config.configFilePath
writtenConfig = CSON.writeFileSync.argsForCall[0][1]
expect(writtenConfig).toEqual '*': atom.config.settings
expectedKeys = ['bar', 'baz', 'foo']
foundKeys = (key for key of writtenConfig['*'] when key in expectedKeys)
expect(foundKeys).toEqual expectedKeys
expectedKeys = ['bar', 'foo']
foundKeys = (key for key of writtenConfig['*']['baz'] when key in expectedKeys)
expect(foundKeys).toEqual expectedKeys
describe "when ~/.atom/config.json doesn't exist", -> describe "when ~/.atom/config.json doesn't exist", ->
it "writes any non-default properties to ~/.atom/config.cson", -> it "writes any non-default properties to ~/.atom/config.cson", ->
atom.config.set("a.b.c", 1) atom.config.set("a.b.c", 1)

View File

@ -1,6 +1,9 @@
path = require 'path' path = require 'path'
Package = require '../src/package' Package = require '../src/package'
temp = require 'temp'
fs = require 'fs-plus'
{Disposable} = require 'atom' {Disposable} = require 'atom'
{buildKeydownEvent} = require '../src/keymap-extensions'
{mockLocalStorage} = require './spec-helper' {mockLocalStorage} = require './spec-helper'
describe "PackageManager", -> describe "PackageManager", ->
@ -151,7 +154,6 @@ describe "PackageManager", ->
it "registers the config schema in the package's metadata, if present", -> it "registers the config schema in the package's metadata, if present", ->
pack = atom.packages.loadPackage("package-with-json-config-schema") pack = atom.packages.loadPackage("package-with-json-config-schema")
expect(atom.config.getSchema('package-with-json-config-schema')).toEqual { expect(atom.config.getSchema('package-with-json-config-schema')).toEqual {
type: 'object' type: 'object'
properties: { properties: {
@ -162,9 +164,20 @@ describe "PackageManager", ->
expect(pack.mainModule).toBeNull() expect(pack.mainModule).toBeNull()
atom.packages.unloadPackage('package-with-json-config-schema')
atom.config.clear()
pack = atom.packages.loadPackage("package-with-json-config-schema")
expect(atom.config.getSchema('package-with-json-config-schema')).toEqual {
type: 'object'
properties: {
a: {type: 'number', default: 5}
b: {type: 'string', default: 'five'}
}
}
describe "when a package does not have deserializers, view providers or a config schema in its package.json", -> describe "when a package does not have deserializers, view providers or a config schema in its package.json", ->
beforeEach -> beforeEach ->
atom.packages.unloadPackage('package-with-main')
mockLocalStorage() mockLocalStorage()
it "defers loading the package's main module if the package previously used no Atom APIs when its main module was required", -> it "defers loading the package's main module if the package previously used no Atom APIs when its main module was required", ->
@ -562,6 +575,54 @@ describe "PackageManager", ->
atom.config.set("core.packagesWithKeymapsDisabled", []) atom.config.set("core.packagesWithKeymapsDisabled", [])
expect(atom.keymaps.findKeyBindings(keystrokes: 'ctrl-z', target: element1)[0].command).toBe 'keymap-1' expect(atom.keymaps.findKeyBindings(keystrokes: 'ctrl-z', target: element1)[0].command).toBe 'keymap-1'
describe "when the package is de-activated and re-activated", ->
[element, events, userKeymapPath] = []
beforeEach ->
userKeymapPath = path.join(temp.path(), "user-keymaps.cson")
spyOn(atom.keymaps, "getUserKeymapPath").andReturn(userKeymapPath)
element = createTestElement('test-1')
jasmine.attachToDOM(element)
events = []
element.addEventListener 'user-command', (e) -> events.push(e)
element.addEventListener 'test-1', (e) -> events.push(e)
afterEach ->
element.remove()
# Avoid leaking user keymap subscription
atom.keymaps.watchSubscriptions[userKeymapPath].dispose()
delete atom.keymaps.watchSubscriptions[userKeymapPath]
it "doesn't override user-defined keymaps", ->
fs.writeFileSync userKeymapPath, """
".test-1":
"ctrl-z": "user-command"
"""
atom.keymaps.loadUserKeymap()
waitsForPromise ->
atom.packages.activatePackage("package-with-keymaps")
runs ->
atom.keymaps.handleKeyboardEvent(buildKeydownEvent("z", ctrl: true, target: element))
expect(events.length).toBe(1)
expect(events[0].type).toBe("user-command")
atom.packages.deactivatePackage("package-with-keymaps")
waitsForPromise ->
atom.packages.activatePackage("package-with-keymaps")
runs ->
atom.keymaps.handleKeyboardEvent(buildKeydownEvent("z", ctrl: true, target: element))
expect(events.length).toBe(2)
expect(events[1].type).toBe("user-command")
describe "menu loading", -> describe "menu loading", ->
beforeEach -> beforeEach ->
atom.contextMenu.definitions = [] atom.contextMenu.definitions = []

View File

@ -109,6 +109,9 @@ class ApplicationDelegate
setRepresentedFilename: (filename) -> setRepresentedFilename: (filename) ->
ipc.send("call-window-method", "setRepresentedFilename", filename) ipc.send("call-window-method", "setRepresentedFilename", filename)
addRecentDocument: (filename) ->
ipc.send("add-recent-document", filename)
setRepresentedDirectoryPaths: (paths) -> setRepresentedDirectoryPaths: (paths) ->
loadSettings = getWindowLoadSettings() loadSettings = getWindowLoadSettings()
loadSettings['initialPaths'] = paths loadSettings['initialPaths'] = paths

View File

@ -885,6 +885,8 @@ class AtomEnvironment extends Model
else else
@project.addPath(pathToOpen) @project.addPath(pathToOpen)
@applicationDelegate.addRecentDocument(pathToOpen)
unless fs.isDirectorySync(pathToOpen) unless fs.isDirectorySync(pathToOpen)
@workspace?.open(pathToOpen, {initialLine, initialColumn}) @workspace?.open(pathToOpen, {initialLine, initialColumn})

View File

@ -281,6 +281,9 @@ class AtomApplication
ipc.on 'write-to-stderr', (event, output) -> ipc.on 'write-to-stderr', (event, output) ->
process.stderr.write(output) process.stderr.write(output)
ipc.on 'add-recent-document', (event, filename) ->
app.addRecentDocument(filename)
setupDockMenu: -> setupDockMenu: ->
if process.platform is 'darwin' if process.platform is 'darwin'
dockMenu = Menu.buildFromTemplate [ dockMenu = Menu.buildFromTemplate [

View File

@ -171,6 +171,8 @@ function prepareStackTraceWithRawStackAssignment (error, frames) {
} }
} }
Error.stackTraceLimit = 30
Object.defineProperty(Error, 'prepareStackTrace', { Object.defineProperty(Error, 'prepareStackTrace', {
get: function () { get: function () {
return prepareStackTraceWithRawStackAssignment return prepareStackTraceWithRawStackAssignment

View File

@ -827,6 +827,7 @@ class Config
allSettings = {'*': @settings} allSettings = {'*': @settings}
allSettings = _.extend allSettings, @scopedSettingsStore.propertiesForSource(@getUserConfigPath()) allSettings = _.extend allSettings, @scopedSettingsStore.propertiesForSource(@getUserConfigPath())
allSettings = sortObject(allSettings)
try try
CSON.writeFileSync(@configFilePath, allSettings) CSON.writeFileSync(@configFilePath, allSettings)
catch error catch error
@ -1190,6 +1191,13 @@ Config.addSchemaEnforcers
isPlainObject = (value) -> isPlainObject = (value) ->
_.isObject(value) and not _.isArray(value) and not _.isFunction(value) and not _.isString(value) and not (value instanceof Color) _.isObject(value) and not _.isArray(value) and not _.isFunction(value) and not _.isString(value) and not (value instanceof Color)
sortObject = (value) ->
return value unless isPlainObject(value)
result = {}
for key in Object.keys(value).sort()
result[key] = sortObject(value[key])
result
withoutEmptyObjects = (object) -> withoutEmptyObjects = (object) ->
resultObject = undefined resultObject = undefined
if isPlainObject(object) if isPlainObject(object)

View File

@ -32,7 +32,7 @@ KeymapManager::loadUserKeymap = ->
return unless fs.isFileSync(userKeymapPath) return unless fs.isFileSync(userKeymapPath)
try try
@loadKeymap(userKeymapPath, watch: true, suppressErrors: true) @loadKeymap(userKeymapPath, watch: true, suppressErrors: true, priority: 100)
catch error catch error
if error.message.indexOf('Unable to watch path') > -1 if error.message.indexOf('Unable to watch path') > -1
message = """ message = """

View File

@ -47,6 +47,7 @@ class PackageManager
@packagesCache = require('../package.json')?._atomPackages ? {} @packagesCache = require('../package.json')?._atomPackages ? {}
@loadedPackages = {} @loadedPackages = {}
@activePackages = {} @activePackages = {}
@activatingPackages = {}
@packageStates = {} @packageStates = {}
@serviceHub = new ServiceHub @serviceHub = new ServiceHub
@ -62,6 +63,7 @@ class PackageManager
reset: -> reset: ->
@serviceHub.clear() @serviceHub.clear()
@deactivatePackages() @deactivatePackages()
@loadedPackages = {}
@packageStates = {} @packageStates = {}
### ###
@ -436,9 +438,12 @@ class PackageManager
if pack = @getActivePackage(name) if pack = @getActivePackage(name)
Promise.resolve(pack) Promise.resolve(pack)
else if pack = @loadPackage(name) else if pack = @loadPackage(name)
@activatingPackages[pack.name] = pack
pack.activate().then => pack.activate().then =>
@activePackages[pack.name] = pack if @activatingPackages[pack.name]?
@emitter.emit 'did-activate-package', pack delete @activatingPackages[pack.name]
@activePackages[pack.name] = pack
@emitter.emit 'did-activate-package', pack
pack pack
else else
Promise.reject(new Error("Failed to load package '#{name}'")) Promise.reject(new Error("Failed to load package '#{name}'"))
@ -474,6 +479,7 @@ class PackageManager
@setPackageState(pack.name, state) if state = pack.serialize?() @setPackageState(pack.name, state) if state = pack.serialize?()
pack.deactivate() pack.deactivate()
delete @activePackages[pack.name] delete @activePackages[pack.name]
delete @activatingPackages[pack.name]
@emitter.emit 'did-deactivate-package', pack @emitter.emit 'did-deactivate-package', pack
handleMetadataError: (error, packagePath) -> handleMetadataError: (error, packagePath) ->

View File

@ -14,6 +14,7 @@ class ThemePackage extends Package
load: -> load: ->
@loadTime = 0 @loadTime = 0
@configSchemaRegisteredOnLoad = @registerConfigSchemaFromMetadata()
this this
activate: -> activate: ->