Below each package directory there can be one or more version sub-directories, named after the versions. This is a requirement of the component framework: it must be possible for users to install multiple versions of a package and select which one to use for any given application. This has a number of advantages to users: most importantly it allows a single component repository to be shared between multiple users and multiple projects, as required; also it facilitates experiments, for example it is relatively easy to try out the latest version of some package and see if it makes any difference. There is a potential disadvantage in terms of disk space. However since eCos packages generally consist of source code intended for small embedded systems, and given typical modern disk sizes, keeping a number of different versions of a package installed will usually be acceptable. The administration tool can be used to remove versions that are no longer required.
The version current is special. Typically it corresponds to the very latest version of the sources, obtained by anonymous CVS. These sources may change frequently, unlike full releases which do not change (or only when patches are produced). Component writers may also want to work on the current version.
All other subdirectories of a package correspond to specific releases of that package. The component framework allows users to select the particular version of a package they want to use, but by default the most recent one will be used. This requires some rules for ordering version numbers, a difficult task because of the wide variety of ways in which versions can be identified.
The version current is always considered to be the most recent version.
If the first character of both strings are either v or V, these are skipped because it makes little sense to enforce case sensitivity here. Potentially this could result in ambiguity if there are two version directories V1.0 and v1.0, but this will match the confusion experienced by any users of such a package. However if two subsequent releases are called V1.0 and v1.1, e.g. because of a minor mix-up when making the distribution file, then the case difference is ignored.
Next the two version strings are compared one character at a time. If both strings are currently at a digit then a string to number conversion takes place, and the resulting numbers are compared. For example v10 is a more recent release than v2. If the two numbers are the same then processing continues, so for v2b and v2c the version comparison code would move on to b and c.
The characters dot ., hyphen - and underscore _ are treated as equivalent separators, so if one release goes out as v1_1 and the next goes out as v1.2 the separator has no effect.
If neither string has yet terminated but the characters are different, ASCII comparison is used. For example V1.1b is more recent than v1.1alpha.
If one version string terminates before the other, the current character determines which is the more recent. If the other string is currently at a separator character, for example v1.3.1 and v1.3, then the former is assumed to be a minor release and hence more recent than the latter. If the other string is not at a separator character, for example v1.3beta, then it is treated as an experimental version of the v1.3 release and hence older.
There is no special processing of dates, so with two versions ss-20000316 and ss-20001111 the numerical values 20001111 and 20000316 determine the result: larger values are more recent. It is suggested that the full year be used in such cases rather than a shorthand like 00, to avoid Y2100 problems.
There is no limit on how many levels of versioning are used, so there could in theory be a v220.127.116.11.18.104.22.168 release of a package. However this is unlikely to be of benefit to typical users of a package.
The version comparison rules of the component framework may not be suitable for every version numbering scheme in existence, but they should cope with many common cases.
There are some issues still to be resolved before it is possible to combine the current sources available via anonymous CVS and full releases of eCos and additional packages in a single component repository. The first problem relates to the ecos.db database: if a new package is added via the CVS repository then this requires a database update, but the administration tool is bypassed. The second problem arises if an organization chooses to place its component repository under source code control using CVS, in which case different directories will belong to different CVS servers. These issues will be addressed in a future release.