Skip to content

Commit

Permalink
Use standard directory .cache on Linux
Browse files Browse the repository at this point in the history
  • Loading branch information
Oden committed Jun 10, 2015
1 parent 880a03b commit f847832
Show file tree
Hide file tree
Showing 2 changed files with 92 additions and 80 deletions.
75 changes: 39 additions & 36 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,56 +27,59 @@ function fail (err) {

function openConfig (cb) {
var userHome = require('user-home');
if (process.platform === 'linux' && userHome) {
userHome += '/.cache';
}
var configpath = path.join(userHome || os.tmpdir(), configfile);
var content;
try {
content = require(configpath);
process.nextTick(function () {
cb(null, content);
});
content = require(configpath);
process.nextTick(function () {
cb(null, content);
});
} catch (e) {
fs.open(configpath, 'w+', function (err, fd) {
if (err) {
return cb(fail(err));
}
return cb(null, fd);
});
fs.open(configpath, 'w+', function (err, fd) {
if (err) {
return cb(fail(err));
}
return cb(null, fd);
});
}
}

function writeConfig (fd, cb) {
execFile(process.execPath, ['--v8-options'], function (execErr, result) {
var flags;
if (execErr) {
return cb(execErr);
}
flags = result.match(/\s\s--(\w+)/gm).map(function (match) {
return match.substring(2);
}).filter(function (name) {
return exclusions.indexOf(name) === -1;
});
var buf = new Buffer(JSON.stringify(flags));
fs.write(fd, buf, 0, buf.length, 0, function (writeErr, bytesWritten, buffer) {
fs.close(fd, function (closeErr) {
var err = writeErr || closeErr;
if (err) {
return cb(fail(err));
}
return cb(null, JSON.parse(buffer.toString()));
});
});
var flags;
if (execErr) {
return cb(execErr);
}
flags = result.match(/\s\s--(\w+)/gm).map(function (match) {
return match.substring(2);
}).filter(function (name) {
return exclusions.indexOf(name) === -1;
});
var buf = new Buffer(JSON.stringify(flags));
fs.write(fd, buf, 0, buf.length, 0, function (writeErr, bytesWritten, buffer) {
fs.close(fd, function (closeErr) {
var err = writeErr || closeErr;
if (err) {
return cb(fail(err));
}
return cb(null, JSON.parse(buffer.toString()));
});
});
});
}

module.exports = function (cb) {
openConfig(function (err, result) {
if (err) {
return cb(fail(err));
}
if (typeof result === 'number') {
return writeConfig(result, cb);
}
return cb(null, result);
if (err) {
return cb(fail(err));
}
if (typeof result === 'number') {
return writeConfig(result, cb);
}
return cb(null, result);
});
};

Expand Down
97 changes: 53 additions & 44 deletions test.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,62 +7,71 @@ const expect = require('chai').expect;

const env = process.env;

function getConfigPath() {
var v8flags = require('./');
var userHome = require('user-home');
if (process.platform === 'linux' && userHome) {
userHome += '/.cache';
}
return path.join(userHome, v8flags.configfile);
}

describe('v8flags', function () {

afterEach(function () {
delete require.cache[require.resolve('user-home')];
var v8flags = require('./');
try {
[
path.resolve(require('user-home'), v8flags.configfile),
path.resolve(os.tmpdir(), v8flags.configfile)
].map(fs.unlinkSync);
} catch (e) {}
delete require.cache[require.resolve('user-home')];
delete require.cache[require.resolve('user-home')];
var v8flags = require('./');
try {
[
path.resolve(getConfigPath()),
path.resolve(os.tmpdir(), v8flags.configfile)
].map(fs.unlinkSync);
} catch (e) {}
delete require.cache[require.resolve('user-home')];
});

it('should cache and call back with the v8 flags for the running process', function (done) {
var v8flags = require('./');
var configfile = path.resolve(require('user-home'), v8flags.configfile);
v8flags(function (err, flags) {
expect(flags).to.be.a('array');
expect(fs.existsSync(configfile)).to.be.true;
fs.unlinkSync(configfile);
fs.writeFileSync(configfile, JSON.stringify({cached:true}));
v8flags(function (cacheErr, cachedFlags) {
expect(cachedFlags).to.deep.equal({cached:true});
done();
});
});
var v8flags = require('./');
var configfile = path.resolve(getConfigPath());
v8flags(function (err, flags) {
expect(flags).to.be.a('array');
expect(fs.existsSync(configfile)).to.be.true;
fs.unlinkSync(configfile);
fs.writeFileSync(configfile, JSON.stringify({cached:true}));
v8flags(function (cacheErr, cachedFlags) {
expect(cachedFlags).to.deep.equal({cached:true});
done();
});
});
});

it('should create config correctly when multiple concurrent calls happen and it does not exist yet', function (done) {
var v8flags = require('./');
var configfile = path.resolve(require('user-home'), v8flags.configfile);
async.parallel([v8flags, v8flags], function (err, results) {
v8flags(function (err, final) {
expect(results[0]).to.deep.equal(final);
expect(results[1]).to.deep.equal(final);
done();
});
});
var v8flags = require('./');
var configfile = path.resolve(getConfigPath());
async.parallel([v8flags, v8flags], function (err, results) {
v8flags(function (err, final) {
expect(results[0]).to.deep.equal(final);
expect(results[1]).to.deep.equal(final);
done();
});
});
});

it('should fall back to writing to a temp dir if user home can\'t be found', function (done) {
delete env.HOME;
delete env.USERPROFILE;
delete env.HOMEDRIVE;
delete env.HOMEPATH;
delete env.LOGNAME;
delete env.USER;
delete env.LNAME;
delete env.USERNAME;
var v8flags = require('./');
var configfile = path.resolve(os.tmpdir(), v8flags.configfile);
v8flags(function (err, flags) {
expect(fs.existsSync(configfile)).to.be.true;
done();
});
delete env.HOME;
delete env.USERPROFILE;
delete env.HOMEDRIVE;
delete env.HOMEPATH;
delete env.LOGNAME;
delete env.USER;
delete env.LNAME;
delete env.USERNAME;
var v8flags = require('./');
var configfile = path.resolve(os.tmpdir(), v8flags.configfile);
v8flags(function (err, flags) {
expect(fs.existsSync(configfile)).to.be.true;
done();
});
});

});

0 comments on commit f847832

Please sign in to comment.