# Versioning The Tomo language and Tomo libraries both use a versioning system based on a changelog called `CHANGES.md` that includes a human-and-machine-readable markdown list of versions. The version number is parsed from the first level 2 header (i.e. line beginning with `## `). An example CHANGES.md file might look like this: ``` # Version History ## v1.2 Version 1.2 adds some new features: - Autofrobnication - Reverse froodling ## v1.1 - Added a `--moop` compiler flag ## v1.0 Major version change including: - Deprecated snobwozzling - Added new syntax for sleazles ## v0.3 Bugfixes and new features... ``` When you build the compiler or a library, if this file exists, it will be used to determine the current version (the top-most level 2 header). ## Tomo Language Versions The version for the Tomo language itself will come into play in a few ways: 1. The compiler will be installed to `tomo_vX.Y` (where `X` is the major version number and `Y` is the minor version number). 2. A symbolic link will be installed from `tomo` to the largest version of Tomo that is installed on your machine (e.g. `~/.local/bin/tomo -> ~/.local/bin/tomo_v2.12`). 3. Each version of Tomo will build and install its own shared library file (e.g. `~/.local/lib/libtomo_v1.2.so`) and headers (e.g. `~/.local/include/tomo_v1.2/tomo.h`). 4. Tomo libraries will be installed to a separate subdirectory for each version of the compiler (e.g. `~/.local/share/tomo_v1.2/installed`). ## Tomo Program Versions When you write a Tomo program (say, `foo.tm`) and run it, Tomo will automatically add support for parsing a version number out of an accompanying `CHANGES.md` file in the same directory. You can use the `--version` flag to print the version number and exit. For example, if I run `tomo foo.tm -- --version`, it will print `v0.0` if no `CHANGES.md` file exists, otherwise it will compile the program with the most recent version number from that file and print it instead. Similarly, if you run `tomo -e foo.tm` to build `foo` as a standalone executable and then run `./foo --version`, it will print the version number and exit without running the program. ## Tomo Library Versions Tomo libraries also have version numbers. When you install a library, its version number will be used to determine its installation location and how it's used in code. You must either explicitly import the library with its version number (e.g. `use foo_v1.2`) or include a `modules.ini` configuration file that maps a shorthand alias to a specific version of a library. For example, if the `modules.ini` file has a `[foo]` section with `version=v1.2`, you can put `use foo` to use v1.2 of the `foo` library (assuming you have it installed). # Rationale I have opted to use a CHANGES.md file instead of git tags or a project configuration file for a few reasons. The first is that I think there is real value provided by maintaining a human-readable changelog. This approach encourages developers to maintain one. The second is to facilitate a development cycle where developers iterate on new features under the umbrella of a new version number, rather than the git tag-based approach where new features are developed in the no man's land between version tags. I also opted to use a human-readable markdown changelog rather than a build configuration file in order to ensure that there is no mismatch between the documentation and the configuration. My recommendation would be to develop code on a `main` or `dev` branch, bumping the version number pre-emptively (with an empty changelist). As new changes come in, add them to the changelog. Then, when it's appropriate, create a git tag to mark the current commit as the canonical one for that semantic version. Then, make a new commit after the tagged one bumping the version number and signaling the beginning of a new cycle of development.