-
-
Save jeffgca/1021239 to your computer and use it in GitHub Desktop.
var sanitize_name = function(s) { | |
return s.replace(/[\s\.]*/g, '').toLowerCase(); | |
} | |
var os = Components.classes['@activestate.com/koOs;1']. | |
getService(Components.interfaces.koIOs); | |
var project_root = ko.filepicker.getFolder(os.getcwd(), "Choose a directory to create your new project in."); | |
// var project_root = '/Users/jeff/code/moz/jetpack/tmp/two'; | |
var name = ko.dialogs.prompt('Addon name', 'What do you want to call your new extension?'); | |
var safe_name = sanitize_name(name); | |
var dir = os.path.join(project_root, safe_name); | |
function jetpack_init(base_dir, safe_name) { | |
try { | |
var dir = os.path.join(project_root, safe_name); | |
os.mkdir(dir); | |
// should be in extension prefs | |
var cmd = '/Users/jeff/code/moz/jetpack/addon-sdk/bin/cfx ' | |
+ '-b /Applications/Coms/Firefox4.app ' | |
+ 'init'; | |
cmd += " {'cwd': u'"+ dir +"'}"; // necessary? | |
ko.run.runEncodedCommand(window, cmd, function() { | |
create_project(dir, safe_name); | |
}); | |
} | |
catch(e) { | |
ko.eggs.writeLine(e); | |
} | |
} | |
function create_project(dir, name) { | |
var projectName = name + '.komodoproject'; | |
var path_list = [dir, projectName]; | |
var url = ko.uriparse.localPathToURI(os.path.joinlist(path_list.length, path_list)); | |
var project = Components.classes["@activestate.com/koProject;1"] | |
.createInstance(Components.interfaces.koIProject); | |
project.create(); | |
project.url = url; | |
project.save(); | |
ko.projects.open(url); | |
} | |
jetpack_init(project_root, safe_name); |
CHALLENGE: post back a Python version of this ;)
Agreed that runEncodedCommand() is awkward to implement; that bit is lifted from how the Firefox & Komodo project templates work. At the time we decided it might be better to run koext out-of-process. None of the people involved in that conversation work on Komodo anymore though ;). Doing things in-process either requires blocking the main thread or delving into Python threading, yes?
I'm more comfortable with JS async programming I guess; what I really like about the pattern is the callback. Trent added that into that method specifically so I could do things like shell out to something and then run JS macro code afterwards. I just wish there was a more convenient method signature, something like:
ko.run.runCommandSanely( cmd, cwd, callback )
...the string munging for the command is less than obvious.
Hmm, since cfx is python anyway, would writing it in python and just importing the relevant modules make sense? I believe the bundled python is 2.6, which the addon-sdk readme claims to work with.
Of course, that has the disadvantage of being in-process. (The advantage is the passing anything on the command line is iffy on Windows, and I hate the Komodo run command interface because it's serialized and unintuitive.)