electron/atom/browser/api/lib/auto-updater/squirrel-update-win.coffee

72 lines
2.1 KiB
CoffeeScript
Raw Normal View History

fs = require 'fs'
path = require 'path'
{spawn} = require 'child_process'
2015-06-15 18:28:47 +00:00
2016-01-12 02:03:02 +00:00
### i.e. my-app/app-0.1.13/ ###
appFolder = path.dirname process.execPath
### i.e. my-app/Update.exe ###
updateExe = path.resolve appFolder, '..', 'Update.exe'
exeName = path.basename process.execPath
2015-06-15 18:28:47 +00:00
2016-01-12 02:03:02 +00:00
###
Spawn a command and invoke the callback when it completes with an error
and the output from standard out.
###
spawnUpdate = (args, detached, callback) ->
2015-06-15 18:28:47 +00:00
try
spawnedProcess = spawn updateExe, args, {detached}
2015-06-15 18:28:47 +00:00
catch error
2016-01-12 02:03:02 +00:00
### Shouldn't happen, but still guard it. ###
process.nextTick -> callback error
2015-06-15 18:28:47 +00:00
return
stdout = ''
stderr = ''
2015-06-15 18:28:47 +00:00
spawnedProcess.stdout.on 'data', (data) -> stdout += data
spawnedProcess.stderr.on 'data', (data) -> stderr += data
2015-06-15 18:28:47 +00:00
errorEmitted = false
spawnedProcess.on 'error', (error) ->
errorEmitted = true
callback error
spawnedProcess.on 'exit', (code, signal) ->
2016-01-12 02:03:02 +00:00
### We may have already emitted an error. ###
return if errorEmitted
2015-06-15 18:28:47 +00:00
2016-01-12 02:03:02 +00:00
### Process terminated with error. ###
if code isnt 0
return callback "Command failed: #{signal ? code}\n#{stderr}"
2016-01-12 02:03:02 +00:00
### Success. ###
callback null, stdout
2016-01-12 02:03:02 +00:00
### Start an instance of the installed app. ###
exports.processStart = (callback) ->
spawnUpdate ['--processStart', exeName], true, ->
2016-01-12 02:03:02 +00:00
### Download the releases specified by the URL and write new results to stdout. ###
2015-11-13 08:03:40 +00:00
exports.download = (updateURL, callback) ->
spawnUpdate ['--download', updateURL], false, (error, stdout) ->
return callback(error) if error?
try
2016-01-12 02:03:02 +00:00
### Last line of output is the JSON details about the releases ###
json = stdout.trim().split('\n').pop()
update = JSON.parse(json)?.releasesToApply?.pop?()
catch
return callback "Invalid result:\n#{stdout}"
callback null, update
2015-06-15 18:28:47 +00:00
2016-01-12 02:03:02 +00:00
### Update the application to the latest remote version specified by URL. ###
2015-11-13 08:03:40 +00:00
exports.update = (updateURL, callback) ->
spawnUpdate ['--update', updateURL], false, callback
2015-06-15 18:28:47 +00:00
2016-01-12 02:03:02 +00:00
### Is the Update.exe installed with the current application? ###
exports.supported = ->
try
fs.accessSync updateExe, fs.R_OK
return true
catch
return false