Skip to content

Commit

Permalink
bin: Create kernel spec on temporary folder
Browse files Browse the repository at this point in the history
* Fixes IJavascript global installation on OSX.

Fixes #48
  • Loading branch information
n-riesco committed Oct 30, 2015
1 parent baef002 commit 6244afa
Showing 1 changed file with 77 additions and 22 deletions.
99 changes: 77 additions & 22 deletions bin/ijavascript.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ var path = require("path");
var spawn = require("child_process").spawn;
var util = require("util");

var uuid = require("node-uuid");

var usage = (
"IJavascript Notebook\n" +
"\n" +
Expand Down Expand Up @@ -78,8 +80,7 @@ var usage = (
* @property {String} context.path.node Path to Node.js shell
* @property {String} context.path.root Path to IJavascript root folder
* @property {String} context.path.kernel Path to IJavascript kernel
* @property {String} context.path.specDir Path to kernel spec folder
* @property {String} context.path.specFile Path to kernel spec file
* @property {String} context.path.images Path to IJavascript images folder
* @property {Object} context.packageJSON Contents of npm package.json
* @property context.flag
* @property {Boolean} context.flag.debug --ijs-debug
Expand Down Expand Up @@ -130,8 +131,7 @@ function setPaths(context) {
fs.realpathSync(process.argv[1])
));
context.path.kernel = path.join(context.path.root, "lib", "kernel.js");
context.path.specDir = path.join(context.path.root, "spec", "javascript");
context.path.specFile = path.join(context.path.specDir, "kernel.json");
context.path.images = path.join(context.path.root, "images");
}

function readPackageJson(context) {
Expand Down Expand Up @@ -279,29 +279,55 @@ function installKernelAsync(context, callback) {
return;
}

// Create temporary spec folder
var tmpdir = makeTmpdir();
var specDir = path.join(tmpdir, "javascript");
fs.mkdirSync(specDir);

// Create spec file
var specFile = path.join(specDir, "kernel.json");
var spec = {
argv: context.args.kernel,
display_name: "Javascript (Node.js)",
language: "javascript",
};
fs.writeFileSync(context.path.specFile, JSON.stringify(spec));

var cmd = "ipython kernelspec install --replace " + context.path.specDir;
if (context.flag.install !== "global") {
cmd += " --user";
}
exec(cmd, function(error, stdout, stderr) {
if (error) {
console.error(util.format("Error running `%s`", cmd));
console.error(error.toString());
if (stderr) console.error(stderr.toString());
if (DEBUG) console.log("CONTEXT:", context);
process.exit(1);
}

if (callback) {
callback();
}
fs.writeFileSync(specFile, JSON.stringify(spec));

// Copy logo files
var logo32Src = path.join(context.path.images, "logo-32x32.png");
var logo32Dst = path.join(specDir, "logo-32x32.png");
var logo64Src = path.join(context.path.images, "logo-64x64.png");
var logo64Dst = path.join(specDir, "logo-64x64.png");
copyAsync(logo32Src, logo32Dst, function() {
copyAsync(logo64Src, logo64Dst, function() {

// Install kernel spec
var cmd = "ipython kernelspec install --replace " + specDir;
if (context.flag.install !== "global") {
cmd += " --user";
}
exec(cmd, function(error, stdout, stderr) {

// Remove temporary spec folder
fs.unlinkSync(specFile);
fs.unlinkSync(logo32Dst);
fs.unlinkSync(logo64Dst);
fs.rmdirSync(specDir);
fs.rmdirSync(tmpdir);

if (error) {
console.error(util.format("Error running `%s`", cmd));
console.error(error.toString());
if (stderr) console.error(stderr.toString());
if (DEBUG) console.log("CONTEXT:", context);
process.exit(1);
}

if (callback) {
callback();
}
});
});
});
}

Expand All @@ -318,3 +344,32 @@ function spawnFrontend(context) {
frontend.emit(signal);
});
}

function makeTmpdir(maxAttempts) {
maxAttempts = maxAttempts ? maxAttempts : 10;
var attempts = 0;

var tmpdir;
while (!tmpdir) {
attempts++;
try {
tmpdir = path.join(os.tmpdir(), uuid.v4());
fs.mkdirSync(tmpdir);
} catch (e) {
if (attempts >= maxAttempts)
throw e;
tmpdir = null;
}
}

return tmpdir;
}

function copyAsync(src, dst, callback) {
var readStream = fs.createReadStream(src);
var writeStream = fs.createWriteStream(dst);
if (callback) {
readStream.on("end", callback);
}
readStream.pipe(writeStream);
}

0 comments on commit 6244afa

Please sign in to comment.