From ed62685c7875f3482a60c7833d70c9413b550791 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Thu, 3 Sep 2015 10:16:17 -0700 Subject: [PATCH 1/3] :art: main.coffee --- src/browser/main.coffee | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/browser/main.coffee b/src/browser/main.coffee index 659c97776..dfbbbb3ad 100644 --- a/src/browser/main.coffee +++ b/src/browser/main.coffee @@ -6,22 +6,13 @@ fs = require 'fs-plus' path = require 'path' yargs = require 'yargs' url = require 'url' -nslog = require 'nslog' - -console.log = nslog - -process.on 'uncaughtException', (error={}) -> - nslog(error.message) if error.message? - nslog(error.stack) if error.stack? +console.log = require 'nslog' start = -> + setupUncaughtExceptionHandler() setupAtomHome() setupCompileCache() - - if process.platform is 'win32' - SquirrelUpdate = require './squirrel-update' - squirrelCommand = process.argv[1] - return if SquirrelUpdate.handleStartupEvent(app, squirrelCommand) + return if handleStartupEventWithSquirrel() args = parseCommandLine() @@ -29,16 +20,13 @@ start = -> event.preventDefault() args.pathsToOpen.push(pathToOpen) - args.urlsToOpen = [] addUrlToOpen = (event, urlToOpen) -> event.preventDefault() args.urlsToOpen.push(urlToOpen) app.on 'open-file', addPathToOpen app.on 'open-url', addUrlToOpen - - app.on 'will-finish-launching', -> - setupCrashReporter() + app.on 'will-finish-launching', setupCrashReporter app.on 'ready', -> app.removeListener 'open-file', addPathToOpen @@ -55,8 +43,8 @@ start = -> path.resolve(pathToOpen) AtomApplication = require path.join(args.resourcePath, 'src', 'browser', 'atom-application') - AtomApplication.open(args) + console.log("App load time: #{Date.now() - global.shellStartTime}ms") unless args.test normalizeDriveLetterName = (filePath) -> @@ -69,12 +57,22 @@ global.devResourcePath = normalizeDriveLetterName( process.env.ATOM_DEV_RESOURCE_PATH ? path.join(app.getHomeDir(), 'github', 'atom') ) +setupUncaughtExceptionHandler = -> + process.on 'uncaughtException', (error={}) -> + console.log(error.message) if error.message? + console.log(error.stack) if error.stack? + +handleStartupEventWithSquirrel = -> + return false unless process.platform is 'win32' + SquirrelUpdate = require './squirrel-update' + squirrelCommand = process.argv[1] + SquirrelUpdate.handleStartupEvent(app, squirrelCommand) + setupCrashReporter = -> crashReporter.start(productName: 'Atom', companyName: 'GitHub') setupAtomHome = -> return if process.env.ATOM_HOME - atomHome = path.join(app.getHomeDir(), '.atom') try atomHome = fs.realpathSync(atomHome) @@ -143,6 +141,7 @@ parseCommandLine = -> logFile = args['log-file'] socketPath = args['socket-path'] profileStartup = args['profile-startup'] + urlsToOpen = [] if args['resource-path'] devMode = true @@ -169,7 +168,8 @@ parseCommandLine = -> resourcePath = normalizeDriveLetterName(resourcePath) - {resourcePath, pathsToOpen, executedFrom, test, version, pidToKillWhenClosed, - devMode, safeMode, newWindow, specDirectory, logFile, socketPath, profileStartup} + {resourcePath, pathsToOpen, urlsToOpen, executedFrom, test, version, + pidToKillWhenClosed, devMode, safeMode, newWindow, specDirectory, logFile, + socketPath, profileStartup} start() From 0a8ff35c3adc84789d586be8ce29e2d153ef47b5 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Thu, 3 Sep 2015 10:30:08 -0700 Subject: [PATCH 2/3] :art: Pass devResourcePath as an argument to AtomApplication --- src/browser/atom-application.coffee | 14 +++++++------- src/browser/main.coffee | 14 ++++++-------- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/browser/atom-application.coffee b/src/browser/atom-application.coffee index 54f444d0e..29cda2290 100644 --- a/src/browser/atom-application.coffee +++ b/src/browser/atom-application.coffee @@ -63,7 +63,7 @@ class AtomApplication exit: (status) -> app.exit(status) constructor: (options) -> - {@resourcePath, @version, @devMode, @safeMode, @socketPath} = options + {@resourcePath, @devResourcePath, @version, @devMode, @safeMode, @socketPath} = options global.atomApplication = this @@ -160,7 +160,7 @@ class AtomApplication devMode: @focusedWindow()?.devMode safeMode: @focusedWindow()?.safeMode - @on 'application:run-all-specs', -> @runSpecs(exitWhenDone: false, resourcePath: global.devResourcePath, safeMode: @focusedWindow()?.safeMode) + @on 'application:run-all-specs', -> @runSpecs(exitWhenDone: false, resourcePath: @devResourcePath, safeMode: @focusedWindow()?.safeMode) @on 'application:run-benchmarks', -> @runBenchmarks() @on 'application:quit', -> app.quit() @on 'application:new-window', -> @openPath(_.extend(windowDimensions: @focusedWindow()?.getDimensions(), getLoadSettings())) @@ -252,7 +252,7 @@ class AtomApplication @applicationMenu.update(win, template, keystrokesByCommand) ipc.on 'run-package-specs', (event, specDirectory) => - @runSpecs({resourcePath: global.devResourcePath, specDirectory: specDirectory, exitWhenDone: false}) + @runSpecs({resourcePath: @devResourcePath, specDirectory: specDirectory, exitWhenDone: false}) ipc.on 'command', (event, command) => @emit(command) @@ -398,8 +398,8 @@ class AtomApplication else if devMode try - bootstrapScript = require.resolve(path.join(global.devResourcePath, 'src', 'window-bootstrap')) - resourcePath = global.devResourcePath + bootstrapScript = require.resolve(path.join(@devResourcePath, 'src', 'window-bootstrap')) + resourcePath = @devResourcePath bootstrapScript ?= require.resolve('../window-bootstrap') resourcePath ?= @resourcePath @@ -500,7 +500,7 @@ class AtomApplication resourcePath = @resourcePath try - bootstrapScript = require.resolve(path.resolve(global.devResourcePath, 'spec', 'spec-bootstrap')) + bootstrapScript = require.resolve(path.resolve(@devResourcePath, 'spec', 'spec-bootstrap')) catch error bootstrapScript = require.resolve(path.resolve(__dirname, '..', '..', 'spec', 'spec-bootstrap')) @@ -511,7 +511,7 @@ class AtomApplication runBenchmarks: ({exitWhenDone, specDirectory}={}) -> try - bootstrapScript = require.resolve(path.resolve(global.devResourcePath, 'benchmark', 'benchmark-bootstrap')) + bootstrapScript = require.resolve(path.resolve(@devResourcePath, 'benchmark', 'benchmark-bootstrap')) catch error bootstrapScript = require.resolve(path.resolve(__dirname, '..', '..', 'benchmark', 'benchmark-bootstrap')) diff --git a/src/browser/main.coffee b/src/browser/main.coffee index dfbbbb3ad..d14eb5bec 100644 --- a/src/browser/main.coffee +++ b/src/browser/main.coffee @@ -53,10 +53,6 @@ normalizeDriveLetterName = (filePath) -> else filePath -global.devResourcePath = normalizeDriveLetterName( - process.env.ATOM_DEV_RESOURCE_PATH ? path.join(app.getHomeDir(), 'github', 'atom') -) - setupUncaughtExceptionHandler = -> process.on 'uncaughtException', (error={}) -> console.log(error.message) if error.message? @@ -142,6 +138,7 @@ parseCommandLine = -> socketPath = args['socket-path'] profileStartup = args['profile-startup'] urlsToOpen = [] + devResourcePath = process.env.ATOM_DEV_RESOURCE_PATH ? path.join(app.getHomeDir(), 'github', 'atom') if args['resource-path'] devMode = true @@ -157,7 +154,7 @@ parseCommandLine = -> resourcePath = packageDirectoryPath if packageManifest.name is 'atom' if devMode - resourcePath ?= global.devResourcePath + resourcePath ?= devResourcePath unless fs.statSyncNoException(resourcePath) resourcePath = path.dirname(path.dirname(__dirname)) @@ -167,9 +164,10 @@ parseCommandLine = -> process.env.PATH = args['path-environment'] if args['path-environment'] resourcePath = normalizeDriveLetterName(resourcePath) + devResourcePath = normalizeDriveLetterName(devResourcePath) - {resourcePath, pathsToOpen, urlsToOpen, executedFrom, test, version, - pidToKillWhenClosed, devMode, safeMode, newWindow, specDirectory, logFile, - socketPath, profileStartup} + {resourcePath, devResourcePath, pathsToOpen, urlsToOpen, executedFrom, test, + version, pidToKillWhenClosed, devMode, safeMode, newWindow, specDirectory, + logFile, socketPath, profileStartup} start() From e5da009cdcbf13eba2b4e0b5c534b31af162f317 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Thu, 3 Sep 2015 11:31:01 -0700 Subject: [PATCH 3/3] Strip colon-number suffixes from args before parsing them as URLs --- src/browser/atom-application.coffee | 31 +++++++++++++---------------- src/browser/main.coffee | 13 +----------- 2 files changed, 15 insertions(+), 29 deletions(-) diff --git a/src/browser/atom-application.coffee b/src/browser/atom-application.coffee index 29cda2290..f280db059 100644 --- a/src/browser/atom-application.coffee +++ b/src/browser/atom-application.coffee @@ -17,6 +17,8 @@ url = require 'url' {EventEmitter} = require 'events' _ = require 'underscore-plus' +LocationSuffixRegExp = /(:\d+)(:\d+)?$/ + DefaultSocketPath = if process.platform is 'win32' '\\\\.\\pipe\\atom-sock' @@ -63,12 +65,11 @@ class AtomApplication exit: (status) -> app.exit(status) constructor: (options) -> - {@resourcePath, @devResourcePath, @version, @devMode, @safeMode, @socketPath} = options + {@resourcePath, @devResourcePath, @executedFrom, @version, @devMode, @safeMode, @socketPath} = options global.atomApplication = this @pidsToOpenWindows = {} - @pathsToOpen ?= [] @windows = [] @autoUpdateManager = new AutoUpdateManager(@version, options.test) @@ -369,13 +370,8 @@ class AtomApplication # :windowDimensions - Object with height and width keys. # :window - {AtomWindow} to open file paths in. openPaths: ({pathsToOpen, pidToKillWhenClosed, newWindow, devMode, safeMode, windowDimensions, profileStartup, window}={}) -> - pathsToOpen = pathsToOpen.map (pathToOpen) -> - if fs.existsSync(pathToOpen) - fs.normalize(pathToOpen) - else - pathToOpen - locationsToOpen = (@locationForPathToOpen(pathToOpen) for pathToOpen in pathsToOpen) + pathsToOpen = (locationToOpen.pathToOpen for locationToOpen in locationsToOpen) unless pidToKillWhenClosed or newWindow existingWindow = @windowForPaths(pathsToOpen, devMode) @@ -523,19 +519,20 @@ class AtomApplication locationForPathToOpen: (pathToOpen) -> return {pathToOpen} unless pathToOpen - return {pathToOpen} if url.parse(pathToOpen).protocol? - return {pathToOpen} if fs.existsSync(pathToOpen) pathToOpen = pathToOpen.replace(/[:\s]+$/, '') + match = pathToOpen.match(LocationSuffixRegExp) - [fileToOpen, initialLine, initialColumn] = path.basename(pathToOpen).split(':') - return {pathToOpen} unless initialLine - return {pathToOpen} unless parseInt(initialLine) >= 0 + if match? + pathToOpen = pathToOpen.slice(0, -match[0].length) + initialLine = Math.max(0, parseInt(match[1].slice(1)) - 1) if match[1] + initialColumn = Math.max(0, parseInt(match[2].slice(1)) - 1) if match[2] + else + initialLine = initialColumn = null + + unless url.parse(pathToOpen).protocol? + pathToOpen = path.resolve(@executedFrom, fs.normalize(pathToOpen)) - # Convert line numbers to a base of 0 - 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} # Opens a native dialog to prompt the user for a path. diff --git a/src/browser/main.coffee b/src/browser/main.coffee index d14eb5bec..33a58289c 100644 --- a/src/browser/main.coffee +++ b/src/browser/main.coffee @@ -5,7 +5,6 @@ app = require 'app' fs = require 'fs-plus' path = require 'path' yargs = require 'yargs' -url = require 'url' console.log = require 'nslog' start = -> @@ -32,16 +31,6 @@ start = -> app.removeListener 'open-file', addPathToOpen app.removeListener 'open-url', addUrlToOpen - cwd = args.executedFrom?.toString() or process.cwd() - args.pathsToOpen = args.pathsToOpen.map (pathToOpen) -> - normalizedPath = fs.normalize(pathToOpen) - if url.parse(pathToOpen).protocol? - pathToOpen - else if cwd - path.resolve(cwd, normalizedPath) - else - path.resolve(pathToOpen) - AtomApplication = require path.join(args.resourcePath, 'src', 'browser', 'atom-application') AtomApplication.open(args) @@ -126,7 +115,7 @@ parseCommandLine = -> process.stdout.write("#{version}\n") process.exit(0) - executedFrom = args['executed-from'] + executedFrom = args['executed-from']?.toString() ? process.cwd() devMode = args['dev'] safeMode = args['safe'] pathsToOpen = args._