Hi All,
WPKG 0.9.2-test1 has been released.
* some check types were removed because they introduced many bugs and weren't
tested very well:
o registry: missing, equalsnocase, equals, lessthan, greaterthan
o file: missing, sizeequals, sizelessthan, sizegreaterthan
Depending on the user input, these features may be reintroduced again some
day in the future (did anyone use it?) - please comment on that.
I don't use filesize comparisons (although I might do one day - I suspect
that if I need to strongly enough I'll write a patch and send it in) or
registry comparisons other than 'exists'.
What I do use a lot of, though, is file version comparisons and I include
a patch at the end of this mail to add this functionality: please consider
whether this could be included into the main wpkg distribution.
(Some aimless web surfing a few minutes ago lead me to believe that
getting the version of a file in JScript natively was possible and so I've
scrapped my horrible technique of launching perl to do the job for me.)
I use this for installing hotfixes sensitively: no need to run the
installer if the file is already the right version.
Yours,
Frank
Some notes on the patch below:
This patch adds five new 'conditions' to the 'file' test:
versionsmallerthan (true if the file version is smaller *)
versionlessorequal (true if the file version equals or is smaller *)
versionequalto (true if the file versions are the same)
versiongreaterorequal (true if the file version is larger or equal *)
versiongreaterthan (true if the file version is larger *)
* - ... than the version given in the 'value' argument.
All tests return 'false' if the file does not exist or the version could
not be found.
--- wpkg-0.9.2test1.js 2005-12-06 17:29:43.000000000 +0000
+++ wpkg-new.js 2005-12-06 18:19:34.000000000 +0000
@@ -925,8 +925,7 @@
/**
* Checks for the success of a check condition for a package.
*/
-function checkCondition(checkType, checkCond, checkPath) {
-
+function checkCondition(checkType, checkCond, checkPath, checkValue) {
if (checkType == "registry") {
if (checkCond == "exists") {
var WshShell = new ActiveXObject("WScript.Shell");
@@ -945,16 +944,57 @@
"for type registry.");
}
} else if (checkType == "file") {
+ var shell = new ActiveXObject("WScript.Shell");
+ checkPath=shell.ExpandEnvironmentStrings(checkPath);
+
if (checkCond == "exists") {
var fso = new ActiveXObject("Scripting.FileSystemObject");
if (fso.FileExists(checkPath)) {
return true;
}
- } else {
+ } else if (checkCond.substring(0,7) == "version") {
+ CheckValFromFileSystem = GetFileVersion(checkPath);
+ CheckValFromWpkg = checkValue;
+ if (CheckValFromFileSystem != "UNKNOWN") {
+ var versionresult = VersionCompare(CheckValFromFileSystem,
+ CheckValFromWpkg);
+ if (debug) {
+ info ("Checking file version " +
CheckValFromFileSystem +
+ " is " + checkType + " (than) " +
CheckValFromWpkg);
+ }
+ switch (checkCond) {
+ case "versionsmallerthan":
+ return (versionresult == -1);
+ break;
+ case "versionlessorequal":
+ return ( (versionresult == -1)
+ || (versionresult == 0) );
+ break;
+ case "versionequalto":
+ return (versionresult == 0);
+ break;
+ case "versiongreaterorequal":
+ return ( (versionresult == 1)
+ || (versionresult == 0) );
+ break;
+ case "versiongreaterthan":
+ return (versionresult == 1);
+ break;
+ default:
+ throw new Error("Unknown operation on file " +
+ "versions : " + checkType);
+ break;
+ }
+ } else {
+ if (debug) {
+ info("Unable to find the file version for " +
checkPath);
+ }
+ return (false);
+ }
+ } else {
throw new Error("Check condition " + checkCond + " unknown
for " +
"type file.");
}
-
} else if (checkType == "uninstall") {
if (checkCond == "exists") {
if (scanUninstallKeys(checkPath)) {
@@ -973,6 +1013,50 @@
}
/**
+ * VersionCompare - compare two executable versions
+ */
+function VersionCompare(a,b) {
+ // Return 0 if equal
+ // Return -1 if a < b
+ // Return +1 if a > b
+ var as = a.split(".");
+ var bs = b.split(".");
+ var length=as.length;
+ var ret=0;
+ for (var i = 0; i < length; i++) {
+ if (as[i]<bs[i]) {
+ ret=-1;
+ i=length; // Hack to exit loop
+ } else if (as[i]<bs[i]) {
+ ret=1;
+ i=length;
+ }
+ }
+ return ret;
+}
+
+
+/**
+ * Gets the version of a file
+ */
+function GetFileVersion (file) {
+ var version="UNKNOWN";
+ try {
+ if (debug) { info ("Finding version of "+file+"\n");}
+ var FSO = new ActiveXObject("Scripting.FileSystemObject");
+ version = FSO.GetFileVersion(file);
+ if (debug) { info ("Obtained version \""+version+"\".");}
+ } catch (e) {
+ version="UNKNOWN";
+ if (debug) { info ("Unable to find file version for "+file+" : "+
+ e.description);}
+ }
+ if (debug) { info ("Leaving GetFileVersion with version "+version); }
+ return version;
+}
+
+
+/**
* Check if package is installed.
*/
function checkInstalled(packageNode) {
@@ -999,13 +1083,14 @@
var checkType = checkNode.getAttribute("type");
var checkCond = checkNode.getAttribute("condition");
var checkPath = checkNode.getAttribute("path");
+ var checkValue = checkNode.getAttribute("value");
if (checkType == null ||
checkCond == null ||
checkPath == null) {
throw new Error("Invalid check condition on package " +
packageName + ", aborting.");
- } else if (! checkCondition(checkType, checkCond, checkPath)) {
+ } else if (! checkCondition(checkType, checkCond, checkPath,
checkValue)) {
info("Checking presence of " + packageName +
"; " + checkType + " check condition failed !");
-------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc. Do you grep through log files
for problems? Stop! Download the new AJAX search engine that makes
searching your log files as easy as surfing the web. DOWNLOAD SPLUNK!
http://ads.osdn.com/?ad_id=7637&alloc_id=16865&op=click
_______________________________________________
wpkg-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/wpkg-users