How Cat's Eye Technologies' software distributions are organized.
Release Engineering
Historically, Cat's Eye Technologies has usually identified each release
of a software distribution with only a release number. The release number is
really just the date that the software was released, formatted as
YYYY.MMDD. Each of Y, M, and D is a single digit, so that it
sorts nicely, even in a purely lexicographical sort order. In
retrospect, YYYY.MM.DD might have been a more structurally consistent
choice, but it's not as nicely symmetrical.
Using only the release date to identify releases mostly suffices for distributions like ours, which rarely have any maintenance needs warranting branches and such. But most of our distributions do contain implementations of programming languages, and these languages may or may not change between releases. For example, if we're just fixing bugs in a feature of the implementation, or clarifying the documentation or whatever, that's not a change to the language. But if all we use to identify it is a release number, you can't tell if it's a change to the language or not.
In addition, some of our distributions used a different convention, usually
two numbers A.B which resembled a fraction in decimal notation: often
B would be two digits (like 94) which did not count the number of
minor releases since the last major release cycle, but rather tried to
measure "how close" it was to the next major release cycle. Version
numbers like this were sometimes also followed by an (essentially
meaningless) letter.
Realizing what a mess this is, we have strived to revise our release identification system, as well as to make it more consistent.
With few exceptions, every distribution now carries both a version and a
revision. The version consists of a major version number and a minor
version number, in the format A.B, where A and B are both
non-negative integers. The revision is the same as the old release
number, that is, it is the date in YYYY.MMDD format. The version and
revision are separated by hyphens, so a new-style "distfile" name
typically looks like foo-1.3-2009.0116.zip (although we are by and
large still providing only the legacy distfiles for download).
The rules for when these numbers change are as follows:
- If a new release of a distribution supports the same interface (syntax and semantics, API, protocol, or what have you) as the previous release of that distribution, then the version will be the same as the old distribution, but the revision will be different.
 - If a new release of a distribution is more-or-less backwards-compatible with the previous release, then the major version will be the same, but the minor version and revision will be different.
 - If a new release of a distribution is distinctly not backwards-compatible with the previous release, then the major version will be different, the minor version is typically reset to zero, and the revision will of course be the date of the release.
 
Filesystem Organization
This is a rough guide to how Cat's Eye Technologies' distributions are laid out. It is prescriptive, specifying how distributions should be laid out, but it is informed by the general pattern we're trying to find in our distributions. This guide is currently a work in progress and should not be considered complete yet.
Certain files in a distribution's root directory have standard meanings:
- 
README.markdown(preferred) orREADMEorREADME.txtA short text (or preferably Markdown) document summarizing what the distribution is a distribution of, what sorts of files it contains, where to get the latest version of the distribution, and what other tools might be needed to use (run or build) the files found in it.
READMEs for esolangs may describe the entire language. I'm not sure if this is a good practice or not. It started because Bitbucket would only HTMLify a Markdown file in its source viewer if it was the README, but now it will do that for every Markdown file, so there is less reason to put the whole language description here. Still, for some esolangs, this style seems to fit. (The only problem is that there isn't usually a good place to give the other info, like how to build and run the included implementations.) -
LICENSEorUNLICENSEA short text document explaining what license or licenses the content of the distribution is available under. The filename
UNLICENSEis used instead if (and only if) the entire contents of the distribution are in the public domain. -make.shorMakefileA Bourne shell script which builds executables and related things from the sources included in the distribution. This may also be a
Makefile, butMakefiles are usually put in thesrcdirectory.make.shmay justcdto that directory and runmake. -clean.shA Bourne shell script to clean up after building, in lieu of a
make cleancommand. -test.shA Bourne shell script which runs tests for the distribution. The tests can test anything they like, but should produce output which conforms to Portent format, which we haven't exactly defined yet, so don't worry about it. For now, an exit code of 0 means pass, anything else means failure.
 
Certain files in the root distribution directory have standard meanings as well:
- 
binWhere executables shoud be kept. Distributions should generally not contain native executables; the main exception to this rule is native executables for "legacy platforms" such as MS-DOS and Commodore 64 computers.
Native executables may be written into the
bindirectory when they are built from other files in the distribution by e.g.make.sh.Distributions may contain non-native binary files intended to be executed, i.e. virtual machine code, and these will reside in
bin. Java.classfiles are contained, underbin, in a directory tree matching the package names.Distributions may contain executable scripts. However, executable scripts which contain significant amounts of source code (i.e. ones that are not just little drivers or wrappers) should go in
scriptrather thanbin. They may in some cases be copied intobinupon build.Names of files in
binshould not have extensions unless convention demands it. (That is,toolrather thantool.py, buttool.comis OK.) -demoA directory of examples of how the contents of the distribution might be used. Somewhat interchangeable with
eg, except thategis primarily for example programs for a programming language (or configuration files, etc.) whiledemocontains demonstrations of how the tools (etc.) in the distribution might be used. -dialectFor distributions of programming (and other) languages, this is where related languages (usually too minor in variation to warrant their own distributions) are defined and implemented. -
diskWhere disk images should be kept. -
docWhere documentation should be kept. Exceptions include
README.markdownandLICENSE, which should be in the root directory.Images may be included in
docif they are part of the documentation (for example, diagrams) but if they are just screenshots, they should probably be elsewhere. -ebinDistributions should not ship with pre-compile Erlang
.beamfiles, but when they are built from the sources, they will go here. Erlang.appfiles may be contained here as well, but these are generally not all that useful, and mostly for decoration. -egWhere examples should be kept, particularly example programs in distributions which contain implementations of programming languages. Somewhat interchangeable with
demo, except thatdemois primarily for demonstrations of how the tools (etc.) in the distribution might be used, whileegcontains examples programs for a programming language (or configuration files, etc.) -implFor distributions containing more than one implementation, this is where source code for the non-reference implementations should be kept. (The reference implementation's source should be in
src.) -privWhere data files for Erlang applications are kept. -
scriptWhere executable scripts which have significant amount of code in them should be kept. (But if the script gets really large, it should probably be broken up into a driver script in
binwhich imports source modules fromsrc.) -srcWhere source code is kept. For distributions containing more than one implementation, this is where the reference implementation is kept; other implementations should probably be in
implinstead.