Pass config dir to C++ as an environment variable

This commit is contained in:
Ben Gotow 2017-07-11 11:55:53 -07:00
parent a7e545b924
commit b76476aeb2
8 changed files with 33 additions and 146 deletions

View file

@ -122,7 +122,7 @@ export function runAuthValidation(accountInfo) {
// Send the form data directly to Nylas to get code
// If this succeeds, send the received code to N1 server to register the account
// Otherwise process the error message from the server and highlight UI as needed
const proc = new MailsyncProcess(data, NylasEnv.getLoadSettings().resourcePath);
const proc = new MailsyncProcess(NylasEnv.getLoadSettings(), data);
return proc.test().then((accountJSON) => {
return accountJSON;
});

View file

@ -29,7 +29,7 @@ export default class Application extends EventEmitter {
const {resourcePath, configDirPath, version, devMode, specMode, benchmarkMode, safeMode} = options;
// Normalize to make sure drive letter case is consistent on Windows
this.resourcePath = path.normalize(resourcePath);
this.resourcePath = resourcePath;
this.configDirPath = configDirPath;
this.version = version;
this.devMode = devMode;
@ -38,10 +38,10 @@ export default class Application extends EventEmitter {
this.safeMode = safeMode;
this.fileListCache = new FileListCache();
this.nylasProtocolHandler = new NylasProtocolHandler(this.resourcePath, this.safeMode);
this.nylasProtocolHandler = new NylasProtocolHandler({configDirPath, resourcePath, safeMode});
try {
const mailsync = new MailsyncProcess(null, this.resourcePath);
const mailsync = new MailsyncProcess(options, null);
await mailsync.migrate();
} catch (err) {
dialog.showMessageBox({

View file

@ -16,26 +16,19 @@ if (typeof process.setFdLimit === 'function') {
}
const setupConfigDir = (args) => {
let defaultDirName = ".nylas-mail";
let defaultDirName = "nylas-mail";
if (args.devMode) {
defaultDirName = ".nylas-dev";
defaultDirName = "nylas-dev";
}
if (args.specMode) {
defaultDirName = ".nylas-spec";
defaultDirName = "nylas-spec";
}
if (args.benchmarkMode) {
defaultDirName = ".nylas-bench";
defaultDirName = "nylas-bench";
}
let configDirPath = path.join(app.getPath('home'), defaultDirName);
if (args.configDirPath) {
configDirPath = args.configDirPath;
} else if (process.env.NYLAS_HOME) {
configDirPath = process.env.NYLAS_HOME;
}
const configDirPath = path.join(app.getPath('appData'), defaultDirName);
mkdirp.sync(configDirPath);
process.env.NYLAS_HOME = configDirPath;
return configDirPath;
};
@ -99,7 +92,7 @@ const parseCommandLine = (argv) => {
const specDirectory = args['spec-directory'];
const specFilePattern = args['spec-file-pattern'];
const showSpecsInWindow = specMode === "window";
const resourcePath = path.resolve(path.dirname(path.dirname(__dirname)));
const resourcePath = path.normalize(path.resolve(path.dirname(path.dirname(__dirname))));
const urlsToOpen = [];
const pathsToOpen = [];

View file

@ -1,4 +1,4 @@
import {app, protocol} from 'electron';
import {protocol} from 'electron';
import fs from 'fs';
import path from 'path';
@ -14,15 +14,13 @@ import path from 'path';
// * RESOURCE_PATH/node_modules
//
export default class NylasProtocolHandler {
constructor(resourcePath, safeMode) {
constructor({configDirPath, resourcePath, safeMode}) {
this.loadPaths = [];
this.dotNylasDirectory = path.join(app.getPath('home'), '.nylas-mail');
if (!safeMode) {
this.loadPaths.push(path.join(this.dotNylasDirectory, 'dev', 'packages'));
this.loadPaths.push(path.join(configDirPath, 'dev', 'packages'));
}
this.loadPaths.push(path.join(this.dotNylasDirectory, 'packages'));
this.loadPaths.push(path.join(configDirPath, 'packages'));
this.loadPaths.push(path.join(resourcePath, 'internal_packages'));
this.registerNylasProtocol();
@ -34,21 +32,11 @@ export default class NylasProtocolHandler {
const relativePath = path.normalize(request.url.substr(7));
let filePath = null;
if (relativePath.indexOf('assets/') === 0) {
const assetsPath = path.join(this.dotNylasDirectory, relativePath);
const assetsStats = fs.statSyncNoException(assetsPath);
if (assetsStats.isFile && assetsStats.isFile()) {
filePath = assetsPath;
}
}
if (!filePath) {
for (const loadPath of this.loadPaths) {
filePath = path.join(loadPath, relativePath);
const fileStats = fs.statSyncNoException(filePath);
if (fileStats.isFile && fileStats.isFile()) {
break;
}
for (const loadPath of this.loadPaths) {
filePath = path.join(loadPath, relativePath);
const fileStats = fs.statSyncNoException(filePath);
if (fileStats.isFile && fileStats.isFile()) {
break;
}
}

View file

@ -1,6 +1,7 @@
/* eslint no-cond-assign: 0 */
const path = require('path')
const fs = require('fs')
const mkdirp = require('mkdirp');
const babelCompiler = require('./compile-support/babel')
const coffeeCompiler = require('./compile-support/coffee-script')
@ -30,8 +31,9 @@ function readCachedJavascript(relativeCachePath) {
function writeCachedJavascript(relativeCachePath, code) {
const cacheTmpPath = path.join(cacheDirectory, `${relativeCachePath}.${process.pid}`)
const cachePath = path.join(cacheDirectory, relativeCachePath)
mkdirp.sync(path.dirname(cacheTmpPath));
fs.writeFileSync(cacheTmpPath, code, 'utf8')
fs.renameSync(cacheTmpPath, cachePath)
fs.renameSync(cacheTmpPath, cachePath);
}
function addSourceURL(jsCode, filePath) {

View file

@ -48,7 +48,7 @@ export default class MailsyncBridge {
}
toLaunch.forEach((acct) => {
const client = new MailsyncProcess(acct, NylasEnv.getLoadSettings().resourcePath);
const client = new MailsyncProcess(NylasEnv.getLoadSettings(), acct);
client.sync();
client.on('deltas', this.onIncomingMessages);
client.on('close', () => {

View file

@ -27,15 +27,20 @@ const LocalizedErrorStrings = {
};
export default class MailsyncProcess extends EventEmitter {
constructor(account, resourcePath) {
constructor({configDirPath, resourcePath}, account) {
super();
this.configDirPath = configDirPath;
this.account = account;
this.binaryPath = path.join(resourcePath, 'MailSync');
this._proc = null;
}
_spawnProcess(mode) {
this._proc = spawn(this.binaryPath, [`--mode`, mode]);
this._proc = spawn(this.binaryPath, [`--mode`, mode], {
env: {
CONFIG_DIR_PATH: this.configDirPath,
},
});
if (this.account) {
this._proc.stdout.once('data', () => {
this._proc.stdin.write(`${JSON.stringify(this.account)}\n`);

View file

@ -1,12 +1,10 @@
/* eslint global-require: 0 */
/* eslint import/no-dynamic-require: 0 */
import fs from 'fs';
import path from 'path';
import { ipcRenderer, remote, shell } from 'electron';
import { ipcRenderer, remote } from 'electron';
import _ from 'underscore';
import { Emitter } from 'event-kit';
import fs from 'fs';
import { convertStackTrace } from 'coffeestack';
import { mapSourcePosition } from 'source-map-support';
@ -193,15 +191,9 @@ export default class NylasEnvConstructor {
// by default) to support these symlinked modules
require('module').globalPaths.push(path.join(resourcePath, 'node_modules'));
// Still set NODE_PATH since tasks may need it.
process.env.NODE_PATH = globalPath;
// Make react.js faster
if (!devMode && process.env.NODE_ENV == null) process.env.NODE_ENV = 'production';
// Set NylasEnv's home so packages don't have to guess it
process.env.NYLAS_HOME = configDirPath;
// Setup config and load it immediately so it's available to our singletons
this.config = new Config({configDirPath, resourcePath});
@ -224,8 +216,6 @@ export default class NylasEnvConstructor {
this.windowEventHandler = new WindowEventHandler();
this.globalWindowEmitter = new Emitter();
if (!this.inSpecMode()) {
this.mailsyncBridge = new MailsyncBridge();
this.actionBridge = new ActionBridge(ipcRenderer);
@ -403,15 +393,6 @@ export default class NylasEnvConstructor {
Section: Event Subscription
*/
// Extended: Invoke the given callback whenever {::beep} is called.
//
// * `callback` {Function} to be called whenever {::beep} is called.
//
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe.
onDidBeep(callback) {
return this.emitter.on('did-beep', callback);
}
// Extended: Invoke the given callback when there is an unhandled error, but
// before the devtools pop open
//
@ -909,8 +890,6 @@ export default class NylasEnvConstructor {
// This also means that the windowType has changed and a different set of
// plugins needs to be loaded.
populateHotWindow(event, loadSettings) {
console.log('populateHotWindow called')
console.log(loadSettings);
this.loadSettings = loadSettings;
this.constructor.loadSettings = loadSettings;
@ -966,55 +945,6 @@ export default class NylasEnvConstructor {
if (maximize) this.maximize();
}
// Essential: Visually and audibly trigger a beep.
beep() {
if (this.config.get('core.audioBeep')) { shell.beep(); }
return this.emitter.emit('did-beep');
}
// Essential: A flexible way to open a dialog akin to an alert dialog.
//
// ## Examples
//
// ```coffee
// NylasEnv.confirm
// message: 'How you feeling?'
// detailedMessage: 'Be honest.'
// buttons:
// Good: -> window.alert('good to hear')
// Bad: -> window.alert('bummer')
// ```
//
// * `options` An {Object} with the following keys:
// * `message` The {String} message to display.
// * `detailedMessage` (optional) The {String} detailed message to display.
// * `buttons` (optional) Either an array of strings or an object where keys are
// button names and the values are callbacks to invoke when clicked.
//
// Returns the chosen button index {Number} if the buttons option was an array.
confirm({message, detailedMessage, buttons} = {}) {
let buttonLabels;
if (_.isArray(buttons)) {
buttonLabels = buttons;
} else {
buttonLabels = Object.keys(buttons || {});
}
const chosen = remote.dialog.showMessageBox(this.getCurrentWindow(), {
type: 'info',
message,
detail: detailedMessage,
buttons: buttonLabels,
}
);
if (_.isArray(buttons)) {
return chosen;
}
const callback = buttons[buttonLabels[chosen]];
return callback ? callback() : undefined;
}
/*
Section: Managing the Dev Tools
*/
@ -1158,37 +1088,6 @@ export default class NylasEnvConstructor {
return process.crash();
}
// Require the module with the given globals.
//
// The globals will be set on the `window` object and removed after the
// require completes.
//
// * `id` The {String} module name or path.
// * `globals` An optinal {Object} to set as globals during require.
requireWithGlobals(id, globals = {}) {
const existingGlobals = {};
for (const key of globals) {
const value = globals[key];
existingGlobals[key] = window[key];
window[key] = value;
}
require(id);
return (() => {
const result = [];
for (const key of existingGlobals) {
const value = existingGlobals[key];
if (value === undefined) {
result.push(delete window[key]);
} else {
result.push(window[key] = value);
}
}
return result;
})();
}
onUpdateAvailable(callback) {
return this.emitter.on('update-available', callback);
}