mirror of
https://github.com/gryf/pentadactyl-pm.git
synced 2026-01-09 04:54:10 +01:00
Show the hg revision and date in :version where possible when running from a repo.
This commit is contained in:
@@ -106,7 +106,22 @@ var Dactyl = Module("dactyl", XPCOM(Ci.nsISupportsWeakReference, ModuleBase), {
|
|||||||
forceNewWindow: false,
|
forceNewWindow: false,
|
||||||
|
|
||||||
/** @property {string} The Dactyl version string. */
|
/** @property {string} The Dactyl version string. */
|
||||||
version: null,
|
version: Class.memoize(function () {
|
||||||
|
if (/pre$/.test(util.addon.version)) {
|
||||||
|
let uri = util.addon.getResourceURI("../.hg");
|
||||||
|
if (uri instanceof Ci.nsIFileURL &&
|
||||||
|
uri.QueryInterface(Ci.nsIFileURL).file.exists() &&
|
||||||
|
io.pathSearch("hg")) {
|
||||||
|
return io.system(["hg", "-R", uri.file.parent.path,
|
||||||
|
"log", "-r.",
|
||||||
|
"--template=hg{rev} ({date|isodate})"]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let version = util.addon.version;
|
||||||
|
if ("@DATE" !== "@" + "DATE@")
|
||||||
|
version += " (created: @DATE@)"
|
||||||
|
return version;
|
||||||
|
}),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @property {Object} The map of command-line options. These are
|
* @property {Object} The map of command-line options. These are
|
||||||
@@ -1515,70 +1530,6 @@ var Dactyl = Module("dactyl", XPCOM(Ci.nsISupportsWeakReference, ModuleBase), {
|
|||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
if (typeof AddonManager == "undefined")
|
|
||||||
modules.AddonManager = {
|
|
||||||
getAddonByID: function (id, callback) {
|
|
||||||
callback = callback || util.identity;
|
|
||||||
let addon = id;
|
|
||||||
if (!isObject(addon))
|
|
||||||
addon = services.extensionManager.getItemForID(id);
|
|
||||||
if (!addon)
|
|
||||||
return callback(null);
|
|
||||||
addon = Object.create(addon);
|
|
||||||
|
|
||||||
function getRdfProperty(item, property) {
|
|
||||||
let resource = services.rdf.GetResource("urn:mozilla:item:" + item.id);
|
|
||||||
let value = "";
|
|
||||||
|
|
||||||
if (resource) {
|
|
||||||
let target = services.extensionManager.datasource.GetTarget(resource,
|
|
||||||
services.rdf.GetResource("http://www.mozilla.org/2004/em-rdf#" + property), true);
|
|
||||||
if (target && target instanceof Ci.nsIRDFLiteral)
|
|
||||||
value = target.Value;
|
|
||||||
}
|
|
||||||
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
["aboutURL", "creator", "description", "developers",
|
|
||||||
"homepageURL", "iconURL", "installDate", "name",
|
|
||||||
"optionsURL", "releaseNotesURI", "updateDate", "version"].forEach(function (item) {
|
|
||||||
addon[item] = getRdfProperty(addon, item);
|
|
||||||
});
|
|
||||||
addon.isActive = getRdfProperty(addon, "isDisabled") != "true";
|
|
||||||
|
|
||||||
addon.uninstall = function () {
|
|
||||||
services.extensionManager.uninstallItem(this.id);
|
|
||||||
};
|
|
||||||
addon.appDisabled = false;
|
|
||||||
addon.__defineGetter__("userDisabled", function () getRdfProperty(addon, "userDisabled") === "true");
|
|
||||||
addon.__defineSetter__("userDisabled", function (val) {
|
|
||||||
services.extensionManager[val ? "disableItem" : "enableItem"](this.id);
|
|
||||||
});
|
|
||||||
|
|
||||||
return callback(addon);
|
|
||||||
},
|
|
||||||
getAddonsByTypes: function (types, callback) {
|
|
||||||
let res = [];
|
|
||||||
for (let [, type] in Iterator(types))
|
|
||||||
for (let [, item] in Iterator(services.extensionManager
|
|
||||||
.getItemList(Ci.nsIUpdateItem["TYPE_" + type.toUpperCase()], {})))
|
|
||||||
res.push(this.getAddonByID(item));
|
|
||||||
callback(res);
|
|
||||||
},
|
|
||||||
getInstallForFile: function (file, callback, mimetype) {
|
|
||||||
callback({
|
|
||||||
addListener: function () {},
|
|
||||||
install: function () {
|
|
||||||
services.extensionManager.installItemFromFile(file, "app-profile");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
getInstallForURL: function (url, callback, mimetype) {
|
|
||||||
dactyl.assert(false, "Install by URL not implemented");
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
const addonErrors = array.toObject([
|
const addonErrors = array.toObject([
|
||||||
[AddonManager.ERROR_NETWORK_FAILURE, "A network error occurred"],
|
[AddonManager.ERROR_NETWORK_FAILURE, "A network error occurred"],
|
||||||
[AddonManager.ERROR_INCORRECT_HASH, "The downloaded file did not match the expected hash"],
|
[AddonManager.ERROR_INCORRECT_HASH, "The downloaded file did not match the expected hash"],
|
||||||
@@ -2140,12 +2091,7 @@ var Dactyl = Module("dactyl", XPCOM(Ci.nsISupportsWeakReference, ModuleBase), {
|
|||||||
|
|
||||||
dactyl.log("All modules loaded", 3);
|
dactyl.log("All modules loaded", 3);
|
||||||
|
|
||||||
AddonManager.getAddonByID(services["dactyl:"].addonID, this.wrapCallback(function (addon) {
|
prefs.set("extensions.dactyl.version", util.addon.version);
|
||||||
// @DATE@ token replaced by the Makefile
|
|
||||||
// TODO: Find it automatically
|
|
||||||
prefs.set("extensions.dactyl.version", addon.version);
|
|
||||||
dactyl.version = addon.version + " (created: @DATE@)";
|
|
||||||
}));
|
|
||||||
|
|
||||||
if (!services.commandLineHandler)
|
if (!services.commandLineHandler)
|
||||||
services.add("commandLineHandler", "@mozilla.org/commandlinehandler/general-startup;1?type=" + config.name);
|
services.add("commandLineHandler", "@mozilla.org/commandlinehandler/general-startup;1?type=" + config.name);
|
||||||
|
|||||||
@@ -226,6 +226,34 @@ var IO = Module("io", {
|
|||||||
return "";
|
return "";
|
||||||
},
|
},
|
||||||
|
|
||||||
|
pathSearch: function (bin) {
|
||||||
|
let dirs = services.environment.get("PATH").split(util.OS.isWindows ? ";" : ":");
|
||||||
|
// Windows tries the CWD first TODO: desirable?
|
||||||
|
if (util.OS.isWindows)
|
||||||
|
dirs = [io.cwd].concat(dirs);
|
||||||
|
|
||||||
|
for (let [, dir] in Iterator(dirs))
|
||||||
|
try {
|
||||||
|
dir = io.File(dir, true);
|
||||||
|
let file = dir.child(bin);
|
||||||
|
if (file.exists())
|
||||||
|
return file;
|
||||||
|
|
||||||
|
// TODO: couldn't we just palm this off to the start command?
|
||||||
|
// automatically try to add the executable path extensions on windows
|
||||||
|
if (util.OS.isWindows) {
|
||||||
|
let extensions = services.environment.get("PATHEXT").split(";");
|
||||||
|
for (let [, extension] in Iterator(extensions)) {
|
||||||
|
file = dir.child(bin + extension);
|
||||||
|
if (file.exists())
|
||||||
|
return file;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (e) {}
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Runs an external program.
|
* Runs an external program.
|
||||||
*
|
*
|
||||||
@@ -239,33 +267,8 @@ var IO = Module("io", {
|
|||||||
|
|
||||||
if (File.isAbsolutePath(program))
|
if (File.isAbsolutePath(program))
|
||||||
file = io.File(program, true);
|
file = io.File(program, true);
|
||||||
else {
|
else
|
||||||
let dirs = services.environment.get("PATH").split(util.OS.isWindows ? ";" : ":");
|
file = io.pathSearch(program);
|
||||||
// Windows tries the CWD first TODO: desirable?
|
|
||||||
if (util.OS.isWindows)
|
|
||||||
dirs = [io.cwd].concat(dirs);
|
|
||||||
|
|
||||||
lookup:
|
|
||||||
for (let [, dir] in Iterator(dirs)) {
|
|
||||||
file = File.joinPaths(dir, program, io.cwd);
|
|
||||||
try {
|
|
||||||
if (file.exists())
|
|
||||||
break;
|
|
||||||
|
|
||||||
// TODO: couldn't we just palm this off to the start command?
|
|
||||||
// automatically try to add the executable path extensions on windows
|
|
||||||
if (util.OS.isWindows) {
|
|
||||||
let extensions = services.environment.get("PATHEXT").split(";");
|
|
||||||
for (let [, extension] in Iterator(extensions)) {
|
|
||||||
file = File.joinPaths(dir, program + extension, io.cwd);
|
|
||||||
if (file.exists())
|
|
||||||
break lookup;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (e) {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!file || !file.exists()) {
|
if (!file || !file.exists()) {
|
||||||
dactyl.echoerr("Command not found: " + program);
|
dactyl.echoerr("Command not found: " + program);
|
||||||
@@ -426,6 +429,10 @@ lookup:
|
|||||||
stdin.write(input);
|
stdin.write(input);
|
||||||
|
|
||||||
let shell = File.expandPath(options["shell"]);
|
let shell = File.expandPath(options["shell"]);
|
||||||
|
|
||||||
|
if (isArray(command))
|
||||||
|
command = command.map(escape).join(" ");
|
||||||
|
|
||||||
// TODO: implement 'shellredir'
|
// TODO: implement 'shellredir'
|
||||||
if (util.OS.isWindows && !/sh/.test(options["shell"])) {
|
if (util.OS.isWindows && !/sh/.test(options["shell"])) {
|
||||||
command = "cd /D " + this.cwd + " && " + command + " > " + stdout.path + " 2>&1" + " < " + stdin.path;
|
command = "cd /D " + this.cwd + " && " + command + " > " + stdout.path + " 2>&1" + " < " + stdin.path;
|
||||||
|
|||||||
@@ -6,9 +6,11 @@
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
|
var global = this;
|
||||||
Components.utils.import("resource://dactyl/base.jsm");
|
Components.utils.import("resource://dactyl/base.jsm");
|
||||||
defineModule("services", {
|
defineModule("services", {
|
||||||
exports: ["AddonManager", "Services", "services"]
|
exports: ["AddonManager", "Services", "services"],
|
||||||
|
use: ["util"]
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -76,6 +78,80 @@ var Services = Module("Services", {
|
|||||||
|
|
||||||
if (!this.extensionManager)
|
if (!this.extensionManager)
|
||||||
Components.utils.import("resource://gre/modules/AddonManager.jsm");
|
Components.utils.import("resource://gre/modules/AddonManager.jsm");
|
||||||
|
else
|
||||||
|
global.AddonManager = {
|
||||||
|
getAddonByID: function (id, callback) {
|
||||||
|
callback = callback || util.identity;
|
||||||
|
let addon = id;
|
||||||
|
if (!isObject(addon))
|
||||||
|
addon = services.extensionManager.getItemForID(id);
|
||||||
|
if (!addon)
|
||||||
|
return callback(null);
|
||||||
|
addon = Object.create(addon);
|
||||||
|
|
||||||
|
function getRdfProperty(item, property) {
|
||||||
|
let resource = services.rdf.GetResource("urn:mozilla:item:" + item.id);
|
||||||
|
let value = "";
|
||||||
|
|
||||||
|
if (resource) {
|
||||||
|
let target = services.extensionManager.datasource.GetTarget(resource,
|
||||||
|
services.rdf.GetResource("http://www.mozilla.org/2004/em-rdf#" + property), true);
|
||||||
|
if (target && target instanceof Ci.nsIRDFLiteral)
|
||||||
|
value = target.Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
["aboutURL", "creator", "description", "developers",
|
||||||
|
"homepageURL", "iconURL", "installDate",
|
||||||
|
"optionsURL", "releaseNotesURI", "updateDate", "version"].forEach(function (item) {
|
||||||
|
addon[item] = getRdfProperty(addon, item);
|
||||||
|
});
|
||||||
|
update(addon, {
|
||||||
|
|
||||||
|
appDisabled: false,
|
||||||
|
|
||||||
|
installLocation: Class.memoize(function () services.extensionManager.getInstallLocation(this.id)),
|
||||||
|
getResourceURI: function getResourceURI(path) {
|
||||||
|
let file = this.installLocation.getItemFile(this.id, path);
|
||||||
|
return services.io.newFileURI(file);
|
||||||
|
},
|
||||||
|
|
||||||
|
isActive: getRdfProperty(addon, "isDisabled") != "true",
|
||||||
|
|
||||||
|
uninstall: function uninstall() {
|
||||||
|
services.extensionManager.uninstallItem(this.id);
|
||||||
|
},
|
||||||
|
|
||||||
|
get userDisabled() getRdfProperty(addon, "userDisabled") === "true",
|
||||||
|
set userDisabled(val) {
|
||||||
|
services.extensionManager[val ? "disableItem" : "enableItem"](this.id);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return callback(addon);
|
||||||
|
},
|
||||||
|
getAddonsByTypes: function (types, callback) {
|
||||||
|
let res = [];
|
||||||
|
for (let [, type] in Iterator(types))
|
||||||
|
for (let [, item] in Iterator(services.extensionManager
|
||||||
|
.getItemList(Ci.nsIUpdateItem["TYPE_" + type.toUpperCase()], {})))
|
||||||
|
res.push(this.getAddonByID(item));
|
||||||
|
callback(res);
|
||||||
|
},
|
||||||
|
getInstallForFile: function (file, callback, mimetype) {
|
||||||
|
callback({
|
||||||
|
addListener: function () {},
|
||||||
|
install: function () {
|
||||||
|
services.extensionManager.installItemFromFile(file, "app-profile");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
getInstallForURL: function (url, callback, mimetype) {
|
||||||
|
dactyl.assert(false, "Install by URL not implemented");
|
||||||
|
},
|
||||||
|
};
|
||||||
},
|
},
|
||||||
reinit: function () {},
|
reinit: function () {},
|
||||||
|
|
||||||
|
|||||||
@@ -59,7 +59,12 @@ var Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
get addon() services.fuel.storage.get("dactyl.bootstrap", null).addon,
|
addon: Class.memoize(function () {
|
||||||
|
let addon = services.fuel.storage.get("dactyl.bootstrap", {}).addon;
|
||||||
|
if (!addon)
|
||||||
|
addon = AddonManager.getAddonByID(services["dactyl:"].addonID);
|
||||||
|
return addon;
|
||||||
|
}),
|
||||||
|
|
||||||
// FIXME: Only works for Pentadactyl
|
// FIXME: Only works for Pentadactyl
|
||||||
get activeWindow() services.windowMediator.getMostRecentWindow("navigator:browser"),
|
get activeWindow() services.windowMediator.getMostRecentWindow("navigator:browser"),
|
||||||
|
|||||||
Reference in New Issue
Block a user