Toolkit version format

  • Revision slug: Toolkit_version_format
  • Revision title: Toolkit version format
  • Revision id: 73837
  • Created:
  • Creator: Sheppy
  • Is current revision? No
  • Comment 5 words added, 3 words removed

Revision Content

This document is a reference for the version format, as used in Firefox 1.5 (XULRunner 1.8) and later. This format is used by the Extension Manager, Software Update, and other parts of the platform. Versions in at least the following places must conform to this format:

You can use {{ interface("nsIVersionComparator") }} to compare versions from your application.

See {{ Anch("Older version formats") }} below for description of the older version format used in Firefox/Thunderbird 1.0.

Version format

A version string consists of one or more version parts, separated with dots.

Each version part is itself parsed as a sequence of four parts: <number-a><string-b><number-c><string-d>. Each of the parts is optional. Numbers are integers base 10 (may be negative), strings are ASCII.

A few examples of valid version parts:

  • 0 (as in 1.0): <number-a>=0
  • 5a (as in 1.5a): <number-a>=5, <string-b>=a
  • 5pre4 (as in 3.5pre4): <number-a>=5, <string-b>=pre, <number-c>=4
  • * (as in 1.0.*): <string-b>=*

A few special parsing rules are applied for backwards compatibility and readability:

  • if the version part is a single asterisk, it is interpreted as an infinitely-large number:
    1.5.0.* is the same as 1.5.0.(infinity)
  • if string-b is a plus sign, number-a is incremented to be compatible with the Firefox 1.0.x version format:
    1.0+ is the same as 1.1pre

The rationale behind splitting a version part into a sequence of strings and numbers is that when comparing version parts, the numeric parts are compared as numbers, e.g. '1.0pre1' < '1.0pre10', while the strings are compared bytewise. See the next section for details on how versions are compared.

See maintenance policy for special rules that mark version as "beta" in the AMO queues.

Comparing versions

When two version strings are compared, their version parts are compared left to right. An empty or missing version part is equivalent to 0.

If at some point a version part of one version string is greater than the corresponding version part of another version string, then the first version string is greater than the other one.

Otherwise, the version strings are equal. Note, that since missing version parts are treated as if they were 0, the following version strings are equal: 1, 1.0, 1.0., 1.0.0, and even 1.0...

Comparing version parts

Version parts are also compared left to right, parts A and C are compared as numbers, while parts B and D are compared byte-wise. A string-part that exists is always less than a string-part that doesn't exist (1.6a is less than 1.6).

Examples

1.-1
< 1 == 1. == 1.0 == 1.0.0
< 1.1a < 1.1aa < 1.1ab < 1.1b < 1.1c
< 1.1pre == 1.1pre0 == 1.0+
< 1.1pre1a < 1.1pre1aa < 1.1pre1b < 1.1pre1
< 1.1pre2
< 1.1pre10
< 1.1.-1
< 1.1 == 1.1.0 == 1.1.00
< 1.10
< 1.* < 1.*.1
< 2.0

Older version formats

Firefox and Thunderbird 1.0 used a simpler version format, namely

major[.minor[.release[.build]]][+]

where {{ mediawiki.external('..') }} denotes an optional component, and major, minor, release, and build are all non-negative integers.

{{ languages( { "es": "es/Formato_para_la_versi\u00f3n_del_Toolkit", "ja": "ja/Toolkit_version_format", "zh-cn": "cn/\u7248\u672c\u683c\u5f0f\u8bf4\u660e" } ) }}

Revision Source

