diff --git a/docs/customizing-atom.md b/docs/customizing-atom.md
index 1ac25fa77..c9a8e161e 100644
--- a/docs/customizing-atom.md
+++ b/docs/customizing-atom.md
@@ -66,7 +66,7 @@ directory, which contains CoffeeScript-style JSON:
```coffeescript
core:
- hideGitIgnoredFiles: true
+ excludeVcsIgnoredPaths: true
editor:
fontSize: 18
```
@@ -79,7 +79,6 @@ namespaces: `core` and `editor`.
- `core`
- `disabledPackages`: An array of package names to disable
- `excludeVcsIgnoredPaths`: Don't search within files specified by _.gitignore_
- - `hideGitIgnoredFiles`: Whether files in the _.gitignore_ should be hidden
- `ignoredNames`: File names to ignore across all of Atom
- `projectHome`: The directory where projects are assumed to be located
- `themes`: An array of theme names to load, in cascading order
diff --git a/docs/setting-up-travis.md b/docs/setting-up-travis.md
new file mode 100644
index 000000000..51df0ee86
--- /dev/null
+++ b/docs/setting-up-travis.md
@@ -0,0 +1,39 @@
+# Setting up Travis CI
+
+Packages under the [atom org][atom-org] should use [Travis CI][travis-ci] for
+builds.
+
+Currently we have a [Travis Pro][travis-pro] account since the repositories
+are private. This process will be simpler and have fewer steps once the
+package repos are made public.
+
+Each package builds using the [build-package][build-package] script, any
+changes to the build should be made in that script and will affect all
+package builds immediately.
+
+Each package builds against the latest successful build of atom@master. The
+master builds are stored in the [atom-master-builds][atom-master-builds] repo
+as releases named by the SHA-1 built.
+
+## Configuring a package
+
+* Run `cd ~/github/my-package` to navigate to the package repo locally
+* Run `apm test` to verify that the package currently builds via [apm][apm]
+* Add the package repo to the [Travis CI team][travis-ci-team]
+* Run `gem install travis` to install the [travis gem][travis-gem]
+* Run `travis login --pro` and log in using the [atom-build][atom-build] user
+ and the password from the *Shared-Developers* folder in LastPass
+* Run `apm ci` to add a `.travis.yml` file to the repo and to configure Travis
+* Log into [Travis][travis-ci] as the `atom-build` user and you should now see
+ the package listed and building
+
+
+[apm]: https://github.com/atom/apm
+[build-package]: https://github.com/atom/apm/blob/master/script/build-package
+[atom-build]: https://github.com/atom-build
+[atom-master-builds]: https://github.com/atom/atom-master-builds/releases
+[atom-org]: https://github.com/atom
+[travis-ci]: https://magnum.travis-ci.com
+[travis-ci-team]: https://github.com/organizations/atom/teams/596636
+[travis-gem]: https://rubygems.org/gems/travis
+[travis-pro]: http://about.travis-ci.org/docs/user/travis-pro
diff --git a/package.json b/package.json
index 519c01385..b40b96c40 100644
--- a/package.json
+++ b/package.json
@@ -45,7 +45,7 @@
"space-pen": "2.0.1",
"telepath": "0.66.0",
"temp": "0.5.0",
- "underscore-plus": "0.3.0"
+ "underscore-plus": "0.5.0"
},
"devDependencies": {
"biscotto": "0.0.17",
@@ -69,13 +69,14 @@
"request": "~2.27.0",
"unzip": "~0.1.9",
"rcedit": "~0.1.2",
- "rimraf": "~2.2.2"
+ "rimraf": "~2.2.2",
+ "github-releases": "~0.2.0"
},
"packageDependencies": {
"atom-dark-syntax": "0.8.0",
- "atom-dark-ui": "0.13.0",
+ "atom-dark-ui": "0.15.0",
"atom-light-syntax": "0.9.0",
- "atom-light-ui": "0.13.0",
+ "atom-light-ui": "0.15.0",
"base16-tomorrow-dark-theme": "0.7.0",
"solarized-dark-syntax": "0.5.0",
"archive-view": "0.16.0",
@@ -85,7 +86,7 @@
"bookmarks": "0.15.0",
"bracket-matcher": "0.15.0",
"command-logger": "0.8.0",
- "command-palette": "0.11.0",
+ "command-palette": "0.13.0",
"dev-live-reload": "0.18.0",
"editor-stats": "0.8.0",
"exception-reporting": "0.8.0",
@@ -101,14 +102,14 @@
"keybinding-resolver": "0.6.0",
"link": "0.11.0",
"markdown-preview": "0.22.0",
- "metrics": "0.14.0",
+ "metrics": "0.15.0",
"package-generator": "0.23.0",
"release-notes": "0.15.0",
"settings-view": "0.50.0",
"snippets": "0.17.0",
"spell-check": "0.17.0",
"status-bar": "0.24.0",
- "styleguide": "0.17.0",
+ "styleguide": "0.18.0",
"symbols-view": "0.27.0",
"tabs": "0.15.0",
"terminal": "0.23.0",
@@ -129,7 +130,7 @@
"language-html": "0.2.0",
"language-hyperlink": "0.3.0",
"language-java": "0.2.0",
- "language-javascript": "0.3.0",
+ "language-javascript": "0.4.0",
"language-json": "0.2.0",
"language-less": "0.1.0",
"language-make": "0.1.0",
@@ -152,7 +153,7 @@
"language-toml": "0.7.0",
"language-xml": "0.2.0",
"language-yaml": "0.1.0",
- "grunt-download-atom-shell": "0.1.3"
+ "grunt-download-atom-shell": "0.2.0"
},
"private": true,
"scripts": {
diff --git a/script/bootstrap b/script/bootstrap
index a23426da1..6cf10099c 100755
--- a/script/bootstrap
+++ b/script/bootstrap
@@ -22,17 +22,11 @@ function executeCommands(commands, done, index) {
done(null);
}
-// Join multiple commands into one line.
-function joinCommands() {
- var commandSeparator = process.platform == 'win32' ? '&' : ';';
- return Array.prototype.slice.call(arguments, 0).join(commandSeparator);
-}
-
var echoNewLine = process.platform == 'win32' ? 'echo.' : 'echo';
var commands = [
'git submodule --quiet sync',
'git submodule --quiet update --recursive --init',
- {command: joinCommands('cd vendor/apm', 'npm install --silent .'), options: {ignoreStdout: true}},
+ {command: 'npm install --silent .', options: {cwd: path.resolve(__dirname, '..', 'vendor', 'apm'), ignoreStdout: true}},
{command: 'npm install --silent vendor/apm', options: {ignoreStdout: true}},
echoNewLine,
'node node_modules/atom-package-manager/bin/apm clean',
diff --git a/script/cibuild b/script/cibuild
index c83d01c45..ff7a154b9 100755
--- a/script/cibuild
+++ b/script/cibuild
@@ -33,6 +33,7 @@ cp.safeExec.bind(global, 'node script/bootstrap', function(error) {
require('rimraf').bind(global, path.join(homeDir, '.atom')),
cp.safeExec.bind(global, 'git clean -dff'),
cp.safeExec.bind(global, 'node node_modules/grunt-cli/bin/grunt ci --stack --no-color'),
+ cp.safeExec.bind(global, 'node_modules/.bin/coffee script/upload-release')
], function(error) {
process.exit(error ? 1 : 0);
});
diff --git a/script/upload-release b/script/upload-release
new file mode 100755
index 000000000..2c53751c3
--- /dev/null
+++ b/script/upload-release
@@ -0,0 +1,122 @@
+#!/usr/bin/env coffee
+
+return if process.env.JANKY_SHA1 and process.env.JANKY_BRANCH isnt 'master'
+
+child_process = require 'child_process'
+path = require 'path'
+
+_ = require 'underscore-plus'
+fs = require 'fs-plus'
+GitHub = require 'github-releases'
+request = require 'request'
+
+assetName = 'atom-mac.zip'
+assetPath = "/tmp/atom-build/#{assetName}"
+commitSha = process.env.JANKY_SHA1
+token = process.env.ATOM_ACCESS_TOKEN
+defaultHeaders =
+ Authorization: "token #{token}"
+ 'User-Agent': 'Atom'
+
+zipApp = (callback) ->
+ fs.removeSync(assetPath)
+
+ options = {cwd: path.dirname(assetPath), maxBuffer: Infinity}
+ child_process.exec "zip -r --symlinks #{assetName} Atom.app", options, (error, stdout, stderr) ->
+ if error?
+ console.error('Zipping Atom.app failed', error, stderr)
+ process.exit(1)
+ else
+ callback()
+
+getRelease = (callback) ->
+ options =
+ uri: 'https://api.github.com/repos/atom/atom-master-builds/releases'
+ method: 'GET'
+ headers: defaultHeaders
+ json: true
+ request options, (error, response, releases=[]) ->
+ if error? or response.statusCode isnt 200
+ console.error('Fetching releases failed', error, releases)
+ process.exit(1)
+ else
+ for release in releases when release.name is commitSha
+ callback(release)
+ return
+ callback()
+
+deleteExistingAsset = (release, callback) ->
+ for asset in release.assets when asset.name is assetName
+ options =
+ uri: asset.url
+ method: 'DELETE'
+ headers: defaultHeaders
+ request options, (error, response, body='') ->
+ if error? or response.statusCode isnt 204
+ console.error('Deleting existing release asset failed', error, body)
+ process.exit(1)
+ else
+ callback()
+
+ return
+
+ callback()
+
+createRelease = (callback) ->
+ getRelease (release) ->
+ if release?
+ deleteExistingAsset release, ->
+ callback(release)
+ return
+
+ options =
+ uri: 'https://api.github.com/repos/atom/atom-master-builds/releases'
+ method: 'POST'
+ headers: defaultHeaders
+ json:
+ tag_name: "v#{commitSha}"
+ target_commitish: 'master'
+ name: commitSha
+ body: "Build of [atom@#{commitSha.substring(0, 7)}](https://github.com/atom/atom/commit/#{commitSha})"
+ draft: true
+ request options, (error, response, release={}) ->
+ if error? or response.statusCode isnt 201
+ console.error('Creating release failed', error, release)
+ process.exit(1)
+ else
+ callback(release)
+
+uploadAsset = (release, callback) ->
+ options =
+ uri: "https://uploads.github.com/repos/atom/atom-master-builds/releases/#{release.id}/assets?name=#{assetName}"
+ method: 'POST'
+ headers: _.extend({
+ 'Content-Type': 'application/zip'
+ 'Content-Length': fs.getSizeSync(assetPath)
+ }, defaultHeaders)
+
+ assetRequest = request options, (error, response, body='') ->
+ if error? or response.statusCode >= 400
+ console.error('Upload release asset failed', error, body)
+ process.exit(1)
+ else
+ callback(release)
+
+ fs.createReadStream(assetPath).pipe(assetRequest)
+
+publishRelease = (release) ->
+ options =
+ uri: release.url
+ method: 'POST'
+ headers: defaultHeaders
+ json:
+ draft: false
+ request options, (error, response, body={}) ->
+ if error? or response.statusCode isnt 200
+ console.error('Creating release failed', error, body)
+ process.exit(1)
+
+createRelease (release) ->
+ zipApp ->
+ uploadAsset release, ->
+ publishRelease release
diff --git a/spec/space-pen-extensions-spec.coffee b/spec/space-pen-extensions-spec.coffee
index 7c6192d6c..54a64873e 100644
--- a/spec/space-pen-extensions-spec.coffee
+++ b/spec/space-pen-extensions-spec.coffee
@@ -53,15 +53,15 @@ describe "SpacePen extensions", ->
expect(eventHandler).toHaveBeenCalled()
describe "tooltips", ->
- describe "replaceModifiers", ->
- replaceModifiers = $.fn.setTooltip.replaceModifiers
+ describe "humanizeKeystrokes", ->
+ humanizeKeystrokes = $.fn.setTooltip.humanizeKeystrokes
it "replaces single keystroke", ->
- expect(replaceModifiers('cmd-O')).toEqual '⌘⇧O'
- expect(replaceModifiers('cmd-shift-up')).toEqual '⌘⇧↑'
- expect(replaceModifiers('cmd-option-down')).toEqual '⌘⌥↓'
- expect(replaceModifiers('cmd-option-left')).toEqual '⌘⌥←'
- expect(replaceModifiers('cmd-option-right')).toEqual '⌘⌥→'
+ expect(humanizeKeystrokes('cmd-O')).toEqual '⌘⇧O'
+ expect(humanizeKeystrokes('cmd-shift-up')).toEqual '⌘⇧↑'
+ expect(humanizeKeystrokes('cmd-option-down')).toEqual '⌘⌥↓'
+ expect(humanizeKeystrokes('cmd-option-left')).toEqual '⌘⌥←'
+ expect(humanizeKeystrokes('cmd-option-right')).toEqual '⌘⌥→'
it "replaces multiple keystroke", ->
- expect(replaceModifiers('cmd-o ctrl-2')).toEqual '⌘O ⌃2'
+ expect(humanizeKeystrokes('cmd-o ctrl-2')).toEqual '⌘O ⌃2'
diff --git a/src/space-pen-extensions.coffee b/src/space-pen-extensions.coffee
index 1efb9e809..d7504ebe2 100644
--- a/src/space-pen-extensions.coffee
+++ b/src/space-pen-extensions.coffee
@@ -24,41 +24,14 @@ tooltipDefaults =
placement: 'auto top'
viewportPadding: 2
-modifiers =
- cmd: '⌘'
- ctrl: '⌃'
- alt: '⌥'
- option: '⌥'
- shift: '⇧'
- enter: '⏎'
- left: '←'
- right: '→'
- up: '↑'
- down: '↓'
-
-replaceKey = (key) ->
- if modifiers[key]
- modifiers[key]
- else if key.length == 1 and key == key.toUpperCase() and key.toUpperCase() != key.toLowerCase()
- [modifiers.shift, key.toUpperCase()]
- else if key.length == 1
- key.toUpperCase()
- else
- key
-
-replaceModifiersInSingleKeystroke = (keystroke) ->
- keys = keystroke.split('-')
- keys = _.flatten(replaceKey(key) for key in keys)
- keys.join('')
-
-replaceModifiers = (keystroke) ->
+humanizeKeystrokes = (keystroke) ->
keystrokes = keystroke.split(' ')
- keystrokes = (replaceModifiersInSingleKeystroke(stroke) for stroke in keystrokes)
+ keystrokes = (_.humanizeKeystroke(stroke) for stroke in keystrokes)
keystrokes.join(' ')
getKeystroke = (bindings) ->
if bindings?.length
- "#{replaceModifiers(bindings[0].keystroke)}"
+ "#{humanizeKeystrokes(bindings[0].keystroke)}"
else
''
# options from http://getbootstrap.com/javascript/#tooltips
@@ -87,6 +60,6 @@ jQuery.fn.destroyTooltip = ->
@tooltip('destroy')
jQuery.fn.setTooltip.getKeystroke = getKeystroke
-jQuery.fn.setTooltip.replaceModifiers = replaceModifiers
+jQuery.fn.setTooltip.humanizeKeystrokes = humanizeKeystrokes
module.exports = spacePen
diff --git a/src/workspace-view.coffee b/src/workspace-view.coffee
index 12fae3a17..4bb8f850d 100644
--- a/src/workspace-view.coffee
+++ b/src/workspace-view.coffee
@@ -122,8 +122,6 @@ class WorkspaceView extends View
@command 'window:save-all', => @saveAll()
@command 'window:toggle-invisibles', =>
atom.config.toggle("editor.showInvisibles")
- @command 'window:toggle-ignored-files', =>
- atom.config.toggle("core.hideGitIgnoredFiles")
@command 'window:toggle-auto-indent', =>
atom.config.toggle("editor.autoIndent")
diff --git a/vendor/apm b/vendor/apm
index 007cf2643..82f647511 160000
--- a/vendor/apm
+++ b/vendor/apm
@@ -1 +1 @@
-Subproject commit 007cf2643366f4e4aa5e38083bc69da9dc363098
+Subproject commit 82f6475111553faa6f8f32b992010358064744ad