Bug 300731 - Change app/extension version scheme going forward, r=darin+shaver a=shaver

This commit is contained in:
bsmedberg%covad.net 2005-07-23 14:05:25 +00:00
parent 178f20a738
commit b3905512fd
16 changed files with 655 additions and 125 deletions

View File

@ -73,7 +73,6 @@ REQUIRES = xpcom \
jar \
xulapp \
unicharutil \
update \
$(NULL)
CPPSRCS = \

View File

@ -96,7 +96,7 @@
#include "nsISimpleEnumerator.h"
#include "nsIStyleSheet.h"
#include "nsISupportsArray.h"
#include "nsIUpdateService.h" // for nsIVersionChecker
#include "nsIVersionComparator.h"
#include "nsIWindowMediator.h"
#include "nsIXPConnect.h"
#include "nsIXULAppInfo.h"
@ -1955,7 +1955,7 @@ CheckStringFlag(const nsSubstring& aFlag, const nsSubstring& aData,
static PRBool
CheckVersionFlag(const nsSubstring& aFlag, const nsSubstring& aData,
const nsSubstring& aValue, nsIVersionChecker* aChecker,
const nsSubstring& aValue, nsIVersionComparator* aChecker,
TriState& aResult)
{
if (! (aData.Length() > aFlag.Length() + 2))
@ -2005,7 +2005,8 @@ CheckVersionFlag(const nsSubstring& aFlag, const nsSubstring& aData,
}
else {
PRInt32 c;
nsresult rv = aChecker->Compare(aValue, testdata, &c);
nsresult rv = aChecker->Compare(NS_ConvertUTF16toUTF8(aValue),
NS_ConvertUTF16toUTF8(testdata), &c);
if (NS_FAILED(rv)) {
aResult = eBad;
}
@ -2043,7 +2044,7 @@ nsChromeRegistry::ProcessManifestBuffer(char *buf, PRInt32 length,
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIXPConnect> xpc (do_GetService("@mozilla.org/js/xpc/XPConnect;1"));
nsCOMPtr<nsIVersionChecker> vc (do_GetService("@mozilla.org/updates/version-checker;1"));
nsCOMPtr<nsIVersionComparator> vc (do_GetService("@mozilla.org/xpcom/version-comparator;1"));
nsAutoString appID;
nsAutoString appVersion;

View File

@ -417,29 +417,3 @@ interface nsIUpdateTimerManager : nsISupports
in nsITimerCallback callback,
in unsigned long interval);
};
[scriptable, uuid(22d35700-5765-42e1-914b-a0da7c911a8c)]
interface nsIVersionChecker : nsISupports
{
/**
* Compare two FVF versions
* @param versionA
* The first version
* @param versionB
* The second version
* @returns < 0 if A < B
* = 0 if A == B
* > 0 if B > A
* XXXben - change the return value here to return a constant
*/
long compare(in AString versionA, in AString versionB);
/**
* Determines if a string is a valid FVF version
* @param string
* The string to validate
* @returns true if the string is a valid FVF version
*/
boolean isValidVersion(in AString version);
};

View File

@ -1060,7 +1060,8 @@ UpdateService.prototype = {
var majorUpdate = null, minorUpdate = null;
var newestMinor = updates[0], newestMajor = updates[0];
var vc = new VersionChecker();
var vc = Components.classes["@mozilla.org/xpcom/version-comparator;1"]
.getService(Components.interfaces.nsIVersionComparator);
for (var i = 0; i < updates.length; ++i) {
if (updates[i].type == "major" &&
vc.compare(newestMajor.version, updates[i].version) <= 0)
@ -2231,94 +2232,6 @@ TimerManager.prototype = {
}
};
/**
* Represents the version of an entity, in Firefox Version Format.
* @constructor
*/
function Version(aMajor, aMinor, aRelease, aBuild, aPlus) {
this.major = aMajor || 0;
this.minor = aMinor || 0;
this.release = aRelease || 0;
this.build = aBuild || 0;
this.plus = aPlus || 0;
}
Version.prototype = {
toString: function Version_toString() {
return this.major + "." + this.minor + "." + this.subminor + "." + this.release + (this.plus ? "+" : "");
},
compare: function (aVersion) {
var fields = ["major", "minor", "release", "build", "plus"];
for (var i = 0; i < fields.length; ++i) {
var field = fields[i];
if (aVersion[field] > this[field])
return -1;
else if (aVersion[field] < this[field])
return 1;
}
return 0;
}
}
/**
* A service that provides a means to compare two FVF strings.
* @constructor
*/
function VersionChecker() {
}
VersionChecker.prototype = {
/////////////////////////////////////////////////////////////////////////////
// nsIVersionChecker
// -ve if B is newer
// equal if A == B
// +ve if A is newer
compare: function(aVersionA, aVersionB) {
var a = this._decomposeVersion(aVersionA);
var b = this._decomposeVersion(aVersionB);
return a.compare(b);
},
_decomposeVersion: function(aVersion) {
var plus = 0;
if (aVersion.charAt(aVersion.length-1) == "+") {
aVersion = aVersion.substr(0, aVersion.length-1);
plus = 1;
}
var parts = aVersion.split(".");
return new Version(this._getValidInt(parts[0]),
this._getValidInt(parts[1]),
this._getValidInt(parts[2]),
this._getValidInt(parts[3]),
plus);
},
_getValidInt: function(aPartString) {
var integer = parseInt(aPartString);
if (isNaN(integer))
return 0;
return integer;
},
isValidVersion: function(aVersion) {
return /^([0-9]+\.){0,3}[0-9]+\+?$/.test(aVersion);
},
/////////////////////////////////////////////////////////////////////////////
// nsISupports
QueryInterface: function(aIID) {
if (!aIID.equals(Components.interfaces.nsIVersionChecker) &&
!aIID.equals(Components.interfaces.nsISupports))
throw Components.results.NS_ERROR_NO_INTERFACE;
return this;
}
};
#ifdef MOZ_XUL_APP
/**
* UpdatePrompt
@ -2505,11 +2418,6 @@ var gModule = {
factory : #1#(UpdatePrompt)
},
#endif
version: { CID : Components.ID("{9408E0A5-509E-45E7-80C1-0F35B99FF7A9}"),
contractID : "@mozilla.org/updates/version-checker;1",
className : "Version Checker",
factory : #1#(VersionChecker)
},
timers: { CID : Components.ID("{B322A5C0-A419-484E-96BA-D7182163899F}"),
contractID : "@mozilla.org/updates/timer-manager;1",
className : "Timer Manager",

View File

@ -53,6 +53,7 @@ REQUIRES = string \
CPPSRCS = \
nsAllocator.cpp \
nsVersionComparatorImpl.cpp \
nsConsoleMessage.cpp \
nsConsoleService.cpp \
nsDebugImpl.cpp \
@ -118,6 +119,7 @@ XPIDLSRCS = \
nsIErrorService.idl \
nsIException.idl \
nsIExceptionService.idl \
nsIVersionComparator.idl \
$(NULL)
ifdef GC_LEAK_DETECTOR

View File

@ -0,0 +1,79 @@
/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is the Application Update Service
*
* The Initial Developer of the Original Code is Google Inc.
* Portions created by the Initial Developer are Copyright (C) 2005
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Ben Goodger <ben@mozilla.org>
* Benjamin Smedberg <benjamin@smedbergs.us>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "nsISupports.idl"
/**
* Version strings are dot-separated sequences of version-parts.
*
* A version-part consists of up to four parts, all of which are optional:
*
* <number-a><string-b><number-c><string-d (everything else)>
*
* Numbers are base-10, and are zero if left out.
* Strings are compared bytewise.
*
* For additional backwards compatibility, if "string-b" is "+" then
* "number-a" is incremented by 1 and "string-b" becomes "pre".
*
* 1.0pre1
* < 1.0pre2
* < 1.0 == 1.0.0 == 1.0.0.0
* < 1.1pre == 1.1pre0 == 1.0+
* < 1.1pre1a
* < 1.1pre1
* < 1.1pre10a
* < 1.1pre10
*
* Although not required by this interface, it is recommended that
* numbers remain within the limits of a signed char, i.e. -127 to 128.
*/
[scriptable, uuid(e6cd620a-edbb-41d2-9e42-9a2ffc8107f3)]
interface nsIVersionComparator : nsISupports
{
/**
* Compare two version strings
* @param A The first version
* @param B The second version
* @returns < 0 if A < B
* = 0 if A == B
* > 0 if B > A
*/
long compare(in ACString A, in ACString B);
};

View File

@ -0,0 +1,52 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla XPCOM.
*
* The Initial Developer of the Original Code is
* Benjamin Smedberg <benjamin@smedbergs.us>.
*
* Portions created by the Initial Developer are Copyright (C) 2005
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "nsVersionComparatorImpl.h"
#include "nsVersionComparator.h"
#include "nsString.h"
NS_IMPL_ISUPPORTS1(nsVersionComparatorImpl, nsIVersionComparator)
NS_IMETHODIMP
nsVersionComparatorImpl::Compare(const nsACString& A, const nsACString& B,
PRInt32 *aResult)
{
*aResult = NS_CompareVersions(PromiseFlatCString(A).get(),
PromiseFlatCString(B).get());
return NS_OK;
}

View File

@ -0,0 +1,54 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla XPCOM.
*
* The Initial Developer of the Original Code is
* Benjamin Smedberg <benjamin@smedbergs.us>.
*
* Portions created by the Initial Developer are Copyright (C) 2005
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "nsIVersionComparator.h"
class nsVersionComparatorImpl : public nsIVersionComparator
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIVERSIONCOMPARATOR
};
#define NS_VERSIONCOMPARATOR_CONTRACTID "@mozilla.org/xpcom/version-comparator;1"
// c6e47036-ca94-4be3-963a-9abd8705f7a8
#define NS_VERSIONCOMPARATOR_CID \
{ 0xc6e47036, 0xca94, 0x4be3, \
{ 0x96, 0x3a, 0x9a, 0xbd, 0x87, 0x05, 0xf7, 0xa8 } }
#define NS_VERSIONCOMPARATOR_CLASSNAME "nsVersionComparatorImpl"

View File

@ -83,6 +83,7 @@
#include "nsThread.h"
#include "nsProcess.h"
#include "nsEnvironment.h"
#include "nsVersionComparatorImpl.h"
#include "nsEmptyEnumerator.h"
@ -191,6 +192,7 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(nsTimerManager)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsBinaryOutputStream)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsBinaryInputStream)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsStorageStream)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsVersionComparatorImpl)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsVariant)
@ -313,6 +315,7 @@ static const nsModuleComponentInfo components[] = {
COMPONENT(BINARYINPUTSTREAM, nsBinaryInputStreamConstructor),
COMPONENT(BINARYOUTPUTSTREAM, nsBinaryOutputStreamConstructor),
COMPONENT(STORAGESTREAM, nsStorageStreamConstructor),
COMPONENT(VERSIONCOMPARATOR, nsVersionComparatorImplConstructor),
COMPONENT(PIPE, nsPipeConstructor),
#define NS_PROPERTIES_CLASSNAME "Properties"

View File

@ -76,6 +76,7 @@ SDK_HEADERS = \
nsWeakReference.h \
nsComponentManagerUtils.h \
nsServiceManagerUtils.h \
nsVersionComparator.h \
$(NULL)
SDK_LIBRARY = \

View File

@ -0,0 +1,247 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla XPCOM.
*
* The Initial Developer of the Original Code is
* Benjamin Smedberg <benjamin@smedbergs.us>.
*
* Portions created by the Initial Developer are Copyright (C) 2005
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "nsVersionComparator.h"
#include <stdlib.h>
#include <string.h>
struct VersionPart {
PRInt32 numA;
const char *strB; // NOT null-terminated, can be a null pointer
PRUint32 strBlen;
PRInt32 numC;
char *extraD; // null-terminated
};
/**
* Parse a version part into a number and "extra text".
*
* @returns A pointer to the next versionpart, or null if none.
*/
static char*
ParseVP(char *part, VersionPart &result)
{
char *dot = strchr(part, '.');
if (dot)
*dot = '\0';
result.numA = strtol(part, NS_CONST_CAST(char**, &result.strB), 10);
if (!*result.strB) {
result.strB = nsnull;
result.strBlen = 0;
result.numC = 0;
result.extraD = nsnull;
}
else {
if (result.strB[0] == '+') {
static const char kPre[] = "pre";
++result.numA;
result.strB = kPre;
result.strBlen = sizeof(kPre) - 1;
}
else {
char *numstart = strpbrk(result.strB, "0123456789+-");
if (!numstart) {
result.strBlen = strlen(result.strB);
result.numC = 0;
result.extraD = nsnull;
}
else {
result.strBlen = numstart - result.strB;
result.numC = strtol(numstart, &result.extraD, 10);
if (!*result.extraD)
result.extraD = nsnull;
}
}
}
if (dot) {
++dot;
if (!*dot)
dot = nsnull;
}
return dot;
};
// compare two null-terminated strings, which may be null pointers
static PRInt32
ns_strcmp(const char *str1, const char *str2)
{
// any string is *before* no string
if (!str1)
return str2 != 0;
if (!str2)
return -1;
return strcmp(str1, str2);
}
// compare two length-specified string, which may be null pointers
static PRInt32
ns_strnncmp(const char *str1, PRUint32 len1, const char *str2, PRUint32 len2)
{
// any string is *before* no string
if (!str1)
return str2 != 0;
if (!str2)
return -1;
for (; len1 && len2; --len1, --len2, ++str1, ++str2) {
if (*str1 < *str2)
return -1;
if (*str1 > *str2)
return 1;
}
if (len1 == 0)
return len2 == 0 ? 0 : -1;
return 1;
}
// compare two PRInt32
static PRInt32
ns_cmp(PRInt32 n1, PRInt32 n2)
{
if (n1 < n2)
return -1;
return n1 != n2;
}
/**
* Compares two VersionParts
*/
static PRInt32
CompareVP(VersionPart &v1, VersionPart &v2)
{
PRInt32 r = ns_cmp(v1.numA, v2.numA);
if (r)
return r;
r = ns_strnncmp(v1.strB, v1.strBlen, v2.strB, v2.strBlen);
if (r)
return r;
r = ns_cmp(v1.numC, v2.numC);
if (r)
return r;
return ns_strcmp(v1.extraD, v2.extraD);
}
/**
* Checks to see whether the remaining vesion parts are all 0.0.0...
*/
static PRBool
OnlyZeros(char* part)
{
VersionPart vp;
while (part = ParseVP(part, vp)) {
if (vp.numA || vp.strB || vp.numC || vp.extraD)
return PR_FALSE;
}
return PR_TRUE;
}
PRInt32
NS_CompareVersions(const char *A, const char *B)
{
char *A2 = strdup(A);
if (!A2)
return 1;
char *B2 = strdup(B);
if (!B2) {
free(A2);
return 1;
}
PRInt32 result;
char *a = A2, *b = B2;
do {
VersionPart va, vb;
a = ParseVP(a, va);
b = ParseVP(b, vb);
result = CompareVP(va, vb);
if (result)
break;
if (a) {
if (!b) {
// A has more parts, but B doesn't... check for 0.0.0...
if (OnlyZeros(a))
result = 0;
else
result = 1;
break;
}
}
else {
if (b && !OnlyZeros(b))
// A is done, but B isn't, check for 0.0.0...
result = -1;
else // A and B are both done, they are equal!
result = 0;
break;
}
} while (PR_TRUE);
free(A2);
free(B2);
return result;
}

View File

@ -0,0 +1,51 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla XPCOM.
*
* The Initial Developer of the Original Code is
* Benjamin Smedberg <benjamin@smedbergs.us>.
*
* Portions created by the Initial Developer are Copyright (C) 2005
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef nsVersionComparator_h__
#define nsVersionComparator_h__
#include "nscore.h"
/**
* Compare two version strings.
*
* @see nsIVersionComparator
*/
PRInt32 NS_COM_GLUE
NS_CompareVersions(const char *A, const char *B);
#endif // nsVersionComparator_h__

View File

@ -43,6 +43,7 @@ XPCOM_GLUE_SRC_LCSRCS = \
nsTraceRefcnt.cpp \
nsWeakReference.cpp \
nsGREGlue.cpp \
nsVersionComparator.cpp \
$(NULL)
XPCOM_GLUE_SRC_CSRCS := $(addprefix $(topsrcdir)/xpcom/glue/, $(XPCOM_GLUE_SRC_LCSRCS))

View File

@ -78,6 +78,7 @@ CPPSRCS = \
TestMinStringAPI.cpp \
TestStrings.cpp \
TestStorageStream.cpp \
TestVersionComparator.cpp \
$(NULL)
#CPPSRCS += TimerTest.cpp
@ -111,3 +112,8 @@ libs::
install::
$(SYSINSTALL) $(IFLAGS1) $(srcdir)/test.properties $(DESTDIR)$(mozappdir)/res
ifndef CROSS_COMPILE
libs::
@echo "Running TestVersionComparator tests"
@$(PERL) -w $(srcdir)/TestVersionComparatorRunner.pl $(FINAL_TARGET)/TestVersionComparator$(BIN_SUFFIX)
endif

View File

@ -0,0 +1,63 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla XPCOM.
*
* The Initial Developer of the Original Code is
* Benjamin Smedberg <benjamin@smedbergs.us>.
*
* Portions created by the Initial Developer are Copyright (C) 2005
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "nsVersionComparator.h"
#include <stdio.h>
int main(int argc, char **argv)
{
if (argc != 3) {
fprintf(stderr, "Usage: %s <versionA> <versionB>\n", argv[0]);
return 1;
}
PRInt32 i = NS_CompareVersions(argv[1], argv[2]);
char *format;
if (i < 0)
format = "%s < %s\n";
else if (i > 0)
format = "%s > %s\n";
else
format = "%s = %s\n";
fprintf(stdout, format, argv[1], argv[2]);
return 0;
}

View File

@ -0,0 +1,89 @@
#!/usr/bin/perl -w
# ***** BEGIN LICENSE BLOCK *****
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
#
# The contents of this file are subject to the Mozilla Public License Version
# 1.1 (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
# http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS IS" basis,
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
# for the specific language governing rights and limitations under the
# License.
#
# The Original Code is Mozilla XPCOM Tests.
#
# The Initial Developer of the Original Code is
# Benjamin Smedberg <benjamin@smedbergs.us>.
#
# Portions created by the Initial Developer are Copyright (C) 2005
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#
# Alternatively, the contents of this file may be used under the terms of
# either the GNU General Public License Version 2 or later (the "GPL"), or
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
# in which case the provisions of the GPL or the LGPL are applicable instead
# of those above. If you wish to allow use of your version of this file only
# under the terms of either the GPL or the LGPL, and not to allow others to
# use your version of this file under the terms of the MPL, indicate your
# decision by deleting the provisions above and replace them with the notice
# and other provisions required by the GPL or the LGPL. If you do not delete
# the provisions above, a recipient may use your version of this file under
# the terms of any one of the MPL, the GPL or the LGPL.
#
# ***** END LICENSE BLOCK *****
my $executable = shift;
@comparisons = (
"1.0pre1",
"1.0pre2",
"1.0",
"1.1pre",
"1.1pre1a",
"1.1pre1",
"1.1pre10a",
"1.1pre10",
"1.1"
);
@equality = (
"1.1pre",
"1.1pre0",
"1.0+"
);
# Do the comparisons in both directions
sub run_testprog {
my ($executable, $args, $expected) = @_;
my $result = `$executable $args`;
$result =~ s/\r|\n//g;
if ($result ne $expected) {
print STDERR "Testing '$args' expected '$expected', got '$result'.\n";
exit 1;
}
}
for (my $i = 0; $i < scalar(@comparisons) - 1; ++$i) {
run_testprog($executable,
"$comparisons[$i] $comparisons[$i + 1]",
"$comparisons[$i] < $comparisons[$i + 1]");
run_testprog($executable,
"$comparisons[$i + 1] $comparisons[$i]",
"$comparisons[$i + 1] > $comparisons[$i]");
}
for (my $i = 0; $i < scalar(@equality) - 1; ++$i) {
run_testprog($executable,
"$equality[$i] $equality[$i + 1]",
"$equality[$i] = $equality[$i + 1]");
}
print "All comparisons OK\n";
exit 0;