<p>This document is a reference for the version format, as used in Firefox 1.5 (<a href="/en/XULRunner" title="en/XULRunner">XULRunner</a> 1.8) and later. This format is used by the Extension Manager, Software Update, and other parts of the platform. Versions in at least the following places must conform to this format:</p>
<ul> <li><a href="/en/Install_Manifests#version" title="en/Install_Manifests#version">Addon's</a> and <a href="/en/Install_Manifests#targetApplication" title="en/Install_Manifests#targetApplication">target application's</a> version in <a href="/en/Install_Manifests" title="en/Install_Manifests">install</a> and <a href="/en/Update_Manifest" title="en/Update_Manifest">update</a> manifests.</li> <li>The following preferences: <code>app.extensions.version</code>, <code>extensions.lastAppVersion</code></li> <li>Versions returned by {{ interface("nsIXULAppInfo") }}.</li> <li><a href="/en/XUL_Application_Packaging" title="en/XUL_Application_Packaging"><code>application.ini</code></a> in <a href="/en/XULRunner" title="en/XULRunner">XULRunner</a> applications</li> <li><a href="/en/Chrome_Registration#appversion" title="en/Chrome_Registration#appversion">appversion flag</a> in <a href="/en/Chrome_Registration" title="en/Chrome_Registration">chrome manifests</a>.</li>
</ul>
<p>You can use {{ interface("nsIVersionComparator") }} to compare versions from your application.</p>
<p>See {{ Anch("Older version formats") }} below for description of the older version format used in Firefox/Thunderbird 1.0.</p>
<h3 name="Version_format">Version format</h3>
<p>A <strong>version string</strong> consists of one or more <em>version parts</em>, separated with dots.</p>
<p>Each <strong>version part</strong> is itself parsed as a sequence of four parts: <code>&lt;number-a&gt;&lt;string-b&gt;&lt;number-c&gt;&lt;string-d&gt;</code>. Each of the parts is optional. Numbers are integers base 10 (may be negative), strings are ASCII.</p>
<p>A few examples of valid version parts:</p>
<ul> <li><code>0</code> (as in <code>1.0</code>): <code>&lt;number-a&gt;=0</code></li> <li><code>5a</code> (as in <code>1.5a</code>): <code>&lt;number-a&gt;=5</code>, <code>&lt;string-b&gt;=a</code></li> <li><code>5pre4</code> (as in <code>3.5pre4</code>): <code>&lt;number-a&gt;=5</code>, <code>&lt;string-b&gt;=pre</code>, <code>&lt;number-c&gt;=4</code></li> <li><code>*</code> (as in <code>1.0.*</code>): <code>&lt;string-b&gt;=*</code></li>
</ul>
<p>A few special parsing rules are applied for backwards compatibility and readability:</p>
<ul> <li>if the version part is a single asterisk, it is interpreted as an infinitely-large number:<br> <code>1.5.0.*</code> is the same as <code>1.5.0.<em>(infinity)</em></code></li> <li>if string-b is a plus sign, number-a is incremented to be compatible with the Firefox 1.0.x version format:<br> <code>1.0+</code> is the same as <code>1.1pre</code></li>
</ul>
<p>The rationale behind splitting a version part into a sequence of strings and numbers is that when comparing version parts, the numeric parts are compared as numbers, e.g. '1.0pre1' &lt; '1.0pre10', while the strings are compared bytewise. See the next section for details on how versions are compared.</p>
<p>See <a class=" link-https" href="https://addons.mozilla.org/en-US/developers/docs/policies/maintenance#beta-addons">maintenance policy</a> for special rules that mark version as "beta" in the AMO queues.</p>
<h3 name="Comparing_versions">Comparing versions</h3>
<p>When two version strings are compared, their version parts are compared left to right. An empty or missing version part is equivalent to <code>0</code>.</p>
<p>If at some point a version part of one version string is greater than the corresponding version part of another version string, then the first version string is greater than the other one.</p>
<p>Otherwise, the version strings are equal. Note, that since missing version parts are treated as if they were <code>0</code>, the following version strings are equal: <code>1</code>, <code>1.0</code>, <code>1.0.</code>, <code>1.0.0</code>, and even <code>1.0...</code></p>
<h4 name="Comparing_version_parts">Comparing version parts</h4>
<p>Version parts are also compared left to right, parts A and C are compared as numbers, while parts B and D are compared byte-wise. A string-part that exists is always less than a string-part that doesn't exist (<code>1.6a</code> is less than <code>1.6</code>).</p><h3 name="Examples">Examples</h3>
<pre class="eval">1.-1
&lt; 1 == 1. == 1.0 == 1.0.0
&lt; 1.1a &lt; 1.1aa &lt; 1.1ab &lt; 1.1b &lt; 1.1c
&lt; 1.1pre == 1.1pre0 == 1.0+
&lt; 1.1pre1a &lt; 1.1pre1aa &lt; 1.1pre1b &lt; 1.1pre1
&lt; 1.1pre2
&lt; 1.1pre10
&lt; 1.1.-1
&lt; 1.1 == 1.1.0 == 1.1.00
&lt; 1.10
&lt; 1.* &lt; 1.*.1
&lt; 2.0
</pre>
<h3 name="Older_version_formats">Older version formats</h3>
<p>Firefox and Thunderbird 1.0 used a simpler version format, namely</p>
<pre class="eval">major[.minor[.release[.build]]][+]
</pre>
<p>where <code>{{ mediawiki.external('..') }}</code> denotes an optional component, and <code>major</code>, <code>minor</code>, <code>release</code>, and <code>build</code> are all non-negative integers.</p>
<p>{{ languages( { "es": "es/Formato_para_la_versi\u00f3n_del_Toolkit", "ja": "ja/Toolkit_version_format", "zh-cn": "cn/\u7248\u672c\u683c\u5f0f\u8bf4\u660e" } ) }}</p>
Revert to this revision