Merge pull request #8442 from atom/portable-mode

Enable Portable Mode
This commit is contained in:
Kevin Sawicki
2015-11-03 12:49:54 -08:00
5 changed files with 95 additions and 0 deletions

View File

@@ -1,5 +1,6 @@
crypto = require 'crypto'
path = require 'path'
ipc = require 'ipc'
_ = require 'underscore-plus'
{deprecate} = require 'grim'
@@ -203,6 +204,15 @@ class AtomEnvironment extends Model
@observeAutoHideMenuBar()
checkPortableHomeWritable = ->
responseChannel = "check-portable-home-writable-response"
ipc.on responseChannel, (response) ->
ipc.removeAllListeners(responseChannel)
atom.notifications.addWarning("#{response.message.replace(/([\\\.+\\-_#!])/g, '\\$1')}") if not response.writable
ipc.send('check-portable-home-writable', responseChannel)
checkPortableHomeWritable()
setConfigSchema: ->
@config.setSchema null, {type: 'object', properties: _.clone(require('./config-schema'))}

View File

@@ -0,0 +1,32 @@
fs = require 'fs-plus'
path = require 'path'
ipc = require 'ipc'
module.exports =
class AtomPortable
@getPortableAtomHomePath: ->
execDirectoryPath = path.dirname(process.execPath)
path.join(execDirectoryPath, '..', '.atom')
@isPortableInstall: (platform, environmentAtomHome, defaultHome) ->
return false unless platform is 'win32'
return false if environmentAtomHome
return false if not fs.existsSync(@getPortableAtomHomePath())
# currently checking only that the directory exists and is writable,
# probably want to do some integrity checks on contents in future
@isPortableAtomHomePathWritable(defaultHome)
@isPortableAtomHomePathWritable: (defaultHome) ->
writable = false
message = ""
try
writePermissionTestFile = path.join(@getPortableAtomHomePath(), "write.test")
fs.writeFileSync(writePermissionTestFile, "test") if not fs.existsSync(writePermissionTestFile)
fs.removeSync(writePermissionTestFile)
writable = true
catch error
message = "Failed to use portable Atom home directory (#{@getPortableAtomHomePath()}). Using the default instead (#{defaultHome}). #{error.message}"
ipc.on 'check-portable-home-writable', (event) ->
event.sender.send 'check-portable-home-writable-response', {writable, message}
writable

View File

@@ -60,6 +60,8 @@ setupCrashReporter = ->
setupAtomHome = ->
return if process.env.ATOM_HOME
atomHome = path.join(app.getHomeDir(), '.atom')
AtomPortable = require './atom-portable'
atomHome = AtomPortable.getPortableAtomHomePath() if AtomPortable.isPortableInstall(process.platform, process.env.ATOM_HOME, atomHome)
try
atomHome = fs.realpathSync(atomHome)
process.env.ATOM_HOME = atomHome